Files
shanxia2.0/openspec/changes/dict-management/design.md
T

2.9 KiB
Raw Blame History

Context

当前系统无字典管理功能。多个模块(组织管理、站点管理、角色管理等)依赖字典编码进行状态/分类映射(如 zzlbbm、bmzt、zdlx、zdywfw)。数据库表 sys_dict_type 和 sys_dict_data 已在 DDL 中定义,但后端无对应模型、CRUD、API 路由,前端无对应页面。

现有代码模式参考:

  • 后端:crud/tenant.py 的独立函数模式(list_*, get_*, create_*, update_*, soft_delete_*),api/admin.py 的路由模式
  • 前端:views/system/unit/index.vue 标准列表模板,api/admin.ts 的 request.get/post/put/del 模式
  • 模型:models.py 中直接使用 from app.core.database import Base,公共字段顺序遵循 V0.3 约定

Goals / Non-Goals

Goals:

  • 提供字典类型的完整 CRUD(分页列表、新增、修改、软删除)
  • 提供字典数据的完整 CRUD(按字典类型分组,支持新增、修改、软删除)
  • 前端字典类型列表页 + 字典数据配置弹窗
  • 严格遵循租户隔离、软删除、默认排序等工程规范
  • 初始化字典数据脚本(zzlbbm、bmzt、zdlx、zdywfw)

Non-Goals:

  • 字典缓存机制(后续优化)
  • 字典数据批量导入导出
  • 字典变更审计日志
  • 小程序端字典管理

Decisions

D1: 后端 CRUD 采用独立函数模式(非 CRUDBase 泛型)

选择: 参照 crud/tenant.py 的独立函数 + _row_to_dict() 模式 理由: 现有业务模块(tenant)均使用此模式,保持一致性比引入新模式更重要 替代方案: 使用 crud/base.py 的 CRUDBase[Model] 泛型 → 被弃用,因为 tenant 模块未使用,且手动函数更灵活

D2: 字典 API 路由注册在 admin.py

选择: 在现有 api/admin.py 中新增字典路由组 理由: 字典属于系统管理范畴,与 tenant 同属 admin 路由前缀 /web/admin。模块较少,无需新建文件 替代方案: 新建 api/system.py → 可行但当前系统管理模块可集中管理

D3: 字典数据查询通过 dict_type 关联

选择: 字典数据列表按 dict_type 过滤查询,前端弹窗传入 dict_type 获取对应字典数据 理由: 需求文档明确"点击字典数据配置按钮弹出弹窗",弹窗需知道当前字典类型

D4: 前端字典数据配置弹窗采用 Dialog + 内嵌表格

选择: 字典类型列表页 + 点击"字典数据配置"弹出 Dialog,Dialog 内展示该类型的字典数据表格,支持行内新增/编辑/删除 理由: 需求文档 2.1.2 描述的交互模式

Risks / Trade-offs

  • [字典类型编码唯一性] dict_type 在同一 tenant 下需唯一 → 通过数据库唯一索引 uk_dict_type + 应用层校验双重保障
  • [字典数据量] 某些字典类型数据较多 → 弹窗内分页查询,每页 20 条
  • [初始化数据] 需要确保系统初始化时有基础字典数据 → 提供独立 SQL 初始化脚本