فهرست منبع

fix(相机): list

tangning 3 سال پیش
والد
کامیت
1fa64487d2

+ 1 - 1
src/api/sys/menu.ts

@@ -2,7 +2,7 @@ import { defHttp } from '/@/utils/http/axios';
 import { getMenuListResultModel } from './model/menuModel';
 
 enum Api {
-  GetMenuList = '/getMenuList',
+  GetMenuList = '/newV4/service/manage/sysMenu/getByUserId',
 }
 
 /**

+ 2 - 2
src/api/sys/system.ts

@@ -28,7 +28,7 @@ enum Api {
   MenuList = '/newV4/service/manage/sysMenu/list',
   saveMenu = '/newV4/service/manage/sysMenu/add',
   updateMenu = '/newV4/service/manage/sysMenu/update',
-  deleteMenu = '/zfb-api/zfb/shop/sys/menu/delete',
+  deleteMenu = '/newV4/service/manage/sysMenu/delete',
   MenuUser = '/zfb-api/zfb/shop/sys/menu/delete',
   getByRoleId = '/newV4/service/manage/sysMenu/getByRoleId',
 
@@ -90,7 +90,7 @@ export const saveMenuApi = (params?: MenuParams) =>
 export const updateMenuApi = (params?: MenuParams) =>
   defHttp.post<MenuListGetResultModel>({ url: Api.updateMenu, params });
 
-export const deleteMenuApi = (params?: (string | number)[]) =>
+export const deleteMenuApi = (params: deleteRoleParams) =>
   defHttp.post<MenuListGetResultModel>({ url: Api.deleteMenu, params });
 
 //roles

+ 3 - 2
src/api/sys/user.ts

@@ -2,13 +2,14 @@ import { defHttp } from '/@/utils/http/axios';
 import { LoginParams, LoginResultModel, GetUserInfoModel } from './model/userModel';
 import { encodeStr } from '/@/utils/encodeUtil';
 import { ErrorMessageMode } from '/#/axios';
+import type { AppRouteRecordRaw } from '/@/router/types';
 
 enum Api {
   // Login = '/basic-api/login',
   Login = '/newV4/service/manage/login',
   Logout = '/basic-api/logout',
   GetUserInfo = '/newV4/service/manage/sysUser/getInfo',
-  GetPermCode = '/getPermCode',
+  GetPermCode = '/newV4/service/manage/sysMenu/getButtonByUserId',
 }
 
 /**
@@ -38,7 +39,7 @@ export function getUserInfo() {
 }
 
 export function getPermCode() {
-  return defHttp.get<string[]>({ url: Api.GetPermCode });
+  return defHttp.get<AppRouteRecordRaw[]>({ url: Api.GetPermCode });
 }
 
 export function doLogout() {

+ 1 - 1
src/enums/pageEnum.ts

@@ -2,7 +2,7 @@ export enum PageEnum {
   // basic login path
   BASE_LOGIN = '/login',
   // basic home path
-  BASE_HOME = '/dashboard',
+  BASE_HOME = '/account/lists',
   // error page path
   ERROR_PAGE = '/exception',
   // error log page path

+ 1 - 0
src/layouts/default/menu/index.vue

@@ -140,6 +140,7 @@
 
       function renderMenu() {
         const { menus, ...menuProps } = unref(getCommonProps);
+        console.log('getCommonProps',getCommonProps)
         // console.log(menus);
         if (!menus || !menus.length) return null;
         return !props.isHorizontal ? (

+ 1 - 1
src/router/helper/menuHelper.ts

@@ -17,7 +17,7 @@ function joinParentPath(menus: Menu[], parentPath = '') {
     // https://next.router.vuejs.org/guide/essentials/nested-routes.html
     // Note that nested paths that start with / will be treated as a root path.
     // This allows you to leverage the component nesting without having to use a nested URL.
-    if (!(menu.path.startsWith('/') || isUrl(menu.path))) {
+    if (menu.path && !(menu.path.startsWith('/') || isUrl(menu.path))) {
       // path doesn't start with /, nor is it a url, join parent path
       menu.path = `${parentPath}/${menu.path}`;
     }

+ 6 - 1
src/router/helper/routeHelper.ts

@@ -51,7 +51,7 @@ function dynamicImport(
     const endFlag = component.endsWith('.vue') || component.endsWith('.tsx');
     const startIndex = startFlag ? 0 : 1;
     const lastIndex = endFlag ? k.length : k.lastIndexOf('.');
-    return k.substring(startIndex, lastIndex) === component;
+  return k.substring(startIndex, lastIndex) === component;
   });
   if (matchKeys?.length === 1) {
     const matchKey = matchKeys[0];
@@ -74,12 +74,16 @@ export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModul
     if (component) {
       if (component.toUpperCase() === 'LAYOUT') {
         route.component = LayoutMap.get(component.toUpperCase());
+        const meta = route.meta || {};
+        meta.orderNo = route.sort
+        route.meta = meta;
       } else {
         route.children = [cloneDeep(route)];
         route.component = LAYOUT;
         route.name = `${route.name}Parent`;
         route.path = '';
         const meta = route.meta || {};
+        meta.orderNo = route.sort
         meta.single = true;
         meta.affix = false;
         route.meta = meta;
@@ -89,6 +93,7 @@ export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModul
     }
     route.children && asyncImportRoute(route.children);
   });
+  console.log('transformObjToRoute2',routeList)
   return routeList as unknown as T[];
 }
 

+ 16 - 34
src/router/routes/modules/account.ts

@@ -5,7 +5,7 @@ import { LAYOUT } from '/@/router/constant';
 export const accountRoute: AppRouteRecordRaw = {
   path: '/account',
   name: 'Account',
-  redirect: '/account/user',
+  redirect: '/account/lists',
   component: LAYOUT,
   meta: {
     title: t('routes.dashboard.account'),
@@ -14,44 +14,26 @@ export const accountRoute: AppRouteRecordRaw = {
   },
   children: [
     {
-      path: 'user',
-      name: 'User',
-      component: () => import('/@/views/staff/list.vue'),
+      path: 'lists',
+      name: 'Lists',
+      // component: () => import('/@/views/account/details/index.vue'),
+      component: () => import('/@/views/account/lists.vue'),
       meta: {
         title: t('routes.dashboard.account'),
+        icon:'carbon:user-profile-alt',
         hideChildrenInMenu: true,
       },
     },
-    // {
-    //   path: 'details',
-    //   name: 'Details',
-    //   component: () => import('/@/views/account/details/index.vue'),
-    //   meta: {
-    //     title: t('routes.dashboard.details'),
-    //     hideChildrenInMenu: true,
-    //     hideMenu: true,
-    //   },
-    // },
-    // {
-    //   path: 'overview',
-    //   name: 'Overview',
-    //   component: () => import('/@/views/account/overview/index.vue'),
-    //   meta: {
-    //     title: t('routes.dashboard.overview'),
-    //     hideChildrenInMenu: true,
-    //     hideMenu: true,
-    //   },
-    // },
-    // {
-    //   path: 'product',
-    //   name: 'Product',
-    //   component: () => import('/@/views/account/product/index.vue'),
-    //   meta: {
-    //     title: t('routes.dashboard.productData'),
-    //     hideChildrenInMenu: true,
-    //     hideMenu: true,
-    //   },
-    // },
+    {
+      path: 'details',
+      name: 'Details',
+      component: () => import('/@/views/account/details/index.vue'),
+      meta: {
+        title: t('routes.dashboard.details'),
+        hideChildrenInMenu: true,
+        // hideMenu: true,
+      },
+    },
   ],
 };
 export default accountRoute;

+ 16 - 0
src/router/routes/modules/device.ts

@@ -0,0 +1,16 @@
+import type { AppRouteRecordRaw } from '/@/router/types';
+import { t } from '/@/hooks/web/useI18n';
+import { LAYOUT } from '/@/router/constant';
+
+export const ProductRoute: AppRouteRecordRaw = {
+  path: '/device',
+  name: 'Device',
+  meta: {
+    title: t('routes.dashboard.devices'),
+    icon: 'la:file-invoice-dollar',
+    orderNo: 90,
+  },      
+  component: () => import('/@/views/device/index.vue'),
+
+};
+export default ProductRoute;

+ 1 - 1
src/router/routes/modules/invoice.ts

@@ -17,7 +17,7 @@ export const InvoiceRoute: AppRouteRecordRaw = {
     {
       path: 'list',
       name: 'List',
-      component: () => import('../../../views/invoice/index.vue'),
+      component: () => import('/@/views/invoice/index.vue'),
       meta: {
         title: t('routes.dashboard.invoice'),
       },

+ 1 - 1
src/router/routes/modules/order.ts

@@ -9,7 +9,7 @@ const order: AppRouteModule = {
   component: LAYOUT,
   redirect: '/order/camera',
   meta: {
-    icon: 'bi:columns',
+    icon: 'fluent:re-order-dots-horizontal-16-filled',
     title: t('routes.dashboard.orderList'),
     orderNo: 108,
   },

+ 3 - 3
src/router/routes/modules/productOperation.ts

@@ -20,7 +20,7 @@ export const productOperation: AppRouteRecordRaw = {
       component: () => import('/@/views/productOperation/cameraScene.vue'),
       meta: {
         title: t('routes.dashboard.cameraScene'),
-        // icon: 'la:file-invoice-dollar',
+        icon: 'material-symbols:scene-outline',
       },
       // children: [
       //   {
@@ -67,7 +67,7 @@ export const productOperation: AppRouteRecordRaw = {
       component: () => import('/@/views/productOperation/sxz.vue'),
       meta: {
         title: t('routes.dashboard.sxz'),
-        // icon: 'la:file-invoice-dollar',
+        icon: 'icon-park-outline:projector-two',
       },
     },
     {
@@ -76,7 +76,7 @@ export const productOperation: AppRouteRecordRaw = {
       component: () => import('/@/views/productOperation/viewKankan.vue'),
       meta: {
         title: t('routes.dashboard.viewKankan'),
-        // icon: 'la:file-invoice-dollar',
+        icon: 'fa6-solid:panorama',
       },
     },
   ],

+ 3 - 0
src/router/types.ts

@@ -16,6 +16,9 @@ export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
   children?: AppRouteRecordRaw[];
   props?: Recordable;
   fullPath?: string;
+  sort?: number;
+  orderNo?: number;
+  type?: number;
 }
 
 export interface MenuTag {

+ 1 - 1
src/settings/projectSetting.ts

@@ -24,7 +24,7 @@ const setting: ProjectConfig = {
   settingButtonPosition: SettingButtonPositionEnum.AUTO,
 
   // Permission mode
-  permissionMode: PermissionModeEnum.ROUTE_MAPPING,
+  permissionMode: PermissionModeEnum.BACK,
 
   // Permission-related cache is stored in sessionStorage or localStorage
   permissionCacheType: CacheTypeEnum.LOCAL,

+ 21 - 7
src/store/modules/permission.ts

@@ -20,13 +20,14 @@ import { filter } from '/@/utils/helper/treeHelper';
 
 import { getMenuList } from '/@/api/sys/menu';
 import { getPermCode } from '/@/api/sys/user';
-
+import { isArray } from '/@/utils/is';
 import { useMessage } from '/@/hooks/web/useMessage';
 import { PageEnum } from '/@/enums/pageEnum';
+import { intersection } from 'lodash-es';
 
 interface PermissionState {
   // Permission code list
-  permCodeList: string[] | number[];
+  permCodeList: string[] ;
   // Whether the route has been dynamically added
   isDynamicAddedRoute: boolean;
   // To trigger a menu update
@@ -69,7 +70,17 @@ export const usePermissionStore = defineStore({
     setPermCodeList(codeList: string[]) {
       this.permCodeList = codeList;
     },
-
+    getCheckPerm(value:string|string[]): boolean{
+      const permCodeList = this.permCodeList;
+      console.log('permCodeList',permCodeList,value,permCodeList?.includes(value))
+      if (!value) {
+        return false;
+      }
+      if (!isArray(value)) {
+        return permCodeList?.includes(value);
+      }
+      return (intersection(value, permCodeList)).length > 0;
+    },
     setBackMenuList(list: Menu[]) {
       this.backMenuList = list;
       list?.length > 0 && this.setLastBuildMenuTime();
@@ -94,7 +105,8 @@ export const usePermissionStore = defineStore({
     },
     async changePermissionCode() {
       const codeList = await getPermCode();
-      this.setPermCodeList(codeList);
+      const permsList = codeList.map(ele => ele.perms)
+      this.setPermCodeList(permsList);
     },
     async buildRoutesAction(): Promise<AppRouteRecordRaw[]> {
       const { t } = useI18n();
@@ -184,15 +196,17 @@ export const usePermissionStore = defineStore({
           // this function may only need to be executed once, and the actual project can be put at the right time by itself
           let routeList: AppRouteRecordRaw[] = [];
           try {
-            this.changePermissionCode();
             routeList = (await getMenuList()) as AppRouteRecordRaw[];
+            this.changePermissionCode();
           } catch (error) {
             console.error(error);
           }
 
           // Dynamically introduce components
           routeList = transformObjToRoute(routeList);
-
+          routeList.sort((a, b) => {
+            return (a.sort || 0) - (b.sort || 0);
+          });
           //  Background routing to menu structure
           const backMenuList = transformRouteToMenu(routeList);
           this.setBackMenuList(backMenuList);
@@ -200,8 +214,8 @@ export const usePermissionStore = defineStore({
           // remove meta.ignoreRoute item
           routeList = filter(routeList, routeRemoveIgnoreFilter);
           routeList = routeList.filter(routeRemoveIgnoreFilter);
-
           routeList = flatMultiLevelRoutes(routeList);
+
           routes = [PAGE_NOT_FOUND_ROUTE, ...routeList];
           break;
       }

+ 0 - 3
src/utils/http/axios/index.ts

@@ -52,7 +52,6 @@ const transform: AxiosTransform = {
 
     // 这里逻辑可以根据项目进行修改
     const hasSuccess = data && Reflect.has(data, 'code') && code === ResultEnum.SUCCESS;
-    console.log('hasSuccess',hasSuccess,code,'data',data)
     if (hasSuccess) {
       return result ||  data.data;
     }
@@ -87,11 +86,9 @@ const transform: AxiosTransform = {
   // 请求之前处理config
   beforeRequestHook: (config, options) => {
     const { apiUrl, joinPrefix, joinParamsToUrl, formatDate, joinTime = true, urlPrefix } = options;
-    console.log('urlPrefix',joinPrefix,options)
     if (joinPrefix) {
       config.url = `${urlPrefix}${config.url}`;
     }
-    console.log('urlPrefix',apiUrl,config)
     if (apiUrl && isString(apiUrl)) {
       config.url = `${apiUrl}${config.url}`;
     }

+ 0 - 1
src/utils/treeUtils.ts

@@ -70,7 +70,6 @@ export function getTreeId(treeNodes: TreeMenuNode[]): number[] {
 }
 
 export function makeMenuTree(treeNodes: TreeMenuNode[]): TreeMenuNode[] {
-  console.log('makeMenuTree',treeNodes)
   const nodesMap = new Map<number, TreeMenuNode>(treeNodes.map((node) => [node.menuId, node]));
 
   // 引入虚拟根节点来统一实现 parent 始终有效,避免空判断

+ 0 - 134
src/views/account/index.vue

@@ -1,134 +0,0 @@
-<template>
-      <BasicTable @register="registerTimeTable">
-        <template #action="{ record }">
-          <TableAction
-            :actions="[
-              {
-                label: '详情',
-                icon: 'mdi:account-details',
-                onClick: handleEdit.bind(null, record),
-              }
-            ]"
-          />
-        </template>
-      </BasicTable>
-</template>
-<script lang="ts">
-import { defineComponent } from 'vue';
-import { BasicTable, useTable, FormProps, TableAction } from '/@/components/Table';
-import { PageWrapper } from '/@/components/Page';
-import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
-import { ListApi } from '/@/api/account';
-import { userListSchema } from './data';
-import { useModal } from '/@/components/Modal';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { useRouter } from 'vue-router'
-import { otherInfoStore } from '/@/store/modules/other'
-// import { useMessage } from '/@/hooks/web/useMessage';
-export default defineComponent({
-  components: {
-    BasicTable,
-    TableAction,
-    PageWrapper,
-    [Divider.name]: Divider,
-    [Card.name]: Card,
-    Empty,
-    [Descriptions.name]: Descriptions,
-    [Descriptions.Item.name]: Descriptions.Item,
-    [Steps.name]: Steps,
-    [Steps.Step.name]: Steps.Step,
-    [Tabs.name]: Tabs,
-    [Tabs.TabPane.name]: Tabs.TabPane,
-  },
-  setup() {
-    const { t } = useI18n();
-    const [registerAddModal, { openModal: openAddModal }] = useModal();
-    const [registerEditModal, { openModal: openEditModal }] = useModal();
-    const { setOverviewInfo } = otherInfoStore();
-    // const { createMessage } = useMessage(); 
-    const router = useRouter()
-    const searchForm: Partial<FormProps> = {
-      labelWidth: 100,
-      schemas: [
-        {
-          field: 'userName',
-          label: '用户账号',
-          component: 'Input',
-          componentProps: {
-            maxLength: 100,
-          },
-          colProps: {
-            xl: 6,
-            xxl: 6,
-          },
-        },{
-          field: 'email',
-          label: '用户邮箱',
-          component: 'Input',
-          componentProps: {
-            maxLength: 100,
-          },
-          colProps: {
-            xl: 8,
-            xxl: 8,
-          },
-        }
-      ],
-    };
-    const [registerTimeTable, { reload }] = useTable({
-      api: ListApi,
-      title: '用户列表',
-      columns: userListSchema,
-      useSearchForm: true,
-      formConfig: searchForm,
-      showTableSetting: true,
-      showIndexColumn:false,
-      rowKey: 'id',
-      fetchSetting: {
-        pageField: 'pageNum',
-        sizeField: 'pageSize',
-        listField: 'list',
-        totalField: 'total',
-      },
-      actionColumn: {
-        width: 100,
-        title: '操作',
-        dataIndex: 'action',
-        slots: { customRender: 'action' },
-      },
-      canResize: false,
-    });
-    function tabChange(val: string) {
-      console.log('tabChange', val);
-      reload();
-    }
-    function handleOpen(record: Recordable) {
-      console.log('点击了启用', record);
-    }
-    function handleEdit(record: Recordable) {
-      console.log('record', record);
-      setOverviewInfo(record)
-      router.push({path:'details'})
-    }
-    return {
-      registerTimeTable,
-      handleOpen,
-      tabChange,
-      reload,
-      registerAddModal,
-      registerEditModal,
-      openAddModal,
-      handleEdit,
-      t,
-    };
-  },
-});
-</script>
-<style lang="less" scoped>
-.desc-wrap-BasicTable {
-  background-color: #f0f2f5;
-  .vben-basic-table-form-container {
-    padding: 0;
-  }
-}
-</style>

+ 126 - 0
src/views/account/lists.vue

@@ -0,0 +1,126 @@
+<template>
+  <BasicTable @register="registerTimeTable">
+    <template #action="{ record }">
+      <TableAction
+        :actions="[
+          {
+            label: '详情',
+            icon: 'mdi:account-details',
+            onClick: handleEdit.bind(null, record),
+          }
+        ]"
+      />
+    </template>
+  </BasicTable>
+</template>
+<script lang="ts">
+import { defineComponent } from 'vue';
+import { BasicTable, useTable, FormProps, TableAction } from '/@/components/Table';
+import { PageWrapper } from '/@/components/Page';
+import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
+import { ListApi } from '/@/api/account';
+import { userListSchema } from './data';
+import { useI18n } from '/@/hooks/web/useI18n';
+import { useRouter } from 'vue-router'
+import { otherInfoStore } from '/@/store/modules/other'
+export default defineComponent({
+components: {
+BasicTable,
+TableAction,
+PageWrapper,
+[Divider.name]: Divider,
+[Card.name]: Card,
+Empty,
+[Descriptions.name]: Descriptions,
+[Descriptions.Item.name]: Descriptions.Item,
+[Steps.name]: Steps,
+[Steps.Step.name]: Steps.Step,
+[Tabs.name]: Tabs,
+[Tabs.TabPane.name]: Tabs.TabPane,
+},
+setup() {
+const { t } = useI18n();
+const { setOverviewInfo } = otherInfoStore();
+const router = useRouter()
+const searchForm: Partial<FormProps> = {
+  labelWidth: 100,
+  schemas: [
+    {
+      field: 'userName',
+      label: '用户账号',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 6,
+        xxl: 6,
+      },
+    },{
+      field: 'email',
+      label: '用户邮箱',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 8,
+        xxl: 8,
+      },
+    }
+  ],
+};
+const [registerTimeTable, { reload }] = useTable({
+  api: ListApi,
+  title: '用户列表',
+  columns: userListSchema,
+  useSearchForm: true,
+  formConfig: searchForm,
+  showTableSetting: true,
+  showIndexColumn:false,
+  rowKey: 'id',
+  fetchSetting: {
+    pageField: 'pageNum',
+    sizeField: 'pageSize',
+    listField: 'list',
+    totalField: 'total',
+  },
+  actionColumn: {
+    width: 100,
+    title: '操作',
+    dataIndex: 'action',
+    slots: { customRender: 'action' },
+  },
+  canResize: false,
+});
+function tabChange(val: string) {
+  console.log('tabChange', val);
+  reload();
+}
+function handleOpen(record: Recordable) {
+  console.log('点击了启用', record);
+}
+function handleEdit(record: Recordable) {
+  console.log('record', record);
+  setOverviewInfo(record)
+  router.push({path:'details'})
+}
+return {
+  registerTimeTable,
+  handleOpen,
+  tabChange,
+  reload,
+  handleEdit,
+  t,
+};
+},
+});
+</script>
+<style lang="less" scoped>
+.desc-wrap-BasicTable {
+background-color: #f0f2f5;
+.vben-basic-table-form-container {
+padding: 0;
+}
+}
+</style>

+ 8 - 5
src/views/account/overview/index.vue

@@ -20,22 +20,22 @@
             <div class="lable">权益数量</div>
             <div class="value">
               <div class="text">{{overviewInfo.incrementCount}}个</div>              
-              <Button type="primary" size="small" @click="openInteresModal(true)"> 权益详情 </Button>
-              <Button type="primary" size="small" @click="handleAddEquity('equity')"> 新增权益 </Button>
+              <Button type="primary" v-if="getCheckPerm('account-equityDetails')" size="small" @click="openInteresModal(true)"> 权益详情 </Button>
+              <Button type="primary" v-if="getCheckPerm('increment-add')" size="small" @click="handleAddEquity('equity')"> 新增权益 </Button>
             </div>
           </div>
           <div class="list_item">
             <div class="lable">剩余下载次数</div>
             <div class="value">
               <div class="text">{{overviewInfo.surDownNum}}次</div>              
-              <Button type="primary" size="small"  @click="handleAddEquity('down')"> 新增下载 </Button>
+              <Button type="primary" size="small" v-if="getCheckPerm('download-add')" @click="handleAddEquity('down')"> 新增下载 </Button>
             </div>
           </div>
           <div class="list_item">
             <div class="lable">相机数量</div>
             <div class="value">
               <div class="text">{{overviewInfo.cameraCount}}台</div>              
-              <Button type="primary" size="small" @click="openCaremModal(true)"> 查看详情 </Button>
+              <Button type="primary" size="small" v-if="getCheckPerm('account-cameraDetails')" @click="openCaremModal(true)"> 查看详情 </Button>
             </div>
           </div>
           <div class="list_item">
@@ -64,6 +64,7 @@
   import caremModal from './caremModal.vue';
   import interesModal from './interesModal.vue';
   import { useModal } from '/@/components/Modal';
+  import { usePermissionStore } from '/@/store/modules/permission';
 
   import {
     refundSchema,
@@ -79,7 +80,8 @@
       const [registerInteres, { openModal: openInteresModal }] = useModal();
       const [registerCarem, { openModal: openCaremModal }] = useModal();
       const overviewInfo = computed(() => otherInfo.getOverviewInfo);
-      console.log('overviewInfo',overviewInfo.value)
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
       function handleAddEquity(type:string){
         openAddModal(true, {
           ...overviewInfo.value,
@@ -105,6 +107,7 @@
         overviewInfo,
         handleAddEquity,
         handleSetEquity,
+        getCheckPerm,
       };
     },
   });

+ 10 - 30
src/views/account/product/index.vue

@@ -18,6 +18,7 @@
               {
                 label: '删除',
                 color: 'error',
+                ifShow:getCheckPerm('account-productDelete'),
                 popConfirm: {
                   title: '是否删除?',
                   confirm: handleDelete.bind(null, record),
@@ -35,6 +36,7 @@
             :actions="[
               {
                 label: '迁移',
+                ifShow:getCheckPerm('account-productTransfer'),
                 onClick: handleMove.bind(null, record),
               },
               {
@@ -42,11 +44,13 @@
                 disabled:
                   (record.payStatus - 0 != 1 && record.status - 0 == 0) ||
                   (record.payStatus - 0 != 1 && record.status - 0 == -1),
+                ifShow:getCheckPerm('account-productDownload'),
                 onClick: handleDownload.bind(null, record),
               },
               {
                 label: '重算',
                 disabled: record.payStatus != 1 && record.status - 0 == 0,
+                ifShow:getCheckPerm('account-productRerun'),
                 popConfirm: {
                   title: '是否重算?',
                   confirm: handleReset.bind(null, record),
@@ -57,6 +61,7 @@
                 disabled:
                   (record.payStatus != 1 && record.status - 0 == 0) ||
                   (record.payStatus != 1 && record.status - 0 == -1),
+                ifShow:getCheckPerm('account-productCopy'),
                 popConfirm: {
                   title: '是否复制?',
                   confirm: handleCopy.bind(null, record),
@@ -65,6 +70,7 @@
               {
                 label: '删除',
                 color: 'error',
+                ifShow:getCheckPerm('account-productDelete'),
                 popConfirm: {
                   title: '是否删除?',
                   confirm: handleDelete.bind(null, record),
@@ -105,6 +111,7 @@
   import { useMessage } from '/@/hooks/web/useMessage';
   import { columns,searchForm,cameraScene,cameraSearchForm} from './data'
   import { useModal } from '/@/components/Modal';
+  import { usePermissionStore } from '/@/store/modules/permission';
   import {
     operateSceneList,
     sceneMove,
@@ -135,10 +142,11 @@
       const { createMessage, createConfirm } = useMessage();
       const timer = ref<NodeJS.Timeout | number | undefined | null>(null);
       const tableType = ref<number>(0); //0看看 、1看见、2深时
-      const tabList = ref<string[]>(['四维看看', '四维看见', '四维双目深时', '四维双目Lite']);
       function cancelDownload() {
         downloadOption.value = {};
       }
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
       const [registerDownModal, { openModal: openDownModal }] = useModal();
       const [registerMoveModal, { openModal: openMoveModal }] = useModal();
       const [registerTableViewKankan, { reload:ViewReload }] = useTable({
@@ -221,24 +229,11 @@
               content: '删除失败',
             });
           });
-        //   },
-        // });
       }
       async function handleMove(record: Recordable) {
         openMoveModal(true, {
           ...record,
         });
-        // sceneMove({ snCode: record.snCode, num: record.num })
-        //   .then(() => {
-        //     message.success({
-        //       content: '迁移成功',
-        //     });
-        //   })
-        //   .catch(() => {
-        //     message.success({
-        //       content: '迁移失败',
-        //     });
-        //   });
       }
       // const timer = ref<NodeJS.Timeout | null = null>(null); //0看看 、1看见、2深时
       const downloadOption = ref<Object>({});
@@ -312,27 +307,12 @@
         downloadOption,
         cancelDownload,
         ViewReload,
+        getCheckPerm,
       };
     },
   });
 </script>
 <style lang="less" scoped>
-  // .tableHeader {
-  //   height: 50px;
-  //   display: flex;
-  //   align-items: center;
-
-  //   .item {
-  //     font-size: 14px;
-  //     color: #666;
-  //     margin-right: 10px;
-  //     cursor: pointer;
-  //     &.active {
-  //       font-weight: bold;
-  //       color: #222;
-  //     }
-  //   }
-  // }
   .desc-wrap-BasicTable {
     background-color: #f0f2f5;
     .vben-basic-table-form-container {

+ 121 - 0
src/views/account/user/index.vue

@@ -0,0 +1,121 @@
+<template>
+  <BasicTable @register="registerTimeTable">
+    <template #action="{ record }">
+      <TableAction
+        :actions="[
+          {
+            label: '详情',
+            icon: 'mdi:account-details',
+            onClick: handleEdit.bind(null, record),
+          }
+        ]"
+      />
+    </template>
+  </BasicTable>
+</template>
+<script lang="ts">
+import { defineComponent } from 'vue';
+import { BasicTable, useTable, FormProps, TableAction } from '/@/components/Table';
+import { PageWrapper } from '/@/components/Page';
+import { Divider, Card, Empty, Descriptions, Steps, Tabs } from 'ant-design-vue';
+import { ListApi } from '/@/api/account';
+import { userListSchema } from '../data';
+import { useI18n } from '/@/hooks/web/useI18n';
+import { useRouter } from 'vue-router'
+import { otherInfoStore } from '/@/store/modules/other'
+export default defineComponent({
+components: {
+BasicTable,
+TableAction,
+PageWrapper,
+[Divider.name]: Divider,
+[Card.name]: Card,
+Empty,
+[Descriptions.name]: Descriptions,
+[Descriptions.Item.name]: Descriptions.Item,
+[Steps.name]: Steps,
+[Steps.Step.name]: Steps.Step,
+[Tabs.name]: Tabs,
+[Tabs.TabPane.name]: Tabs.TabPane,
+},
+setup() {
+const { t } = useI18n();
+const { setOverviewInfo } = otherInfoStore();
+const router = useRouter()
+const searchForm: Partial<FormProps> = {
+  labelWidth: 100,
+  schemas: [
+    {
+      field: 'userName',
+      label: '用户账号',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 6,
+        xxl: 6,
+      },
+    },{
+      field: 'email',
+      label: '用户邮箱',
+      component: 'Input',
+      componentProps: {
+        maxLength: 100,
+      },
+      colProps: {
+        xl: 8,
+        xxl: 8,
+      },
+    }
+  ],
+};
+const [registerTimeTable, { reload }] = useTable({
+  api: ListApi,
+  title: '用户列表',
+  columns: userListSchema,
+  useSearchForm: true,
+  formConfig: searchForm,
+  showTableSetting: true,
+  showIndexColumn:false,
+  rowKey: 'id',
+  fetchSetting: {
+    pageField: 'pageNum',
+    sizeField: 'pageSize',
+    listField: 'list',
+    totalField: 'total',
+  },
+  actionColumn: {
+    width: 100,
+    title: '操作',
+    dataIndex: 'action',
+    slots: { customRender: 'action' },
+  },
+  canResize: false,
+});
+function handleOpen(record: Recordable) {
+  console.log('点击了启用', record);
+}
+function handleEdit(record: Recordable) {
+  console.log('record', record);
+  setOverviewInfo(record)
+  router.push({path:'details'})
+}
+return {
+  registerTimeTable,
+  handleOpen,
+  reload,
+  handleEdit,
+  t,
+};
+},
+});
+</script>
+<style lang="less" scoped>
+.desc-wrap-BasicTable {
+background-color: #f0f2f5;
+.vben-basic-table-form-container {
+padding: 0;
+}
+}
+</style>

+ 1 - 5
src/views/customer/device.vue

@@ -34,12 +34,9 @@
     FormProps,
   } from '/@/components/Table';
   import { PageWrapper } from '/@/components/Page';
-  import { Time } from '/@/components/Time';
   import { Descriptions } from 'ant-design-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { cameraList } from '/@/api/customer';
-  import { message } from 'ant-design-vue';
   import DeviceLinkModal from './modal/DeviceLinkModal.vue';
   import { useModal } from '/@/components/Modal';
   import { useRouter } from 'vue-router';
@@ -54,8 +51,7 @@
       [Descriptions.Item.name]: Descriptions.Item,
     },
     setup() {
-      const { t } = useI18n();
-      const { createMessage, createConfirm } = useMessage();
+      const { createConfirm } = useMessage();//createMessage,
       const [registerLinkModal, { openModal: openLinkModal }] = useModal();
       const router = useRouter();
       const companyId: Number = router.currentRoute.value.params.id - 0;

+ 139 - 0
src/views/device/DeviceLinkModal.vue

@@ -0,0 +1,139 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="客户关联"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+      <a @click="getTemplate" style="padding: 20px 0 0 80px">下载客户关联模板</a>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  // import { sceneMove } from '/@/api/operate';
+  import { companyUploadExcel, downTemplate } from '/@/api/customer';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { uploadApi, AddAndUpload } from '/@/api/product/index';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        file: null,
+      });
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'file',
+          component: 'Upload',
+          label: t('routes.product.file'),
+          required: true,
+          rules: [{ required: true, message: t('common.uploadMessge') }],
+          // helpMessage: t('routes.corporation.uploadHelp'),
+          itemProps: {
+            validateTrigger: 'onBlur',
+          },
+          componentProps: {
+            api: uploadApi,
+            maxNumber: 1,
+            maxSize: 5,
+            fileFlow: true,
+            accept: ['xls', 'xlsx'],
+            afterFetch: function (data) {
+              // console.log('uploadApi', data);
+              // Reflect.set(data, 'url', data.file);
+              fileFlow.file = data.file;
+              console.log(fileFlow.file);
+              return data;
+            },
+          },
+
+          colProps: {
+            span: 22,
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        // console.log(data);
+        data && onDataReceive(data);
+      });
+
+      function onDataReceive(data) {
+        modelRef.value = data;
+        resetFields();
+        setFieldsValue({
+          type: data.sceneName,
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const apiData = {
+            file: fileFlow.file,
+            type: 2,
+          };
+          const res = await companyUploadExcel(apiData);
+          console.log('res', res);
+          closeModal();
+          resetFields();
+          createMessage.success('导入成功');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        // console.log(v);
+        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      async function getTemplate() {
+        try {
+          const res = await downTemplate({ type: 2 });
+          console.log('res', res);
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+        getTemplate,
+      };
+    },
+  });
+</script>

+ 245 - 0
src/views/device/index.vue

@@ -0,0 +1,245 @@
+<template>
+  <PageWrapper contentBackground>
+    <div class="desc-wrap-BasicTable">
+      <BasicTable @register="registerTable">
+        <template #toolbar>
+          <a-button type="primary" @click="deviceLink"> 设备关联</a-button>
+          <a-button type="primary" @click="back">返回</a-button>
+        </template>
+        <template #action="{ record }">
+          <TableAction
+            stopButtonPropagation
+            :actions="[
+              {
+                label: '解绑',
+                color: 'error',
+                onClick: handleUnbind.bind(null, record),
+              },
+            ]"
+          />
+        </template>
+      </BasicTable>
+    </div>
+    <DeviceLinkModal @register="registerLinkModal" />
+  </PageWrapper>
+</template>
+<script lang="ts">
+  import { defineComponent, h, reactive, toRefs, onMounted } from 'vue';
+  import {
+    BasicTable,
+    useTable,
+    TableAction,
+    BasicColumn,
+    TableImg,
+    FormProps,
+  } from '/@/components/Table';
+  import { PageWrapper } from '/@/components/Page';
+  import { Time } from '/@/components/Time';
+  import { Descriptions } from 'ant-design-vue';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { cameraList } from '/@/api/customer';
+  import { message } from 'ant-design-vue';
+  import DeviceLinkModal from './DeviceLinkModal.vue';
+  import { useModal } from '/@/components/Modal';
+  import { useRouter } from 'vue-router';
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      PageWrapper,
+      TableImg,
+      DeviceLinkModal,
+      [Descriptions.name]: Descriptions,
+      [Descriptions.Item.name]: Descriptions.Item,
+    },
+    setup() {
+      const { t } = useI18n();
+      const { createMessage, createConfirm } = useMessage();
+      const [registerLinkModal, { openModal: openLinkModal }] = useModal();
+      const router = useRouter();
+      const companyId: Number = router.currentRoute.value.params.id - 0;
+      onMounted(() => {
+        // console.log(router.currentRoute.value.params.id);
+      });
+      const columns: BasicColumn[] = [
+        {
+          title: 'sn码',
+          dataIndex: 'snCode',
+          width: 180,
+        },
+        {
+          title: 'wifi名称',
+          dataIndex: 'wifiName',
+          width: 150,
+        },
+        {
+          title: '设备类型',
+          dataIndex: 'type',
+          ellipsis: false,
+          width: 80,
+        },
+
+        {
+          title: '激活时间',
+          dataIndex: 'activatedTime',
+          width: 180,
+        },
+        {
+          title: '出库类型',
+          dataIndex: 'outType',
+          width: 80,
+        },
+        {
+          title: '客户名称',
+          dataIndex: 'companyName',
+          width: 80,
+        },
+        {
+          title: '绑定账号',
+          dataIndex: 'userName',
+          width: 180,
+        },
+
+        {
+          title: '操作',
+          dataIndex: 'action',
+          slots: { customRender: 'action' },
+          ifShow: true,
+          fixed: 'right',
+          flag: 'ACTION',
+          width: 60,
+        },
+      ];
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'snCode',
+            label: 'SN码',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 4,
+              xxl: 4,
+            },
+          },
+          {
+            field: 'type',
+            label: '设备类型',
+            component: 'Select',
+            componentProps: {
+              maxLength: 100,
+              options: [
+                {
+                  label: '旧双目相机',
+                  value: '0',
+                },
+                {
+                  label: '四维看看',
+                  value: '1',
+                },
+                {
+                  label: '四维看看lite',
+                  value: '2',
+                },
+                {
+                  label: '四维看见',
+                  value: '9',
+                },
+                {
+                  label: '四维深时',
+                  value: '10',
+                },
+              ],
+            },
+            colProps: {
+              xl: 4,
+              xxl: 4,
+            },
+          },
+          {
+            field: 'activatedTime',
+            label: '激活时间',
+            component: 'RangePicker',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
+          },
+          {
+            field: 'userName',
+            label: '绑定账号',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 4,
+              xxl: 4,
+            },
+          },
+        ],
+      };
+      const [registerTable, { reload }] = useTable({
+        api: cameraList,
+        // title: '四维深时场景列表',
+        // titleHelpMessage: ['已启用expandRowByClick', '已启用stopButtonPropagation'],
+        columns: columns,
+        rowSelection: { type: 'checkbox',onChange: onSelectChange },
+        searchInfo: { companyId },
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        canResize: false,
+      });
+      function onSelectChange(val): void {
+        console.log('onSelectChange',val)
+      }
+      async function handleUnbind(record: Recordable) {
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: '解绑后用户将看不到该相机拍摄的场景。<br/>确定解绑吗?',
+          onOk: async () => {
+            // await DownExport();
+          },
+        });
+      }
+
+      function deviceLink() {
+        openLinkModal(true);
+      }
+      function back() {
+        router.push('/customer/index');
+      }
+      return {
+        registerTable,
+        handleUnbind,
+        deviceLink,
+        registerLinkModal,
+        back,
+      };
+    },
+  });
+</script>
+<style lang="less" scoped>
+  .desc-wrap-BasicTable {
+    background-color: #f0f2f5;
+    .vben-basic-table-form-container {
+      padding: 0;
+    }
+  }
+</style>

+ 6 - 3
src/views/order/cameraList.vue

@@ -1,5 +1,5 @@
 <template>
-    <BasicTable @register="registerTable" @row-click="handlerowClick">
+    <BasicTable @register="registerTable" @row-click="handlerowClick" @expand="handleExpanded">
       <template #toolbar>
         <a-button type="primary" @click="exportExcel"> 导出</a-button>
       </template>
@@ -212,6 +212,9 @@
       function handleOpen(record: Recordable) {
         console.log('点击了启用', record);
       }
+      function handleExpanded(_,record: Recordable) {
+        handlerowClick(record)
+      }
       function exportExcel() {
         createConfirm({
           iconType: 'warning',
@@ -225,9 +228,8 @@
           },
         });
       }
-      function handlerowClick(record: Recordable, index, event){
+      function handlerowClick(record: Recordable){
         CameraItem({id:record.id}).then(res => {
-          console.log('handlerowClick', res);
           if(res.length){
             let item = res[0]
             Reflect.set(record, 'goodsCount', item.goodsCount);
@@ -244,6 +246,7 @@
         exportExcel,
         handlerowClick,
         expandedItem,
+        handleExpanded,
       };
     },
   });

+ 5 - 5
src/views/system/menu/MenuDrawer.vue

@@ -32,7 +32,7 @@
     setup(_, { emit }) {
       const isUpdate = ref(true);
       const tData = ref<TreeMenuNode[]>([]);
-      const menuId = ref(0);
+      const id = ref(0);
 
       const [registerForm, { resetFields, setFieldsValue, updateSchema, validate }] = useForm({
         labelWidth: 100,
@@ -47,8 +47,8 @@
         isUpdate.value = !!data?.isUpdate;
 
         if (unref(isUpdate)) {
-          console.log('data.record', data.record.menuId);
-          menuId.value = data.record.menuId;
+          console.log('data.record', data.record);
+          id.value = data.record.id;
           setFieldsValue({
             ...data.record,
           });
@@ -77,7 +77,7 @@
           // TODO custom api
           console.log(values);
           values.parentId ??= '';
-          const parent = tData.value.find((i) => i.menuId === values.parentId);
+          const parent = tData.value.find((i) => i.id === values.parentId);
           if (values.type === 0) {
             values.component = 'LAYOUT';
           }
@@ -89,7 +89,7 @@
           if (!unref(isUpdate)) {
             await saveMenuApi(values);
           } else {
-            values.menuId = menuId.value;
+            values.id = id.value;
             await updateMenuApi(values);
           }
 

+ 14 - 10
src/views/system/menu/index.vue

@@ -14,10 +14,7 @@
             {
               icon: 'ant-design:delete-outlined',
               color: 'error',
-              popConfirm: {
-                title: t('common.operating'),
-                confirm: handleDelete.bind(null, record),
-              },
+              onClick: handleDelete.bind(null, record),
             },
           ]"
         />
@@ -27,7 +24,7 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, reactive } from 'vue';
+  import { defineComponent, reactive, h } from 'vue';
 
   import { BasicTable, useTable, TableAction } from '/@/components/Table';
   import { getMenuList, deleteMenuApi } from '/@/api/sys/system';
@@ -35,6 +32,7 @@
   const { t } = useI18n();
   import { useDrawer } from '/@/components/Drawer';
   import MenuDrawer from './MenuDrawer.vue';
+  import { useMessage } from '/@/hooks/web/useMessage';
 
   import { columns, searchFormSchema } from './menu.data';
   import { makeMenuTree } from '/@/utils/treeUtils';
@@ -42,7 +40,7 @@
     name: 'MenuManagement',
     components: { BasicTable, MenuDrawer, TableAction },
     setup() {
-      // collapseAll
+      const { createConfirm, createMessage } = useMessage();
       const searchInfo = reactive<Recordable>({});
       searchInfo.order = 'asc';
       const [registerDrawer, { openDrawer }] = useDrawer();
@@ -99,10 +97,16 @@
       }
 
       async function handleDelete(record: Recordable) {
-        try {
-          await deleteMenuApi([String(record.menuId)]);
-          reload();
-        } catch (error) {}
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', '温馨提示'),
+          content: () => h('span', `您确定删除${record.name}!`),
+          onOk: async () => {
+            await deleteMenuApi({id:record.id});
+            createMessage.success(t('common.optSuccess'));
+            reload()
+          },
+        });
       }
 
       function handleSuccess() {

+ 36 - 29
src/views/system/menu/menu.data.ts

@@ -10,7 +10,7 @@ const { t } = useI18n();
 export const columns: BasicColumn[] = [
   {
     title: 'ID',
-    dataIndex: 'menuId',
+    dataIndex: 'id',
     width: 80,
   },
   {
@@ -76,13 +76,13 @@ export const columns: BasicColumn[] = [
   },
   {
     title: t('routes.system.sortOrder'),
-    dataIndex: 'orderNum',
+    dataIndex: 'sort',
     width: 50,
   },
 
   {
     title: t('routes.system.status'),
-    dataIndex: 'status',
+    dataIndex: 'isShow',
     width: 80,
     customRender: ({ record }) => {
       const status = record.status;
@@ -110,6 +110,13 @@ const isButton = (type: number) => type === 2;
 const idShowExt = (isExt: number) => isExt === 1;
 
 export const searchFormSchema: FormSchema[] = [
+  
+  {
+    field: 'id',
+    label: 'id',
+    show:false,
+    component: 'Input',
+  },
   {
     field: 'name',
     label: t('routes.system.menuName'),
@@ -192,7 +199,7 @@ export const formSchema: FormSchema[] = [
   },
 
   {
-    field: 'orderNum',
+    field: 'sort',
     label: t('routes.system.sortOrder'),
     defaultValue: 0,
     component: 'InputNumber',
@@ -202,7 +209,7 @@ export const formSchema: FormSchema[] = [
     field: 'icon',
     label: t('routes.system.icon'),
     component: 'IconPicker',
-    required: true,
+    // required: true,
     ifShow: ({ values }) => !isButton(values.type),
   },
 
@@ -227,37 +234,37 @@ export const formSchema: FormSchema[] = [
     ifShow: ({ values }) => !isDir(values.type),
   },
   {
-    field: 'status',
+    field: 'isShow',
     label: t('routes.system.status'),
     component: 'RadioButtonGroup',
-    defaultValue: 0,
-    componentProps: {
-      options: [
-        { label: t('routes.system.enable'), value: 0 },
-        { label: t('routes.system.stopUsing'), value: 1 },
-      ],
-    },
-  },
-  {
-    field: 'isExt',
-    label: t('routes.system.isExt.title'),
-    component: 'RadioButtonGroup',
-    defaultValue: 0,
+    defaultValue: 1,
     componentProps: {
       options: [
-        { label: t('routes.system.isExt.1'), value: 1 },
-        { label: t('routes.system.isExt.0'), value: 0 },
+        { label: t('routes.system.enable'), value: 1 },
+        { label: t('routes.system.stopUsing'), value: 0 },
       ],
     },
-    ifShow: ({ values }) => !isButton(values.type),
   },
+  // {
+  //   field: 'isExt',
+  //   label: t('routes.system.isExt.title'),
+  //   component: 'RadioButtonGroup',
+  //   defaultValue: 0,
+  //   componentProps: {
+  //     options: [
+  //       { label: t('routes.system.isExt.1'), value: 1 },
+  //       { label: t('routes.system.isExt.0'), value: 0 },
+  //     ],
+  //   },
+  //   ifShow: ({ values }) => !isButton(values.type),
+  // },
 
-  {
-    field: 'url',
-    label: t('routes.system.menuUrl'),
-    component: 'Input',
-    ifShow: ({ values }) => idShowExt(values.isExt),
-  },
+  // {
+  //   field: 'url',
+  //   label: t('routes.system.menuUrl'),
+  //   component: 'Input',
+  //   ifShow: ({ values }) => idShowExt(values.isExt),
+  // },
 
   {
     field: 'hideMenu',
@@ -266,8 +273,8 @@ export const formSchema: FormSchema[] = [
     defaultValue: 0,
     componentProps: {
       options: [
-        { label: t('routes.system.isExt.1'), value: 0 },
         { label: t('routes.system.isExt.0'), value: 1 },
+        { label: t('routes.system.isExt.1'), value: 0 },
       ],
     },
     ifShow: ({ values }) => !isButton(values.type),

+ 1 - 0
src/views/system/role/RoleDrawer.vue

@@ -58,6 +58,7 @@
         // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告
         if (unref(treeData).length === 0) {
           const tData = (await getMenuList({roleId:unref(roles)})) as any as TreeMenuNode[];
+          console.log('getMenuList',tData)
           treeData.value = makeMenuTree(tData);
           console.log('makeMenuTree',treeData.value)
         }