# cfc-web 管理后台重构:基于 ProductDimensionConfig + KnowledgeBase 的动态渲染 **日期:** 2026-06-20 **状态:** 草稿 **影响范围:** cfc-web (Vue 2 Admin Panel) + cfc-backend (部分 API 增强) **任务数:** 13 个 (Task 1-13, Task 4 推迟) **总工时预估:** 5-10 天 ## 1. 概述 ### 1.1 问题 cfc-web 管理后台中大量硬编码了产品维度结构(五维、三维、行动维度等),导致: - 新增/修改维度需要改多处前端代码 - KnowledgeBase CRUD 与维度配置的关联不清晰 - 后端 `ProductDimensionConfig` 和 `DanKnowledgeBase` 表已有数据,但前端未充分使用 ### 1.2 目标 将管理后台重构为基于 `ProductDimensionConfig` + `KnowledgeBase` 动态渲染的模式: ``` ProductDimensionConfig (维度定义) ↓ 动态加载 KnowledgeBase (知识点内容) ──→ 统一管理 CRUD ↓ 渲染组件 (动态表单/表格/树) ``` ### 1.3 成功标准 - [ ] 新增维度只需在 `ProductDimensionConfig` 表插入一行 + 对应 KnowledgeBase 数据 - [ ] 无需修改前端代码即可展示新维度 - [ ] 所有 KnowledgeBase CRUD 路径一致 - [ ] 现有功能完全保留,UI 无退化 ## 2. 先行发现 已有后端实体和 API: | 资源 | 位置 | 状态 | |------|------|------| | `ProductDimensionConfig` entity | `cfc-backend/.../entity/ProductDimensionConfig.java` | ✅ 存在 | | `DanKnowledgeBase` entity | `cfc-backend/.../entity/DanKnowledgeBase.java` | ✅ 存在 | | `DanKnowledgeBaseController` | `cfc-backend/.../controller/admin/DanKnowledgeBaseController.java` | ✅ 存在 | | `AdminController` (含维度相关接口) | `cfc-backend/.../controller/admin/AdminController.java` | ✅ 存在 | | KnowledgeBase 管理页面 | `cfc-web/src/views/admin/knowledge/` | ✅ 存在 | | 维度相关配置 | `cfc-web/src/views/admin/dimension/` | 硬编码严重 | ## 3. 实施计划 ### 任务依赖关系 ``` Task 1 ─→ Task 3 ─→ Task 5 ─→ Task 7 ─→ Task 10 Task 2 ─→ Task 6 ─→ Task 8 ─→ Task 9 ─→ Task 10 ↓ Task 11 (独立) ←──────────────────── Task 10 Task 12 (依赖 Task 5) Task 13 (依赖 Task 5) ``` ### 3.1 阶段 1:后端 API 统一 (1-3 天) **Task 1: 梳理 ProductDimensionConfig API 端点和数据结构** *依赖: 无* 涉及文件: - `cfc-backend/.../controller/admin/AdminController.java` — 检查现有维度接口 - `cfc-backend/.../entity/ProductDimensionConfig.java` — 确认字段 - `cfc-backend/.../service/ProductDimensionConfigService.java` — 确认业务逻辑 具体操作: 1. 检查 `AdminController` 中已有接口:`listProductDimensionConfigs`, `getProductDimensionConfig`, `saveProductDimensionConfig`, `deleteProductDimensionConfig` 2. 确保 API 路径统一为 `/api/admin/dimension-config/**` 3. 验证返回 JSON 结构包含:`id`, `dimensionCode`, `dimensionName`, `dimensionType`, `parentId`, `sort`, `enabled`, `remark` 4. 验证完成后,写下确认的 API 接口清单 **Task 2: 统一 KnowledgeBase API** *依赖: 无* 涉及文件: - `cfc-backend/.../controller/admin/DanKnowledgeBaseController.java` — 检查/补充接口 - `cfc-backend/.../entity/DanKnowledgeBase.java` — 确认字段 具体操作: 1. 检查 `DanKnowledgeBaseController` 现有接口是否覆盖分页查询 + 按 `dimensionCode` 筛选 2. 确认所有接口统一前缀 `/api/admin/knowledge-base/` 3. 若缺少接口则补充: - `POST /api/admin/knowledge-base/list` → 分页 + 按 `dimensionCode` 筛选 - `POST /api/admin/knowledge-base/create` → 新建 - `POST /api/admin/knowledge-base/update` → 更新 - `POST /api/admin/knowledge-base/delete` → 删除 (逻辑删除) - `POST /api/admin/knowledge-base/get` → 详情 **Task 3: 添加维度树接口** *依赖: Task 1 完成* - `POST /api/admin/dimension-config/tree` → 返回层级树结构 - 用于前端树形选择器 - 如果后台已有类似接口则跳过 ### 3.2 阶段 2: 前端核心组件 (2-3 天) **Task 5: 创建 Vuex Store 模块** `cfc-web/src/store/modules/dimension.js`: ```javascript import { getDimensionConfigs, getKnowledgeBaseList } from '@/api/dimension' export default { namespaced: true, state: { dimensions: [], // ProductDimensionConfig 列表 dimensionTree: [], // 维度树 knowledgeList: [], // KnowledgeBase 列表 knowledgeTotal: 0, loading: false }, mutations: { SET_DIMENSIONS(state, list) { state.dimensions = list }, SET_DIMENSION_TREE(state, tree) { state.dimensionTree = tree }, SET_KNOWLEDGE_LIST(state, { list, total }) { state.knowledgeList = list state.knowledgeTotal = total } }, actions: { async fetchDimensions({ commit }) { const res = await getDimensionConfigs() commit('SET_DIMENSIONS', res.data || []) }, async fetchKnowledge({ commit }, params) { const res = await getKnowledgeBaseList(params) commit('SET_KNOWLEDGE_LIST', { list: res.data?.records || [], total: res.data?.total || 0 }) } } } ``` **Task 6: 通用 API 封装** `cfc-web/src/api/dimension.js`: ```javascript import request from '@/utils/request' export function getDimensionConfigs(data) { return request({ url: '/api/admin/dimension-config/list', method: 'post', data }) } export function getDimensionTree() { return request({ url: '/api/admin/dimension-config/tree', method: 'post' }) } export function saveDimensionConfig(data) { return request({ url: '/api/admin/dimension-config/save', method: 'post', data }) } export function deleteDimensionConfig(id) { return request({ url: '/api/admin/dimension-config/delete', method: 'post', data: { id } }) } export function getKnowledgeBaseList(data) { return request({ url: '/api/admin/knowledge-base/list', method: 'post', data }) } export function saveKnowledgeBase(data) { return request({ url: '/api/admin/knowledge-base/save', method: 'post', data }) } export function deleteKnowledgeBase(id) { return request({ url: '/api/admin/knowledge-base/delete', method: 'post', data: { id } }) } ``` **Task 7: 动态维度选择器组件** `cfc-web/src/components/DimensionSelector/index.vue`: ```vue ``` **Task 8: KnowledgeBase 动态表格组件** `cfc-web/src/components/KnowledgeTable/index.vue` — 通用表格展示,根据传入的 `dimensionCode` 动态加载对应数据: ```vue ``` **Task 9: 通用 KnowledgeBase 编辑对话框** `cfc-web/src/components/KnowledgeDialog/index.vue` — 新增/编辑共用的对话框: ```vue ``` ### 3.3 阶段 3: 现有视图迁移 (2-4 天) **Task 10: 重构 KnowledgeBase 管理页面** *依赖: Task 2, 5, 6, 7, 8, 9* 涉及文件: - `cfc-web/src/views/admin/knowledge/index.vue` — 主页面 - `cfc-web/src/views/admin/knowledge/*.vue` — 相关子页面 具体操作: 1. 使用 `DimensionSelector` 组件替换硬编码的维度下拉框 2. 使用 `KnowledgeTable` 组件替换现有表格 3. 使用 `KnowledgeDialog` 组件替换新增/编辑弹窗 4. 清理不再需要的本地状态和方法 5. 移除硬编码的维度字段 **Task 11: 重构维度配置管理页面** *依赖: Task 1, 3* 涉及文件: - `cfc-web/src/views/admin/dimension/index.vue` — 维度配置页面 具体操作: 1. 从 `ProductDimensionConfig` API 动态加载维度列表 2. 树形展示维度层级(使用 `el-tree` + dimension tree API) 3. 支持拖拽排序(`el-tree` draggable + API 保存排序) 4. CRUD 操作直接对接后端 API **Task 12: 替换硬编码维度引用** *依赖: Task 5 完成* 通过以下 grep 模式搜索所有硬编码引用: ```bash # 搜索硬编码的五维名称 grep -rn "五维·\|五維·" cfc-web/src/ grep -rn "五维\.\|五維\." cfc-web/src/ # 搜索硬编码的三维名称 grep -rn "三维·\|三維·" cfc-web/src/ # 搜索硬编码的行动维度 grep -rn "行动维度\|行動維度" cfc-web/src/ # 搜索其他可能的硬编码维度名 grep -rn "'五维'\|\"五维\"\|'三维'\|\"三维\"\|'行动'\|\"行动\"" cfc-web/src/ ``` 涉及文件(预计): - `cfc-web/src/views/admin/dimension/index.vue` — 维度管理 - `cfc-web/src/views/admin/knowledge/*.vue` — 知识点管理 - `cfc-web/src/views/admin/task/*.vue` — 任务管理 - `cfc-web/src/views/admin/energy/*.vue` — 能量管理 - `cfc-web/src/views/admin/assessment/*.vue` — 测评管理 具体操作: 1. 对每个匹配文件,将硬编码字符串替换为 `dimensions[dimensionCode].dimensionName` 的动态读取 2. 使用 `dimensionCode` 作为唯一标识,`dimensionName` 作为展示名 3. 确保替换后显示内容与原样一致 **Task 13: 添加缓存机制** *依赖: Task 5 完成* 具体操作: 1. Dimension config 数据缓存到 `localStorage`,key: `cfc_dimensions_${version}` 2. 后端返回 `version` 字段,前端对比版本号决定是否刷新 3. 管理后台发布新维度后更新版本号 4. 缓存有效期 24 小时,过期自动刷新 ## 4. 阶段 4 (可选): 批量导入支持 **⚠️ 推迟至下一迭代 — 当前不实施** ~~Task 4: 添加批量接口 `POST /api/admin/knowledge-base/batch-save`~~ - 当前阶段不需要批量导入功能 - 基础 CRUD 已满足日常运营需求 ## 5. 测试策略 ### 5.1 后端测试 (每个 API Task 后执行) | 测试类型 | 内容 | 命令 | |---------|------|------| | 编译验证 | API 编译通过 | `mvn clean compile -pl cfc-backend` | | 单元测试 | Controller + Service 层 | `mvn test -pl cfc-backend -Dtest=*ControllerTest,*ServiceTest` | | API 测试 | 手动 curl 验证 CRUD | `curl -X POST http://localhost:8080/api/admin/...` | ### 5.2 前端测试 (每个组件 Task 后执行) | 测试类型 | 内容 | 命令 | |---------|------|------| | 编译验证 | 无语法错误 | `cd cfc-web && npm run build -- --no-progress` | | Lint | 代码风格 | `cd cfc-web && npm run lint` | | 手动测试 | 浏览器打开确认 UI 正常 | 打开 localhost:8082 对应页面 | ### 5.3 回归测试 (全部 Task 完成后) 1. 遍历所有管理后台页面,确认无 404/白屏 2. 验证 CRUD 操作正常 3. grep 确认无残留硬编码(使用 Task 12 中列出的 grep 模式) 4. 检查浏览器 Console 无报错 ## 6. 验收清单 | # | 检查项 | 验证方式 | |---|--------|----------| | 1 | 维度配置 CRUD 正常 | 手动测试增删改查 | | 2 | KnowledgeBase CRUD 正常 | 手动测试增删改查 | | 3 | 维度树展示正确 | 检查层级关系 | | 4 | 新增维度后前端自动展示 | 配置 → 刷新页面 → 出现 | | 5 | 无硬编码维度名称 | grep 检查 `五维`、`三维` 等字符串 | | 6 | 所有页面正常渲染 | 遍历所有 admin 页面,Console 无报错 | | 7 | 旧功能无退化 | 回归测试各管理页面 | ## 7. 分支策略 ``` feature/refactor-dimension-dynamic ├── task/01-backend-api-review # Task 1 ├── task/02-knowledge-api # Task 2 ├── task/03-dimension-tree-api # Task 3 ├── task/05-vuex-store # Task 5 ├── task/06-api-package # Task 6 ├── task/07-dimension-selector # Task 7 ├── task/08-knowledge-table # Task 8 ├── task/09-knowledge-dialog # Task 9 ├── task/10-migrate-knowledge # Task 10 ├── task/11-migrate-dimension # Task 11 ├── task/12-replace-hardcode # Task 12 (可拆分子分支) └── task/13-cache # Task 13 ``` - 每个 Task 在 feature/refactor-dimension-dynamic 上开独立分支 - 合并前需 Code Review - 合并后验证 CI 通过 ## 8. 回滚方案 - 每个 Task 独立分支,合并前 Code Review - 若某 Task 导致问题,revert 该分支后重新合并 - 后端 API 变更需确保向前兼容(旧接口保留至下个版本) - 若阶段 3 迁移导致页面故障,可回退到旧版组件(新旧组件共存)