# backend **Repository Path**: WHLNoTenant/backend ## Basic Information - **Project Name**: backend - **Description**: No description available - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-29 - **Last Updated**: 2026-07-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # docs/ — WHL backend 数据库脚本 > 新环境 fresh-init 入口 — 2026-07-12 重组:**schema + seed 都按 module 归位** ## 目录结构 ``` docs/ ├── README.md # 本文件 ├── init/ │ └── init-all.sql # 一键初始化入口(建库 + 跑全量 schema + 各 module seed) ├── sys/ │ ├── schema/SysSchema.sql # 8 张 sys 表 │ └── seed/ │ ├── seed_sys_user_admin.sql # admin 账号 │ └── seed_sys_data_dictionary.sql # 5 父 + 10 子 enum ├── pluginmanager/ │ └── schema/PluginmanagerSchema.sql # 4 张 plugin_manager 表 ├── file/ │ ├── schema/FileSchema.sql # 3 张 file 表 │ └── seed/ │ ├── seed_file_category.sql # 6 顶层 file_category │ └── seed_file_content_type.sql # 24 后缀→MIME 映射 ├── platform/ │ ├── schema/PlatformSchema.sql # 6 张 platform 表 │ └── seed/ │ └── seed_platform_tenant.sql # 系统租户 + personalization └── plugin/codegen/ ├── schema/CodegenSchema.sql # 4 张 codegen 表 └── seed/ ├── seed_codegen_data_dictionary.sql # 3 父 + 14 子 enum └── seed_codegen_template.sql # 6 套内置 Handlebars 模板 ``` ## 一键初始化(1 步) ```bash mysql -u root -p < docs/init/init-all.sql mysql -u root -p whl_ai -e "SHOW TABLES; SELECT COUNT(*) FROM sys_user; SELECT COUNT(*) FROM file_category;" ``` **默认账号**:`admin` / `admin`(首次登录后必须改密码) **做了什么**: 1. **建库** `whl_ai`(utf8mb4) 2. **跑 schema** 按依赖顺序:sys → pluginmanager → file → platform → plugin/codegen 3. **跑 seed** 同样依赖顺序:admin/数据字典 → 系统租户 → file 分类/content type → codegen 字典/模板 4. **统计验证** 各 module 表数 + 基础数据条数 ## 表清单(24 张,2026-07-18) | Module | Tables | |--------|--------| | **sys** (8) | `sys_coding_rule_state`, `sys_data_dictionary`, `sys_page`, `sys_permission`, `sys_role`, `sys_user`, `sys_user_role`, `sys_verification_code` | | **pluginmanager** (3) | `plugin_info`, `plugin_migration`, `plugin_version` | | **file** (3) | `file_category`, `file_content_type`, `file_info` | | **platform** (6) | `coding_rule`, `email_tenant_config`, `personalization`, `sms_tenant_config`, `tenant`, `tenant_contract` | | **plugin/codegen** (4) | `codegen_data_dictionary`, `codegen_history`, `codegen_template`, `codegen_external_db` | ## 字段约定 - **6 字段规范**(框架 `BaseTable` 派生):`Id` / `CreateDate` / `CreateByUserId` / `LastModifyDate` / `LastModifyUserId` / `IsDeleted` - 租户级表(`BaseDeletedAndTenantTable` 派生)多 1 个 `TenantNo` - 所有列名 **PascalCase 无下划线**(WHL DB 约定,跨表关联键也保持 PascalCase) - `IsDeleted` 放最后(2026-07-12 user 拍板) ## 密码 hash 算法 `sys_user.Password` = `LOWER(MD5(CONCAT(plaintext, Md5Key)))` - `Md5Key` 取自 `WHL.Web/config/site.json` → `App.Cipher.Md5key`(默认 `ae125efkk4454eeff444ferfkny6oxi8`) - 默认 admin 密码:`admin` → hash = `0935a46b9fef4621153a4ce1c3322390` - 改 `site.json` 的 Md5Key 后,需要重新算 admin 密码 hash 更新到 `docs/sys/seed/seed_sys_user_admin.sql` ## SQL 维护说明 **schema/ 下的 SQL 是从 entity 反推的 baseline** — 实体变更后,需要同步更新 SQL(无代码工具): 1. 改 `Domain/Table/XxxTable.cs`(`[SugarTable]` + `[SugarColumn]`) 2. 同步改 `docs/{module}/schema/{Module}Schema.sql` 对应的表 DDL 3. 测试:`mysql -u root -p < docs/init/init-all.sql` 验证 fresh-init 能跑通 4. **prod DB 手动改**(agent 不改 DB,已 hard-rule)— 写 alter SQL 自己跑 5. **commit** — entity + schema SQL 一起 **seed/ 下的 SQL 是基础数据**: - 跟 schema 同步:加新表 → 写新 seed - 已有 seed 用 `INSERT IGNORE` / `ON DUPLICATE KEY UPDATE`,**可重复执行** ## 添加新表/新字段的 workflow 1. **加 entity class** — `Domain/Table/XxxTable.cs` + `[SugarTable]` + `[SugarColumn]` 2. **写 schema SQL** — `docs/{module}/schema/{Module}Schema.sql`(同目录加 CREATE TABLE) 3. **写 seed(可选)** — `docs/{module}/seed/seed_*.sql`(如果需要基础数据) 4. **更新 init-all.sql** — 加 `SOURCE ../{module}/schema/...` 或 `SOURCE ../{module}/seed/...` 5. **更新本 README** — 表清单 +1 行 6. **commit** ## 添加新数据字典 enum 的 workflow 1. **加 enum class** — `Core/Enum/EnumXxxType.cs` + `[Description("中文")]` 2. **admin 手动维护** — 2026-07-10 改造后枚举自动 seed 已删除,数据由 admin 手动在 UI 加 3. **跨环境同步** — admin 加好后导出 INSERT SQL,放到对应 module 的 `seed_sys_data_dictionary.sql` / `seed_codegen_data_dictionary.sql` ## 添加新 plugin 的 workflow 1. **plugin repo** — `whl.plugins/{PluginCode}/server/WHL.{PluginCode}.Domain/Table/*Table.cs` 2. **写新 schema** — `docs/plugin/{plugincode}/schema/{PluginCode}Schema.sql`(参考 codegen) 3. **写新 seed(可选)** — `docs/plugin/{plugincode}/seed/seed_*.sql` 4. **更新 init-all.sql** — 加 `SOURCE ../plugin/{plugincode}/schema/...` 等 5. **commit** ## 注意事项 - `init-all.sql` 是 **新环境用**,**不要在已有数据的 prod DB 上跑**(`DROP TABLE IF EXISTS` 会清空) - 所有 seed 用 `INSERT IGNORE` / `ON DUPLICATE KEY UPDATE`,**可重复执行** - 菜单(sys_page)由后端 controller 反射自动生成 — 不需要 seed(2026-07-12 user 拍板) - schema SQL 跟 entity 同步是**手动的**(无代码工具),entity 改完必须同步改 SQL - 任何 entity 变更后必须同步改 schema,否则 schema 会跟代码脱节