瀏覽代碼

fix(bugs): 修改权限控制

tangning 3 年之前
父節點
當前提交
3e864e79e1

+ 19 - 4
src/directives/permission.ts

@@ -9,7 +9,6 @@ import { usePermission } from '/@/hooks/web/usePermission';
 
 function isAuth(el: Element, binding: any) {
   const { hasPermission } = usePermission();
-
   const value = binding.value;
   if (!value) return;
   if (!hasPermission(value)) {
@@ -17,16 +16,32 @@ function isAuth(el: Element, binding: any) {
   }
 }
 
+function isPower(el: Element, binding: any) {
+  const { hasPower } = usePermission();
+  const value = binding.value;
+  if (!value) return;
+  if (!hasPower(value)) {
+    el.parentNode?.removeChild(el);
+  }
+}
+
 const mounted = (el: Element, binding: DirectiveBinding<any>) => {
   isAuth(el, binding);
 };
-
-const authDirective: Directive = {
-  mounted,
+const powermounted = (el: Element, binding: DirectiveBinding<any>) => {
+  isPower(el, binding);
+};
+const authDirective: Directive = (val) => {
+  if (val) {
+    return powermounted;
+  } else {
+    return mounted;
+  }
 };
 
 export function setupPermissionDirective(app: App) {
   app.directive('auth', authDirective);
+  app.directive('power', authDirective);
 }
 
 export default authDirective;

+ 14 - 1
src/hooks/web/usePermission.ts

@@ -80,6 +80,19 @@ export function usePermission() {
     }
     return true;
   }
+  /**
+   * Determine whether there is hasPower
+   */
+  function hasPower(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
+    // Visible by default
+    if (!value) {
+      return def;
+    }
+    if (!isArray(value)) {
+      return userStore.getRoleList?.includes(value as RoleEnum);
+    }
+    return (intersection(value, userStore.getRoleList) as RoleEnum[]).length > 0;
+  }
 
   /**
    * Change roles
@@ -106,5 +119,5 @@ export function usePermission() {
     resume();
   }
 
-  return { changeRole, hasPermission, togglePermissionMode, refreshMenu };
+  return { hasPower, changeRole, hasPermission, togglePermissionMode, refreshMenu };
 }

+ 10 - 1
src/store/modules/user.ts

@@ -67,7 +67,6 @@ export const useUserStore = defineStore({
     },
     setRoleList(roleList: RoleEnum[]) {
       this.roleList = roleList;
-      console.log('roleList', roleList);
       setAuthCache(ROLES_KEY, roleList);
     },
     setUserInfo(info: UserInfo | null) {
@@ -151,6 +150,7 @@ export const useUserStore = defineStore({
               return RoleEnum.HOST;
           }
         }) as RoleEnum[];
+        console.log('roleIdList', roleList);
         this.setRoleList(roleList);
       } else {
         userInfo.roleIdList = [];
@@ -191,6 +191,15 @@ export const useUserStore = defineStore({
         },
       });
     },
+
+    getCheckRole(val): boolean {
+      const roleList = this.roleList;
+      if (roleList.includes(val)) {
+        return true;
+      } else {
+        return false;
+      }
+    },
   },
 });
 

+ 15 - 2
src/views/product/drawer.data.ts

@@ -6,6 +6,7 @@ import { h } from 'vue';
 import { Switch } from 'ant-design-vue';
 import { useMessage } from '/@/hooks/web/useMessage';
 import { Tinymce } from '/@/components/Tinymce/index';
+import { BrandListApi } from '/@/api/order/list';
 
 export const formSchema: FormSchema[] = [
   {
@@ -53,9 +54,21 @@ export const formSchema: FormSchema[] = [
     },
   },
   {
-    field: 'brandName',
+    field: 'brandId',
     label: '直播间',
-    component: 'Input',
+    component: 'ApiSelect',
+    componentProps: {
+      api: BrandListApi,
+      // resultField: 'list',
+      numberToString: true,
+      labelField: 'name',
+      valueField: 'id',
+      immediate: true,
+      params: {
+        page: 1,
+        limit: 1000,
+      },
+    },
     required: true,
   },
   {

+ 122 - 90
src/views/staff/detailsModal.vue

@@ -16,99 +16,11 @@
   import { roleLIstApi, checkUserApi, saveApi, updateApi } from '/@/api/staff/list';
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { ListAllCompanyApi } from '/@/api/corporation/list';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
+  import { useUserStore } from '/@/store/modules/user';
   const { t } = useI18n();
-  const schemas: FormSchema[] = [
-    {
-      field: 'phone',
-      component: 'Input',
-      label: '手机号',
-      colProps: {
-        span: 18,
-      },
-      // helpMessage: '手机号需在指房宝APP注册后才可新增',
-      required: false,
-      rules: [
-        {
-          required: true,
-          // @ts-ignore
-          validator: async (rule, value) => {
-            var reg_tel =
-              /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
-            // var reg = /\S+@\S+\.\S+/;
-            if (!value) {
-              return Promise.reject(t('common.phone'));
-            }
-            if (!reg_tel.test(value)) {
-              /* eslint-disable-next-line */
-              return Promise.reject(t('common.phoneError'));
-            }
-            try {
-              let res = await checkUserApi({ phone: value });
-              console.log('res', res);
-              if (res == true) {
-                return Promise.resolve();
-              } else {
-                return Promise.reject('手机号未在指房宝APP中进行注册');
-              }
-            } catch (err) {
-              return Promise.reject(err);
-            }
-          },
-          trigger: 'change',
-        },
-      ],
-    },
-    {
-      field: 'nickName',
-      component: 'Input',
-      label: '员工名称',
-      required: true,
-      colProps: {
-        span: 22,
-      },
-      componentProps: {
-        maxLength: 25,
-      },
-    },
-    {
-      field: 'roleId',
-      component: 'ApiRadioGroup',
-      label: '角色',
-      required: true,
-      itemProps: {
-        validateTrigger: 'blur',
-      },
-      componentProps: {
-        api: roleLIstApi,
-        labelField: 'roleName',
-        valueField: 'roleId',
-      },
-    },
-    // {
-    //   field: 'status',
-    //   label: '状态',
-    //   component: 'RadioButtonGroup',
-    //   required: true,
-    //   defaultValue: 1,
-    //   itemProps: {
-    //     validateTrigger: 'blur',
-    //   },
-    //   componentProps: {
-    //     options: [
-    //       { label: '是', value: 1 },
-    //       { label: '否', value: 0 },
-    //     ],
-    //   },
-    // },
-    {
-      field: 'id',
-      component: 'Input',
-      label: 'id',
-      show: false,
-    },
-  ];
   export default defineComponent({
     components: { BasicModal, BasicForm },
     props: {
@@ -117,6 +29,126 @@
     emits: ['ok'],
     setup(_, context) {
       const modelRef = ref({});
+      const userStore = useUserStore();
+      const { getCheckRole } = userStore;
+      const schemas: FormSchema[] = [
+        {
+          field: 'phone',
+          component: 'Input',
+          label: '手机号',
+          colProps: {
+            span: 18,
+          },
+          // helpMessage: '手机号需在指房宝APP注册后才可新增',
+          required: false,
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                var reg_tel =
+                  /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
+                // var reg = /\S+@\S+\.\S+/;
+                if (!value) {
+                  return Promise.reject(t('common.phone'));
+                }
+                if (!reg_tel.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject(t('common.phoneError'));
+                }
+                try {
+                  let res = await checkUserApi({ phone: value });
+                  console.log('res', res);
+                  if (res == true) {
+                    return Promise.resolve();
+                  } else {
+                    return Promise.reject('手机号未在指房宝APP中进行注册');
+                  }
+                } catch (err) {
+                  return Promise.reject(err);
+                }
+              },
+              trigger: 'change',
+            },
+          ],
+        },
+        {
+          field: 'nickName',
+          component: 'Input',
+          label: '员工名称',
+          required: true,
+          colProps: {
+            span: 22,
+          },
+          componentProps: {
+            maxLength: 25,
+          },
+        },
+        {
+          field: 'companyId',
+          label: '公司',
+          component: 'ApiSelect',
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 22,
+          },
+          required: true,
+          ifShow: getCheckRole('plat_admin'),
+          componentProps: {
+            api: ListAllCompanyApi,
+            resultField: 'list',
+            labelField: 'name',
+            valueField: 'id',
+            immediate: true,
+            onChange: function () {
+              // Reflect.set(modalRecord, 'shippingName', opt.label);
+            },
+            params: {
+              page: 1,
+              limit: 1000,
+            },
+            required: true,
+          },
+        },
+        {
+          field: 'roleId',
+          component: 'ApiRadioGroup',
+          label: '角色',
+          required: true,
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          componentProps: {
+            api: roleLIstApi,
+            labelField: 'roleName',
+            valueField: 'roleId',
+          },
+        },
+        // {
+        //   field: 'status',
+        //   label: '状态',
+        //   component: 'RadioButtonGroup',
+        //   required: true,
+        //   defaultValue: 1,
+        //   itemProps: {
+        //     validateTrigger: 'blur',
+        //   },
+        //   componentProps: {
+        //     options: [
+        //       { label: '是', value: 1 },
+        //       { label: '否', value: 0 },
+        //     ],
+        //   },
+        // },
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+      ];
       const title = ref('新 增');
       const { createMessage } = useMessage();
       const [registerForm, { setFieldsValue, validate, resetFields }] = useForm({

+ 6 - 5
src/views/staff/list.vue

@@ -2,10 +2,7 @@
   <div class="p-4">
     <BasicTable @register="registerTable">
       <template #toolbar>
-        <a-button
-          v-auth="[RoleEnum.SUPER, RoleEnum.PLAT_ADMIN]"
-          type="primary"
-          @click="handleCreate"
+        <a-button v-power="[RoleEnum.COMPANY_ADMIN]" type="primary" @click="handleCreate"
           >新增</a-button
         >
       </template>
@@ -52,7 +49,7 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
+  import { defineComponent, computed } from 'vue';
   import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useModal } from '/@/components/Modal';
@@ -68,6 +65,7 @@
   import { RoleEnum } from '/@/enums/roleEnum';
   import { useGo } from '/@/hooks/web/usePage';
   import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
   export default defineComponent({
     components: { BasicTable, TableAction, Time, SetpaswordModal, DetailsModal, DelListModal },
     setup() {
@@ -75,6 +73,9 @@
       const [registerDetail, { openModal: openDetaileModal }] = useModal();
       const [registerDelList, { openModal: openDelListeModal }] = useModal();
       const { createConfirm, createMessage } = useMessage();
+      const userStore = useUserStore();
+      const roleList = computed(() => userStore.getRoleList);
+      console.log('getRoleList', roleList);
       const go = useGo();
       const { t } = useI18n();
       const columns: BasicColumn[] = [