Ver Fonte

feat(core): 三方用户权限增强及页面功能禁用

- 在企业资金流水、企业信息及企业用户关系页面实现三方用户角色判断
- 三方用户禁用新增、删除、编辑、充值、扣款、邀请码等敏感操作按钮
- 后端服务根据当前登录用户角色限制查询范围,三方用户仅显示自身所属关联企业数据
- 移除相关接口的权限校验注解,改由代码中角色判断控制访问权限
- 新增部门ID参数,支持三方用户通过部门筛选及获取隶属企业ID
- 优化CURD组件按钮禁用逻辑,支持动态属性函数绑定
- 修改Mapper增加部门ID和企业ID查询条件,确保数据隔离和安全性
SheepHy há 1 dia atrás
pai
commit
619e8e21d4

+ 2 - 2
src/components/CURD/PageContent.vue

@@ -9,8 +9,8 @@
         <template v-for="(btn, index) in toolbarLeftBtn" :key="index">
           <el-button
             v-hasPerm="btn.perm ?? '*:*:*'"
-            v-bind="btn.attrs"
-            :disabled="btn.name === 'delete' && removeIds.length === 0"
+            v-bind="typeof btn.attrs === 'function' ? btn.attrs() : btn.attrs"
+            :disabled="(typeof btn.attrs === 'function' ? btn.attrs() : btn.attrs)?.disabled || (btn.name === 'delete' && removeIds.length === 0)"
             @click="handleToolbar(btn.name)"
           >
             {{ btn.text }}

+ 39 - 5
src/views/toBManage/firm-account-log/index.vue

@@ -54,6 +54,19 @@ defineOptions({ name: "FirmAccountLog" });
 import FirmAccountLogAPI, { FirmAccountLogPageQuery } from "@/api/toBManage/firm-account-log-api";
 import type { IObject, IContentConfig, ISearchConfig } from "@/components/CURD/types";
 import usePage from "@/components/CURD/usePage";
+import { useUserStore } from "@/store";
+
+// 三方用户角色编码
+const ROLE_SFUSER = "SFUSER";
+
+// 获取用户信息
+const userStore = useUserStore();
+
+// 判断是否为三方用户
+const isSfUser = computed(() => {
+  const roles = userStore.userInfo?.roles;
+  return roles && roles.includes(ROLE_SFUSER);
+});
 
 // 组合式 CRUD
 const {
@@ -82,7 +95,7 @@ const getChangeTypeLabel = (type: number | undefined) => {
 
 // 搜索配置
 const searchConfig: ISearchConfig = reactive({
-  permPrefix: "business:firm-account-log",
+  // permPrefix: "business:firm-account-log",
   formItems: [
     {
       type: "select",
@@ -157,7 +170,7 @@ const searchConfig: ISearchConfig = reactive({
 // 列表配置
 const contentConfig: IContentConfig<FirmAccountLogPageQuery> = reactive({
   // 权限前缀
-  permPrefix: "business:firm-account-log",
+  // permPrefix: "business:firm-account-log",
   table: {
     border: true,
     highlightCurrentRow: true,
@@ -182,8 +195,19 @@ const contentConfig: IContentConfig<FirmAccountLogPageQuery> = reactive({
     pageSize: 20,
     pageSizes: [10, 20, 30, 50],
   },
-  // 工具栏配置
-  toolbar: ["delete"],
+  // 工具栏配置 - 三方用户禁用删除按钮
+  toolbar: [
+    {
+      name: "delete",
+      text: "删除",
+      perm: "delete",
+      attrs: () => ({
+        type: "danger",
+        icon: "delete",
+        disabled: isSfUser.value,
+      }),
+    },
+  ],
   defaultToolbar: ["refresh", "filter"],
   // 表格列配置
   cols: [
@@ -240,7 +264,17 @@ const contentConfig: IContentConfig<FirmAccountLogPageQuery> = reactive({
       prop: "operation",
       width: 100,
       templet: "tool",
-      operat: ["delete"],
+      operat: [
+        {
+          name: "delete",
+          text: "删除",
+          attrs: () => ({
+            type: "danger",
+            icon: "delete",
+            disabled: isSfUser.value,
+          }),
+        },
+      ],
     },
   ],
 });

+ 58 - 16
src/views/toBManage/firm-info/index.vue

@@ -146,6 +146,19 @@ import type { IObject, IModalConfig, IContentConfig, ISearchConfig } from "@/com
 import usePage from "@/components/CURD/usePage";
 import html2canvas from "html2canvas";
 import { ElMessage } from "element-plus";
+import { useUserStore } from "@/store";
+
+// 三方用户角色编码
+const ROLE_SFUSER = "SFUSER";
+
+// 获取用户信息
+const userStore = useUserStore();
+
+// 判断是否为三方用户
+const isSfUser = computed(() => {
+  const roles = userStore.userInfo?.roles;
+  return roles && roles.includes(ROLE_SFUSER);
+});
 
 // 可用部门选项
 const availableDeptOptions = ref<OptionType[]>([]);
@@ -261,7 +274,7 @@ const formatMoney = (value: number | undefined | null): string => {
 
 // 搜索配置
 const searchConfig: ISearchConfig = reactive({
-  permPrefix: "business:firm-info",
+  // permPrefix: "business:firm-info",
   formItems: [
     {
       type: "select",
@@ -307,7 +320,7 @@ const searchConfig: ISearchConfig = reactive({
 // 列表配置
 const contentConfig: IContentConfig<FirmInfoPageQuery> = reactive({
   // 权限前缀
-  permPrefix: "business:firm-info",
+  // permPrefix: "business:firm-info",
   table: {
     border: true,
     highlightCurrentRow: true,
@@ -332,18 +345,28 @@ const contentConfig: IContentConfig<FirmInfoPageQuery> = reactive({
     pageSize: 20,
     pageSizes: [10, 20, 30, 50],
   },
-  // 工具栏配置 - 移除默认的add,使用自定义新增
+  // 工具栏配置 - 三方用户禁用新增和删除按钮
   toolbar: [
     {
       name: "customAdd",
       text: "新增",
       perm: "add",
-      attrs: {
+      attrs: () => ({
         type: "success",
         icon: "plus",
-      },
+        disabled: isSfUser.value,
+      }),
+    },
+    {
+      name: "delete",
+      text: "删除",
+      perm: "delete",
+      attrs: () => ({
+        type: "danger",
+        icon: "delete",
+        disabled: isSfUser.value,
+      }),
     },
-    "delete",
   ],
   defaultToolbar: ["refresh", "filter"],
   // 表格列配置
@@ -402,30 +425,49 @@ const contentConfig: IContentConfig<FirmInfoPageQuery> = reactive({
         {
           name: "recharge",
           text: "上账",
-          attrs: {
+          attrs: () => ({
             type: "success",
             icon: "Plus",
-          },
+            disabled: isSfUser.value,
+          }),
         },
         {
           name: "deduct",
           text: "下账",
-          attrs: {
+          attrs: () => ({
             type: "warning",
             icon: "Minus",
-          },
+            disabled: isSfUser.value,
+          }),
         },
         {
           name: "qrCode",
           text: "邀请码",
-          attrs: {
+          attrs: () => ({
             type: "primary",
             icon: "Setting",
-          },
+            disabled: isSfUser.value,
+          }),
           show: (row: any) => row.firmType === 1, // 仅企业类型显示邀请码
         },
-        "edit",
-        "delete",
+        {
+          name: "edit",
+          text: "编辑",
+          attrs: () => ({
+            type: "primary",
+            icon: "edit",
+            disabled: isSfUser.value,
+          }),
+        },
+        {
+          name: "delete",
+          text: "删除",
+          attrs: () => ({
+            type: "danger",
+            icon: "delete",
+            disabled: isSfUser.value,
+          }),
+        },
       ],
     },
   ],
@@ -434,7 +476,7 @@ const contentConfig: IContentConfig<FirmInfoPageQuery> = reactive({
 // 新增配置
 const addModalConfig: IModalConfig<FirmInfoForm> = reactive({
   // 权限前缀
-  permPrefix: "business:firm-info",
+  // permPrefix: "business:firm-info",
   // 主键
   pk: "id",
   // 弹窗配置
@@ -491,7 +533,7 @@ const addModalConfig: IModalConfig<FirmInfoForm> = reactive({
 
 // 编辑配置
 const editModalConfig: IModalConfig<FirmInfoForm> = reactive({
-  permPrefix: "business:firm-info",
+  // permPrefix: "business:firm-info",
   component: "drawer",
   drawer: {
     title: "编辑",

+ 60 - 7
src/views/toBManage/user-firm/index.vue

@@ -72,6 +72,19 @@ defineOptions({ name: "UserFirm" });
 import UserFirmAPI, { UserFirmForm, UserFirmPageQuery } from "@/api/toBManage/user-firm-api";
 import type { IObject, IModalConfig, IContentConfig, ISearchConfig } from "@/components/CURD/types";
 import usePage from "@/components/CURD/usePage";
+import { useUserStore } from "@/store";
+
+// 三方用户角色编码
+const ROLE_SFUSER = "SFUSER";
+
+// 获取用户信息
+const userStore = useUserStore();
+
+// 判断是否为三方用户
+const isSfUser = computed(() => {
+  const roles = userStore.userInfo?.roles;
+  return roles && roles.includes(ROLE_SFUSER);
+});
 
 // 组合式 CRUD
 const {
@@ -100,7 +113,7 @@ const formatMoney = (value: number | undefined | null): string => {
 
 // 搜索配置
 const searchConfig: ISearchConfig = reactive({
-  permPrefix: "business:user-firm",
+  // permPrefix: "business:user-firm",
   formItems: [
     {
       type: "input",
@@ -138,7 +151,7 @@ const searchConfig: ISearchConfig = reactive({
 // 列表配置
 const contentConfig: IContentConfig<UserFirmPageQuery> = reactive({
   // 权限前缀
-  permPrefix: "business:user-firm",
+  // permPrefix: "business:user-firm",
   table: {
     border: true,
     highlightCurrentRow: true,
@@ -163,8 +176,29 @@ const contentConfig: IContentConfig<UserFirmPageQuery> = reactive({
     pageSize: 20,
     pageSizes: [10, 20, 30, 50],
   },
-  // 工具栏配置
-  toolbar: ["add", "delete"],
+  // 工具栏配置 - 三方用户禁用新增和删除按钮
+  toolbar: [
+    {
+      name: "add",
+      text: "新增",
+      perm: "add",
+      attrs: () => ({
+        type: "success",
+        icon: "plus",
+        disabled: isSfUser.value,
+      }),
+    },
+    {
+      name: "delete",
+      text: "删除",
+      perm: "delete",
+      attrs: () => ({
+        type: "danger",
+        icon: "delete",
+        disabled: isSfUser.value,
+      }),
+    },
+  ],
   defaultToolbar: ["refresh", "filter"],
   // 表格列配置
   cols: [
@@ -203,7 +237,26 @@ const contentConfig: IContentConfig<UserFirmPageQuery> = reactive({
       label: "操作",
       prop: "operation",
       templet: "tool",
-      operat: ["edit", "delete"],
+      operat: [
+        {
+          name: "edit",
+          text: "编辑",
+          attrs: () => ({
+            type: "primary",
+            icon: "edit",
+            disabled: isSfUser.value,
+          }),
+        },
+        {
+          name: "delete",
+          text: "删除",
+          attrs: () => ({
+            type: "danger",
+            icon: "delete",
+            disabled: isSfUser.value,
+          }),
+        },
+      ],
     },
   ],
 });
@@ -211,7 +264,7 @@ const contentConfig: IContentConfig<UserFirmPageQuery> = reactive({
 // 新增配置
 const addModalConfig: IModalConfig<UserFirmForm> = reactive({
   // 权限前缀
-  permPrefix: "business:user-firm",
+  // permPrefix: "business:user-firm",
   // 主键
   pk: "id",
   // 弹窗配置
@@ -283,7 +336,7 @@ const addModalConfig: IModalConfig<UserFirmForm> = reactive({
 
 // 编辑配置
 const editModalConfig: IModalConfig<UserFirmForm> = reactive({
-  permPrefix: "business:user-firm",
+  // permPrefix: "business:user-firm",
   component: "drawer",
   drawer: {
     title: "编辑",