zzw
20 小时以前 781b8b3e072a4e00b1cee56f961280c753cbb460
feat: add assigned scope to role permission settings
4个文件已修改
96 ■■■■■ 已修改文件
HANDOFF.md 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
emergency-repair-web/src/views/system/RolePermissionDialog.vue 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
requirement/交接文件_2026.10.3.md 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
requirement/改进20261003.txt 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HANDOFF.md
@@ -826,3 +826,30 @@
- å®Œå·¥æŸ¥é˜…接口当前一次返回全部匹配结果,没有分页;数据量进一步增大时建议增加分页或导出策略。
- ä¸è¦æäº¤ `.codex-run`、Office é”æ–‡ä»¶æˆ– `emergency-repair-web/public/新建 æ–‡æœ¬æ–‡æ¡£.txt`。
- æœ¬è½®ä»£ç ã€éœ€æ±‚文件和交接记录一并提交并推送公司 Git ä»“库 `main` åˆ†æ”¯ã€‚
## 21. æ”¶å°¾å¿«ç…§ï¼ˆ2026-10-06 å‘¨ä¸€ï¼Œéœ€æ±‚ 21 æƒé™è®¾ç½®èŒƒå›´åˆ‡æ¢ï¼‰
**本轮完成内容**
- è§’色管理“权限设置”弹窗增加“全部 / å·²è®¾ç½®â€åˆ‡æ¢ï¼Œäº¤äº’方式与“用户设置”保持一致。
- â€œå…¨éƒ¨â€æ˜¾ç¤ºå®Œæ•´èœå•及按钮权限树,保留“全选”和原有权限反显。
- â€œå·²è®¾ç½®â€ä»…显示当前角色已授权节点及其父级路径;没有已设置权限时显示空状态提示。
- åˆ‡æ¢èŒƒå›´æ—¶ä¼šä¿ç•™å½“前尚未保存的勾选状态,切回“全部”后恢复完整树及当前选中权限。
- å¼¹çª—每次重新打开默认回到“全部”。
**主要文件**
- `emergency-repair-web/src/views/system/RolePermissionDialog.vue`
- `requirement/改进20261003.txt`(补充需求 21 çš„范围切换口径)
**验证结果**
- å‰ç«¯ `npm run build` é€šè¿‡ï¼Œä»…有既有包体积告警。
- `node .codex-run/verify-req21-22.js` é€šè¿‡ï¼šå·¦ä¾§æ— â€œèœå•权限管理”,角色管理存在“权限设置”。
- å…¨éƒ¨è§†å›¾æ˜¾ç¤º 119 ä¸ªå¤é€‰æ¡†ã€13 ä¸ªå·²å‹¾é€‰ã€1 ä¸ªåŠé€‰ï¼›å·²è®¾ç½®è§†å›¾æ˜¾ç¤º 14 ä¸ªèŠ‚ç‚¹ï¼Œå‡ä¸ºå½“å‰å·²è®¾ç½®èŠ‚ç‚¹æˆ–çˆ¶çº§è·¯å¾„ï¼›åˆ‡å›žå…¨éƒ¨åŽå‹¾é€‰çŠ¶æ€æ¢å¤ï¼Œæ— ç½‘ç»œå¼‚å¸¸ã€‚
- æˆªå›¾ï¼š`.codex-run/role-permission-assigned-scope.png`。
**当前运行状态(2026-10-06)**
- å‰ç«¯ `http://localhost:8082`;后端 `http://127.0.0.1:8091`;DM8 `127.0.0.1:5236`;Edge CDP `9222`。
- ç™»å½• `admin / admin123`;数据库 `SYSDBA/SYSDBA`,业务 schema `LX`。
**接手注意**
- ä¸è¦æäº¤ `.codex-run`、Office é”æ–‡ä»¶æˆ– `emergency-repair-web/public/新建 æ–‡æœ¬æ–‡æ¡£.txt`。
- æœ¬è½®ä»£ç ã€éœ€æ±‚文件和交接记录一并提交并推送公司 Git ä»“库 `main` åˆ†æ”¯ã€‚
emergency-repair-web/src/views/system/RolePermissionDialog.vue
@@ -15,16 +15,21 @@
      <span class="selected-total">已选权限 {{ selectedRoleIds.length }} ä¸ª</span>
    </div>
    <div class="permission-toolbar">
      <el-checkbox v-model="checkAll" @change="toggleAll">全选</el-checkbox>
      <span class="permission-tip">菜单和按钮权限均可勾选,保存后切换角色会自动反显。</span>
      <el-radio-group v-model="permissionScope" size="small" @change="handleScopeChange">
        <el-radio-button label="all">全部</el-radio-button>
        <el-radio-button label="assigned">已设置</el-radio-button>
      </el-radio-group>
      <el-checkbox v-if="permissionScope === 'all'" v-model="checkAll" @change="toggleAll">全选</el-checkbox>
      <span class="permission-tip">{{ permissionTip }}</span>
    </div>
    <div v-loading="loading" class="permission-tree">
      <el-tree
        ref="permissionTree"
        :data="menus"
        :data="displayMenus"
        node-key="id"
        show-checkbox
        default-expand-all
        empty-text="该角色尚未设置权限"
        :render-content="renderContent"
        :props="{ label: 'name', children: 'children' }"
        @check="syncCheckAllState"
@@ -52,6 +57,7 @@
      loading: false,
      saving: false,
      checkAll: false,
      permissionScope: 'all',
      selectedRoleIds: []
    }
  },
@@ -62,6 +68,23 @@
    },
    allMenuIds() {
      return this.flatMenus.map(item => String(item.id))
    },
    displayMenus() {
      if (this.permissionScope === 'all') return this.menus
      const assigned = new Set(this.selectedRoleIds.map(String))
      const filterAssigned = nodes => (nodes || []).reduce((result, node) => {
        const children = filterAssigned(node.children)
        if (assigned.has(String(node.id)) || children.length) {
          result.push({ ...node, children })
        }
        return result
      }, [])
      return filterAssigned(this.menus)
    },
    permissionTip() {
      return this.permissionScope === 'all'
        ? '菜单和按钮权限均可勾选,保存后切换角色会自动反显。'
        : '仅显示当前角色已设置的权限及其父级节点。'
    }
  },
  watch: {
@@ -74,6 +97,7 @@
      if (!this.role || !this.role.id) return
      this.loading = true
      this.checkAll = false
      this.permissionScope = 'all'
      this.selectedRoleIds = []
      Promise.all([
        api.get('/system/menu/tree'),
@@ -90,6 +114,15 @@
          this.syncCheckAllState()
        })
      }).finally(() => { this.loading = false })
    },
    handleScopeChange() {
      this.selectedRoleIds = this.checkedMenuIds()
      this.$nextTick(() => {
        if (!this.$refs.permissionTree) return
        this.$refs.permissionTree.setCheckedKeys(this.displayCheckedKeys(this.selectedRoleIds))
        this.syncCheckAllState()
      })
    },
    renderContent(h, { data }) {
      const label = data.menuType === 2 ? data.name + ' [按钮 ' + (data.permissions || '') + ']' : data.name
@@ -128,7 +161,9 @@
      return [...new Set([...(tree.getCheckedKeys(false) || []), ...(tree.getHalfCheckedKeys() || [])].map(String))]
    },
    syncCheckAllState() {
      this.checkAll = this.checkedMenuIds().length === this.allMenuIds.length
      const checked = this.checkedMenuIds()
      this.selectedRoleIds = checked
      this.checkAll = checked.length === this.allMenuIds.length
    },
    toggleAll() {
      if (!this.$refs.permissionTree) return
requirement/½»½ÓÎļþ_2026.10.3.md
@@ -627,3 +627,27 @@
- å®Œå·¥æŸ¥é˜…当前只展示已有 `T_COMPLETION_INFO` å®Œå·¥å¡«æŠ¥è®°å½•的派工单,并且接口未分页。
- æœ¬è½®ä»£ç ã€éœ€æ±‚文件和交接记录一并提交并推送公司 Git ä»“库 `main` åˆ†æ”¯ã€‚
- `.codex-run`、Office é”æ–‡ä»¶åŠ `emergency-repair-web/public/新建 æ–‡æœ¬æ–‡æ¡£.txt` ä»ä¸ºæœ¬åœ°ä¸´æ—¶æ–‡ä»¶ï¼Œä¸åº”提交。
## åäº”、2026-10-06 è”调收尾(需求 21 æƒé™è®¾ç½®èŒƒå›´åˆ‡æ¢ï¼‰
| åºå· | éœ€æ±‚补充 | çŠ¶æ€ | å®žçŽ°ä¸ŽéªŒè¯ |
| --- | --- | --- | --- |
| 21 | æƒé™è®¾ç½®å¢žåŠ â€œå…¨éƒ¨ / å·²è®¾ç½®â€åˆ‡æ¢ | å·²å®Œæˆ | `RolePermissionDialog.vue` å¢žåŠ èŒƒå›´åˆ‡æ¢ï¼›â€œå…¨éƒ¨â€æ˜¾ç¤ºå®Œæ•´èœå•åŠæŒ‰é’®æ ‘å¹¶å¯å…¨é€‰ï¼Œâ€œå·²è®¾ç½®â€ä»…æ˜¾ç¤ºå½“å‰è§’è‰²å·²æŽˆæƒèŠ‚ç‚¹å’Œçˆ¶çº§è·¯å¾„ï¼Œåˆ‡æ¢æ—¶ä¿ç•™æœªä¿å­˜å‹¾é€‰ï¼Œé‡æ–°æ‰“å¼€é»˜è®¤â€œå…¨éƒ¨â€ |
### 15.1 ä¸»è¦å˜æ›´æ–‡ä»¶
- `emergency-repair-web/src/views/system/RolePermissionDialog.vue`
- `requirement/改进20261003.txt`(补充需求 21 çš„范围切换口径)
### 15.2 éªŒè¯ç»“æžœ
- å‰ç«¯ `npm run build` é€šè¿‡ï¼Œä»…有既有包体积告警。
- `node .codex-run/verify-req21-22.js` é€šè¿‡ï¼šå·¦ä¾§æ— â€œèœå•权限管理”,角色管理存在“权限设置”。
- å…¨éƒ¨è§†å›¾æ˜¾ç¤º 119 ä¸ªå¤é€‰æ¡†ã€13 ä¸ªå·²å‹¾é€‰ã€1 ä¸ªåŠé€‰ï¼›å·²è®¾ç½®è§†å›¾æ˜¾ç¤º 14 ä¸ªèŠ‚ç‚¹ï¼Œå‡ä¸ºå½“å‰å·²è®¾ç½®èŠ‚ç‚¹æˆ–çˆ¶çº§è·¯å¾„ï¼›åˆ‡å›žå…¨éƒ¨åŽå‹¾é€‰çŠ¶æ€æ¢å¤ï¼Œæ— ç½‘ç»œå¼‚å¸¸ã€‚
- æˆªå›¾ï¼š`.codex-run/role-permission-assigned-scope.png`。
### 15.3 æŽ¥æ‰‹æ³¨æ„
- å½“前运行:前端 `http://localhost:8082`;后端 `http://127.0.0.1:8091`;DM8 `127.0.0.1:5236`;Edge CDP `9222`。登录 `admin / admin123`。
- æœ¬è½®ä»£ç ã€éœ€æ±‚文件和交接记录一并提交并推送公司 Git ä»“库 `main` åˆ†æ”¯ã€‚
- `.codex-run`、Office é”æ–‡ä»¶åŠ `emergency-repair-web/public/新建 æ–‡æœ¬æ–‡æ¡£.txt` ä»ä¸ºæœ¬åœ°ä¸´æ—¶æ–‡ä»¶ï¼Œä¸åº”提交。
requirement/¸Ä½ø20261003.txt
@@ -29,7 +29,7 @@
19、承修单位应该到部门表里找DEPT_TYPE列为cj的记录
20、菜单权限管理,双权限管理应该分2步, ç¬¬1步设置租户权限,第2步设置角色权限, ç›®å‰ç”¨æˆ·æœ¬èº«æ˜¯æ²¡æœ‰ç§Ÿæˆ·çš„,所以这个租户权限设置就没必要了,保留角色权限设置就可以了,权限检查框要反显
21、菜单权限管理,这个菜单不要,在角色管理增加一个权限设置按钮,类似用户设置那个按钮那样
21、菜单权限管理,这个菜单不要,在角色管理增加一个权限设置按钮,类似用户设置那个按钮那样,也象用户设置增加个全部/已设置的切换开关
22、系统管理下面增加2级菜单组节点, ç³»ç»Ÿé…ç½®ï¼ˆé™¤äº†æƒé™é…ç½®ã€æ—¥å¿—管理管理下面哪些菜单外,其他菜单放到系统配置下面)、权限配置(用户管理、角色管理、菜单管理)、日志管理(登录日志、操作日志、错误日志)
   é”™è¯¯æ—¥å¿—为新增功能,记录程序运行出现的bug