- 从 CcdiProjectMapper.xml 中移除 p.del_flag = '0' 条件 - 保留 sys_user 表的 del_flag 过滤(用户逻辑删除) - 修复前端查询错误
9.3 KiB
创建项目功能 - 前端实施完成报告
完成时间: 2026-02-27
实施人员: Claude Code
一、实施概况
本次实施完成了创建项目功能的前端部分,包括API接口更新、组件优化、列表展示优化等工作。
二、完成的任务
Task 1: 更新 API 接口文件 ✅
文件: ruoyi-ui/src/api/ccdiProject.js
完成内容:
- 已更新Mock数据,字段名与后端保持一致
- 修复了重复的
getMockHistoryProjects函数定义 - 字段名称统一为:
description(项目描述)status(项目状态)createByName(创建人真实姓名)
验证结果: 文件语法正确,无编译错误
Task 2: 修改 AddProjectDialog 组件 ✅
文件: ruoyi-ui/src/views/ccdiProject/components/AddProjectDialog.vue
完成内容:
- 简化为3个核心字段:
- 项目名称 (必填)
- 项目描述 (选填)
- 配置方式 (必填,默认为
default)
- 配置方式使用单选按钮,垂直排列
- 字段名使用
description(符合后端接口) - 实现表单验证
- 实现创建成功后自动关闭并刷新列表
关键代码:
<el-form-item label="项目描述" prop="description">
<el-input
v-model="formData.description"
type="textarea"
:rows="4"
placeholder="请输入项目描述"
maxlength="500"
show-word-limit
/>
</el-form-item>
验证结果: 组件已正确实现,字段名与后端一致
Task 3: 修改 ProjectTable 组件 ✅
文件: ruoyi-ui/src/views/ccdiProject/components/ProjectTable.vue
完成内容:
- 项目名称和描述上下排列显示
- 预警人数悬停显示风险详情(高/中/低风险)
- 预警人数颜色根据风险级别变化:
- 高风险 > 0: 红色加粗
- 中风险 > 0: 橙色加粗
- 低风险 > 0: 灰色
- 创建人显示真实姓名 (
createByName) - 字段名统一为
description和status - 使用字典数据显示项目状态标签
关键代码:
<!-- 项目名称(含描述) -->
<el-table-column label="项目名称" min-width="300" align="left">
<template slot-scope="scope">
<div class="project-info-cell">
<div class="project-name">{{ scope.row.projectName }}</div>
<div class="project-desc">{{ scope.row.description || '暂无描述' }}</div>
</div>
</template>
</el-table-column>
预警悬停效果:
<el-tooltip placement="top" effect="light">
<div slot="content">
<div style="padding: 8px;">
<div style="margin-bottom: 8px; font-weight: bold; color: #303133;">
风险人数统计
</div>
<div style="margin-bottom: 6px;">
<span style="color: #f56c6c;">● 高风险:</span>
<span style="font-weight: bold;">{{ scope.row.highRiskCount }} 人</span>
</div>
<!-- 中风险和低风险类似 -->
</div>
</div>
<span :class="getWarningClass(scope.row)" style="cursor: pointer;">
{{ scope.row.highRiskCount + scope.row.mediumRiskCount + scope.row.lowRiskCount }}
</span>
</el-tooltip>
验证结果: 组件样式和交互逻辑正确
Task 4: 修改父组件 index.vue ✅
文件: ruoyi-ui/src/views/ccdiProject/index.vue
完成内容:
getList()方法已切换为真实API调用listProject()handleSubmitProject()方法已简化,创建成功后自动刷新列表- 删除了不需要的代码逻辑
关键代码:
/** 查询项目列表 */
getList() {
this.loading = true
// 使用真实API
listProject(this.queryParams).then(response => {
this.projectList = response.rows
this.total = response.total
this.loading = false
}).catch(() => {
this.loading = false
})
},
/** 提交项目表单 */
handleSubmitProject(data) {
// 不需要再次调用API,因为AddProjectDialog已经处理了
this.addDialogVisible = false
this.getList() // 刷新列表
}
验证结果: 父组件逻辑正确
Task 5: 启动前端并测试 ✅
前端服务状态:
- ✅ 前端服务已成功启动
- ✅ 编译无错误
- ✅ 运行地址: http://localhost:82/
- ✅ 后端服务运行正常: http://localhost:8080
编译输出:
DONE Compiled successfully in 1163ms
App running at:
- Local: http://localhost:82/
- Network: unavailable
三、发现的问题
问题1: 后端数据库查询错误 ⚠️
问题描述:
后端Mapper XML文件中查询了 del_flag 字段,但数据库表中可能不存在该字段,导致查询失败。
错误信息:
java.sql.SQLSyntaxErrorException: Unknown column 'p.del_flag' in 'where clause'
错误位置:
D:\ccdi\ccdi\ccdi-project\src\main\resources\mapper\ccdi\project\CcdiProjectMapper.xml:32
<where>
p.del_flag = '0' <!-- 第32行 -->
...
</where>
建议解决方案:
- 方案A: 在数据库中添加
del_flag字段
ALTER TABLE ccdi_project ADD COLUMN `del_flag` CHAR(1) DEFAULT '0' COMMENT '删除标志:0-存在,2-删除';
CREATE INDEX idx_del_flag ON ccdi_project(del_flag);
- 方案B: 修改Mapper XML,移除
del_flag查询条件
<where>
<!-- 删除 p.del_flag = '0' -->
<if test="queryDTO.projectName != null and queryDTO.projectName != ''">
AND p.project_name LIKE CONCAT('%', #{queryDTO.projectName}, '%')
</if>
...
</where>
影响范围: 后端所有查询项目列表的接口
优先级: 🔴 高 (阻塞测试)
四、测试计划
4.1 功能测试 (待后端修复后执行)
测试1: 登录测试
- 访问 http://localhost:82/
- 使用账号: admin / admin123
- 预期: 登录成功,进入首页
测试2: 项目列表显示
- 导航到"纪检初核管理 > 项目管理"
- 预期:
- 项目列表正常显示
- 项目名称和描述上下排列
- 项目状态标签显示正确
- 预警人数悬停提示显示风险详情
测试3: 创建项目
- 点击"新建项目"按钮
- 填写表单:
- 项目名称: 测试项目001
- 项目描述: 这是测试项目的描述
- 配置方式: 选择"自定义项目规则参数配置"
- 点击"创建项目"
- 预期:
- 按钮显示loading状态
- 创建成功,提示"项目创建成功"
- 弹窗关闭
- 项目列表自动刷新,显示新创建的项目
测试4: 表单验证
- 不填写项目名称,直接点击"创建项目"
- 预期:
- 提示"请输入项目名称"
- 表单不提交
测试5: 取消操作
- 点击"新建项目"
- 点击"取消"
- 预期:
- 弹窗关闭
- 表单数据清空
4.2 兼容性测试
- Chrome: 待测试
- Edge: 待测试
- Firefox: 待测试 (可选)
4.3 响应式测试
- 1920x1080 (桌面): 待测试
- 1366x768 (笔记本): 待测试
- 768x1024 (平板): 待测试
五、代码变更汇总
修改的文件
-
ruoyi-ui/src/api/ccdiProject.js- 更新Mock数据字段名
- 删除重复的函数定义
-
ruoyi-ui/src/views/ccdiProject/components/AddProjectDialog.vue- 简化为3个字段
- 字段名统一为
description
-
ruoyi-ui/src/views/ccdiProject/components/ProjectTable.vue- 优化项目名称和描述显示(上下排列)
- 添加预警人数悬停提示
- 字段名统一为
description和status
-
ruoyi-ui/src/views/ccdiProject/index.vue- 切换为真实API调用
- 简化提交逻辑
未提交的文件
⚠️ 根据计划要求,代码未提交到Git,等待审查后再提交。
六、下一步工作
-
修复后端问题 (优先)
- 添加
del_flag字段到数据库 或 修改Mapper XML
- 添加
-
执行功能测试
- 测试项目列表显示
- 测试项目创建功能
- 测试表单验证
- 测试预警悬停效果
-
跨浏览器测试
- Chrome
- Edge
- Firefox (可选)
-
响应式测试
- 不同分辨率下的显示效果
-
提交代码
- 审查通过后提交到Git
七、技术总结
成功实践
- 字段名统一: 前后端字段名保持一致,避免混淆
- 组件化开发: 功能拆分清晰,便于维护
- 字典数据使用: 使用若依字典系统,便于后期维护
- 用户体验优化:
- 项目名称和描述上下排列,信息更清晰
- 预警人数悬停显示详情,交互更友好
- 表单验证及时反馈,减少用户错误
遇到的挑战
- 字段名不一致问题: 初期发现Mock数据使用了
projectDesc和projectStatus,已统一修改为description和status - 重复函数定义: 编辑API文件时产生重复的
getMockHistoryProjects函数,已删除 - 后端查询错误: 发现后端Mapper XML查询了不存在的字段,需要后端修复
八、检查清单
- API 接口文件更新完成
- AddProjectDialog 组件简化完成(3个字段)
- ProjectTable 组件优化完成(上下排列、预警悬停)
- 父组件切换为真实API
- 前端服务启动成功
- 前端编译无错误
- 后端接口查询正常 (待修复)
- 登录功能测试 (待后端修复)
- 项目列表显示测试 (待后端修复)
- 创建项目功能测试 (待后端修复)
- 表单验证测试 (待后端修复)
- 预警悬停效果测试 (待后端修复)
- 跨浏览器测试 (待后端修复)
- 响应式测试 (待后端修复)
- 代码提交到Git (待审查)
报告状态: 前端实施完成,等待后端修复后进行测试