zuohuaijun 2 лет назад
Родитель
Сommit
e511d0d9a2

+ 58 - 58
Admin.NET/Admin.NET.Core/EventBus/RedisQueue.cs

@@ -22,74 +22,37 @@ public static class RedisQueue
     /// 获取可信队列,需要确认
     /// </summary>
     /// <typeparam name="T"></typeparam>
-    /// <param name="key"></param>
+    /// <param name="topic"></param>
     /// <returns></returns>
-    public static RedisReliableQueue<T> GetRedisReliableQueue<T>(string key)
+    public static RedisReliableQueue<T> GetRedisReliableQueue<T>(string topic)
     {
-        var queue = (_cache as FullRedis).GetReliableQueue<T>(key);
+        var queue = (_cache as FullRedis).GetReliableQueue<T>(topic);
         return queue;
     }
 
     /// <summary>
     /// 可信队列回滚
     /// </summary>
-    /// <param name="key"></param>
+    /// <param name="topic"></param>
     /// <param name="retryInterval"></param>
     /// <returns></returns>
-    public static int RollbackAllAck(string key, int retryInterval = 60)
+    public static int RollbackAllAck(string topic, int retryInterval = 60)
     {
-        var queue = GetRedisReliableQueue<string>(key);
+        var queue = GetRedisReliableQueue<string>(topic);
         queue.RetryInterval = retryInterval;
         return queue.RollbackAllAck();
     }
 
-    /// <summary>
-    /// 在可信队列获取一条数据
-    /// </summary>
-    /// <param name="key"></param>
-    /// <typeparam name="T"></typeparam>
-    /// <returns></returns>
-    public static T ReliableTakeOne<T>(string key)
-    {
-        var queue = GetRedisReliableQueue<T>(key);
-        return queue.TakeOne(1);
-    }
-
-    /// <summary>
-    /// 异步在可信队列获取一条数据
-    /// </summary>
-    /// <param name="key"></param>
-    /// <typeparam name="T"></typeparam>
-    /// <returns></returns>
-    public static async Task<T> ReliableTakeOneAsync<T>(string key)
-    {
-        var queue = GetRedisReliableQueue<T>(key);
-        return await queue.TakeOneAsync(1);
-    }
-
-    /// <summary>
-    ///在可信队列获取多条数据
-    /// </summary>
-    /// <param name="key"></param>
-    /// <param name="count"></param>
-    /// <typeparam name="T"></typeparam>
-    /// <returns></returns>
-    public static List<T> ReliableTake<T>(string key, int count)
-    {
-        var queue = GetRedisReliableQueue<T>(key);
-        return queue.Take(count).ToList();
-    }
-
     /// <summary>
     /// 发送一个数据列表到可信队列
     /// </summary>
-    /// <param name="key"></param>
+    /// <param name="topic"></param>
     /// <param name="value"></param>
     /// <typeparam name="T"></typeparam>
     /// <returns></returns>
-    public static int AddReliableQueueList<T>(string key, List<T> value)
+    public static int AddReliableQueueList<T>(string topic, List<T> value)
     {
-        var queue = (_cache as FullRedis).GetReliableQueue<T>(key);
+        var queue = (_cache as FullRedis).GetReliableQueue<T>(topic);
         var count = queue.Count;
         var result = queue.Add(value.ToArray());
         return result - count;
@@ -98,13 +61,13 @@ public static class RedisQueue
     /// <summary>
     /// 发送一条数据到可信队列
     /// </summary>
-    /// <param name="key"></param>
+    /// <param name="topic"></param>
     /// <param name="value"></param>
     /// <typeparam name="T"></typeparam>
     /// <returns></returns>
-    public static int AddReliableQueue<T>(string key, T value)
+    public static int AddReliableQueue<T>(string topic, T value)
     {
-        var queue = (_cache as FullRedis).GetReliableQueue<T>(key);
+        var queue = (_cache as FullRedis).GetReliableQueue<T>(topic);
         var count = queue.Count;
         var result = queue.Add(value);
         return result - count;
@@ -113,41 +76,78 @@ public static class RedisQueue
     /// <summary>
     /// 获取延迟队列
     /// </summary>
-    /// <param name="key"></param>
+    /// <param name="topic"></param>
     /// <typeparam name="T"></typeparam>
     /// <returns></returns>
-    public static RedisDelayQueue<T> GetDelayQueue<T>(string key)
+    public static RedisDelayQueue<T> GetDelayQueue<T>(string topic)
     {
-        var queue = (_cache as FullRedis).GetDelayQueue<T>(key);
+        var queue = (_cache as FullRedis).GetDelayQueue<T>(topic);
         return queue;
     }
 
     /// <summary>
     /// 发送一条数据到延迟队列
     /// </summary>
-    /// <param name="key"></param>
+    /// <param name="topic"></param>
     /// <param name="value"></param>
     /// <param name="delay">延迟时间。单位秒</param>
     /// <typeparam name="T"></typeparam>
     /// <returns></returns>
-    public static int AddDelayQueue<T>(string key, T value, int delay)
+    public static int AddDelayQueue<T>(string topic, T value, int delay)
     {
-        var queue = GetDelayQueue<T>(key);
+        var queue = GetDelayQueue<T>(topic);
         return queue.Add(value, delay);
     }
 
     /// <summary>
     /// 发送数据列表到延迟队列
     /// </summary>
-    /// <param name="key"></param>
+    /// <param name="topic"></param>
     /// <param name="value"></param>
     /// <param name="delay"></param>
     /// <typeparam name="T">延迟时间。单位秒</typeparam>
     /// <returns></returns>
-    public static int AddDelayQueue<T>(string key, List<T> value, int delay)
+    public static int AddDelayQueue<T>(string topic, List<T> value, int delay)
     {
-        var queue = GetDelayQueue<T>(key);
+        var queue = GetDelayQueue<T>(topic);
         queue.Delay = delay;
         return queue.Add(value.ToArray());
     }
+
+    /// <summary>
+    /// 在可信队列获取一条数据
+    /// </summary>
+    /// <param name="topic"></param>
+    /// <typeparam name="T"></typeparam>
+    /// <returns></returns>
+    public static T ReliableTakeOne<T>(string topic)
+    {
+        var queue = GetRedisReliableQueue<T>(topic);
+        return queue.TakeOne(1);
+    }
+
+    /// <summary>
+    /// 异步在可信队列获取一条数据
+    /// </summary>
+    /// <param name="topic"></param>
+    /// <typeparam name="T"></typeparam>
+    /// <returns></returns>
+    public static async Task<T> ReliableTakeOneAsync<T>(string topic)
+    {
+        var queue = GetRedisReliableQueue<T>(topic);
+        return await queue.TakeOneAsync(1);
+    }
+
+    /// <summary>
+    /// 在可信队列获取多条数据
+    /// </summary>
+    /// <param name="topic"></param>
+    /// <param name="count"></param>
+    /// <typeparam name="T"></typeparam>
+    /// <returns></returns>
+    public static List<T> ReliableTake<T>(string topic, int count)
+    {
+        var queue = GetRedisReliableQueue<T>(topic);
+        return queue.Take(count).ToList();
+    }
 }

+ 10 - 9
Admin.NET/Admin.NET.Core/Util/CryptogramUtil.cs

@@ -18,14 +18,15 @@ public class CryptogramUtil
     public static readonly string PublicKey = App.GetConfig<string>("Cryptogram:PublicKey"); // 公钥
     public static readonly string PrivateKey = App.GetConfig<string>("Cryptogram:PrivateKey"); // 私钥
 
-	public static readonly string SM4_key = "0123456789abcdeffedcba9876543210";
-	public static readonly string SM4_iv = "595298c7c6fd271f0402f804c33d3f66";
-	/// <summary>
-	/// 加密
-	/// </summary>
-	/// <param name="plainText"></param>
-	/// <returns></returns>
-	public static string Encrypt(string plainText)
+    public static readonly string SM4_key = "0123456789abcdeffedcba9876543210";
+    public static readonly string SM4_iv = "595298c7c6fd271f0402f804c33d3f66";
+
+    /// <summary>
+    /// 加密
+    /// </summary>
+    /// <param name="plainText"></param>
+    /// <returns></returns>
+    public static string Encrypt(string plainText)
     {
         if (CryptoType == CryptogramEnum.MD5.ToString())
         {
@@ -117,6 +118,6 @@ public class CryptogramUtil
     /// <returns></returns>
     public static string SM4DecryptCBC(string cipherText)
     {
-        return GMUtil.SM4DecryptCBC(SM4_key,SM4_iv, cipherText);
+        return GMUtil.SM4DecryptCBC(SM4_key, SM4_iv, cipherText);
     }
 }

+ 70 - 70
Admin.NET/Admin.NET.Core/Util/GM/GMUtil.cs

@@ -18,7 +18,6 @@ namespace Admin.NET.Core;
 /// </summary>
 public class GMUtil
 {
-
     /// <summary>
     /// SM2加密
     /// </summary>
@@ -65,90 +64,91 @@ public class GMUtil
         return strDecrypted;
     }
 
-	/// <summary>
-	/// SM4加密(ECB)
-	/// </summary>
-	/// <param name="key_string"></param>
-	/// <param name="plainText"></param>
-	/// <returns></returns>
-	public static string SM4EncryptECB(string key_string,string plainText)
+    /// <summary>
+    /// SM4加密(ECB)
+    /// </summary>
+    /// <param name="key_string"></param>
+    /// <param name="plainText"></param>
+    /// <returns></returns>
+    public static string SM4EncryptECB(string key_string, string plainText)
     {
         byte[] key = Hex.Decode(key_string);
-		byte[] bs = GM.Sm4EncryptECB(key, Encoding.UTF8.GetBytes(plainText), GM.SM4_CBC_PKCS7PADDING);//NoPadding 的情况下需要校验数据长度是16的倍数. 使用 HandleSm4Padding 处理
-		return Hex.ToHexString(bs);
+        byte[] bs = GM.Sm4EncryptECB(key, Encoding.UTF8.GetBytes(plainText), GM.SM4_CBC_PKCS7PADDING);//NoPadding 的情况下需要校验数据长度是16的倍数. 使用 HandleSm4Padding 处理
+        return Hex.ToHexString(bs);
     }
 
-	/// <summary>
-	/// SM4解密(ECB)
-	/// </summary>
-	/// <param name="key_string"></param>
-	/// <param name="cipherText"></param>
-	/// <returns></returns>
-	public static string SM4DecryptECB(string key_string, string cipherText)
+    /// <summary>
+    /// SM4解密(ECB)
+    /// </summary>
+    /// <param name="key_string"></param>
+    /// <param name="cipherText"></param>
+    /// <returns></returns>
+    public static string SM4DecryptECB(string key_string, string cipherText)
     {
         byte[] key = Hex.Decode(key_string);
-		byte[] bs = GM.Sm4DecryptECB(key, Hex.Decode(cipherText), GM.SM4_CBC_PKCS7PADDING);
+        byte[] bs = GM.Sm4DecryptECB(key, Hex.Decode(cipherText), GM.SM4_CBC_PKCS7PADDING);
         return Encoding.UTF8.GetString(bs);
     }
 
-	/// <summary>
-	/// SM4加密(CBC)
-	/// </summary>
-	/// <param name="key_string"></param>
-	/// <param name="iv_string"></param>
-	/// <param name="plainText"></param>
-	/// <returns></returns>
-	public static string SM4EncryptCBC(string key_string, string iv_string, string plainText)
+    /// <summary>
+    /// SM4加密(CBC)
+    /// </summary>
+    /// <param name="key_string"></param>
+    /// <param name="iv_string"></param>
+    /// <param name="plainText"></param>
+    /// <returns></returns>
+    public static string SM4EncryptCBC(string key_string, string iv_string, string plainText)
     {
         byte[] key = Hex.Decode(key_string);
         byte[] iv = Hex.Decode(iv_string);
-		byte[] bs = GM.Sm4EncryptCBC(key,Encoding.UTF8.GetBytes(plainText), iv, GM.SM4_CBC_PKCS7PADDING);
-		return Hex.ToHexString(bs);
+        byte[] bs = GM.Sm4EncryptCBC(key, Encoding.UTF8.GetBytes(plainText), iv, GM.SM4_CBC_PKCS7PADDING);
+        return Hex.ToHexString(bs);
     }
 
-	/// <summary>
-	/// SM4解密(CBC)
-	/// </summary>
-	/// <param name="key_string"></param>
-	/// <param name="iv_string"></param>
-	/// <param name="cipherText"></param>
-	/// <returns></returns>
-	public static string SM4DecryptCBC(string key_string, string iv_string, string cipherText)
+    /// <summary>
+    /// SM4解密(CBC)
+    /// </summary>
+    /// <param name="key_string"></param>
+    /// <param name="iv_string"></param>
+    /// <param name="cipherText"></param>
+    /// <returns></returns>
+    public static string SM4DecryptCBC(string key_string, string iv_string, string cipherText)
     {
-		byte[] key = Hex.Decode(key_string);
-		byte[] iv = Hex.Decode(iv_string);
-		byte[] bs = GM.Sm4DecryptCBC(key, Hex.Decode(cipherText), iv, GM.SM4_CBC_PKCS7PADDING);
+        byte[] key = Hex.Decode(key_string);
+        byte[] iv = Hex.Decode(iv_string);
+        byte[] bs = GM.Sm4DecryptCBC(key, Hex.Decode(cipherText), iv, GM.SM4_CBC_PKCS7PADDING);
         return Encoding.UTF8.GetString(bs);
     }
-	/// <summary>
-	/// 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串
-	/// </summary>
-	/// <param name="input"></param>
-	/// <param name="mode">1表示加密,0表示解密</param>
-	/// <returns></returns>
-	private static byte[] HandleSm4Padding(byte[] input, int mode)
-	{
-		if (input == null)
-		{
-			return null;
-		}
-		byte[] ret = (byte[])null;
-		if (mode == 1)
-		{
-			int p = 16 - input.Length % 16;
-			ret = new byte[input.Length + p];
-			Array.Copy(input, 0, ret, 0, input.Length);
-			for (int i = 0; i < p; i++)
-			{
-				ret[input.Length + i] = (byte)p;
-			}
-		}
-		else
-		{
-			int p = input[input.Length - 1];
-			ret = new byte[input.Length - p];
-			Array.Copy(input, 0, ret, 0, input.Length - p);
-		}
-		return ret;
-	}
+
+    /// <summary>
+    /// 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串
+    /// </summary>
+    /// <param name="input"></param>
+    /// <param name="mode">1表示加密,0表示解密</param>
+    /// <returns></returns>
+    private static byte[] HandleSm4Padding(byte[] input, int mode)
+    {
+        if (input == null)
+        {
+            return null;
+        }
+        byte[] ret = (byte[])null;
+        if (mode == 1)
+        {
+            int p = 16 - input.Length % 16;
+            ret = new byte[input.Length + p];
+            Array.Copy(input, 0, ret, 0, input.Length);
+            for (int i = 0; i < p; i++)
+            {
+                ret[input.Length + i] = (byte)p;
+            }
+        }
+        else
+        {
+            int p = input[input.Length - 1];
+            ret = new byte[input.Length - p];
+            Array.Copy(input, 0, ret, 0, input.Length - p);
+        }
+        return ret;
+    }
 }

+ 86 - 328
Web/src/views/system/menu/index.vue

@@ -25,22 +25,90 @@
 		</el-card>
 
 		<el-card class="full-table" shadow="hover" style="margin-top: 8px">
-			<el-auto-resizer>
-				<template #default="{ height, width }">
-					<el-table-v2
-						:data="state.menuData"
-						:width="width"
-						v-model:expanded-row-keys="expandedRowKeys"
-						:height="height"
-						:expand-column-key="expandColumnKey"
-						:columns="state.columns"
-						v-loading="state.loading"
-						row-key="id"
-						border
-					>
-					</el-table-v2>
-				</template>
-			</el-auto-resizer>
+			<el-table :data="state.menuData" v-loading="state.loading" row-key="id" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" border>
+				<el-table-column label="菜单名称" header-align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<SvgIcon :name="scope.row.icon" />
+						<span class="ml10">{{ $t(scope.row.title) }}</span>
+					</template>
+				</el-table-column>
+				<el-table-column label="类型" width="70" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag type="warning" v-if="scope.row.type === 1">目录</el-tag>
+						<el-tag v-else-if="scope.row.type === 2">菜单</el-tag>
+						<el-tag type="info" v-else>按钮</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column prop="path" label="路由路径" header-align="center" show-overflow-tooltip />
+				<el-table-column prop="component" label="组件路径" align="center" show-overflow-tooltip />
+				<el-table-column prop="permission" label="权限标识" align="center" show-overflow-tooltip />
+				<el-table-column prop="orderNo" label="排序" width="70" align="center" show-overflow-tooltip />
+				<el-table-column label="状态" width="80" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag type="success" v-if="scope.row.status === 1">启用</el-tag>
+						<el-tag type="danger" v-else>禁用</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column label="修改记录" width="100" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-popover placement="bottom" width="280" trigger="hover">
+							<template #reference>
+								<el-text type="primary">
+									<el-icon><ele-InfoFilled /></el-icon>详情
+								</el-text>
+							</template>
+							<el-descriptions direction="vertical" :column="2" border>
+								<el-descriptions-item width="140">
+									<template #label>
+										<el-text>
+											<el-icon><ele-UserFilled /></el-icon>创建者
+										</el-text>
+									</template>
+									<el-tag>{{ scope.row.createUserName ?? '无' }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item>
+									<template #label>
+										<el-text>
+											<el-icon><ele-Calendar /></el-icon>创建时间
+										</el-text>
+									</template>
+									<el-tag>{{ scope.row.createTime ?? '无' }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item>
+									<template #label>
+										<el-text>
+											<el-icon><ele-UserFilled /></el-icon>修改者
+										</el-text>
+									</template>
+									<el-tag>{{ scope.row.updateUserName ?? '无' }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item>
+									<template #label>
+										<el-text>
+											<el-icon><ele-Calendar /></el-icon>修改时间
+										</el-text>
+									</template>
+									<el-tag>{{ scope.row.updateTime ?? '无' }}</el-tag>
+								</el-descriptions-item>
+								<el-descriptions-item>
+									<template #label>
+										<el-text>
+											<el-icon><ele-Tickets /></el-icon>备注
+										</el-text>
+									</template>
+									{{ scope.row.remark }}
+								</el-descriptions-item>
+							</el-descriptions>
+						</el-popover>
+					</template>
+				</el-table-column>
+				<el-table-column label="操作" width="140" fixed="right" align="center" show-overflow-tooltip>
+					<template #default="scope">
+						<el-button icon="ele-Edit" size="small" text type="primary" @click="openEditMenu(scope.row)" v-auth="'sysMenu:update'"> 编辑 </el-button>
+						<el-button icon="ele-Delete" size="small" text type="danger" @click="delMenu(scope.row)" v-auth="'sysMenu:delete'"> 删除 </el-button>
+					</template>
+				</el-table-column>
+			</el-table>
 		</el-card>
 
 		<EditMenu ref="editMenuRef" :title="state.editMenuTitle" :menuData="state.menuData" @handleQuery="handleQuery" />
@@ -48,328 +116,18 @@
 </template>
 
 <script lang="ts" setup name="sysMenu">
-import { onMounted, reactive, ref, h, resolveComponent, resolveDirective, withDirectives } from 'vue';
-import { ElMessageBox, ElMessage, ElPopover, ElTag, ElButton, ElText, ElIcon, ElDescriptions, ElDescriptionsItem } from 'element-plus';
+import { onMounted, reactive, ref } from 'vue';
+import { ElMessageBox, ElMessage } from 'element-plus';
 import EditMenu from '/@/views/system/menu/component/editMenu.vue';
-const SvgIcon = resolveComponent('SvgIcon');
 
 import { getAPI } from '/@/utils/axios-utils';
 import { SysMenuApi } from '/@/api-services/api';
 import { SysMenu } from '/@/api-services/models';
 
-const authBtn = resolveDirective('auth');
 const editMenuRef = ref<InstanceType<typeof EditMenu>>();
-const expandedRowKeys = ref<string[]>([]);
-const expandColumnKey = 'title';
-const generateColumns = () => {
-	return [
-		{
-			key: 'title',
-			title: '菜单名称',
-			dataKey: 'title',
-			align: 'left',
-			width: 200,
-			cellRenderer: ({ rowData }) => {
-				return h('div', {}, [h(SvgIcon, { name: rowData.icon }), h('span', { class: 'ml10' }, { default: () => rowData.title })]);
-			},
-		},
-		{
-			key: 'type',
-			title: '类型',
-			dataKey: 'type',
-			align: 'center',
-			width: 80,
-			cellRenderer: ({ rowData }) => {
-				let t = '';
-				let c = '';
-				if (rowData.type === 1) {
-					t = 'warning';
-					c = '目录';
-				} else if (rowData.type === 2) {
-					c = '菜单';
-				} else {
-					t = 'info';
-					c = '按钮';
-				}
-				return h(
-					ElTag,
-					{
-						type: t,
-					},
-					{ default: () => c }
-				);
-			},
-		},
-		{
-			key: 'path',
-			title: '路由路径',
-			dataKey: 'path',
-			align: 'left',
-			width: 200,
-		},
-		{
-			key: 'component',
-			title: '组件路径',
-			dataKey: 'component',
-			align: 'center',
-			width: 220,
-		},
-		{
-			key: 'permission',
-			title: '权限标识',
-			dataKey: 'permission',
-			align: 'center',
-			width: 180,
-		},
-		{
-			key: 'orderNo',
-			title: '排序',
-			dataKey: 'orderNo',
-			align: 'center',
-			width: 70,
-		},
-		{
-			key: 'status',
-			title: '状态',
-			dataKey: 'status',
-			align: 'center',
-			width: 80,
-			cellRenderer: ({ rowData }) => {
-				let t = '';
-				let c = '';
-				if (rowData.type === 1) {
-					t = 'success';
-					c = '启用';
-				} else {
-					t = 'danger';
-					c = '禁用';
-				}
-				return h(
-					ElTag,
-					{
-						type: t,
-					},
-					{ default: () => c }
-				);
-			},
-		},
-		{
-			key: 'status',
-			title: '修改记录',
-			dataKey: 'status',
-			align: 'center',
-			width: 100,
-			cellRenderer: ({ rowData }) => {
-				return h(
-					ElPopover,
-					{
-						placement: 'bottom',
-						width: 280,
-						trigger: 'hover',
-					},
-					{
-						reference: () =>
-							h(
-								ElText,
-								{
-									type: 'primary',
-								},
-								{
-									default: () => [
-										h(
-											ElIcon,
-											{},
-											{
-												default: () => h(SvgIcon, { name: 'ele-InfoFilled' }),
-											}
-										),
-										'详情',
-									],
-								}
-							),
-						default: () =>
-							h(
-								ElDescriptions,
-								{
-									direction: 'vertical',
-									column: 2,
-									size: 'small',
-									border: true,
-								},
-								{
-									default: () => [
-										h(
-											ElDescriptionsItem,
-											{
-												width: 140,
-											},
-											{
-												label: () =>
-													h(
-														ElText,
-														{},
-														{
-															default: () => [
-																h(
-																	ElIcon,
-																	{},
-																	{
-																		default: () => h(SvgIcon, { name: 'ele-UserFilled' }),
-																	}
-																),
-																'创建者',
-															],
-														}
-													),
-												default: () => h(ElTag, {}, { default: () => rowData.createUserName ?? '无' }),
-											}
-										),
-										h(
-											ElDescriptionsItem,
-											{},
-											{
-												label: () =>
-													h(
-														ElText,
-														{},
-														{
-															default: () => [
-																h(
-																	ElIcon,
-																	{},
-																	{
-																		default: () => h(SvgIcon, { name: 'ele-Calendar' }),
-																	}
-																),
-																'创建时间',
-															],
-														}
-													),
-												default: () => h(ElTag, {}, { default: () => rowData.createTime ?? '无' }),
-											}
-										),
-										h(
-											ElDescriptionsItem,
-											{},
-											{
-												label: () =>
-													h(
-														ElText,
-														{},
-														{
-															default: () => [
-																h(
-																	ElIcon,
-																	{},
-																	{
-																		default: () => h(SvgIcon, { name: 'ele-UserFilled' }),
-																	}
-																),
-																'修改者',
-															],
-														}
-													),
-												default: () => h(ElTag, {}, { default: () => rowData.updateUserName ?? '无' }),
-											}
-										),
-										h(
-											ElDescriptionsItem,
-											{},
-											{
-												label: () =>
-													h(
-														ElText,
-														{},
-														{
-															default: () => [
-																h(
-																	ElIcon,
-																	{},
-																	{
-																		default: () => h(SvgIcon, { name: 'ele-Calendar' }),
-																	}
-																),
-																'修改时间',
-															],
-														}
-													),
-												default: () => h(ElTag, {}, { default: () => rowData.updateTime ?? '无' }),
-											}
-										),
-										h(
-											ElDescriptionsItem,
-											{},
-											{
-												label: () =>
-													h(
-														ElText,
-														{},
-														{
-															default: () => [
-																h(
-																	ElIcon,
-																	{},
-																	{
-																		default: () => h(SvgIcon, { name: 'ele-Tickets' }),
-																	}
-																),
-																'备注',
-															],
-														}
-													),
-												default: () => h(ElTag, {}, { default: () => rowData.remark ?? '无' }),
-											}
-										),
-									],
-								}
-							),
-					}
-				);
-			},
-		},
-		{
-			key: 'status',
-			title: '操作',
-			dataKey: 'status',
-			align: 'center',
-			width: 240,
-			cellRenderer: ({ rowData }) => {
-				return h('div', {}, [
-					withDirectives(
-						h(
-							ElButton,
-							{
-								icon: 'ele-Edit',
-								size: 'small',
-								type: 'primary',
-								onClick: () => openEditMenu(rowData),
-							},
-							{ default: () => '编辑' }
-						),
-						[[authBtn, 'sysMenu:update']]
-					),
-					withDirectives(
-						h(
-							ElButton,
-							{
-								icon: 'ele-Delete',
-								size: 'small',
-								type: 'danger',
-								onClick: () => delMenu(rowData),
-							},
-							{ default: () => '删除' }
-						),
-						[[authBtn, 'sysMenu:delete']]
-					),
-				]);
-			},
-		},
-	];
-};
 const state = reactive({
 	loading: false,
 	menuData: [] as Array<SysMenu>,
-	columns: generateColumns(),
 	queryParams: {
 		title: undefined,
 		type: undefined,