Browse Source

😎1、默认关闭发送异常邮件 2、调整组织架构种子 3、文件管理增加租户标识 4、修复在线用户链接异常 5、升级Furion v4.9.5.4及其他依赖 6、暂时去掉fast-crud 7、修复代码生成模板列排序 8、其他优化

zuohuaijun 1 year ago
parent
commit
92d4719b44

+ 5 - 5
Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj

@@ -18,9 +18,9 @@
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.4.0" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
     <PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.15.1" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.5.3" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.5.3" />
-    <PackageReference Include="Furion.Pure" Version="4.9.5.3" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.5.4" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.5.4" />
+    <PackageReference Include="Furion.Pure" Version="4.9.5.4" />
     <PackageReference Include="IPTools.China" Version="1.6.0" />
     <PackageReference Include="IPTools.International" Version="1.6.0" />
     <PackageReference Include="Magicodes.IE.Excel" Version="2.7.5.1" />
@@ -33,12 +33,12 @@
     <PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
     <PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.2" />
     <PackageReference Include="SkiaSharp.NativeAssets.Linux.NoDependencies" Version="2.88.8" />
-    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.4.0" />
+    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.5.0" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.7.0" />
     <PackageReference Include="SqlSugarCore" Version="5.1.4.166" />
     <PackageReference Include="SSH.NET" Version="2024.1.0" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.4.4" />
-    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1067" />
+    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1069" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
   </ItemGroup>

+ 1 - 1
Admin.NET/Admin.NET.Core/Entity/SysFile.cs

@@ -12,7 +12,7 @@ namespace Admin.NET.Core;
 [SugarTable(null, "系统文件表")]
 [SysTable]
 [SugarIndex("index_{table}_F", nameof(FileName), OrderByType.Asc)]
-public partial class SysFile : EntityBaseData
+public partial class SysFile : EntityTenantBaseData
 {
     /// <summary>
     /// 提供者

+ 1 - 0
Admin.NET/Admin.NET.Core/Hub/OnlineUserHub.cs

@@ -48,6 +48,7 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
         var realName = httpContext.User.FindFirst(ClaimConst.RealName)?.Value;
         var tenantId = (httpContext.User.FindFirst(ClaimConst.TenantId)?.Value).ToLong();
 
+        if (userId < 0 || string.IsNullOrWhiteSpace(account)) return;
         var user = new SysOnlineUser
         {
             ConnectionId = Context.ConnectionId,

+ 1 - 1
Admin.NET/Admin.NET.Core/SeedData/SysConfigSeedData.cs

@@ -29,7 +29,7 @@ public class SysConfigSeedData : ISqlSugarEntitySeedData<SysConfig>
             new SysConfig{ Id=1300000000171, Name="图形验证码", Code=ConfigConst.SysCaptcha, Value="True", SysFlag=YesNoEnum.Y, Remark="是否开启图形验证码", OrderNo=80, GroupCode="WebConfig", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysConfig{ Id=1300000000181, Name="Token过期时间", Code=ConfigConst.SysTokenExpire, Value="10080", SysFlag=YesNoEnum.Y, Remark="Token过期时间(分钟)", OrderNo=90, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysConfig{ Id=1300000000191, Name="RefreshToken过期时间", Code=ConfigConst.SysRefreshTokenExpire, Value="20160", SysFlag=YesNoEnum.Y, Remark="刷新Token过期时间(分钟)(一般 refresh_token 的有效时间 > 2 * access_token 的有效时间)", OrderNo=100, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
-            new SysConfig{ Id=1300000000201, Name="发送异常日志邮件", Code=ConfigConst.SysErrorMail, Value="True", SysFlag=YesNoEnum.Y, Remark="是否发送异常日志邮件", OrderNo=110, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
+            new SysConfig{ Id=1300000000201, Name="发送异常日志邮件", Code=ConfigConst.SysErrorMail, Value="False", SysFlag=YesNoEnum.Y, Remark="是否发送异常日志邮件", OrderNo=110, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysConfig{ Id=1300000000211, Name="域登录验证", Code=ConfigConst.SysDomainLogin, Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启域登录验证", OrderNo=120, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysConfig{ Id=1300000000221, Name="数据校验日志", Code=ConfigConst.SysValidationLog, Value="True", SysFlag=YesNoEnum.Y, Remark="是否数据校验日志", OrderNo=130, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
             new SysConfig{ Id=1300000000231, Name="行政区域同步层级", Code=ConfigConst.SysRegionSyncLevel, Value="3", SysFlag=YesNoEnum.Y, Remark="行政区域同步层级 1-省级,2-市级,3-区县级,4-街道级,5-村级", OrderNo=140, GroupCode="Default", CreateTime=DateTime.Parse("2022-02-10 00:00:00") },

+ 1 - 2
Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs

@@ -102,7 +102,7 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             new SysMenu{ Id=1310000000319, Pid=1310000000311, Title="设置状态", Permission="sysTenant:setStatus", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
 
             new SysMenu{ Id=1310000000321, Pid=1310000000301, Title="菜单管理", Path="/platform/menu", Name="sysMenu", Component="/system/menu/index", Icon="ele-Menu", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 },
-            new SysMenu{ Id=1310000000322, Pid=1310000000321, Title="查询", Permission="sysMenu:list", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
+            //new SysMenu{ Id=1310000000322, Pid=1310000000321, Title="查询", Permission="sysMenu:list", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
             new SysMenu{ Id=1310000000323, Pid=1310000000321, Title="编辑", Permission="sysMenu:update", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
             new SysMenu{ Id=1310000000324, Pid=1310000000321, Title="增加", Permission="sysMenu:add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
             new SysMenu{ Id=1310000000325, Pid=1310000000321, Title="删除", Permission="sysMenu:delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
@@ -194,7 +194,6 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             new SysMenu{ Id=1310000000621, Pid=1310000000601, Title="代码生成", Path="/develop/codeGen", Name="sysCodeGen", Component="/system/codeGen/index", Icon="ele-Crop", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 },
             new SysMenu{ Id=1310000000631, Pid=1310000000601, Title="表单设计", Path="/develop/formDes", Name="sysFormDes", Component="/system/formDes/index", Icon="ele-Edit", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 },
             new SysMenu{ Id=1310000000641, Pid=1310000000601, Title="系统接口", Path="/develop/api", Name="sysApi", Component="layout/routerView/iframe", IsIframe=true, OutLink="http://localhost:5005", Icon="ele-Help", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=130 },
-            new SysMenu{ Id=1310000000681, Pid=1310000000601, Title="FastCrud", Path="/develop/fastCrud", Name="sysFastCrud", Component="/system/fastCrud/index",  Icon="ele-CoffeeCup", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=150},
 
             new SysMenu{ Id=1310000000701, Pid=0, Title="帮助文档", Path="/doc", Name="doc", Component="Layout", Icon="ele-Notebook", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=14000 },
             new SysMenu{ Id=1310000000711, Pid=1310000000701, Title="框架教程", Path="/doc/admin", Name="sysAdmin", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="http://101.43.53.74:5050/", Icon="ele-Sunny", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },

+ 4 - 15
Admin.NET/Admin.NET.Core/SeedData/SysOrgSeedData.cs

@@ -20,22 +20,11 @@ public class SysOrgSeedData : ISqlSugarEntitySeedData<SysOrg>
     {
         return new[]
         {
-            new SysOrg{ Id=SqlSugarConst.DefaultTenantId, Pid=0, Name="XXX公司", Code="1001", Type="101", Level=1, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="XXX公司", TenantId=SqlSugarConst.DefaultTenantId },
+            new SysOrg{ Id=SqlSugarConst.DefaultTenantId, Pid=0, Name="系统默认", Code="1001", Type="101", Level=1, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="系统默认", TenantId=SqlSugarConst.DefaultTenantId },
             new SysOrg{ Id=SqlSugarConst.DefaultTenantId + 1, Pid=SqlSugarConst.DefaultTenantId, Name="市场部", Code="100101", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=SqlSugarConst.DefaultTenantId + 2, Pid=SqlSugarConst.DefaultTenantId, Name="研发部", Code="100102", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="研发部", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=SqlSugarConst.DefaultTenantId + 3, Pid=SqlSugarConst.DefaultTenantId, Name="财务部", Code="100103", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务部", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=SqlSugarConst.DefaultTenantId + 4, Pid=SqlSugarConst.DefaultTenantId, Name="财务部1", Code="10010301", Level=3, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务部1", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=SqlSugarConst.DefaultTenantId + 5, Pid=SqlSugarConst.DefaultTenantId, Name="财务部2", Code="10010302", Level=3, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务部2", TenantId=SqlSugarConst.DefaultTenantId },
-
-            new SysOrg{ Id=1300000000201, Pid=0, Name="分公司1", Code="1002", Type="201", Level=1, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="分公司1", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=1300000000202, Pid=1300000000201, Name="市场部", Code="100201", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=1300000000203, Pid=1300000000201, Name="研发部", Code="100202", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="研发部", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=1300000000204, Pid=1300000000201, Name="财务部", Code="100203", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="财务部", TenantId=SqlSugarConst.DefaultTenantId },
-
-            new SysOrg{ Id=1300000000301, Pid=0, Name="分公司2", Code="1003", Type="201", Level=1, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="分公司2", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=1300000000302, Pid=1300000000301, Name="市场部", Code="100301", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=1300000000303, Pid=1300000000301, Name="研发部", Code="100302", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=SqlSugarConst.DefaultTenantId },
-            new SysOrg{ Id=1300000000304, Pid=1300000000301, Name="财务部", Code="100303", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="市场部", TenantId=SqlSugarConst.DefaultTenantId },
+            new SysOrg{ Id=SqlSugarConst.DefaultTenantId + 2, Pid=SqlSugarConst.DefaultTenantId, Name="开发部", Code="100102", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="开发部", TenantId=SqlSugarConst.DefaultTenantId },
+            new SysOrg{ Id=SqlSugarConst.DefaultTenantId + 3, Pid=SqlSugarConst.DefaultTenantId, Name="售后部", Code="100103", Level=2, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="售后部", TenantId=SqlSugarConst.DefaultTenantId },
+            new SysOrg{ Id=SqlSugarConst.DefaultTenantId + 4, Pid=SqlSugarConst.DefaultTenantId, Name="其他", Code="10010301", Level=3, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), Remark="其他", TenantId=SqlSugarConst.DefaultTenantId },
         };
     }
 }

+ 5 - 4
Admin.NET/Admin.NET.Core/Service/Tenant/SysTenantService.cs

@@ -238,12 +238,13 @@ public class SysTenantService : IDynamicApiController, ITransient
 
         // 默认租户管理员角色菜单集合
         var menuIdList = new List<long> { 1300000000111,1300000000121, // 工作台
-            1310000000111,1310000000112,1310000000113,1310000000114,1310000000115,1310000000116,1310000000117,1310000000118,1310000000119,1310000000120, // 账号
+            1310000000111,1310000000112,1310000000113,1310000000114,1310000000115,1310000000116,1310000000117,1310000000118,1310000000119,1310000000120,1310000000121, // 账号
             1310000000131,1310000000132,1310000000133,1310000000134,1310000000135,1310000000136,1310000000137,1310000000138, // 角色
             1310000000141,1310000000142,1310000000143,1310000000144,1310000000145, // 机构
-            1310000000151,1310000000152,1310000000153,1310000000154,1310000000155, // 职位
-            1310000000161,1310000000162,1310000000163,1310000000164, // 个人中心
-            1310000000171,1310000000172,1310000000173,1310000000174,1310000000175,1310000000176,1310000000177 // 通知公告
+            1310000000151,1310000000152,1310000000153,1310000000154,1310000000155,1310000000156, // 职位
+            1310000000161,1310000000162,1310000000163,1310000000164,1310000000165, // 个人中心
+            1310000000171,1310000000172,1310000000173,1310000000174,1310000000175,1310000000176, // 通知公告
+            1310000000801  // 关于项目
         };
         await _sysRoleMenuService.GrantRoleMenu(new RoleMenuInput() { Id = newRole.Id, MenuIdList = menuIdList });
     }

+ 6 - 3
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/index.vue.vm

@@ -263,7 +263,10 @@
   const tableParams = ref({
     page: 1,
     pageSize: 10,
-    total: 0,
+    field: 'createTime', // 默认的排序字段
+    order: 'descending', // 排序方向
+    descstr: 'descending', // 降序排序的关键字符
+    total: 0 as any,
   });
 
   const print@(@Model.ClassName)Title = ref("");
@@ -285,8 +288,8 @@
 
   // 列排序
   const sortChange = async (column: any) => {
-	queryParams.value.field = column.prop;
-	queryParams.value.order = column.order;
+	tableParams.value.field = column.prop;
+	tableParams.value.order = column.order;
 	await handleQuery();
   };
 

+ 6 - 11
Web/package.json

@@ -2,7 +2,7 @@
 	"name": "admin.net",
 	"type": "module",
 	"version": "2.4.33",
-	"lastBuildTime": "2024.08.14",
+	"lastBuildTime": "2024.08.15",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",
 	"author": "zuohuaijun",
 	"license": "MIT",
@@ -15,11 +15,6 @@
 	},
 	"dependencies": {
 		"@element-plus/icons-vue": "^2.3.1",
-		"@fast-crud/fast-crud": "^1.21.2",
-		"@fast-crud/fast-extends": "^1.21.2",
-		"@fast-crud/ui-element": "^1.21.2",
-		"@fast-crud/ui-interface": "^1.21.2",
-		"@iconify/vue": "^4.1.2",
 		"@logicflow/core": "^1.2.28",
 		"@logicflow/extension": "^1.2.28",
 		"@microsoft/signalr": "^8.0.7",
@@ -31,7 +26,7 @@
 		"@wangeditor/editor-for-vue": "^5.1.12",
 		"animate.css": "^4.1.1",
 		"async-validator": "^4.2.5",
-		"axios": "^1.7.3",
+		"axios": "^1.7.4",
 		"countup.js": "^2.8.0",
 		"cropperjs": "^1.6.2",
 		"echarts": "^5.5.1",
@@ -80,10 +75,10 @@
 		"@types/node": "^20.14.15",
 		"@types/nprogress": "^0.2.3",
 		"@types/sortablejs": "^1.15.8",
-		"@typescript-eslint/eslint-plugin": "^7.18.0",
-		"@typescript-eslint/parser": "^7.18.0",
+		"@typescript-eslint/eslint-plugin": "^8.1.0",
+		"@typescript-eslint/parser": "^8.1.0",
 		"@vitejs/plugin-vue": "^5.1.2",
-		"@vitejs/plugin-vue-jsx": "^4.0.0",
+		"@vitejs/plugin-vue-jsx": "^4.0.1",
 		"@vue/compiler-sfc": "^3.4.37",
 		"code-inspector-plugin": "^0.15.2",
 		"eslint": "^8.57.0",
@@ -97,7 +92,7 @@
 		"typescript": "^5.5.4",
 		"vite": "^5.4.0",
 		"vite-plugin-cdn-import": "^1.0.1",
-		"vite-plugin-compression2": "^1.1.3",
+		"vite-plugin-compression2": "^1.1.4",
 		"vite-plugin-vue-setup-extend": "^0.4.0",
 		"vue-eslint-parser": "^9.4.3"
 	},

+ 8 - 0
Web/src/api-services/models/sys-file.ts

@@ -100,6 +100,14 @@ export interface SysFile {
      */
     createOrgName?: string | null;
 
+    /**
+     * 租户Id
+     *
+     * @type {number}
+     * @memberof SysFile
+     */
+    tenantId?: number | null;
+
     /**
      * 提供者
      *

+ 14 - 9
Web/src/layout/navBars/topBar/user.vue

@@ -52,7 +52,7 @@
 				<ele-User />
 			</el-icon>
 		</div>
-		<el-dropdown :show-timeout="70" :hide-timeout="50" @command="onHandleCommandClick">
+		<el-dropdown :show-timeout="70" :hide-timeout="50" size="large" @command="onHandleCommandClick">
 			<span class="layout-navbars-breadcrumb-user-link">
 				<el-tooltip effect="dark" placement="left">
 					<template #content>
@@ -65,7 +65,6 @@
 					</template>
 					<img :src="userInfos.avatar" class="layout-navbars-breadcrumb-user-link-photo mr5" />
 				</el-tooltip>
-
 				{{ userInfos.realName == '' ? userInfos.account : userInfos.realName }}
 				<el-icon class="el-icon--right">
 					<ele-ArrowDown />
@@ -74,8 +73,9 @@
 			<template #dropdown>
 				<el-dropdown-menu>
 					<!-- <el-dropdown-item command="/dashboard/home">{{ $t('message.user.dropdown1') }}</el-dropdown-item> -->
-					<el-dropdown-item command="/system/userCenter">{{ $t('message.user.dropdown2') }}</el-dropdown-item>
-					<el-dropdown-item divided command="logOut">{{ $t('message.user.dropdown5') }}</el-dropdown-item>
+					<el-dropdown-item :icon="Avatar" command="/system/userCenter">{{ $t('message.user.dropdown2') }}</el-dropdown-item>
+					<el-dropdown-item :icon="Loading" command="clearCache">{{ $t('message.user.dropdown3') }}</el-dropdown-item>
+					<el-dropdown-item :icon="CircleCloseFilled" divided command="logOut">{{ $t('message.user.dropdown5') }}</el-dropdown-item>
 				</el-dropdown-menu>
 			</template>
 		</el-dropdown>
@@ -85,7 +85,7 @@
 </template>
 
 <script setup lang="ts" name="layoutBreadcrumbUser">
-import { defineAsyncComponent, ref, computed, reactive, onMounted, onUnmounted } from 'vue';
+import { defineAsyncComponent, ref, computed, reactive, onMounted } from 'vue';
 import { useRouter } from 'vue-router';
 import { ElMessageBox, ElMessage, ElNotification } from 'element-plus';
 import screenfull from 'screenfull';
@@ -95,12 +95,13 @@ import { useUserInfo } from '/@/stores/userInfo';
 import { useThemeConfig } from '/@/stores/themeConfig';
 import other from '/@/utils/other';
 import mittBus from '/@/utils/mitt';
-import { Local } from '/@/utils/storage';
+import { Local, Session } from '/@/utils/storage';
+import Push from 'push.js';
+import { signalR } from '/@/views/system/onlineUser/signalR';
+import { Avatar, CircleCloseFilled, Loading } from '@element-plus/icons-vue';
 
 import { clearAccessTokens, getAPI } from '/@/utils/axios-utils';
 import { SysAuthApi, SysNoticeApi } from '/@/api-services/api';
-import Push from 'push.js';
-import { signalR } from '/@/views/system/onlineUser/signalR';
 
 // 引入组件
 const UserNews = defineAsyncComponent(() => import('/@/layout/navBars/topBar/userNews.vue'));
@@ -153,7 +154,11 @@ const onLayoutSetingClick = () => {
 };
 // 下拉菜单点击时
 const onHandleCommandClick = (path: string) => {
-	if (path === 'logOut') {
+	if (path === 'clearCache') {
+		Local.clear();
+		Session.clear();
+		window.location.reload();
+	} else if (path === 'logOut') {
 		ElMessageBox({
 			closeOnClickModal: false,
 			closeOnPressEscape: false,

+ 0 - 88
Web/src/main.ts

@@ -28,92 +28,4 @@ const app = createApp(App);
 directive(app);
 other.elSvg(app);
 
-// #region  FastCrud配置
-import { FastCrud } from '@fast-crud/fast-crud';
-import '@fast-crud/fast-crud/dist/style.css';
-import ui from '@fast-crud/ui-element';
-import { FsExtendsUploader, FsExtendsEditor } from '@fast-crud/fast-extends';
-import '@fast-crud/fast-extends/dist/style.css';
-app.use(ui);
-app.use(FastCrud, {
-	i18n,
-	commonOptions() {
-		return {
-			request: {
-				transformQuery: ({ page, form, sort }) => {
-					const order = sort == null ? {} : { orderProp: sort.prop, orderAsc: sort.asc };
-					return { page: page?.currentPage, pageSize: page?.pageSize, ...form, ...order };
-				},
-				// page请求结果转换
-				transformRes: ({ res }) => {
-					const records = res.data.result.items;
-					const total = res.data.result.total;
-					const currentPage = res.data.result.page;
-					const pageSize = res.data.result.pageSize;
-					return {
-						currentPage: currentPage,
-						pageSize: pageSize,
-						total: total,
-						records,
-					};
-				},
-				form: {
-					display: 'flex', // 表单布局
-					labelWidth: '120px', // 表单label宽度
-				},
-			},
-		};
-	},
-});
-
-const baseURL = import.meta.env.VITE_API_URL;
-import request from '/@/utils/request';
-import { getToken } from '/@/utils/axios-utils';
-// 文件上传
-app.use(FsExtendsUploader, {
-	defaultType: 'form',
-	form: {
-		action: baseURL + '/api/sysFile/uploadFile',
-		name: 'file',
-		withCredentials: false,
-		uploadRequest: async (props) => {
-			const { action, file, onProgress } = props;
-			const data = new FormData();
-			data.append('file', file);
-			const token = getToken();
-			const Authorization = token ? `Bearer ${token}` : null;
-			const result = await request({
-				url: action,
-				method: 'post',
-				data,
-				headers: {
-					'Content-Type': 'multipart/form-data',
-					Authorization: Authorization,
-				},
-				timeout: 60000,
-				onUploadProgress(progress) {
-					onProgress({ percent: Math.round((progress.loaded / progress.total!) * 100) });
-				},
-			});
-			if (result) {
-				return result.data;
-			} else {
-				throw new Error(result.message);
-			}
-		},
-		async successHandle(ret: any) {
-			return {
-				url: baseURL + '/' + ret.result.filePath + '/' + ret.result.id + ret.result.suffix,
-				key: ret.result.fileName,
-			};
-		},
-	},
-});
-
-// 富文本编辑器
-app.use(FsExtendsEditor, {
-	wangEditor: {},
-});
-// #endregion
-
 app.use(pinia).use(router).use(ElementPlus).use(i18n).use(VueGridLayout).use(VForm3).use(VueSignaturePad).use(vue3TreeOrg).mount('#app');

+ 0 - 180
Web/src/views/system/fastCrud/crud.tsx

@@ -1,180 +0,0 @@
-import { ref } from 'vue';
-import { ElMessage } from 'element-plus';
-import { dict, compute, EditReq, DelReq, AddReq } from '@fast-crud/fast-crud';
-
-import { getAPI } from '/@/utils/axios-utils';
-import { SysNoticeApi } from '/@/api-services/api';
-import { PageFileInput } from '/@/api-services/models';
-
-export default function ({ expose }) {
-	// 分页查询
-	const pageRequest = async (query: any) => {
-		const params = {
-			page: query.currentPage,
-			pageSize: query.pageSize,
-			field: query.field,
-			order: query.order,
-			descStr: 'desc',
-		} as PageFileInput;
-		const result = await getAPI(SysNoticeApi).apiSysNoticePagePost(params);
-		return result;
-	};
-	// 编辑
-	const editRequest = async ({ form, row }: EditReq) => {
-		if (form.id == null) {
-			form.id = row.id;
-		}
-		return await getAPI(SysNoticeApi)
-			.apiSysNoticeUpdatePost(form)
-			.then((rsp: any) => {
-				if (rsp.data.code == 200) {
-					ElMessage.success('修改成功!');
-				} else {
-					ElMessage.error('修改失败:' + rsp.data.message);
-				}
-			});
-	};
-	// 删除
-	const delRequest = async ({ row }: DelReq) => {
-		return await getAPI(SysNoticeApi).apiSysNoticeDeletePost(row);
-	};
-	// 增加
-	const addRequest = async ({ form }: AddReq) => {
-		return await getAPI(SysNoticeApi).apiSysNoticeAddPost(form);
-	};
-	// 选择
-	const selectedIds = ref([]);
-	const onSelectionChange = (changed: any) => {
-		selectedIds.value = changed;
-	};
-	return {
-		selectedIds,
-		crudOptions: {
-			container: {
-				is: 'fs-layout-card',
-			},
-			form: {
-				wrapper: {
-					// is: 'el-drawer',
-					// width: '80%',
-					draggable: false,
-					closeOnEsc: false,
-					maskClosable: false,
-				},
-			},
-			search: {
-				show: true,
-			},
-			actionbar: {},
-			toolbar: {
-				show: true,
-				buttons: {
-					search: { show: true },
-					refresh: { show: true },
-					compact: { show: true },
-					export: { show: true },
-					columns: { show: true },
-				},
-			},
-			table: {
-				scrollX: 725,
-				bordered: false,
-				rowKey: (row: any) => row.id,
-				checkedRowKeys: selectedIds,
-				'onUpdate:checkedRowKeys': onSelectionChange,
-			},
-			pagination: {
-				show: true,
-			},
-			request: {
-				pageRequest,
-				addRequest,
-				editRequest,
-				delRequest,
-			},
-			rowHandle: {
-				fixed: 'right',
-				align: 'center',
-				width: 200,
-				buttons: {
-					view: { show: true },
-					edit: { show: true },
-				},
-			},
-			columns: {
-				_checked: {
-					title: '选择',
-					form: { show: false },
-					column: {
-						type: 'selection',
-						align: 'center',
-						width: '55px',
-						columnSetDisabled: true,
-						disabled(row: any) {
-							return row.account === 'gvanet';
-						},
-					},
-				},
-				type: {
-					title: '类型',
-					type: 'dict-select',
-					search: { show: true, col: { span: 6 } },
-					column: {
-						align: 'center',
-						width: '120px',
-					},
-					dict: dict({
-						value: 'id',
-						label: 'text',
-						data: [
-							{ id: '1', text: '通知' },
-							{ id: '2', text: '公告' },
-						],
-					}),
-					form: {
-						col: { span: 24 },
-						rule: [{ required: true, message: '请输入类型' }],
-					},
-				},
-				title: {
-					title: '标题',
-					type: 'text',
-					search: { show: true, col: { span: 6 } },
-					column: {
-						align: 'center',
-						width: 'auto',
-					},
-					form: {
-						col: { span: 24 },
-						rule: [{ required: true, message: '请输入标题' }],
-					},
-				},
-				content: {
-					title: '内容',
-					type: 'editor-wang5',
-					search: { show: false, col: { span: 6 } },
-					column: {
-						show: false,
-					},
-					form: {
-						col: { span: 24 },
-						rule: [{ required: true, message: '请输入内容' }],
-						component: {
-							disabled: compute(({ form }) => {
-								return form.disabled;
-							}),
-							id: '1', // 当同一个页面有多个editor时,需要配置不同的id
-							config: {},
-							uploader: {
-								type: 'form',
-								buildUrl(res: any) {
-									return res.url;
-								},
-							},
-						},
-					},
-				},
-			},
-		},
-	};
-}

+ 0 - 66
Web/src/views/system/fastCrud/index.vue

@@ -1,66 +0,0 @@
-<template>
-	<div class="h-full">
-		<fs-crud ref="crudRef" v-bind="crudBinding">
-			<template #pagination-left>
-				<fs-button icon="ion:trash-outline" @click="handleBatchDelete" />
-			</template>
-			<template #cell_url="scope">
-				<n-tooltip trigger="hover">
-					<template #trigger>
-						<n-button> 预览 </n-button>
-					</template>
-					<n-image width="120px" height="120px" :src="baseURL + '/' + scope.row.url"></n-image>
-				</n-tooltip>
-			</template>
-		</fs-crud>
-	</div>
-</template>
-
-<script lang="ts">
-import { defineComponent, onMounted, ref } from 'vue';
-import { useExpose, useCrud } from '@fast-crud/fast-crud';
-import createCrudOptions from './crud';
-
-const baseURL = import.meta.env.VITE_API_URL;
-
-export default defineComponent({
-	name: 'FastCrud',
-	setup() {
-		const crudRef = ref();
-		const crudBinding = ref();
-		const { expose } = useExpose({ crudRef, crudBinding });
-		const { crudOptions, selectedIds } = createCrudOptions({ expose });
-		const { resetCrudOptions } = useCrud({ expose, crudOptions });
-
-		// 页面初始化
-		onMounted(() => {
-			expose.doRefresh();
-		});
-		// 批量删除
-		const handleBatchDelete = async () => {
-			if (selectedIds.value?.length > 0) {
-				// ElMessageBox.confirm(`确定要批量删除这${selectedIds.value.length}条记录吗`, '确认', {
-				//     confirmButtonText: '确定',
-				//     cancelButtonText: '取消',
-				//     type: 'info',
-				// }).then(async () => {
-				//        await delBatchSysFile(selectedIds.value);
-				//       message.success('删除成功');
-				//       selectedIds.value = [];
-				//       await expose.doRefresh();
-				//         ElMessage.success('删除成功');
-				//     })
-				//     .catch(() => { });
-			} else {
-				// ElMessage.success('请勾选要删除的记录');
-			}
-		};
-		return {
-			crudBinding,
-			crudRef,
-			handleBatchDelete,
-			baseURL,
-		};
-	},
-});
-</script>