Kaynağa Gözat

合并最新

X5ZJ 2 yıl önce
ebeveyn
işleme
6cd97f48c7
30 değiştirilmiş dosya ile 277 ekleme ve 159 silme
  1. 0 1
      Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj
  2. 6 6
      Admin.NET/Admin.NET.Core/Admin.NET.Core.csproj
  3. 11 9
      Admin.NET/Admin.NET.Core/Attribute/SeedDataAttribute.cs
  4. 45 0
      Admin.NET/Admin.NET.Core/Attribute/ThemeAttribute.cs
  5. 18 1
      Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs
  6. 4 0
      Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs
  7. 2 2
      Admin.NET/Admin.NET.Core/SeedData/SysMenuSeedData.cs
  8. 1 1
      Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs
  9. 16 0
      Admin.NET/Admin.NET.Core/Service/Config/Dto/ConfigInput.cs
  10. 5 5
      Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs
  11. 2 2
      Admin.NET/Admin.NET.Core/Service/Message/SysSmsService.cs
  12. 5 2
      Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs
  13. 1 1
      Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs
  14. 4 4
      Admin.NET/Admin.NET.Core/Util/CommonUtil.cs
  15. 6 0
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm
  16. 1 1
      Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm
  17. 4 4
      Admin.NET/Plugins/Admin.NET.Plugin.GoView/Service/GoViewSys/GoViewSysService.cs
  18. 2 2
      Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj
  19. 0 0
      Web/.prettierrc.cjs
  20. 9 9
      Web/package.json
  21. 0 1
      Web/src/App.vue
  22. 102 94
      Web/src/views/about/index.vue
  23. 6 0
      Web/src/views/system/codeGen/component/editCodeGenDialog.vue
  24. 7 7
      Web/src/views/system/database/component/addTable.vue
  25. 0 2
      Web/src/views/system/infoSetting/index.vue
  26. 2 2
      Web/src/views/system/job/component/editJobDetail.vue
  27. 5 1
      Web/src/views/system/org/index.vue
  28. 1 1
      Web/src/views/system/print/component/hiprint/preview.vue
  29. 1 1
      Web/vite.config.ts
  30. 11 0
      一键净化项目.bat

+ 0 - 1
Admin.NET/Admin.NET.Application/Admin.NET.Application.csproj

@@ -29,7 +29,6 @@
     <ProjectReference Include="..\Plugins\Admin.NET.Plugin.ApprovalFlow\Admin.NET.Plugin.ApprovalFlow.csproj" />
     <ProjectReference Include="..\Plugins\Admin.NET.Plugin.DingTalk\Admin.NET.Plugin.DingTalk.csproj" />
     <ProjectReference Include="..\Plugins\Admin.NET.Plugin.GoView\Admin.NET.Plugin.GoView.csproj" />
-    <ProjectReference Include="..\Plugins\Admin.NET.Plugin.ReZero\Admin.NET.Plugin.ReZero.csproj" />
   </ItemGroup>
 
 </Project>

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

@@ -17,10 +17,10 @@
     <PackageReference Include="AngleSharp" Version="1.1.2" />
     <PackageReference Include="AspectCore.Extensions.Reflection" Version="2.4.0" />
     <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
-    <PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.14.0" />
-    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.4" />
-    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.4" />
-    <PackageReference Include="Furion.Pure" Version="4.9.4" />
+    <PackageReference Include="Elastic.Clients.Elasticsearch" Version="8.14.2" />
+    <PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.4.1" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.4.1" />
+    <PackageReference Include="Furion.Pure" Version="4.9.4.1" />
     <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,11 +33,11 @@
     <PackageReference Include="RabbitMQ.Client" Version="6.8.1" />
     <PackageReference Include="SixLabors.ImageSharp.Web" Version="3.1.2" />
     <PackageReference Include="SKIT.FlurlHttpClient.Wechat.Api" Version="3.3.0" />
-    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.4.0" />
+    <PackageReference Include="SKIT.FlurlHttpClient.Wechat.TenpayV3" Version="3.5.0" />
     <PackageReference Include="SqlSugarCore" Version="5.1.4.158" />
     <PackageReference Include="SSH.NET" Version="2024.0.0" />
     <PackageReference Include="System.Linq.Dynamic.Core" Version="1.4.0" />
-    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1023" />
+    <PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1028" />
     <PackageReference Include="UAParser" Version="3.1.47" />
     <PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
   </ItemGroup>

+ 11 - 9
Admin.NET/Admin.NET.Core/Service/Config/Dto/ConfigBatchInput.cs → Admin.NET/Admin.NET.Core/Attribute/SeedDataAttribute.cs

@@ -4,20 +4,22 @@
 //
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
-namespace Admin.NET.Core.Service;
+namespace Admin.NET.Core;
 
 /// <summary>
-/// 配置批量更新参数
+/// 种子数据特性
 /// </summary>
-public class ConfigBatchInput
+[SuppressSniffer]
+[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
+public class SeedDataAttribute : Attribute
 {
     /// <summary>
-    /// 编码
+    /// 排序(越大越后执行)
     /// </summary>
-    public string Code { get; set; }
+    public int Order { get; set; } = 0;
 
-    /// <summary>
-    /// 属性值
-    /// </summary>
-    public string Value { get; set; }
+    public SeedDataAttribute(int orderNo)
+    {
+        Order = orderNo;
+    }
 }

+ 45 - 0
Admin.NET/Admin.NET.Core/Attribute/ThemeAttribute.cs

@@ -0,0 +1,45 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
+namespace Admin.NET.Core;
+
+/// <summary>
+/// 枚举拓展主题样式
+/// </summary>
+[SuppressSniffer]
+[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field)]
+public class ThemeAttribute : Attribute
+{
+    public string Theme { get; private set; }
+
+    public ThemeAttribute(string theme)
+    {
+        this.Theme = theme;
+    }
+}
+
+public static class ThemeExtend
+{
+    /// <summary>
+    /// 扩展方法
+    /// </summary>
+    /// <param name="enumValue"></param>
+    /// <returns></returns>
+    public static string GetTheme(this Enum enumValue)
+    {
+        Type type = enumValue.GetType();
+        FieldInfo field = type.GetField(enumValue.ToString());
+        if (field.IsDefined(typeof(ThemeAttribute), true))
+        {
+            var themeAttribute = (ThemeAttribute)field.GetCustomAttribute(typeof(ThemeAttribute));
+            return themeAttribute.Theme;
+        }
+        else
+        {
+            return string.Empty;
+        }
+    }
+}

+ 18 - 1
Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs

@@ -1,4 +1,4 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
 //
 // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
 //
@@ -166,6 +166,17 @@ public static class EnumExtension
             ?.GetCustomAttribute<DescriptionAttribute>()?.Description;
     }
 
+    /// <summary>
+    /// 获取枚举的Theme
+    /// </summary>
+    /// <param name="value"></param>
+    /// <returns></returns>
+    public static string GetTheme(this object value)
+    {
+        return value.GetType().GetMember(value.ToString() ?? string.Empty).FirstOrDefault()
+            ?.GetCustomAttribute<ThemeAttribute>()?.Theme;
+    }
+
     /// <summary>
     /// 将枚举转成枚举信息集合
     /// </summary>
@@ -183,6 +194,7 @@ public static class EnumExtension
             {
                 Name = item.ToString(),
                 Describe = item.GetDescription() ?? item.ToString(),
+                Theme = item.GetTheme() ?? string.Empty,
                 Value = item.GetHashCode()
             };
         }).ToList();
@@ -213,6 +225,11 @@ public class EnumEntity
     /// </summary>
     public string Describe { set; get; }
 
+    /// <summary>
+    /// 枚举的样式
+    /// </summary>
+    public string Theme { set; get; }
+
     /// <summary>
     /// 枚举名称
     /// </summary>

+ 4 - 0
Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs

@@ -59,7 +59,11 @@ public class EnumToDictJob : IJob
                                 dictData.Value = enumData.Value.ToString();
                                 dictData.Code = enumData.Name;
                                 dictData.OrderNo = enumData.Value + 10;
+<<<<<<< HEAD
 								dictData.Name = enumData.Describe;
+=======
+                                dictData.Name = enumData.Describe;
+>>>>>>> upstream/next
                                 uSysDictData.Add(dictData);
                             }
                         });

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

@@ -191,8 +191,8 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
             new SysMenu{ Id=1310000000711, Pid=1310000000701, Title="后台教程", Path="/doc/furion", Name="sysFurion", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="https://furion.baiqian.ltd/", Icon="ele-Promotion", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
             new SysMenu{ Id=1310000000712, Pid=1310000000701, Title="前端教程", Path="/doc/element", Name="sysElement", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="https://element-plus.gitee.io/zh-CN/", Icon="ele-Position", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=110 },
             new SysMenu{ Id=1310000000713, Pid=1310000000701, Title="SqlSugar", Path="/doc/SqlSugar", Name="sysSqlSugar", Component="layout/routerView/link", IsIframe=false, IsKeepAlive=false, OutLink="https://www.donet5.com/Home/Doc", Icon="ele-Coin", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=120 },
-			
-			new SysMenu{ Id=1310000000801, Pid=0, Title="关于项目", Path="/about", Name="about", Component="/about/index", Icon="ele-Warning", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2023-03-12 00:00:00"), OrderNo=18000 },
+
+            new SysMenu{ Id=1310000000801, Pid=0, Title="关于项目", Path="/about", Name="about", Component="/about/index", Icon="ele-InfoFilled", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2023-03-12 00:00:00"), OrderNo=15000 },
         };
     }
 }

+ 1 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenConfigService.cs

@@ -112,7 +112,7 @@ public class SysCodeGenConfigService : IDynamicApiController, ITransient
             codeGenConfig.PropertyName = tableColumn.PropertyName;// 实体属性名
             codeGenConfig.ColumnLength = tableColumn.ColumnLength;// 长度
             codeGenConfig.ColumnComment = tableColumn.ColumnComment;
-            codeGenConfig.NetType = tableColumn.DataType;
+            codeGenConfig.NetType = tableColumn.NetType;
             codeGenConfig.WhetherRetract = YesNoEnum.N.ToString();
 
             // 生成代码时,主键并不是必要输入项,故一定要排除主键字段

+ 16 - 0
Admin.NET/Admin.NET.Core/Service/Config/Dto/ConfigInput.cs

@@ -38,4 +38,20 @@ public class UpdateConfigInput : AddConfigInput
 
 public class DeleteConfigInput : BaseIdInput
 {
+}
+
+/// <summary>
+/// 批量配置参数输入
+/// </summary>
+public class BatchConfigInput
+{
+    /// <summary>
+    /// 编码
+    /// </summary>
+    public string Code { get; set; }
+
+    /// <summary>
+    /// 属性值
+    /// </summary>
+    public string Value { get; set; }
 }

+ 5 - 5
Admin.NET/Admin.NET.Core/Service/Config/SysConfigService.cs

@@ -215,16 +215,16 @@ public class SysConfigService : IDynamicApiController, ITransient
     /// <summary>
     /// 批量更新参数配置值
     /// </summary>
-    /// <param name="configBatchInputs"></param>    
+    /// <param name="input"></param>
     /// <returns></returns>
     [ApiDescriptionSettings(Name = "BatchUpdate"), HttpPost]
     [DisplayName("批量更新参数配置值")]
-    public async Task BatchUpdateConfig(List<ConfigBatchInput> configBatchInputs)
+    public async Task BatchUpdateConfig(List<BatchConfigInput> input)
     {
-        foreach (var input in configBatchInputs)
+        foreach (var Config in input)
         {
-            await _sysConfigRep.AsUpdateable().SetColumns(u => u.Value == input.Value).Where(u => u.Code == input.Code).ExecuteCommandAsync();
-            _sysCacheService.Remove($"{CacheConst.KeyConfig}{input.Code}");
+            await _sysConfigRep.AsUpdateable().SetColumns(u => u.Value == Config.Value).Where(u => u.Code == Config.Code).ExecuteCommandAsync();
+            _sysCacheService.Remove($"{CacheConst.KeyConfig}{Config.Code}");
         }
     }
 

+ 2 - 2
Admin.NET/Admin.NET.Core/Service/Message/SysSmsService.cs

@@ -99,10 +99,10 @@ public class SysSmsService : IDynamicApiController, ITransient
     {
         if (!phoneNumber.TryValidate(ValidationTypes.PhoneNumber).IsValid)
             throw Oops.Oh("请正确填写手机号码");
+
         if (string.IsNullOrWhiteSpace(templateParam.ToString()))
-        {
             throw Oops.Oh("短信内容不能为空");
-        }
+
         var client = CreateAliyunClient();
         var sendSmsRequest = new SendSmsRequest
         {

+ 5 - 2
Admin.NET/Admin.NET.Core/SqlSugar/SqlSugarSetup.cs

@@ -323,7 +323,8 @@ public static class SqlSugarSetup
         if (config.SeedSettings.EnableInitSeed)
         {
             var seedDataTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.GetInterfaces().Any(i => i.HasImplementedRawGeneric(typeof(ISqlSugarEntitySeedData<>))))
-                .WhereIF(config.SeedSettings.EnableIncreSeed, u => u.IsDefined(typeof(IncreSeedAttribute), false)).ToList();
+                .WhereIF(config.SeedSettings.EnableIncreSeed, u => u.IsDefined(typeof(IncreSeedAttribute), false))
+                .OrderBy(u => u.GetCustomAttributes(typeof(SeedDataAttribute), false).Length > 0 ? (u.GetCustomAttributes(typeof(SeedDataAttribute), false)[0] as SeedDataAttribute).Order : 0).ToList();
 
             foreach (var seedType in seedDataTypes)
             {
@@ -383,7 +384,9 @@ public static class SqlSugarSetup
         db.DbMaintenance.CreateDatabase();
 
         // 获取所有业务表-初始化租户库表结构(排除系统表、日志表、特定库表)
-        var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false) &&
+        var entityTypes = App.EffectiveTypes
+            .Where(u => !u.GetCustomAttributes<IgnoreTableAttribute>().Any())
+            .Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false) &&
             !u.IsDefined(typeof(SysTableAttribute), false) && !u.IsDefined(typeof(LogTableAttribute), false) && !u.IsDefined(typeof(TenantAttribute), false)).ToList();
         if (!entityTypes.Any()) return;
 

+ 1 - 1
Admin.NET/Admin.NET.Core/Util/CodeGenUtil.cs

@@ -242,7 +242,7 @@ public static class CodeGenUtil
             "bit" => "bool",
             "money" or "smallmoney" or "numeric" or "decimal" => "decimal",
             "real" => "Single",
-            "datetime" or "smalldatetime" => "DateTime",
+            "datetime" or "datetime2" or "smalldatetime" => "DateTime",
             "float" or "double" => "double",
             "image" or "binary" or "varbinary" => "byte[]",
             "uniqueidentifier" => "Guid",

+ 4 - 4
Admin.NET/Admin.NET.Core/Util/CommonUtil.cs

@@ -104,24 +104,24 @@ public static class CommonUtil
     /// 导出模板Excel
     /// </summary>
     /// <returns></returns>
-    public static async Task<IActionResult> ExportExcelTemplate<T>() where T : class, new()
+    public static async Task<IActionResult> ExportExcelTemplate<T>(string fileName = null) where T : class, new()
     {
         IImporter importer = new ExcelImporter();
         var res = await importer.GenerateTemplateBytes<T>();
 
-        return new FileContentResult(res, "application/octet-stream") { FileDownloadName = typeof(T).Name + ".xlsx" };
+        return new FileContentResult(res, "application/octet-stream") { FileDownloadName = $"{(string.IsNullOrEmpty(fileName) ? typeof(T).Name : fileName)}.xlsx" };
     }
 
     /// <summary>
     /// 导出数据excel
     /// </summary>
     /// <returns></returns>
-    public static async Task<IActionResult> ExportExcelData<T>(ICollection<T> data) where T : class, new()
+    public static async Task<IActionResult> ExportExcelData<T>(ICollection<T> data, string fileName = null) where T : class, new()
     {
         var export = new ExcelExporter();
         var res = await export.ExportAsByteArray<T>(data);
 
-        return new FileContentResult(res, "application/octet-stream") { FileDownloadName = typeof(T).Name + ".xlsx" };
+        return new FileContentResult(res, "application/octet-stream") { FileDownloadName = $"{(string.IsNullOrEmpty(fileName) ? typeof(T).Name : fileName)}.xlsx" };
     }
 
     /// <summary>

+ 6 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/Service.cs.vm

@@ -1,3 +1,9 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+
 using Admin.NET.Core.Service;
 using @(@Model.NameSpace).Entity;
 using Microsoft.AspNetCore.Http;

+ 1 - 1
Admin.NET/Admin.NET.Web.Entry/wwwroot/Template/index.vue.vm

@@ -219,7 +219,7 @@
   @if(@Model.TableField.Any(x=>x.EffectType == "ConstSelector")){
   @:import { codeToName, getConstType } from "/@@/utils/constHelper";
   } 
-  @if(@Model.TableField.Any(x=>x.EffectType == "Select")){
+  @if(@Model.TableField.Any(x=>x.EffectType == "Select") || @Model.TableField.Any(x=>x.EffectType == "EnumSelector")){
   @:import { getDictDataItem as di, getDictDataList as dl } from '/@@/utils/dict-utils';
   }
   @if(@Model.TableField.Any(x=>x.EffectType == "EnumSelector")){

+ 4 - 4
Admin.NET/Plugins/Admin.NET.Plugin.GoView/Service/GoViewSys/GoViewSysService.cs

@@ -1,4 +1,4 @@
-// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
 //
 // 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
 //
@@ -34,7 +34,7 @@ public class GoViewSysService : IDynamicApiController
     [DisplayName("GoView 登录")]
     public async Task<GoViewLoginOutput> Login(GoViewLoginInput input)
     {
-        _sysCacheService.Set(CommonConst.SysCaptcha, false);
+        _sysCacheService.Set($"{CacheConst.KeyConfig}{CommonConst.SysCaptcha}", false);
 
         input.Password = CryptogramUtil.SM2Encrypt(input.Password);
         var loginResult = await _sysAuthService.Login(new LoginInput()
@@ -43,7 +43,7 @@ public class GoViewSysService : IDynamicApiController
             Password = input.Password,
         });
 
-        _sysCacheService.Remove(CommonConst.SysCaptcha);
+        _sysCacheService.Remove($"{CacheConst.KeyConfig}{CommonConst.SysCaptcha}");
 
         var sysUser = await _sysUserRep.AsQueryable().ClearFilter().FirstAsync(u => u.Account.Equals(input.Username));
         return new GoViewLoginOutput()
@@ -77,7 +77,7 @@ public class GoViewSysService : IDynamicApiController
     [AllowAnonymous]
     [ApiDescriptionSettings(Name = "GetOssInfo")]
     [DisplayName("获取 OSS 上传接口")]
-    public static Task<GoViewOssUrlOutput> GetOssInfo()
+    public Task<GoViewOssUrlOutput> GetOssInfo()
     {
         return Task.FromResult(new GoViewOssUrlOutput { BucketURL = "" });
     }

+ 2 - 2
Admin.NET/Plugins/Admin.NET.Plugin.ReZero/Admin.NET.Plugin.ReZero.csproj

@@ -24,8 +24,8 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Rezero.Api" Version="1.6.5" />
-  </ItemGroup>  
+    <PackageReference Include="Rezero.Api" Version="1.7.1" />
+  </ItemGroup>
 
   <ItemGroup>
     <ProjectReference Include="..\..\Admin.NET.Core\Admin.NET.Core.csproj" />

+ 0 - 0
Web/.prettierrc.js → Web/.prettierrc.cjs


+ 9 - 9
Web/package.json

@@ -2,7 +2,7 @@
 	"name": "admin.net",
 	"type": "module",
 	"version": "2.4.33",
-	"lastBuildTime":"2024.6.14",
+	"lastBuildTime": "2024.6.16",
 	"description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",
 	"author": "zuohuaijun",
 	"license": "MIT",
@@ -51,14 +51,14 @@
 		"splitpanes": "^3.1.5",
 		"vcrontab-3": "^3.3.22",
 		"vform3-builds": "^3.0.10",
-		"vue": "^3.4.27",
+		"vue": "^3.4.29",
 		"vue-clipboard3": "^2.0.0",
 		"vue-demi": "^0.14.8",
 		"vue-grid-layout": "3.0.0-beta1",
 		"vue-i18n": "^9.13.1",
 		"vue-json-pretty": "^2.4.0",
 		"vue-plugin-hiprint": "0.0.57-beta20",
-		"vue-router": "^4.3.2",
+		"vue-router": "^4.3.3",
 		"vue-signature-pad": "^3.0.2",
 		"vue3-tree-org": "^4.2.2",
 		"vuedraggable": "4.1.0",
@@ -70,13 +70,13 @@
 		"@types/node": "^20.14.2",
 		"@types/nprogress": "^0.2.3",
 		"@types/sortablejs": "^1.15.8",
-		"@typescript-eslint/eslint-plugin": "^7.12.0",
-		"@typescript-eslint/parser": "^7.12.0",
+		"@typescript-eslint/eslint-plugin": "^7.13.0",
+		"@typescript-eslint/parser": "^7.13.0",
 		"@vitejs/plugin-vue": "^5.0.5",
 		"@vitejs/plugin-vue-jsx": "^4.0.0",
-		"@vue/compiler-sfc": "^3.4.27",
-		"code-inspector-plugin": "^0.14.1",
-		"eslint": "^9.4.0",
+		"@vue/compiler-sfc": "^3.4.29",
+		"code-inspector-plugin": "^0.14.2",
+		"eslint": "^9.5.0",
 		"eslint-plugin-vue": "^9.26.0",
 		"less": "^4.2.0",
 		"prettier": "^3.3.2",
@@ -84,7 +84,7 @@
 		"sass": "^1.77.5",
 		"terser": "^5.31.1",
 		"typescript": "^5.4.5",
-		"vite": "^5.2.13",
+		"vite": "^5.3.1",
 		"vite-plugin-cdn-import": "^1.0.1",
 		"vite-plugin-compression2": "^1.1.1",
 		"vite-plugin-vue-setup-extend": "^0.4.0",

+ 0 - 1
Web/src/App.vue

@@ -118,7 +118,6 @@ const loadSysInfo = () => {
 
 			const data = res.data.result;
 			// 系统logo
-			data.sysLogo = window.__env__.VITE_API_URL + data.sysLogo;
 			themeConfig.value.logoUrl = data.sysLogo;
 			// 主标题
 			themeConfig.value.globalTitle = data.sysTitle;

+ 102 - 94
Web/src/views/about/index.vue

@@ -1,111 +1,119 @@
 <template>
-  <div class="el-card box">
-    
-    <div class="card mb10">
-      <h4 class="title"><el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Postcard /> </el-icon>简介(About)</h4>
-      <span class="text">
-           基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发框架,前端采用 Vue3+Element-plus+Vite5,整合众多优秀技术和框架,模块插件式开发。集成多租户、缓存、数据校验、鉴权、事件总线、动态API、通讯、远程请求、任务调度、打印等众多黑科技。代码结构简单清晰,注释详尽,易于上手与二次开发,即便是复杂业务逻辑也能迅速实现,真正实现“开箱即用”。
-      </span>
-    </div>
-    <div class="card mb10">
-      <h4 class="title"><el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Warning /> </el-icon>项目信息(Information)</h4>
-      <el-descriptions :column="2" border>
-        <el-descriptions-item label="名称及作者">
-          <el-tag>{{ name }}</el-tag> <el-tag type="info">{{ author }}</el-tag>
-        </el-descriptions-item>
-        
-        <el-descriptions-item label="框架描述">
-          <el-tag>{{ description }}</el-tag>
-        </el-descriptions-item>
+	<div class="el-card box">
+		<div class="card mb10">
+			<h4 class="title">
+				<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Postcard /> </el-icon>简介(About)
+			</h4>
+			<span class="text">
+				基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发框架,前端采用
+				Vue3+Element-plus+Vite5,整合众多优秀技术和框架,模块插件式开发。集成多租户、缓存、数据校验、鉴权、事件总线、动态API、通讯、远程请求、任务调度、打印等众多黑科技。代码结构简单清晰,注释详尽,易于上手与二次开发,即便是复杂业务逻辑也能迅速实现,真正实现“开箱即用”。
+			</span>
+		</div>
+		<div class="card mb10">
+			<h4 class="title">
+				<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Warning /> </el-icon>项目信息(Information)
+			</h4>
+			<el-descriptions :column="2" border>
+				<el-descriptions-item label="名称及作者">
+					<el-tag>{{ name }}</el-tag> <el-tag type="info">{{ author }}</el-tag>
+				</el-descriptions-item>
 
-        <el-descriptions-item label="版本号">
-          <el-tag>{{ version }}</el-tag> <el-tag type="success">{{ license }}</el-tag>
-        </el-descriptions-item>
+				<el-descriptions-item label="框架描述">
+					<el-tag>{{ description }}</el-tag>
+				</el-descriptions-item>
 
-        <el-descriptions-item label="发布时间">
-          <el-tag>{{ lastBuildTime }}</el-tag>
-        </el-descriptions-item>
+				<el-descriptions-item label="版本号">
+					<el-tag>{{ version }}</el-tag> <el-tag type="success">{{ license }}</el-tag>
+				</el-descriptions-item>
 
-        <el-descriptions-item label="Gitee">
-          <el-link type="primary" href="https://gitee.com/zuohuaijun/Admin.NET" target="_blank"> Gitee </el-link>
-        </el-descriptions-item>
-        <el-descriptions-item label="Github">
-          <el-link type="primary" href="https://github.com/zuohuaijun/Admin.NET.git" target="_blank"> Github </el-link>
-        </el-descriptions-item>
+				<el-descriptions-item label="发布时间">
+					<el-tag>{{ lastBuildTime }}</el-tag>
+				</el-descriptions-item>
 
-        <el-descriptions-item label="文档地址">
-          <el-link type="primary" href="http://101.43.53.74:5050/" target="_blank"> 文档地址 </el-link>
-        </el-descriptions-item>
-        <el-descriptions-item label="预览地址">
-          <el-link type="primary" href="http://101.43.53.74:5005/dist/index.html" target="_blank"> 预览地址 </el-link>
-        </el-descriptions-item>
+				<el-descriptions-item label="Gitee">
+					<el-link type="primary" href="https://gitee.com/zuohuaijun/Admin.NET" target="_blank"> Gitee </el-link>
+				</el-descriptions-item>
+				<el-descriptions-item label="Github">
+					<el-link type="primary" href="https://github.com/zuohuaijun/Admin.NET.git" target="_blank"> Github </el-link>
+				</el-descriptions-item>
 
-      </el-descriptions>
-    </div>
-    <div class="card mb10">
-      <h4 class="title"><el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-SetUp /> </el-icon>生产环境依赖(Dependencies)</h4>
-      <el-descriptions :column="3" border>
-        <el-descriptions-item v-for="(value, key) in dependencies" :key="key" width="400px" :label="key">
-          <el-tag type="success" effect="plain">
-            {{ value }}
-          </el-tag>
-        </el-descriptions-item>
-      </el-descriptions>
-    </div>
-    <div class="card">
-      <h4 class="title"><el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-SetUp /> </el-icon>开发环境依赖(devDependencies)</h4>
-      <el-descriptions :column="3" border>
-        <el-descriptions-item v-for="(value, key) in devDependencies" :key="key" width="400px" :label="key">
-          <el-tag type="danger" effect="plain">
-            {{ value }}
-          </el-tag>
-        </el-descriptions-item>
-      </el-descriptions>
-    </div>
-    <div class="card">
-      <h4 class="title"><el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-SetUp /> </el-icon>关键词(Keywords)</h4>
-      <el-descriptions :column="4" border>
-        <el-descriptions-item v-for="(value, key) in keywords" :key="value" width="400px" :label="key+1">
-          <el-text type="primary">
-            {{ value }}
-          </el-text>
-        </el-descriptions-item>
-      </el-descriptions>
-    </div>
-
-  </div>
+				<el-descriptions-item label="文档地址">
+					<el-link type="primary" href="http://101.43.53.74:5050/" target="_blank"> 文档地址 </el-link>
+				</el-descriptions-item>
+				<el-descriptions-item label="预览地址">
+					<el-link type="primary" href="http://101.43.53.74:5005/dist/index.html" target="_blank"> 预览地址 </el-link>
+				</el-descriptions-item>
+			</el-descriptions>
+		</div>
+		<div class="card mb10">
+			<h4 class="title">
+				<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-SetUp /> </el-icon>生产环境依赖(Dependencies)
+			</h4>
+			<el-descriptions :column="3" border>
+				<el-descriptions-item v-for="(value, key) in dependencies" :key="key" width="400px" :label="key">
+					<el-tag type="success" effect="plain">
+						{{ value }}
+					</el-tag>
+				</el-descriptions-item>
+			</el-descriptions>
+		</div>
+		<div class="card">
+			<h4 class="title">
+				<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-SetUp /> </el-icon>开发环境依赖(devDependencies)
+			</h4>
+			<el-descriptions :column="3" border>
+				<el-descriptions-item v-for="(value, key) in devDependencies" :key="key" width="400px" :label="key">
+					<el-tag type="danger" effect="plain">
+						{{ value }}
+					</el-tag>
+				</el-descriptions-item>
+			</el-descriptions>
+		</div>
+		<div class="card">
+			<h4 class="title">
+				<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-SetUp /> </el-icon>关键词(Keywords)
+			</h4>
+			<el-descriptions :column="4" border>
+				<el-descriptions-item v-for="(value, key) in keywords" :key="value" width="400px" :label="key + 1">
+					<el-text type="primary">
+						{{ value }}
+					</el-text>
+				</el-descriptions-item>
+			</el-descriptions>
+		</div>
+	</div>
 </template>
 
 <script setup lang="ts" name="about">
 import PackageJson from '/package.json';
 
-const { dependencies, devDependencies,keywords, version,lastBuildTime,author,description,license,name } = PackageJson;
+const { dependencies, devDependencies, keywords, version, lastBuildTime, author, description, license, name } = PackageJson;
 </script>
 
 <style lang="scss" scoped>
-  .box{
-    overflow-y: auto;
-  }
-  el-descriptions-item{
-    width: 50%;
-  }
+.box {
+	overflow-y: auto;
+}
+el-descriptions-item {
+	width: 50%;
+}
 .card {
-  padding: 10px;
-  .title {
-    margin: 5px 5px 10px;
-    font-size: 17px;
-    font-weight: bold;
-    color: var(--el-text-color-primary);
-  }
-  .text {
-    text-indent:50px;
-    font-size: 15px;
-    line-height: 30px;
-    padding: 10px 20px;
-    color: var(--el-text-color-regular);
-    .el-link {
-      font-size: 15px;
-    }
-  }
+	padding: 10px;
+	.title {
+		margin: 5px 5px 10px;
+		font-size: 17px;
+		font-weight: bold;
+		color: var(--el-text-color-primary);
+	}
+	.text {
+		text-indent: 50px;
+		font-size: 15px;
+		line-height: 30px;
+		padding: 10px 20px;
+		color: var(--el-text-color-regular);
+		.el-link {
+			font-size: 15px;
+		}
+	}
 }
 </style>

+ 6 - 0
Web/src/views/system/codeGen/component/editCodeGenDialog.vue

@@ -87,6 +87,7 @@
 								clearable
 								class="w100"
 								v-model="state.ruleForm.menuPid"
+								@change="menuChange"
 							>
 								<template #default="{ node, data }">
 									<span>{{ data.title }}</span>
@@ -210,6 +211,11 @@ const tableChanged = (item: any) => {
 	state.ruleForm.busName = item.tableComment;
 };
 
+// 菜单改变
+const menuChange = (menu: any) => {
+	state.ruleForm.pagePath = state.menuData.find((x) => x.id == menu)?.name;
+};
+
 // print改变
 const printTypeChanged = () => {
 	if (state.ruleForm.printType === '') return;

+ 7 - 7
Web/src/views/system/database/component/addTable.vue

@@ -300,13 +300,13 @@ function handleColDown(record: EditRecordRow, index: number) {
 }
 
 function ChangeExForArray(index1: number, index2: number, array: Array<EditRecordRow>) {
-	let maxIndex = state.tableData.length - 1;//最大索引
-    if (index2 > maxIndex) {
-        index2 = 0;
-    };
-    if (index2 < 0) {
-        index2 = maxIndex;
-    }
+	let maxIndex = state.tableData.length - 1; //最大索引
+	if (index2 > maxIndex) {
+		index2 = 0;
+	}
+	if (index2 < 0) {
+		index2 = maxIndex;
+	}
 	let temp = array[index1];
 	array[index1] = array[index2];
 	array[index2] = temp;

+ 0 - 2
Web/src/views/system/infoSetting/index.vue

@@ -116,8 +116,6 @@ const loadData = async () => {
 		if (res.data!.type !== 'success') return;
 
 		const result = res.data.result;
-		result.sysLogo = window.__env__.VITE_API_URL + result.sysLogo;
-
 		state.formData = {
 			sysLogoBlob: undefined,
 			sysLogo: result.sysLogo,

+ 2 - 2
Web/src/views/system/job/component/editJobDetail.vue

@@ -39,7 +39,7 @@
 								</el-form-item>
 							</el-col>
 							<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20" v-show="!isEdit && !isHttpCreateType">
-								<el-form-item prop="includeAnnotations">
+								<el-form-item prop="includeAnnotation">
 									<template v-slot:label>
 										<div>
 											扫描触发器
@@ -48,7 +48,7 @@
 											</el-tooltip>
 										</div>
 									</template>
-									<el-radio-group v-model="state.ruleForm.includeAnnotations">
+									<el-radio-group v-model="state.ruleForm.includeAnnotation">
 										<el-radio :value="true">是</el-radio>
 										<el-radio :value="false">否</el-radio>
 									</el-radio-group>

+ 5 - 1
Web/src/views/system/org/index.vue

@@ -107,10 +107,14 @@ const handleQuery = async (updateTree: boolean = false) => {
 	// 是否更新左侧机构列表树
 	if (updateTree == true) {
 		orgTreeRef.value?.initTreeData();
+		// 更新编辑页面机构列表树
+		var res = await getAPI(SysOrgApi).apiSysOrgListGet(0);
+		state.orgTreeData = res.data.result ?? [];
 	}
 
 	// 若无选择节点并且查询条件为空时,更新编辑页面机构列表树
-	if (state.queryParams.id == 0 && state.queryParams.name == undefined && state.queryParams.code == undefined && state.queryParams.type == undefined) state.orgTreeData = state.orgData;
+	if (state.queryParams.id == 0 && state.queryParams.name == undefined && state.queryParams.code == undefined && state.queryParams.type == undefined && updateTree == false)
+		state.orgTreeData = state.orgData;
 };
 
 // 重置操作

+ 1 - 1
Web/src/views/system/print/component/hiprint/preview.vue

@@ -1,5 +1,5 @@
 <template>
-	<el-dialog v-model="state.dialogVisible" draggable :close-on-click-modal="false" :width="state.width + 8 + 'mm'">
+	<el-dialog v-model="state.dialogVisible" draggable :close-on-click-modal="false" :width="Number(state.width) + Number(8) + 'mm'">
 		<div id="preview_content" ref="previewContentRef"></div>
 		<template #footer>
 			<el-button :loading="state.waitShowPrinter" type="primary" icon="ele-Printer" @click.stop="print">直接打印</el-button>

+ 1 - 1
Web/vite.config.ts

@@ -31,7 +31,7 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
 			vue(),
 			vueJsx(),
 			webUpdateNotice({
-                versionType: 'build_timestamp',
+				versionType: 'build_timestamp',
 				notificationConfig: {
 					placement: 'topLeft',
 				},

+ 11 - 0
一键净化项目.bat

@@ -0,0 +1,11 @@
+@echo OFF
+ :begin
+ REM 删除前端文件及文件夹
+ DEL /f /s /q ".\Web\node_modules\*.*"
+ RD /s /q ".\Web\node_modules"
+ REM 循环删除指定文件夹下的文件夹
+ FOR /d /r ".\Admin.NET\" %%b in (bin,obj,public) do rd /s /q "%%b"
+ ECHO 【处理完毕,按任意键退出】
+ PAUSE>NUL
+ EXIT
+ GOTO BEGIN