diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml
index 0c5a24f1..438a6f85 100644
--- a/.github/workflows/docker-image.yml
+++ b/.github/workflows/docker-image.yml
@@ -5,17 +5,32 @@ on:
branches: [ main ]
jobs:
build:
- strategy:
- matrix:
- image: [
- { name: 'koala-wiki', type: 'backend', dockerfile: 'src/KoalaWiki/Dockerfile', context: '.' },
- { name: 'koala-wiki-web', type: 'frontend', dockerfile: 'web/Dockerfile', context: 'web' }
- ]
- fail-fast: false
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+ cache: 'npm'
+ cache-dependency-path: 'web-site/package.json'
+
+ - name: Install frontend dependencies
+ run: |
+ cd web-site
+ npm ci
+
+ - name: Build frontend
+ run: |
+ cd web-site
+ npm run build
+
+ - name: Copy frontend build to backend wwwroot
+ run: |
+ rm -rf src/KoalaWiki/wwwroot/*
+ cp -r web-site/dist/* src/KoalaWiki/wwwroot/
+
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -26,11 +41,21 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- - name: Build and push ${{ matrix.image.name }}
+ - name: Extract version from Directory.Packages.props
+ id: version
+ run: |
+ $versionSuffix = (Select-Xml -Path "Directory.Packages.props" -XPath "//VersionSuffix").Node.InnerText
+ $version = "0.7.$versionSuffix"
+ echo "version=$version" >> $env:GITHUB_OUTPUT
+ echo "Version: $version"
+
+ - name: Build and push koala-wiki
uses: docker/build-push-action@v5
with:
- context: ${{ matrix.image.context }}
- file: ${{ matrix.image.dockerfile }}
+ context: .
+ file: src/KoalaWiki/Dockerfile
platforms: linux/arm64,linux/amd64
push: true
- tags: crpi-j9ha7sxwhatgtvj4.cn-shenzhen.personal.cr.aliyuncs.com/koala-ai/${{ matrix.image.name }}${{ matrix.image.tag || '' }}
+ tags: |
+ crpi-j9ha7sxwhatgtvj4.cn-shenzhen.personal.cr.aliyuncs.com/koala-ai/koala-wiki:latest
+ crpi-j9ha7sxwhatgtvj4.cn-shenzhen.personal.cr.aliyuncs.com/koala-ai/koala-wiki:${{ steps.version.outputs.version }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 57eef0e7..7b230118 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -229,9 +229,11 @@ jobs:
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "version=${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT
else
- # 从标签名称中提取版本号
- echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
+ # 从Directory.Packages.props文件中提取版本号
+ version=$(powershell -Command "[xml]\$xml = Get-Content 'Directory.Packages.props'; \$xml.Project.PropertyGroup.Version")
+ echo "version=v$version" >> $GITHUB_OUTPUT
fi
+ shell: bash
- name: 生成Release说明
id: release_notes
@@ -301,4 +303,4 @@ jobs:
artifacts/backend-macos-arm64/koala-wiki-backend-macos-arm64.tar.gz
artifacts/frontend/koala-wiki-frontend.tar.gz
env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
index 927aeb72..95837822 100644
--- a/.gitignore
+++ b/.gitignore
@@ -482,7 +482,7 @@ $RECYCLE.BIN/
# Vim temporary swap files
*.swp
-/web/.next
+*/.next
/src/KoalaWiki/repositories
/src/KoalaWiki/KoalaWiki.db
/src/KoalaWiki/KoalaWiki.db-*
@@ -492,3 +492,4 @@ $RECYCLE.BIN/
/history
/repositories/aidotnet/Thor
*lock.json
+seo-web
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 02be5782..865e17a5 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,4 @@
{
- "chatgpt.openOnStartup": true
+ "chatgpt.openOnStartup": true,
+ "markdown.validate.enabled": true
}
\ No newline at end of file
diff --git a/Directory.Packages.props b/Directory.Packages.props
index e3b4c158..148f2021 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -3,7 +3,7 @@
true
0
$([System.DateTime]::UtcNow.ToString("yyyyMMdd"))
- 0.5.$(VersionSuffix)
+ 0.9.$(VersionSuffix)
OpenDeepWiki
OpenDeepWiki - AI驱动的代码知识库
@@ -20,7 +20,6 @@
MIT
AI;CodeAnalysis;Documentation;SemanticKernel;Knowledge;Wiki;OpenSource;dotnet9;csharp
-
net9.0
latest
enable
@@ -32,14 +31,15 @@
-
+
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
@@ -48,7 +48,6 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
@@ -57,9 +56,9 @@
-
-
-
+
+
+
@@ -73,7 +72,7 @@
-
+
@@ -81,12 +80,12 @@
-
+
-
+
@@ -101,13 +100,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/KoalaWiki.Core/DataAccess/IKoalaWikiContext.cs b/KoalaWiki.Core/DataAccess/IKoalaWikiContext.cs
index 39cab080..5b48ce42 100644
--- a/KoalaWiki.Core/DataAccess/IKoalaWikiContext.cs
+++ b/KoalaWiki.Core/DataAccess/IKoalaWikiContext.cs
@@ -52,6 +52,8 @@ public interface IKoalaWikiContext
public DbSet WarehouseInRoles { get; set; }
+ public DbSet WarehouseSyncRecords { get; set; }
+
public DbSet AccessRecords { get; set; }
public DbSet DailyStatistics { get; set; }
diff --git a/KoalaWiki.Core/DataAccess/KoalaWikiContext.cs b/KoalaWiki.Core/DataAccess/KoalaWikiContext.cs
index 7744b80e..4b8d1f9c 100644
--- a/KoalaWiki.Core/DataAccess/KoalaWikiContext.cs
+++ b/KoalaWiki.Core/DataAccess/KoalaWikiContext.cs
@@ -50,6 +50,8 @@ public class KoalaWikiContext(DbContextOptions options)
public DbSet WarehouseInRoles { get; set; }
+ public DbSet WarehouseSyncRecords { get; set; }
+
public DbSet AccessRecords { get; set; }
public DbSet DailyStatistics { get; set; }
@@ -475,5 +477,34 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
options.HasIndex(x => x.WarehouseId);
options.HasComment("小地图表");
});
+
+ modelBuilder.Entity(options =>
+ {
+ options.HasKey(x => x.Id);
+ options.Property(x => x.Id).HasComment("主键Id");
+ options.Property(x => x.WarehouseId).IsRequired().HasComment("仓库Id");
+ options.Property(x => x.Status).IsRequired().HasComment("同步状态");
+ options.Property(x => x.StartTime).IsRequired().HasComment("同步开始时间");
+ options.Property(x => x.EndTime).HasComment("同步结束时间");
+ options.Property(x => x.FromVersion).HasComment("同步前的版本");
+ options.Property(x => x.ToVersion).HasComment("同步后的版本");
+ options.Property(x => x.ErrorMessage).HasComment("错误信息");
+ options.Property(x => x.FileCount).HasComment("同步的文件数量");
+ options.Property(x => x.UpdatedFileCount).HasComment("更新的文件数量");
+ options.Property(x => x.AddedFileCount).HasComment("新增的文件数量");
+ options.Property(x => x.DeletedFileCount).HasComment("删除的文件数量");
+ options.Property(x => x.Trigger).IsRequired().HasComment("同步触发方式");
+ options.Property(x => x.CreatedAt).IsRequired().HasComment("创建时间");
+ options.HasIndex(x => x.WarehouseId);
+ options.HasIndex(x => x.Status);
+ options.HasIndex(x => x.StartTime);
+ options.HasIndex(x => x.Trigger);
+ options.HasIndex(x => x.CreatedAt);
+ options.HasOne(x => x.Warehouse)
+ .WithMany()
+ .HasForeignKey(x => x.WarehouseId)
+ .OnDelete(DeleteBehavior.Cascade);
+ options.HasComment("仓库同步记录表");
+ });
}
}
\ No newline at end of file
diff --git a/KoalaWiki.Domains/Users/User.cs b/KoalaWiki.Domains/Users/User.cs
index 09536e5a..fd72268a 100644
--- a/KoalaWiki.Domains/Users/User.cs
+++ b/KoalaWiki.Domains/Users/User.cs
@@ -42,5 +42,25 @@ public class User : Entity
///
/// 用户最后登录IP
///
- public string? LastLoginIp { get; set; }
+ public string? LastLoginIp { get; set; }
+
+ ///
+ /// 用户简介
+ ///
+ public string? Bio { get; set; }
+
+ ///
+ /// 用户位置
+ ///
+ public string? Location { get; set; }
+
+ ///
+ /// 用户个人网站
+ ///
+ public string? Website { get; set; }
+
+ ///
+ /// 用户公司
+ ///
+ public string? Company { get; set; }
}
\ No newline at end of file
diff --git a/KoalaWiki.Domains/Warehouse/Warehouse.cs b/KoalaWiki.Domains/Warehouse/Warehouse.cs
index 4b69e95f..714d0b05 100644
--- a/KoalaWiki.Domains/Warehouse/Warehouse.cs
+++ b/KoalaWiki.Domains/Warehouse/Warehouse.cs
@@ -112,4 +112,9 @@ public class Warehouse : Entity
/// 创建用户id
///
public string? UserId { get; set; }
+
+ ///
+ /// 是否启用同步
+ ///
+ public bool EnableSync { get; set; }
}
\ No newline at end of file
diff --git a/KoalaWiki.Domains/Warehouse/WarehouseSyncRecord.cs b/KoalaWiki.Domains/Warehouse/WarehouseSyncRecord.cs
new file mode 100644
index 00000000..d79cba26
--- /dev/null
+++ b/KoalaWiki.Domains/Warehouse/WarehouseSyncRecord.cs
@@ -0,0 +1,75 @@
+using System;
+using KoalaWiki.Entities;
+
+namespace KoalaWiki.Domains.Warehouse;
+
+///
+/// 仓库同步记录
+///
+public class WarehouseSyncRecord : Entity
+{
+ ///
+ /// 仓库ID
+ ///
+ public string WarehouseId { get; set; } = string.Empty;
+
+ ///
+ /// 同步状态 (Success, Failed, InProgress)
+ ///
+ public WarehouseSyncStatus Status { get; set; }
+
+ ///
+ /// 同步开始时间
+ ///
+ public DateTime StartTime { get; set; }
+
+ ///
+ /// 同步结束时间
+ ///
+ public DateTime? EndTime { get; set; }
+
+ ///
+ /// 同步前的版本
+ ///
+ public string? FromVersion { get; set; }
+
+ ///
+ /// 同步后的版本
+ ///
+ public string? ToVersion { get; set; }
+
+ ///
+ /// 错误信息
+ ///
+ public string? ErrorMessage { get; set; }
+
+ ///
+ /// 同步的文件数量
+ ///
+ public int FileCount { get; set; }
+
+ ///
+ /// 更新的文件数量
+ ///
+ public int UpdatedFileCount { get; set; }
+
+ ///
+ /// 新增的文件数量
+ ///
+ public int AddedFileCount { get; set; }
+
+ ///
+ /// 删除的文件数量
+ ///
+ public int DeletedFileCount { get; set; }
+
+ ///
+ /// 同步触发方式 (Auto, Manual)
+ ///
+ public WarehouseSyncTrigger Trigger { get; set; }
+
+ ///
+ /// 关联的仓库
+ ///
+ public virtual Warehouse? Warehouse { get; set; }
+}
\ No newline at end of file
diff --git a/KoalaWiki.Domains/Warehouse/WarehouseSyncStatus.cs b/KoalaWiki.Domains/Warehouse/WarehouseSyncStatus.cs
new file mode 100644
index 00000000..0adb3559
--- /dev/null
+++ b/KoalaWiki.Domains/Warehouse/WarehouseSyncStatus.cs
@@ -0,0 +1,22 @@
+namespace KoalaWiki.Domains.Warehouse;
+
+///
+/// 仓库同步状态
+///
+public enum WarehouseSyncStatus
+{
+ ///
+ /// 同步中
+ ///
+ InProgress = 0,
+
+ ///
+ /// 同步成功
+ ///
+ Success = 1,
+
+ ///
+ /// 同步失败
+ ///
+ Failed = 2
+}
\ No newline at end of file
diff --git a/KoalaWiki.Domains/Warehouse/WarehouseSyncTrigger.cs b/KoalaWiki.Domains/Warehouse/WarehouseSyncTrigger.cs
new file mode 100644
index 00000000..93dc46cf
--- /dev/null
+++ b/KoalaWiki.Domains/Warehouse/WarehouseSyncTrigger.cs
@@ -0,0 +1,17 @@
+namespace KoalaWiki.Domains.Warehouse;
+
+///
+/// 仓库同步触发方式
+///
+public enum WarehouseSyncTrigger
+{
+ ///
+ /// 自动触发
+ ///
+ Auto = 0,
+
+ ///
+ /// 手动触发
+ ///
+ Manual = 1
+}
\ No newline at end of file
diff --git a/KoalaWiki.sln b/KoalaWiki.sln
index 90f977d7..e7ef9e76 100644
--- a/KoalaWiki.sln
+++ b/KoalaWiki.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.13.35931.197
+# Visual Studio Version 18
+VisualStudioVersion = 18.0.11010.61 d18.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{7F5745CD-DAE4-4C81-A675-B427B634EB17}"
EndProject
@@ -9,6 +9,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KoalaWiki", "src\KoalaWiki\
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{25263893-E043-4F54-A41B-D97FACE64062}"
ProjectSection(SolutionItems) = preProject
+ .gitignore = .gitignore
build-image.bat = build-image.bat
build-image.sh = build-image.sh
build.sh = build.sh
diff --git a/NuGet.Config b/NuGet.Config
index 8677a1a3..8c143efb 100644
--- a/NuGet.Config
+++ b/NuGet.Config
@@ -2,7 +2,8 @@
-
+
+
diff --git a/Provider/KoalaWiki.Provider.MySQL/Migrations/20250915105048_UpdateUser.Designer.cs b/Provider/KoalaWiki.Provider.MySQL/Migrations/20250915105048_UpdateUser.Designer.cs
new file mode 100644
index 00000000..51bfaeb2
--- /dev/null
+++ b/Provider/KoalaWiki.Provider.MySQL/Migrations/20250915105048_UpdateUser.Designer.cs
@@ -0,0 +1,1390 @@
+//
+using System;
+using KoalaWiki.Provider.MySQL;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace KoalaWiki.Provider.MySQL.Migrations
+{
+ [DbContext(typeof(MySQLContext))]
+ [Migration("20250915105048_UpdateUser")]
+ partial class UpdateUser
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "9.0.7")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("KoalaWiki.Domains.AppConfig", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("AllowedDomainsJson")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("允许的域名列表JSON");
+
+ b.Property("AppId")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)")
+ .HasComment("应用ID");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasMaxLength(500)
+ .HasColumnType("varchar(500)")
+ .HasComment("应用描述");
+
+ b.Property("EnableDomainValidation")
+ .HasColumnType("tinyint(1)")
+ .HasComment("是否启用域名验证");
+
+ b.Property("Introduction")
+ .HasColumnType("longtext")
+ .HasComment("开场白");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)")
+ .HasComment("是否启用");
+
+ b.Property("LastUsedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("最后使用时间");
+
+ b.Property("Mcps")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Model")
+ .HasColumnType("longtext")
+ .HasComment("选择模型");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("应用名称");
+
+ b.Property("OrganizationName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("组织名称");
+
+ b.Property("Prompt")
+ .HasColumnType("longtext")
+ .HasComment("默认提示词");
+
+ b.Property("RecommendedQuestions")
+ .HasColumnType("longtext");
+
+ b.Property("RepositoryName")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("仓库名称");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("创建用户ID");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AppId")
+ .IsUnique();
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("IsEnabled");
+
+ b.HasIndex("Name");
+
+ b.HasIndex("OrganizationName");
+
+ b.HasIndex("RepositoryName");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("OrganizationName", "RepositoryName");
+
+ b.ToTable("AppConfigs", t =>
+ {
+ t.HasComment("应用配置表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Document", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CommentCount")
+ .HasColumnType("bigint");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("文档描述");
+
+ b.Property("GitPath")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("LastUpdate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("LikeCount")
+ .HasColumnType("bigint");
+
+ b.Property("Status")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("WarehouseId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("所属仓库Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("WarehouseId");
+
+ b.ToTable("Documents", t =>
+ {
+ t.HasComment("文档表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentCommitRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("Author")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("作者");
+
+ b.Property("CommitId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("提交Id");
+
+ b.Property("CommitMessage")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("提交信息");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("LastUpdate")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("WarehouseId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CommitId");
+
+ b.HasIndex("WarehouseId");
+
+ b.ToTable("DocumentCommitRecords", t =>
+ {
+ t.HasComment("文档提交记录表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentCatalog", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("DeletedTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("目录描述");
+
+ b.Property("DucumentId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("文档Id");
+
+ b.Property("IsCompleted")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsDeleted")
+ .HasColumnType("tinyint(1)")
+ .HasComment("是否已删除");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("目录名称");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.Property("ParentId")
+ .HasColumnType("varchar(255)")
+ .HasComment("父级目录Id");
+
+ b.Property("Prompt")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("WarehouseId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("所属仓库Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("DucumentId");
+
+ b.HasIndex("IsDeleted");
+
+ b.HasIndex("Name");
+
+ b.HasIndex("ParentId");
+
+ b.HasIndex("WarehouseId");
+
+ b.ToTable("DocumentCatalogs", t =>
+ {
+ t.HasComment("文档目录表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentCatalogI18n", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("多语言目录描述");
+
+ b.Property("DocumentCatalogId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("文档目录Id");
+
+ b.Property("LanguageCode")
+ .IsRequired()
+ .HasMaxLength(10)
+ .HasColumnType("varchar(10)")
+ .HasComment("语言代码");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("多语言目录名称");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("更新时间");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DocumentCatalogId");
+
+ b.HasIndex("LanguageCode");
+
+ b.HasIndex("DocumentCatalogId", "LanguageCode")
+ .IsUnique();
+
+ b.ToTable("DocumentCatalogI18ns", t =>
+ {
+ t.HasComment("文档目录多语言表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentFileItem", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CommentCount")
+ .HasColumnType("bigint");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("文件描述");
+
+ b.Property("DocumentCatalogId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("目录Id");
+
+ b.Property("Extra")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("扩展信息");
+
+ b.Property("IsEmbedded")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Metadata")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("元数据");
+
+ b.Property("RequestToken")
+ .HasColumnType("int");
+
+ b.Property("ResponseToken")
+ .HasColumnType("int");
+
+ b.Property("Size")
+ .HasColumnType("bigint");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("文件标题");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("DocumentCatalogId");
+
+ b.HasIndex("Title");
+
+ b.ToTable("DocumentFileItems", t =>
+ {
+ t.HasComment("文档文件项表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentFileItemI18n", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("多语言内容");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("多语言描述");
+
+ b.Property("DocumentFileItemId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("文档文件Id");
+
+ b.Property("LanguageCode")
+ .IsRequired()
+ .HasMaxLength(10)
+ .HasColumnType("varchar(10)")
+ .HasComment("语言代码");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("多语言标题");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("更新时间");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DocumentFileItemId");
+
+ b.HasIndex("LanguageCode");
+
+ b.HasIndex("DocumentFileItemId", "LanguageCode")
+ .IsUnique();
+
+ b.ToTable("DocumentFileItemI18ns", t =>
+ {
+ t.HasComment("文档文件多语言表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentFileItemSource", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("Address")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("DocumentFileItemId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("文件项Id");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("来源名称");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("DocumentFileItemId");
+
+ b.HasIndex("Name");
+
+ b.ToTable("DocumentFileItemSources", t =>
+ {
+ t.HasComment("文档文件项来源表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.TranslationTask", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("CatalogsTranslated")
+ .HasColumnType("int");
+
+ b.Property("CompletedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ErrorMessage")
+ .HasColumnType("longtext");
+
+ b.Property("FilesTranslated")
+ .HasColumnType("int");
+
+ b.Property("SourceLanguage")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("StartedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("TargetId")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("TargetLanguage")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("TaskType")
+ .HasColumnType("int");
+
+ b.Property("TotalCatalogs")
+ .HasColumnType("int");
+
+ b.Property("TotalFiles")
+ .HasColumnType("int");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("WarehouseId")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.ToTable("TranslationTasks");
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.FineTuning.FineTuningTask", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CompletedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Dataset")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("DocumentCatalogId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("目录Id");
+
+ b.Property("Error")
+ .HasColumnType("longtext");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("微调任务名称");
+
+ b.Property("OriginalDataset")
+ .HasColumnType("longtext");
+
+ b.Property("StartedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Status")
+ .HasColumnType("int")
+ .HasComment("任务状态");
+
+ b.Property("TrainingDatasetId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("训练数据集Id");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("用户Id");
+
+ b.Property("WarehouseId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("DocumentCatalogId");
+
+ b.HasIndex("Name");
+
+ b.HasIndex("Status");
+
+ b.HasIndex("TrainingDatasetId");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("WarehouseId");
+
+ b.ToTable("FineTuningTasks", t =>
+ {
+ t.HasComment("微调任务表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.FineTuning.TrainingDataset", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("ApiKey")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Endpoint")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Model")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("数据集名称");
+
+ b.Property("Prompt")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("WarehouseId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("Name");
+
+ b.HasIndex("WarehouseId");
+
+ b.ToTable("TrainingDatasets", t =>
+ {
+ t.HasComment("训练数据集表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.MCP.MCPHistory", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("Answer")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("CostTime")
+ .HasColumnType("int");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Ip")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Question")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("UserAgent")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("UserId")
+ .HasColumnType("varchar(255)")
+ .HasComment("用户Id");
+
+ b.Property("WarehouseId")
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("WarehouseId");
+
+ b.ToTable("MCPHistories", t =>
+ {
+ t.HasComment("MCP历史记录");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.MiniMap", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Value")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("小地图数据");
+
+ b.Property("WarehouseId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("WarehouseId");
+
+ b.ToTable("MiniMaps", t =>
+ {
+ t.HasComment("小地图表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Statistics.AccessRecord", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("IpAddress")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("IP地址");
+
+ b.Property("Method")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("请求方法");
+
+ b.Property("Path")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("访问路径");
+
+ b.Property("ResourceId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("资源Id");
+
+ b.Property("ResourceType")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("资源类型");
+
+ b.Property("ResponseTime")
+ .HasColumnType("bigint")
+ .HasComment("响应时间");
+
+ b.Property("StatusCode")
+ .HasColumnType("int")
+ .HasComment("状态码");
+
+ b.Property("UserAgent")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("用户代理");
+
+ b.Property("UserId")
+ .HasColumnType("varchar(255)")
+ .HasComment("用户Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("IpAddress");
+
+ b.HasIndex("ResourceId");
+
+ b.HasIndex("ResourceType");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("ResourceType", "ResourceId");
+
+ b.ToTable("AccessRecords", t =>
+ {
+ t.HasComment("访问记录表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Statistics.DailyStatistics", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("ActiveUsers")
+ .HasColumnType("int")
+ .HasComment("活跃用户数");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Date")
+ .HasColumnType("datetime(6)")
+ .HasComment("统计日期");
+
+ b.Property("NewDocumentsCount")
+ .HasColumnType("int")
+ .HasComment("新增文档数");
+
+ b.Property("NewRepositoriesCount")
+ .HasColumnType("int")
+ .HasComment("新增仓库数");
+
+ b.Property("NewUsersCount")
+ .HasColumnType("int")
+ .HasComment("新增用户数");
+
+ b.Property("PageViews")
+ .HasColumnType("int")
+ .HasComment("页面访问量");
+
+ b.Property("UniqueVisitors")
+ .HasColumnType("int")
+ .HasComment("独立访问用户数");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("更新时间");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("Date")
+ .IsUnique();
+
+ b.ToTable("DailyStatistics", t =>
+ {
+ t.HasComment("每日统计表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.SystemSetting", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("DefaultValue")
+ .HasColumnType("longtext")
+ .HasComment("默认值");
+
+ b.Property("Description")
+ .HasMaxLength(500)
+ .HasColumnType("varchar(500)")
+ .HasComment("设置描述");
+
+ b.Property("Group")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasComment("设置分组");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)")
+ .HasComment("是否启用");
+
+ b.Property("IsSensitive")
+ .HasColumnType("tinyint(1)")
+ .HasComment("是否敏感信息");
+
+ b.Property("Key")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasComment("设置键名");
+
+ b.Property("Order")
+ .HasColumnType("int")
+ .HasComment("排序顺序");
+
+ b.Property("RequiresRestart")
+ .HasColumnType("tinyint(1)")
+ .HasComment("是否需要重启生效");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("更新时间");
+
+ b.Property("Value")
+ .HasColumnType("longtext")
+ .HasComment("设置值");
+
+ b.Property("ValueType")
+ .IsRequired()
+ .HasMaxLength(20)
+ .HasColumnType("varchar(20)")
+ .HasComment("设置类型");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Group");
+
+ b.HasIndex("IsEnabled");
+
+ b.HasIndex("Key")
+ .IsUnique();
+
+ b.HasIndex("Order");
+
+ b.ToTable("SystemSettings", t =>
+ {
+ t.HasComment("系统设置表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Users.Role", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("角色描述");
+
+ b.Property("IsActive")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsSystemRole")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("角色名称");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("Name");
+
+ b.ToTable("Roles", t =>
+ {
+ t.HasComment("角色表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Users.User", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("Avatar")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("Bio")
+ .HasColumnType("longtext");
+
+ b.Property("Company")
+ .HasColumnType("longtext");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Email")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("邮箱");
+
+ b.Property("LastLoginAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("最后登录时间");
+
+ b.Property("LastLoginIp")
+ .HasColumnType("longtext");
+
+ b.Property("Location")
+ .HasColumnType("longtext");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("用户名");
+
+ b.Property("Password")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("密码");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Website")
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("Email");
+
+ b.HasIndex("LastLoginAt");
+
+ b.HasIndex("Name");
+
+ b.ToTable("Users", t =>
+ {
+ t.HasComment("用户表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Users.UserInAuth", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("AuthId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("认证Id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("Provider")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("认证提供方");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("用户Id");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthId");
+
+ b.HasIndex("Provider");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("UserInAuths", t =>
+ {
+ t.HasComment("用户认证表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Users.UserInRole", b =>
+ {
+ b.Property("UserId")
+ .HasColumnType("varchar(255)")
+ .HasComment("用户Id");
+
+ b.Property("RoleId")
+ .HasColumnType("varchar(255)")
+ .HasComment("角色Id");
+
+ b.HasKey("UserId", "RoleId");
+
+ b.ToTable("UserInRoles", t =>
+ {
+ t.HasComment("用户角色关联表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Warehouse.Warehouse", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("Address")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库地址");
+
+ b.Property("Branch")
+ .HasColumnType("varchar(255)")
+ .HasComment("分支");
+
+ b.Property("Classify")
+ .HasColumnType("int");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("仓库描述");
+
+ b.Property("Email")
+ .HasColumnType("longtext");
+
+ b.Property("Error")
+ .HasColumnType("longtext");
+
+ b.Property("Forks")
+ .HasColumnType("int");
+
+ b.Property("GitPassword")
+ .HasColumnType("longtext");
+
+ b.Property("GitUserName")
+ .HasColumnType("longtext");
+
+ b.Property("IsEmbedded")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsRecommended")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库名称");
+
+ b.Property("OptimizedDirectoryStructure")
+ .HasColumnType("longtext");
+
+ b.Property("OrganizationName")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("组织名称");
+
+ b.Property("Prompt")
+ .HasColumnType("longtext");
+
+ b.Property("Readme")
+ .HasColumnType("longtext");
+
+ b.Property("Stars")
+ .HasColumnType("int");
+
+ b.Property("Status")
+ .HasColumnType("tinyint unsigned")
+ .HasComment("仓库状态");
+
+ b.Property("Type")
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库类型");
+
+ b.Property("UserId")
+ .HasColumnType("longtext");
+
+ b.Property("Version")
+ .HasColumnType("longtext");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Address");
+
+ b.HasIndex("Branch");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("Name");
+
+ b.HasIndex("OrganizationName");
+
+ b.HasIndex("Status");
+
+ b.HasIndex("Type");
+
+ b.ToTable("Warehouses", t =>
+ {
+ t.HasComment("知识仓库表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.Warehouse.WarehouseInRole", b =>
+ {
+ b.Property("WarehouseId")
+ .HasColumnType("varchar(255)")
+ .HasComment("仓库Id");
+
+ b.Property("RoleId")
+ .HasColumnType("varchar(255)")
+ .HasComment("角色Id");
+
+ b.Property("IsDelete")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsReadOnly")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsWrite")
+ .HasColumnType("tinyint(1)");
+
+ b.HasKey("WarehouseId", "RoleId");
+
+ b.HasIndex("RoleId");
+
+ b.HasIndex("WarehouseId");
+
+ b.ToTable("WarehouseInRoles", t =>
+ {
+ t.HasComment("仓库角色关联表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Entities.DocumentOverview", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("Content")
+ .IsRequired()
+ .HasColumnType("longtext");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)");
+
+ b.Property("DocumentId")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("文档Id");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasColumnType("varchar(255)")
+ .HasComment("文档标题");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DocumentId");
+
+ b.HasIndex("Title");
+
+ b.ToTable("DocumentOverviews", t =>
+ {
+ t.HasComment("文档概览表");
+ });
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentCatalogI18n", b =>
+ {
+ b.HasOne("KoalaWiki.Domains.DocumentFile.DocumentCatalog", "DocumentCatalog")
+ .WithMany("I18nTranslations")
+ .HasForeignKey("DocumentCatalogId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("DocumentCatalog");
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentFileItemI18n", b =>
+ {
+ b.HasOne("KoalaWiki.Domains.DocumentFile.DocumentFileItem", "DocumentFileItem")
+ .WithMany("I18nTranslations")
+ .HasForeignKey("DocumentFileItemId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("DocumentFileItem");
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentFileItemSource", b =>
+ {
+ b.HasOne("KoalaWiki.Domains.DocumentFile.DocumentFileItem", "DocumentFileItem")
+ .WithMany()
+ .HasForeignKey("DocumentFileItemId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("DocumentFileItem");
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.FineTuning.FineTuningTask", b =>
+ {
+ b.HasOne("KoalaWiki.Domains.DocumentFile.DocumentCatalog", "DocumentCatalog")
+ .WithMany()
+ .HasForeignKey("DocumentCatalogId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("DocumentCatalog");
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentCatalog", b =>
+ {
+ b.Navigation("I18nTranslations");
+ });
+
+ modelBuilder.Entity("KoalaWiki.Domains.DocumentFile.DocumentFileItem", b =>
+ {
+ b.Navigation("I18nTranslations");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Provider/KoalaWiki.Provider.MySQL/Migrations/20250915105048_UpdateUser.cs b/Provider/KoalaWiki.Provider.MySQL/Migrations/20250915105048_UpdateUser.cs
new file mode 100644
index 00000000..45f180a1
--- /dev/null
+++ b/Provider/KoalaWiki.Provider.MySQL/Migrations/20250915105048_UpdateUser.cs
@@ -0,0 +1,58 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace KoalaWiki.Provider.MySQL.Migrations
+{
+ ///
+ public partial class UpdateUser : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "Bio",
+ table: "Users",
+ type: "longtext",
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "Company",
+ table: "Users",
+ type: "longtext",
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "Location",
+ table: "Users",
+ type: "longtext",
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "Website",
+ table: "Users",
+ type: "longtext",
+ nullable: true);
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "Bio",
+ table: "Users");
+
+ migrationBuilder.DropColumn(
+ name: "Company",
+ table: "Users");
+
+ migrationBuilder.DropColumn(
+ name: "Location",
+ table: "Users");
+
+ migrationBuilder.DropColumn(
+ name: "Website",
+ table: "Users");
+ }
+ }
+}
diff --git a/Provider/KoalaWiki.Provider.MySQL/Migrations/20250916162329_AddWarehouseSyncRecord.Designer.cs b/Provider/KoalaWiki.Provider.MySQL/Migrations/20250916162329_AddWarehouseSyncRecord.Designer.cs
new file mode 100644
index 00000000..08e80dd9
--- /dev/null
+++ b/Provider/KoalaWiki.Provider.MySQL/Migrations/20250916162329_AddWarehouseSyncRecord.Designer.cs
@@ -0,0 +1,1481 @@
+//
+using System;
+using KoalaWiki.Provider.MySQL;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace KoalaWiki.Provider.MySQL.Migrations
+{
+ [DbContext(typeof(MySQLContext))]
+ [Migration("20250916162329_AddWarehouseSyncRecord")]
+ partial class AddWarehouseSyncRecord
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "9.0.7")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("KoalaWiki.Domains.AppConfig", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)")
+ .HasComment("主键Id");
+
+ b.Property("AllowedDomainsJson")
+ .IsRequired()
+ .HasColumnType("longtext")
+ .HasComment("允许的域名列表JSON");
+
+ b.Property("AppId")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("varchar(64)")
+ .HasComment("应用ID");
+
+ b.Property("CreatedAt")
+ .HasColumnType("datetime(6)")
+ .HasComment("创建时间");
+
+ b.Property