mirror of
https://github.com/hpd840321/starRiverProperty.git
synced 2026-06-09 16:30:29 +08:00
7b2bd307f1
- backend/: 13 Maven modules (cw-elevator-application, cloudwalk-cloud, intelligent-cwoscomponent, ninca-crk, etc.) - frontend/: 4 Vue projects (elevator-front, cwos-portal, alarm-front, front_acs) + decompiled + scripts - scripts/: build, test-env, tools (Docker Compose, service templates, API parity) - docs/: AGENTS.md, superpowers specs, architecture docs - .gitignore: standard Java/Maven exclusions Moved from legacy maven-*/ root layout to backend/ organized structure.
397 lines
16 KiB
Markdown
397 lines
16 KiB
Markdown
# 数据库表结构参考手册 — 实施计划
|
||
|
||
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
||
|
||
**Goal:** 走查全部 5 个数据库(2 库直连 + 3 库代码推导),输出带 Mermaid ER 图 + 脱敏样本数据的 Markdown 参考手册。
|
||
|
||
**Architecture:** 分三层执行 — 数据库查询层(直连 INFORMATION_SCHEMA + SELECT 样本)、代码扫描层(并行读取全部 MyBatis Mapper XML 提取表/列/JOIN)、文档生成层(交叉验证 + 组装 Markdown)。直连库与代码扫描完全并行。
|
||
|
||
**Tech Stack:** MySQL CLI (`mysql`), Bash, Python 3(JSON 缓存), Mermaid erDiagram
|
||
|
||
**Spec:** `docs/superpowers/specs/2026-05-01-database-schema-reference-design.md`
|
||
|
||
---
|
||
|
||
## 前置检查
|
||
|
||
- [ ] **Step 0: 确认数据库可达**
|
||
|
||
```bash
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 -e "SELECT VERSION(); SHOW DATABASES LIKE '%component%'; SHOW DATABASES LIKE '%elevator%';"
|
||
```
|
||
|
||
期望输出: MySQL 版本号 + `component-organization` 和 `cw-elevator-application` 两个库存在。
|
||
|
||
> 若失败:全量降级为代码推导模式(见 Task 4 备选路径)。
|
||
|
||
---
|
||
|
||
### Task 1: 采集组件组织库 schema + 样本
|
||
|
||
**Files:**
|
||
- Create: `docs/superpowers/data/component-organization/schema_raw.json`
|
||
- Create: `docs/superpowers/data/component-organization/tables.json`
|
||
- Create: `docs/superpowers/data/component-organization/samples/`
|
||
|
||
- [ ] **Step 1: 导出表清单**
|
||
|
||
```bash
|
||
mkdir -p docs/superpowers/data/component-organization/samples
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 component-organization -N -e \
|
||
"SELECT TABLE_NAME, IFNULL(TABLE_ROWS,0), ENGINE, IFNULL(TABLE_COMMENT,'') \
|
||
FROM INFORMATION_SCHEMA.TABLES \
|
||
WHERE TABLE_SCHEMA='component-organization' AND TABLE_TYPE='BASE TABLE' \
|
||
ORDER BY TABLE_NAME;" > docs/superpowers/data/component-organization/tables.tsv
|
||
```
|
||
|
||
- [ ] **Step 2: 导出全部列定义**
|
||
|
||
```bash
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 component-organization -N -e \
|
||
"SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, IFNULL(COLUMN_DEFAULT,'NULL'), COLUMN_KEY, EXTRA, IFNULL(COLUMN_COMMENT,'') \
|
||
FROM INFORMATION_SCHEMA.COLUMNS \
|
||
WHERE TABLE_SCHEMA='component-organization' AND TABLE_NAME NOT LIKE 'QRTZ_%' AND TABLE_NAME NOT LIKE 'quartz_%' \
|
||
ORDER BY TABLE_NAME, ORDINAL_POSITION;" > docs/superpowers/data/component-organization/columns.tsv
|
||
```
|
||
|
||
- [ ] **Step 3: 导出索引**
|
||
|
||
```bash
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 component-organization -N -e \
|
||
"SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, NON_UNIQUE, SEQ_IN_INDEX \
|
||
FROM INFORMATION_SCHEMA.STATISTICS \
|
||
WHERE TABLE_SCHEMA='component-organization' \
|
||
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;" > docs/superpowers/data/component-organization/indexes.tsv
|
||
```
|
||
|
||
- [ ] **Step 4: 逐表采集样本(每表 3 行)**
|
||
|
||
```bash
|
||
# 读取表清单,排除系统表,对每张表执行 SELECT * LIMIT 3
|
||
while IFS=$'\t' read -r table_name rest; do
|
||
if [[ "$table_name" != QRTZ_* ]] && [[ "$table_name" != quartz_* ]]; then
|
||
echo "--- Extracting: $table_name ---"
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 component-organization -t -e \
|
||
"SELECT * FROM \`$table_name\` ORDER BY 1 DESC LIMIT 3;" \
|
||
> "docs/superpowers/data/component-organization/samples/${table_name}.txt" 2>&1
|
||
fi
|
||
done < <(cut -f1 docs/superpowers/data/component-organization/tables.tsv)
|
||
```
|
||
|
||
- [ ] **Step 5: 提交中间产物**
|
||
|
||
```bash
|
||
git add docs/superpowers/data/component-organization/
|
||
git commit -m "data: add component-organization schema raw dump and samples"
|
||
```
|
||
|
||
---
|
||
|
||
### Task 2: 采集电梯应用库 schema + 样本
|
||
|
||
**Files:**
|
||
- Create: `docs/superpowers/data/cw-elevator-application/schema_raw.json`
|
||
- Create: `docs/superpowers/data/cw-elevator-application/tables.json`
|
||
- Create: `docs/superpowers/data/cw-elevator-application/samples/`
|
||
|
||
- [ ] **Step 1: 导出表清单**
|
||
|
||
```bash
|
||
mkdir -p docs/superpowers/data/cw-elevator-application/samples
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application -N -e \
|
||
"SELECT TABLE_NAME, IFNULL(TABLE_ROWS,0), ENGINE, IFNULL(TABLE_COMMENT,'') \
|
||
FROM INFORMATION_SCHEMA.TABLES \
|
||
WHERE TABLE_SCHEMA='cw-elevator-application' AND TABLE_TYPE='BASE TABLE' \
|
||
ORDER BY TABLE_NAME;" > docs/superpowers/data/cw-elevator-application/tables.tsv
|
||
```
|
||
|
||
- [ ] **Step 2: 导出全部列定义**
|
||
|
||
```bash
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application -N -e \
|
||
"SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, IFNULL(COLUMN_DEFAULT,'NULL'), COLUMN_KEY, EXTRA, IFNULL(COLUMN_COMMENT,'') \
|
||
FROM INFORMATION_SCHEMA.COLUMNS \
|
||
WHERE TABLE_SCHEMA='cw-elevator-application' AND TABLE_NAME NOT LIKE 'QRTZ_%' AND TABLE_NAME NOT LIKE 'quartz_%' \
|
||
ORDER BY TABLE_NAME, ORDINAL_POSITION;" > docs/superpowers/data/cw-elevator-application/columns.tsv
|
||
```
|
||
|
||
- [ ] **Step 3: 导出索引**
|
||
|
||
```bash
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application -N -e \
|
||
"SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, NON_UNIQUE, SEQ_IN_INDEX \
|
||
FROM INFORMATION_SCHEMA.STATISTICS \
|
||
WHERE TABLE_SCHEMA='cw-elevator-application' \
|
||
ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX;" > docs/superpowers/data/cw-elevator-application/indexes.tsv
|
||
```
|
||
|
||
- [ ] **Step 4: 逐表采集样本(每表 3 行)**
|
||
|
||
```bash
|
||
while IFS=$'\t' read -r table_name rest; do
|
||
if [[ "$table_name" != QRTZ_* ]] && [[ "$table_name" != quartz_* ]]; then
|
||
echo "--- Extracting: $table_name ---"
|
||
mysql -h 192.168.3.12 -P 3307 -u root -p123456 cw-elevator-application -t -e \
|
||
"SELECT * FROM \`$table_name\` ORDER BY 1 DESC LIMIT 3;" \
|
||
> "docs/superpowers/data/cw-elevator-application/samples/${table_name}.txt" 2>&1
|
||
fi
|
||
done < <(cut -f1 docs/superpowers/data/cw-elevator-application/tables.tsv)
|
||
```
|
||
|
||
- [ ] **Step 5: 提交中间产物**
|
||
|
||
```bash
|
||
git add docs/superpowers/data/cw-elevator-application/
|
||
git commit -m "data: add cw-elevator-application schema raw dump and samples"
|
||
```
|
||
|
||
---
|
||
|
||
### Task 3: 扫描所有 MyBatis Mapper XML 提取表/列/JOIN
|
||
|
||
**Files:**
|
||
- Create: `docs/superpowers/data/mapper_tables.tsv`
|
||
|
||
- [ ] **Step 1: 枚举所有 Mapper XML 文件**
|
||
|
||
```bash
|
||
find ./maven-cw-elevator-application ./maven-cwos-resource ./maven-ninca-crk ./maven-ninca-qk-alarm \
|
||
-name "*Mapper.xml" -path "*/src/main/*" 2>/dev/null | sort \
|
||
> docs/superpowers/data/mapper_files.txt
|
||
wc -l docs/superpowers/data/mapper_files.txt
|
||
```
|
||
|
||
期望输出: ~80+ 个 Mapper XML 文件。
|
||
|
||
- [ ] **Step 2: 从 Mapper XML 提取 INSERT/UPDATE/FROM 表名**
|
||
|
||
```bash
|
||
# 提取 INSERT INTO / UPDATE / FROM / JOIN 后的表名
|
||
> docs/superpowers/data/mapper_tables.tsv
|
||
while IFS= read -r xmlfile; do
|
||
module=$(echo "$xmlfile" | cut -d'/' -f2)
|
||
tablenames=$(grep -oP '(INSERT\s+INTO\s+|UPDATE\s+|FROM\s+|JOIN\s+)\s*\`?\K[a-z_][a-z0-9_]*' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
|
||
echo -e "$module\t$xmlfile\t$tablenames"
|
||
done < docs/superpowers/data/mapper_files.txt > docs/superpowers/data/mapper_tables.tsv
|
||
```
|
||
|
||
- [ ] **Step 3: 提取 resultMap 列映射**
|
||
|
||
对每个 Mapper XML,读取 `<resultMap>` 中的 `<result column="..." property="...">` 提取列名。用下面脚本:
|
||
|
||
```bash
|
||
> docs/superpowers/data/mapper_columns.tsv
|
||
while IFS= read -r xmlfile; do
|
||
cols=$(grep -oP '<result\s+column="\K[^"]+' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
|
||
ids=$(grep -oP '<id\s+column="\K[^"]+' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
|
||
echo -e "${xmlfile}\t${ids}|${cols}"
|
||
done < docs/superpowers/data/mapper_files.txt > docs/superpowers/data/mapper_columns.tsv
|
||
```
|
||
|
||
- [ ] **Step 4: 提取 JOIN 关系**
|
||
|
||
```bash
|
||
> docs/superpowers/data/mapper_joins.tsv
|
||
while IFS= read -r xmlfile; do
|
||
joins=$(grep -oP '(LEFT\s+|RIGHT\s+|INNER\s+)?JOIN\s+\`?\K[a-z_][a-z0-9_]*\s+ON\s+\K[^;]+' "$xmlfile" 2>/dev/null | tr '\n' '|')
|
||
if [ -n "$joins" ]; then
|
||
echo -e "${xmlfile}\t${joins}"
|
||
fi
|
||
done < docs/superpowers/data/mapper_files.txt > docs/superpowers/data/mapper_joins.tsv
|
||
```
|
||
|
||
- [ ] **Step 5: 扫描 ShardingSphere 分表配置**
|
||
|
||
```bash
|
||
grep -r "actual-data-nodes\|sharding-column\|table-strategy" \
|
||
--include="*.properties" --include="*.yml" --include="*.yaml" \
|
||
./maven-cw-elevator-application/ ./maven-ninca-crk/ 2>/dev/null \
|
||
> docs/superpowers/data/sharding_config.txt
|
||
```
|
||
|
||
- [ ] **Step 6: 提交**
|
||
|
||
```bash
|
||
git add docs/superpowers/data/mapper_*.tsv docs/superpowers/data/mapper_files.txt docs/superpowers/data/sharding_config.txt
|
||
git commit -m "data: add MyBatis mapper table/column/join extraction"
|
||
```
|
||
|
||
---
|
||
|
||
### Task 4: 代码推导不可达库的表结构
|
||
|
||
**Files:**
|
||
- Create: `docs/superpowers/data/ninca-crk-std/mapper_tables.tsv`
|
||
- Create: `docs/superpowers/data/alarm-deploy/mapper_tables.tsv`
|
||
- Create: `docs/superpowers/data/cwos-resource/mapper_tables.tsv`
|
||
|
||
**ninca_crk_std** 和 **alarm_deploy** 的 MyBatis mapper 路径在 `application.properties` 中声明:
|
||
- ninca-crk: `classpath*:cn/cloudwalk/data/**/mysql/*.xml,classpath*:cn/cloudwalk/task/data/**/mysql/*.xml`
|
||
- alarm: `classpath:cn/cloudwalk/data/**/mysql/*.xml`
|
||
- cwos-resource: Mapper XML 已在 Task 3 中扫描
|
||
|
||
- [ ] **Step 1: 从 ninca-crk 的 Mapper XML 提取表信息**
|
||
|
||
```bash
|
||
# ninca-crk 的 Mapper XML 位于 src/main/java 下(非 resources/mapper)
|
||
find ./maven-ninca-crk -name "*.xml" -path "*/mysql/*" 2>/dev/null | sort > docs/superpowers/data/ninca-crk-std/mapper_files.txt
|
||
|
||
while IFS= read -r xmlfile; do
|
||
tablenames=$(grep -oP '(INSERT\s+INTO\s+|UPDATE\s+|FROM\s+|JOIN\s+)\s*\`?\K[a-z_][a-z0-9_]*' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
|
||
echo -e "ninca-crk-std\t$xmlfile\t$tablenames"
|
||
done < docs/superpowers/data/ninca-crk-std/mapper_files.txt > docs/superpowers/data/ninca-crk-std/mapper_tables.tsv
|
||
```
|
||
|
||
- [ ] **Step 2: 从 alarm 的 Mapper XML 提取表信息**
|
||
|
||
```bash
|
||
find ./maven-ninca-qk-alarm -name "*.xml" -path "*/mysql/*" 2>/dev/null | sort > docs/superpowers/data/alarm-deploy/mapper_files.txt
|
||
|
||
while IFS= read -r xmlfile; do
|
||
tablenames=$(grep -oP '(INSERT\s+INTO\s+|UPDATE\s+|FROM\s+|JOIN\s+)\s*\`?\K[a-z_][a-z0-9_]*' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
|
||
echo -e "alarm-deploy\t$xmlfile\t$tablenames"
|
||
done < docs/superpowers/data/alarm-deploy/mapper_files.txt > docs/superpowers/data/alarm-deploy/mapper_tables.tsv
|
||
```
|
||
|
||
- [ ] **Step 3: 从 cwos-resource 的 Mapper XML 提取表信息**
|
||
|
||
```bash
|
||
# cwos-resource 有 db2/mysql/oracle 三个方言目录,以 mysql/ 为准
|
||
find ./maven-cwos-resource -name "*.xml" -path "*/mysql/*" 2>/dev/null | sort > docs/superpowers/data/cwos-resource/mapper_files.txt
|
||
|
||
while IFS= read -r xmlfile; do
|
||
tablenames=$(grep -oP '(INSERT\s+INTO\s+|UPDATE\s+|FROM\s+|JOIN\s+)\s*\`?\K[a-z_][a-z0-9_]*' "$xmlfile" 2>/dev/null | sort -u | tr '\n' ',')
|
||
echo -e "cwos-resource\t$xmlfile\t$tablenames"
|
||
done < docs/superpowers/data/cwos-resource/mapper_files.txt > docs/superpowers/data/cwos-resource/mapper_tables.tsv
|
||
```
|
||
|
||
- [ ] **Step 4: 提交**
|
||
|
||
```bash
|
||
git add docs/superpowers/data/ninca-crk-std/ docs/superpowers/data/alarm-deploy/ docs/superpowers/data/cwos-resource/
|
||
git commit -m "data: add code-derived table info for unreachable databases"
|
||
```
|
||
|
||
---
|
||
|
||
### Task 5: 交叉验证与生成最终 Markdown 文档
|
||
|
||
**Files:**
|
||
- Create: `docs/superpowers/specs/2026-05-01-database-schema-reference.md`(最终产物)
|
||
|
||
此任务通过 subagent 执行——将 Task 1-4 采集的原始数据 + 现有架构文档 + Mapper 扫描结果汇总为最终手册。
|
||
|
||
- [ ] **Step 1: 交付 subagent 生成文档**
|
||
|
||
委托 `deep` agent,传入以下 prompt:
|
||
|
||
```
|
||
TASK: 根据以下原始数据生成数据库表结构参考手册 Markdown 文件。
|
||
|
||
EXPECTED OUTCOME:
|
||
- 文件写入 docs/superpowers/specs/2026-05-01-database-schema-reference.md
|
||
- 包含 9 个章节(见设计说明 §2)
|
||
- 每库有 Mermaid erDiagram ER 图
|
||
- 每表有列清单(列名、类型、可空、键、注释)
|
||
- 可连库的表有脱敏样本数据(Markdown 表格,≤3 行)
|
||
- 跨库关系总图
|
||
- 代码-表映射索引
|
||
|
||
REQUIRED TOOLS: Read, Write, Bash
|
||
|
||
MUST DO:
|
||
1. 读取设计说明: docs/superpowers/specs/2026-05-01-database-schema-reference-design.md
|
||
2. 读取现有架构文档: docs/architecture/租户组织人员访客-数据模型与用例.md
|
||
3. 读取 Task 1-2 的 schema 原始数据: docs/superpowers/data/component-organization/ 和 cw-elevator-application/ 下的 tables.tsv, columns.tsv, indexes.tsv
|
||
4. 读取 Task 1-2 的样本数据: samples/ 目录下各 .txt 文件
|
||
5. 读取 Task 3-4 的 Mapper 扫描结果: docs/superpowers/data/mapper_tables.tsv, mapper_columns.tsv, mapper_joins.tsv
|
||
6. 对每张表应用脱敏规则(设计说明 §5.3):姓名截断、手机号截断、IP替换、密码列跳过、时间戳转换
|
||
7. 按设计说明 §4 规范绘制 Mermaid ER 图:业务关键列、三种关系线(约束/JOIN/跨库)、subgraph 分包
|
||
8. 交叉验证:列出「库中有但代码无 Mapper」的表(标注为运维/外部表),对比 DDL 与实际列
|
||
9. 对不可达库(ninca-crk-std, alarm-deploy, cwos-resource)显式标注「⚠️ 未连接生产库,从代码推导」
|
||
10. Mermaid 语法必须可渲染(erDiagram 关键字、正确的 {} 语法、||--o{ 关系线)
|
||
11. 文档中不出现 "TBD"、"TODO"、"待补充"
|
||
|
||
MUST NOT DO:
|
||
- 不要编造未在原始数据中出现的表名或列名
|
||
- 不要对不可达库声称有样本数据
|
||
- 不要包含系统表(QRTZ_*, quartz_*)
|
||
- 不要包含未脱敏的姓名/手机号/IP
|
||
|
||
CONTEXT:
|
||
- 仓库路径: /media/zebra/9e8fa357-7db6-4d70-88ed-d5de5a059a663/星河湾星中星/源码
|
||
- 数据库环境: 192.168.3.12:3307 (MySQL), user=root, password=123456
|
||
- 数据库: component-organization, cw-elevator-application (直连); ninca_crk_std, alarm_deploy, cwos_resource (代码推导)
|
||
- 现有架构文档已有 organization 库 5 表 + elevator 库 2 表的 ER 模型,以此为起点扩展
|
||
- MyBatis Mapper XML 路径已在 mapper_files.txt 中列出
|
||
```
|
||
|
||
- [ ] **Step 2: 验证文档完整性**
|
||
|
||
```bash
|
||
# 检查文档存在且非空
|
||
wc -l docs/superpowers/specs/2026-05-01-database-schema-reference.md
|
||
|
||
# 检查 Mermaid 块数量(应有 ≥5 个 erDiagram 块)
|
||
grep -c 'erDiagram' docs/superpowers/specs/2026-05-01-database-schema-reference.md
|
||
|
||
# 检查无占位符
|
||
! grep -n 'TBD\|TODO\|待补充' docs/superpowers/specs/2026-05-01-database-schema-reference.md
|
||
echo "Exit: $?"
|
||
```
|
||
|
||
期望: 文件 ≥ 500 行,≥ 5 个 erDiagram 块,无占位符匹配(exit 0)。
|
||
|
||
- [ ] **Step 3: 提交**
|
||
|
||
```bash
|
||
git add docs/superpowers/specs/2026-05-01-database-schema-reference.md
|
||
git commit -m "docs: add full database schema reference manual with ER diagrams and sample data"
|
||
```
|
||
|
||
---
|
||
|
||
### Task 6: 收尾清理
|
||
|
||
- [ ] **Step 1: 取消中间数据跟踪(可选)**
|
||
|
||
若中间数据不应入库,更新 `.gitignore`:
|
||
|
||
```bash
|
||
# 如需排除原始数据
|
||
echo "docs/superpowers/data/" >> .gitignore
|
||
```
|
||
|
||
- [ ] **Step 2: 最终提交**
|
||
|
||
```bash
|
||
git add -A
|
||
git status
|
||
git commit -m "chore: finalize database schema reference delivery"
|
||
```
|
||
|
||
---
|
||
|
||
## 备选路径
|
||
|
||
### 若 192.168.3.12 不可达
|
||
|
||
跳过 Task 1 和 Task 2。所有表结构从代码 Mapper XML 推导,标注「⚠️ 数据库不可达,全部信息从代码推导」。在 Task 5 的 subagent prompt 中移除「读取样本数据」步骤。
|
||
|
||
### 若某个库的 Mapper XML 为空
|
||
|
||
对应章节仅输出「该模块未发现 MyBatis Mapper XML,无法从代码推导表结构」,不生成 ER 图。
|
||
|
||
---
|
||
|
||
## 完成检查清单
|
||
|
||
- [ ] 产物文件 `docs/superpowers/specs/2026-05-01-database-schema-reference.md` 存在且 ≥ 500 行
|
||
- [ ] 5 个数据库各有独立章节 + ER 图
|
||
- [ ] 跨库关系总图存在
|
||
- [ ] 代码-表映射索引覆盖全部 Mapper XML
|
||
- [ ] 可连库的每张表有 1-3 行脱敏样本
|
||
- [ ] 无 `TBD` / `TODO` / `待补充`
|
||
- [ ] 所有 Mermaid 块语法正确可渲染
|
||
- [ ] 脱敏规则已应用(姓名截断、手机号截断等)
|