背景:A3 需把行业 / 客户 / 客户组 / 客户级字段立为资产根节点;用户确认两级行业树与混搭 UI(行业 B / 客户列表 A / 详情 A / 新建 B / 客户组 B / 字段 A)。 改动: - 新增 ADR-002,行业改为两级树,客户挂末级行业;同步 PRD / 技术架构 / 开发计划。 - 新增 client 模块:industries / customers / customer-groups / customer-fields 接口、真实 PrismaCustomerDirectory、客户状态机与客户转交、客户组数据范围解析、跨客户 404。 - 新增迁移与幂等种子(电商/金融两级行业、2 客户、1 客户组、4 条字段)。 - 前端新增行业/客户/客户组/字段审批页面与路由、导航更名(客户管理 / 行业管理 / 客户组),复用现有 token。 - 补充 shared 契约单测、client 集成用例、A3 浏览器 e2e。 影响面:client 模块与 client 表、shared 契约、web 路由/导航、ScopeContext 数据范围、OpenAPI 与种子;A1 客户转交占位由 client 实现替换。 回滚:回滚本提交;数据库保留新增表或按报告执行 down SQL;CUSTOMER_DIRECTORY 可切回空集实现。 验证:format:check / lint / typecheck / test 全绿(shared 131 / api 90 / web 125,共 346);test:int 5 文件 39 条;A3 e2e 1/1;build 8/8;真实浏览器六页验证通过。
63 lines
8.6 KiB
Markdown
63 lines
8.6 KiB
Markdown
# 种子数据状态(A2)
|
||
|
||
A0 只 seed「已建表」的 `system_configs`;A1 补齐组织、账号与角色种子;A2 补齐权限点目录、角色权限映射与六类数据范围种子。全部种子按业务唯一键 upsert,**幂等**:重复执行不重复插入,也不覆盖已存在的密码 / 人工调整值。
|
||
|
||
> 权限点编码唯一事实源是 `packages/shared/src/permissions.ts`(30 个 / 10 模块 / 6 个特殊权限 / 3 对 SoD),`seed.ts` 直接引用 shared 源码目录,不在本文件复制编码字符串。
|
||
|
||
## 已 seed(`prisma/seed.ts`)
|
||
|
||
| 数据 | 来源 | 幂等键 | 说明 |
|
||
| ------------------------------ | ---------------------------- | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||
| 平台系统配置 7 项 | `system_configs` | `config_key` | 平台名、导出链接有效期、上传上限、分页大小、AI 预算比例等,A0 起延续 |
|
||
| 部门 / 小组 9 个(两级) | `departments` | `code` | 内容生产中心(素材一组 / 素材二组 / 设计组)、交付中心(客户成功组)、平台技术部(AI 工程组 / 平台运维组);一级部门负责人取 `leader_account`,用户种子之后回填 `leader_user_id` |
|
||
| 权限点目录 30 个 | `permissions` | `code`(只增不删) | 10 个模块(script / material / asset / delivery / customer / customer_group / identity / industry / platform / audit);启动时由 `PermissionCatalogService` 幂等 upsert,seed 同步一次 |
|
||
| 角色 10 个 + 角色权限点 | `roles` / `role_permissions` | 角色 `code`;权限映射先清后建 | 与 `design/a2-ui-v1/brief.md` §4 对齐:超级管理员(隐式全集,映射 24 普通 + 6 特殊)、平台管理员 12+1(`audit:read`)、素材运营 9、设计师 4、文案策划 2、审核员 4、AI 工程师 3+1(`ai:configure`)、客户负责人 5、行业配置 4、审核主管 5(停用);非超管角色合计 50 条映射,特殊授予共 8 项;新建角色仍默认全空、特殊权限单独授予 |
|
||
| 角色数据范围 | `data_scopes` | 角色 `code`;范围先清后建 | 一个角色只允许一种范围类型:超管 / 平台管理员 / AI 工程师 / 行业配置 = `all`;素材运营 / 设计师 = `owned_customers`;文案策划 = `department`;审核员 / 审核主管 = `department_and_children`;客户负责人 = `customer_groups`(A3 前无客户组,保留一行 `target_id = NULL` 以固定范围类型,不降级为最小权限) |
|
||
| 用户 11 个(超管 1 + 示例 10) | `users` / `user_roles` | `account`;用户角色先清后建 | 超管 `admin`,示例用户与 A1 原型口径一致(陈默、林清、周岸、赵一诺、高岑、苏禾、沈知远、江岚、唐嘉、何岸);唐嘉 / 何岸为停用态,用于「停用即时失效」联调 |
|
||
| 用户初始密码 | `users.password_hash` | — | 统一 `lingxi2026`(Argon2id),`must_change_password=true`:首登强制改密 |
|
||
|
||
## 登录账号(本地联调)
|
||
|
||
| 账号 | 姓名 | 角色 | 部门 / 小组 | 状态 |
|
||
| -------------- | ---------- | -------------------- | ----------------------- | ---- |
|
||
| `admin` | 灵犀管理员 | 超级管理员 | 平台技术部(直属) | 在职 |
|
||
| `chen.mo` | 陈默 | 素材运营、客户负责人 | 内容生产中心 / 素材一组 | 在职 |
|
||
| `lin.qing` | 林清 | 设计师 | 内容生产中心 / 设计组 | 在职 |
|
||
| `zhou.an` | 周岸 | 文案策划 | 内容生产中心 / 素材二组 | 在职 |
|
||
| `zhao.yinuo` | 赵一诺 | 审核员 | 内容生产中心 / 素材二组 | 在职 |
|
||
| `gao.cen` | 高岑 | 客户负责人 | 交付中心 / 客户成功组 | 在职 |
|
||
| `su.he` | 苏禾 | AI 工程师 | 平台技术部 / AI 工程组 | 在职 |
|
||
| `shen.zhiyuan` | 沈知远 | 超级管理员 | 平台技术部(直属) | 在职 |
|
||
| `jiang.lan` | 江岚 | 平台管理员 | 平台技术部 / 平台运维组 | 在职 |
|
||
| `tang.jia` | 唐嘉 | 素材运营 | 内容生产中心 / 素材一组 | 停用 |
|
||
| `he.an` | 何岸 | 客户负责人 | 交付中心 / 客户成功组 | 停用 |
|
||
|
||
> 登录账号按共享契约 `accountSchema` 不含 `@`(邮箱本地部分 / 工号风格);邮箱由种子自动生成 `账号@lingxi.cn`。
|
||
|
||
## 使用
|
||
|
||
```bash
|
||
pnpm db:init # 推荐:migrate deploy + 幂等 seed(不重置数据、不覆盖已有密码)
|
||
pnpm db:migrate # 开发期新增迁移时使用(prisma migrate dev)
|
||
pnpm db:seed # 只跑种子;幂等,不覆盖已有密码
|
||
# 本地清库:pnpm db:reset(会重建全部表并重新 seed,账号回到初始密码 + 首登改密标记)
|
||
```
|
||
|
||
> **密码何时会被重置**:只有执行 `db:reset` / `prisma migrate reset` / 手工删库或重建 PG 数据卷时,种子账号才会回到 `lingxi2026` 且 `must_change_password=true`。
|
||
> `dev.sh`、`pnpm dev`、`pnpm db:init`、`pnpm db:seed` 都不会覆盖已有用户密码;`must_change_password` 在用户成功改密后写为 `false`,之后登录不再要求改密。
|
||
|
||
## 与 A1 / A2 遗留的关系
|
||
|
||
- A1 记录的角色 / 用户种子已延续;A2 在其上补齐权限点目录、特殊权限口径(默认关闭、显式授予)与六类数据范围。
|
||
- 角色权限数按原型 `design/a2-ui-v1/brief.md` 对齐(12/9/4/2/4/3/5/4/5,特殊授予 8 项);用户仍为 A1 的 11 个示例账号,原型「绑定用户 28 名」属 UI 示例数据,未扩种用户。
|
||
- A3 起新增客户与行业种子:两级行业「电商(服饰鞋包 / 美妆个护)」「金融(信贷)」、客户「花间集 / 素研」、客户组「电商核心组」、4 条客户级字段(1 条待审批);按业务唯一键幂等写入,不覆盖人工调整。
|
||
- 字典(A4)、行业包(B0)仍留待后续批次建表,不在本种子内。
|
||
- `data_scopes` 只存角色声明的范围与授权对象;A3 起由真实 `CustomerDirectory` 在请求期解析(客户负责人 / 客户组 / 部门 / 创建人),种子不写解析结果。
|
||
- 原有的 `Q-A0-01`(种子验收与建表顺序冲突)已随 A1 建表解除。
|
||
|
||
## 已知限制
|
||
|
||
- 客户转交已由 A3 client 模块落地(`/customers/{id}/transfer` 与 `/users/{id}/transfer-customers`),不再返回占位错误;客户组范围可指向种子客户组。
|
||
- 审计表属 A5,`@Audit` 当前写结构化日志(含前后值与影响用户数);A5 落库后在此扩展日志 + 审计表双写。
|
||
- `outbox_events` 已写入 `role.permissions.changed` 占位事件(角色新建 / 更新 / 停用 / 删除),通知投递随 A5 / 任务中心接入。
|