This commit is contained in:
zpc 2026-03-04 11:04:07 +08:00
parent 80f1d42f84
commit 13d10f4f9b
3 changed files with 2554 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,411 @@
# 实施计划ODF v1.0.2 功能更新
## 概述
按照「数据库 → 后台 API → 前端 APP → 后台管理前端」的顺序实施,确保每一层的依赖在实现前已就绪。后台基于 ZRAdmin.NET/C#/SqlSugar前端 APP 基于 odf-uniappUniApp + Vue 3后台管理前端基于 ZR.VueVue 3 + Element Plus
## 任务
- [ ] 1. 数据库:创建新表和索引
- [ ] 1.1 创建 odf_checkin 签到记录表(含索引 IX_odf_checkin_RoomId、IX_odf_checkin_CheckinTime
- 编写 SQL Server DDL 脚本,创建表和索引
- _需求: 2.6_
- [ ] 1.2 创建 odf_cables 光缆表(含索引 IX_odf_cables_DeptId、IX_odf_cables_CableName
- 编写 SQL Server DDL 脚本,创建表和索引
- _需求: 4.1_
- [ ] 1.3 创建 odf_cable_faults 干线故障表(含索引 IX_odf_cable_faults_CableId、IX_odf_cable_faults_FaultTime
- 编写 SQL Server DDL 脚本,创建表和索引
- _需求: 5.1, 7.9_
- [ ] 1.4 创建 odf_cable_fault_images 故障图片表(含索引 IX_odf_cable_fault_images_FaultId
- 编写 SQL Server DDL 脚本,创建表和索引
- _需求: 7.9_
- [ ] 1.5 创建 odf_user_modules 用户功能版块权限表(含唯一索引和普通索引)
- 编写 SQL Server DDL 脚本,创建表和索引
- _需求: 8.1_
- [ ] 1.6 插入后台管理菜单和权限 SQL 脚本
- 编写 INSERT INTO sys_menu SQL 脚本添加以下一级菜单parentId=0和按钮权限
- 一级菜单「光缆管理」MenuId=11190OrderNum=5及按钮权限odfcables:query / odfcables:add / odfcables:edit / odfcables:delete / odfcables:export
- 一级菜单「干线故障管理」MenuId=11200OrderNum=6及按钮权限odfcablefaults:query / odfcablefaults:delete / odfcablefaults:export
- 一级菜单「签到记录管理」MenuId=11210OrderNum=7及按钮权限odfcheckin:query / odfcheckin:export
- 一级菜单「用户模块权限」MenuId=11220OrderNum=8及按钮权限odfusermodules:query / odfusermodules:edit
- 所有菜单 Component 指向 business/OdfXxxZRAdmin 动态路由自动加载对应 Vue 文件
- 编写 INSERT INTO sys_role_menu SQL 脚本,按现有角色权限模式分配:
- Role 2 (common):所有新菜单 + 全部按钮权限
- Role 3 (editor):所有新菜单 + 仅查询权限
- Role 4 (lock):所有新菜单 + 仅查询权限
- Role 1 (admin):超级管理员自动拥有所有权限,无需插入
- _需求: 8.1_
- [ ] 2. 检查点 — 数据库脚本完成
- 确认所有 5 张表和索引创建成功,菜单权限 SQL 脚本执行无误,如有问题请告知。
- [ ] 3. 后台 API实体模型层
- [ ] 3.1 创建 OdfCheckin 实体类ZR.Model/Business/OdfCheckin.cs
- 使用 [SugarTable("odf_checkin")] 注解,定义 Id、RoomId、Personnel、CheckinTime、WorkContent、UserId、CreatedAt 属性
- _需求: 2.6_
- [ ] 3.2 创建 OdfCables 实体类ZR.Model/Business/OdfCables.cs
- 使用 [SugarTable("odf_cables")] 注解,定义 Id、CableName、DeptId、DeptName、CreatedAt、UpdatedAt 属性
- _需求: 4.1_
- [ ] 3.3 创建 OdfCableFaults 实体类ZR.Model/Business/OdfCableFaults.cs
- 使用 [SugarTable("odf_cable_faults")] 注解,定义所有字段属性
- _需求: 5.1, 7.9_
- [ ] 3.4 创建 OdfCableFaultImages 实体类ZR.Model/Business/OdfCableFaultImages.cs
- 使用 [SugarTable("odf_cable_fault_images")] 注解
- _需求: 7.9_
- [ ] 3.5 创建 OdfUserModules 实体类ZR.Model/Business/OdfUserModules.cs
- 使用 [SugarTable("odf_user_modules")] 注解
- _需求: 8.1_
- [ ] 3.6 创建各实体的 Dto 和 QueryDto 类
- OdfCheckinDto、OdfCheckinQueryDto继承 PagerInfo
- OdfCablesQueryDto继承 PagerInfo
- OdfCableFaultsQueryDto继承 PagerInfo含 beginFaultTime/endFaultTime
- OdfCableFaultAddDto含 IFormFile[] images
- OdfUserModulesSaveDto含 userId、modules 列表)
- _需求: 2.6, 4.1, 5.1, 7.9, 8.1_
- [ ] 4. 后台 APIService 层
- [ ] 4.1 实现 IOdfUserModulesService / OdfUserModulesService
- GetUserModules(userId):按 UserId 查询 odf_user_modules返回 ModuleCode 列表
- GetUserList():查询 sys_user 返回用户列表userId, userName
- SaveUserModules(userId, modules):先删后插,事务保证原子性
- _需求: 8.1, 8.2_
- [ ]* 4.1.1 编写属性测试 Property 15用户模块权限 round-trip
- **Property 15: 用户模块权限 round-trip**
- 使用 FsCheck 生成随机 UserId 和模块子集,验证插入后查询结果一致
- **验证: 需求 8.1, 8.2**
- [ ] 4.2 实现 IOdfCheckinService / OdfCheckinService
- AddCheckin(dto):校验 RoomId 存在,插入 odf_checkin 记录
- GetList(queryDto):分页查询,联查 odf_rooms 获取机房名称,联查 sys_user 获取提交人用户名
- Export(queryDto):导出签到记录
- _需求: 2.6_
- [ ]* 4.2.1 编写属性测试 Property 11签到数据持久化 round-trip
- **Property 11: 签到数据持久化 round-trip**
- 使用 FsCheck 生成随机签到数据,验证插入后查询字段一致
- **验证: 需求 2.6**
- [ ] 4.3 实现 IOdfCablesService / OdfCablesService
- GetList(queryDto):按 DeptId 过滤光缆列表(支持分页和 CableName 模糊查询)
- Search(deptId, keyword):在指定公司范围内搜索光缆和故障
- Add/Update/Delete/GetDetail/Export光缆 CRUD 和导出
- _需求: 4.1, 4.4_
- [ ]* 4.3.1 编写属性测试 Property 12光缆列表 DeptId 过滤不变量
- **Property 12: 光缆列表 DeptId 过滤不变量**
- 使用 FsCheck 生成随机 DeptId 和光缆集合,验证过滤结果正确
- **验证: 需求 4.1**
- [ ]* 4.3.2 编写属性测试 Property 13搜索结果 DeptId 范围限定
- **Property 13: 搜索结果 DeptId 范围限定**
- 使用 FsCheck 生成随机数据集,验证搜索结果均属于指定 DeptId
- **验证: 需求 4.4**
- [ ] 4.4 实现 IOdfCableFaultsService / OdfCableFaultsService
- GetList(queryDto):按 CableId 分页查询故障列表,联查光缆名称,按 FaultTime DESC 排序
- GetDetail(id):查询故障详情,联查光缆名称和图片列表
- AddFault(dto):校验 CableId 存在和图片数量,插入故障记录,保存图片文件,插入图片记录
- Delete(id):删除故障记录并级联删除关联图片
- Export(queryDto):导出故障列表
- _需求: 5.1, 6.1, 7.9_
- [ ]* 4.4.1 编写属性测试 Property 14故障新增 round-trip含图片
- **Property 14: 故障新增 round-trip含图片**
- 使用 FsCheck 生成随机故障数据和图片数量,验证插入后查询一致
- **验证: 需求 7.9**
- [ ] 4.5 实现 IOdfCableFaultImagesService / OdfCableFaultImagesService
- GetByFaultId(faultId):按故障 ID 查询图片列表
- BatchInsert(faultId, imageUrls):批量插入图片记录
- DeleteByFaultId(faultId):按故障 ID 删除所有图片记录
- _需求: 7.9_
- [ ] 5. 后台 APIController 层
- [ ] 5.1 创建 OdfUserModulesController路由 business/OdfUserModules
- GET list — 获取当前登录用户的功能版块列表APP 端调用,无权限限制,登录即可)
- GET users — 获取用户列表(管理端调用,[ActionPermissionFilter(Permission = "odfusermodules:query")]
- GET list?userId=xxx — 获取指定用户的模块权限(管理端调用,[ActionPermissionFilter(Permission = "odfusermodules:query")]
- POST save — 批量保存用户模块权限(管理端调用,[ActionPermissionFilter(Permission = "odfusermodules:edit")]
- _需求: 8.1, 8.2_
- [ ] 5.2 创建 OdfCheckinController路由 business/OdfCheckin
- POST submit — 提交签到记录APP 端调用,[ActionPermissionFilter(Permission = "odfcheckin:list")]
- GET list — 分页查询签到记录(管理端调用,[ActionPermissionFilter(Permission = "odfcheckin:list")],联查机房名称和提交人)
- GET export — 导出签到记录(管理端调用,[ActionPermissionFilter(Permission = "odfcheckin:export")]
- _需求: 2.6_
- [ ] 5.3 创建 OdfCablesController路由 business/OdfCables
- GET list — 光缆列表([ActionPermissionFilter(Permission = "odfcables:list")]
- GET search — 搜索光缆和故障([ActionPermissionFilter(Permission = "odfcables:query")]
- POST — 新增光缆([ActionPermissionFilter(Permission = "odfcables:add")]
- PUT — 修改光缆([ActionPermissionFilter(Permission = "odfcables:edit")]
- GET {id} — 光缆详情([ActionPermissionFilter(Permission = "odfcables:query")]
- POST delete/{id} — 删除光缆([ActionPermissionFilter(Permission = "odfcables:delete")]
- GET export — 导出光缆([ActionPermissionFilter(Permission = "odfcables:export")]
- _需求: 4.1, 4.4_
- [ ] 5.4 创建 OdfCableFaultsController路由 business/OdfCableFaults
- GET list — 故障列表分页查询([ActionPermissionFilter(Permission = "odfcablefaults:list")]
- GET {id} — 故障详情含图片([ActionPermissionFilter(Permission = "odfcablefaults:query")]
- POST add — 新增故障含图片上传APP 端调用,[ActionPermissionFilter(Permission = "odfcablefaults:list")]
- POST delete/{id} — 删除故障并级联删除图片([ActionPermissionFilter(Permission = "odfcablefaults:delete")]
- GET export — 导出故障列表([ActionPermissionFilter(Permission = "odfcablefaults:export")]
- _需求: 5.1, 6.1, 7.9_
- [ ] 6. 后台 API依赖注入注册
- 在 Startup / Program.cs 中注册所有新增 Service 的依赖注入
- IOdfCheckinService → OdfCheckinService
- IOdfCablesService → OdfCablesService
- IOdfCableFaultsService → OdfCableFaultsService
- IOdfCableFaultImagesService → OdfCableFaultImagesService
- IOdfUserModulesService → OdfUserModulesService
- _需求: 2.6, 4.1, 5.1, 7.9, 8.1_
- [ ] 7. 检查点 — 后台 API 完成
- 确认所有 API 编译通过,依赖注入正确,如有问题请告知。
- [ ] 8. 前端 APP基础设施和服务层
- [ ] 8.1 创建 services/permission.js — 权限 API
- getUserModules()GET /business/OdfUserModules/list返回模块代码列表
- _需求: 8.2_
- [ ] 8.2 创建 services/checkin.js — 签到 API
- submitCheckin(data)POST /business/OdfCheckin/submit
- _需求: 2.6_
- [ ] 8.3 创建 services/trunk.js — 干线版块 API
- getCableList(deptId)GET /business/OdfCables/list
- getFaultList(cableId, pageNum, pageSize)GET /business/OdfCableFaults/list
- getFaultDetail(id)GET /business/OdfCableFaults/{id}
- addFault(formData)POST /business/OdfCableFaults/addmultipart/form-data
- searchCablesAndFaults(deptId, keyword)GET /business/OdfCables/search
- _需求: 4.1, 5.1, 6.1, 7.9, 4.4_
- [ ] 8.4 扩展 store/index.js — 新增 modules 字段
- 添加 modules: [] 字段
- 添加 setModules(modules) 方法
- 在 clearAuth() 中清除 modules
- _需求: 8.2, 8.3_
- [ ] 8.5 创建 utils/navigation.js — 导航工具函数
- openNavigation(lat, lng, name):安卓端弹出导航 APP 选择列表H5 端打开地图网页
- _需求: 6.4, 6.5, 10.4_
- [ ]* 8.5.1 编写属性测试 Property 6导航 URL 构建正确性
- **Property 6: 导航 URL 构建正确性**
- 使用 fast-check 生成随机经纬度和地点名,验证 URL 包含正确参数
- **验证: 需求 6.5, 10.4**
- [ ] 8.6 创建 utils/watermark.js — 水印处理工具函数
- addWatermark(imagePath, text)Canvas 叠加水印文字到照片左下角
- _需求: 7.8_
- [ ]* 8.6.1 编写属性测试 Property 7水印叠加参数正确性
- **Property 7: 水印叠加参数正确性**
- 使用 fast-check 生成随机时间和人员字符串,验证水印文本包含两者
- **验证: 需求 7.8**
- [ ] 9. 前端 APP登录页改造和功能入口页
- [ ] 9.1 修改 pages/login/index.vue — 登录成功后跳转至 pages/portal/index
- 将 uni.reLaunch 目标从 home 改为 portal
- 登录成功后调用 getUserModules() 获取权限并存入 store.modules
- _需求: 1.1, 8.2_
- [ ] 9.2 新建 pages/portal/index.vue — 功能入口列表页
- 自定义导航栏(刷新 + 标题"功能列表" + 设置图标)
- CSS Grid 2 列布局展示功能版块卡片(机房、干线)
- 根据 store.modules 过滤显示的入口卡片
- 点击机房 → navigateTo home点击干线 → navigateTo trunk
- 空权限时显示空状态提示
- _需求: 1.1, 1.2, 1.3, 1.4, 1.5, 8.3, 8.4_
- [ ]* 9.2.1 编写属性测试 Property 1权限过滤正确性
- **Property 1: 权限过滤正确性**
- 使用 fast-check 生成随机权限子集,验证过滤函数只返回有权限的版块
- **验证: 需求 1.1, 1.5, 8.3**
- [ ] 9.3 更新 pages.json — 注册所有新增页面
- 添加 portal、checkin、trunk、cable、fault-list、fault-detail、fault-add、trunk-search、route-plan 页面配置
- 所有页面 navigationStyle 设为 custom
- _需求: 1.1_
- [ ] 10. 前端 APP签到功能
- [ ] 10.1 改造 pages/rack/index.vue — 导航栏右侧添加签到按钮
- 将 nav-icon-placeholder 替换为蓝色【签到】按钮
- 点击签到按钮 → navigateTo checkin 页面,传递 roomId 参数
- _需求: 2.1, 2.2_
- [ ] 10.2 新建 pages/checkin/index.vue — 签到页
- 自定义导航栏 + 表单区域(人员输入、时间 picker、工作内容 textarea
- 底部固定提交按钮
- 点击时间字段弹出 picker mode="date" 年月日选择器
- 提交校验必填项 → 调用 submitCheckin API → 成功 showToast + navigateBack
- 失败保留表单数据
- _需求: 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9_
- [ ]* 10.2.1 编写属性测试 Property 2签到数据完整性前端
- **Property 2: 签到数据完整性(前端)**
- 使用 fast-check 生成随机签到数据,验证请求体包含所有必要字段
- **验证: 需求 2.6**
- [ ] 11. 前端 APP干线版块 — 公司列表和光缆列表
- [ ] 11.1 新建 pages/trunk/index.vue — 干线页(公司列表)
- 自定义导航栏 + section-title "公司列表"
- 复用 getCompanyList() 接口获取公司数据
- 公司卡片列表(白色背景 + 图片占位 + 公司名称居中)
- 点击公司卡片 → navigateTo cable 页面,传递 deptId
- _需求: 3.1, 3.2, 3.3_
- [ ] 11.2 新建 pages/cable/index.vue — 光缆列表页
- 自定义导航栏 + section-title "光缆列表" + 搜索栏
- 调用 getCableList(deptId) 获取光缆数据
- 光缆卡片列表(同公司卡片样式)
- 搜索栏输入关键词按确认 → navigateTo trunk-search 页面,传递 deptId 和 keyword
- 点击光缆卡片 → navigateTo fault-list 页面,传递 cableId 和 cableName
- _需求: 4.1, 4.2, 4.3, 4.4, 4.5_
- [ ]* 11.2.1 编写属性测试 Property 4搜索范围限定前端
- **Property 4: 搜索范围限定(前端)**
- 使用 fast-check 生成随机 deptId 和关键词,验证搜索请求携带正确 deptId
- **验证: 需求 4.4**
- [ ]* 11.2.2 编写属性测试 Property 10页面导航参数传递正确性
- **Property 10: 页面导航参数传递正确性**
- 使用 fast-check 生成随机列表项数据,验证导航 URL 包含正确参数
- **验证: 需求 3.3, 4.2, 5.2, 9.4, 9.5**
- [ ] 12. 前端 APP干线版块 — 故障管理
- [ ] 12.1 新建 pages/fault-list/index.vue — 故障列表页
- 自定义导航栏 + section-title "故障列表"
- 调用 getFaultList(cableId) 获取故障数据支持分页加载onReachBottom
- 故障卡片列表(显示故障时间、故障原因、表显故障里程、所属光缆)
- 底部固定【新增故障】按钮
- 点击故障卡片 → navigateTo fault-detail传递 faultId
- 点击新增故障 → navigateTo fault-add传递 cableId 和 cableName
- _需求: 5.1, 5.2, 5.3, 5.4_
- [ ]* 12.1.1 编写属性测试 Property 3故障记录渲染完整性
- **Property 3: 故障记录渲染完整性**
- 使用 fast-check 生成随机故障数据,验证渲染输出包含所有必要字段
- **验证: 需求 5.1, 6.1**
- [ ] 12.2 新建 pages/fault-detail/index.vue — 故障详情页
- 自定义导航栏 + 图片区域(横向滚动,点击预览)+ 信息展示区域
- 调用 getFaultDetail(faultId) 获取完整数据
- 展示所有字段:图片列表、故障时间、人员、故障原因、表显故障里程、所属光缆、地点、备注
- 底部【导航至地点】按钮(经纬度为空/0 时 v-if 隐藏)
- 点击图片 → uni.previewImage 全屏预览
- 点击导航 → 调用 openNavigation(lat, lng, name)
- _需求: 6.1, 6.2, 6.3, 6.4, 6.5, 6.6_
- [ ] 12.3 新建 pages/fault-add/index.vue — 新增故障页
- 自定义导航栏 + 拍照区域(横向滚动,仅相机拍摄)+ 表单区域
- 拍摄第 1 张照片时自动获取时间填充故障时间字段
- 自动填充所属光缆名称(从参数传入,不可编辑)
- 【点击获取当前经纬度】按钮 → uni.getLocation 获取位置
- 手动输入字段:人员、故障原因、表显故障里程、备注
- 提交流程:校验(至少 1 张照片)→ 水印处理 → 上传照片 → 提交表单
- 成功 showToast + navigateBack失败保留数据
- _需求: 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 7.10, 7.11, 7.12_
- [ ]* 12.3.1 编写属性测试 Property 8故障提交数据完整性前端
- **Property 8: 故障提交数据完整性(前端)**
- 使用 fast-check 生成随机故障表单数据,验证请求体包含所有必要字段
- **验证: 需求 7.9**
- [ ] 13. 前端 APP搜索结果页
- [ ] 13.1 新建 pages/trunk-search/index.vue — 搜索结果页
- 自定义导航栏 + 搜索结果区域
- 页面 onLoad 从参数获取 deptId 和 keyword调用 searchCablesAndFaults 接口
- 按「光缆」和「故障列表」两个分类展示结果
- 光缆分类:复用光缆卡片样式,点击 → navigateTo fault-list
- 故障分类:复用故障卡片样式,点击 → navigateTo fault-detail
- 无结果时显示"暂无搜索结果"
- _需求: 9.1, 9.2, 9.3, 9.4, 9.5_
- [ ]* 13.1.1 编写属性测试 Property 5搜索结果分类正确性
- **Property 5: 搜索结果分类正确性**
- 使用 fast-check 生成随机搜索结果数据,验证分类展示逻辑正确
- **验证: 需求 9.2, 9.3**
- [ ] 14. 前端 APP路线规划尝试性
- [ ] 14.1 新建 pages/route-plan/index.vue — 路线规划页
- 集成地图 SDK如高德地图 UniApp 插件)
- 输入起终点坐标,调用路线规划 API展示路线总长度
- 输入距离值,计算路线上对应坐标并标注
- 地图 API 调用失败时提示用户
- _需求: 11.1, 11.2, 11.3, 11.4, 11.5_
- [ ]* 14.1.1 编写属性测试 Property 9路线距离定位计算
- **Property 9: 路线距离定位计算**
- 使用 fast-check 生成随机路线点序列和距离值,验证定位计算正确
- **验证: 需求 11.3**
- [ ] 15. 检查点 — 前端 APP 完成
- 确认所有新增页面正常渲染页面跳转和参数传递正确API 调用正常,如有问题请告知。
- [ ] 16. 后台管理前端API 层
- [ ] 16.1 创建 api/business/odfcables.js — 光缆管理 API
- listOdfCables / addOdfCables / updateOdfCables / getOdfCables / delOdfCables / exportOdfCables
- _需求: 4.1_
- [ ] 16.2 创建 api/business/odfcablefaults.js — 干线故障管理 API
- listOdfCableFaults / getOdfCableFaults / delOdfCableFaults / exportOdfCableFaults
- _需求: 5.1_
- [ ] 16.3 创建 api/business/odfcheckin.js — 签到记录管理 API
- listOdfCheckin / exportOdfCheckin
- _需求: 2.6_
- [ ] 16.4 创建 api/business/odfusermodules.js — 用户模块权限管理 API
- listUsers / getUserModules / saveUserModules
- _需求: 8.1_
- [ ] 17. 后台管理前端:光缆管理页面
- [ ] 17.1 创建 views/business/OdfCables.vue — 光缆管理页面
- 查询表单(光缆名称 el-input + 所属部门 el-tree-select
- 工具栏按钮(新增/编辑/删除/导出v-hasPermi 权限控制)
- el-table 展示光缆列表Id、光缆名称、所属部门、创建时间
- 操作列:详情、编辑、删除
- 分页组件
- _需求: 4.1_
- [ ] 17.2 创建 components/business/OdfCableForm.vue — 光缆表单组件
- 支持 add / edit / view 三种模式
- 表单字段光缆名称必填、所属部门el-tree-select
- v-model:visible 控制弹窗显隐,@success 回调刷新列表
- _需求: 4.1_
- [ ]* 17.2.1 编写属性测试 Property 16光缆表单数据完整性
- **Property 16: 光缆表单数据完整性**
- 使用 fast-check 生成随机光缆名称和部门 ID验证请求体字段完整
- **验证: 后台管理前端 — 光缆管理**
- [ ] 18. 后台管理前端:干线故障管理页面
- [ ] 18.1 创建 views/business/OdfCableFaults.vue — 干线故障管理页面
- 查询表单(所属光缆 el-select 远程搜索 + 故障时间范围 el-date-picker + 故障原因 el-input
- 工具栏按钮(删除/导出,无新增/编辑)
- el-table 展示故障列表Id、故障时间、人员、故障原因、表显故障里程、所属光缆、地点、创建时间
- 操作列:详情、删除
- 详情弹窗el-dialog 展示完整故障信息 + 图片列表el-image 支持预览放大)
- 分页组件
- _需求: 5.1, 6.1_
- [ ]* 18.1.1 编写属性测试 Property 17管理端查询参数构建正确性
- **Property 17: 管理端查询参数构建正确性**
- 使用 fast-check 生成随机查询条件组合,验证 API 请求参数完整
- **验证: 后台管理前端 — 光缆管理、故障管理、签到记录管理**
- [ ] 19. 后台管理前端:签到记录管理页面
- [ ] 19.1 创建 views/business/OdfCheckin.vue — 签到记录管理页面
- 查询表单(机房 el-select 远程搜索 + 人员 el-input + 签到时间范围 el-date-picker
- 工具栏按钮(仅导出,无增删改)
- el-table 展示签到记录Id、机房名称、人员、签到时间、工作内容、提交人、创建时间
- 纯只读列表,无操作列
- 分页组件
- _需求: 2.6_
- [ ] 20. 后台管理前端:用户模块权限管理页面
- [ ] 20.1 创建 views/business/OdfUserModules.vue — 用户模块权限管理页面
- 左右分栏布局(左侧 360px 用户列表 + 右侧模块权限配置)
- 左侧:搜索框 + el-table 用户列表,点击行高亮选中
- 右侧:标题"用户名 - 模块权限配置" + el-checkbox-groupodf/trunk/route+ 保存按钮
- 页面加载调用 listUsers() 获取用户列表
- 点击用户 → 调用 getUserModules(userId) 填充 checkbox
- 保存 → 调用 saveUserModules(userId, modules) 批量更新
- v-hasPermi="['odfusermodules:edit']" 权限控制
- _需求: 8.1_
- [ ]* 20.1.1 编写属性测试 Property 18用户列表前端搜索过滤
- **Property 18: 用户列表前端搜索过滤**
- 使用 fast-check 生成随机用户列表和关键词,验证过滤结果正确
- **验证: 后台管理前端 — 用户模块权限管理**
- [ ]* 20.1.2 编写属性测试 Property 19用户模块权限保存数据构建
- **Property 19: 用户模块权限保存数据构建**
- 使用 fast-check 生成随机 userId 和模块子集,验证请求体正确
- **验证: 后台管理前端 — 用户模块权限管理**
- [ ] 21. 后台管理前端:路由配置
- ZRAdmin 使用动态路由(从 sys_menu 读取 Component 字段自动生成路由),因此无需手动配置 Vue Router
- 任务 1.6 的菜单 SQL 脚本已配置 Component 指向对应 Vue 文件,执行后即可通过菜单访问
- 仅需确认 4 个 Vue 文件路径与菜单 Component 一致:
- business/OdfCables → views/business/OdfCables.vue
- business/OdfCableFaults → views/business/OdfCableFaults.vue
- business/OdfCheckin → views/business/OdfCheckin.vue
- business/OdfUserModules → views/business/OdfUserModules.vue
- _需求: 8.1_
- [ ] 22. 最终检查点 — 全部完成
- 确认所有功能模块正常工作:数据库表、后台 API、前端 APP 页面、后台管理前端页面
- 确认菜单权限 SQL 脚本已执行,后台管理页面可通过菜单访问
- 确认所有测试通过,如有问题请告知。
## 备注
- 标记 `*` 的任务为可选测试任务,可跳过以加快 MVP 进度
- 每个任务引用了对应的需求编号,确保需求可追溯
- 检查点任务用于阶段性验证,确保增量交付质量
- 属性测试验证系统的通用正确性属性
- 单元测试验证具体示例和边界情况
- 任务 1.6(菜单权限 SQL 脚本)是后台管理前端正常运行的前提,务必不要遗漏

View File