2.2 KiB
2.2 KiB
Context
布局壳已完成(frontend/AD/layout)。菜单占位数据里「用户管理」指向 /system/user,但该路由页面尚未创建。本阶段只做界面,占位数据字段对齐后端 User 模型,后端对接放到后续。
Goals / Non-Goals
Goals:
- 跑通 CRUD 页面模式(搜索 + 表格 + 分页 + 弹窗表单 + 删除确认 + 重置密码),作为后续页面的模板。
- 数据源隔离在
src/api/user.ts,页面只调其函数,后续换 http 不动页面。
Non-Goals:
- 不接后端真实接口;不做「关联角色/部门」的跨域操作;不抽公共 CRUD 组件(等第二个页面再抽共性)。
Decisions
D1. 数据源:mock 模块,契约对齐后端
src/api/user.ts 导出异步函数(listUsers/createUser/updateUser/deleteUser/resetPassword),内部用模块级数组模拟数据,返回 {code:0, message:'ok', data}。字段严格对齐后端 User(id/tenantCode/username/nickname/email/phone/status/orgCode/createdAt)。
- 备选:页面内联 mock。放弃——后续接后端要改页面,隔离到 api 模块换实现即可。
- 该模块用注释标注「TODO: 对接后端」,后续替换为
http调用。
D2. 页面结构(直接使用 Element Plus)
src/pages/system/user/index.vue 使用 el-form(搜索)+ el-table(列表)+ el-pagination(分页)+ el-dialog + el-form(新增/编辑/重置密码)+ ElMessage/ElMessageBox(提示/确认)。
- 不抽公共组件:等第二个域页面出现重复再提取(YAGNI)。
- 页面用
<route>块声明meta(breadcrumb/title 等可后续补)。
D3. 状态与组织展示
状态 status 用 el-tag 区分(enabled=success / disabled=info / locked=danger)。所属组织 orgCode 在表格显示组织名(mock 内联一个 org 映射),表单用 el-select 选择。
Risks / Trade-offs
- [mock 数据不持久] → 刷新即重置,仅用于界面演示;接后端后自然解决。
- [公共组件抽取时机] → 先做单页,第二个域页面出现重复时再抽
ty-*公共组件。
Migration Plan
- 纯前端新增,无迁移。回滚
git revert。
Open Questions
(无)