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

54 lines
2.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 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 初始化脚本