update: 数据库初始化为单文件,换用演示环境种子库(v1.0.4 对齐)

原 13 个分散脚本整合为 schema/init.sql 一个文件,来源换成演示环境
正在使用的种子库(结构已与生产核对,89 表基线)。

内容变化(相比旧的 12 文件版本):
- 新增 v1.0.4 前置段:t_export_task(导出中心)、sys_notice_user、
  card_channel_assoc.channel_id 扩宽为 varchar(64)、9 条菜单权限
- 修正 3 个真实缺陷:cron 表达式 L 改为 28-31(调度器可解析)、
  通道模板 created_dept 103 改为 1(悬空机构致列表恒为空)、
  菜单 444 的 path 修正
- 数据库共 91 表(旧版 89,v1.0.4 新增 2 张)

脱敏:
- 18 个演示账号保留(出库/划拨依赖账号与部门树关联),
  昵称/邮箱/手机号/登录IP/头像改为占位或编造值
- 归属部门、租户的联系电话与邮箱一并处理
- 公司名、组织名 → 示例企业
- 内网/生产 IP、内部域名 → 删除或改为服务名
- Mock 通道地址指向 onelink-mock 服务
- 通道模板真实上游密钥置空
- sys_social(微信绑定)不随分发

口令处理:改为纯 SQL,不再用 .sh + 环境变量。
  业务账号:CREATE USER 语句内字面口令
  种子账号:UPDATE sys_user SET password = MD5(CONCAT(MD5('<口令>'), MD5(salt)))
  与 docker-compose.yml、config/*/config.yaml 保持同一口令

已验证:本地 MySQL 8.0 容器按 docker-entrypoint-initdb.d 实际导入,
无报错;表 91、菜单 456、账号 18、字典 86/436、通道模板 3、Mock 通道 1、
导出中心与通知表各 1、定时任务 20;18 条口令哈希自洽;
应用账号 u_iotlcm 可连库查询。
This commit is contained in:
MiFaZhan
2026-10-29 16:32:27 +08:00
parent 4d43238c63
commit 616451b29d
15 changed files with 1321 additions and 1440 deletions
+57 -74
View File
@@ -1,8 +1,58 @@
# 数据库初始化脚本
# 数据库初始化
MySQL 容器**首次以空数据卷启动**时,`docker-entrypoint-initdb.d` 会按**文件名顺序**自动执行本目录下的脚本。
`init.sql` 是**单文件**初始化脚本,MySQL 容器首次以空数据卷启动时由 `docker-entrypoint-initdb.d` 自动执行。
改了这些文件必须清空数据卷才会重跑:
## 内容组成
按文件内顺序执行,整体幂等:
| 段 | 内容 |
| --- | --- |
| 表结构与基础数据 | 建 `db_iotlcm` 库 + 全部表 + 菜单/字典/角色/租户/部门/演示账号 |
| 结构补齐 | `card_channel_assoc` 表 + 27 个列(用存储过程按 `information_schema` 判断) |
| 结构对齐生产 | `t_sms_template_config` 表、`batch_no` 默认值 |
| 通道模板 | 23 条(上游密钥已置空) |
| 数据字典 | 86 类 / 435 条 |
| Mock 通道 | `channel_yd_mock`。**卡全部挂在该通道上**,缺则卡片管理的通道列、筛选、开停复机均不可用 |
| 角色链 | 代理下发模板参数与角色下发标记 |
| 定时任务 | 19 条,**默认全部停用**(避免自动全量同步打满机器) |
| 菜单增量 | 达量断网按钮权限、全量同步页 |
| v1.0.4 前置 | 导出中心表 `t_export_task`、通知已读表 `sys_notice_user`、`card_channel_assoc.channel_id` 扩宽、菜单权限 |
| 数据修复 | `sys_dept.ancestors` 尾逗号归一化(全新库为空操作) |
| 业务账号与口令 | 建 `u_iotlcm` 账号、可选库 `iotdb`、种子账号口令统一重置 |
## 来源
内容取自**演示环境正在使用的种子库**,结构已与生产核对(89 表 / 1703 列)。与源版本的差异仅为脱敏:
- 演示账号昵称、邮箱、手机号、登录 IP、头像 → 占位或编造值
- 公司名、组织名 → 「示例企业」等通用名
- 内网/生产 IP、内部域名 → 删除或改为服务名
- 通道模板中真实上游密钥 → 置空
- 数据库账号与种子账号口令 → 统一为部署口令(字面值,见下)
## 改口令
口令是**字面值**,不使用环境变量。修改时必须同步以下三处:
| 位置 | 内容 |
| --- | --- |
| `docker-compose.yml` | `MYSQL_ROOT_PASSWORD` |
| `config/*/config.yaml` | 各服务 `database link` 的口令 |
| `schema/init.sql` 末段 | `u_iotlcm` 账号口令、种子账号重置口令 |
```bash
OLD='原口令'; NEW='新口令'
grep -rl "$OLD" docker-compose.yml config/ schema/ | xargs sed -i "s/$OLD/$NEW/g"
```
::: warning 口令不能含 @ : / 等字符
连接串格式为 `mysql:用户:口令` 再接 `tcp(主机:端口)/库`,口令里的 `@`、`:`、`/` 会被当作分隔符,导致连接失败。用字母数字组合。
:::
## 重新初始化
`init.sql` 只在 `data/mysql` 为空时执行。改完必须清空数据卷才会重跑:
```bash
docker compose stop mysql
@@ -10,81 +60,14 @@ sudo rm -rf ./data/mysql
docker compose up -d mysql
```
> ⚠️ 清空 `./data/mysql` 会**删除全部数据**,生产环境不要执行。
> ⚠️ 会删除全部数据,生产环境禁止执行。
## 执行顺序
## 空表说明
| 序号 | 文件 | 内容 |
| --- | --- | --- |
| 01 | `01-schema.sql` | 建库 + 全部表结构 + 基础数据(菜单、字典、角色、租户、演示账号)。自包含:`DROP DATABASE` → `CREATE` → `USE` |
| 02 | `02-schema-fix-preview1.sql` | 补 `card_channel_assoc` 表 + 27 列。用存储过程按 `information_schema` 判断,规避 MySQL 8 无 `ADD COLUMN IF NOT EXISTS` |
| 03 | `03-schema-align-prod.sql` | 补 `t_sms_template_config` 表 + 修正 `batch_no` 默认值 |
| 04 | `04-users.sh` | 建应用账号 `iotlcm_app` + 可选库 `iotdb` |
| 05 | `05-reset-passwords.sh` | 把所有种子账号口令重置为脚本内设定的口令(按各账号自身 salt 重算哈希) |
| 06 | `06-seed-channel-templates.sql` | 通道模板 23 条(上游密钥已置空) |
| 07 | `07-seed-dict.sql` | 数据字典:`sys_dict_type` 86 类 + `sys_dict_data` 435 条 |
| 08 | `08-seed-mock-channel.sql` | **Mock 通道 `channel_yd_mock`**。演示卡全部挂在该通道上,缺则卡片管理的通道列、筛选、开停复机均不可用 |
| 09 | `09-seed-role-chain.sql` | 代理下发模板参数 + 角色下发标记 |
| 10 | `10-seed-jobs.sql` | 定时任务 19 条,**默认全部停用**(避免自动全量同步压满机器) |
| 11 | `11-seed-menu-align-prod.sql` | 菜单增量 27 条(含达量断网按钮权限、全量同步页) |
| 12 | `12-repair-dept-ancestors.sql` | `sys_dept.ancestors` 尾逗号归一化。全新库为空操作 |
| 13 | `13-seed-flow-package.sql` | **占位文件**,流量套餐为空。需在管理端「套餐定价」中创建 |
## 口令说明
`04-users.sh` 与 `05-reset-passwords.sh` 里的口令是**字面值**(不使用环境变量),必须与以下位置保持一致:
| 口令 | 需同步的位置 |
| --- | --- |
| 应用账号 `iotlcm_app` | `docker-compose.yml` 的 `MYSQL_ROOT_PASSWORD`(root)与 `config/*/config.yaml` 里 database link 的口令 |
| 种子账号 | `docker-compose.yml` 里 admin 的初始化口令说明、`05-reset-passwords.sh` 的 `ADMIN_PASSWORD` |
改口令时三处一起改,漏改会导致服务连不上库或登录失败。
## 种子数据说明
### 保留的内容(业务必需)
- **菜单** `sys_menu`:系统导航与按钮权限
- **字典** `sys_dict_type` / `sys_dict_data`:全部业务枚举
- **角色** `sys_role` / `sys_role_menu` / `sys_role_dept`:超级管理员、M管理员、M用户、终端用户
- **租户与部门** `sys_tenant` / `sys_dept`:企业-代理-部门三层结构
- **接口权限** `t_api` / `t_api_group` / `t_api_resource`:OpenAPI 权限模型
- **通道模板** `t_sim_channel_template`:运营商通道配置模板
- **行政区划** `t_division_code`:省市级
- **演示账号** `sys_user` 18 个:覆盖管理员、代理、终端用户等角色,出库与划拨流程依赖这张表与部门树的关联
### 已脱敏的内容
| 项 | 处理 |
| --- | --- |
| 账号昵称 | `示例用户01` ~ `示例用户18` |
| 邮箱 | `user01@example.com` ~ `user18@example.com` |
| 手机号 | 合法 11 位编造号(保持互异) |
| 登录 IP | 清空 |
| 头像地址 | 清空 |
| 公司名 / 组织名 | `示例企业` / `示例代理` |
| 通道密钥 | 置空 |
### 空表(正常)
以下表为空属预期:
| 表 | 说明 |
| --- | --- |
| `t_sim_flow_package_info` | 流量套餐,见 `13-seed-flow-package.sql` 说明 |
| `t_sim_flow_package_info` | 流量套餐。为空时无法办理套餐/续费/改套餐,需在管理端「套餐定价」中创建 |
| `t_sim_card` | 卡数据,可通过挡板服务造卡或自行入库 |
| 其余 `t_*` 业务表 | 随业务操作产生数据 |
## 手动执行
容器已启动后单独执行某个脚本:
```bash
docker compose exec -T mysql sh -c \
'exec mysql -uroot -p"<root口令>" db_iotlcm' < schema/07-seed-dict.sql
```
`.sh` 脚本:
```bash
docker compose exec mysql bash /docker-entrypoint-initdb.d/04-users.sh
```