From 992e42a5ae5e779f2c2bdd8757011377df8d537a Mon Sep 17 00:00:00 2001 From: zpc Date: Tue, 21 Apr 2026 23:16:26 +0800 Subject: [PATCH] 21 --- .../marker-pole-permission-fix/.config.kiro | 1 + .../marker-pole-permission-fix/bugfix.md | 29 +++ .../marker-pole-permission-fix/design.md | 173 ++++++++++++++++++ .../specs/marker-pole-permission-fix/tasks.md | 72 ++++++++ odf-uniapp/package.json | 12 ++ odf-uniapp/pages/marker-pole-add/index.vue | 5 + odf-uniapp/pages/marker-pole-list/index.vue | 4 +- odf-uniapp/services/api.js | 7 +- odf-uniapp/vitest.config.js | 0 .../Controllers/BaseController.cs | 4 +- .../Business/OdfCablesController.cs | 11 +- .../Controllers/System/SysLoginController.cs | 18 +- .../ZR.Service/Business/OdfCablesService.cs | 14 +- web/assets/api.B1J5tFT_.js | 1 + web/assets/api.WAttHfYM.js | 1 - .../{auth.4bIXNS21.js => auth.DeNESUOv.js} | 2 +- .../{home.DNe-wKWb.js => home.c5qZVvqD.js} | 2 +- web/assets/index-BrSpqQxh.css | 1 + web/assets/index-C27GNWBq.css | 1 + web/assets/index-CKq6YSLI.css | 1 + .../{index-CPzZ0wy_.js => index-CTXLc6aJ.js} | 4 +- web/assets/index-CjkLemY8.css | 1 - web/assets/index-DhG8xYUY.css | 1 + web/assets/index-DopbWI_4.css | 1 - web/assets/index-aMJ6hj0t.css | 1 - web/assets/index.DN9NEnkP.js | 1 + ...achine.DENn3o-B.js => machine.C3jrQPcn.js} | 2 +- ...ole.BRGgz6EJ.js => markerPole.D21OgQ8p.js} | 2 +- web/assets/pages-about-index.B3YDgyMS.js | 1 + web/assets/pages-cable-index.BRQ6Bx75.js | 1 - web/assets/pages-cable-index.BWo7rlTZ.js | 1 + web/assets/pages-cable-type-index.BpKE7q7J.js | 1 + web/assets/pages-cable-type-index.CXbgOih2.js | 1 - .../pages-change-password-index.BzT63utz.js | 1 - .../pages-change-password-index.CkDoxBwz.js | 1 + web/assets/pages-checkin-index.CzflstRr.js | 1 - web/assets/pages-checkin-index.DsW-wPBZ.js | 1 + web/assets/pages-fault-add-index.D8ls998m.js | 1 - web/assets/pages-fault-add-index.yNlQTv70.js | 1 + .../pages-fault-detail-index.BaqmF3h4.js | 1 - .../pages-fault-detail-index.ByNF0vXW.js | 1 + web/assets/pages-fault-list-index.BBqdzq31.js | 1 - web/assets/pages-fault-list-index.IItkBGqd.js | 1 + web/assets/pages-home-index.B02FiQFq.js | 1 - web/assets/pages-home-index.BaVclvlT.js | 1 + web/assets/pages-login-index.C0xap_yW.js | 1 + web/assets/pages-login-index.D7FrQPxS.js | 1 - .../pages-marker-pole-add-index.DfCWEywP.js | 1 - .../pages-marker-pole-add-index.HqWN0R-K.js | 1 + ...pages-marker-pole-detail-index.BAqH1_y7.js | 1 + ...pages-marker-pole-detail-index.E5sogb0A.js | 1 - .../pages-marker-pole-list-index.BCgqnZLE.js | 1 - .../pages-marker-pole-list-index.DujGJm5v.js | 1 + ...pages-optical-box-detail-index.CswaiuoP.js | 1 - ...pages-optical-box-detail-index.rp4X2-mv.js | 1 + web/assets/pages-portal-index.BFMsEzlT.js | 1 + web/assets/pages-portal-index.BYlDBQJK.js | 1 - .../pages-rack-detail-index.CiHNf1Uo.js | 1 - .../pages-rack-detail-index.DlAuujv1.js | 1 + web/assets/pages-rack-index.DhjeEaXy.js | 1 - web/assets/pages-rack-index.Dk3Zd0sX.js | 1 + web/assets/pages-region-index.BGsDRf1J.js | 1 - web/assets/pages-region-index.Cc9EmoxA.js | 1 + web/assets/pages-room-index.5d187uFB.js | 1 + web/assets/pages-room-index.DSXhqtPx.js | 1 - ....js => pages-route-plan-index.-U4fUC1Q.js} | 2 +- web/assets/pages-search-index.BOTZl7vw.js | 1 - web/assets/pages-search-index.rvGvhR6P.js | 1 + web/assets/pages-settings-index.DKCXM1CY.js | 1 + web/assets/pages-settings-index.Dp6wI0K9.js | 1 - web/assets/pages-start-index.DabIxUVp.js | 1 - web/assets/pages-start-index.nWBJJEJZ.js | 1 + web/assets/pages-trunk-index.DeNFq30l.js | 1 + web/assets/pages-trunk-index.DoIJum-W.js | 1 - .../pages-trunk-search-index.C617xMDJ.js | 1 - .../pages-trunk-search-index.DrII9CW8.js | 1 + web/assets/permission.BtD_vlaM.js | 1 + web/assets/permission.D5LIATU_.js | 1 - web/assets/port-edit-dialog.BjgOfaMm.js | 1 - web/assets/port-edit-dialog.g44p_qaP.js | 1 + web/assets/search.CV69CaXz.js | 1 + web/assets/search.DkrY45Sb.js | 1 - web/assets/trunk.Cy1l3Qkm.js | 1 - web/assets/trunk.zK9jBoi7.js | 1 + web/assets/uni-app.es.CdmqpGGi.js | 1 - web/assets/uni-app.es.DhLP6U1d.js | 1 + .../{uni.4607b3fa.css => uni.a368ec40.css} | 2 +- ....Bsh4ogsU.js => update-dialog.DglVOnBL.js} | 2 +- ...mark.BmlaikmI.js => watermark._QPOlCFA.js} | 2 +- web/index.html | 4 +- 90 files changed, 374 insertions(+), 67 deletions(-) create mode 100644 .kiro/specs/marker-pole-permission-fix/.config.kiro create mode 100644 .kiro/specs/marker-pole-permission-fix/bugfix.md create mode 100644 .kiro/specs/marker-pole-permission-fix/design.md create mode 100644 .kiro/specs/marker-pole-permission-fix/tasks.md create mode 100644 odf-uniapp/package.json create mode 100644 odf-uniapp/vitest.config.js create mode 100644 web/assets/api.B1J5tFT_.js delete mode 100644 web/assets/api.WAttHfYM.js rename web/assets/{auth.4bIXNS21.js => auth.DeNESUOv.js} (73%) rename web/assets/{home.DNe-wKWb.js => home.c5qZVvqD.js} (77%) create mode 100644 web/assets/index-BrSpqQxh.css create mode 100644 web/assets/index-C27GNWBq.css create mode 100644 web/assets/index-CKq6YSLI.css rename web/assets/{index-CPzZ0wy_.js => index-CTXLc6aJ.js} (95%) delete mode 100644 web/assets/index-CjkLemY8.css create mode 100644 web/assets/index-DhG8xYUY.css delete mode 100644 web/assets/index-DopbWI_4.css delete mode 100644 web/assets/index-aMJ6hj0t.css create mode 100644 web/assets/index.DN9NEnkP.js rename web/assets/{machine.DENn3o-B.js => machine.C3jrQPcn.js} (67%) rename web/assets/{markerPole.BRGgz6EJ.js => markerPole.D21OgQ8p.js} (75%) create mode 100644 web/assets/pages-about-index.B3YDgyMS.js delete mode 100644 web/assets/pages-cable-index.BRQ6Bx75.js create mode 100644 web/assets/pages-cable-index.BWo7rlTZ.js create mode 100644 web/assets/pages-cable-type-index.BpKE7q7J.js delete mode 100644 web/assets/pages-cable-type-index.CXbgOih2.js delete mode 100644 web/assets/pages-change-password-index.BzT63utz.js create mode 100644 web/assets/pages-change-password-index.CkDoxBwz.js delete mode 100644 web/assets/pages-checkin-index.CzflstRr.js create mode 100644 web/assets/pages-checkin-index.DsW-wPBZ.js delete mode 100644 web/assets/pages-fault-add-index.D8ls998m.js create mode 100644 web/assets/pages-fault-add-index.yNlQTv70.js delete mode 100644 web/assets/pages-fault-detail-index.BaqmF3h4.js create mode 100644 web/assets/pages-fault-detail-index.ByNF0vXW.js delete mode 100644 web/assets/pages-fault-list-index.BBqdzq31.js create mode 100644 web/assets/pages-fault-list-index.IItkBGqd.js delete mode 100644 web/assets/pages-home-index.B02FiQFq.js create mode 100644 web/assets/pages-home-index.BaVclvlT.js create mode 100644 web/assets/pages-login-index.C0xap_yW.js delete mode 100644 web/assets/pages-login-index.D7FrQPxS.js delete mode 100644 web/assets/pages-marker-pole-add-index.DfCWEywP.js create mode 100644 web/assets/pages-marker-pole-add-index.HqWN0R-K.js create mode 100644 web/assets/pages-marker-pole-detail-index.BAqH1_y7.js delete mode 100644 web/assets/pages-marker-pole-detail-index.E5sogb0A.js delete mode 100644 web/assets/pages-marker-pole-list-index.BCgqnZLE.js create mode 100644 web/assets/pages-marker-pole-list-index.DujGJm5v.js delete mode 100644 web/assets/pages-optical-box-detail-index.CswaiuoP.js create mode 100644 web/assets/pages-optical-box-detail-index.rp4X2-mv.js create mode 100644 web/assets/pages-portal-index.BFMsEzlT.js delete mode 100644 web/assets/pages-portal-index.BYlDBQJK.js delete mode 100644 web/assets/pages-rack-detail-index.CiHNf1Uo.js create mode 100644 web/assets/pages-rack-detail-index.DlAuujv1.js delete mode 100644 web/assets/pages-rack-index.DhjeEaXy.js create mode 100644 web/assets/pages-rack-index.Dk3Zd0sX.js delete mode 100644 web/assets/pages-region-index.BGsDRf1J.js create mode 100644 web/assets/pages-region-index.Cc9EmoxA.js create mode 100644 web/assets/pages-room-index.5d187uFB.js delete mode 100644 web/assets/pages-room-index.DSXhqtPx.js rename web/assets/{pages-route-plan-index.DPCuToiQ.js => pages-route-plan-index.-U4fUC1Q.js} (85%) delete mode 100644 web/assets/pages-search-index.BOTZl7vw.js create mode 100644 web/assets/pages-search-index.rvGvhR6P.js create mode 100644 web/assets/pages-settings-index.DKCXM1CY.js delete mode 100644 web/assets/pages-settings-index.Dp6wI0K9.js delete mode 100644 web/assets/pages-start-index.DabIxUVp.js create mode 100644 web/assets/pages-start-index.nWBJJEJZ.js create mode 100644 web/assets/pages-trunk-index.DeNFq30l.js delete mode 100644 web/assets/pages-trunk-index.DoIJum-W.js delete mode 100644 web/assets/pages-trunk-search-index.C617xMDJ.js create mode 100644 web/assets/pages-trunk-search-index.DrII9CW8.js create mode 100644 web/assets/permission.BtD_vlaM.js delete mode 100644 web/assets/permission.D5LIATU_.js delete mode 100644 web/assets/port-edit-dialog.BjgOfaMm.js create mode 100644 web/assets/port-edit-dialog.g44p_qaP.js create mode 100644 web/assets/search.CV69CaXz.js delete mode 100644 web/assets/search.DkrY45Sb.js delete mode 100644 web/assets/trunk.Cy1l3Qkm.js create mode 100644 web/assets/trunk.zK9jBoi7.js delete mode 100644 web/assets/uni-app.es.CdmqpGGi.js create mode 100644 web/assets/uni-app.es.DhLP6U1d.js rename web/assets/{uni.4607b3fa.css => uni.a368ec40.css} (59%) rename web/assets/{update-dialog.Bsh4ogsU.js => update-dialog.DglVOnBL.js} (98%) rename web/assets/{watermark.BmlaikmI.js => watermark._QPOlCFA.js} (96%) diff --git a/.kiro/specs/marker-pole-permission-fix/.config.kiro b/.kiro/specs/marker-pole-permission-fix/.config.kiro new file mode 100644 index 0000000..5120a57 --- /dev/null +++ b/.kiro/specs/marker-pole-permission-fix/.config.kiro @@ -0,0 +1 @@ +{"specId": "fb54238e-822c-47bb-bf0e-8eb9bf8e14e7", "workflowType": "requirements-first", "specType": "bugfix"} \ No newline at end of file diff --git a/.kiro/specs/marker-pole-permission-fix/bugfix.md b/.kiro/specs/marker-pole-permission-fix/bugfix.md new file mode 100644 index 0000000..de545ee --- /dev/null +++ b/.kiro/specs/marker-pole-permission-fix/bugfix.md @@ -0,0 +1,29 @@ +# Bugfix Requirements Document + +## Introduction + +标石/杆号牌模块的前端权限控制失效。用户在管理后台仅被分配了"查看权限"(`odfmarkerpoles:list` / `odfmarkerpoles:query`),但在 uniapp 端的标石/杆号牌列表页面中,"新增"按钮无条件显示,用户可以点击进入新增页面并提交数据。虽然后端 API 已有 `odfmarkerpoles:add` 权限校验会拒绝请求,但前端不应暴露无权限的操作入口,这会造成用户体验混乱和安全隐患。 + +## Bug Analysis + +### Current Behavior (Defect) + +1.1 WHEN 用户仅拥有查看权限(无 `odfmarkerpoles:add`)访问标石/杆号牌列表页时 THEN 系统无条件显示"新增"按钮,用户可以点击进入新增页面 + +1.2 WHEN 用户仅拥有查看权限(无 `odfmarkerpoles:add`)直接访问或通过 URL 进入标石/杆号牌新增页面时 THEN 系统允许用户进入新增页面并填写表单(提交时后端会拒绝,但前端未做拦截) + +### Expected Behavior (Correct) + +2.1 WHEN 用户仅拥有查看权限(无 `odfmarkerpoles:add`)访问标石/杆号牌列表页时 THEN 系统 SHALL 隐藏"新增"按钮,用户无法看到新增入口 + +2.2 WHEN 用户仅拥有查看权限(无 `odfmarkerpoles:add`)尝试进入标石/杆号牌新增页面时 THEN 系统 SHALL 阻止进入并跳转回列表页,提示用户无权限 + +### Unchanged Behavior (Regression Prevention) + +3.1 WHEN 用户拥有新增权限(`odfmarkerpoles:add`)访问标石/杆号牌列表页时 THEN 系统 SHALL CONTINUE TO 显示"新增"按钮,用户可正常点击进入新增页面 + +3.2 WHEN 用户拥有新增权限(`odfmarkerpoles:add`)进入标石/杆号牌新增页面时 THEN 系统 SHALL CONTINUE TO 允许用户正常填写表单并提交 + +3.3 WHEN 用户拥有超级管理员权限(`*:*:*`)时 THEN 系统 SHALL CONTINUE TO 显示"新增"按钮并允许正常新增操作 + +3.4 WHEN 用户访问标石/杆号牌列表页进行查看操作时 THEN 系统 SHALL CONTINUE TO 正常加载和显示列表数据,不受权限修复影响 diff --git a/.kiro/specs/marker-pole-permission-fix/design.md b/.kiro/specs/marker-pole-permission-fix/design.md new file mode 100644 index 0000000..e95573d --- /dev/null +++ b/.kiro/specs/marker-pole-permission-fix/design.md @@ -0,0 +1,173 @@ +# 标石/杆号牌权限控制修复 Bugfix Design + +## Overview + +标石/杆号牌模块(marker-pole)的前端权限控制缺失,导致无 `odfmarkerpoles:add` 权限的用户仍能看到"新增"按钮并进入新增页面。修复方案为:在列表页通过 `v-if` 条件渲染控制按钮显隐,在新增页通过 `onLoad` 权限守卫阻止无权限用户进入。参考实现为已正确实现权限控制的 `fault-list/index.vue`。 + +## Glossary + +- **Bug_Condition (C)**: 用户不具备 `odfmarkerpoles:add` 权限时,前端仍显示新增按钮并允许进入新增页面 +- **Property (P)**: 无 `odfmarkerpoles:add` 权限时,新增按钮应隐藏,新增页面应拦截并跳转回列表 +- **Preservation**: 有权限用户的新增流程、列表查看功能、超级管理员权限均不受影响 +- **store.hasPermi()**: `odf-uniapp/store/index.js` 中的权限检查方法,检查用户 permissions 数组是否包含指定权限字符串(`*:*:*` 为超级管理员通配) +- **canAdd**: 布尔变量,由 `store.hasPermi('odfmarkerpoles:add')` 返回,控制新增按钮的显隐 + +## Bug Details + +### Bug Condition + +用户不具备 `odfmarkerpoles:add` 权限时,`marker-pole-list/index.vue` 的底部"新增"按钮无条件渲染(无 `v-if` 控制),`marker-pole-add/index.vue` 的 `onLoad` 中无权限校验,导致用户可自由进入新增页面。 + +**Formal Specification:** +``` +FUNCTION isBugCondition(input) + INPUT: input of type { user: User, action: 'view_add_button' | 'enter_add_page' } + OUTPUT: boolean + + RETURN NOT store.hasPermi('odfmarkerpoles:add') + AND input.action IN ['view_add_button', 'enter_add_page'] +END FUNCTION +``` + +### Examples + +- 用户仅有 `odfmarkerpoles:list` 权限,打开标石列表页 → 期望:不显示"新增"按钮;实际:显示"新增"按钮 +- 用户仅有 `odfmarkerpoles:query` 权限,通过 URL 直接访问 `/pages/marker-pole-add/index` → 期望:被拦截并跳转回列表;实际:正常进入新增页面 +- 用户有 `odfmarkerpoles:add` 权限,打开标石列表页 → 期望:显示"新增"按钮;实际:显示"新增"按钮(正确) +- 超级管理员(`*:*:*`),打开标石列表页 → 期望:显示"新增"按钮;实际:显示"新增"按钮(正确) + +## Expected Behavior + +### Preservation Requirements + +**Unchanged Behaviors:** +- 有 `odfmarkerpoles:add` 权限的用户在列表页可正常看到"新增"按钮并进入新增页面 +- 超级管理员(`*:*:*`)的所有操作不受影响 +- 列表页的数据加载、分页、详情跳转功能不受影响 +- 新增页面的表单填写、拍照、定位、提交等功能对有权限用户不受影响 + +**Scope:** +所有不涉及"新增"操作入口的功能不受此修复影响,包括: +- 列表查看和分页加载 +- 详情页查看 +- 返回导航 +- 其他模块的权限控制 + +## Hypothesized Root Cause + +Based on the bug description, the most likely issues are: + +1. **列表页缺少权限条件渲染**: `marker-pole-list/index.vue` 的底部 `bottom-bar`(包含"新增"按钮)没有 `v-if` 条件控制,无条件渲染给所有用户。对比 `fault-list/index.vue` 已正确使用 `v-if="canAdd"` 控制。 + +2. **列表页未引入 store**: `marker-pole-list/index.vue` 的 ` - +