From d5b0cb36b2e5c0659acd222ea2453a7c4dbf8bf1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=88=E7=BA=A2=E4=B8=BD?= <1181930680@qq.com>
Date: Tue, 9 Jul 2024 11:01:01 +0800
Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/layout/components/Sider/ReSubMenu.vue |   3 +-
 src/layout/components/Sider/Sider.vue     |   3 +-
 src/router/generator-routers.ts           |   7 +-
 src/views/system/menu/edit.vue            | 119 +++++++++-------------
 src/views/system/menu/index.vue           |   6 +-
 src/views/system/role/index.vue           |   2 -
 src/views/system/user/columns.ts          |   2 +-
 7 files changed, 58 insertions(+), 84 deletions(-)

diff --git a/src/layout/components/Sider/ReSubMenu.vue b/src/layout/components/Sider/ReSubMenu.vue
index 791bb7f..2ad67e8 100644
--- a/src/layout/components/Sider/ReSubMenu.vue
+++ b/src/layout/components/Sider/ReSubMenu.vue
@@ -1,7 +1,7 @@
 <template>
   <el-sub-menu :index="parent.key">
     <template #title>
-      <el-icon v-if="parent.icon"><component :is="parent.icon" /></el-icon>
+      <icon :name="parent.icon" :size="20" v-if="parent.icon"/>
       <span>{{ parent.title }}</span>
     </template>
     <template v-for="(item, key) in parent.children" :key="item.key">
@@ -16,6 +16,7 @@
 </template>
 
 <script lang="ts">
+  import icon from "@/components/icon/index.vue";
   export default {
     name: 'ReSubMenu',
   };
diff --git a/src/layout/components/Sider/Sider.vue b/src/layout/components/Sider/Sider.vue
index 4556ea9..9162b49 100644
--- a/src/layout/components/Sider/Sider.vue
+++ b/src/layout/components/Sider/Sider.vue
@@ -14,7 +14,7 @@
     <template v-for="item in menus" :key="item.key">
       <el-menu-item v-if="!item.children" :key="getMenuKey(item.key)" :index="item.key">
         <template #title>
-          <el-icon v-if="item.icon"><component :is="item.icon" /></el-icon>
+          <icon :name="item.icon" :size="20" v-if="item.icon"/>
           <span>{{ item.title }}</span>
         </template>
       </el-menu-item>
@@ -32,6 +32,7 @@
   import { useProjectSetting } from '@/hooks/setting/useProjectSetting';
   import { useAsyncRouteStore } from '@/store/modules/asyncRoute';
   import { useProjectSettingStore } from '@/store/modules/projectSetting';
+  import icon from "@/components/icon/index.vue";
   import ReSubMenu from './ReSubMenu.vue';
 
   const collapsed = inject('collapsed');
diff --git a/src/router/generator-routers.ts b/src/router/generator-routers.ts
index 3af649b..2fb6fdf 100644
--- a/src/router/generator-routers.ts
+++ b/src/router/generator-routers.ts
@@ -22,23 +22,24 @@ export const routerGenerator = (routerMap, parent?): any[] => {
   return routerMap.map((item) => {
     item.meta = {
       title:item.name,
-      icon:renderIcon(DashboardOutlined),
+      icon:item.icon,
       sort:item.sort,
       permissions:item.permission
     }
     const components =''
+    const names = /http(s)?:/.test(item.path)?item.path:item.path.replaceAll('/','')
     const currentRouter: any = {
       // 路由地址 动态拼接生成如 /dashboard/workplace
       path: `${item.path}`,
       // 路由名称,建议唯一
-      name: item.name || '',
+      name: names,
       // 该路由对应页面的 组件
       component: item.component,
       // meta: 页面标题, 菜单图标, 页面权限(供指令权限用,可去掉)
       meta: {
         ...item.meta,
         label: item.meta.title,
-        icon: renderIcon(DashboardOutlined) || null,
+        icon: item.meta.icon || null,
         permissions: item.meta.permissions || null,
       },
     };
diff --git a/src/views/system/menu/edit.vue b/src/views/system/menu/edit.vue
index 4f988ce..32c4cb3 100644
--- a/src/views/system/menu/edit.vue
+++ b/src/views/system/menu/edit.vue
@@ -2,7 +2,6 @@
   <el-dialog
       v-model="props.visible"
       :title="props.menuId?'编辑':'新增'"
-      :append-to-body="true"
       width="600"
       :close-on-click-modal="false"
       :before-close="dialogClose"
@@ -20,12 +19,12 @@
       </el-form-item>
       <el-form-item
           label="父级菜单"
-          prop="pid"
+          prop="parentId"
           :rules="{ required: true, message: '请选择父级菜单', trigger: 'change' }"
       >
         <el-tree-select
             class="flex-1"
-            v-model="formData.pid"
+            v-model="formData.parentId"
             :data="menuOptions"
             clearable
             node-key="id"
@@ -39,11 +38,11 @@
       </el-form-item>
       <el-form-item
           label="菜单名称"
-          prop="menuName"
+          prop="name"
           :rules="{ required: true, message: '请输入菜单名称', trigger: 'blur' }"
       >
         <el-input
-            v-model="formData.menuName"
+            v-model="formData.name"
             placeholder="请输入菜单名称"
             clearable
         />
@@ -55,16 +54,30 @@
       >
         <IconPicker class="flex-1" v-model="formData.icon"/>
       </el-form-item>
-
+      <el-form-item
+          label="是否外链"
+          prop="target"
+          required
+      >
+        <div>
+          <el-radio-group v-model="formData.target">
+            <el-radio :label="1">是</el-radio>
+            <el-radio :label="0">否</el-radio>
+          </el-radio-group>
+          <div class="form-tips">
+            选择外链打开,刚新窗口打开页面
+          </div>
+        </div>
+      </el-form-item>
       <el-form-item
           v-if="formData.type==0"
           label="路由路径"
-          prop="paths"
+          prop="path"
           :rules="{ required: true, message: '请输入路由路径', trigger: 'blur' }"
       >
         <div class="flex-1">
           <el-input
-              v-model="formData.paths"
+              v-model="formData.path"
               placeholder="请输入路由路径"
               clearable
           />
@@ -74,7 +87,7 @@
         </div>
       </el-form-item>
       <el-form-item
-          v-if="formData.type == 0"
+          v-if="formData.type == 0 && formData.target ==0"
           label="组件路径"
           prop="component"
           :rules="{ required: true, message: '请输入组件路径', trigger: 'blur' }"
@@ -93,28 +106,13 @@
         </div>
       </el-form-item>
       <el-form-item
-          label="选中菜单"
-          prop="selected"
-          v-if="formData.type== 0"
-      >
-        <div class="flex-1">
-          <el-input
-              v-model="formData.selected"
-              placeholder="请输入路由路径"
-              clearable
-          />
-          <div class="form-tips">
-            访问详情页面,编辑页面时,菜单高亮显示,如`/consumer/lists`
-          </div>
-        </div>
-      </el-form-item>
-      <el-form-item
+      v-if="formData.target ==0"
           label="权限字符"
-          prop="perms"
+          prop="permission"
       >
         <div class="flex-1">
           <el-input
-              v-model="formData.perms"
+              v-model="formData.permission"
               placeholder="请输入权限字符"
               clearable
           />
@@ -123,35 +121,16 @@
           </div>
         </div>
       </el-form-item>
-      <el-form-item
-          v-if="formData.type == 0"
-          label="路由参数"
-          prop="params"
-      >
-        <div>
-          <div class="flex-1">
-            <el-input
-                v-model="formData.params"
-                placeholder="请输入路由参数"
-                clearable
-            />
-          </div>
-          <div class="form-tips">
-            访问路由的默认传递参数,如:`{"menuId": 1, "name":
-            "admin"}`或`menuId=1&name=admin`
-          </div>
-        </div>
-      </el-form-item>
       <el-form-item
           v-if="formData.type ==0"
           label="是否显示"
-          prop="isShow"
+          prop="hide"
           required
       >
         <div>
-          <el-radio-group v-model="formData.isShow">
-            <el-radio :label="1">显示</el-radio>
-            <el-radio :label="0">隐藏</el-radio>
+          <el-radio-group v-model="formData.hide">
+            <el-radio :label="0">显示</el-radio>
+            <el-radio :label="1">隐藏</el-radio>
           </el-radio-group>
           <div class="form-tips">
             选择隐藏则路由将不会出现在侧边栏,但仍然可以访问
@@ -161,11 +140,11 @@
       <el-form-item
           v-if="formData.type ==0"
           label="菜单状态"
-          prop="isDisable"
+          prop="hide"
           required
       >
         <div>
-          <el-radio-group v-model="formData.isDisable">
+          <el-radio-group v-model="formData.hide">
             <el-radio :label="0">正常</el-radio>
             <el-radio :label="1">停用</el-radio>
           </el-radio-group>
@@ -174,9 +153,9 @@
           </div>
         </div>
       </el-form-item>
-      <el-form-item label="菜单排序" prop="menuSort">
+      <el-form-item label="菜单排序" prop="sort">
         <div>
-          <el-input-number v-model="formData.menuSort" :max="9999"/>
+          <el-input-number v-model="formData.sort" :max="9999"/>
           <div class="form-tips">数值越小越排前</div>
         </div>
       </el-form-item>
@@ -193,7 +172,7 @@
 </template>
 <script lang="ts" setup>
 import type {FormInstance} from "element-plus";
-import { menuAdd,menuUpdate,getMenuList } from '@/api/system/menu';
+import { menuAdd,menuUpdate,getMenuList,getMenuDetail } from '@/api/system/menu';
 import {onMounted, reactive, readonly, ref, shallowRef} from "vue";
 import {getModulesKey} from "@/router";
 import {arrayToTree, treeToArray,message,buildTree} from "@/utils/auth";
@@ -231,31 +210,25 @@ const querySearch = (queryString: string, cb: any) => {
 const formData = reactive({
   menuId: "",
   //父级id
-  pid: 0,
+  parentId: 0,
   //类型
   type: 0,
   //图标
-  menuIcon: "",
+  icon: "",
   //名称
-  menuName: "",
+  name: "",
   //排序号
-  menuSort: 0,
+  sort: 0,
   // 路由路径
-  paths: "",
+  path: "",
   //权限链接
-  perms: "",
+  permission: "",
   //前端组件
   component: "",
-  //选中路径
-  selected: "",
-  //路由参数
-  params: "",
-  //是否缓存 0=否, 1=是
-  isCache: 0,
-  //是否显示 0=否, 1=是
-  isShow: 1,
-  //是否禁用 0=否, 1=是
-  isDisable: 0
+  //是否显示 0=显示, 1=不显示
+  hide: 0,
+  target:0,
+  status:0
 });
 
 const dialogClose = () => {
@@ -295,7 +268,7 @@ const setFormData = (data: Record<any, any>) => {
 };
 
 const getDetail = async () => {
-  const data = await api.menuDetail(
+  const data = await getMenuDetail(
     props.menuId
   );
   setFormData(data);
@@ -312,7 +285,7 @@ onMounted(() => {
   if (props.menuId) {
     getDetail()
   }else{
-    formData.pid=props.pid
+    formData.parentId=props.parentId
   }
 });
 </script>
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
index ba11cd0..354b98d 100644
--- a/src/views/system/menu/index.vue
+++ b/src/views/system/menu/index.vue
@@ -25,7 +25,7 @@
         </el-table-column>
         <el-table-column align="center" label="图标" prop="icon" min-width="80">
           <template #default="{ row }">
-            <icon :name="row.icon" :size="20"/>
+            <icon :name="row.icon" :size="20" v-if="row.icon"/>
           </template>
         </el-table-column>
         <el-table-column align="center" label="权限标识" prop="permission" min-width="150" show-overflow-tooltip/>
@@ -69,7 +69,7 @@
 import {defineAsyncComponent, nextTick, onMounted, readonly, ref, shallowRef,onActivated} from "vue";
 import {getMenuList,menuDelete} from "@/api/system/menu";
 import type {ElTable} from "element-plus";
-
+import icon from "@/components/icon/index.vue";
 const tableRef = shallowRef<InstanceType<typeof ElTable>>();
 import {confirm, message,buildTree} from "@/utils/auth";
 
@@ -103,7 +103,7 @@ const handleAdd = async (parentId:any) => {
 };
 
 const handleEdit = async (data: any) => {
-  menuId.value=data.menuId
+  menuId.value=data.id
   await nextTick();
   editVisible.value=true
 };
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
index b0f8e41..ae62e8d 100644
--- a/src/views/system/role/index.vue
+++ b/src/views/system/role/index.vue
@@ -218,7 +218,6 @@
   }
 
   function checkedAllHandle() {
-    console.log(treeRef.value);
     if (!checkedAll.value) {
       checkedKeys.value = getTreeAll(treeData.value);
       treeRef.value!.setCheckedKeys(getTreeAll(treeData.value));
@@ -238,7 +237,6 @@
 
   onMounted(async () => {
     const treeMenuList = await getMenuList();
-    console.log(treeMenuList)
     treeMenuList.forEach((item) => {
       item.expanded = false;
     });
diff --git a/src/views/system/user/columns.ts b/src/views/system/user/columns.ts
index c92832e..f6a88e7 100644
--- a/src/views/system/user/columns.ts
+++ b/src/views/system/user/columns.ts
@@ -53,7 +53,7 @@ export const columns = [
         ElTag,
         {},
         {
-          default: () => record.row.roles[0].name,
+          default: () => record.row.roles.length>0?record.row.roles[0].name:'',
         },
       );
     },