From 2f7a81ff3da8631f1c2ecca7ac09085d1d391906 Mon Sep 17 00:00:00 2001 From: yueli Date: Thu, 17 Sep 2026 11:20:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(material):=20=E7=89=A9=E6=96=99=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E5=88=97=E5=8A=A0=E5=8F=8C=E9=87=8D=E5=AE=88=E5=8D=AB?= =?UTF-8?q?=EF=BC=8C=E6=B6=88=E9=99=A4=E3=80=8C=E6=9C=89=E8=A1=A8=E5=A4=B4?= =?UTF-8?q?=E6=97=A0=E6=95=B0=E6=8D=AE=E3=80=8D=E7=9A=84=E7=A9=BA=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 现象 ---- 收紧某字段读权限后,后端已把值抹成 null,但表格列照常渲染 —— 留下一列 全是「-」的空表头,白占屏幕宽度。反馈的「专业名称」即属此类。 两处前提与代码不符,先澄清 ---- · 列展示设置里**已有**「专业名称」选项(list.vue:190),columns.commonName 也**已在** columns 数组中(默认 visible: true)—— 无需补充。 该选项与表格列都走 hasColPermission('commonName'),没有权限者看不到选项, 与「没权限就看不见这列」的目标一致,并非缺陷。 · 真正的缺陷在同一处:**表格列只有 columns.X.visible,没有权限守卫**。 16 个数据列里仅 isApprovalRequired 有(且用错了码)。 改动 ---- 一、给全部数据列补上 && hasColPermission('')(两文件各 15 列; isApprovalRequired 原先写成 userStore.hasPermission('material_list:isApprovalRequired'), 改为同一函数,避免复选框与表格列各用一套口径)。 二、修正 permissionMap 两处与后端读过滤的口径错位: isInspectionRequired: material_list:operation → material_list:isInspectionRequired isApprovalRequired: material_list:operation → material_list:isApprovalRequired (以 app/utils/field_permissions.py 为准) ★ 为什么第 2 步是必须的:前端按 operation 判断会以为「有权限」,而后端其实 按另一个码把字段抹成了 null —— 于是渲染出一列全是「-」的空表头。 前端判定码必须与后端读过滤码**逐字段一致**,否则修了守卫也照样是空列。 验证 ---- · 两个文件的数据列 100% 带权限守卫(grep 复核) · 前端 permissionMap 与后端 STOCK_FIELD_RBAC_MAPPING 逐字段比对: 16 项中 14 项完全一致;id / isEnabled 两项前端更严(后端为公开字段)—— 方向安全,不会产生空列 · 前端 vite build 通过 --- inventory-web/src/views/material/buyOdoo.vue | 34 +++++++++-------- inventory-web/src/views/material/list.vue | 40 +++++++++++--------- 2 files changed, 40 insertions(+), 34 deletions(-) diff --git a/inventory-web/src/views/material/buyOdoo.vue b/inventory-web/src/views/material/buyOdoo.vue index 49931e7..ebdff1f 100644 --- a/inventory-web/src/views/material/buyOdoo.vue +++ b/inventory-web/src/views/material/buyOdoo.vue @@ -241,15 +241,15 @@ style="width: 100%; border-top: none;" > - + - + - + - + - + - + - - + + - + - + - + - + - + - + - +