adspecs 0.1.32 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/.adspecs/paths.json +1 -1
  2. package/.claude-plugin/marketplace.json +1 -1
  3. package/.claude-plugin/plugin.json +1 -1
  4. package/.codebuddy-plugin/plugin.json +1 -1
  5. package/.qoder-plugin/plugin.json +1 -1
  6. package/.workbuddy-plugin/plugin.json +1 -1
  7. package/CLAUDE.md +2 -2
  8. package/README.md +137 -108
  9. package/package.json +1 -1
  10. package/references/ant6-front-standard/02-/347/273/204/344/273/266/350/247/204/350/214/203.md +7 -0
  11. package/references/ant6-front-standard/03-/345/210/227/350/241/250/350/247/204/350/214/203.md +222 -147
  12. package/references/ant6-front-standard/04-/350/241/250/345/215/225/350/247/204/350/214/203.md +8 -0
  13. package/references/ant6-front-standard/09-/345/270/270/350/247/201/351/227/256/351/242/230/350/247/204/350/214/203.md +1 -1
  14. package/references/ant6-front-standard/index.md +100 -99
  15. package/references/yudaocloud-end-standard/01-Java/345/220/216/347/253/257/347/274/226/347/240/201/350/247/204/350/214/203.md +1166 -0
  16. package/references/yudaocloud-end-standard/02-/346/225/260/346/215/256/345/272/223/350/256/276/350/256/241/344/270/216/344/275/277/347/224/250/350/247/204/350/214/203.md +1023 -0
  17. package/references/yudaocloud-end-standard/03-/346/225/260/346/215/256/345/255/227/345/205/270/344/270/216/350/217/234/345/215/225/350/247/204/350/214/203.md +336 -0
  18. package/references/yudaocloud-end-standard/index.md +14 -3
  19. package/references/yudaocloud-end-standard/system_dict_type.sql +186 -0
  20. package/skills/adspecs-plan/SKILL.md +1 -1
  21. package/skills/adspecs-utest/SKILL.md +62 -40
  22. package/skills/project-init/SKILL.md +4 -4
  23. package/src/lib/paths-defaults.js +1 -1
  24. package/src/lib/readme-gen.js +1 -1
  25. package/references/ant6-front-standard/05-/345/211/215/347/253/257/347/274/226/347/240/201/350/247/204/350/214/203.md +0 -1443
@@ -0,0 +1,336 @@
1
+ # 数据字典与菜单数据规范
2
+
3
+ > **版本**: v1.0
4
+ > **修订日期**: 2026-08-01
5
+ > **适用范围**: ultracloud 项目所有后端模块的系统设计 SQL 文件生成
6
+ > **目标**: 统一数据字典(system_dict_type + system_dict_data)和菜单数据(system_menu)的 SQL 文件拆分、格式、ID 分配规则
7
+
8
+ 本规范基于 P11-17 Skill 技能管理、P15 本体引擎的实际抽离经验编写,可直接落地。
9
+
10
+ ---
11
+
12
+ ## 1. SQL 文件拆分规则
13
+
14
+ 系统设计阶段必须生成 **2 个独立 SQL 文件**,不得合并:
15
+
16
+ | 文件 | 命名规则 | 内容 | 依赖 |
17
+ | --- | --- | --- | --- |
18
+ | **建表 DDL** | `{模块编号}-{模块名}_schema.sql` | 业务表 CREATE TABLE + 索引 + COMMENT ON | 无(可独立执行) |
19
+ | **字典菜单数据** | `{模块编号}_menu-dict-type-data.sql` | 系统基础表 CREATE TABLE IF NOT EXISTS + 字典类型 + 字典数据 + 菜单数据 | 无(可独立执行) |
20
+
21
+ ### 1.1 拆分原因
22
+
23
+ 1. **职责分离**:建表 DDL 是结构定义,字典菜单是业务数据
24
+ 2. **执行顺序灵活**:字典菜单数据可独立执行,不依赖业务表
25
+ 3. **可独立执行**:字典菜单文件包含系统基础表建表语句(CREATE TABLE IF NOT EXISTS),即使数据库未初始化 system 模块也能执行
26
+ 4. **便于维护**:字典菜单数据频繁变更,独立文件便于增量更新
27
+
28
+ ### 1.2 文件示例
29
+
30
+ ```
31
+ docs/30-system-design/P11-17/
32
+ ├── P11-17_skill-management_schema.sql # 8 张业务表 DDL
33
+ └── p11_17_menu-dict-type-data.sql # 字典类型 + 字典数据 + 菜单
34
+
35
+ docs/30-system-design/P15/
36
+ ├── P15-ontology-engine_schema.sql # 13 张业务表 DDL
37
+ └── p15_menu-dict-type-data.sql # 字典类型 + 字典数据 + 菜单
38
+ ```
39
+
40
+ ---
41
+
42
+ ## 2. 字典菜单 SQL 文件结构
43
+
44
+ 文件按以下顺序组织,每部分用 `-- ======` 分隔:
45
+
46
+ ```
47
+ 1. 文件头注释(模块信息 + 规范说明 + ID 范围)
48
+ 2. SET client_encoding / standard_conforming_strings
49
+ 3. §零 系统基础表(CREATE TABLE IF NOT EXISTS × 3)
50
+ - system_dict_type
51
+ - system_dict_data
52
+ - system_menu
53
+ 4. §一 数据字典类型(INSERT INTO "system_dict_type")
54
+ 5. §二 数据字典数据(INSERT INTO "system_dict_data")
55
+ 6. §三 菜单数据(INSERT INTO "system_menu")
56
+ 7. 文件尾总结注释
57
+ ```
58
+
59
+ ---
60
+
61
+ ## 3. 系统基础表结构(CREATE TABLE IF NOT EXISTS)
62
+
63
+ ### 3.1 为什么需要建表语句
64
+
65
+ 这三张表由 `ultracloud-module-system` 模块管理。但在以下场景中数据库可能尚未初始化:
66
+ - 全新数据库部署
67
+ - 仅初始化业务模块未初始化 system 模块
68
+ - 测试环境快速搭建
69
+
70
+ 因此字典菜单文件必须包含 `CREATE TABLE IF NOT EXISTS` 语句,已存在则跳过,不影响已有数据。
71
+
72
+ ### 3.2 system_dict_type(字典类型表)
73
+
74
+ ```sql
75
+ CREATE TABLE IF NOT EXISTS "system_dict_type" (
76
+ "id" BIGSERIAL PRIMARY KEY,
77
+ "name" VARCHAR(100) NOT NULL DEFAULT '',
78
+ "type" VARCHAR(100) NOT NULL DEFAULT '',
79
+ "status" SMALLINT NOT NULL DEFAULT 0,
80
+ "remark" VARCHAR(500) DEFAULT NULL,
81
+ "creator" VARCHAR(64) DEFAULT '',
82
+ "create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
83
+ "updater" VARCHAR(64) DEFAULT '',
84
+ "update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
85
+ "deleted" SMALLINT NOT NULL DEFAULT 0,
86
+ "deleted_time" TIMESTAMP DEFAULT NULL
87
+ );
88
+
89
+ CREATE UNIQUE INDEX IF NOT EXISTS "uk_system_dict_type_type" ON "system_dict_type" ("type") WHERE "deleted" = 0;
90
+ ```
91
+
92
+ ### 3.3 system_dict_data(字典数据表)
93
+
94
+ ```sql
95
+ CREATE TABLE IF NOT EXISTS "system_dict_data" (
96
+ "id" BIGSERIAL PRIMARY KEY,
97
+ "sort" INTEGER NOT NULL DEFAULT 0,
98
+ "label" VARCHAR(100) NOT NULL DEFAULT '',
99
+ "value" VARCHAR(100) NOT NULL DEFAULT '',
100
+ "dict_type" VARCHAR(100) NOT NULL DEFAULT '',
101
+ "status" SMALLINT NOT NULL DEFAULT 0,
102
+ "color_type" VARCHAR(50) DEFAULT '',
103
+ "css_class" VARCHAR(100) DEFAULT '',
104
+ "remark" VARCHAR(500) DEFAULT NULL,
105
+ "creator" VARCHAR(64) DEFAULT '',
106
+ "create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
107
+ "updater" VARCHAR(64) DEFAULT '',
108
+ "update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
109
+ "deleted" SMALLINT NOT NULL DEFAULT 0,
110
+ "deleted_time" TIMESTAMP DEFAULT NULL
111
+ );
112
+
113
+ CREATE INDEX IF NOT EXISTS "idx_system_dict_data_type" ON "system_dict_data" ("dict_type");
114
+ ```
115
+
116
+ ### 3.4 system_menu(菜单权限表)
117
+
118
+ ```sql
119
+ CREATE TABLE IF NOT EXISTS "system_menu" (
120
+ "id" BIGSERIAL PRIMARY KEY,
121
+ "name" VARCHAR(50) NOT NULL DEFAULT '',
122
+ "permission" VARCHAR(100) NOT NULL DEFAULT '',
123
+ "type" SMALLINT NOT NULL DEFAULT 2,
124
+ "sort" INTEGER NOT NULL DEFAULT 0,
125
+ "parent_id" BIGINT NOT NULL DEFAULT 0,
126
+ "path" VARCHAR(200) DEFAULT '',
127
+ "icon" VARCHAR(100) DEFAULT '#',
128
+ "component" VARCHAR(255) DEFAULT NULL,
129
+ "component_name" VARCHAR(255) DEFAULT NULL,
130
+ "status" SMALLINT NOT NULL DEFAULT 0,
131
+ "visible" BOOLEAN NOT NULL DEFAULT TRUE,
132
+ "keep_alive" BOOLEAN NOT NULL DEFAULT TRUE,
133
+ "always_show" BOOLEAN NOT NULL DEFAULT TRUE,
134
+ "creator" VARCHAR(64) DEFAULT '',
135
+ "create_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
136
+ "updater" VARCHAR(64) DEFAULT '',
137
+ "update_time" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
138
+ "deleted" SMALLINT NOT NULL DEFAULT 0,
139
+ "deleted_time" TIMESTAMP DEFAULT NULL
140
+ );
141
+
142
+ CREATE INDEX IF NOT EXISTS "idx_system_menu_parent_id" ON "system_menu" ("parent_id");
143
+ ```
144
+
145
+ > **注意**:三张表均不含 `tenant_id`(字典和菜单为全局共享数据)。`deleted` 用 `SMALLINT`(整数 0/1),`visible`/`keep_alive`/`always_show` 用 `BOOLEAN`。
146
+
147
+ ---
148
+
149
+ ## 4. INSERT 语句格式规范
150
+
151
+ ### 4.1 通用格式要求
152
+
153
+ 所有 INSERT 语句必须遵循以下格式(参照 `system_dict_type.sql` 实际系统表数据):
154
+
155
+ | 规范项 | 要求 | 示例 |
156
+ | --- | --- | --- |
157
+ | 表名/字段名 | 双引号包裹 | `"system_dict_type"`、`"id"`、`"name"` |
158
+ | `deleted` 字段值 | 整数 `0`(非 `FALSE`) | `..., 0, NULL` |
159
+ | `deleted_time` 字段 | 必须包含,值为 `NULL` | `..., 0, NULL` |
160
+ | `id` 字段 | 显式指定(非自增分配) | `SELECT 7001, ...` |
161
+ | 时间字段 | `CURRENT_TIMESTAMP` | `CURRENT_TIMESTAMP` |
162
+ | 幂等性 | `INSERT ... SELECT ... WHERE NOT EXISTS` | 见下方模板 |
163
+ | 字符串值 | 单引号包裹 | `'草稿'`、`'DRAFT'` |
164
+ | NULL 值 | 直接写 `NULL` | `NULL` |
165
+
166
+ ### 4.2 system_dict_type INSERT 模板
167
+
168
+ ```sql
169
+ INSERT INTO "system_dict_type" ("id", "name", "type", "status", "remark", "creator", "create_time", "updater", "update_time", "deleted", "deleted_time")
170
+ SELECT {id}, '{中文名}', '{dict_type}', 0, '{备注}', '1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, 0, NULL
171
+ WHERE NOT EXISTS (SELECT 1 FROM "system_dict_type" WHERE "type" = '{dict_type}');
172
+ ```
173
+
174
+ ### 4.3 system_dict_data INSERT 模板
175
+
176
+ ```sql
177
+ INSERT INTO "system_dict_data" ("id", "sort", "label", "value", "dict_type", "status", "color_type", "css_class", "remark", "creator", "create_time", "updater", "update_time", "deleted", "deleted_time")
178
+ SELECT {id}, {sort}, '{标签}', '{值}', '{dict_type}', 0, '{color_type}', '', {remark}, '1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, 0, NULL
179
+ WHERE NOT EXISTS (SELECT 1 FROM "system_dict_data" WHERE "dict_type" = '{dict_type}' AND "value" = '{值}');
180
+ ```
181
+
182
+ ### 4.4 system_menu INSERT 模板
183
+
184
+ ```sql
185
+ INSERT INTO "system_menu" ("id", "name", "permission", "type", "sort", "parent_id", "path", "icon", "component", "component_name", "status", "visible", "keep_alive", "always_show", "creator", "create_time", "updater", "update_time", "deleted", "deleted_time")
186
+ SELECT {id}, '{菜单名}', '{权限标识}', {type}, {sort}, {parent_id}, '{path}', '{icon}', {component}, {component_name}, 0, TRUE, TRUE, TRUE, '1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, 0, NULL
187
+ WHERE NOT EXISTS (SELECT 1 FROM "system_menu" WHERE "id" = {id});
188
+ ```
189
+
190
+ ---
191
+
192
+ ## 5. ID 分配规则
193
+
194
+ ### 5.1 字典类型 ID(system_dict_type.id)
195
+
196
+ | 模块 | ID 范围 | 示例 |
197
+ | --- | --- | --- |
198
+ | 系统内置 | 1~999 | `system_user_sex` = 1 |
199
+ | P11-17 Skill 技能管理 | 6001~6100 | `ai_skill_status` = 6001 |
200
+ | P15 本体引擎 | 7001~7100 | `ontology_status` = 7001 |
201
+ | 新模块 | 按模块编号 ×1000 起始 | P16 = 8001~8100 |
202
+
203
+ ### 5.2 字典数据 ID(system_dict_data.id)
204
+
205
+ | 模块 | ID 范围 | 规则 |
206
+ | --- | --- | --- |
207
+ | 系统内置 | 1~9999 | — |
208
+ | P11-17 | 60001~69999 | `{模块ID前缀}00{序号}` |
209
+ | P15 | 70001~79999 | `{模块ID前缀}00{序号}` |
210
+ | 新模块 | 按模块编号 ×10000 起始 | P16 = 80001~89999 |
211
+
212
+ ### 5.3 菜单 ID(system_menu.id)
213
+
214
+ | 模块 | ID 范围 | 结构 |
215
+ | --- | --- | --- |
216
+ | 系统内置 | 1~1999 | — |
217
+ | MDM 主数据 | 5000~5999 | — |
218
+ | P11-17 Skill 技能管理 | 6000~6199 | 1 目录(6000) + 菜单(6001~6005) + 按钮(6011~6033) |
219
+ | P15 本体引擎 | 7000~7199 | 1 目录(7000) + 菜单(7001~7006) + 按钮(7101~7153) |
220
+ | 新模块 | 按模块编号 ×1000 起始 | P16 = 8000~8199 |
221
+
222
+ ### 5.4 菜单 ID 内部分配规则
223
+
224
+ ```
225
+ {模块千位}000 — 一级目录
226
+ {模块千位}001~{模块千位}099 — 二级菜单(type=2)
227
+ {模块千位}100~{模块千位}199 — 按钮权限(type=3),parent_id 指向对应二级菜单
228
+ ```
229
+
230
+ 示例(P15 本体引擎,千位=7):
231
+ - 7000 = 一级目录"本体引擎"
232
+ - 7001~7006 = 二级菜单(本体管理/实体类管理/...)
233
+ - 7101~7109 = 本体管理按钮(parent_id=7001)
234
+ - 7111~7113 = 实体类管理按钮(parent_id=7002)
235
+ - ...
236
+
237
+ ---
238
+
239
+ ## 6. 字典类型命名规则
240
+
241
+ ### 6.1 dict_type 标识命名
242
+
243
+ 格式:`{模块前缀}_{业务含义}`,全小写 + 下划线分隔
244
+
245
+ | 模块 | 前缀 | 示例 |
246
+ | --- | --- | --- |
247
+ | System | `system_` | `system_user_sex` |
248
+ | Infra | `infra_` | `infra_config_type` |
249
+ | AI 模块 | `ai_` | `ai_skill_status` |
250
+ | 本体引擎 | `ontology_` | `ontology_status`、`ontology_property_type` |
251
+ | 新模块 | 按模块缩写 | — |
252
+
253
+ ### 6.2 dict_data.value 命名
254
+
255
+ - **枚举字符串值**:使用 Java Enum 的 `name()` 值(大写下划线),如 `DRAFT`、`PUBLISHED`、`ONE_TO_MANY`
256
+ - **数值型枚举**:使用数值字符串,如 `0`、`1`、`2`
257
+ - **同一 dict_type 下的 value 不可重复**
258
+
259
+ ### 6.3 color_type 约定
260
+
261
+ | 场景 | color_type |
262
+ | --- | --- |
263
+ | 成功/启用/生效 | `success` |
264
+ | 警告/待处理 | `warning` |
265
+ | 危险/禁止/失效 | `danger` |
266
+ | 普通/信息 | `info` |
267
+ | 主要业务标识 | `primary` |
268
+ | 默认/无特殊含义 | `default` |
269
+
270
+ ---
271
+
272
+ ## 7. 菜单数据规范
273
+
274
+ ### 7.1 菜单类型(type)
275
+
276
+ | type | 含义 | 必填字段 | component |
277
+ | --- | --- | --- | --- |
278
+ | 1 | 目录 | name, path, icon, sort, parent_id | NULL |
279
+ | 2 | 菜单 | name, path, icon, component, sort, parent_id | 前端组件路径 |
280
+ | 3 | 按钮 | name, permission, parent_id | NULL |
281
+
282
+ ### 7.2 权限标识命名
283
+
284
+ 格式:`{module}:{resource}:{action}`
285
+
286
+ | 操作 | action | 示例 |
287
+ | --- | --- | --- |
288
+ | 查询 | `read` | `ontology:ontology:read` |
289
+ | 创建 | `create` | `ontology:ontology:create` |
290
+ | 更新 | `update` | `ontology:ontology:update` |
291
+ | 删除 | `delete` | `ontology:ontology:delete` |
292
+ | 导出 | `export` | `ontology:ontology:export` |
293
+ | 导入 | `import` | `ontology:ontology:import` |
294
+ | 特殊操作 | `{action}` | `ontology:ontology:publish`、`ontology:ontology:rollback` |
295
+
296
+ ### 7.3 目录结构层级
297
+
298
+ ```text
299
+ 目录 (type=1, parent_id=0) ← 一级导航
300
+ └─ 菜单 (type=2, parent_id=父ID) ← 实际页面
301
+ ├─ 按钮 (type=3, parent_id=菜单ID) ← 查询/创建/编辑/删除等
302
+ ```
303
+
304
+ 按钮的 `path`、`icon`、`component` 字段必须为 `''` 或 `NULL`。
305
+
306
+ ---
307
+
308
+ ## 8. 禁止事项
309
+
310
+ 1. **禁止将字典菜单数据写入 `_schema.sql` 文件** — 必须独立为 `_menu-dict-type-data.sql`
311
+ 2. **禁止 `deleted` 使用 `BOOLEAN` 或 `FALSE`** — 统一用 `SMALLINT` + 整数 `0/1`
312
+ 3. **禁止省略 `deleted_time` 字段** — 所有 INSERT 必须包含
313
+ 4. **禁止表名/字段名不加双引号** — PostgreSQL 中双引号确保大小写敏感一致
314
+ 5. **禁止使用 `INSERT INTO ... VALUES (...)` 直接插入** — 必须用 `INSERT ... SELECT ... WHERE NOT EXISTS` 保证幂等
315
+ 6. **禁止字典菜单文件不包含 CREATE TABLE IF NOT EXISTS** — 确保文件可独立执行
316
+ 7. **禁止菜单 ID 跨模块冲突** — 新模块须按 §5.3 规则分配 ID 范围
317
+
318
+ ---
319
+
320
+ ## 9. 检查清单
321
+
322
+ 生成 `_menu-dict-type-data.sql` 文件后,逐项核对:
323
+
324
+ - [ ] 文件包含 3 张系统基础表 `CREATE TABLE IF NOT EXISTS`
325
+ - [ ] 表名/字段名全部用双引号包裹
326
+ - [ ] `deleted` 字段用 `SMALLINT DEFAULT 0`(非 BOOLEAN)
327
+ - [ ] 所有 INSERT 包含 `deleted_time` 字段(值为 NULL)
328
+ - [ ] 所有 INSERT 包含显式 `id` 字段
329
+ - [ ] 所有 INSERT 使用 `WHERE NOT EXISTS` 幂等语法
330
+ - [ ] 字典类型 `type` 标识全小写下划线,模块前缀正确
331
+ - [ ] 字典数据 `value` 不重复(同一 dict_type 内)
332
+ - [ ] 菜单 ID 在模块分配范围内
333
+ - [ ] 菜单按钮的 `path`/`icon`/`component` 为空或 NULL
334
+ - [ ] 菜单 `permission` 格式为 `{module}:{resource}:{action}`
335
+ - [ ] `color_type` 值在约定范围内(success/warning/danger/info/primary/default)
336
+ - [ ] 执行顺序:建表 → dict_type → dict_data → menu
@@ -2,11 +2,22 @@
2
2
 
3
3
  ## 推荐读取顺序
4
4
 
5
- 1. 01-Python后端编码规范.md
5
+ 1. 01-Java后端编码规范.md
6
6
  2. 02-数据库设计与使用规范.md
7
- 3. 03-Celery异步任务规范.md
7
+ 3. 03-数据字典与菜单规范.md
8
8
  4. 04-Redis使用规范.md
9
9
 
10
10
 
11
11
  ## 维护要求
12
- - 新增规则文件时,同步更新本索引和根目录 `claude.md`。
12
+ - 新增规则文件时,同步更新本索引和根目录 `claude.md`。
13
+
14
+ ## SQL 文件生成规范(系统设计阶段)
15
+
16
+ 生成系统设计时必须产出 **2 个独立 SQL 文件**(详见 `03-数据字典与菜单规范.md`):
17
+
18
+ | 文件 | 命名规则 | 内容 |
19
+ | ------------ | ---------------------------------------- | ------------------------------------------------------------------ |
20
+ | 建表 DDL | `{模块编号}-{模块名}_schema.sql` | 业务表 CREATE TABLE + 索引 + COMMENT |
21
+ | 字典菜单数据 | `{模块编号}-{模块名}_menu-dict-data.sql` | 系统基础表 CREATE TABLE IF NOT EXISTS + 字典类型 + 字典数据 + 菜单 |
22
+
23
+ 字典菜单文件必须可独立执行(含 system_dict_type/system_dict_data/system_menu 三张表的 CREATE TABLE IF NOT EXISTS)。