# 通用中后台框架建设顺序 本文用于指导后续实现,按“先后端、再前端”的方式推进。整体分为四期: 1. 一期:基础后端 2. 二期:完整后端 3. 三期:基础前端 4. 四期:完整前端 原则: - 后端先稳定数据模型、认证、权限和接口契约。 - 前端尽量基于真实接口开发,减少假数据页面返工。 - 每一期都要能编译、能启动、能验证,不留下半成品入口。 - 前端 UI 统一走极简、圆角、干净、高端、现代、有层次感、有动效、年轻化的中后台风格。 - 新增代码保持 UTF-8 编码。 ## 一期:基础后端 目标:把后端基础设施和认证权限闭环跑起来,为前端提供稳定接口契约。 ### 1. 整理后端基础结构 - 保持当前 `server` 工程结构。 - 保留 `common`、`config`、`plugins`、`database/system`、`database/business`。 - 新增必要目录: - `security` - `bootstrap` - `modules/auth` - 模块内部只按需要创建 `Routes`、`Service`、`Dtos`,不创建空文件。 验收: - `./gradlew.bat compileKotlin` 通过。 - `/health` 可访问。 - 应用启动日志清晰,无无关异常。 ### 2. 完善公共能力 - 补充分页模型: - `PageQuery` - `PageResult` - 补充错误码模型: - `ErrorCode` - 补充 traceId 机制: - 每个请求生成 traceId。 - 异常响应返回 traceId。 - 日志输出 traceId。 - 保持统一响应: - 成功:`code = "0"` - 失败:稳定错误码 + 中文错误信息。 验收: - 所有接口响应统一为 `ApiResult`。 - 业务异常、参数异常、未知异常都进入统一异常处理。 - 失败响应包含 traceId。 ### 3. 完成数据库初始化 - 在 `bootstrap` 中实现数据库初始化。 - 使用当前 `database/system` 下的表定义创建系统基础表。 - 暂时以 Exposed 表定义表达结构,后续生产前再决定是否迁移到正式迁移工具。 - 主数据表按默认软删除设计: - `deleted_at` - `deleted_by` - 关系表和日志表不强制软删除。 验收: - 空数据库启动后能完成建表。 - 重复启动不会因为表已存在导致失败。 - 初始化失败时服务启动失败,不进入半可用状态。 ### 4. 完成种子数据 - 在 `bootstrap/SeedData.kt` 中维护初始化数据。 - 初始化数据必须可重复执行。 - 默认写入: - 默认组织 - 管理员用户 `admin` - 超级管理员角色 - 基础菜单 - 基础权限码 - 基础字典 - 管理员账号固定为 `admin`,初始化密码固定写入后端种子数据,首次登录后可在系统内修改。 验收: - 空库启动后存在 `admin` 用户。 - 存在超级管理员角色。 - 存在基础菜单和权限码。 - 多次启动不会重复插入相同数据。 ### 5. 完成认证能力 - 实现密码处理: - 密码哈希。 - 密码校验。 - 实现 JWT 服务: - 签发 access token。 - 校验 issuer、audience、token_type。 - 写入 `sub`、`username`、`orgId`、`roles`、`tokenVersion`。 - 实现认证接口: - `POST /api/auth/login` - `POST /api/auth/logout` - `GET /api/auth/me` 验收: - `admin` 可以登录。 - 登录失败返回稳定错误码。 - `/api/auth/me` 返回当前用户、菜单树、权限码。 - 用户禁用后不能继续登录。 - `tokenVersion` 变化后旧 token 失效。 ### 6. 完成权限基础能力 - 实现当前用户上下文。 - 实现 `requirePermission`。 - 后端接口必须显式声明权限码。 - 超级管理员拥有全部权限。 验收: - 未登录访问受保护接口返回 401。 - 登录但无权限返回 403。 - 有权限用户可以访问对应接口。 ## 二期:完整后端 目标:完成后端全部基础模块接口,形成稳定的中后台 API 能力。 ### 1. 用户管理接口 接口范围: - `GET /api/system/users` - `POST /api/system/users` - `GET /api/system/users/{id}` - `PUT /api/system/users/{id}` - `DELETE /api/system/users/{id}` - `PUT /api/system/users/{id}/status` - `PUT /api/system/users/{id}/password` - `PUT /api/system/users/{id}/roles` 要求: - 支持分页查询。 - 支持按用户名、昵称、状态、组织查询。 - 新增用户时校验用户名唯一。 - 删除默认软删除。 - 修改密码更新 `tokenVersion`。 - 分配角色要校验角色状态。 验收: - 用户 CRUD 可完整调用。 - 软删除用户默认不出现在列表。 - 用户角色分配后 `/api/auth/me` 权限生效。 ### 2. 组织管理接口 接口范围: - `GET /api/system/orgs` - `POST /api/system/orgs` - `PUT /api/system/orgs/{id}` - `DELETE /api/system/orgs/{id}` 要求: - 组织按树结构返回。 - 编码唯一。 - 删除组织前校验是否存在子组织或用户。 - 系统内置组织可禁止删除。 验收: - 组织树排序稳定。 - 有引用的组织不能删除。 ### 3. 角色管理接口 接口范围: - `GET /api/system/roles` - `POST /api/system/roles` - `GET /api/system/roles/{id}` - `PUT /api/system/roles/{id}` - `DELETE /api/system/roles/{id}` - `PUT /api/system/roles/{id}/menus` 要求: - 角色编码唯一。 - 支持启用、禁用。 - 删除前校验是否被用户使用。 - 角色菜单分配同时决定菜单权限和按钮权限。 验收: - 角色 CRUD 可完整调用。 - 角色分配菜单后用户权限正确变化。 ### 4. 菜单管理接口 接口范围: - `GET /api/system/menus` - `POST /api/system/menus` - `PUT /api/system/menus/{id}` - `DELETE /api/system/menus/{id}` 要求: - 菜单按树结构返回。 - 菜单类型: - `CATALOG` - `MENU` - `BUTTON` - `MENU` 类型可配置路由路径、组件标识、图标、缓存。 - `BUTTON` 类型配置权限码。 - 删除菜单前校验是否存在子菜单或角色引用。 验收: - `/api/auth/me` 返回的菜单树能直接供前端生成动态菜单。 - 权限码能覆盖页面和按钮操作。 ### 5. 字典管理接口 接口范围: - `GET /api/system/dict-types` - `POST /api/system/dict-types` - `PUT /api/system/dict-types/{id}` - `DELETE /api/system/dict-types/{id}` - `GET /api/system/dict-items` - `POST /api/system/dict-items` - `PUT /api/system/dict-items/{id}` - `DELETE /api/system/dict-items/{id}` 要求: - 字典类型编码唯一。 - 字典项按类型查询。 - 字典项支持排序、状态、颜色。 - 代码枚举和业务字典边界清晰,安全规则不依赖可配置字典。 验收: - 常用字典可供前端缓存。 - 禁用字典项不影响历史数据展示。 ### 6. 日志接口 接口范围: - `GET /api/logs/operation` - `GET /api/logs/api-access` 要求: - 操作日志记录关键后台操作。 - 开放接口调用日志保留表结构和查询能力。 - 敏感字段脱敏: - 密码不记录。 - token 不记录。 - Authorization 不记录原文。 - 大请求体不记录 body。 验收: - 登录、失败登录、新增、修改、删除、分配角色等关键操作有日志。 - 日志查询支持分页和时间范围。 ### 7. 后端整体收口 - 补齐接口参数校验。 - 补齐错误码。 - 补齐权限码。 - 补齐基础接口测试。 - 检查所有接口是否统一返回 `ApiResult`。 验收: - `./gradlew.bat test` 通过。 - `./gradlew.bat compileKotlin` 通过。 - 后端接口能支撑前端完整开发。 ## 三期:基础前端 目标:搭建 SPA 单页应用基础框架,打通登录、布局、动态菜单和权限控制。 ### 1. 初始化前端工程 - 使用 Vue 3、TypeScript、Vite。 - 接入 Vue Router、Pinia、TanStack Query、Naive UI、Tailwind CSS、Axios、lucide-vue-next。 - 配置 ESLint、Prettier、Vitest。 验收: - 前端可启动。 - 基础路由可访问。 - 构建无 TypeScript 错误。 ### 2. 建立 UI 视觉规范 - 在前端工程初始化阶段同步建立全局 UI 基调。 - 风格关键词: - 极简 - 圆角 - 干净 - 高端 - 现代 - 有层次感 - 有动效 - 年轻化 - 使用 Naive UI 主题统一: - 主色 - 圆角 - 字体 - 组件尺寸 - 边框颜色 - 浅阴影 - 使用 Tailwind CSS 统一: - 页面背景 - 间距尺度 - 内容面板 - 响应式布局 - 过渡动画 - 视觉要求: - 整体留白克制,信息密度适中。 - 页面背景使用浅灰或近白色,主体内容使用白色面板。 - 卡片、按钮、输入框、弹窗保持统一圆角。 - 阴影轻、边框细,层次通过背景、边框、间距和轻阴影表达。 - 不使用厚重阴影、大面积渐变、复杂纹理和花哨装饰。 - 图标统一使用 lucide-vue-next,线性、轻量、现代。 - 交互动效保持轻快,例如 hover、active、展开收起、弹窗进入、页签切换。 - 动效只服务反馈和层次,不做干扰操作的炫技动画。 验收: - 已配置 Naive UI 全局主题。 - 已配置 Tailwind 全局基础样式。 - 基础按钮、表单、表格、弹窗、菜单、页签视觉风格一致。 - UI 第一眼呈现干净、现代、高端、年轻的后台系统气质。 ### 3. 完成请求层 - 封装 `api/http.ts`。 - 自动附加 JWT。 - 统一处理 `ApiResult`。 - 处理 401、403。 - 记录 traceId。 - 封装 TanStack Query client。 验收: - 登录接口可真实调用。 - 业务错误能统一提示。 - 401 能跳转登录页。 ### 4. 完成登录和认证状态 - 完成登录页。 - 登录页要体现整体 UI 风格: - 极简布局。 - 清爽背景。 - 圆角登录面板。 - 轻量动效。 - 高端、年轻、现代的视觉气质。 - 登录后保存 token。 - 调用 `/api/auth/me` 获取当前用户、菜单、权限码。 - Pinia 保存: - token - 当前用户 - 菜单树 - 权限码 - 布局状态 - 字典缓存 验收: - `admin` 可登录进入后台。 - 刷新页面后可恢复登录状态。 - 退出登录后清理本地状态。 ### 5. 完成基础布局 - 完成后台主布局。 - 包含: - 侧边菜单 - 顶部栏 - 面包屑 - 页签栏 - 内容区 - 整体风格保持极简、圆角、干净、高端、现代、工作台化。 - 布局层次要求: - 侧边栏、顶部栏、页签栏、内容区层次清晰。 - 内容区以浅背景承托白色内容面板。 - 面板不堆叠卡片,不做厚重装饰。 - 菜单展开收起、页签切换、内容进入要有轻量过渡。 验收: - 菜单可展开、收起。 - 当前路由高亮正确。 - 页面在常见桌面宽度下无明显错位。 - 布局整体干净、有层次感,交互动效自然不突兀。 ### 6. 完成动态路由和权限控制 - 根据 `/api/auth/me` 返回菜单生成动态路由。 - 支持 `keepAlive` 页面缓存。 - 无权限路由进入 403。 - 未匹配路由进入 404。 - 实现权限按钮组件。 验收: - 后端菜单变化后,重新登录可生效。 - 无菜单权限不能进入页面。 - 无按钮权限不显示操作按钮。 ### 7. 完成基础字典缓存 - 登录后加载常用字典,或按需加载。 - 字典缓存放入 Pinia。 - 页面可通过统一方法读取字典标签、颜色、状态。 验收: - 用户状态、组织状态、角色状态、菜单类型等字典可正常展示。 ## 四期:完整前端 目标:完成全部管理页面和体验打磨,形成可复制的页面开发模式。 ### 1. 用户管理页面 - 先做用户管理,作为标准 CRUD 样板。 - 用户管理页面同时作为 UI 样板页,沉淀列表页标准风格。 - 包含: - 查询 - 分页 - 新增 - 编辑 - 删除 - 启用禁用 - 重置密码 - 分配角色 - 使用 TanStack Query 管理列表和详情。 - UI 要求: - 查询区轻量、紧凑、干净。 - 表格信息层次清晰,行 hover 有轻量反馈。 - 主要操作按钮突出但不厚重。 - 弹窗表单圆角、留白舒适、校验反馈清晰。 - 加载、空状态、错误状态风格统一。 验收: - 用户管理从前端到后端完整可用。 - 新增、编辑、删除后缓存刷新正确。 - 错误、空状态、加载状态完整。 - 页面观感符合极简、现代、高端、年轻化要求。 ### 2. 组织管理页面 - 组织树展示。 - 新增、编辑、删除组织。 - 删除前端提示引用限制。 - 支持排序和状态展示。 验收: - 组织树展示稳定。 - 有子组织或用户引用时删除失败提示清晰。 ### 3. 角色管理页面 - 角色列表。 - 新增、编辑、删除角色。 - 启用、禁用角色。 - 菜单权限分配。 - 按钮权限展示。 验收: - 角色菜单分配后用户重新登录权限生效。 - 超级管理员角色有明确标识。 ### 4. 菜单管理页面 - 菜单树管理。 - 支持目录、菜单、按钮三种类型。 - 支持图标、路由、组件标识、权限码、排序、缓存配置。 验收: - 菜单调整后重新登录可影响左侧菜单和动态路由。 - 权限码调整后按钮显示和接口权限一致。 ### 5. 字典管理页面 - 字典类型管理。 - 字典项管理。 - 支持颜色、排序、状态。 - 字典项变更后刷新相关缓存。 验收: - 字典展示和筛选可复用。 - 禁用字典项有清晰展示。 ### 6. 日志页面 - 操作日志查询页面。 - 开放接口调用日志查询页面。 - 支持时间范围、状态、用户、路径等常用筛选。 验收: - 日志列表可分页查询。 - 敏感字段不在页面展示。 ### 7. 页签栏和页面缓存完善 - 页签支持: - 切换 - 关闭 - 关闭其他 - 关闭全部 - 刷新当前页签 - 页面缓存支持: - 按菜单 `keepAlive` 缓存。 - 权限变化后清理不可访问页签。 - 退出登录后清理全部缓存。 验收: - 多页面切换状态稳定。 - 刷新当前页签不影响其他页签。 ### 8. 整体体验打磨 - 按极简、圆角、干净、高端、现代、有层次感、有动效、年轻化的目标统一全站视觉。 - 统一空状态。 - 统一加载状态。 - 统一错误状态。 - 统一删除确认。 - 统一表单校验。 - 统一权限缺失提示。 - 统一页面进入、弹窗、抽屉、菜单展开、页签切换、按钮反馈等动效。 - 检查圆角、边框、阴影、间距、字体、图标是否一致。 - 检查页面是否存在厚重阴影、花哨渐变、拥挤表单、过度装饰等问题。 - 补齐前端基础测试。 验收: - 前端构建通过。 - 核心页面无明显布局错位。 - 常用管理流程可连续完成。 - 全站 UI 风格统一,第一眼干净现代,细节有层次,交互动效轻快。