From 5fc90977b5cfd3271d7317b551a2cbb6c17daa2a Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Wed, 16 Aug 2023 19:11:00 +0800 Subject: [PATCH 01/70] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Const/CateGoryConst.cs | 5 + .../SimpleAdmin.SqlSugar.xml | 5 + .../SimpleAdmin.System/Entity/SysResource.cs | 78 +++++++++- .../SimpleAdmin.System/Entity/SysUser.cs | 13 ++ .../Services/Auth/Auth/AuthService.cs | 6 +- .../Services/Auth/Auth/Dto/AuthOutPut.cs | 20 +++ .../System/Relation/IRelationService.cs | 13 +- .../System/Relation/RelationService.cs | 12 ++ .../Resource/Resource/IResourceService.cs | 7 +- .../Resource/Resource/ResourceService.cs | 17 ++- .../Services/System/Role/RoleService.cs | 26 +++- .../Services/System/User/SysUserService.cs | 7 +- .../System/UserCenter/Dto/UserCenterInput.cs | 26 +++- .../System/UserCenter/IUserCenterService.cs | 7 + .../System/UserCenter/UserCenterService.cs | 16 ++- .../SimpleAdmin.System/SimpleAdmin.System.xml | 136 ++++++++++++++++-- .../System/Auth/AuthBController.cs | 4 +- .../System/System/UserCenterController.cs | 11 ++ .../SimpleAdmin.Web.Core.xml | 6 + 19 files changed, 372 insertions(+), 43 deletions(-) diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs index 43cc43a..dcd8970 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs @@ -60,6 +60,11 @@ public class CateGoryConst /// public const string Relation_SYS_ROLE_HAS_RESOURCE = "SYS_ROLE_HAS_RESOURCE"; + /// + /// 角色有哪些模块 + /// + public const string Relation_SYS_ROLE_HAS_MODULE = "SYS_ROLE_HAS_MODULE"; + /// ///用户有哪些资源 /// diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 6f08d6f..8407098 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -54,6 +54,11 @@ 角色有哪些资源 + + + 角色有哪些模块 + + 用户有哪些资源 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs index 8ecaa27..430b107 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs @@ -25,6 +25,21 @@ public class SysResource : BaseEntity [SugarColumn(ColumnName = "Name", ColumnDescription = "别名", Length = 200, IsNullable = true)] public string Name { get; set; } + /// + /// 别名 + /// + [SugarColumn(ColumnName = "Description", ColumnDescription = "描述", Length = 200, IsNullable = true)] + public string Description { get; set; } + + + /// + /// 别名 + /// + [SugarColumn(ColumnName = "Avatar", ColumnDescription = "头像", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + public string Avatar { get; set; } + + + /// /// 编码 /// @@ -68,10 +83,36 @@ public class SysResource : BaseEntity public virtual string Icon { get; set; } /// - /// 颜色 + /// 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + /// + [SugarColumn(ColumnName = "ActiveMenu", ColumnDescription = "需要高亮的 path (通常用作详情页高亮父级菜单)", Length = 200, IsNullable = true)] + public string ActiveMenu { get; set; } + + + /// + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// + [SugarColumn(ColumnName = "IsHide", ColumnDescription = "是否在菜单中隐藏 (通常列表详情页需要隐藏) ", IsNullable = true)] + public bool IsHide { get; set; } + + + /// + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// + [SugarColumn(ColumnName = "IsFull", ColumnDescription = "菜单是否全屏 (示例:数据大屏页面)", IsNullable = true)] + public bool IsFull { get; set; } + + /// + /// 菜单是否固定在标签页中 (首页通常是固定项) + /// + [SugarColumn(ColumnName = "IsAffix", ColumnDescription = "菜单是否固定在标签页中 (首页通常是固定项)", IsNullable = true)] + public bool IsAffix { get; set; } + + /// + /// 菜单是否固定在标签页中 (首页通常是固定项) /// - [SugarColumn(ColumnName = "Color", ColumnDescription = "颜色", Length = 200, IsNullable = true)] - public string Color { get; set; } + [SugarColumn(ColumnName = "IsKeepAlive", ColumnDescription = " 当前路由是否缓存", IsNullable = true)] + public bool IsKeepAlive { get; set; } /// /// 排序码 @@ -86,7 +127,7 @@ public class SysResource : BaseEntity public Meta Meta { get; set; } /// - /// 字节点 + /// 子节点 /// [SugarColumn(IsIgnore = true)] public List Children { get; set; } @@ -117,8 +158,31 @@ public class Meta /// public bool Affix { get; set; } = false; + /// - /// 是否隐藏 - /// - public bool hidden { get; set; } = false; + /// 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + /// + public string ActiveMenu { get; set; } + + + /// + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// + public bool IsHide { get; set; } = false; + + + /// + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// + public bool IsFull { get; set; } + + /// + /// 菜单是否固定在标签页中 (首页通常是固定项) + /// + public bool IsAffix { get; set; } + + /// + /// 菜单是否固定在标签页中 (首页通常是固定项) + /// + public bool IsKeepAlive { get; set; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs index bbcc98e..00dfcd7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs @@ -280,6 +280,13 @@ public class SysUser : BaseEntity [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } + + /// + /// 默认模块 + /// + [SugarColumn(ColumnName = "DefaultModule", ColumnDescription = "默认模块", IsNullable = true)] + public long? DefaultModule { get; set; } + /// /// 机构信息 /// @@ -339,6 +346,12 @@ public class SysUser : BaseEntity /// [SugarColumn(IsIgnore = true)] public List ScopeOrgChildList { get; set; } + + /// + /// 机构及以下机构ID集合 + /// + [SugarColumn(IsIgnore = true)] + public List ModuleList { get; set; } = new List(); } /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs index 4661a3e..889978c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs @@ -263,7 +263,7 @@ public class AuthService : IAuthService public async Task ExecLoginB(SysUser sysUser, AuthDeviceTypeEumu device, LoginClientTypeEnum loginClientType) { if (sysUser.UserStatus == DevDictConst.COMMON_STATUS_DISABLED) throw Oops.Bah("账号已停用");//账号冻结 - + if (sysUser.ModuleList.Count == 0) throw Oops.Bah("该账号未分配模块,请联系管理员");//没有分配菜单权限 //生成Token var accessToken = JWTEncryption.Encrypt(new Dictionary { @@ -306,7 +306,9 @@ public class AuthService : IAuthService { Token = accessToken, Account = sysUser.Account, - Name = sysUser.Name + Name = sysUser.Name, + DefaultModule = sysUser.DefaultModule, + ModuleList = sysUser.ModuleList }; } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs index 927a0c1..fb1f14d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs @@ -39,6 +39,16 @@ public class LoginOutPut /// 姓名 /// public string Name { get; set; } + + /// + /// 默认模块 + /// + public long? DefaultModule { get; set; } + + /// + /// 模块列表 + /// + public List ModuleList { get; set; } } /// @@ -121,4 +131,14 @@ public class LoginUserOutput /// 按钮码集合 /// public List ButtonCodeList { get; set; } + + /// + /// 机构及以下机构ID集合 + /// + public List ModuleList { get; set; } = new List(); + + /// + /// 默认模块 + /// + public long? DefaultModule { get; set; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs index 0fde331..339b5ee 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs @@ -68,7 +68,8 @@ public interface IRelationService : ITransient /// 是否清除老的数据 /// 是否刷新缓存 /// - Task SaveRelation(string category, long objectId, string targetId, string extJson, bool clear, bool refreshCache = true); + Task SaveRelation(string category, long objectId, string targetId, + string extJson, bool clear, bool refreshCache = true); /// /// 批量保存关系 @@ -79,5 +80,13 @@ public interface IRelationService : ITransient /// 拓展信息列表 /// 是否清除老的数据 /// - Task SaveRelationBatch(string category, long objectId, List targetIds, List extJsons, bool clear); + Task SaveRelationBatch(string category, long objectId, List targetIds, + List extJsons, bool clear); + + /// + /// 根据角色ID获取模块ID列表 + /// + /// 角色ID列表 + /// 模块ID列表 + Task> GetModuleByRoleId(List roleIdList); } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs index 5e5862c..c9ef5d7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs @@ -145,4 +145,16 @@ public class Relationservice : DbRepository, IRelationService throw Oops.Oh(ErrorCodeEnum.A0003); } } + + /// + public async Task> GetModuleByRoleId(List roleIdList) + { + var moduleIds = new List(); + var relation = await GetRelationByCategory(CateGoryConst.Relation_SYS_ROLE_HAS_MODULE);//获取关系集合 + if (relation != null && relation.Count > 0) + { + moduleIds = relation.Where(it => roleIdList.Contains(it.ObjectId)).Select(it => it.TargetId.ToLong()).ToList(); + } + return moduleIds; + } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs index 3ebff09..a1da3f4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs @@ -53,9 +53,10 @@ public interface IResourceService : ITransient /// /// 根据菜单ID获取菜单 /// - /// 菜单id列表 - /// 菜单列表 - Task> GetMenuByMenuIds(List menuIds); + /// id列表 + /// 分类 + /// + Task> GetResourcesByIds(List ids, string category); /// /// 获取权限授权树 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs index 907b06a..086ef8a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs @@ -123,7 +123,7 @@ public class ResourceService : DbRepository, IResourceService /// public async Task> ResourceTreeSelector() { - List resourceTreeSelectors = new List();//定义结果 + var resourceTreeSelectors = new List();//定义结果 //获取模块列表 var moduleList = await GetListByCategory(CateGoryConst.Resource_MODULE); //遍历模块 @@ -140,7 +140,7 @@ public class ResourceService : DbRepository, IResourceService /// public List PermissionTreeSelector(List routes) { - List permissions = new List();//权限列表 + var permissions = new List();//权限列表 // 获取所有需要数据权限的控制器 var controllerTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(RolePermissionAttribute), false)); @@ -201,15 +201,18 @@ public class ResourceService : DbRepository, IResourceService } /// - public async Task> GetMenuByMenuIds(List menuIds) + public async Task> GetResourcesByIds(List ids, string category) { //获取所有菜单 - var menuList = await GetListByCategory(CateGoryConst.Resource_MENU); + var menuList = await GetListByCategory(category); //获取菜单信息 - var menus = menuList.Where(it => menuIds.Contains(it.Id)).ToList(); + var menus = menuList.Where(it => ids.Contains(it.Id)).ToList(); return menus; } + + + #region 方法 /// @@ -285,8 +288,8 @@ public class ResourceService : DbRepository, IResourceService public async Task> GetRoleGrantResourceMenus(long moduleId) { var roleGrantResourceMenus = new List();//定义结果 - List allMenuList = (await GetListByCategory(CateGoryConst.Resource_MENU)).Where(it => it.Module == moduleId).ToList();//获取所有菜单列表 - List allButtonList = await GetListByCategory(CateGoryConst.Resource_BUTTON);//获取所有按钮列表 + var allMenuList = (await GetListByCategory(CateGoryConst.Resource_MENU)).Where(it => it.Module == moduleId).ToList();//获取所有菜单列表 + var allButtonList = await GetListByCategory(CateGoryConst.Resource_BUTTON);//获取所有按钮列表 var parentMenuList = allMenuList.Where(it => it.ParentId == SimpleAdminConst.Zero).ToList();//获取一级目录 //遍历一级目录 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs index 437f88d..aa38622 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs @@ -200,12 +200,31 @@ public class RoleService : DbRepository, IRoleService /// public async Task GrantResource(GrantResourceInput input) { + var allMenus = await _resourceService.GetListByCategory(ResourceConst.MENU);//获取所有菜单 var menuIds = input.GrantInfoList.Select(it => it.MenuId).ToList();//菜单ID var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 var relationRoles = new List();//要添加的角色资源和授权关系表 var sysRole = (await GetListAsync()).Where(it => it.Id == input.Id).FirstOrDefault();//获取角色 if (sysRole != null) { + #region 角色模块处理 + + var menusList = allMenus.Where(it => menuIds.Contains(it.Id)).ToList();//获取菜单信息 + //获取我的模块信息Id列表 + var moduleIds = menusList.Select(it => it.Module.Value).Distinct().ToList(); + moduleIds.ForEach(it => + { + //将角色资源添加到列表 + relationRoles.Add(new SysRelation + { + ObjectId = sysRole.Id, + TargetId = it.ToString(), + Category = CateGoryConst.Relation_SYS_ROLE_HAS_MODULE + }); + }); + + #endregion + #region 角色资源处理 //遍历菜单列表 @@ -229,7 +248,7 @@ public class RoleService : DbRepository, IRoleService var defaultDataScope = sysRole.DefaultDataScope;//获取默认数据范围 //获取菜单信息 - var menus = await _resourceService.GetMenuByMenuIds(menuIds); + var menus = allMenus.Where(it => menuIds.Contains(it.Id)).ToList(); if (menus.Count > 0) { //获取权限授权树 @@ -260,7 +279,8 @@ public class RoleService : DbRepository, IRoleService //如果不是代码生成,就删除老的 if (!input.IsCodeGen) await relatioRep.DeleteAsync(it => - it.ObjectId == sysRole.Id && (it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE)); + it.ObjectId == sysRole.Id && (it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE + || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_MODULE)); await relatioRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 @@ -382,7 +402,7 @@ public class RoleService : DbRepository, IRoleService if (menuIds.Any()) { //获取菜单信息 - var menus = await _resourceService.GetMenuByMenuIds(menuIds); + var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); //获取权限授权树 var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); if (permissions.Count > 0) diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs index 49034e6..cc52ab2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs @@ -331,7 +331,7 @@ public class SysUserService : DbRepository, ISysUserService if (menuIds.Any()) { //获取菜单信息 - var menus = await _resourceService.GetMenuByMenuIds(menuIds); + var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); //获取权限授权树 var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); if (permissions.Count > 0) @@ -520,7 +520,7 @@ public class SysUserService : DbRepository, ISysUserService var defaultDataScope = input.DefaultDataScope;//获取默认数据范围 //获取菜单信息 - var menus = await _resourceService.GetMenuByMenuIds(menuIds); + var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); if (menus.Count > 0) { //获取权限授权树 @@ -1017,6 +1017,9 @@ public class SysUserService : DbRepository, ISysUserService sysUser.DataScopeList = dataScopeList; var scopeOrgChildList = (await _sysOrgService.GetChildListById(sysUser.OrgId)).Select(it => it.Id).ToList();//获取所属机构的下级机构Id列表 sysUser.ScopeOrgChildList = scopeOrgChildList; + var moduleIds = await _relationService.GetModuleByRoleId(sysUser.RoleIdList);//获取模块列表 + var modules = await _resourceService.GetResourcesByIds(moduleIds, CateGoryConst.Resource_MODULE);//获取模块列表 + sysUser.ModuleList = modules;//模块列表赋值给用户 //插入Redis _simpleCacheService.HashAdd(SystemConst.Cache_SysUser, sysUser.Id.ToString(), sysUser); return sysUser; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs index 4b973dc..995e119 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs @@ -5,7 +5,6 @@ /// public class UpdateInfoInput : SysUser { - /// /// 姓名 /// @@ -26,9 +25,10 @@ public class UpdateSignatureInput /// 更新个人工作台 /// public class UpdateWorkbenchInput -{ /// - /// 工作台数据 - /// +{ + /// + /// 工作台数据 + /// [Required(ErrorMessage = "WorkbenchData不能为空")] public string WorkbenchData { get; set; } } @@ -49,4 +49,22 @@ public class UpdatePasswordInput /// [Required(ErrorMessage = "NewPassword不能为空")] public string NewPassword { get; set; } +} + +/// +/// 设置默认模块输入 +/// +public class SetDeafultModuleInput +{ + /// + /// 模块Id + /// + [Required(ErrorMessage = "Id不能为空")] + public long Id { get; set; } + + /// + /// 是否默认 + /// + [Required(ErrorMessage = "IfDefault不能为空")] + public bool IfDefault { get; set; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs index 90a9803..7099b1f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs @@ -91,5 +91,12 @@ public interface IUserCenterService : ITransient /// Task UpdateAvatar(BaseFileInput input); + /// + /// 修改默认模块 + /// + /// 默认模块输入参数 + /// + Task SetDeafultModule(SetDeafultModuleInput input); + #endregion 编辑 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs index 877148b..47a2d65 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs @@ -285,6 +285,20 @@ public class UserCenterService : DbRepository, IUserCenterService return avatar; } + /// + public async Task SetDeafultModule(SetDeafultModuleInput input) + { + //获取用户信息 + var userInfo = await _userService.GetUserById(UserManager.UserId); + //如果是默认模块 + if (input.IfDefault) + userInfo.DefaultModule = input.Id; + else + userInfo.DefaultModule = null; + await Context.Updateable(userInfo).UpdateColumns(it => new { it.DefaultModule }).ExecuteCommandAsync();//修改默认模块 + _userService.DeleteUserFromRedis(UserManager.UserId);//redis删除用户数据 + } + #endregion 编辑 #region 方法 @@ -396,7 +410,7 @@ public class UserCenterService : DbRepository, IUserCenterService else { // 否则隐藏该单页面 - meta.hidden = true; + meta.IsHide = true; } } it.Meta = meta; diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index 3a6c6a5..6f737d7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -811,6 +811,16 @@ 别名 + + + 别名 + + + + + 别名 + + 编码 @@ -846,9 +856,29 @@ 图标 - + + + 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + + + + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + + + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + + + + 菜单是否固定在标签页中 (首页通常是固定项) + + + - 颜色 + 菜单是否固定在标签页中 (首页通常是固定项) @@ -863,7 +893,7 @@ - 字节点 + 子节点 @@ -891,9 +921,29 @@ 是否首页 - - - 是否隐藏 + + + 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + + + + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + + + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + + + + 菜单是否固定在标签页中 (首页通常是固定项) + + + + + 菜单是否固定在标签页中 (首页通常是固定项) @@ -1182,6 +1232,11 @@ 排序码 + + + 默认模块 + + 机构信息 @@ -1232,6 +1287,11 @@ 机构及以下机构ID集合 + + + 机构及以下机构ID集合 + + 数据范围类 @@ -1862,6 +1922,16 @@ 姓名 + + + 默认模块 + + + + + 模块列表 + + 登录用互信息 @@ -1942,6 +2012,16 @@ 按钮码集合 + + + 机构及以下机构ID集合 + + + + + 默认模块 + + 权限校验服务 @@ -4046,6 +4126,13 @@ 是否清除老的数据 + + + 根据角色ID获取模块ID列表 + + 角色ID列表 + 模块ID列表 + @@ -4076,6 +4163,9 @@ + + + @@ -4548,12 +4638,13 @@ 分类名称 资源列表 - + 根据菜单ID获取菜单 - 菜单id列表 - 菜单列表 + id列表 + 分类 + @@ -4605,7 +4696,7 @@ - + @@ -5096,6 +5187,21 @@ 新密码 + + + 设置默认模块输入 + + + + + 模块Id + + + + + 是否默认 + + 我的机构数样式 @@ -5226,6 +5332,13 @@ 头像文件 + + + 修改默认模块 + + 默认模块输入参数 + + @@ -5265,6 +5378,9 @@ + + + 获取父菜单集合 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs index 7c6a6c6..000b4f9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs @@ -66,9 +66,9 @@ public class AuthBController : IDynamicApiController /// 登出 /// /// - [HttpPost("loginOut")] + [HttpPost("logout")] [DisplayName(EventSubscriberConst.LoginOutB)] - public async Task LoginOut(LoginOutIput input) + public async Task LoginOut([FromBody] LoginOutIput input) { await _authService.LoginOut(input.Token, LoginClientTypeEnum.B); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs index 8297efe..ec6a231 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs @@ -158,6 +158,7 @@ public class UserCenterController : IDynamicApiController } + /// /// 根据id集合获取用户集合 /// @@ -197,4 +198,14 @@ public class UserCenterController : IDynamicApiController { return await _roleService.GetRoleListByIdList(input); } + + /// + /// 修改默认模块 + /// + /// + [HttpPost("setDefaultModule")] + public async Task SetDeafultModule([FromBody] SetDeafultModuleInput input) + { + await _userCenterService.SetDeafultModule(input); + } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index b6a8864..9495c2a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -1258,6 +1258,12 @@ + + + 修改默认模块 + + + 用户管理控制器 -- Gitee From c3e58c9cd774cee42e7341b79b95f2f2e70167e5 Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Tue, 22 Aug 2023 15:58:23 +0800 Subject: [PATCH 02/70] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=96=B0UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/GenTest/GenTestService.cs | 125 +++++----- .../Services/User/UserService.cs | 29 ++- .../BaseInput/BasePageInput.cs | 4 +- .../SimpleAdmin.Core/SimpleAdmin.Core.xml | 4 +- .../Services/Basic/GenBasicService.cs | 78 +++--- .../Extension/SqlSugarPageExtension.cs | 100 ++++---- .../SimpleAdmin.SqlSugar.xml | 20 +- .../SimpleAdmin.System/Entity/SysResource.cs | 52 ++-- .../Services/Auth/Session/SessionService.cs | 54 +++-- .../Services/BatchEdit/BatchEditService.cs | 40 +++- .../Services/Dev/Config/ConfigService.cs | 18 +- .../Services/Dev/Dict/DictService.cs | 45 ++-- .../Services/Dev/File/FileService.cs | 41 ++-- .../Services/Dev/Message/MessageService.cs | 78 +++--- .../Dev/OperateLog/OperateLogService.cs | 64 +++-- .../Services/Dev/VisitLog/VisitLogService.cs | 59 +++-- .../Services/System/Org/SysOrgService.cs | 44 ++-- .../System/Position/SysPositionService.cs | 42 +++- .../System/Resource/Button/ButtonService.cs | 37 ++- .../System/Resource/Module/ModuleService.cs | 43 ++-- .../Resource/Resource/IResourceService.cs | 7 + .../Resource/Resource/ResourceService.cs | 15 ++ .../System/Resource/Spa/SpaService.cs | 21 +- .../Services/System/Role/RoleService.cs | 137 +++++++---- .../Services/System/User/SysUserService.cs | 226 ++++++++++++------ .../System/UserCenter/IUserCenterService.cs | 5 +- .../System/UserCenter/UserCenterService.cs | 130 +++++----- .../SimpleAdmin.System/SimpleAdmin.System.xml | 40 ++-- .../System/System/UserCenterController.cs | 7 +- .../SimpleAdmin.Web.Core.xml | 2 +- 30 files changed, 976 insertions(+), 591 deletions(-) diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs index 0dbc70d..156628c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs @@ -1,5 +1,4 @@ - -using Furion.FriendlyException; +using Furion.FriendlyException; using Mapster; using SimpleAdmin.Core; using Microsoft.Extensions.Logging; @@ -18,25 +17,24 @@ public class GenTestService : DbRepository, IGenTestService private readonly IImportExportService _importExportService; private readonly ISysOrgService _sysOrgService; - public GenTestService(ILogger logger,ISysUserService sysUserService - ,IImportExportService importExportService - ,ISysOrgService sysOrgService + public GenTestService(ILogger logger, ISysUserService sysUserService + , IImportExportService importExportService + , ISysOrgService sysOrgService ) { - _sysUserService = sysUserService; - _logger = logger; - _importExportService = importExportService; - _sysOrgService = sysOrgService; - + _sysUserService = sysUserService; + _logger = logger; + _importExportService = importExportService; + _sysOrgService = sysOrgService; } - + #region 查询 /// public async Task> Page(GenTestPageInput input) { var query = await GetQuery(input);//获取查询条件 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -51,12 +49,12 @@ public class GenTestService : DbRepository, IGenTestService /// public async Task Detail(BaseIdInput input) { - var genTest = await GetFirstAsync(it => it.Id == input.Id); - return genTest ; - + var genTest = await GetFirstAsync(it => it.Id == input.Id); + return genTest; } -//外键查询 + //外键查询 + #endregion #region 新增 @@ -68,22 +66,21 @@ public class GenTestService : DbRepository, IGenTestService await CheckInput(genTest);//检查参数 await InsertAsync(genTest);//插入数据 } - + #endregion - + #region 编辑 - + /// public async Task Edit(GenTestEditInput input) { - var genTest = input.Adapt();//实体转换 + var genTest = input.Adapt();//实体转换 await CheckInput(genTest);//检查参数 await UpdateAsync(genTest);//更新数据 } - #endregion - + #region 删除 /// @@ -93,25 +90,25 @@ public class GenTestService : DbRepository, IGenTestService var ids = input.Select(it => it.Id).ToList(); if (ids.Count > 0) { - await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - ////事务 - //var result = await itenant.UseTranAsync(async () => - //{ - //await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - //}); - //if (!result.IsSuccess)//如果成功了 - //{ - ////写日志 - //_logger.LogError(result.ErrorMessage, result.ErrorException); - //throw Oops.Oh(ErrorCodeEnum.A0002); - //} + await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 + ////事务 + //var result = await itenant.UseTranAsync(async () => + //{ + //await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 + //}); + //if (!result.IsSuccess)//如果成功了 + //{ + ////写日志 + //_logger.LogError(result.ErrorMessage, result.ErrorException); + //throw Oops.Oh(ErrorCodeEnum.A0002); + //} } } #endregion #region 导入导出 - + /// public async Task Template() { @@ -120,17 +117,19 @@ public class GenTestService : DbRepository, IGenTestService var result = await _importExportService.GenerateTemplate(templateName); return result; } - + /// public async Task> Preview(ImportPreviewInput input) { - var importPreview = await _importExportService.GetImportPreview(input.File); + var importPreview = + await _importExportService.GetImportPreview(input.File); importPreview.Data = await CheckImport(importPreview.Data);//检查导入数据 return importPreview; } - + /// - public async Task> Import(ImportResultInput input) + public async Task> Import( + ImportResultInput input) { var data = await CheckImport(input.Data, true);//检查数据格式 var result = _importExportService.GetImportResultPreview(data, out var importData); @@ -138,7 +137,7 @@ public class GenTestService : DbRepository, IGenTestService await InsertOrBulkCopy(genTest);// 数据导入 return result; } - + /// public async Task Export(GenTestPageInput input) { @@ -148,23 +147,25 @@ public class GenTestService : DbRepository, IGenTestService return result; } - #endregion + #endregion #region 方法 - + /// /// 检查输入参数 /// /// private async Task CheckInput(GenTest genTest) { - var errorMessage = $"您没有权限操作该数据"; - if(genTest.Id==SimpleAdminConst.Zero){ - //表示新增 - } - else{ - //表示编辑 - } + var errorMessage = $"您没有权限操作该数据"; + if (genTest.Id == SimpleAdminConst.Zero) + { + //表示新增 + } + else + { + //表示编辑 + } } /// @@ -174,26 +175,24 @@ public class GenTestService : DbRepository, IGenTestService /// private async Task> GetQuery(GenTestPageInput input) { - var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 var query = Context.Queryable() - .WhereIF(!string.IsNullOrWhiteSpace(input.Name), it => it.Name.Contains(input.Name.Trim())) - .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.CreateOrgId))//根据机构ID查询 - //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 + .WhereIF(!string.IsNullOrWhiteSpace(input.Name), + it => it.Name.Contains(input.Name.Trim())) + .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.CreateOrgId))//根据机构ID查询 + //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") + .OrderBy(it => it.SortCode);//排序 return query; } /// - public async Task> CheckImport(List data, bool clearError = false) + public async Task> CheckImport( + List data, bool clearError = false) { - return data; + return data; } - #endregion - -} - - - + #endregion +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs index 39dd451..a0a5403 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs @@ -59,7 +59,14 @@ public class UserService : DbRepository, IUserService Pages = 1, HasPrevPages = false, HasNextPages = false, - Records = new[] { new UserSelectorOutPut { Account = UserManager.UserAccount, Id = UserManager.UserId, Name = UserManager.Name, OrgId = UserManager.OrgId } } + List = new[] + { + new UserSelectorOutPut + { + Account = UserManager.UserAccount, Id = UserManager.UserId, + Name = UserManager.Name, OrgId = UserManager.OrgId + } + } }; } @@ -72,7 +79,7 @@ public class UserService : DbRepository, IUserService Pages = 1, HasPrevPages = false, HasNextPages = false, - Records = new List() + List = new List() }; //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); @@ -121,10 +128,12 @@ public class UserService : DbRepository, IUserService //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); var ids = input.Ids;//获取用户id - var sysUsers = await GetListAsync(it => ids.Contains(it.Id), it => new SysUser { OrgId = it.OrgId, CreateUserId = it.CreateUserId });//根据用户ID获取机构id、 + var sysUsers = await GetListAsync(it => ids.Contains(it.Id), + it => new SysUser { OrgId = it.OrgId, CreateUserId = it.CreateUserId });//根据用户ID获取机构id、 sysUsers.ForEach(it => { - if (dataScope != null && !dataScope.Contains(it.OrgId) && it.CreateUserId != UserManager.UserId) + if (dataScope != null && !dataScope.Contains(it.OrgId) + && it.CreateUserId != UserManager.UserId) throw Oops.Bah(ErrorCodeEnum.A0004);//如果不包含机构id并且不是自己创建的 }); await _sysUserService.Edits(input); @@ -170,7 +179,8 @@ public class UserService : DbRepository, IUserService //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); //获取用户下信息 - var users = await GetListAsync(it => ids.Contains(it.Id), it => new SysUser { OrgId = it.OrgId, Id = it.Id }); + var users = await GetListAsync(it => ids.Contains(it.Id), + it => new SysUser { OrgId = it.OrgId, Id = it.Id }); if (dataScope == null)//全部数据权限 { await _sysUserService.Delete(input);//删除 @@ -209,7 +219,8 @@ public class UserService : DbRepository, IUserService var dataScope = await _sysUserService.GetLoginUserApiDataScope(); if (dataScope == null || dataScope.Count > 0) { - var importPreview = await _importExportService.GetImportPreview(input.File); + var importPreview = + await _importExportService.GetImportPreview(input.File); importPreview.Data = await CheckImport(importPreview.Data, dataScope);//检查导入数据 return importPreview; } @@ -228,7 +239,8 @@ public class UserService : DbRepository, IUserService } /// - public async Task> Import(ImportResultInput input) + public async Task> Import( + ImportResultInput input) { //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); @@ -312,7 +324,8 @@ public class UserService : DbRepository, IUserService /// 数据范围ID数组 /// 是否初始化错误 /// - public async Task> CheckImport(List data, List dataScope, bool clearError = false) + public async Task> CheckImport(List data, + List dataScope, bool clearError = false) { var errorMessage = $"没有权限"; //先经过系统用户检查 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs index beb16e6..dfa9d36 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs @@ -9,14 +9,14 @@ public class BasePageInput : IValidatableObject /// 当前页码 /// [DataValidation(ValidationTypes.Numeric)] - public virtual int Current { get; set; } = 1; + public virtual int PageNum { get; set; } = 1; /// /// 每页条数 /// [Range(1, 100, ErrorMessage = "页码容量超过最大限制")] [DataValidation(ValidationTypes.Numeric)] - public virtual int Size { get; set; } = 10; + public virtual int PageSize { get; set; } = 10; /// /// 排序字段 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml index 10d5f4f..f28e0f1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml @@ -84,12 +84,12 @@ 全局分页查询输入参数 - + 当前页码 - + 每页条数 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs index 15c86d8..7a4c840 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs @@ -33,14 +33,16 @@ public class GenBasicService : DbRepository, IGenbasicService public async Task> Page(BasePageInput input) { var query = Context.Queryable() - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}")//排序 .OrderBy(it => it.SortCode, OrderByType.Desc)//默认排序 .OrderBy(it => it.CreateTime, OrderByType.Desc)//默认排序 .Mapper(it => { - it.FuncList = it.Functions.Split(",", StringSplitOptions.RemoveEmptyEntries).ToList();//功能集合转为列表 + it.FuncList = it.Functions.Split(",", StringSplitOptions.RemoveEmptyEntries) + .ToList();//功能集合转为列表 }); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -60,7 +62,8 @@ public class GenBasicService : DbRepository, IGenbasicService var names = new List();//结果集 var excludeList = new List { - "Web.Entry", "Core", "Cache", "SqlSugar", "Plugin.Core", "Plugin.Gen", "Plugin.Mqtt", "Plugin.SignalR", "Plugin.Aop" + "Web.Entry", "Core", "Cache", "SqlSugar", "Plugin.Core", "Plugin.Gen", "Plugin.Mqtt", + "Plugin.SignalR", "Plugin.Aop" };//排除的程序集 //获取所有程序集名称 var assemblies = App.Assemblies @@ -199,7 +202,8 @@ public class GenBasicService : DbRepository, IGenbasicService var genBasic = await GetGenBasic(input.Id);//获取代码生成基础 if (genBasic.GenerateType != GenConst.Pro) throw Oops.Bah("当前配置生成方式为:项目中"); var backendPath = - Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent.FullName);//获取主工程目录 + Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent + .FullName);//获取主工程目录 var srcDir = "src";//默认都是代码放在src文件夹 var frontedPath = genBasic.FrontedPath;//获取前端代码路径, if (!frontedPath.Contains(srcDir))//如果不包含src @@ -239,19 +243,24 @@ public class GenBasicService : DbRepository, IGenbasicService { if (input.ExecType == GenConst.ExecBackend) { - ExecBackend(previewCode.CodeBackendResults, genBasic, temDir.CombinePath(_backendDir), true);//执行后端代码生成 + ExecBackend(previewCode.CodeBackendResults, genBasic, + temDir.CombinePath(_backendDir), true);//执行后端代码生成 ExecSql(previewCode.SqlResults, temDir);//执行sql生成 } else if (input.ExecType == GenConst.ExecFrontend) - ExecFronted(previewCode.CodeFrontendResults, genBasic, temDir.CombinePath(_frontDir));//执行前端生成 + ExecFronted(previewCode.CodeFrontendResults, genBasic, + temDir.CombinePath(_frontDir));//执行前端生成 } else { - ExecBackend(previewCode.CodeBackendResults, genBasic, temDir.CombinePath(_backendDir), true);//执行后端代码生成 - ExecFronted(previewCode.CodeFrontendResults, genBasic, temDir.CombinePath(_frontDir));//执行前端生成 + ExecBackend(previewCode.CodeBackendResults, genBasic, temDir.CombinePath(_backendDir), + true);//执行后端代码生成 + ExecFronted(previewCode.CodeFrontendResults, genBasic, + temDir.CombinePath(_frontDir));//执行前端生成 } var zipPath = ZipUtils.CompressDirectory(temDir, true);//压缩文件夹 - var result = new FileStreamResult(new FileStream(zipPath, FileMode.Open), "application/octet-stream") + var result = new FileStreamResult(new FileStream(zipPath, FileMode.Open), + "application/octet-stream") { FileDownloadName = $"{genBasic.ClassName}.zip" }; return result; } @@ -265,7 +274,8 @@ public class GenBasicService : DbRepository, IGenbasicService /// 代码基础 /// 后端生成路径 /// 是否是zip方式 - public void ExecBackend(List baseCodeResults, GenBasic genBasic, + public void ExecBackend(List baseCodeResults, + GenBasic genBasic, string backendPath, bool isZip = false) { var serviceDir = "Services";//服务代码文件夹 @@ -319,7 +329,8 @@ public class GenBasicService : DbRepository, IGenbasicService //if (it.CodeFileName.StartsWith("IService")) // fileName = $"I{genBasic.ClassName}Service.cs";//对IService接口要特殊处理 //path = path.CombinePath(fileName);//最终生成文件地址 - File.WriteAllText(path.CombinePath(it.CodeFileName), it.CodeFileContent, Encoding.UTF8);//写入文件 + File.WriteAllText(path.CombinePath(it.CodeFileName), it.CodeFileContent, + Encoding.UTF8);//写入文件 }); } @@ -329,7 +340,8 @@ public class GenBasicService : DbRepository, IGenbasicService /// 前端代码模板 /// 代码基础 /// 前端生成路径 - public void ExecFronted(List baseCodeResults, GenBasic genBasic, + public void ExecFronted(List baseCodeResults, + GenBasic genBasic, string frontedPath) { var apiDir = "api"; @@ -345,12 +357,14 @@ public class GenBasicService : DbRepository, IGenbasicService .CombinePath(genBasic.RouteName);//生成路径为前端路径+代码文件所在文件夹+路由地址 if (dirName == apiDir)//如果是api文件夹 it.CodeFileName = - StringHelper.FirstCharToLower(genBasic.ClassName) + it.CodeFileName;//文件名等于路由名加类名加代码文件名 + StringHelper.FirstCharToLower(genBasic.ClassName) + + it.CodeFileName;//文件名等于路由名加类名加代码文件名 else if (dirName == viewDir) path = path.CombinePath(genBasic.BusName); if (!Directory.Exists(path))//如果文件夹不存在就创建文件夹 Directory.CreateDirectory(path); - File.WriteAllText(path.CombinePath(it.CodeFileName), it.CodeFileContent, Encoding.UTF8);//写入文件 + File.WriteAllText(path.CombinePath(it.CodeFileName), it.CodeFileContent, + Encoding.UTF8);//写入文件 }); } @@ -359,14 +373,16 @@ public class GenBasicService : DbRepository, IGenbasicService /// /// 后端代码模板 /// 生成路径 - public void ExecSql(List baseCodeResults, string execPath) + public void ExecSql(List baseCodeResults, + string execPath) { execPath = execPath.CombinePath(_sqlDir);//写在sql目录里面 if (!Directory.Exists(execPath))//如果文件夹不存在就创建文件夹 Directory.CreateDirectory(execPath); baseCodeResults.ForEach(it => { - File.WriteAllText(execPath.CombinePath(it.CodeFileName), it.CodeFileContent, Encoding.UTF8);//写入文件 + File.WriteAllText(execPath.CombinePath(it.CodeFileName), it.CodeFileContent, + Encoding.UTF8);//写入文件 }); } @@ -376,7 +392,8 @@ public class GenBasicService : DbRepository, IGenbasicService /// 视图 /// 模板路径 /// - public async Task> GetSqlCodeResult(GenViewModel genViewModel, + public async Task> GetSqlCodeResult( + GenViewModel genViewModel, string templatePath) { var sqlCodeResults = new List();//结果集 @@ -407,7 +424,8 @@ public class GenBasicService : DbRepository, IGenbasicService /// 视图 /// 模板路径 /// - public async Task> GetBackendCodeResult(GenViewModel genViewModel, + public async Task> GetBackendCodeResult( + GenViewModel genViewModel, string templatePath) { // templatePath = "D:\\SimpleAdmin\\api\\SimpleAdmin\\SimpleAdmin.Plugin\\SimpleAdmin.Plugin.Gen\\CodeGen";//测试用 @@ -442,7 +460,8 @@ public class GenBasicService : DbRepository, IGenbasicService /// 视图 /// 模板路径 /// - public async Task> GetForntCodeResult(GenViewModel genViewModel, + public async Task> GetForntCodeResult( + GenViewModel genViewModel, string templatePath) { // templatePath = "D:\\SimpleAdmin\\api\\SimpleAdmin\\SimpleAdmin.Plugin\\SimpleAdmin.Plugin.Gen\\CodeGen";//测试用 @@ -498,12 +517,13 @@ public class GenBasicService : DbRepository, IGenbasicService public async Task GetViewEngine(string tContent, GenViewModel genViewModel) { //视图引擎渲染 - var tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, genViewModel, builderAction: builder => - { - builder.AddAssemblyReference(typeof(GenBasic));//添加程序集 - builder.AddAssemblyReferenceByName("System.Collections");//添加程序集 - builder.AddAssemblyReferenceByName("SimpleTool");//添加程序集 - }); + var tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, genViewModel, + builderAction: builder => + { + builder.AddAssemblyReference(typeof(GenBasic));//添加程序集 + builder.AddAssemblyReferenceByName("System.Collections");//添加程序集 + builder.AddAssemblyReferenceByName("SimpleTool");//添加程序集 + }); return tResult; } @@ -573,7 +593,8 @@ public class GenBasicService : DbRepository, IGenbasicService && it.MenuType == ResourceConst.MENU && it.Code != ResourceConst.System); if (oldMenu != null)//如果存在就直接和删除(同时删除其下面的菜单、按钮,清除对应的角色与资源信息) - await _menuService.Delete(new List { new BaseIdInput { Id = oldMenu.Id } }); + await _menuService.Delete(new List + { new BaseIdInput { Id = oldMenu.Id } }); //添加菜单参数 var menu = new MenuAddInput { @@ -610,7 +631,8 @@ public class GenBasicService : DbRepository, IGenbasicService var roleRep = ChangeRepository>();//切换仓储 var superAdmin = await roleRep.GetFirstAsync(it => - it.Code == RoleConst.SuperAdmin && it.Category == CateGoryConst.Role_GLOBAL);//获取超级管理员 + it.Code == RoleConst.SuperAdmin + && it.Category == CateGoryConst.Role_GLOBAL);//获取超级管理员 //授权菜单参数 var grantResource = new GrantResourceInput { diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs index 134b64c..2e9ae6d 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs @@ -12,24 +12,25 @@ public static class SqlSugarPageExtension /// /// /// - /// - /// + /// + /// /// - public static SqlSugarPagedList ToPagedList(this ISugarQueryable queryable, int current, - int size) + public static SqlSugarPagedList ToPagedList( + this ISugarQueryable queryable, int pageNum, + int pageSize) { var total = 0; - var records = queryable.ToPageList(current, size, ref total); - var pages = (int)Math.Ceiling(total / (double)size); + var list = queryable.ToPageList(pageSize, pageNum, ref total); + var pages = (int)Math.Ceiling(total / (double)pageSize); return new SqlSugarPagedList { - Current = current, - Size = size, - Records = records, + PageNum = pageSize, + PageSize = pageNum, + List = list, Total = total, Pages = pages, - HasNextPages = current < pages, - HasPrevPages = current - 1 > 0 + HasNextPages = pageSize < pages, + HasPrevPages = pageSize - 1 > 0 }; } @@ -38,24 +39,25 @@ public static class SqlSugarPageExtension /// /// /// - /// - /// + /// + /// /// - public static async Task> ToPagedListAsync(this ISugarQueryable queryable, - int current, int size) + public static async Task> ToPagedListAsync( + this ISugarQueryable queryable, + int pageNum, int pageSize) { RefAsync totalCount = 0; - var records = await queryable.ToPageListAsync(current, size, totalCount); - var totalPages = (int)Math.Ceiling(totalCount / (double)size); + var list = await queryable.ToPageListAsync(pageNum, pageSize, totalCount); + var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize); return new SqlSugarPagedList { - Current = current, - Size = size, - Records = records, + PageNum = pageNum, + PageSize = pageSize, + List = list, Total = (int)totalCount, Pages = totalPages, - HasNextPages = current < totalPages, - HasPrevPages = current - 1 > 0 + HasNextPages = pageNum < totalPages, + HasPrevPages = pageNum - 1 > 0 }; } @@ -65,25 +67,27 @@ public static class SqlSugarPageExtension /// /// /// - /// + /// /// /// /// - public static SqlSugarPagedList ToPagedList(this ISugarQueryable queryable, int pageIndex, + public static SqlSugarPagedList ToPagedList( + this ISugarQueryable queryable, int pageNum, int pageSize, Expression> expression) { var totalCount = 0; - var items = queryable.ToPageList(pageIndex, pageSize, ref totalCount, expression); + var items = queryable.ToPageList(pageNum, pageSize, ref totalCount, + expression); var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize); return new SqlSugarPagedList { - Current = pageIndex, - Size = pageSize, - Records = items, + PageNum = pageNum, + PageSize = pageSize, + List = items, Total = totalCount, Pages = totalPages, - HasNextPages = pageIndex < totalPages, - HasPrevPages = pageIndex - 1 > 0 + HasNextPages = pageNum < totalPages, + HasPrevPages = pageNum - 1 > 0 }; } @@ -93,25 +97,27 @@ public static class SqlSugarPageExtension /// /// /// - /// + /// /// /// /// public static async Task> ToPagedListAsync( - this ISugarQueryable queryable, int pageIndex, int pageSize, Expression> expression) + this ISugarQueryable queryable, int pageNum, int pageSize, + Expression> expression) { RefAsync totalCount = 0; - var items = await queryable.ToPageListAsync(pageIndex, pageSize, totalCount, expression); + var items = await queryable.ToPageListAsync(pageNum, pageSize, totalCount, + expression); var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize); return new SqlSugarPagedList { - Current = pageIndex, - Size = pageSize, - Records = items, + PageNum = pageNum, + PageSize = pageSize, + List = items, Total = (int)totalCount, Pages = totalPages, - HasNextPages = pageIndex < totalPages, - HasPrevPages = pageIndex - 1 > 0 + HasNextPages = pageNum < totalPages, + HasPrevPages = pageNum - 1 > 0 }; } @@ -120,18 +126,18 @@ public static class SqlSugarPageExtension /// /// /// 数据列表 - /// 当前页 + /// 当前页 /// 每页数量 /// 分页集合 - public static LinqPagedList LinqPagedList(this List list, int pageIndex, int pageSize) + public static LinqPagedList LinqPagedList(this List list, int pageNum, int pageSize) { - var result = list.ToPagedList(pageIndex, pageSize);//获取分页 + var result = list.ToPagedList(pageNum, pageSize);//获取分页 //格式化 return new LinqPagedList { - Current = pageIndex, - Size = result.PageSize, - Records = result.Data, + PageNum = pageNum, + PageSize = result.PageSize, + List = result.Data, Total = result.TotalCount, Pages = result.TotalPages, HasNextPages = result.HasNext, @@ -149,12 +155,12 @@ public class SqlSugarPagedList /// /// 页码 /// - public int Current { get; set; } + public int PageNum { get; set; } /// /// 数量 /// - public int Size { get; set; } + public int PageSize { get; set; } /// /// 总条数 @@ -169,7 +175,7 @@ public class SqlSugarPagedList /// /// 当前页集合 /// - public IEnumerable Records { get; set; } + public IEnumerable List { get; set; } /// /// 是否有上一页 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 8407098..6c365b2 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -742,8 +742,8 @@ - - + + @@ -752,8 +752,8 @@ - - + + @@ -763,7 +763,7 @@ - + @@ -775,7 +775,7 @@ - + @@ -786,7 +786,7 @@ 数据列表 - 当前页 + 当前页 每页数量 分页集合 @@ -796,12 +796,12 @@ - + 页码 - + 数量 @@ -816,7 +816,7 @@ 总页数 - + 当前页集合 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs index 430b107..46b6ca5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs @@ -22,20 +22,23 @@ public class SysResource : BaseEntity /// /// 别名 /// - [SugarColumn(ColumnName = "Name", ColumnDescription = "别名", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Name", ColumnDescription = "别名", Length = 200, + IsNullable = true)] public string Name { get; set; } /// /// 别名 /// - [SugarColumn(ColumnName = "Description", ColumnDescription = "描述", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Description", ColumnDescription = "描述", Length = 200, + IsNullable = true)] public string Description { get; set; } /// /// 别名 /// - [SugarColumn(ColumnName = "Avatar", ColumnDescription = "头像", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "Avatar", ColumnDescription = "头像", + ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] public string Avatar { get; set; } @@ -43,7 +46,8 @@ public class SysResource : BaseEntity /// /// 编码 /// - [SugarColumn(ColumnName = "Code", ColumnDescription = "编码", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Code", ColumnDescription = "编码", Length = 200, + IsNullable = true)] public virtual string Code { get; set; } /// @@ -61,7 +65,8 @@ public class SysResource : BaseEntity /// /// 菜单类型 /// - [SugarColumn(ColumnName = "MenuType", ColumnDescription = "菜单类型", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "MenuType", ColumnDescription = "菜单类型", Length = 200, + IsNullable = true)] public virtual string MenuType { get; set; } /// @@ -73,39 +78,45 @@ public class SysResource : BaseEntity /// /// 组件 /// - [SugarColumn(ColumnName = "Component", ColumnDescription = "组件", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Component", ColumnDescription = "组件", Length = 200, + IsNullable = true)] public string Component { get; set; } /// /// 图标 /// - [SugarColumn(ColumnName = "Icon", ColumnDescription = "图标", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Icon", ColumnDescription = "图标", Length = 200, + IsNullable = true)] public virtual string Icon { get; set; } /// /// 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) /// - [SugarColumn(ColumnName = "ActiveMenu", ColumnDescription = "需要高亮的 path (通常用作详情页高亮父级菜单)", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "ActiveMenu", ColumnDescription = "需要高亮的 path (通常用作详情页高亮父级菜单)", + Length = 200, IsNullable = true)] public string ActiveMenu { get; set; } /// /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) /// - [SugarColumn(ColumnName = "IsHide", ColumnDescription = "是否在菜单中隐藏 (通常列表详情页需要隐藏) ", IsNullable = true)] + [SugarColumn(ColumnName = "IsHide", ColumnDescription = "是否在菜单中隐藏 (通常列表详情页需要隐藏) ", + IsNullable = true)] public bool IsHide { get; set; } /// /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) /// - [SugarColumn(ColumnName = "IsFull", ColumnDescription = "菜单是否全屏 (示例:数据大屏页面)", IsNullable = true)] + [SugarColumn(ColumnName = "IsFull", ColumnDescription = "菜单是否全屏 (示例:数据大屏页面)", + IsNullable = true)] public bool IsFull { get; set; } /// /// 菜单是否固定在标签页中 (首页通常是固定项) /// - [SugarColumn(ColumnName = "IsAffix", ColumnDescription = "菜单是否固定在标签页中 (首页通常是固定项)", IsNullable = true)] + [SugarColumn(ColumnName = "IsAffix", ColumnDescription = "菜单是否固定在标签页中 (首页通常是固定项)", + IsNullable = true)] public bool IsAffix { get; set; } /// @@ -114,6 +125,12 @@ public class SysResource : BaseEntity [SugarColumn(ColumnName = "IsKeepAlive", ColumnDescription = " 当前路由是否缓存", IsNullable = true)] public bool IsKeepAlive { get; set; } + /// + /// 是否为首页 + /// + [SugarColumn(ColumnName = "IsHome", ColumnDescription = " 是否为首页", IsNullable = true)] + public bool IsHome { get; set; } = false; + /// /// 排序码 /// @@ -148,15 +165,6 @@ public class Meta /// public string Title { get; set; } - /// - /// 类型 - /// - public string Type { get; set; } - - /// - /// 是否首页 - /// - public bool Affix { get; set; } = false; /// @@ -170,6 +178,10 @@ public class Meta /// public bool IsHide { get; set; } = false; + /// + /// 路由外链时填写的访问地址 + /// + public string IsLink { get; set; } = ""; /// /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs index 1b0eb75..844c4c4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs @@ -27,8 +27,10 @@ public class SessionService : DbRepository, ISessionService var userIds = bTokenInfoDic.Keys.Select(it => it.ToLong()).ToList(); var query = Context.Queryable().Where(it => userIds.Contains(it.Id))//根据ID查询 .WhereIF(!string.IsNullOrEmpty(input.Name), it => it.Name.Contains(input.Name))//根据姓名查询 - .WhereIF(!string.IsNullOrEmpty(input.Account), it => it.Account.Contains(input.Account))//根据账号查询 - .WhereIF(!string.IsNullOrEmpty(input.LatestLoginIp), it => it.LatestLoginIp.Contains(input.LatestLoginIp))//根据IP查询 + .WhereIF(!string.IsNullOrEmpty(input.Account), + it => it.Account.Contains(input.Account))//根据账号查询 + .WhereIF(!string.IsNullOrEmpty(input.LatestLoginIp), + it => it.LatestLoginIp.Contains(input.LatestLoginIp))//根据IP查询 .OrderBy(it => it.LatestLoginTime, OrderByType.Desc) .Select() .Mapper(it => @@ -38,18 +40,21 @@ public class SessionService : DbRepository, ISessionService it.TokenCount = tokenInfos.Count;//令牌数量 it.TokenSignList = tokenInfos;//令牌列表 //如果有mqtt客户端ID就是在线 - it.OnlineStatus = tokenInfos.Any(it => it.ClientIds.Count > 0) ? DevDictConst.ONLINE_STATUS_ONLINE : DevDictConst.ONLINE_STATUS_OFFLINE; + it.OnlineStatus = tokenInfos.Any(it => it.ClientIds.Count > 0) + ? DevDictConst.ONLINE_STATUS_ONLINE + : DevDictConst.ONLINE_STATUS_OFFLINE; }); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 - pageInfo.Records.OrderByDescending(it => it.TokenCount); + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 + pageInfo.List.OrderByDescending(it => it.TokenCount); return pageInfo; } /// public async Task> PageC(SessionPageInput input) { - return new SqlSugarPagedList() { Current = 1, Size = 20, Total = 0, Pages = 1, HasNextPages = false }; + return new SqlSugarPagedList() + { PageNum = 1, PageSize = 20, Total = 0, Pages = 1, HasNextPages = false }; } /// @@ -62,8 +67,10 @@ public class SessionService : DbRepository, ISessionService var onLineCount = 0; foreach (var token in tokenDic) { - var b = token.Value.Where(it => it.LoginClientType == LoginClientTypeEnum.B).ToList();//获取该用户B端token - var c = token.Value.Where(it => it.LoginClientType == LoginClientTypeEnum.C).ToList();//获取该用户C端token + var b = token.Value.Where(it => it.LoginClientType == LoginClientTypeEnum.B) + .ToList();//获取该用户B端token + var c = token.Value.Where(it => it.LoginClientType == LoginClientTypeEnum.C) + .ToList();//获取该用户C端token if (b.Count > 0) dicB.Add(token.Key, b); if (c.Count > 0) @@ -93,9 +100,11 @@ public class SessionService : DbRepository, ISessionService { var userId = input.Id.ToString(); //token列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); + var tokenInfos = + _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, new string[] { userId }); + _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, + new string[] { userId }); await NoticeUserLoginOut(userId, tokenInfos); } @@ -104,15 +113,18 @@ public class SessionService : DbRepository, ISessionService { var userId = input.Id.ToString(); //获取该用户的token信息 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); + var tokenInfos = + _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); //当前需要踢掉用户的token var deleteTokens = tokenInfos.Where(it => input.Tokens.Contains(it.Token)).ToList(); //踢掉包含token列表的token信息 tokenInfos = tokenInfos.Where(it => !input.Tokens.Contains(it.Token)).ToList(); if (tokenInfos.Count > 0) - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//如果还有token则更新token + _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, + tokenInfos);//如果还有token则更新token else - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, new string[] { userId });//否则直接删除key + _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, + new string[] { userId });//否则直接删除key await NoticeUserLoginOut(userId, deleteTokens); } @@ -126,12 +138,15 @@ public class SessionService : DbRepository, ISessionService { var clockSkew = App.GetConfig("JWTSettings:ClockSkew");//获取过期时间容错值(秒) //redis获取token信息hash集合,并转成字典 - var bTokenDic = _simpleCacheService.HashGetAll>(CacheConst.Cache_UserToken).ToDictionary(u => u.Key, u => u.Value); + var bTokenDic = _simpleCacheService.HashGetAll>(CacheConst.Cache_UserToken) + .ToDictionary(u => u.Key, u => u.Value); if (bTokenDic != null) { bTokenDic.ForEach(it => { - var tokens = it.Value.Where(it => it.TokenTimeout.AddSeconds(clockSkew) > DateTime.Now).ToList();//去掉登录超时的 + var tokens = it.Value + .Where(it => it.TokenTimeout.AddSeconds(clockSkew) > DateTime.Now) + .ToList();//去掉登录超时的 if (tokens.Count == 0) { //表示都过期了 @@ -144,7 +159,8 @@ public class SessionService : DbRepository, ISessionService }); if (bTokenDic.Count > 0) { - _simpleCacheService.HashSet(CacheConst.Cache_UserToken, bTokenDic);//如果还有token则更新token + _simpleCacheService.HashSet(CacheConst.Cache_UserToken, + bTokenDic);//如果还有token则更新token } else { @@ -170,9 +186,11 @@ public class SessionService : DbRepository, ISessionService { var now = DateTime.Now; it.TokenRemain = now.GetDiffTime(it.TokenTimeout);//获取时间差 - var tokenSecond = it.TokenTimeout.AddMinutes(-it.Expire).ConvertDateTimeToLong();//颁发时间转为时间戳 + var tokenSecond = + it.TokenTimeout.AddMinutes(-it.Expire).ConvertDateTimeToLong();//颁发时间转为时间戳 var timeoutSecond = it.TokenTimeout.ConvertDateTimeToLong();//过期时间转为时间戳 - var tokenRemainPercent = 1 - (now.ConvertDateTimeToLong() - tokenSecond) * 1.0 / (timeoutSecond - tokenSecond);//求百分比,用现在时间-token颁布时间除以超时时间-token颁布时间 + var tokenRemainPercent = 1 - (now.ConvertDateTimeToLong() - tokenSecond) * 1.0 + / (timeoutSecond - tokenSecond);//求百分比,用现在时间-token颁布时间除以超时时间-token颁布时间 it.TokenRemainPercent = tokenRemainPercent; }); } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs index f0172d1..004a575 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs @@ -16,13 +16,17 @@ public class BatchEditService : DbRepository, IBatchEditService public async Task> Page(BatchEditPageInput input) { var query = Context.Queryable() - .WhereIF(!string.IsNullOrWhiteSpace(input.ConfigId), it => it.ConfigId.Contains(input.ConfigId.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Entityname), it => it.EntityName.Contains(input.Entityname.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Tablename), it => it.TableName.Contains(input.Tablename.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.ConfigId), + it => it.ConfigId.Contains(input.ConfigId.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Entityname), + it => it.EntityName.Contains(input.Entityname.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.Tablename), + it => it.TableName.Contains(input.Tablename.Trim())) //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") ; - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -68,7 +72,8 @@ public class BatchEditService : DbRepository, IBatchEditService var ids = input.Select(it => it.Id).ToList();//获取当前配置Id if (ids.Any()) { - await configRep.DeleteAsync(it => !ids.Contains(it.Id) && it.UId == input.First().UId);//删除没有的 + await configRep.DeleteAsync(it => + !ids.Contains(it.Id) && it.UId == input.First().UId);//删除没有的 await Context.Updateable(updateBatch).ExecuteCommandAsync();//更新数据 } } @@ -84,7 +89,8 @@ public class BatchEditService : DbRepository, IBatchEditService var result = await itenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - await Context.Deleteable().Where(it => ids.Contains(it.UId)).ExecuteCommandAsync(); + await Context.Deleteable().Where(it => ids.Contains(it.UId)) + .ExecuteCommandAsync(); }); if (!result.IsSuccess)//如果失败了 { @@ -105,11 +111,13 @@ public class BatchEditService : DbRepository, IBatchEditService //获取表的字段信息 var tableColumns = SqlSugarUtils.GetTableColumns(config.ConfigId, config.TableName); //找到当前配置字段列表 - var batchEdiConfig = await Context.Queryable().Where(it => it.UId == config.Id).ToListAsync(); + var batchEdiConfig = await Context.Queryable() + .Where(it => it.UId == config.Id).ToListAsync(); foreach (var tableColumn in tableColumns) { //判断是否是主键或者通用字段 - var isPkOrCommon = tableColumn.IsPrimarykey || SqlSugarUtils.IsCommonColumn(tableColumn.ColumnName); + var isPkOrCommon = tableColumn.IsPrimarykey + || SqlSugarUtils.IsCommonColumn(tableColumn.ColumnName); if (!isPkOrCommon) { //如果当前配置没有 @@ -137,7 +145,9 @@ public class BatchEditService : DbRepository, IBatchEditService if (updateBatch != null) { //找到对应字段 - batchEdiConfig = await Context.Queryable().Where(it => it.UId == updateBatch.Id && it.Status == DevDictConst.COMMON_STATUS_ENABLE).ToListAsync(); + batchEdiConfig = await Context.Queryable().Where(it => + it.UId == updateBatch.Id && it.Status == DevDictConst.COMMON_STATUS_ENABLE) + .ToListAsync(); } return batchEdiConfig; } @@ -151,11 +161,13 @@ public class BatchEditService : DbRepository, IBatchEditService /// public async Task> ConfigList(BaseIdInput input) { - return await Context.Queryable().Where(u => u.UId == input.Id).OrderByDescending(it => it.Status).ToListAsync(); + return await Context.Queryable().Where(u => u.UId == input.Id) + .OrderByDescending(it => it.Status).ToListAsync(); } /// - public async Task> GetUpdateBatchConfigDict(string code, List columns) + public async Task> GetUpdateBatchConfigDict(string code, + List columns) { var dic = new Dictionary(); var configs = await Columns(code); @@ -180,7 +192,9 @@ public class BatchEditService : DbRepository, IBatchEditService return new BatchEditConfig { ColumnName = columnInfo.ColumnName, - ColumnComment = string.IsNullOrWhiteSpace(columnInfo.ColumnDescription) ? columnInfo.ColumnName : columnInfo.ColumnDescription, + ColumnComment = string.IsNullOrWhiteSpace(columnInfo.ColumnDescription) + ? columnInfo.ColumnName + : columnInfo.ColumnDescription, NetType = netType, DataType = SqlSugarUtils.DataTypeToEff(netType), Status = DevDictConst.COMMON_STATUS_DISABLED diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs index 0ca0d3b..d1d3840 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs @@ -32,7 +32,8 @@ public class ConfigService : DbRepository, IConfigService public async Task GetByConfigKey(string category, string configKey) { var configList = await GetListByCategory(category);//获取系统配置列表 - var configValue = configList.Where(it => it.ConfigKey == configKey).FirstOrDefault();//根据configkey获取对应值 + var configValue = + configList.Where(it => it.ConfigKey == configKey).FirstOrDefault();//根据configkey获取对应值 return configValue; } @@ -41,10 +42,13 @@ public class ConfigService : DbRepository, IConfigService { var query = Context.Queryable() .Where(it => it.Category == CateGoryConst.Config_BIZ_DEFINE)//自定义配置 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.ConfigKey.Contains(input.SearchKey) || it.ConfigKey.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.ConfigKey.Contains(input.SearchKey) + || it.ConfigKey.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}")//排序 .OrderBy(it => it.SortCode); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -96,7 +100,8 @@ public class ConfigService : DbRepository, IConfigService configList.ForEach(it => { //赋值ConfigValue - it.ConfigValue = configs.Where(c => c.ConfigKey == it.ConfigKey).First().ConfigValue; + it.ConfigValue = configs.Where(c => c.ConfigKey == it.ConfigKey).First() + .ConfigValue; }); //更新数据 if (await UpdateRangeAsync(configList)) @@ -126,7 +131,8 @@ public class ConfigService : DbRepository, IConfigService { var configs = await GetListByCategory(CateGoryConst.Config_BIZ_DEFINE);//获取全部字典 //判断是否从存在重复字典名 - var hasSameKey = configs.Any(it => it.ConfigKey == devConfig.ConfigKey && it.Id != devConfig.Id); + var hasSameKey = + configs.Any(it => it.ConfigKey == devConfig.ConfigKey && it.Id != devConfig.Id); if (hasSameKey) { throw Oops.Bah($"存在重复的配置键:{devConfig.ConfigKey}"); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs index 9e6bd32..0dad08b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs @@ -16,12 +16,17 @@ public class DictService : DbRepository, IDictService public async Task> Page(DictPageInput input) { var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 - .WhereIF(input.ParentId != null, it => it.ParentId == input.ParentId || it.Id == input.ParentId)//根据父ID查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.DictLabel.Contains(input.SearchKey) || it.DictValue.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") + .WhereIF(!string.IsNullOrEmpty(input.Category), + it => it.Category == input.Category)//根据分类查询 + .WhereIF(input.ParentId != null, + it => it.ParentId == input.ParentId || it.Id == input.ParentId)//根据父ID查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.DictLabel.Contains(input.SearchKey) + || it.DictValue.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -49,7 +54,8 @@ public class DictService : DbRepository, IDictService //获取所有字典 var dicts = await GetListAsync(); //获取当前字典分类 - var category = dicts.Where(it => it.Id == input.Id).Select(it => it.Category).FirstOrDefault(); + var category = dicts.Where(it => it.Id == input.Id).Select(it => it.Category) + .FirstOrDefault(); //如果是系统字典提示不可删除 //if (category == CateGoryConst.Dict_FRM) throw Oops.Bah("不可删除系统内置字典"); //获取子节点 @@ -88,12 +94,15 @@ public class DictService : DbRepository, IDictService } /// - public async Task> GetValuesByDictValue(string DictValue, List devDictList = null) + public async Task> GetValuesByDictValue(string DictValue, + List devDictList = null) { var devDicts = devDictList == null ? await GetListAsync() : devDictList;//获取全部 - var id = devDicts.Where(it => it.DictValue == DictValue).Select(it => it.Id).FirstOrDefault();//根据value找到父节点 + var id = devDicts.Where(it => it.DictValue == DictValue).Select(it => it.Id) + .FirstOrDefault();//根据value找到父节点 if (id > 0) - return devDicts.Where(it => it.ParentId == id).Select(it => it.DictValue).ToList();//拿到字典值 + return devDicts.Where(it => it.ParentId == id).Select(it => it.DictValue) + .ToList();//拿到字典值 else return new List(); } @@ -103,7 +112,8 @@ public class DictService : DbRepository, IDictService { Dictionary> result = new Dictionary>(); var devDicts = await GetListAsync();//获取全部 - var ids = devDicts.Where(it => DictValues.Contains(it.DictValue)).Select(it => it.Id).ToList();//根据value找到父节点 + var ids = devDicts.Where(it => DictValues.Contains(it.DictValue)).Select(it => it.Id) + .ToList();//根据value找到父节点 foreach (var dictValue in DictValues) { var data = await GetValuesByDictValue(dictValue, devDicts); @@ -116,7 +126,9 @@ public class DictService : DbRepository, IDictService public async Task> Tree(DictTreeInput input) { var devDicts = await GetListAsync();//获取字典列表 - var devList = devDicts.WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category).OrderBy(it => it.SortCode).ToList(); + var devList = devDicts + .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category) + .OrderBy(it => it.SortCode).ToList(); return ConstructResourceTrees(devList); } @@ -124,7 +136,8 @@ public class DictService : DbRepository, IDictService public List ConstructResourceTrees(List dictList, long parentId = 0) { //找下级字典ID列表 - var resources = dictList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); + var resources = dictList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode) + .ToList(); if (resources.Count > 0)//如果数量大于0 { var data = new List(); @@ -157,13 +170,17 @@ public class DictService : DbRepository, IDictService { var dicts = await GetListAsync();//获取全部字典 //判断是否从存在重复字典名 - var hasSameLable = dicts.Any(it => it.ParentId == devDict.ParentId && it.Category == devDict.Category && it.DictLabel == devDict.DictLabel && it.Id != devDict.Id); + var hasSameLable = dicts.Any(it => + it.ParentId == devDict.ParentId && it.Category == devDict.Category + && it.DictLabel == devDict.DictLabel && it.Id != devDict.Id); if (hasSameLable) { throw Oops.Bah($"存在重复的字典名称:{devDict.DictLabel}"); } //判断是否存在重复字典值 - var hasSameValue = dicts.Any(it => it.ParentId == devDict.ParentId && it.DictValue == devDict.DictValue && it.Id != devDict.Id); + var hasSameValue = dicts.Any(it => + it.ParentId == devDict.ParentId && it.DictValue == devDict.DictValue + && it.Id != devDict.Id); if (hasSameValue) { throw Oops.Bah($"存在重复的字典值:{devDict.DictValue}"); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs index 0d20169..df90dae 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs @@ -21,10 +21,12 @@ public class FileService : DbRepository, IFileService { var query = Context.Queryable() .WhereIF(!string.IsNullOrEmpty(input.Engine), it => it.Engine == input.Engine)//根据关键字查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Name.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}")//排序 .OrderBy(it => it.Id); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -42,24 +44,29 @@ public class FileService : DbRepository, IFileService } /// - public FileStreamResult GetFileStreamResult(string path, string fileName, bool isPathFolder = false) + public FileStreamResult GetFileStreamResult(string path, string fileName, + bool isPathFolder = false) { if (isPathFolder) path = path.CombinePath(fileName); - fileName = HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));//文件名转utf8不然前端下载会乱码 + fileName = + HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));//文件名转utf8不然前端下载会乱码 //文件转流 - var result = new FileStreamResult(new FileStream(path, FileMode.Open), "application/octet-stream") - { - FileDownloadName = fileName - }; + var result = + new FileStreamResult(new FileStream(path, FileMode.Open), "application/octet-stream") + { + FileDownloadName = fileName + }; return result; } - public async Task GetFileStreamResultFromMinio(string objectName, string fileName) + public async Task GetFileStreamResultFromMinio(string objectName, + string fileName) { var minioService = App.GetService(); var stream = await minioService.DownloadFileAsync(objectName); - fileName = HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));//文件名转utf8不然前端下载会乱码 + fileName = + HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));//文件名转utf8不然前端下载会乱码 //文件转流 var result = new FileStreamResult(stream, "application/octet-stream") { @@ -71,7 +78,8 @@ public class FileService : DbRepository, IFileService /// public FileStreamResult GetFileStreamResult(byte[] byteArray, string fileName) { - fileName = HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));//文件名转utf8不然前端下载会乱码 + fileName = + HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8"));//文件名转utf8不然前端下载会乱码 //文件转流 var result = new FileStreamResult(new MemoryStream(byteArray), "application/octet-stream") { @@ -123,7 +131,8 @@ public class FileService : DbRepository, IFileService break; //存储本地 case DevDictConst.FILE_ENGINE_MINIO: - var config = await _configService.GetByConfigKey(CateGoryConst.Config_FILE_MINIO, DevConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME); + var config = await _configService.GetByConfigKey(CateGoryConst.Config_FILE_MINIO, + DevConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME); if (config != null) { bucketName = config.ConfigValue;// 存储桶名称 @@ -187,7 +196,8 @@ public class FileService : DbRepository, IFileService configKey = DevConfigConst.FILE_LOCAL_FOLDER_FOR_WINDOWS;//Windows } //获取路径配置 - var config = await _configService.GetByConfigKey(CateGoryConst.Config_FILE_LOCAL, configKey); + var config = + await _configService.GetByConfigKey(CateGoryConst.Config_FILE_LOCAL, configKey); if (config != null) { uploadFileFolder = config.ConfigValue;//赋值路径 @@ -218,7 +228,8 @@ public class FileService : DbRepository, IFileService /// /// /// - private async Task<(string objName, string downloadUrl)> StorageMinio(long fileId, IFormFile file) + private async Task<(string objName, string downloadUrl)> StorageMinio(long fileId, + IFormFile file) { var minioService = App.GetService(); var now = DateTime.Now.ToString("d"); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs index 855edba..0c2c502 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs @@ -10,43 +10,51 @@ public class MessageService : DbRepository, IMessageService private readonly IRelationService _relationService; private readonly IEventPublisher _eventPublisher; - public MessageService(ILogger logger, ISimpleCacheService simpleCacheService, IRelationService relationService, IEventPublisher eventPublisher) + public MessageService(ILogger logger, ISimpleCacheService simpleCacheService, + IRelationService relationService, IEventPublisher eventPublisher) { - this._logger = logger; - this._simpleCacheService = simpleCacheService; - this._relationService = relationService; - this._eventPublisher = eventPublisher; + _logger = logger; + _simpleCacheService = simpleCacheService; + _relationService = relationService; + _eventPublisher = eventPublisher; } /// public async Task> Page(MessagePageInput input) { var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Subject.Contains(input.SearchKey) || it.Content.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.CreateTime, OrderByType.Desc) - ; + .WhereIF(!string.IsNullOrEmpty(input.Category), + it => it.Category == input.Category)//根据分类查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Subject.Contains(input.SearchKey) + || it.Content.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}")//排序 + .OrderBy(it => it.CreateTime, OrderByType.Desc) + ; - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } /// - public async Task> MyMessagePage(MessagePageInput input, long userId) + public async Task> MyMessagePage(MessagePageInput input, + long userId) { - var query = Context.Queryable().LeftJoin((u, m) => u.MessageId == m.Id) - .Where((u, m) => u.IsDelete == false && u.UserId == userId) - .WhereIF(!string.IsNullOrEmpty(input.Category), (u, m) => m.Category == input.Category)//根据分类查询 - .OrderBy((u, m) => u.Read, OrderByType.Asc) - .OrderBy((u, m) => m.CreateTime, OrderByType.Desc) - .Select((u, m) => new DevMessage - { - Id = m.Id.SelectAll(), - Read = u.Read, - }) - ; - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var query = Context.Queryable() + .LeftJoin((u, m) => u.MessageId == m.Id) + .Where((u, m) => u.IsDelete == false && u.UserId == userId) + .WhereIF(!string.IsNullOrEmpty(input.Category), + (u, m) => m.Category == input.Category)//根据分类查询 + .OrderBy((u, m) => u.Read, OrderByType.Asc) + .OrderBy((u, m) => m.CreateTime, OrderByType.Desc) + .Select((u, m) => new DevMessage + { + Id = m.Id.SelectAll(), + Read = u.Read + }) + ; + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -74,7 +82,7 @@ public class MessageService : DbRepository, IMessageService { UserIds = input.ReceiverIdList.Select(it => it.ToString()).ToList(), Message = input.Subject - }); //通知用户有新的消息 + });//通知用户有新的消息 } else { @@ -94,7 +102,9 @@ public class MessageService : DbRepository, IMessageService var messageDetail = message.Adapt();//实体转换 var messageUserRep = ChangeRepository>();//切换仓储 var messageUsers = await messageUserRep.GetListAsync(it => it.MessageId == message.Id); - var myMessage = messageUsers.Where(it => it.UserId == UserManager.UserId && it.MessageId == input.Id).FirstOrDefault();//查询是否发给自己 + var myMessage = messageUsers + .Where(it => it.UserId == UserManager.UserId && it.MessageId == input.Id) + .FirstOrDefault();//查询是否发给自己 if (myMessage != null) { myMessage.Read = true;//设置已读 @@ -104,12 +114,14 @@ public class MessageService : DbRepository, IMessageService { var userIds = messageUsers.Select(it => it.UserId).ToList();//获取用户ID列表 var userInfos = await Context.Queryable() - .Where(it => userIds.Contains(it.Id)).Select(it => new { it.Id, it.Name }).ToListAsync();//获取用户姓名信息列表 + .Where(it => userIds.Contains(it.Id)).Select(it => new { it.Id, it.Name }) + .ToListAsync();//获取用户姓名信息列表 //遍历关系 messageUsers.ForEach(messageUser => { - var user = userInfos.Where(u => u.Id == messageUser.UserId).FirstOrDefault();//获取用户信息 + var user = userInfos.Where(u => u.Id == messageUser.UserId) + .FirstOrDefault();//获取用户信息 if (user != null) { //添加到已读列表 @@ -151,7 +163,8 @@ public class MessageService : DbRepository, IMessageService var result = await itenant.UseTranAsync(async () => { await DeleteAsync(it => ids.Contains(it.Id)); - await Context.Deleteable().Where(it => ids.Contains(it.MessageId)).ExecuteCommandAsync(); + await Context.Deleteable().Where(it => ids.Contains(it.MessageId)) + .ExecuteCommandAsync(); }); if (!result.IsSuccess)//如果失败了 { @@ -166,7 +179,9 @@ public class MessageService : DbRepository, IMessageService public async Task DeleteMyMessage(BaseIdInput input, long userId) { var messageUserRep = ChangeRepository>();//切换仓储 - await Context.Deleteable().Where(it => it.UserId == userId && it.MessageId == input.Id).IsLogic().ExecuteCommandAsync();//逻辑删除 + await Context.Deleteable() + .Where(it => it.UserId == userId && it.MessageId == input.Id).IsLogic() + .ExecuteCommandAsync();//逻辑删除 } /// @@ -174,7 +189,8 @@ public class MessageService : DbRepository, IMessageService { var messageUserRep = ChangeRepository>();//切换仓储 //获取未读数量 - var unRead = await messageUserRep.CountAsync(it => it.UserId == userId && it.Read == false && it.IsDelete == false); + var unRead = await messageUserRep.CountAsync(it => + it.UserId == userId && it.Read == false && it.IsDelete == false); return unRead; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs index 573fe12..971ec2a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs @@ -19,13 +19,18 @@ public class OperateLogService : DbRepository, IOperateLogService public async Task> Page(OperateLogPageInput input) { var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Account), it => it.OpAccount == input.Account)//根据账号查询 - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey) || it.OpIp.Contains(input.SearchKey))//根据关键字查询 - .IgnoreColumns(it => new { it.ParamJson, it.ResultJson }) - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.CreateTime, OrderByType.Desc); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .WhereIF(!string.IsNullOrEmpty(input.Account), + it => it.OpAccount == input.Account)//根据账号查询 + .WhereIF(!string.IsNullOrEmpty(input.Category), + it => it.Category == input.Category)//根据分类查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Name.Contains(input.SearchKey) + || it.OpIp.Contains(input.SearchKey))//根据关键字查询 + .IgnoreColumns(it => new { it.ParamJson, it.ResultJson }) + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}")//排序 + .OrderBy(it => it.CreateTime, OrderByType.Desc); + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -33,30 +38,39 @@ public class OperateLogService : DbRepository, IOperateLogService public async Task> StatisticsByDay(int day) { //取最近七天 - var dayArray = Enumerable.Range(0, day).Select(it => DateTime.Now.Date.AddDays(it * -1)).ToList(); + var dayArray = Enumerable.Range(0, day).Select(it => DateTime.Now.Date.AddDays(it * -1)) + .ToList(); //生成时间表 var queryableLeft = Context.Reportable(dayArray).ToQueryable(); //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 - var queryableRight = Context.Queryable(); //声名表 + var queryableRight = Context.Queryable();//声名表 //报表查询 - var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) - => x2.CreateTime.Value.ToString("yyyy-MM-dd") == x1.ColumnName.ToString("yyyy-MM-dd")) - .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 - .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 - .Select((x1, x2) => new - { - OperateCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_OPERATE, 1, 0)), //null的数据要为0所以不能用count - ExceptionCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_EXCEPTION, 1, 0)), //null的数据要为0所以不能用count - Date = x1.ColumnName.ToString("yyyy-MM-dd") - } - ).ToListAsync(); + var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, + (x1, x2) + => x2.CreateTime.Value.ToString("yyyy-MM-dd") + == x1.ColumnName.ToString("yyyy-MM-dd")) + .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 + .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 + .Select((x1, x2) => new + { + OperateCount = + SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_OPERATE, + 1, 0)),//null的数据要为0所以不能用count + ExceptionCount = + SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_EXCEPTION, + 1, 0)),//null的数据要为0所以不能用count + Date = x1.ColumnName.ToString("yyyy-MM-dd") + } + ).ToListAsync(); //定义返回结果 List result = new List(); //遍历结果 list.ForEach(it => { - result.Add(new OperateLogDayStatisticsOutput { Date = it.Date, Name = NameOperate, Count = it.OperateCount });//添加访问日志 - result.Add(new OperateLogDayStatisticsOutput { Date = it.Date, Name = NameExecption, Count = it.ExceptionCount });//添加异常日志 + result.Add(new OperateLogDayStatisticsOutput + { Date = it.Date, Name = NameOperate, Count = it.OperateCount });//添加访问日志 + result.Add(new OperateLogDayStatisticsOutput + { Date = it.Date, Name = NameExecption, Count = it.ExceptionCount });//添加异常日志 }); return result; } @@ -78,13 +92,15 @@ public class OperateLogService : DbRepository, IOperateLogService new OperateLogTotalCountOutpu { Type = NameOperate, - Value = data.Where(it => it.Category == CateGoryConst.Log_OPERATE).Select(it => it.Count).FirstOrDefault() + Value = data.Where(it => it.Category == CateGoryConst.Log_OPERATE) + .Select(it => it.Count).FirstOrDefault() }, //添加异常日志数据 new OperateLogTotalCountOutpu { Type = NameExecption, - Value = data.Where(it => it.Category == CateGoryConst.Log_EXCEPTION).Select(it => it.Count).FirstOrDefault() + Value = data.Where(it => it.Category == CateGoryConst.Log_EXCEPTION) + .Select(it => it.Count).FirstOrDefault() } }; return operageLogTotalCounts; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs index a10eaf7..d000529 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs @@ -13,12 +13,17 @@ public class VisitLogService : DbRepository, IVisitLogService public async Task> Page(VisitLogPageInput input) { var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Account), it => it.OpAccount == input.Account)//根据账号查询 - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey) || it.OpIp.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.CreateTime, OrderByType.Desc); - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .WhereIF(!string.IsNullOrEmpty(input.Account), + it => it.OpAccount == input.Account)//根据账号查询 + .WhereIF(!string.IsNullOrEmpty(input.Category), + it => it.Category == input.Category)//根据分类查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Name.Contains(input.SearchKey) + || it.OpIp.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}")//排序 + .OrderBy(it => it.CreateTime, OrderByType.Desc); + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -26,25 +31,31 @@ public class VisitLogService : DbRepository, IVisitLogService public async Task> StatisticsByDay(int day) { //取最近七天 - var dayArray = Enumerable.Range(0, day).Select(it => DateTime.Now.Date.AddDays(it * -1)).ToList(); + var dayArray = Enumerable.Range(0, day).Select(it => DateTime.Now.Date.AddDays(it * -1)) + .ToList(); //生成时间表 var queryableLeft = Context.Reportable(dayArray).ToQueryable(); //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 - var queryableRight = Context.Queryable(); //声名表 + var queryableRight = Context.Queryable();//声名表 //报表查询 - var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) - => x2.CreateTime.Value.ToString("yyyy-MM-dd") == x1.ColumnName.ToString("yyyy-MM-dd")) - .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 - .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 - .Select((x1, x2) => new VisitLogDayStatisticsOutput - { - LoginCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGIN, 1, 0)), //null的数据要为0所以不能用count - LogoutCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGOUT, 1, 0)), //null的数据要为0所以不能用count - Date = x1.ColumnName.ToString("yyyy-MM-dd") - } - ) - - .ToListAsync(); + var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, + (x1, x2) + => x2.CreateTime.Value.ToString("yyyy-MM-dd") + == x1.ColumnName.ToString("yyyy-MM-dd")) + .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 + .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 + .Select((x1, x2) => new VisitLogDayStatisticsOutput + { + LoginCount = + SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGIN, 1, + 0)),//null的数据要为0所以不能用count + LogoutCount = + SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGOUT, 1, + 0)),//null的数据要为0所以不能用count + Date = x1.ColumnName.ToString("yyyy-MM-dd") + } + ) + .ToListAsync(); return list; } @@ -65,13 +76,15 @@ public class VisitLogService : DbRepository, IVisitLogService new VisitLogTotalCountOutput { Type = EventSubscriberConst.LoginB, - Value = data.Where(it => it.Category == CateGoryConst.Log_LOGIN).Select(it => it.Count).FirstOrDefault() + Value = data.Where(it => it.Category == CateGoryConst.Log_LOGIN) + .Select(it => it.Count).FirstOrDefault() }, //添加登出数据 new VisitLogTotalCountOutput { Type = EventSubscriberConst.LoginOutB, - Value = data.Where(it => it.Category == CateGoryConst.Log_LOGOUT).Select(it => it.Count).FirstOrDefault() + Value = data.Where(it => it.Category == CateGoryConst.Log_LOGOUT) + .Select(it => it.Count).FirstOrDefault() } }; return visitLogTotalCounts; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs index 897c015..874a946 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs @@ -6,7 +6,8 @@ public class SysOrgService : DbRepository, ISysOrgService private readonly ISimpleCacheService _simpleCacheService; private readonly IImportExportService _importExportService; - public SysOrgService(ISimpleCacheService simpleCacheService, IImportExportService importExportService) + public SysOrgService(ISimpleCacheService simpleCacheService, + IImportExportService importExportService) { _simpleCacheService = simpleCacheService; _importExportService = importExportService; @@ -75,10 +76,12 @@ public class SysOrgService : DbRepository, ISysOrgService var query = Context.Queryable() .WhereIF(input.ParentId > 0, it => it.ParentId == input.ParentId)//父级 .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.Id))//机构ID查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Name.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -132,7 +135,8 @@ public class SysOrgService : DbRepository, ISysOrgService out long orgId) { orgId = 0; - var sysOrg = sysOrgs.Where(it => it.ParentId == parentId && it.Name == orgName).FirstOrDefault(); + var sysOrg = sysOrgs.Where(it => it.ParentId == parentId && it.Name == orgName) + .FirstOrDefault(); if (sysOrg != null) { orgId = sysOrg.Id; @@ -182,7 +186,8 @@ public class SysOrgService : DbRepository, ISysOrgService //需要复制的组织名称列表 var orgNames = orgList.Where(it => ids.Contains(it.Id)).Select(it => it.Name).ToList(); //目标组织的一级子组织名称列表 - var targetChildNames = orgList.Where(it => it.ParentId == input.TargetId).Select(it => it.Name).ToList(); + var targetChildNames = orgList.Where(it => it.ParentId == input.TargetId) + .Select(it => it.Name).ToList(); orgNames.ForEach(it => { if (targetChildNames.Contains(it)) throw Oops.Bah($"已存在{it}"); @@ -211,7 +216,9 @@ public class SysOrgService : DbRepository, ISysOrgService //遍历机构重新赋值全称 addOrgList.ForEach(it => { - it.Names = it.ParentId == SimpleAdminConst.Zero ? it.Name : GetNames(orgList, it.ParentId, it.Name); + it.Names = it.ParentId == SimpleAdminConst.Zero + ? it.Name + : GetNames(orgList, it.ParentId, it.Name); }); if (await InsertRangeAsync(addOrgList))//插入数据 @@ -252,12 +259,15 @@ public class SysOrgService : DbRepository, ISysOrgService sysDeleteOrgList.Add(it); }); //如果组织下有用户则不能删除 - if (await Context.Queryable().AnyAsync(it => sysDeleteOrgList.Contains(it.OrgId))) + if (await Context.Queryable() + .AnyAsync(it => sysDeleteOrgList.Contains(it.OrgId))) { throw Oops.Bah($"请先删除{name}下的用户"); } //获取用户表有兼任组织的信息,oracle要改成Context.Queryable().Where(it => SqlFunc.Length(it.PositionJson) > 0).Select(it => it.PositionJson).ToListAsync(); - var positionJsons = await Context.Queryable().Where(it => !SqlFunc.IsNullOrEmpty(it.PositionJson)).Select(it => it.PositionJson).ToListAsync(); + var positionJsons = await Context.Queryable() + .Where(it => !SqlFunc.IsNullOrEmpty(it.PositionJson)).Select(it => it.PositionJson) + .ToListAsync(); if (positionJsons.Count > 0) { //去一次空 @@ -274,10 +284,12 @@ public class SysOrgService : DbRepository, ISysOrgService }); } //判断组织下是否有角色 - var hasRole = await Context.Queryable().Where(it => sysDeleteOrgList.Contains(it.OrgId.Value)).CountAsync() > 0; + var hasRole = await Context.Queryable() + .Where(it => sysDeleteOrgList.Contains(it.OrgId.Value)).CountAsync() > 0; if (hasRole) throw Oops.Bah($"请先删除{name}下的角色"); // 判断组织下是否有职位 - var hasPosition = await Context.Queryable().Where(it => sysDeleteOrgList.Contains(it.OrgId)).CountAsync() > 0; + var hasPosition = await Context.Queryable() + .Where(it => sysDeleteOrgList.Contains(it.OrgId)).CountAsync() > 0; if (hasPosition) throw Oops.Bah($"请先删除{name}下的职位"); //删除组织 if (await DeleteByIdsAsync(sysDeleteOrgList.Cast().ToArray())) @@ -327,11 +339,14 @@ public class SysOrgService : DbRepository, ISysOrgService private async Task CheckInput(SysOrg sysOrg, string name) { //判断分类是否正确 - if (sysOrg.Category != CateGoryConst.Org_COMPANY && sysOrg.Category != CateGoryConst.Org_DEPT) + if (sysOrg.Category != CateGoryConst.Org_COMPANY + && sysOrg.Category != CateGoryConst.Org_DEPT) throw Oops.Bah($"{name}所属分类错误:{sysOrg.Category}"); var sysOrgs = await GetListAsync();//获取全部 - if (sysOrgs.Any(it => it.ParentId == sysOrg.ParentId && it.Name == sysOrg.Name && it.Id != sysOrg.Id))//判断同级是否有名称重复的 + if (sysOrgs.Any(it => + it.ParentId == sysOrg.ParentId && it.Name == sysOrg.Name + && it.Id != sysOrg.Id))//判断同级是否有名称重复的 throw Oops.Bah($"存在重复的同级{name}:{sysOrg.Name}"); sysOrg.Names = sysOrg.Name;//全称默认自己 if (sysOrg.ParentId != 0) @@ -413,7 +428,8 @@ public class SysOrgService : DbRepository, ISysOrgService //遍历子节点 childen.ForEach(it => { - if (!orgList.Any(org => org.ParentId == it.Id)) it.IsLeaf = true;//如果没有下级,则设置为叶子节点 + if (!orgList.Any(org => org.ParentId == it.Id)) + it.IsLeaf = true;//如果没有下级,则设置为叶子节点 }); data.AddRange(childen);//添加子节点); data.Add(item);//添加到列表 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs index a466a29..6ee6f3d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs @@ -20,7 +20,8 @@ public class SysPositionService : DbRepository, ISysPositionService public override async Task> GetListAsync() { //先从Redis拿 - var sysPositions = _simpleCacheService.Get>(SystemConst.Cache_SysPosition); + var sysPositions = + _simpleCacheService.Get>(SystemConst.Cache_SysPosition); if (sysPositions == null) { //redis没有就去数据库拿 @@ -38,7 +39,8 @@ public class SysPositionService : DbRepository, ISysPositionService public async Task> GetPositionListByIdList(IdListInput input) { var positions = await GetListAsync(); - var positionList = positions.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的岗位列表 + var positionList = + positions.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的岗位列表 return positionList; } @@ -50,8 +52,9 @@ public class SysPositionService : DbRepository, ISysPositionService var positions = await GetListAsync(); var result = positions.WhereIF(input.OrgId > 0, it => orgIds.Contains(it.OrgId))//父级 .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.OrgId))//在指定机构列表查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .ToList().LinqPagedList(input.Current, input.Size); + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Name.Contains(input.SearchKey))//根据关键字查询 + .ToList().LinqPagedList(input.PageNum, input.PageSize); return result; } @@ -70,11 +73,14 @@ public class SysPositionService : DbRepository, ISysPositionService var query = Context.Queryable() .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.OrgId))//根据组织ID查询 .WhereIF(input.OrgIds != null, it => input.OrgIds.Contains(it.OrgId))//在指定机构列表查询 - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") + .WhereIF(!string.IsNullOrEmpty(input.Category), + it => it.Category == input.Category)//根据分类 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Name.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -110,7 +116,9 @@ public class SysPositionService : DbRepository, ISysPositionService throw Oops.Bah($"请先删除{name}下的用户"); } //获取用户表有兼任组织的信息 oracle要改成Context.Queryable().Where(it => SqlFunc.Length(it.PositionJson) > 0).Select(it => it.PositionJson).ToListAsync(); - var positionJsons = await Context.Queryable().Where(it => !SqlFunc.IsNullOrEmpty(it.PositionJson)).Select(it => it.PositionJson).ToListAsync(); + var positionJsons = await Context.Queryable() + .Where(it => !SqlFunc.IsNullOrEmpty(it.PositionJson)).Select(it => it.PositionJson) + .ToListAsync(); if (positionJsons.Count > 0) { positionJsons.ForEach(it => @@ -148,20 +156,28 @@ public class SysPositionService : DbRepository, ISysPositionService private async Task CheckInput(SysPosition sysPosition, string name) { //所有分类放一个列表 - var positionCategorys = new List() { CateGoryConst.Position_HIGH, CateGoryConst.Position_LOW, CateGoryConst.Position_MIDDLE }; + var positionCategorys = new List() + { + CateGoryConst.Position_HIGH, CateGoryConst.Position_LOW, CateGoryConst.Position_MIDDLE + }; if (!positionCategorys.Contains(sysPosition.Category)) throw Oops.Bah($"{name}所属分类错误:{sysPosition.Category}"); var sysPositions = await GetListAsync();//获取全部 - if (sysPositions.Any(it => it.OrgId == sysPosition.OrgId && it.Name == sysPosition.Name && it.Id != sysPosition.Id))//判断同级是否有名称重复的 + if (sysPositions.Any(it => + it.OrgId == sysPosition.OrgId && it.Name == sysPosition.Name + && it.Id != sysPosition.Id))//判断同级是否有名称重复的 throw Oops.Bah($"存在重复的{name}:{sysPosition.Name}"); if (sysPosition.Id > 0)//如果ID大于0表示编辑 { - var postion = sysPositions.Where(it => it.Id == sysPosition.Id).FirstOrDefault();//获取当前职位 + var postion = + sysPositions.Where(it => it.Id == sysPosition.Id).FirstOrDefault();//获取当前职位 if (postion != null) { if (postion.OrgId != sysPosition.OrgId)//如果orgId不一样表示换机构了 { - if (await Context.Queryable().Where(it => it.PositionId == sysPosition.Id || SqlFunc.JsonLike(it.PositionJson, sysPosition.Id.ToString())).AnyAsync())//如果职位下有用户 + if (await Context.Queryable().Where(it => + it.PositionId == sysPosition.Id || SqlFunc.JsonLike(it.PositionJson, + sysPosition.Id.ToString())).AnyAsync())//如果职位下有用户 throw Oops.Bah($"该{name}下已存在用户,请先删除{name}下的用户"); } } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs index ab4e729..4a736a0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs @@ -10,7 +10,8 @@ public class ButtonService : DbRepository, IButtonService private readonly IRelationService _relationService; private readonly IEventPublisher _eventPublisher; - public ButtonService(ILogger logger, IResourceService resourceService, IRelationService relationService, + public ButtonService(ILogger logger, IResourceService resourceService, + IRelationService relationService, IEventPublisher eventPublisher) { _logger = logger; @@ -23,11 +24,15 @@ public class ButtonService : DbRepository, IButtonService public async Task> Page(ButtonPageInput input) { var query = Context.Queryable() - .Where(it => it.ParentId == input.ParentId && it.Category == CateGoryConst.Resource_BUTTON) - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey) || it.Path.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") + .Where(it => + it.ParentId == input.ParentId && it.Category == CateGoryConst.Resource_BUTTON) + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Title.Contains(input.SearchKey) + || it.Path.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -44,8 +49,10 @@ public class ButtonService : DbRepository, IButtonService public async Task> AddBatch(ButtonAddInput input) { var sysResources = new List();//按钮列表 - var codeList = new List() { "Add", "Edit", "Delete", "BatchDelete", "Import", "Export", "BatchEdit" };//code后缀 - var titleList = new List() { "新增", "编辑", "删除", "批量删除", "导入", "导出", "批量编辑" };//title前缀 + var codeList = new List() + { "Add", "Edit", "Delete", "BatchDelete", "Import", "Export", "BatchEdit" };//code后缀 + var titleList = new List() + { "新增", "编辑", "删除", "批量删除", "导入", "导出", "批量编辑" };//title前缀 var idList = new List();//Id列表 for (var i = 0; i < codeList.Count; i++) { @@ -112,9 +119,12 @@ public class ButtonService : DbRepository, IButtonService //获取所有菜单集合 var menuList = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); //获取按钮的父菜单id集合 - var parentIds = buttonList.Where(it => ids.Contains(it.Id)).Select(it => it.ParentId.Value.ToString()).ToList(); + var parentIds = buttonList.Where(it => ids.Contains(it.Id)) + .Select(it => it.ParentId.Value.ToString()).ToList(); //获取关系表分类为SYS_ROLE_HAS_RESOURCE数据 - var roleResources = await _relationService.GetRelationByCategory(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); + var roleResources = + await _relationService.GetRelationByCategory(CateGoryConst + .Relation_SYS_ROLE_HAS_RESOURCE); //获取相关关系表数据 var relationList = roleResources .Where(it => parentIds.Contains(it.TargetId))//目标ID是父ID中 @@ -141,13 +151,15 @@ public class ButtonService : DbRepository, IButtonService await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 if (relationList.Count > 0) { - await Context.Updateable(relationList).UpdateColumns(it => it.ExtJson).ExecuteCommandAsync();//修改拓展信息 + await Context.Updateable(relationList).UpdateColumns(it => it.ExtJson) + .ExecuteCommandAsync();//修改拓展信息 } }); if (result.IsSuccess)//如果成功了 { await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//资源表按钮刷新缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新角色资源缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新角色资源缓存 } else { @@ -166,7 +178,8 @@ public class ButtonService : DbRepository, IButtonService private async Task CheckInput(SysResource sysResource) { //获取所有按钮和菜单 - var buttonList = await _resourceService.GetListAsync(new List { CateGoryConst.Resource_BUTTON, CateGoryConst.Resource_MENU }); + var buttonList = await _resourceService.GetListAsync(new List + { CateGoryConst.Resource_BUTTON, CateGoryConst.Resource_MENU }); //判断code是否重复 if (buttonList.Any(it => it.Code == sysResource.Code && it.Id != sysResource.Id)) throw Oops.Bah($"存在重复的按钮编码:{sysResource.Code}"); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs index f64dafa..226a16a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs @@ -13,24 +13,26 @@ public class ModuleService : DbRepository, IModuleService private readonly IRelationService _relationService; public ModuleService(ILogger logger, ISimpleCacheService simpleCacheService, - IResourceService resourceService, - IRelationService relationService) + IResourceService resourceService, + IRelationService relationService) { - this._logger = logger; - this._simpleCacheService = simpleCacheService; - this._resourceService = resourceService; - this._relationService = relationService; + _logger = logger; + _simpleCacheService = simpleCacheService; + _resourceService = resourceService; + _relationService = relationService; } /// public async Task> Page(ModulePageInput input) { var query = Context.Queryable() - .Where(it => it.Category == CateGoryConst.Resource_MODULE)//模块 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .Where(it => it.Category == CateGoryConst.Resource_MODULE)//模块 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Title.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") + .OrderBy(it => it.SortCode);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -68,7 +70,10 @@ public class ModuleService : DbRepository, IModuleService if (system != null) throw Oops.Bah($"不可删除系统内置模块:{system.Title}"); //获取模块下的所有菜单Id列表 - var menuIds = resourceList.Where(it => ids.Contains(it.Module.ToLong()) && it.ParentId.ToLong() == SimpleAdminConst.Zero).Select(it => it.Id).ToList(); + var menuIds = resourceList + .Where(it => + ids.Contains(it.Module.ToLong()) + && it.ParentId.ToLong() == SimpleAdminConst.Zero).Select(it => it.Id).ToList(); //需要删除的资源ID列表 var resourceIds = new List(); //遍历列表 @@ -86,12 +91,16 @@ public class ModuleService : DbRepository, IModuleService { await DeleteByIdsAsync(ids.Cast().ToArray());//删除菜单和按钮 await Context.Deleteable()//关系表删除对应SYS_ROLE_HAS_RESOURCE - .Where(it => it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))).ExecuteCommandAsync(); + .Where(it => + it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE + && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))) + .ExecuteCommandAsync(); }); if (result.IsSuccess)//如果成功了 { await _resourceService.RefreshCache();//资源表刷新缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 } else { @@ -110,9 +119,11 @@ public class ModuleService : DbRepository, IModuleService /// private async Task CheckInput(SysResource sysResource) { - var sysResourceList = await _resourceService.GetListByCategory(CateGoryConst.Resource_MODULE); + var sysResourceList = + await _resourceService.GetListByCategory(CateGoryConst.Resource_MODULE); //判断是否从存在重复模块 - var hasSameName = sysResourceList.Any(it => it.Title == sysResource.Title && it.Id != sysResource.Id); + var hasSameName = + sysResourceList.Any(it => it.Title == sysResource.Title && it.Id != sysResource.Id); if (hasSameName) { throw Oops.Bah($"存在重复的模块:{sysResource.Title}"); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs index a1da3f4..57710d7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs @@ -11,6 +11,13 @@ public interface IResourceService : ITransient /// 所有的菜单和模块以及单页面列表 Task> GetaModuleAndMenuAndSpaList(); + /// + /// 根据模块ID获取菜单和单页面列表 + /// + /// + /// + Task> GetMenuAndSpaListByModuleId(long id); + /// /// 根据资源ID获取所有下级资源 /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs index 086ef8a..6b1f36b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs @@ -54,6 +54,21 @@ public class ResourceService : DbRepository, IResourceService return sysResources; } + /// + public async Task> GetMenuAndSpaListByModuleId(long id) + { + //获取所有的菜单和模块以及单页面列表, + var sysResources = await GetListAsync(new List { CateGoryConst.Resource_MENU, CateGoryConst.Resource_SPA }); + if (sysResources != null) + { + //并按分类和排序码排序 + sysResources = sysResources + .Where(it => it.Category == CateGoryConst.Resource_SPA || it.Module == id)//根据模块ID获取菜单 + .OrderBy(it => it.Category).ThenBy(it => it.SortCode).ToList();//排序 + } + return sysResources; + } + /// public async Task RefreshCache(string category = null) { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs index b2a66cd..d2e7d9e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs @@ -11,19 +11,23 @@ public class SpaService : DbRepository, ISpaService public SpaService(ISimpleCacheService simpleCacheService, IResourceService resourceService) { _simpleCacheService = simpleCacheService; - this._resourceService = resourceService; + _resourceService = resourceService; } /// public async Task> Page(SpaPageInput input) { var query = Context.Queryable() - .Where(it => it.Category == CateGoryConst.Resource_SPA)//单页 - .WhereIF(!string.IsNullOrEmpty(input.MenuType), it => it.MenuType == input.MenuType)//根据菜单类型查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey) || it.Path.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + .Where(it => it.Category == CateGoryConst.Resource_SPA)//单页 + .WhereIF(!string.IsNullOrEmpty(input.MenuType), + it => it.MenuType == input.MenuType)//根据菜单类型查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Title.Contains(input.SearchKey) + || it.Path.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") + .OrderBy(it => it.SortCode);//排序 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -87,7 +91,8 @@ public class SpaService : DbRepository, ISpaService throw Oops.Bah($"组件地址不能为空"); } } - else if (sysResource.MenuType == ResourceConst.IFRAME || sysResource.MenuType == ResourceConst.LINK)//如果是内链或者外链 + else if (sysResource.MenuType == ResourceConst.IFRAME + || sysResource.MenuType == ResourceConst.LINK)//如果是内链或者外链 { sysResource.Name = RandomHelper.CreateNum(10);//设置name为随机数 sysResource.Component = null; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs index aa38622..12673f6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs @@ -48,7 +48,9 @@ public class RoleService : DbRepository, IRoleService public async Task> GetRoleListByUserId(long userId) { var cods = new List();//角色代码集合 - var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID + var roleList = + await _relationService.GetRelationListByObjectIdAndCategory(userId, + CateGoryConst.Relation_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID var roleIdList = roleList.Select(x => x.TargetId.ToLong()).ToList();//角色ID列表 if (roleIdList.Count > 0) { @@ -63,11 +65,14 @@ public class RoleService : DbRepository, IRoleService var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 var query = Context.Queryable() .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.OrgId.Value))//根据组织 - .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") + .WhereIF(!string.IsNullOrEmpty(input.Category), + it => it.Category == input.Category)//根据分类 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Name.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"{input.SortField} {input.SortOrder}") .OrderBy(it => it.SortCode);//排序 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -96,7 +101,9 @@ public class RoleService : DbRepository, IRoleService if (role.DefaultDataScope.ScopeCategory != input.DefaultDataScope.ScopeCategory) { //获取角色授权列表 - var relations = await _relationService.GetRelationByCategory(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); + var relations = + await _relationService.GetRelationByCategory(CateGoryConst + .Relation_SYS_ROLE_HAS_PERMISSION); //找到当前角色的 permissions = relations.Where(it => it.ObjectId == input.Id).ToList(); permissions.ForEach(it => @@ -104,11 +111,13 @@ public class RoleService : DbRepository, IRoleService var rolePermission = it.ExtJson.ToJsonEntity();//扩展信息转实体 //如果表里的数据范围是默认数据范围才更新,已经自定义了的数据范围不更新 if (rolePermission.ScopeCategory == role.DefaultDataScope.ScopeCategory - && Enumerable.SequenceEqual(rolePermission.ScopeDefineOrgIdList, role.DefaultDataScope.ScopeDefineOrgIdList)) + && Enumerable.SequenceEqual(rolePermission.ScopeDefineOrgIdList, + role.DefaultDataScope.ScopeDefineOrgIdList)) { //重新赋值数据范围 rolePermission.ScopeCategory = input.DefaultDataScope.ScopeCategory; - rolePermission.ScopeDefineOrgIdList = input.DefaultDataScope.ScopeDefineOrgIdList; + rolePermission.ScopeDefineOrgIdList = + input.DefaultDataScope.ScopeDefineOrgIdList; it.ExtJson = rolePermission.ToJson(); } }); @@ -125,8 +134,10 @@ public class RoleService : DbRepository, IRoleService { await RefreshCache();//刷新缓存 if (permissions.Any())//如果有授权权 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION);//关系表刷新SYS_ROLE_HAS_PERMISSION缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, new List { input.Id });//清除角色下用户缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_ROLE_HAS_PERMISSION);//关系表刷新SYS_ROLE_HAS_PERMISSION缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + new List { input.Id });//清除角色下用户缓存 } else { @@ -145,30 +156,43 @@ public class RoleService : DbRepository, IRoleService if (ids.Count > 0) { var sysRoles = await GetListAsync();//获取所有角色 - var hasSuperAdmin = sysRoles.Any(it => it.Code == RoleConst.SuperAdmin && ids.Contains(it.Id));//判断是否有超级管理员 + var hasSuperAdmin = + sysRoles.Any(it => + it.Code == RoleConst.SuperAdmin && ids.Contains(it.Id));//判断是否有超级管理员 if (hasSuperAdmin) throw Oops.Bah($"不可删除系统内置超管角色"); //数据库是string所以这里转下 var targetIds = ids.Select(it => it.ToString()).ToList(); //定义删除的关系 - var delRelations = new List { CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE, CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION }; + var delRelations = new List + { + CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE, + CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION + }; //事务 var result = await itenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 var relationRep = ChangeRepository>();//切换仓储 //删除关系表角色与资源关系,角色与权限关系 - await relationRep.DeleteAsync(it => ids.Contains(it.ObjectId) && delRelations.Contains(it.Category)); + await relationRep.DeleteAsync(it => + ids.Contains(it.ObjectId) && delRelations.Contains(it.Category)); //删除关系表角色与用户关系 - await relationRep.DeleteAsync(it => targetIds.Contains(it.TargetId) && it.Category == CateGoryConst.Relation_SYS_USER_HAS_ROLE); + await relationRep.DeleteAsync(it => + targetIds.Contains(it.TargetId) + && it.Category == CateGoryConst.Relation_SYS_USER_HAS_ROLE); }); if (result.IsSuccess)//如果成功了 { await RefreshCache();//刷新缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新Relation_SYS_ROLE_HAS_RESOURCE缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION);//关系表刷新Relation_SYS_ROLE_HAS_PERMISSION缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, ids);//清除角色下用户缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新Relation_SYS_ROLE_HAS_RESOURCE缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_ROLE_HAS_PERMISSION);//关系表刷新Relation_SYS_ROLE_HAS_PERMISSION缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + ids);//清除角色下用户缓存 } else { @@ -185,7 +209,8 @@ public class RoleService : DbRepository, IRoleService var roleOwnResource = new RoleOwnResourceOutput() { Id = input.Id };//定义结果集 var GrantInfoList = new List();//已授权信息集合 //获取关系列表 - var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, category); + var relations = + await _relationService.GetRelationListByObjectIdAndCategory(input.Id, category); //遍历关系表 relations.ForEach(it => { @@ -252,7 +277,8 @@ public class RoleService : DbRepository, IRoleService if (menus.Count > 0) { //获取权限授权树 - var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); + var permissions = + _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); permissions.ForEach(it => { //新建角色权限关系 @@ -261,7 +287,12 @@ public class RoleService : DbRepository, IRoleService ObjectId = sysRole.Id, TargetId = it.ApiRoute, Category = CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION, - ExtJson = new RelationRolePermission { ApiUrl = it.ApiRoute, ScopeCategory = defaultDataScope.ScopeCategory, ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList } + ExtJson = new RelationRolePermission + { + ApiUrl = it.ApiRoute, + ScopeCategory = defaultDataScope.ScopeCategory, + ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList + } .ToJson() }); }); @@ -279,15 +310,20 @@ public class RoleService : DbRepository, IRoleService //如果不是代码生成,就删除老的 if (!input.IsCodeGen) await relatioRep.DeleteAsync(it => - it.ObjectId == sysRole.Id && (it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE + it.ObjectId == sysRole.Id + && (it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION + || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_MODULE)); await relatioRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 { - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//刷新关系缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION);//刷新关系缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, new List { input.Id });//发送事件清除角色下用户缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_ROLE_HAS_RESOURCE);//刷新关系缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_ROLE_HAS_PERMISSION);//刷新关系缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + new List { input.Id });//发送事件清除角色下用户缓存 } else { @@ -306,7 +342,8 @@ public class RoleService : DbRepository, IRoleService var roleOwnPermission = new RoleOwnPermissionOutput { Id = input.Id };//定义结果集 var GrantInfoList = new List();//已授权信息集合 //获取关系列表 - var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); + var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, + CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); //遍历关系表 relations.ForEach(it => { @@ -326,8 +363,11 @@ public class RoleService : DbRepository, IRoleService { var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiurl列表 var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION, input.Id, apiUrls, extJsons, true);//添加到数据库 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, new List { input.Id });//清除角色下用户缓存 + await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION, + input.Id, apiUrls, extJsons, + true);//添加到数据库 + await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + new List { input.Id });//清除角色下用户缓存 } } @@ -335,7 +375,9 @@ public class RoleService : DbRepository, IRoleService public async Task> OwnUser(BaseIdInput input) { //获取关系列表 - var relations = await _relationService.GetRelationListByTargetIdAndCategory(input.Id.ToString(), CateGoryConst.Relation_SYS_USER_HAS_ROLE); + var relations = + await _relationService.GetRelationListByTargetIdAndCategory(input.Id.ToString(), + CateGoryConst.Relation_SYS_USER_HAS_ROLE); return relations.Select(it => it.ObjectId).ToList(); } @@ -359,13 +401,17 @@ public class RoleService : DbRepository, IRoleService { var relationRep = ChangeRepository>();//切换仓储 var targetId = input.Id.ToString();//目标ID转string - await relationRep.DeleteAsync(it => it.TargetId == targetId && it.Category == CateGoryConst.Relation_SYS_USER_HAS_ROLE);//删除老的 + await relationRep.DeleteAsync(it => + it.TargetId == targetId + && it.Category == CateGoryConst.Relation_SYS_USER_HAS_ROLE);//删除老的 await relationRep.InsertRangeAsync(sysRelations);//添加新的 }); if (result.IsSuccess)//如果成功了 { - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_ROLE);//刷新关系表SYS_USER_HAS_ROLE缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, new List { input.Id });//清除角色下用户缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_USER_HAS_ROLE);//刷新关系表SYS_USER_HAS_ROLE缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + new List { input.Id });//清除角色下用户缓存 } else { @@ -387,8 +433,9 @@ public class RoleService : DbRepository, IRoleService var result = await Context.Queryable() .WhereIF(orgIds.Count > 0, it => orgIds.Contains(it.OrgId.Value))//组织ID .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//分类 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .ToPagedListAsync(input.Current, input.Size); + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Name.Contains(input.SearchKey))//根据关键字查询 + .ToPagedListAsync(input.PageNum, input.PageSize); return result; } @@ -397,17 +444,23 @@ public class RoleService : DbRepository, IRoleService { var permissionTreeSelectors = new List();//授权树结果集 //获取角色资源关系 - var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); - var menuIds = relationsRes.Where(it => it.ObjectId == input.Id).Select(it => it.TargetId.ToLong()).ToList(); + var relationsRes = + await _relationService.GetRelationByCategory(CateGoryConst + .Relation_SYS_ROLE_HAS_RESOURCE); + var menuIds = relationsRes.Where(it => it.ObjectId == input.Id) + .Select(it => it.TargetId.ToLong()).ToList(); if (menuIds.Any()) { //获取菜单信息 - var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); + var menus = + await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); //获取权限授权树 - var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); + var permissions = + _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); if (permissions.Count > 0) { - permissionTreeSelectors = permissions.Select(it => it.PermissionName).ToList();//返回授权树权限名称列表 + permissionTreeSelectors = + permissions.Select(it => it.PermissionName).ToList();//返回授权树权限名称列表 } } return permissionTreeSelectors; @@ -437,7 +490,8 @@ public class RoleService : DbRepository, IRoleService private async Task CheckInput(SysRole sysRole) { //判断分类 - if (sysRole.Category != CateGoryConst.Role_GLOBAL && sysRole.Category != CateGoryConst.Role_ORG) + if (sysRole.Category != CateGoryConst.Role_GLOBAL + && sysRole.Category != CateGoryConst.Role_ORG) throw Oops.Bah($"角色所属分类错误:{sysRole.Category}"); //如果是机构角色orgId不能为空 if (sysRole.Category == CateGoryConst.Role_ORG && sysRole.OrgId == null) @@ -446,7 +500,8 @@ public class RoleService : DbRepository, IRoleService sysRole.OrgId = null;//机构id设null var sysRoles = await GetListAsync();//获取所有 - var repeatName = sysRoles.Any(it => it.OrgId == sysRole.OrgId && it.Name == sysRole.Name && it.Id != sysRole.Id);//是否有重复角色名称 + var repeatName = sysRoles.Any(it => + it.OrgId == sysRole.OrgId && it.Name == sysRole.Name && it.Id != sysRole.Id);//是否有重复角色名称 if (repeatName)//如果有 { if (sysRole.OrgId == null) diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs index cc52ab2..7805344 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs @@ -100,7 +100,8 @@ public class SysUserService : DbRepository, ISysUserService public async Task GetUserById(long userId) { //先从Redis拿 - var sysUser = _simpleCacheService.HashGetOne(SystemConst.Cache_SysUser, userId.ToString()); + var sysUser = + _simpleCacheService.HashGetOne(SystemConst.Cache_SysUser, userId.ToString()); if (sysUser == null) { sysUser = await GetUserFromDb(userId);//从数据库拿用户信息 @@ -112,7 +113,8 @@ public class SysUserService : DbRepository, ISysUserService public async Task GetUserById(long userId) { //先从Redis拿 - var sysUser = _simpleCacheService.HashGetOne(SystemConst.Cache_SysUser, userId.ToString()); + var sysUser = + _simpleCacheService.HashGetOne(SystemConst.Cache_SysUser, userId.ToString()); if (sysUser == null) { var user = await GetUserFromDb(userId);//从数据库拿用户信息 @@ -131,7 +133,8 @@ public class SysUserService : DbRepository, ISysUserService public async Task GetIdByAccount(string account) { //先从Redis拿 - var userId = _simpleCacheService.HashGetOne(SystemConst.Cache_SysUserAccount, account); + var userId = + _simpleCacheService.HashGetOne(SystemConst.Cache_SysUserAccount, account); if (userId == 0) { //单查获取用户账号对应ID @@ -150,25 +153,34 @@ public class SysUserService : DbRepository, ISysUserService { var buttonCodeList = new List();//按钮ID集合 //获取用户资源集合 - var resourceList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); + var resourceList = + await _relationService.GetRelationListByObjectIdAndCategory(userId, + CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); var buttonIdList = new List();//按钮ID集合 if (resourceList.Count == 0)//如果有表示用户单独授权了不走用户角色 { //获取用户角色关系集合 - var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_ROLE); + var roleList = + await _relationService.GetRelationListByObjectIdAndCategory(userId, + CateGoryConst.Relation_SYS_USER_HAS_ROLE); var roleIdList = roleList.Select(x => x.TargetId.ToLong()).ToList();//角色ID列表 if (roleIdList.Count > 0)//如果该用户有角色 { - resourceList = await _relationService.GetRelationListByObjectIdListAndCategory(roleIdList, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//获取资源集合 + resourceList = + await _relationService.GetRelationListByObjectIdListAndCategory(roleIdList, + CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//获取资源集合 } } resourceList.ForEach(it => { - if (!string.IsNullOrEmpty(it.ExtJson)) buttonIdList.AddRange(it.ExtJson.ToJsonEntity().ButtonInfo);//如果有按钮权限,将按钮ID放到buttonIdList + if (!string.IsNullOrEmpty(it.ExtJson)) + buttonIdList.AddRange(it.ExtJson.ToJsonEntity() + .ButtonInfo);//如果有按钮权限,将按钮ID放到buttonIdList }); if (buttonIdList.Count > 0) { - buttonCodeList = await _resourceService.GetCodeByIds(buttonIdList, CateGoryConst.Resource_BUTTON); + buttonCodeList = + await _resourceService.GetCodeByIds(buttonIdList, CateGoryConst.Resource_BUTTON); } return buttonCodeList; } @@ -177,17 +189,24 @@ public class SysUserService : DbRepository, ISysUserService public async Task> GetPermissionListByUserId(long userId, long orgId) { var permissions = new List();//权限集合 - var sysRelations = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_PERMISSION);//根据用户ID获取用户权限 + var sysRelations = + await _relationService.GetRelationListByObjectIdAndCategory(userId, + CateGoryConst.Relation_SYS_USER_HAS_PERMISSION);//根据用户ID获取用户权限 if (sysRelations.Count == 0)//如果有表示用户单独授权了不走用户角色 { - var roleIdList = await _relationService.GetRelationListByObjectIdAndCategory(userId, CateGoryConst.Relation_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID + var roleIdList = + await _relationService.GetRelationListByObjectIdAndCategory(userId, + CateGoryConst.Relation_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID if (roleIdList.Count > 0)//如果角色ID不为空 { //获取角色权限信息 - sysRelations = await _relationService.GetRelationListByObjectIdListAndCategory(roleIdList.Select(it => it.TargetId.ToLong()).ToList(), CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); + sysRelations = await _relationService.GetRelationListByObjectIdListAndCategory( + roleIdList.Select(it => it.TargetId.ToLong()).ToList(), + CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); } } - var relationGroup = sysRelations.GroupBy(it => it.TargetId).ToList();//根据目标ID,也就是接口名分组,因为存在一个用户多个角色 + var relationGroup = + sysRelations.GroupBy(it => it.TargetId).ToList();//根据目标ID,也就是接口名分组,因为存在一个用户多个角色 //遍历分组 foreach (var it in relationGroup) { @@ -195,14 +214,18 @@ public class SysUserService : DbRepository, ISysUserService var relationList = it.ToList();//关系列表 var scopeCategory = CateGoryConst.SCOPE_SELF;//数据权限分类,默认为仅自己 //获取角色权限信息列表 - var rolePermissions = relationList.Select(it => it.ExtJson.ToJsonEntity()).ToList(); + var rolePermissions = relationList + .Select(it => it.ExtJson.ToJsonEntity()).ToList(); if (rolePermissions.Any(role => role.ScopeCategory == CateGoryConst.SCOPE_ALL))//如果有全部 scopeCategory = CateGoryConst.SCOPE_ALL;//标记为全部 - else if (rolePermissions.Any(role => role.ScopeCategory == CateGoryConst.SCOPE_ORG_CHILD))//如果有机构及以下机构 + else if (rolePermissions.Any( + role => role.ScopeCategory == CateGoryConst.SCOPE_ORG_CHILD))//如果有机构及以下机构 scopeCategory = CateGoryConst.SCOPE_ORG_CHILD;//标记为机构及以下机构 - else if (rolePermissions.Any(role => role.ScopeCategory == CateGoryConst.SCOPE_ORG))//如果有仅自己机构 + else if (rolePermissions.Any(role => + role.ScopeCategory == CateGoryConst.SCOPE_ORG))//如果有仅自己机构 scopeCategory = CateGoryConst.SCOPE_ORG;//标记为仅自己机构 - else if (rolePermissions.Any(role => role.ScopeCategory == CateGoryConst.SCOPE_ORG_DEFINE))//如果有自定义机构 + else if (rolePermissions.Any(role => + role.ScopeCategory == CateGoryConst.SCOPE_ORG_DEFINE))//如果有自定义机构 { scopeCategory = CateGoryConst.SCOPE_ORG_DEFINE;//标记为仅自己 rolePermissions.ForEach(s => @@ -260,14 +283,16 @@ public class SysUserService : DbRepository, ISysUserService .LeftJoin((u, o, p) => u.PositionId == p.Id) .WhereIF(input.OrgId > 0, u => orgIds.Contains(u.OrgId))//指定机构 .WhereIF(input.OrgIds != null, u => input.OrgIds.Contains(u.OrgId))//在指定机构列表查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u => u.Name.Contains(input.SearchKey) || u.Account.Contains(input.SearchKey))//根据关键字查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + u => u.Name.Contains(input.SearchKey) + || u.Account.Contains(input.SearchKey))//根据关键字查询 .Select((u, o, p) => new UserSelectorOutPut { Id = u.Id.SelectAll(), OrgName = o.Name, PositionName = p.Name }) - .ToPagedListAsync(input.Current, input.Size); + .ToPagedListAsync(input.PageNum, input.PageSize); return result; } @@ -275,7 +300,7 @@ public class SysUserService : DbRepository, ISysUserService public async Task> Page(UserPageInput input) { var query = await GetQuery(input);//获取查询条件 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 + var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 return pageInfo; } @@ -290,7 +315,9 @@ public class SysUserService : DbRepository, ISysUserService /// public async Task> OwnRole(BaseIdInput input) { - var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.Relation_SYS_USER_HAS_ROLE); + var relations = + await _relationService.GetRelationListByObjectIdAndCategory(input.Id, + CateGoryConst.Relation_SYS_USER_HAS_ROLE); return relations.Select(it => it.TargetId.ToLong()).ToList(); } @@ -309,7 +336,8 @@ public class SysUserService : DbRepository, ISysUserService };//定义结果集 var grantInfoList = new List();//已授权信息集合 //获取关系列表 - var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, CateGoryConst.Relation_SYS_USER_HAS_PERMISSION); + var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, + CateGoryConst.Relation_SYS_USER_HAS_PERMISSION); //遍历关系表 relations.ForEach(it => { @@ -326,17 +354,23 @@ public class SysUserService : DbRepository, ISysUserService { var permissionTreeSelectors = new List();//授权树结果集 //获取用户资源关系 - var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); - var menuIds = relationsRes.Where(it => it.ObjectId == input.Id).Select(it => it.TargetId.ToLong()).ToList(); + var relationsRes = + await _relationService.GetRelationByCategory(CateGoryConst + .Relation_SYS_USER_HAS_RESOURCE); + var menuIds = relationsRes.Where(it => it.ObjectId == input.Id) + .Select(it => it.TargetId.ToLong()).ToList(); if (menuIds.Any()) { //获取菜单信息 - var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); + var menus = + await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); //获取权限授权树 - var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); + var permissions = + _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); if (permissions.Count > 0) { - permissionTreeSelectors = permissions.Select(it => it.PermissionName).ToList();//返回授权树权限名称列表 + permissionTreeSelectors = + permissions.Select(it => it.PermissionName).ToList();//返回授权树权限名称列表 } } return permissionTreeSelectors; @@ -345,7 +379,8 @@ public class SysUserService : DbRepository, ISysUserService /// public async Task> GetUserListByIdList(IdListInput input) { - var userList = await Context.Queryable().Where(it => input.IdList.Contains(it.Id)).Select().ToListAsync(); + var userList = await Context.Queryable().Where(it => input.IdList.Contains(it.Id)) + .Select().ToListAsync(); return userList; } @@ -413,7 +448,8 @@ public class SysUserService : DbRepository, ISysUserService { DeleteUserFromRedis(sysUser.Id);//删除用户缓存 //删除用户token缓存 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, new string[] { sysUser.Id.ToString() }); + _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, + new string[] { sysUser.Id.ToString() }); } } } @@ -425,7 +461,8 @@ public class SysUserService : DbRepository, ISysUserService var data = await _batchEditService.GetUpdateBatchConfigDict(input.Code, input.Columns); if (data.Count > 0) { - await Context.Updateable(data).Where(it => input.Ids.Contains(it.Id)).ExecuteCommandAsync(); + await Context.Updateable(data).Where(it => input.Ids.Contains(it.Id)) + .ExecuteCommandAsync(); } } @@ -483,7 +520,9 @@ public class SysUserService : DbRepository, ISysUserService throw Oops.Bah($"不能给超管分配角色"); CheckSelf(input.Id, SimpleAdminConst.GrantRole);//判断是不是自己 //给用户赋角色 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_USER_HAS_ROLE, input.Id, input.RoleIdList.Select(it => it.ToString()).ToList(), null, true); + await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_USER_HAS_ROLE, + input.Id, input.RoleIdList.Select(it => it.ToString()).ToList(), null, + true); DeleteUserFromRedis(input.Id);//从redis删除用户信息 } } @@ -520,11 +559,13 @@ public class SysUserService : DbRepository, ISysUserService var defaultDataScope = input.DefaultDataScope;//获取默认数据范围 //获取菜单信息 - var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); + var menus = + await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); if (menus.Count > 0) { //获取权限授权树 - var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); + var permissions = + _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); permissions.ForEach(it => { //新建角色权限关系 @@ -553,13 +594,17 @@ public class SysUserService : DbRepository, ISysUserService { var relatioRep = ChangeRepository>();//切换仓储 await relatioRep.DeleteAsync(it => - it.ObjectId == sysUser.Id && (it.Category == CateGoryConst.Relation_SYS_USER_HAS_PERMISSION || it.Category == CateGoryConst.Relation_SYS_USER_HAS_RESOURCE)); + it.ObjectId == sysUser.Id + && (it.Category == CateGoryConst.Relation_SYS_USER_HAS_PERMISSION + || it.Category == CateGoryConst.Relation_SYS_USER_HAS_RESOURCE)); await relatioRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 { - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_PERMISSION);//刷新关系缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_RESOURCE);//刷新关系缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_USER_HAS_PERMISSION);//刷新关系缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_USER_HAS_RESOURCE);//刷新关系缓存 DeleteUserFromRedis(input.Id);//删除该用户缓存 } else @@ -581,7 +626,9 @@ public class SysUserService : DbRepository, ISysUserService { var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiurl列表 var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, input.Id, apiUrls, extJsons, true);//添加到数据库 + await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, + input.Id, apiUrls, extJsons, + true);//添加到数据库 DeleteUserFromRedis(input.Id); } } @@ -597,7 +644,8 @@ public class SysUserService : DbRepository, ISysUserService var ids = input.Select(it => it.Id).ToList(); if (ids.Count > 0) { - var containsSuperAdmin = await IsAnyAsync(it => it.Account == RoleConst.SuperAdmin && ids.Contains(it.Id));//判断是否有超管 + var containsSuperAdmin = await IsAnyAsync(it => + it.Account == RoleConst.SuperAdmin && ids.Contains(it.Id));//判断是否有超管 if (containsSuperAdmin) throw Oops.Bah($"不可删除系统内置超管用户"); if (ids.Contains(UserManager.UserId)) @@ -606,17 +654,19 @@ public class SysUserService : DbRepository, ISysUserService //需要更新兼任信息的用户列表 var updatePositionJsonUser = new List(); //获取兼任主管不是空的用户信息 - var positionJsons = await GetListAsync(it => !SqlFunc.IsNullOrEmpty(it.PositionJson), it => new SysUser - { - Id = it.Id, - PositionJson = it.PositionJson - }); + var positionJsons = await GetListAsync(it => !SqlFunc.IsNullOrEmpty(it.PositionJson), + it => new SysUser + { + Id = it.Id, + PositionJson = it.PositionJson + }); positionJsons.ForEach(position => { var update = false;//是否要更新标致 //过滤主管是空的 - var positionJson = position.PositionJson.Where(it => it.DirectorId != null).ToList(); + var positionJson = + position.PositionJson.Where(it => it.DirectorId != null).ToList(); //遍历兼任信息 positionJson.ForEach(it => { @@ -633,7 +683,12 @@ public class SysUserService : DbRepository, ISysUserService updatePositionJsonUser.Add(position); }); //定义删除的关系 - var delRelations = new List { CateGoryConst.Relation_SYS_USER_HAS_RESOURCE, CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, CateGoryConst.Relation_SYS_USER_HAS_ROLE }; + var delRelations = new List + { + CateGoryConst.Relation_SYS_USER_HAS_RESOURCE, + CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, + CateGoryConst.Relation_SYS_USER_HAS_ROLE + }; //事务 var result = await itenant.UseTranAsync(async () => { @@ -644,20 +699,25 @@ public class SysUserService : DbRepository, ISysUserService }, it => ids.Contains(it.DirectorId.Value)); //如果有兼任主管就清除兼任主管信息 if (updatePositionJsonUser.Count > 0) - await Context.Updateable(updatePositionJsonUser).UpdateColumns(it => it.PositionJson).ExecuteCommandAsync(); + await Context.Updateable(updatePositionJsonUser) + .UpdateColumns(it => it.PositionJson).ExecuteCommandAsync(); //删除用户 await DeleteByIdsAsync(ids.Cast().ToArray()); var relationRep = ChangeRepository>();//切换仓储 //删除关系表用户与资源关系,用户与权限关系,用户与角色关系 - await relationRep.DeleteAsync(it => ids.Contains(it.ObjectId) && delRelations.Contains(it.Category)); + await relationRep.DeleteAsync(it => + ids.Contains(it.ObjectId) && delRelations.Contains(it.Category)); }); if (result.IsSuccess)//如果成功了 { DeleteUserFromRedis(ids);//redis删除用户 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_RESOURCE);//关系表刷新SYS_USER_HAS_ROLE缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_USER_HAS_PERMISSION);//关系表刷新SYS_USER_HAS_ROLE缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_USER_HAS_RESOURCE);//关系表刷新SYS_USER_HAS_ROLE缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_USER_HAS_PERMISSION);//关系表刷新SYS_USER_HAS_ROLE缓存 // TODO 此处需要将这些用户踢下线,并永久注销这些用户 var idArray = ids.Select(it => it.ToString()).ToArray(); //从列表中删除 @@ -685,7 +745,8 @@ public class SysUserService : DbRepository, ISysUserService public void DeleteUserFromRedis(List ids) { var userIds = ids.Select(it => it.ToString()).ToArray();//id转string列表 - var sysUsers = _simpleCacheService.HashGet(SystemConst.Cache_SysUser, userIds);//获取用户列表 + var sysUsers = + _simpleCacheService.HashGet(SystemConst.Cache_SysUser, userIds);//获取用户列表 sysUsers = sysUsers.Where(it => it != null).ToList();//过滤掉不存在的 if (sysUsers.Count > 0) { @@ -717,13 +778,15 @@ public class SysUserService : DbRepository, ISysUserService /// public async Task> Preview(ImportPreviewInput input) { - var importPreview = await _importExportService.GetImportPreview(input.File); + var importPreview = + await _importExportService.GetImportPreview(input.File); importPreview.Data = await CheckImport(importPreview.Data);//检查导入数据 return importPreview; } /// - public async Task> Import(ImportResultInput input) + public async Task> Import( + ImportResultInput input) { var data = await CheckImport(input.Data, true);//检查数据格式 var result = _importExportService.GetImportResultPreview(data, out var importData); @@ -743,13 +806,16 @@ public class SysUserService : DbRepository, ISysUserService } /// - public async Task> CheckImport(List data, bool clearError = false) where T : SysUserImportInput + public async Task> CheckImport(List data, bool clearError = false) + where T : SysUserImportInput { #region 校验要用到的数据 var accounts = data.Select(it => it.Account).ToList();//当前导入数据账号列表 - var phones = data.Where(it => !string.IsNullOrEmpty(it.Phone)).Select(it => it.Phone).ToList();//当前导入数据手机号列表 - var emails = data.Where(it => !string.IsNullOrEmpty(it.Email)).Select(it => it.Email).ToList();//当前导入数据邮箱列表 + var phones = data.Where(it => !string.IsNullOrEmpty(it.Phone)).Select(it => it.Phone) + .ToList();//当前导入数据手机号列表 + var emails = data.Where(it => !string.IsNullOrEmpty(it.Email)).Select(it => it.Email) + .ToList();//当前导入数据邮箱列表 var sysUsers = await GetListAsync(it => true, it => new SysUser { Account = it.Account, @@ -757,8 +823,10 @@ public class SysUserService : DbRepository, ISysUserService Email = it.Email });//获取数据用户信息 var dbAccounts = sysUsers.Select(it => it.Account).ToList();//数据库账号列表 - var dbPhones = sysUsers.Where(it => !string.IsNullOrEmpty(it.Phone)).Select(it => it.Phone).ToList();//数据库手机号列表 - var dbEmails = sysUsers.Where(it => !string.IsNullOrEmpty(it.Email)).Select(it => it.Email).ToList();//邮箱账号列表 + var dbPhones = sysUsers.Where(it => !string.IsNullOrEmpty(it.Phone)).Select(it => it.Phone) + .ToList();//数据库手机号列表 + var dbEmails = sysUsers.Where(it => !string.IsNullOrEmpty(it.Email)).Select(it => it.Email) + .ToList();//邮箱账号列表 var sysOrgs = await _sysOrgService.GetListAsync(); var sysPositions = await _sysPositionService.GetListAsync(); var dicts = await _dictService.GetListAsync(); @@ -817,11 +885,13 @@ public class SysUserService : DbRepository, ISysUserService //校验职位 if (!string.IsNullOrEmpty(item.PositionName)) { - if (string.IsNullOrEmpty(item.OrgName)) item.ErrorInfo.Add(nameof(item.PositionName), $"请填写部门"); + if (string.IsNullOrEmpty(item.OrgName)) + item.ErrorInfo.Add(nameof(item.PositionName), $"请填写部门"); else { //根据部门ID和职位名判断是否有职位 - var position = sysPositions.FirstOrDefault(u => u.OrgId == item.OrgId && u.Name == item.PositionName); + var position = sysPositions.FirstOrDefault(u => + u.OrgId == item.OrgId && u.Name == item.PositionName); if (position != null) item.PositionId = position.Id; else item.ErrorInfo.Add(nameof(item.PositionName), $"职位{item.PositionName}不存在"); } @@ -832,21 +902,27 @@ public class SysUserService : DbRepository, ISysUserService #region 校验性别等字典 var genders = await _dictService.GetValuesByDictValue(DevDictConst.GENDER, dicts); - if (!genders.Contains(item.Gender)) item.ErrorInfo.Add(nameof(item.Gender), $"性别只能是男和女"); + if (!genders.Contains(item.Gender)) + item.ErrorInfo.Add(nameof(item.Gender), $"性别只能是男和女"); if (!string.IsNullOrEmpty(item.Nation)) { var nations = await _dictService.GetValuesByDictValue(DevDictConst.NATION, dicts); - if (!nations.Contains(item.Nation)) item.ErrorInfo.Add(nameof(item.Nation), $"不存在的民族"); + if (!nations.Contains(item.Nation)) + item.ErrorInfo.Add(nameof(item.Nation), $"不存在的民族"); } if (!string.IsNullOrEmpty(item.IdCardType)) { - var idCarTypes = await _dictService.GetValuesByDictValue(DevDictConst.IDCARD_TYPE, dicts); - if (!idCarTypes.Contains(item.IdCardType)) item.ErrorInfo.Add(nameof(item.IdCardType), $"证件类型错误"); + var idCarTypes = + await _dictService.GetValuesByDictValue(DevDictConst.IDCARD_TYPE, dicts); + if (!idCarTypes.Contains(item.IdCardType)) + item.ErrorInfo.Add(nameof(item.IdCardType), $"证件类型错误"); } if (!string.IsNullOrEmpty(item.CultureLevel)) { - var cultrueLevels = await _dictService.GetValuesByDictValue(DevDictConst.CULTURE_LEVEL, dicts); - if (!cultrueLevels.Contains(item.CultureLevel)) item.ErrorInfo.Add(nameof(item.CultureLevel), $"文化程度有误"); + var cultrueLevels = + await _dictService.GetValuesByDictValue(DevDictConst.CULTURE_LEVEL, dicts); + if (!cultrueLevels.Contains(item.CultureLevel)) + item.ErrorInfo.Add(nameof(item.CultureLevel), $"文化程度有误"); } #endregion 校验性别等字典 @@ -883,7 +959,8 @@ public class SysUserService : DbRepository, ISysUserService private async Task GetDefaultPassWord(bool isSm4 = false) { //获取默认密码 - var defaultPassword = (await _configService.GetByConfigKey(CateGoryConst.Config_PWD_POLICY, DevConfigConst.PWD_DEFAULT_PASSWORD)).ConfigValue; + var defaultPassword = (await _configService.GetByConfigKey(CateGoryConst.Config_PWD_POLICY, + DevConfigConst.PWD_DEFAULT_PASSWORD)).ConfigValue; return isSm4 ? CryptogramUtil.Sm4Encrypt(defaultPassword) : defaultPassword;//判断是否需要加密 } @@ -959,9 +1036,13 @@ public class SysUserService : DbRepository, ISysUserService .LeftJoin((u, o, p) => u.PositionId == p.Id) .WhereIF(input.OrgId > 0, u => orgIds.Contains(u.OrgId))//根据组织 .WhereIF(input.Expression != null, input.Expression?.ToExpression())//动态查询 - .WhereIF(!string.IsNullOrEmpty(input.UserStatus), u => u.UserStatus == input.UserStatus)//根据状态查询 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u => u.Name.Contains(input.SearchKey) || u.Account.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"u.{input.SortField} {input.SortOrder}") + .WhereIF(!string.IsNullOrEmpty(input.UserStatus), + u => u.UserStatus == input.UserStatus)//根据状态查询 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + u => u.Name.Contains(input.SearchKey) + || u.Account.Contains(input.SearchKey))//根据关键字查询 + .OrderByIF(!string.IsNullOrEmpty(input.SortField), + $"u.{input.SortField} {input.SortOrder}") .OrderBy(u => u.Id)//排序 .Select((u, o, p) => new SysUser { @@ -1015,10 +1096,13 @@ public class SysUserService : DbRepository, ISysUserService sysUser.RoleIdList = roleCodeList.Select(it => it.Id).ToList(); sysUser.PermissionCodeList = permissionCodeList; sysUser.DataScopeList = dataScopeList; - var scopeOrgChildList = (await _sysOrgService.GetChildListById(sysUser.OrgId)).Select(it => it.Id).ToList();//获取所属机构的下级机构Id列表 + var scopeOrgChildList = (await _sysOrgService.GetChildListById(sysUser.OrgId)) + .Select(it => it.Id).ToList();//获取所属机构的下级机构Id列表 sysUser.ScopeOrgChildList = scopeOrgChildList; var moduleIds = await _relationService.GetModuleByRoleId(sysUser.RoleIdList);//获取模块列表 - var modules = await _resourceService.GetResourcesByIds(moduleIds, CateGoryConst.Resource_MODULE);//获取模块列表 + var modules = + await _resourceService.GetResourcesByIds(moduleIds, + CateGoryConst.Resource_MODULE);//获取模块列表 sysUser.ModuleList = modules;//模块列表赋值给用户 //插入Redis _simpleCacheService.HashAdd(SystemConst.Cache_SysUser, sysUser.Id.ToString(), sysUser); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs index 7099b1f..ffddfd7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs @@ -8,10 +8,11 @@ public interface IUserCenterService : ITransient #region 查询 /// - /// 获取个人菜单 + /// 获取登录用户菜单 /// + /// /// - Task> GetOwnMenu(); + Task> GetLoginMenu(BaseIdInput input); /// /// 获取个人工作台 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs index 47a2d65..6b1734d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs @@ -33,7 +33,7 @@ public class UserCenterService : DbRepository, IUserCenterService #region 查询 /// - public async Task> GetOwnMenu() + public async Task> GetLoginMenu(BaseIdInput input) { var result = new List(); //获取用户信息 @@ -41,19 +41,21 @@ public class UserCenterService : DbRepository, IUserCenterService if (userInfo != null) { //获取用户所拥有的资源集合 - var resourceList = await _relationService.GetRelationListByObjectIdAndCategory(userInfo.Id, CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); + var resourceList = + await _relationService.GetRelationListByObjectIdAndCategory(userInfo.Id, + CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); if (resourceList.Count == 0)//如果没有就获取角色的 //获取角色所拥有的资源集合 - resourceList = await _relationService.GetRelationListByObjectIdListAndCategory(userInfo.RoleIdList, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); + resourceList = + await _relationService.GetRelationListByObjectIdListAndCategory( + userInfo.RoleIdList, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); //定义菜单ID列表 var menuIdList = new HashSet(); - - //获取菜单集合 + //获取菜单Id集合 menuIdList.AddRange(resourceList.Select(r => r.TargetId.ToLong()).ToList()); - //获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 - var allModuleAndMenuAndSpaList = await _resourceService.GetaModuleAndMenuAndSpaList(); - var allModuleList = new List();//模块列表 + var allModuleAndMenuAndSpaList = + await _resourceService.GetMenuAndSpaListByModuleId(input.Id); var allMenuList = new List();//菜单列表 var allSpaList = new List();//单页列表 //遍历菜单集合 @@ -61,11 +63,6 @@ public class UserCenterService : DbRepository, IUserCenterService { switch (it.Category) { - case CateGoryConst.Resource_MODULE://模块 - it.Name = it.Title;//设置Name等于title - allModuleList.Add(it);//添加到模块列表 - break; - case CateGoryConst.Resource_MENU://菜单 allMenuList.Add(it);//添加到菜单列表 break; @@ -80,24 +77,14 @@ public class UserCenterService : DbRepository, IUserCenterService // 对获取到的角色对应的菜单列表进行处理,获取父列表 var parentList = GetMyParentMenus(allMenuList, myMenus); myMenus.AddRange(parentList);//合并列表 - //获取我的模块信息Id列表 - var moduleIds = myMenus.Select(it => it.Module.Value).Distinct().ToList(); - //获取我的模块集合 - var myModules = GetMyModules(allModuleList, moduleIds, allSpaList.Count); - myMenus.AddRange(myModules);//模块添加到菜单列表 // 遍历单页列表 allSpaList.ForEach(it => { - // 将第一个模块作为所有单页面的所属模块,并添加 - var firstModuleId = myModules[0].Id; - it.ParentId = firstModuleId; - it.Module = firstModuleId; + it.ParentId = SimpleAdminConst.Zero; }); - - myMenus.AddRange(allSpaList);//但也添加到菜单 - + myMenus.AddRange(allSpaList);//单页添加到菜单 //构建meta - ConstructMeta(myMenus, allSpaList[0].Id); + ConstructMeta(myMenus); //构建菜单树 result = _menuService.ConstructMenuTrees(myMenus); } @@ -117,7 +104,8 @@ public class UserCenterService : DbRepository, IUserCenterService else { //如果没数据去系统配置里取默认的工作台 - var devConfig = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, DevConfigConst.SYS_DEFAULT_WORKBENCH_DATA); + var devConfig = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, + DevConfigConst.SYS_DEFAULT_WORKBENCH_DATA); if (devConfig != null) { return devConfig.ConfigValue.ToLower();//返回工作台信息 @@ -134,7 +122,8 @@ public class UserCenterService : DbRepository, IUserCenterService { var orgList = await _sysOrgService.GetListAsync();//获取全部机构 var parentOrgs = _sysOrgService.GetOrgParents(orgList, UserManager.OrgId);//获取父节点列表 - var topOrg = parentOrgs.Where(it => it.ParentId == SimpleAdminConst.Zero).FirstOrDefault();//获取顶级节点 + var topOrg = parentOrgs.Where(it => it.ParentId == SimpleAdminConst.Zero) + .FirstOrDefault();//获取顶级节点 if (topOrg != null) { var orgs = await _sysOrgService.GetChildListById(topOrg.Id);//获取下级 @@ -176,7 +165,8 @@ public class UserCenterService : DbRepository, IUserCenterService if (!input.Phone.MatchPhoneNumber())//判断是否是手机号格式 throw Oops.Bah($"手机号码格式错误"); input.Phone = CryptogramUtil.Sm4Encrypt(input.Phone); - var any = await IsAnyAsync(it => it.Phone == input.Phone && it.Id != UserManager.UserId);//判断是否有重复的 + var any = await IsAnyAsync(it => + it.Phone == input.Phone && it.Id != UserManager.UserId);//判断是否有重复的 if (any) throw Oops.Bah($"系统已存在该手机号"); } @@ -225,7 +215,9 @@ public class UserCenterService : DbRepository, IUserCenterService public async Task UpdateWorkbench(UpdateWorkbenchInput input) { //关系表保存个人工作台 - await _relationService.SaveRelation(CateGoryConst.Relation_SYS_USER_WORKBENCH_DATA, UserManager.UserId, null, input.WorkbenchData, true); + await _relationService.SaveRelation(CateGoryConst.Relation_SYS_USER_WORKBENCH_DATA, + UserManager.UserId, null, input.WorkbenchData, + true); } /// @@ -242,12 +234,19 @@ public class UserCenterService : DbRepository, IUserCenterService var password = CryptogramUtil.Sm2Decrypt(input.Password);//SM2解密 if (userInfo.Password != password) throw Oops.Bah("原密码错误"); var newPassword = CryptogramUtil.Sm2Decrypt(input.NewPassword);//sm2解密 - var loginPolicy = await _configService.GetListByCategory(CateGoryConst.Config_PWD_POLICY);//获取密码策略 - var containNumber = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_NUM).ConfigValue.ToBoolean();//是否包含数字 - var containLower = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_LOWER).ConfigValue.ToBoolean();//是否包含小写 - var containUpper = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_UPPER).ConfigValue.ToBoolean();//是否包含大写 - var containChar = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_CHARACTER).ConfigValue.ToBoolean();//是否包含特殊字符 - var minLength = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_MIN_LENGTH).ConfigValue.ToInt();//最小长度 + var loginPolicy = + await _configService.GetListByCategory(CateGoryConst.Config_PWD_POLICY);//获取密码策略 + var containNumber = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_NUM) + .ConfigValue.ToBoolean();//是否包含数字 + var containLower = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_LOWER) + .ConfigValue.ToBoolean();//是否包含小写 + var containUpper = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_UPPER) + .ConfigValue.ToBoolean();//是否包含大写 + var containChar = loginPolicy + .First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_CHARACTER).ConfigValue + .ToBoolean();//是否包含特殊字符 + var minLength = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_MIN_LENGTH) + .ConfigValue.ToInt();//最小长度 if (minLength > newPassword.Length) throw Oops.Bah($"密码长度不能小于{minLength}"); if (containNumber && !Regex.IsMatch(newPassword, "[0-9]")) @@ -263,7 +262,8 @@ public class UserCenterService : DbRepository, IUserCenterService // throw Oops.Bah($"新密码请勿与旧密码过于相似"); newPassword = CryptogramUtil.Sm4Encrypt(newPassword);//SM4加密 userInfo.Password = newPassword; - await Context.Updateable(userInfo).UpdateColumns(it => new { it.Password }).ExecuteCommandAsync();//修改密码 + await Context.Updateable(userInfo).UpdateColumns(it => new { it.Password }) + .ExecuteCommandAsync();//修改密码 _userService.DeleteUserFromRedis(UserManager.UserId);//redis删除用户数据 } @@ -280,7 +280,8 @@ public class UserCenterService : DbRepository, IUserCenterService var base64String = Convert.ToBase64String(bytes);//转base64 var avatar = base64String.ToImageBase64();//转图片 userInfo.Avatar = avatar; - await Context.Updateable(userInfo).UpdateColumns(it => new { it.Avatar }).ExecuteCommandAsync();//修改密码 + await Context.Updateable(userInfo).UpdateColumns(it => new { it.Avatar }) + .ExecuteCommandAsync();//修改密码 _userService.DeleteUserFromRedis(UserManager.UserId);//redis删除用户数据 return avatar; } @@ -295,7 +296,8 @@ public class UserCenterService : DbRepository, IUserCenterService userInfo.DefaultModule = input.Id; else userInfo.DefaultModule = null; - await Context.Updateable(userInfo).UpdateColumns(it => new { it.DefaultModule }).ExecuteCommandAsync();//修改默认模块 + await Context.Updateable(userInfo).UpdateColumns(it => new { it.DefaultModule }) + .ExecuteCommandAsync();//修改默认模块 _userService.DeleteUserFromRedis(UserManager.UserId);//redis删除用户数据 } @@ -309,14 +311,16 @@ public class UserCenterService : DbRepository, IUserCenterService /// 所有菜单列表 /// 我的菜单列表 /// - private List GetMyParentMenus(List allMenuList, List myMenus) + private List GetMyParentMenus(List allMenuList, + List myMenus) { var parentList = new List(); myMenus.ForEach(it => { //找到父ID对应的菜单 var parent = allMenuList.Where(r => r.Id == it.ParentId.Value).FirstOrDefault(); - if (parent != null && !parentList.Contains(parent) && !myMenus.Contains(parent))//如果不为空且两个列表里没有 + if (parent != null && !parentList.Contains(parent) + && !myMenus.Contains(parent))//如果不为空且两个列表里没有 { parentList.Add(parent);//添加到父列表 } @@ -331,7 +335,8 @@ public class UserCenterService : DbRepository, IUserCenterService /// /// /// - private List GetMyModules(List allModuleList, List moduleIds, int spaCount) + private List GetMyModules(List allModuleList, List moduleIds, + int spaCount) { //获取我的模块信息 var myModules = allModuleList.Where(it => moduleIds.Contains(it.Id)).ToList(); @@ -369,43 +374,25 @@ public class UserCenterService : DbRepository, IUserCenterService /// 构建Meta /// /// 我的菜单集合 - /// 第一个单页面ID - private void ConstructMeta(List myMenus, long firstSpaId) + private void ConstructMeta(List myMenus) { myMenus.ForEach(it => { - // 将模块的父id设置为0,设置随机path - if (it.Category == CateGoryConst.Resource_MODULE) - { - it.ParentId = 0; - it.Path = "/" + RandomHelper.CreateRandomString(10); - } - // 将根菜单的父id设置为模块的id - if (it.Category == CateGoryConst.Resource_MENU) - { - if (it.ParentId == SimpleAdminConst.Zero) - { - it.ParentId = it.Module; - } - } //定义meta - var meta = new Meta { Icon = it.Icon, Title = it.Title, Type = it.Category.ToLower() }; - // 如果是菜单,则设置type菜单类型为小写 - if (it.Category == CateGoryConst.Resource_MENU) + var meta = new Meta { - if (it.MenuType != ResourceConst.CATALOG)//菜单类型不是目录 - { - meta.Type = it.MenuType.ToLower(); - } - } + Icon = it.Icon, Title = it.Title, IsAffix = it.IsAffix, IsHide = it.IsHide, + IsKeepAlive = it.IsKeepAlive, IsFull = it.IsFull, + ActiveMenu = it.ActiveMenu, + IsLink = it.Category == ResourceConst.LINK ? it.Path : "" + }; // 如果是单页面 if (it.Category == CateGoryConst.Resource_SPA) { - meta.Type = ResourceConst.MENU.ToLower();//类型等于菜单 - if (it.Id == firstSpaId) + if (it.IsHome) { - // 如果是首页(第一个单页面)则设置affix - meta.Affix = true; + // 如果是首页则设置affix + meta.IsAffix = true; } else { @@ -424,7 +411,8 @@ public class UserCenterService : DbRepository, IUserCenterService /// 父ID /// 用户ID /// - public List ConstrucOrgTrees(List orgList, long parentId, long orgId) + public List ConstrucOrgTrees(List orgList, long parentId, + long orgId) { //找下级字典ID列表 var orgs = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index 6f737d7..9cd69f4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -881,6 +881,11 @@ 菜单是否固定在标签页中 (首页通常是固定项) + + + 是否为首页 + + 排序码 @@ -911,16 +916,6 @@ 标题 - - - 类型 - - - - - 是否首页 - - 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) @@ -931,6 +926,11 @@ 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + + 路由外链时填写的访问地址 + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) @@ -4599,6 +4599,13 @@ 所有的菜单和模块以及单页面列表 + + + 根据模块ID获取菜单和单页面列表 + + + + 根据资源ID获取所有下级资源 @@ -4678,6 +4685,9 @@ + + + @@ -5252,10 +5262,11 @@ 个人信息中心服务 - + - 获取个人菜单 + 获取登录用户菜单 + @@ -5342,7 +5353,7 @@ - + @@ -5398,12 +5409,11 @@ - + 构建Meta 我的菜单集合 - 第一个单页面ID diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs index ec6a231..077d525 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs @@ -13,7 +13,8 @@ public class UserCenterController : IDynamicApiController private readonly ISysPositionService _sysPositionService; private readonly ISysOrgService _sysOrgService; - public UserCenterController(IUserCenterService userCenterService, ISysUserService sysUserService, ISysPositionService sysPositionService, + public UserCenterController(IUserCenterService userCenterService, + ISysUserService sysUserService, ISysPositionService sysPositionService, ISysOrgService sysOrgService, IRoleService roleService) { _userCenterService = userCenterService; @@ -28,9 +29,9 @@ public class UserCenterController : IDynamicApiController /// /// [HttpGet("loginMenu")] - public async Task LoginMenu() + public async Task LoginMenu([FromQuery] BaseIdInput input) { - return await _userCenterService.GetOwnMenu(); + return await _userCenterService.GetLoginMenu(input); } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index 9495c2a..6874c3b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -1154,7 +1154,7 @@ 用户个人信息控制器 - + 获取个人菜单 -- Gitee From 8befdfaed8dc1e6ffdaa40b0d5f9dde06af0c657 Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Thu, 24 Aug 2023 16:05:34 +0800 Subject: [PATCH 03/70] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=96=B0ui=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E6=8E=89=E6=97=A0=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/GenTest/GenTestService.cs | 4 +- .../Services/GenTest/IGenTestService.cs | 28 +- .../Services/Org/IOrgService.cs | 2 +- .../Services/Org/OrgService.cs | 16 +- .../Services/Position/IPositionService.cs | 2 +- .../Services/Position/PositionService.cs | 13 +- .../Services/User/IUserService.cs | 5 +- .../Services/User/UserService.cs | 7 +- .../SimpleAdmin.Application.xml | 16 +- .../ValidationAttribute/IdNotNull.cs | 13 + .../SimpleAdmin.Core/BaseInput/BaseIdInput.cs | 9 + .../SimpleAdmin.Core/SimpleAdmin.Core.xml | 10 + .../Backend/Controllers/Controller.cs.vm | 299 -- .../CodeGen/Backend/Services/Dto/Input.cs.vm | 170 - .../CodeGen/Backend/Services/Dto/Output.cs.vm | 44 - .../CodeGen/Backend/Services/IService.cs.vm | 164 - .../CodeGen/Backend/Services/Service.cs.vm | 451 -- .../CodeGen/Frontend/api/Api.js.vm | 121 - .../CodeGen/Frontend/views/form.vue.vm | 288 -- .../CodeGen/Frontend/views/index.vue.vm | 600 --- .../CodeGen/Sql/MySql.sql.vm | 19 - .../CodeGen/Sql/Oracle.sql.vm | 19 - .../CodeGen/Sql/SqlServer.sql.vm | 19 - .../CodeGen/Sql/Sqlite.sql.vm | 19 - .../SimpleAdmin.Plugin.Gen/Const/GenConst.cs | 46 - .../Controllers/GenBasicController.cs | 120 - .../Controllers/GenConfigController.cs | 41 - .../SimpleAdmin.Plugin.Gen/Entity/GenBasic.cs | 190 - .../Entity/GenConfig.cs | 154 - .../Gen.Development.json | 7 - .../Gen.Production.json | 7 - .../SimpleAdmin.Plugin.Gen/GlobalUsing.cs | 20 - .../Options/GenSettingsOptions.cs | 10 - .../SeedData/GenBaseSeedData.cs | 12 - .../SeedData/GenConfigSeedData.cs | 12 - .../SeedData/Json/seed_gen_basic.json | 204 - .../SeedData/Json/seed_gen_config.json | 3898 ----------------- .../Services/Basic/Dto/GenBasicInput.cs | 180 - .../Services/Basic/Dto/GenBasicOutput.cs | 67 - .../Services/Basic/Dto/GenViewModel.cs | 251 -- .../Services/Basic/GenBasicService.cs | 658 --- .../Services/Basic/IGenbasicService.cs | 69 - .../Services/Config/Dto/GenConfigInput.cs | 5 - .../Services/Config/GenConfigService.cs | 28 - .../Services/Config/IGenConfigService.cs | 21 - .../SimpleAdmin.Plugin.Gen.csproj | 111 - .../SimpleAdmin.Plugin.Gen.xml | 1006 ----- .../SimpleAdmin.Plugin.Gen/Startup.cs | 31 - .../Const/ResourceConst.cs | 6 + .../SimpleAdmin.SqlSugar.xml | 5 + .../Services/BatchEdit/BatchEditService.cs | 4 +- .../Services/BatchEdit/IBatchEditService.cs | 5 +- .../Services/Dev/File/FileService.cs | 4 +- .../Services/Dev/File/IFileService.cs | 2 +- .../Services/Dev/Message/IMessageService.cs | 2 +- .../Services/Dev/Message/MessageService.cs | 4 +- .../Services/Index/IIndexService.cs | 2 +- .../Services/Index/IndexService.cs | 16 +- .../Services/System/Org/ISysOrgService.cs | 2 +- .../Services/System/Org/SysOrgService.cs | 4 +- .../System/Position/ISysPositionService.cs | 2 +- .../System/Position/SysPositionService.cs | 4 +- .../System/Resource/Button/ButtonService.cs | 4 +- .../System/Resource/Button/IButtonService.cs | 2 +- .../System/Resource/Menu/IMenuService.cs | 2 +- .../System/Resource/Menu/MenuService.cs | 46 +- .../System/Resource/Module/IModuleService.cs | 2 +- .../System/Resource/Module/ModuleService.cs | 4 +- .../System/Resource/Spa/ISpaService.cs | 2 +- .../System/Resource/Spa/SpaService.cs | 20 +- .../Services/System/Role/IRoleService.cs | 2 +- .../Services/System/Role/RoleService.cs | 4 +- .../Services/System/User/ISysUserService.cs | 8 +- .../Services/System/User/SysUserService.cs | 4 +- .../System/UserCenter/UserCenterService.cs | 55 - .../SimpleAdmin.System/SimpleAdmin.System.xml | 57 +- .../Application/BizOrgController.cs | 2 +- .../Application/BizPositionController.cs | 2 +- .../Application/BizUserController.cs | 8 +- .../Application/GenTestController.cs | 37 +- .../System/BatchEdit/BatchEditController.cs | 2 +- .../Controllers/System/Dev/FileController.cs | 2 +- .../System/Dev/MessageController.cs | 2 +- .../System/Index/IndexController.cs | 18 +- .../System/System/ButtonController.cs | 2 +- .../System/System/MenuController.cs | 11 +- .../System/System/ModuleController.cs | 3 +- .../System/System/OrgController.cs | 8 +- .../System/System/PositionController.cs | 5 +- .../System/System/RoleController.cs | 5 +- .../System/System/SpaController.cs | 3 +- .../System/System/UserController.cs | 8 +- .../SimpleAdmin.Web.Core.csproj | 1 - .../SimpleAdmin.Web.Core.xml | 32 +- api/SimpleAdmin/SimpleAdmin.sln | 7 - 95 files changed, 288 insertions(+), 9630 deletions(-) delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Controllers/Controller.cs.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Input.cs.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Output.cs.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/IService.cs.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Service.cs.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/api/Api.js.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/form.vue.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/index.vue.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/MySql.sql.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Oracle.sql.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/SqlServer.sql.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Sqlite.sql.vm delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Const/GenConst.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenBasicController.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenConfigController.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenBasic.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenConfig.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Development.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Production.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/GlobalUsing.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Options/GenSettingsOptions.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenBaseSeedData.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenConfigSeedData.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_basic.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_config.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicInput.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicOutput.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenViewModel.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/IGenbasicService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/Dto/GenConfigInput.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/GenConfigService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/IGenConfigService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.csproj delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.xml delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Startup.cs diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs index 156628c..1b16df3 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs @@ -84,10 +84,10 @@ public class GenTestService : DbRepository, IGenTestService #region 删除 /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs index 7542024..7e846ea 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs @@ -15,14 +15,14 @@ public interface IGenTestService : ITransient /// /// 查询参数 /// 测试分页 - Task> Page(GenTestPageInput input); - + Task> Page(GenTestPageInput input); + /// /// 测试列表查询 /// /// 查询参数 /// 测试列表 - Task> List(GenTestPageInput input); + Task> List(GenTestPageInput input); /// /// 测试详情 @@ -31,9 +31,8 @@ public interface IGenTestService : ITransient /// 详细信息 Task Detail(BaseIdInput input); - #endregion - + #region 新增 /// @@ -44,15 +43,16 @@ public interface IGenTestService : ITransient Task Add(GenTestAddInput input); #endregion - + #region 编辑 + /// /// 修改测试 /// /// 编辑参数 /// Task Edit(GenTestEditInput input); - + #endregion #region 删除 @@ -62,7 +62,7 @@ public interface IGenTestService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); #endregion @@ -73,21 +73,22 @@ public interface IGenTestService : ITransient /// /// 模板 Task Template(); - + /// /// 测试导入预览 /// /// 预览参数 /// 预览结果 Task> Preview(ImportPreviewInput input); - + /// /// 测试导入 /// /// /// - Task> Import(ImportResultInput input); - + Task> + Import(ImportResultInput input); + /// /// 测试导出 /// @@ -96,5 +97,4 @@ public interface IGenTestService : ITransient Task Export(GenTestPageInput input); #endregion -} - +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs index 0c2c409..c3e0e5c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs @@ -24,7 +24,7 @@ public interface IOrgService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑机构 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs index efea75f..c9227b3 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs @@ -7,7 +7,8 @@ public class OrgService : DbRepository, IOrgService private readonly ISysOrgService _sysOrgService; private readonly ISysUserService _sysUserService; - public OrgService(ISimpleCacheService simpleCacheService, ISysOrgService sysOrgService, ISysUserService sysUserService) + public OrgService(ISimpleCacheService simpleCacheService, ISysOrgService sysOrgService, + ISysUserService sysUserService) { _simpleCacheService = simpleCacheService; _sysOrgService = sysOrgService; @@ -56,17 +57,18 @@ public class OrgService : DbRepository, IOrgService var dataScope = await _sysUserService.GetLoginUserApiDataScope(); if (dataScope == null || dataScope.Count > 0)//如果有机构 { - if (dataScope is { Count: > 0 } && (!dataScope.ContainsAll(input.Ids) || !dataScope.Contains(input.TargetId)))//判断目标机构和需要复制的机构是否都在数据范围里面 + if (dataScope is { Count: > 0 } && (!dataScope.ContainsAll(input.Ids) + || !dataScope.Contains(input.TargetId)))//判断目标机构和需要复制的机构是否都在数据范围里面 throw Oops.Bah($"您没有权限复制这些机构"); await _sysOrgService.Copy(input);//复制操作 } } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); if (dataScope is { Count: > 0 })//如果有机构 @@ -77,7 +79,8 @@ public class OrgService : DbRepository, IOrgService else if (dataScope is { Count: 0 })//表示仅自己 { //获取要删除的机构列表 - var orgs = (await _sysOrgService.GetListAsync()).Where(it => ids.Contains(it.Id)).ToList(); + var orgs = (await _sysOrgService.GetListAsync()).Where(it => ids.Contains(it.Id)) + .ToList(); //如果机构列表里有任何不是自己创建的机构 if (orgs.Any(it => it.CreateUserId != UserManager.UserId)) throw Oops.Bah($"只能删除自己创建的机构"); @@ -117,7 +120,8 @@ public class OrgService : DbRepository, IOrgService if (sysOrg.Id > 0) { var org = await _sysOrgService.GetSysOrgById(sysOrg.Id);//获取机构 - if (org.CreateUserId != UserManager.UserId) throw Oops.Bah(errorMessage);//机构的创建人不是自己则报错 + if (org.CreateUserId != UserManager.UserId) + throw Oops.Bah(errorMessage);//机构的创建人不是自己则报错 } else { diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs index 33953f3..b3502a6 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs @@ -17,7 +17,7 @@ public interface IPositionService : ITransient /// /// id列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑岗位 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs index 5eb96b3..79c11e0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs @@ -33,23 +33,25 @@ public class PositionService : DbRepository, IPositionService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); if (dataScope is { Count: > 0 })//如果有机构 { //获取职位下所有机构ID - var orgIds = (await _sysPositionService.GetListAsync()).Where(it => ids.Contains(it.Id)).Select(it => it.OrgId).ToList(); + var orgIds = (await _sysPositionService.GetListAsync()).Where(it => ids.Contains(it.Id)) + .Select(it => it.OrgId).ToList(); if (!dataScope.ContainsAll(orgIds)) throw Oops.Bah($"您没有权限删除这些岗位"); } else if (dataScope is { Count: 0 })//表示仅自己 { //获取要删除的岗位列表 - var positions = (await _sysPositionService.GetListAsync()).Where(it => ids.Contains(it.Id)).ToList(); + var positions = (await _sysPositionService.GetListAsync()) + .Where(it => ids.Contains(it.Id)).ToList(); //如果岗位列表里有任何不是自己创建的岗位 if (positions.Any(it => it.CreateUserId != UserManager.UserId)) throw Oops.Bah($"只能删除自己创建的岗位"); @@ -104,7 +106,8 @@ public class PositionService : DbRepository, IPositionService if (sysPosition.Id > 0) { var position = await _sysPositionService.GetSysPositionById(sysPosition.Id);//获取机构 - if (position.CreateUserId != UserManager.UserId) throw Oops.Bah(errorMessage);//岗位的创建人不是自己则报错 + if (position.CreateUserId != UserManager.UserId) + throw Oops.Bah(errorMessage);//岗位的创建人不是自己则报错 } else { diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs index 8655071..39656bf 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs @@ -101,7 +101,7 @@ public interface IUserService : ITransient /// /// Id列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); #endregion 删除 @@ -132,7 +132,8 @@ public interface IUserService : ITransient /// /// 数据 /// 导入结果 - Task> Import(ImportResultInput input); + Task> + Import(ImportResultInput input); /// /// 批量编辑 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs index a0a5403..fc62736 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs @@ -127,7 +127,8 @@ public class UserService : DbRepository, IUserService { //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - var ids = input.Ids;//获取用户id + var ids = input.Ids; + ;//获取用户id var sysUsers = await GetListAsync(it => ids.Contains(it.Id), it => new SysUser { OrgId = it.OrgId, CreateUserId = it.CreateUserId });//根据用户ID获取机构id、 sysUsers.ForEach(it => @@ -172,10 +173,10 @@ public class UserService : DbRepository, IUserService #region 删除 /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); //获取用户下信息 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.xml b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.xml index d59513f..c39cd39 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.xml +++ b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.xml @@ -214,7 +214,7 @@ - + @@ -285,7 +285,7 @@ 编辑参数 - + 删除测试 @@ -338,7 +338,7 @@ 机构复制参数 - + 删除机构 @@ -391,7 +391,7 @@ - + @@ -416,7 +416,7 @@ 添加参数 - + 删除岗位 @@ -462,7 +462,7 @@ - + @@ -573,7 +573,7 @@ 授权参数 - + 删除用户 @@ -655,7 +655,7 @@ - + diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs index e80692e..47498e4 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs @@ -11,4 +11,17 @@ public class IdNotNull : ValidationAttribute return true; else return false; } +} + +/// +/// 验证Id列表不能为空 +/// +public class IdsNotNull : ValidationAttribute +{ + public override bool IsValid(object value) + { + if (value is List { Count: 0 }) + return false; + return true; + } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs index eeb998b..c9a0e6f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs @@ -13,6 +13,15 @@ public class BaseIdInput public virtual long Id { get; set; } } +public class BaseIdListInput +{ + /// + /// 主键Id列表 + /// + [IdsNotNull(ErrorMessage = "IdList不能为空")] + public List Ids { get; set; } = new List(); +} + /// /// Id列表输入 /// diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml index f28e0f1..cf0a48c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml @@ -54,6 +54,11 @@ 验证Id不能为 空 + + + 验证Id列表不能为空 + + 文件上传输入参数 @@ -74,6 +79,11 @@ 主键Id + + + 主键Id列表 + + Id列表输入 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Controllers/Controller.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Controllers/Controller.cs.vm deleted file mode 100644 index 34f2148..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Controllers/Controller.cs.vm +++ /dev/null @@ -1,299 +0,0 @@ -@{ -var dataPermission=@Model.DataPermission=="Y";//是否启用数据权限 -var isOrgTree=@Model.LeftTree=="org";//是否启用组织树 -var funcList=@Model.FuncList;//获取功能列表 -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var tableFieIds=@Model.TableFields;//获取字段 -} -using Microsoft.AspNetCore.Mvc; -using System.ComponentModel; -using Furion.DynamicApiController; -using @(@Model.ServicePosition); - -namespace @(@Model.ControllerPosition); - -/// -/// @(@Model.FunctionName)控制器 -/// -[ApiDescriptionSettings("@(@Model.ApiGroup)", Tag = "@(@Model.FunctionName)")] -[Route("/@(@Model.RouteName)/@(@Model.BusName)")] -@if(dataPermission) @:[RolePermission] -public class @(@Model.ClassName)Controller: IDynamicApiController -{ - private readonly I@(@Model.ServiceName) _@(@Model.ServiceFirstLower); - @if(isOrgTree){ - @if(dataPermission){ - @:private readonly IOrgService _orgService; - } - else{ - @:private readonly ISysOrgService _sysOrgService; - } - } - public @(@Model.ClassName)Controller(I@(@Model.ServiceName) @(@Model.ServiceFirstLower) - @if(isOrgTree){ - @if(dataPermission){ - @:,IOrgService orgService - } - else{ - @:,ISysOrgService sysOrgService - } - } - ) - { - this._@(@Model.ServiceFirstLower) = @(@Model.ServiceFirstLower); - @if(isOrgTree){ - @if(dataPermission){ - @:_orgService = orgService; - } - else{ - @:_sysOrgService = sysOrgService; - } - } - } - #region Get请求 - - /// - /// @(@Model.DescriptionPage) - /// - /// - /// - [HttpGet("page")] - [DisplayName("@(@Model.DescriptionPage)")] - public async Task Page([FromQuery] @Model.PageInput input) - { - return await _@(@Model.ServiceFirstLower).Page(input); - } - - /// - /// @(@Model.DescriptionList) - /// - /// - /// - [HttpGet("list")] - [DisplayName("@(@Model.DescriptionList)")] - public async Task List([FromQuery] @Model.PageInput input) - { - return await _@(@Model.ServiceFirstLower).List(input); - } - - /// - /// @(@Model.DescriptionDetail) - /// - /// - /// - [HttpGet("detail")] - [DisplayName("@(@Model.DescriptionDetail)")] - public async Task Detail([FromQuery] BaseIdInput input) - { - return await _@(@Model.ServiceFirstLower).Detail(input); - } - - @{Fk();} - - @{Tree();} - - @{OtherGet();} - - #endregion - - - #region Post请求 - - /// - /// @(@Model.DescriptionAdd) - /// - /// - /// - [HttpPost("add")] - [DisplayName("@(@Model.DescriptionAdd)")] - public async Task Add([FromBody] @(@Model.ClassName)AddInput input) - { - await _@(@Model.ServiceFirstLower).Add(input); - } - - /// - /// @(@Model.DescriptionEdit) - /// - /// - /// - [HttpPost("edit")] - [DisplayName("@(@Model.DescriptionEdit)")] - public async Task Edit([FromBody] @(@Model.ClassName)EditInput input) - { - await _@(@Model.ServiceFirstLower).Edit(input); - } - - /// - /// @(@Model.DescriptionDelete) - /// - /// - /// - [HttpPost("delete")] - [DisplayName("@(@Model.DescriptionDelete)")] - public async Task Delete([FromBody] List input) - { - await _@(@Model.ServiceFirstLower).Delete(input); - } - - @{OtherPost();} - #endregion -} - -@{ - -void Fk(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:/// - @:/// @(column.FieldRemark)选择器 - @:/// - @:/// - @:[HttpGet("fk@(column.FkEntityName)Selector")] - @:[DisplayName("@(column.FieldRemark)选择器")] - @:public async Task Fk@(column.FkEntityName)Selector() - @:{ - @:return await _@(@Model.ServiceFirstLower).Fk@(column.FkEntityName)Selector(); - @:} - @: -} -} -} - -void OtherGet(){ -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": - @:/// - @:/// @(@Model.DescriptionPreview) - @:/// - @:/// - @:/// - @:[HttpPost("preview")] - @:[DisableRequestSizeLimit] - @:[SuppressMonitor] - @:[DisplayName("@(@Model.DescriptionPreview)")] - @:public async Task Preview([FromForm] ImportPreviewInput input) - @:{ - @:return await _@(@Model.ServiceFirstLower).Preview(input); - @:} - @: - @:/// - @:/// @(@Model.DescriptionTemplate) - @:/// - @:/// - @:[HttpGet("template")] - @:[SuppressMonitor] - @:public async Task Template() - @:{ - @:return await _@(@Model.ServiceFirstLower).Template(); - @:} - @: -break; -} -} -} - -//左侧树接口 -void Tree(){ -if(isOrgTree){ - @:/// - @:/// 获取组织树选择器 - @:/// - @:/// - @:[HttpGet("orgTreeSelector")] - @:[DisplayName("组织树查询")] - @:public async Task OrgTreeSelector() - @:{ - @if(dataPermission){ - @:return await _orgService.Tree(); - } - else{ - @:return await _sysOrgService.Tree(); - } - @:} -} -else if(isTreeList){ - @:/// - @:/// @(@Model.DescriptionTree) - @:/// - @:/// - @:[HttpGet("tree")] - @:[DisplayName("@(@Model.DescriptionTree)")] - @:public async Task Tree() - @:{ - @:return await _@(@Model.ServiceFirstLower).Tree(); - @:} -} -else if(isTreeTree){ - @:/// - @:/// @(@Model.DescriptionTree) - @:/// - @:/// - @:[HttpGet("tree")] - @:[DisplayName("@(@Model.DescriptionTree)")] - @:public async Task Tree([FromQuery] @Model.TreeInput input) - @:{ - @:return await _@(@Model.ServiceFirstLower).Tree(input); - @:} -} - -} - -void OtherPost(){ -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": - @:/// - @:/// @(@Model.DescriptionImport) - @:/// - @:/// - @:/// - @:[HttpPost("import")] - @:[DisplayName("@(@Model.DescriptionImport)")] - @:public async Task Import([SuppressMonitor][FromBody] ImportResultInput<@(@Model.ClassName)ImportInput> input) - @:{ - @:return await _@(@Model.ServiceFirstLower).Import(input); - @:} - @: -break; -//导出 -case "export": - @:/// - @:/// @(@Model.DescriptionExport) - @:/// - @:/// - @:/// - @:[HttpPost("export")] - @:[DisplayName("@(@Model.DescriptionExport)")] - @:public async Task Export([FromBody] @Model.PageInput input) - @:{ - @:return await _@(@Model.ServiceFirstLower).Export(input); - @:} - @: -break; -//批量编辑 -case "batchEdit": - @:/// - @:/// @(@Model.DescriptionEdits) - @:/// - @:/// - @:/// - @:[HttpPost("edits")] - @:[DisplayName("@(@Model.DescriptionEdits)")] - @:public async Task Edits([FromBody] BatchEditInput input) - @:{ - @:await _@(@Model.ServiceFirstLower).Edits(input); - @:} - @: -break; -} -} -} - - -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Input.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Input.cs.vm deleted file mode 100644 index fc9c3ea..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Input.cs.vm +++ /dev/null @@ -1,170 +0,0 @@ -@{ - var tableFieIds=@Model.TableFields;//获取字段 - var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 - var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -} -using System; -using System.ComponentModel.DataAnnotations; -using Masuit.Tools.Core.Validator; -namespace @(@Model.ServicePosition); - -/// -/// @(@Model.DescriptionPage)参数 -/// -public class @Model.PageInput : BasePageInput -{ - @{PageInput();} - @if(@Model.LeftTree=="org"){ - @:/// - @:/// 组织机构Id - @:/// - @:public long OrgId { get; set; } - } - @if(isTreeList){ - @:/// - @:/// 父Id - @:/// - @:public long @Model.TreePid { get; set; } - } -} - - -/// -/// @(@Model.DescriptionAdd)参数 -/// -public class @Model.AddInput -{ - @{AddInput();} -} - -/// -/// @(@Model.DescriptionEdit)参数 -/// -public class @Model.EditInput : @Model.AddInput -{ - /// - /// Id - /// - [IdNotNull(ErrorMessage = "Id不能为空")] - public long Id { get; set; } -} - -@if(isTreeTree){ -@{TreeTree();} -} - -@{OtherInput();} - -@{ - -void TreeTree(){ -@:/// -@:/// @(@Model.DescriptionTree)参数 -@:/// -@:public class @Model.TreeInput -@:{ - @{PageInput();} -@:} -} - -void OtherInput(){ -var funcList=@Model.FuncList;//获取功能列表 -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": -@:/// -@:/// @(@Model.DescriptionImport) -@:/// -@:public class @(@Model.ClassName)ImportInput : ImportTemplateInput -@:{ - ImportInput(); -@:} -break; -}} - -} - -//生成导入字段 -void ImportInput(){ - foreach (var column in tableFieIds){ - if(column.WhetherImportExport=="Y")//判断是否新增 - { - @:/// - @:/// @column.FieldRemark - @:/// - @:[ImporterHeader(Name = "@column.FieldRemark")] - if(column.WhetherImportExport=="Y")//判断是否必填 - { - @:[Required(ErrorMessage = "@(@column.FieldRemark)不能为空")] - } - if(column.FieldNetType!="string")//如果不是string类型后面要加?号 - { - @:public @(@column.FieldNetType)? @column.FieldName { get; set; } - }else{ - @:public @column.FieldNetType @column.FieldName { get; set; } - } - @: - } - } -} - -//生成分页字段 -void PageInput() -{ - foreach (var column in tableFieIds){ - if(column.QueryWhether=="Y")//判断是否查询 - { - if(column.EffectType=="datepicker"){//如果是时间类型 - @:/// - @:/// @column.FieldRemark - @:/// - @:public @column.FieldNetType? Start@(@column.FieldName) { get; set; } - @: - @:/// - @:/// @column.FieldRemark - @:/// - @:public @column.FieldNetType? End@(@column.FieldName) { get; set; } - @: - } - else{ - @:/// - @:/// @column.FieldRemark - @:/// - if(column.FieldNetType!="string")//如果不是string类型后面要加?号 - { - @:public @(@column.FieldNetType)? @column.FieldName { get; set; } - }else{ - @:public @column.FieldNetType @column.FieldName { get; set; } - } - @: - }}}} -} - -@{ -//生成新增字段 -void AddInput() -{ - foreach (var column in tableFieIds){//遍历字段 - if(column.WhetherAddUpdate=="Y")//判断是否新增 - { - @:/// - @:/// @column.FieldRemark - @:/// - if(column.WhetherRequired=="Y")//判断是否必填 - { - @:[Required(ErrorMessage = "@(@column.FieldName)不能为空")] - } - if(column.FieldNetType!="string")//如果不是string类型后面要加?号 - { - @:public @(@column.FieldNetType)? @column.FieldName { get; set; } - }else{ - @:public @column.FieldNetType @column.FieldName { get; set; } - } - @: - } - } -} -} - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Output.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Output.cs.vm deleted file mode 100644 index c4659ed..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Dto/Output.cs.vm +++ /dev/null @@ -1,44 +0,0 @@ -namespace @(@Model.ServicePosition); - -@{OtherOutput();} - - - -@{ - -void OtherOutput(){ -var funcList=@Model.FuncList;//获取功能列表 -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "export": -@:/// -@:/// @(@Model.DescriptionExport) -@:/// -@:[ExcelExporter(Name = "@(@Model.FunctionName)信息", TableStyle = TableStyles.Light10, AutoFitAllColumn = true)] -@:public class @(@Model.ClassName)ExportOutput -@:{ - ExportOutput(); -@:} -break; -}} - -} - -void ExportOutput(){ - var tableFieIds=@Model.TableFields;//获取字段 - foreach (var column in tableFieIds){ - if(column.WhetherImportExport=="Y")//判断是否新增 - { - @:/// - @:/// @column.FieldRemark - @:/// - @:[ExporterHeader(DisplayName = "@column.FieldRemark")] - @:public string @column.FieldName { get; set; } - @: - } - } -} - -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/IService.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/IService.cs.vm deleted file mode 100644 index 671ff81..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/IService.cs.vm +++ /dev/null @@ -1,164 +0,0 @@ -@{ -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var tableFieIds=@Model.TableFields;//获取字段 -} -using Furion.DependencyInjection; -using SimpleAdmin.Core; - -namespace @(@Model.ServicePosition); - -/// -/// @(@Model.FunctionName)服务 -/// -public interface I@(@Model.ServiceName) : ITransient -{ - #region 查询 - - /// - /// @Model.DescriptionPage - /// - /// 查询参数 - /// @(@Model.FunctionName)分页 - Task> Page(@Model.PageInput input); - - /// - /// @Model.DescriptionList - /// - /// 查询参数 - /// @(@Model.FunctionName)列表 - Task> List(@Model.PageInput input); - - /// - /// @Model.DescriptionDetail - /// - /// Id参数 - /// 详细信息 - Task<@(@Model.EntityName)> Detail(BaseIdInput input); - - @if(isTreeList){ - @:/// - @:/// @Model.DescriptionTree - @:/// - @:/// @(@Model.FunctionName)树 - @:Task> Tree(); - } - @if(isTreeTree){ - @:/// - @:/// @Model.DescriptionTree - @:/// - @:/// @(@Model.FunctionName)树 - @:Task> Tree(@Model.TreeInput input); - } - - @{Fk();} - #endregion - - #region 新增 - - /// - /// @Model.DescriptionAdd - /// - /// 添加参数 - /// - Task Add(@Model.AddInput input); - - #endregion - - #region 编辑 - /// - /// @Model.DescriptionEdit - /// - /// 编辑参数 - /// - Task Edit(@Model.EditInput input); - - @if(@Model.FuncList.Contains("batchEdit")){ - @:/// - @:/// @(@Model.DescriptionEdits) - @:/// - @:/// 批量编辑信息 - @:/// - @:Task Edits(BatchEditInput input); - } - #endregion - - #region 删除 - - /// - /// @Model.DescriptionDelete - /// - /// 删除参数 - /// - Task Delete(List input); - - #endregion - - #region 导入导出 - - @{ImportExport();} - - #endregion -} - -@{ - -void Fk(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:/// - @:/// @(column.FieldRemark)选择器 - @:/// - @:/// - @:Task> Fk@(column.FkEntityName)Selector(); - -} -} -} - -void ImportExport(){ - -var funcList=@Model.FuncList;//获取功能列表 -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": - @:/// - @:/// @(@Model.DescriptionTemplate) - @:/// - @:/// 模板 - @:Task Template(); - @: - @:/// - @:/// @(@Model.DescriptionPreview) - @:/// - @:/// 预览参数 - @:/// 预览结果 - @:Task> Preview(ImportPreviewInput input); - @: - @:/// - @:/// @(@Model.DescriptionImport) - @:/// - @:/// - @:/// - @:Task> Import(ImportResultInput<@(@Model.ClassName)ImportInput> input); - @: -break; -//导出 -case "export": - @:/// - @:/// @(@Model.DescriptionExport) - @:/// - @:/// - @:/// - @:Task Export(@Model.PageInput input); -break; -} -} - -} - - - -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Service.cs.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Service.cs.vm deleted file mode 100644 index 645c7b5..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Backend/Services/Service.cs.vm +++ /dev/null @@ -1,451 +0,0 @@ -@{ -var orgField=@Model.TableFields.Any(it=>it.FieldName=="OrgId")?"OrgId":"CreateOrgId";//机构字段 -var dataPermission=@Model.DataPermission=="Y";//是否有数据权限 -var tableFieIds=@Model.TableFields;//获取字段 -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var isMasterChild = @Model.ModuleType=="masterChild"; //是否是主子表 -} - -using Furion.FriendlyException; -using Mapster; -using SimpleAdmin.Core; -using Microsoft.Extensions.Logging; -using Microsoft.AspNetCore.Mvc; -using SqlSugar; - -namespace @(@Model.ServicePosition); - -/// -/// -/// -public class @(@Model.ServiceName) : DbRepository<@(@Model.EntityName)>, I@(@Model.ServiceName) -{ - private readonly ILogger<@(@Model.ServiceName)> _logger; - private readonly ISysUserService _sysUserService; - @if(@Model.FuncList.Contains("import")||@Model.FuncList.Contains("export")){ - @:private readonly IImportExportService _importExportService; - } - @if(@Model.FuncList.Contains("batchEdit")){ - @:private readonly IBatchEditService _batchEditService; - } - @if(@Model.LeftTree=="org"){ - @:private readonly ISysOrgService _sysOrgService; - } - - public @(@Model.ServiceName)(ILogger<@(@Model.ServiceName)> logger,ISysUserService sysUserService - @if(@Model.FuncList.Contains("import")||@Model.FuncList.Contains("export")){ - @:,IImportExportService importExportService - } - @if(@Model.FuncList.Contains("batchEdit")){ - @:,IBatchEditService updateBatchService - } - @if(@Model.LeftTree=="org"){ - @:,ISysOrgService sysOrgService - } - ) - { - _sysUserService = sysUserService; - _logger = logger; - @if(@Model.FuncList.Contains("import")||@Model.FuncList.Contains("export")){ - @:_importExportService = importExportService; - } - @if(@Model.FuncList.Contains("batchEdit")){ - @: _batchEditService = updateBatchService; - } - @if(@Model.LeftTree=="org"){ - @: _sysOrgService = sysOrgService; - } - - } - - #region 查询 - - /// - public async Task> Page(@Model.PageInput input) - { - var query = await GetQuery(input);//获取查询条件 - var pageInfo = await query.ToPagedListAsync(input.Current, input.Size);//分页 - return pageInfo; - } - - /// - public async Task> List(@Model.PageInput input) - { - var query = await GetQuery(input);//获取查询条件 - var list = await query.ToListAsync(); - return list; - } - - /// - public async Task<@(@Model.EntityName)> Detail(BaseIdInput input) - { - var @Model.ClassNameFirstLower = await GetFirstAsync(it => it.Id == input.Id); - @if(dataPermission){ - @:var errorMessage = $"您没有权限查看该数据"; - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @:if (dataScope!=null&&(!dataScope.Contains(@(@Model.ClassNameFirstLower).@(orgField)) || @(@Model.ClassNameFirstLower).CreateUserId != UserManager.UserId))//判断机构ID是否在数据范围或者创建人是否为当前登录人 - @:throw Oops.Bah(errorMessage); - } - @if(isMasterChild){ - @:var child=await Context.Queryable<@Model.ChildTable>().Where(it => it.@(Model.ChildFk) == @(@Model.ClassNameFirstLower).Id).ToListAsync(); - } - return @Model.ClassNameFirstLower ; - - } - @if(isTreeList){ - @:/// - @:public async Task> Tree() - @:{ - @://第三个参数为0 表示 : parentid为 0 设置成根目录, 正常情况下最顶层的parentid不是0就是null - @:var tree = Context.Queryable<@(@Model.EntityName)>().ToTree(it => it.Children, it => it.ParentId, 0); - @:return tree; - @:} - } - @if(isTreeTree){ - @:/// - @:public async Task> Tree(@Model.TreeInput input) - @:{ - @://第三个参数为0 表示 : parentid为 0 设置成根目录, 正常情况下最顶层的parentid不是0就是null - @:var tree = Context.Queryable<@(@Model.EntityName)>() - @if(isTreeTree){ - @{PageWhereIf();}//查询条件 - } - @:.ToTree(it => it.Children, it => it.ParentId, 0); - @:return tree; - @:} - } - - @{Fk();}//外键查询 - #endregion - - #region 新增 - - /// - public async Task Add(@Model.AddInput input) - { - var @Model.ClassNameFirstLower = input.Adapt<@(@Model.EntityName)>();//实体转换 - await CheckInput(@Model.ClassNameFirstLower);//检查参数 - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @://判断机构ID是否在数据范围,这里只是简单示例,根据实际情况判断 - @://if (dataScope!=null&&(!dataScope.Contains(@(@Model.ClassNameFirstLower).OrgId))) - @://throw Oops.Bah("您没有权限添加该数据"); - } - await InsertAsync(@Model.ClassNameFirstLower);//插入数据 - } - - #endregion - - #region 编辑 - - /// - public async Task Edit(@Model.EditInput input) - { - var @Model.ClassNameFirstLower = input.Adapt<@(@Model.EntityName)>();//实体转换 - await CheckInput(@Model.ClassNameFirstLower);//检查参数 - @if(dataPermission){ - @://判断机构ID是否在数据范围并且创建者是自己,这里只是简单示例,根据实际情况判断 - @://if (dataScope!=null&&(!dataScope.Contains(@(@Model.ClassNameFirstLower).@(orgField)) || @(@Model.ClassNameFirstLower).CreateUserId != UserManager.UserId)) - @://throw Oops.Bah("您没有权限编辑该数据"); - } - await UpdateAsync(@Model.ClassNameFirstLower);//更新数据 - } - - @if(@Model.FuncList.Contains("batchEdit")){ - @:/// - @:public async Task Edits(BatchEditInput input) - @:{ - Edits(); - @:} - } - - #endregion - - #region 删除 - - /// - public async Task Delete(List input) - { - //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - if (ids.Count > 0) - { - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @:var @(@Model.ClassNameFirstLower)s = await GetListAsync(it => ids.Contains(it.Id), it =>new @(@Model.EntityName){ @(orgField)=it.@(orgField),CreateUserId=it.CreateUserId });//根据ID获取机构ID和创建者ID - @:@(@Model.ClassNameFirstLower)s.ForEach(it => - @:{ - @: if (dataScope!=null&&!dataScope.Contains(it.@(orgField))&&it.CreateUserId != UserManager.UserId) throw Oops.Bah(ErrorCodeEnum.A0004);//如果不包含机构id并且不是自己创建的 - @:}); - } - @if(isMasterChild){ - @://如果@(Model.FunctionName)下有下级数据则不允许删除 - @:if (await Context.Queryable<@(@Model.ChildTable)>().AnyAsync(it => ids.Contains(it.@(Model.ChildFk)))) - @:{ - @:throw Oops.Bah($"有数据依赖@(Model.FunctionName),无法删除"); - @:} - } - await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - ////事务 - //var result = await itenant.UseTranAsync(async () => - //{ - //await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 - @if(isMasterChild){ - @://Context.Deleteable<@(@Model.ChildTable)>().Where(it => ids.Contains(it.@(Model.ChildFk))).ExecuteCommandAsync();//删除子表数据 - } - //}); - //if (!result.IsSuccess)//如果成功了 - //{ - ////写日志 - //_logger.LogError(result.ErrorMessage, result.ErrorException); - //throw Oops.Oh(ErrorCodeEnum.A0002); - //} - } - } - - #endregion - - #region 导入导出 - - @{ImportExport();} - - #endregion - - #region 方法 - - /// - /// 检查输入参数 - /// - /// - private async Task CheckInput(@Model.EntityName @Model.ClassNameFirstLower) - { - @{CheckInput();} - } - - /// - /// 获取Sqlsugar的ISugarQueryable - /// - /// - /// - private async Task> GetQuery(@Model.PageInput input) - { - - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @://动态查询条件,如果是连表查询,里面的it要改成连表里对应的别名 - @:var exp = Expressionable.Create<@(@Model.EntityName)>(); - @:exp.AndIF(dataScope is { Count: > 0 }, it => dataScope.Contains(it.@(orgField)));//用户机构在数据范围内 - @:exp.AndIF(dataScope is { Count: 0 }, it => it.CreateUserId == UserManager.UserId);//默认创建者ID等于自己,根据实际情况修改条件 - } - @if(@Model.LeftTree=="org"){ - @:var orgIds = await _sysOrgService.GetOrgChildIds(input.OrgId);//获取下级机构 - } - var query = Context.Queryable<@(@Model.EntityName)>() - @{PageWhereIf();} - @if(dataPermission){ - @:.Where(exp.ToExpression()) - } - @if(@Model.LeftTree=="org"){ - @:.WhereIF(input.OrgId > 0, it => orgIds.Contains(it.@(orgField)))//根据机构ID查询 - } - @if(isTreeList){ - @:.WhereIF(input.@(@Model.TreePid) > 0, it => it.@(@Model.TreePid) ==input.@(@Model.TreePid))//父级 - } - //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 - .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") - @{PageSortCode();} - return query; - } - - /// - public async Task> CheckImport<@(@Model.ClassName)ImportInput>(List<@(@Model.ClassName)ImportInput> data, bool clearError = false) - { - return data; - } - #endregion - -} - -@{ - -void Fk(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:/// - @:/// @(column.FieldRemark)选择器 - @:/// - @:/// - @:public async Task> Fk@(column.FkEntityName)Selector() - @:{ - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - } - @:return await Context.Queryable<@(column.FkEntityName)>() - @if(dataPermission){ - @://.WhereIf(dataScope!=null,it => it.CreateOrgId == UserManager.OrgId || (dataScope.Contains(it.Id))) - } - @:.Select(it => new BaseSelectorOutput { Value = it.@(column.FkColumnId), Label = it.@(column.FkColumnName) }).ToListAsync(); - @:} - -} -} -} - -//删除 -void Delete(){ - -} - -//批量编辑 -void Edits(){ - @if(dataPermission){ - @://获取数据范围 - @:var dataScope = await _sysUserService.GetLoginUserApiDataScope(); - @:var ids = input.Ids;//获取id列表 - @:var @(@Model.ClassNameFirstLower)s = await GetListAsync(it => ids.Contains(it.Id), it =>new @(@Model.EntityName){ @(orgField)=it.@(orgField),CreateUserId=it.CreateUserId });//根据ID获取机构ID和创建者ID - @:@(@Model.ClassNameFirstLower)s.ForEach(it => - @:{ - @: if (dataScope!=null&&!dataScope.Contains(it.@(orgField))&&it.CreateUserId != UserManager.UserId) throw Oops.Bah(ErrorCodeEnum.A0004);//如果不包含机构id并且不是自己创建的 - @:}); - } - @://获取参数字典 - @:var data = await _batchEditService.GetUpdateBatchConfigDict(input.Code, input.Columns); - @:if (data.Count > 0) - @:{ - @:await Context.Updateable<@(@Model.EntityName)>(data).Where(it => input.Ids.Contains(it.Id)).ExecuteCommandAsync(); - @:} -} - -//检查输入 -void CheckInput(){ - @:var errorMessage = $"您没有权限操作该数据"; - @:if(@(@Model.ClassNameFirstLower).Id==SimpleAdminConst.Zero){ - @://表示新增 - @:} - @:else{ - @://表示编辑 - @:} -} - -//导入导出 -void ImportExport() -{ -if(@Model.FuncList.Contains("import")) -{ - @:/// - @:public async Task Template() - @:{ - @:var templateName = "@(@Model.FunctionName)信息"; - @://var result = _importExportService.GenerateLocalTemplate(templateName); - @:var result = await _importExportService.GenerateTemplate<@(@Model.ClassName)ImportInput>(templateName); - @:return result; - @:} - @: - @:/// - @:public async Task> Preview(ImportPreviewInput input) - @:{ - @:var importPreview = await _importExportService.GetImportPreview<@(@Model.ClassName)ImportInput>(input.File); - @:importPreview.Data = await CheckImport(importPreview.Data);//检查导入数据 - @:return importPreview; - @:} - @: - @:/// - @:public async Task> Import(ImportResultInput<@(@Model.ClassName)ImportInput> input) - @:{ - @:var data = await CheckImport(input.Data, true);//检查数据格式 - @:var result = _importExportService.GetImportResultPreview(data, out var importData); - @:var @Model.ClassNameFirstLower = importData.Adapt>();//转实体 - @:await InsertOrBulkCopy(@Model.ClassNameFirstLower);// 数据导入 - @:return result; - @:} - @: -} -if(@Model.FuncList.Contains("export")) -{ - @:/// - @:public async Task Export(@Model.PageInput input) - @:{ - @:var genTests = await List(input); - @:var data = genTests.Adapt>();//转为Dto - @:var result = await _importExportService.Export(data, "@(@Model.FunctionName)信息"); - @:return result; - @:} -} -} -} - - -@{ -//生成查询条件 -void PageWhereIf() -{ - foreach (var column in tableFieIds){//遍历字段 - if(column.QueryWhether=="Y")//判断是否查询 - { - if(@column.FieldNetType.ToLower() == "string")//判断是否是字符串类型 - { - switch (@column.QueryType)//遍历查询方式 - { - case "eq"://等于 - @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.FieldName), it => it.@(@column.FieldName) == input.@(@column.FieldName)) - break; - case "like"://包含 - @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.FieldName), it => it.@(@column.FieldName).Contains(input.@(@column.FieldName).Trim())) - break; - case "notlike"://不包含 - @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.FieldName), it => !it.@(@column.FieldName).Contains(input.@(@column.FieldName).Trim())) - break; - case "ne"://不等于 - @:.WhereIF(!string.IsNullOrWhiteSpace(input.@column.FieldName), it => it.@(@column.FieldName) != input.@(@column.FieldName)) - break; - } - } - else if(@column.EffectType=="datepicker"){//如果是时间类型则生成时间戳 - @:.WhereIF(input.Start@(@column.FieldName)!=null||input.End@(@column.FieldName)!=null, it=> SqlFunc.Between(it.@column.FieldName, input.Start@(@column.FieldName), input.End@(@column.FieldName))) - } - else{//其他 - switch (@column.QueryType)//遍历查询方式 - { - case "eq"://等于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) == input.@(@column.FieldName)) - break; - case "ne"://不等于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) != input.@(@column.FieldName)) - break; - case "gt"://大于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) > input.@(@column.FieldName)) - break; - case "ge"://大于等于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) >= input.@(@column.FieldName)) - break; - case "lt"://小于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) < input.@(@column.FieldName)) - break; - case "le"://小于等于 - @:.WhereIF(input.@column.FieldName!=null, it => it.@(@column.FieldName) <= input.@(@column.FieldName)) - break; - } - } - } - } -} -} - -@{ -//生成根据SortCode排序 -void PageSortCode() -{ - var hasSortCode= tableFieIds.Any(it => it.FieldName == "SortCode"); - if(hasSortCode){//如果有sortcode字段 - @:.OrderBy(it => it.SortCode);//排序 - }else{ - @:; - } -} -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/api/Api.js.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/api/Api.js.vm deleted file mode 100644 index 39f8237..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/api/Api.js.vm +++ /dev/null @@ -1,121 +0,0 @@ -@{ -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var isMasterChild = @Model.ModuleType=="masterChild";//是否是主子表 -var busName= @Model.BusName;//业务名称 -var tableFieIds=@Model.TableFields;//获取字段 -} -import { baseRequest } from '@@/utils/request' - -const request = (url, ...arg) => baseRequest(`/@(@Model.RouteName)/@(@Model.BusName)/` + url, ...arg) - -/** - * @(@Model.FunctionName)Api接口管理器 - * - * @@author @Model.AuthorName - * @@date @Model.GenTime - **/ - - export default { - // 获取@(@Model.FunctionName)分页 - @(busName)Page(data) { - return request('page', data, 'get') - }, - // 获取@(@Model.FunctionName)列表 - @(busName)List(data) { - return request('list', data, 'get') - }, - // 提交@(@Model.FunctionName)表单 edit为true时为编辑,默认为新增 - submitForm(data, edit = false) { - return request(edit ? 'edit' : 'add', data) - }, - // 获取@(@Model.FunctionName)详情 - @(busName)Detail(data) { - return request('detail', data, 'get') - }, - // 删除@(@Model.FunctionName) - @(busName)Delete(data) { - return request('delete', data) - }, - @if(isTreeList||isTreeTree){ - @:// 获取@(@Model.FunctionName)树 - @:@(busName)Tree(data) { - @:return request('tree', data, 'get') - @:}, - } - @{Func();} - @{LeftTree();} - @{Fk();} -} - -@{ -void Func(){ -var funcList=@Model.FuncList;//获取功能列表 -foreach(var func in funcList){ -switch (func)//根据类型生成不同请求 -{ -//导入 -case "import": - @:// @(@Model.FunctionName)导入模板下载 - @:template(data={}) { - @: return request('template', data, 'get', { - @: responseType: 'blob' - @: }) - @:}, - @:// @(@Model.FunctionName)导入预览 - @:preview(data={}) { - @: return request('preview', data) - @:}, - @:// @(@Model.FunctionName)导入数据 - @:import(data={}) { - @: return request('import', data, 'post', { - @: ignoreError: true - @: }) - @:}, -break; -//导出 -case "export": - @:// 导出@(@Model.FunctionName)数据 - @:@(busName)Export(data) { - @: return request('export', data, 'post', { - @: responseType: 'blob' - @: }) - @:}, -break; -//批量编辑 -case "batchEdit": - @:// @(@Model.FunctionName)批量编辑 - @:edits(data) { - @: return request('edits', data) - @:}, -break; -}} -} -//左侧树 -void LeftTree(){ -var leftTree=@Model.LeftTree;//获取左侧树 -switch (leftTree)//根据类型生成不同控件 -{ -//获取组织选择器 -case "org": - @:// 获取组织选择器 - @:@(leftTree)Tree(data) { - @: return request('@(leftTree)TreeSelector', data, 'get') - @:}, -break; -} -} - -void Fk(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:// @(@Model.FunctionName)@(column.FieldRemark)选择器 - @:@(busName)Fk@(column.FkEntityName)Selector(data) { - @: return request('fk@(column.FkEntityName)Selector', data,'get') - @:}, - -} -} -} - -} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/form.vue.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/form.vue.vm deleted file mode 100644 index 2fb3797..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/form.vue.vm +++ /dev/null @@ -1,288 +0,0 @@ -@{ -var tableFieIds=@Model.TableFields;//获取字段 -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var treeId=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreeId);//获取树的id -var treeName=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreeName);//获取树的名称 -var treePid=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreePid);//获取树的父级id -var funcName=@Model.FunctionName; -} - -@ -@{Script();} - -@{ -//主体 -void Main() -{ - - - @if(@Model.GridWhether=="Y"){//使用栅格 - @: - @if(isTreeList||isTreeTree){ - @{parent();} - } - @foreach (var column in tableFieIds){//遍历字段 - @if(column.WhetherAddUpdate=="Y"){//如果增改 - @: - @: - @:@{FormItem(@column);} - @: - } - } - @: - } - else{ - @if(isTreeList||isTreeTree){ - @{parent();} - } - @foreach (var column in tableFieIds){//遍历字段 - @if(column.WhetherAddUpdate=="Y"){//如果增改 - @: - @:@{FormItem(@column);} - } - } - } - - - -} -//父节点选择 -void parent(){ - - - -} -//表单控件 -void FormItem(dynamic column){ -switch (@column.EffectType)//根据类型生成不同控件 -{ -//输入框 -case "input": - -break; -case "textarea": - -break; -//选择 -case "select": - -break; -case "radio": - -break; -case "checkbox": - -break; -//数字 -case "inputNumber": - -break; -case "slider": - -break; -//时间 -case "datepicker": -@if(@column.FieldNetType=="Date") -{ - @: -}else{ - -} -break; -case "timepicker": - -break; -case "fk": - -break; -default: -break;}} - -void Script(){ - -var primaryKey=tableFieIds.Where(it => it.IsPrimarykey=="Y").First();//主键字段 -var selectColumns=tableFieIds.Where(it => it.EffectType=="select"||it.EffectType=="radio"||it.EffectType=="checkbox").ToList();//选择框字段列表 -var addOrUpdateColumns=tableFieIds.Where(it => it.WhetherAddUpdate=="Y").ToList();//增改字段列表 -var selectCount=selectColumns.Count;//选择框数量 - -} - -//外键选项 -void FkOptions(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:const fk@(column.FkEntityName)Options = ref() //@(column.FieldRemark)数据 - @:const getFk@(column.FkEntityName)Options= () => { - @:@(@Model.ClassNameFirstLower)Api.@(@Model.BusName)Fk@(column.FkEntityName)Selector().then((data) => { - @: fk@(column.FkEntityName)Options.value = data - @:}) - @:} - @: -} -} -} - -//获取外键 -void FkGet(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:getFk@(column.FkEntityName)Options() - @: -} -} -} - -//定义树列表常量 -void TreeListConst(){ -if(isTreeList||isTreeTree){ - @:// 定义机构元素 -@:const treeData = ref([]) -} -} - -//定义树列表方法 -void TreeListMethod() -{ -if(isTreeList||isTreeTree){ - @:// 获取@(funcName)树并加入顶级 - @:@(@Model.ClassNameFirstLower)Api.@(@Model.BusName)Tree().then((res) => { - @:treeData.value = [ - @:{ - @:id: 0, - @:parentId: '-1', - @:name: '顶级', - @:children: res - @:} - @:] - @:}) -} -} - -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/index.vue.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/index.vue.vm deleted file mode 100644 index 7295bad..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Frontend/views/index.vue.vm +++ /dev/null @@ -1,600 +0,0 @@ -@{ -var dataPermission=@Model.DataPermission=="Y";//是否需要数据权限 -var isLeftTree=@Model.LeftTree!="null";//是否有左侧树 -var tableFieIds=@Model.TableFields;//获取字段 -var funcList=@Model.FuncList;//获取功能列表 -var isTreeList = @Model.ModuleType=="treeList";//是否是树表-列表 -var isTreeTree = @Model.ModuleType=="treeTree"; //是否是树-树 -var isMasterChild = @Model.ModuleType=="masterChild";//是否是主子表 -var treeId=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreeId);//获取树的id -var treeName=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreeName);//获取树的名称 -var treePid=@SimpleTool.StringHelper.FirstCharToLower(@Model.TreePid);//获取树的父级id -var busName= @Model.BusName;//获取业务名称 -var funcName= @Model.FunctionName;//获取功能名称 -var showColumns= tableFieIds.Where(it => it.WhetherTable == "Y").ToList();//获取需要显示的字段 -var resizeColumn=showColumns.Any(it => it.WhetherResizable == "Y");//获取需要显示的字段 -} - -@ -@{Script();} -@ -@{Style();} - -@{ -void Template() -{ -//如果左侧树不为空则生成左侧树 -if(isLeftTree||isTreeList){ -LeftTree(); -} -else{ -Main();//否则直接生成主体 -} -} - - -//左侧树 -void LeftTree(){ - - - - - - - - -@{Main();} - - -} - - -//主体 -void Main() -{ -var columnCount = 0;//字段数量 -var searchColumns= tableFieIds.Where(it => it.QueryWhether == "Y").ToList();//获取需要查询的字段 - - - - @foreach (var column in searchColumns)//遍历字段 - { - - - @switch (@column.EffectType)//根据类型生成不同控件 - { - //输入框 - case "input": - case "textarea": - - break; - //选择 - case "select": - case "radio": - case "checkbox": - - break; - //数字 - case "inputNumber": - case "slider": - - break; - //时间 - case "datepicker": - case "timepicker": - @if(@column.FieldNetType.ToLower()=="date") - { - @: - }else{ - @: - } - break; - default: - - break; - } - - - columnCount++; - if(columnCount==3) break;//默认只显示3个字段,其他的折叠 - } - @if(searchColumns.Count>3)//如果字段大于3个则生成折叠面板 - { - - } - - - 查询 - - 重置 - @if(searchColumns.Count>3){//折叠 - - {{ advanced ? '收起' : '展开' }} - - - } - - - - -@{Table();} -} - -//表格部分 -void Table() -{ - - - - - - -
-@if(funcList.Contains("import")){//如果有导入 - -} -@if(funcList.Contains("batchEdit")){//如果有批量编辑 - -} -} - -//Js部分 -void Script() -{ -var searchColumns= tableFieIds.Where(it => it.QueryWhether == "Y").ToList();//获取需要查询的字段 -var searchCount=searchColumns.Count;//查询字段数量 -var isSelect=searchColumns.Any(it => it.EffectType=="select"||it.EffectType=="radio"||it.EffectType=="checkbox");//是否有选择框 - -} - -void FkOptions(){ -foreach (var column in tableFieIds){//遍历字段 -if(column.EffectType=="fk"){//如果是外键 - @:const fk@(column.FkEntityName)Options = ref([]) //@(column.FieldRemark)数据 - @:@(@Model.ClassNameFirstLower)Api.@(busName)Fk@(column.FkEntityName)Selector().then((data) => { - @: fk@(column.FkEntityName)Options.value = data - @:}) - @: -} -} -} - -//表格属性配置 -void TableConst() -{ - - @://表格配置 - @:const table = ref() //表格 - @:let selectedRowKeys = ref([]) //选中项 - @:const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false } //表格工具配置 - @:const columns = [ - @foreach (var column in tableFieIds){//遍历字段 - @if(column.WhetherTable=="Y"){//如果列表显示 - @:{ - @:title: '@column.FieldRemark', - @if(@column.Width!=0){ - @:width: @column.Width, - } - @if(@column.WhetherResizable=="Y"){//如果列可伸缩 - @:resizable: true, - } - @if(column.WhetherRetract=="Y")//如果列省略 - { - @:dataIndex: '@column.FieldNameFirstLower', - @:ellipsis: true - } - else{ - @:dataIndex: '@column.FieldNameFirstLower' - } - @:}, - } - } - @:] - - @:if (hasPerm(['@(@Model.ClassNameFirstLower)Edit', '@(@Model.ClassNameFirstLower)Delete'])) { - @:columns.push({ - @:title: '操作', - @:dataIndex: 'action', - @:align: 'center', - @:fixed: 'right', - @:width: '130px' - @:}) - @:} - @: - @:// 列表选择配置 - @:const options = reactive({ - @:alert: { - @:show: true, //显示选择多少个 - @:clear: () => { - @:selectedRowKeys = ref([]) - @:} - @:}, - @:rowSelection: { - @:onChange: (selectedRowKey, selectedRows) => { - @:selectedRowKeys.value = selectedRowKey - @:} - @:} - @:}) - @: - @if(resizeColumn){//如果可伸缩列 - @:const handleResizeColumn = (w, col) => { - @:col.width = w - @:} - } - -} - -//表单属性配置 -void FormConst(int searchCount){ - if(searchCount>0){ - @:let searchFormState = reactive({}) //查询表单状态 - @:const searchFormRef = ref() //查询表单 - @:// 查询区域显示更多控制 - @:const advanced = ref(false) - @:const toggleAdvanced = () => { - @: advanced.value = !advanced.value - @:} - } - @:const formRef = ref()//新增/编辑表单页 -} - -//删除方法 -void DeleteScript(){ - @:// 删除 - @:const delete@(@Model.ClassName) = (record) => { - @:let params = [ - @:{ - @foreach (var column in tableFieIds){//遍历字段 - @if(column.IsPrimarykey=="Y"){//如果是主键 - @:@column.FieldNameFirstLower: record.@column.FieldNameFirstLower , - }} - @:} - @:] - @:@(@Model.ClassNameFirstLower)Api.@(busName)Delete(params).then(() => { - @:table.value.refresh(true) - @:}) - @:} - @: - @if(funcList.Contains("batchDelete")){//如果有批量删除功能 - @:// 批量删除 - @:const batchDelete@(@Model.ClassName) = (params,callback) => { - @:@(@Model.ClassNameFirstLower)Api.@(busName)Delete(params).then(() => {}) - @:.finally(() => { - @:table.value.clearRefreshSelected() - @:callback() //调用组件中的回调方法 - @:}) - @:} - } -} - -//其他常定义 -void OtherConst(){ - @if(funcList.Contains("import")) @: const importRef = ref() //导入组件 - @if(funcList.Contains("batchEdit")) @: const batchEditRef = ref() //批量更新组件 -} - -//其他方法 -void OtherMethod() -{ -@if(funcList.Contains("import")) { - @:// 打开导入界面 - @:const openImport = (record) => { - @:nextTick(() => { - @:importRef.value.importSteps(record) - @:}) - @:} -} - -@if(funcList.Contains("export")) { - @:// 导出数据 - @:const dataExport@(@Model.ClassNameFirstLower) = (callback) => { - @:@(@Model.ClassNameFirstLower)Api.@(busName)Export(searchFormState) - @:.then((data) => { - @:callback(data) - @:}) - @:.catch(() => { - @:callback(null) - @:}) - @:} -} - -} - -//左侧树属性配置 -void LeftTreeConst() -{ - @://左侧树配置 - @:let defaultExpandedKeys = ref([]) // 默认展开的节点 - @:const treeData = ref([]) // 左侧树数据 - @:// 替换treeNode 中 title,key,children - @if(isTreeList){//如果是树列表就用配置的字段 - @:const treeFieldNames = { children: 'children', title: '@(treeName)', key: '@(@SimpleTool.StringHelper.FirstCharToLower(treeId))' } - } - else{ //如果不是树列表就用默认的字段 - @:const treeFieldNames = { children: 'children', title: 'name', key: 'id' } - } - @:const cardLoading = ref(true) // 左侧树加载状态 -} - -//左侧树方法定义 -void LeftTreeMethod(string leftTree) -{ - @:// 点击树查询 - @:const treeSelect = (selectedKeys) => { - @: if (selectedKeys.length > 0) { - @if(isTreeList){ - @: searchFormState.@(treePid) = selectedKeys.toString() - } - else{ - @: searchFormState.@(leftTree)Id = selectedKeys.toString() - } - @: } else { - @if(isTreeList){ - @: delete searchFormState.@(treePid) - } - else{ - @: delete searchFormState.@(leftTree)Id - } - @: } - @: table.value.refresh(true) - @: } - - @:// 左侧树查询 - @:@(@Model.ClassNameFirstLower)Api.@(leftTree)Tree() - @:.then((res) => { - @:cardLoading.value = false - @:if (res !== null) { - @:treeData.value = res - @:// 默认展开2级 - @:treeData.value.forEach((item) => { - @:// 因为0的顶级 - @:if (item.parentId === 0) { - @:defaultExpandedKeys.value.push(item.id) - @:// 取到下级ID - @:if (item.children) { - @:item.children.forEach((items) => { - @:defaultExpandedKeys.value.push(items.id) - @:}) - @:} - @:} - @:}) - @:} - @:}) - @:.finally(() => { - @:cardLoading.value = false - @:}) -} - - -//Css部分 -void Style() -{ -@: - -} -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/MySql.sql.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/MySql.sql.vm deleted file mode 100644 index ca36b6c..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/MySql.sql.vm +++ /dev/null @@ -1,19 +0,0 @@ -/* - Source Server Type: Mysql - Date: @Model.GenTime -*/ - -/*添加菜单*/ -INSERT INTO `sys_resource` VALUES (@Model.MenuId, 0, '@(@Model.FunctionName)管理', '@Model.BusName', '@Model.MenuCode', 'MENU', @Model.Module, 'MENU', '@Model.MenuPath', '@Model.MenuComponent', '@Model.Icon', NULL, 99, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*添加按钮*/ -INSERT INTO `sys_resource` VALUES (@Model.AddButtonId, @Model.MenuId, '新增@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*批量删除*/ -INSERT INTO `sys_resource` VALUES (@Model.BatchDeleteButtonId, @Model.MenuId, '批量删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*编辑按钮*/ -INSERT INTO `sys_resource` VALUES (@Model.EditButtonId, @Model.MenuId, '编辑@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*删除删除*/ -INSERT INTO `sys_resource` VALUES (@Model.DeleteButtonId, @Model.MenuId, '删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL,4, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Oracle.sql.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Oracle.sql.vm deleted file mode 100644 index 6c008c6..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Oracle.sql.vm +++ /dev/null @@ -1,19 +0,0 @@ -/* - Source Server Type: Oracle - Date: @Model.GenTime -*/ - -/*添加菜单*/ -INSERT INTO "sys_resource" VALUES (@Model.MenuId, 0, '@(@Model.FunctionName)管理', '@Model.BusName', '@Model.MenuCode', 'MENU', @Model.Module, 'MENU', '@Model.MenuPath', '@Model.MenuComponent', '@Model.Icon', NULL, 99, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*添加按钮*/ -INSERT INTO "sys_resource" VALUES (@Model.AddButtonId, @Model.MenuId, '新增@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*批量删除*/ -INSERT INTO "sys_resource" VALUES (@Model.BatchDeleteButtonId, @Model.MenuId, '批量删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*编辑按钮*/ -INSERT INTO "sys_resource" VALUES (@Model.EditButtonId, @Model.MenuId, '编辑@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*删除删除*/ -INSERT INTO "sys_resource" VALUES (@Model.DeleteButtonId, @Model.MenuId, '删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL,4, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/SqlServer.sql.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/SqlServer.sql.vm deleted file mode 100644 index 7c6a89d..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/SqlServer.sql.vm +++ /dev/null @@ -1,19 +0,0 @@ -/* - Source Server Type: SqlServer - Date: @Model.GenTime -*/ - -/*添加菜单*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.MenuId, 0, '@(@Model.FunctionName)管理', '@Model.BusName', '@Model.MenuCode', 'MENU', @Model.Module, 'MENU', '@Model.MenuPath', '@Model.MenuComponent', '@Model.Icon', NULL, 99, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*添加按钮*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.AddButtonId, @Model.MenuId, '新增@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*批量删除*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.BatchDeleteButtonId, @Model.MenuId, '批量删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*编辑按钮*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.EditButtonId, @Model.MenuId, '编辑@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*删除删除*/ -INSERT INTO [dbo].[sys_resource] VALUES (@Model.DeleteButtonId, @Model.MenuId, '删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL,4, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Sqlite.sql.vm b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Sqlite.sql.vm deleted file mode 100644 index ba611a1..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/CodeGen/Sql/Sqlite.sql.vm +++ /dev/null @@ -1,19 +0,0 @@ -/* - Source Server Type: Sqlite - Date: @Model.GenTime -*/ - -/*添加菜单*/ -INSERT INTO "sys_resource" VALUES (@Model.MenuId, 0, '@(@Model.FunctionName)管理', '@Model.BusName', '@Model.MenuCode', 'MENU', @Model.Module, 'MENU', '@Model.MenuPath', '@Model.MenuComponent', '@Model.Icon', NULL, 99, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*添加按钮*/ -INSERT INTO "sys_resource" VALUES (@Model.AddButtonId, @Model.MenuId, '新增@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Add', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*批量删除*/ -INSERT INTO "sys_resource" VALUES (@Model.BatchDeleteButtonId, @Model.MenuId, '批量删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)BatchDelete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 2, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*编辑按钮*/ -INSERT INTO "sys_resource" VALUES (@Model.EditButtonId, @Model.MenuId, '编辑@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Edit', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL, 3, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); - -/*删除删除*/ -INSERT INTO "sys_resource" VALUES (@Model.DeleteButtonId, @Model.MenuId, '删除@(@Model.FunctionName)', NULL, '@(@Model.ClassNameFirstLower)Delete', 'BUTTON', NULL, NULL, NULL, NULL, NULL, NULL,4, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL); diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Const/GenConst.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Const/GenConst.cs deleted file mode 100644 index df883e1..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Const/GenConst.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成器常量 -/// -public class GenConst -{ - #region 是否 - - /// - /// 是 - /// - public const string Yes = "Y"; - - /// - /// 否 - /// - public const string No = "N"; - - #endregion 是否 - - /// - /// 压缩包 - /// - public const string Zip = "ZIP"; - - /// - /// 项目中 - /// - public const string Pro = "PRO"; - - /// - /// 全部 - /// - public const string ExecAll = "ALL"; - - /// - /// 前端 - /// - public const string ExecFrontend = "FRONTEND"; - - /// - /// 后端 - /// - public const string ExecBackend = "BACKEND"; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenBasicController.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenBasicController.cs deleted file mode 100644 index f00e4a4..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenBasicController.cs +++ /dev/null @@ -1,120 +0,0 @@ - -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成基础控制器 -/// -[ApiDescriptionSettings(Tag = "代码生成基础")] -[Route("gen/basic")] -[SuperAdmin] -public class GenBasicController : IDynamicApiController -{ - private readonly IGenbasicService _genbasicService; - - public GenBasicController(IGenbasicService genbasicService) - { - _genbasicService = genbasicService; - } - - /// - /// 代码生成基础分页 - /// - /// - /// - [HttpGet("page")] - public async Task Page([FromQuery] BasePageInput input) - { - return await _genbasicService.Page(input); - } - - /// - /// 获取所有表信息 - /// - /// - [HttpGet("tables")] - public dynamic Tables(bool isAll = false) - { - return _genbasicService.GetTables(isAll); - } - - /// - /// 获取项目所有程序集 - /// - /// - [HttpGet("assemblies")] - public dynamic GetAssemblies() - { - return _genbasicService.GetAssemblies(); - } - - /// - /// 添加代码生成器 - /// - /// - /// - [DisplayName("添加代码生成")] - [HttpPost("add")] - public async Task Add([FromBody] GenBasicAddInput input) - { - return await _genbasicService.Add(input); - } - - /// - /// 编辑代码生成器 - /// - /// - /// - [DisplayName("编辑代码生成基础")] - [HttpPost("edit")] - public async Task Edit([FromBody] GenBasicEditInput input) - { - return await _genbasicService.Edit(input); - } - - /// - /// 删除代码生成配置 - /// - /// - /// - [DisplayName("删除代码生成基础")] - [HttpPost("delete")] - public async Task Delete([FromBody] List input) - { - await _genbasicService.Delete(input); - } - - /// - /// 代码生成预览 - /// - /// - /// - [HttpGet("previewGen")] - public async Task PreviewGen([FromQuery] BaseIdInput input) - { - return await _genbasicService.PreviewGen(input); - } - - /// - /// 执行代码生成(本地)" - /// - /// - /// - [DisplayName("执行代码生成(本地)")] - [HttpPost("execGenPro")] - public async Task ExecGenPro([FromBody] ExecGenInput input) - { - await _genbasicService.ExecGenPro(input); - } - - /// - /// 执行代码生成(压缩包) - /// - /// - /// - [DisplayName("执行代码生成(压缩包)")] - [HttpGet("execGenZip")] - public async Task ExecGenZip([FromQuery] ExecGenInput input) - { - return await _genbasicService.ExecGenZip(input); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenConfigController.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenConfigController.cs deleted file mode 100644 index e20b6b4..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Controllers/GenConfigController.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成配置控制器 -/// -[ApiDescriptionSettings(Tag = "代码生成配置")] -[Route("gen/config")] -[SuperAdmin] -public class GenConfigController : IDynamicApiController -{ - private readonly IGenConfigService _genConfigService; - - public GenConfigController(IGenConfigService genConfigService) - { - _genConfigService = genConfigService; - } - - /// - /// 查询代码生成详细配置列表 - /// - /// - /// - [HttpGet("list")] - [QueryParameters] - public async Task List(string basicId) - { - return await _genConfigService.List(basicId.ToLong()); - } - - /// - /// 编辑代码生成详细 - /// - /// - /// - [DisplayName("编辑代码生成详细")] - [HttpPost("editBatch")] - public async Task EditBatch([FromBody] List input) - { - await _genConfigService.EditBatch(input); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenBasic.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenBasic.cs deleted file mode 100644 index 96cd9d4..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenBasic.cs +++ /dev/null @@ -1,190 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成基础 -/// -[SugarTable("gen_basic", TableDescription = "代码生成基础")] -[Tenant(SqlsugarConst.DB_Default)] -public class GenBasic : BaseEntity -{ - /// - /// 所属库 - /// - [SugarColumn(ColumnName = "ConfigId", ColumnDescription = "库名", Length = 200)] - public virtual string ConfigId { get; set; } - - /// - /// 主表 - /// - [SugarColumn(ColumnName = "DbTable", ColumnDescription = "主表", Length = 200)] - public virtual string DbTable { get; set; } - - - /// - /// 表实体名称 - /// - [SugarColumn(ColumnName = "EntityName", ColumnDescription = "表实体名称", Length = 200)] - public virtual string EntityName { get; set; } - - /// - /// 功能列表 - /// - [SugarColumn(ColumnName = "Functions", ColumnDescription = "功能列表", Length = 200, IsNullable = false)] - public virtual string Functions { get; set; } - - /// - /// 数据权限 - /// - [SugarColumn(ColumnName = "DataPermission", ColumnDescription = "数据权限", Length = 200, IsNullable = false)] - public virtual string DataPermission { get; set; } - - /// - /// 生成模版 - /// - [SugarColumn(ColumnName = "ModuleType", ColumnDescription = "生成模版", Length = 200, IsNullable = false)] - public virtual string ModuleType { get; set; } - - /// - /// 树Id字段 - /// - [SugarColumn(ColumnName = "TreeId", ColumnDescription = "树Id字段", Length = 200, IsNullable = true)] - public virtual string TreeId { get; set; } - - /// - /// 树父Id字段 - /// - [SugarColumn(ColumnName = "TreePid", ColumnDescription = "树父Id字段", Length = 200, IsNullable = true)] - public virtual string TreePid { get; set; } - - /// - /// 树名称字段 - /// - [SugarColumn(ColumnName = "TreeName", ColumnDescription = "树名称字段", Length = 200, IsNullable = true)] - public virtual string TreeName { get; set; } - - /// - /// 关联子表名 - /// - [SugarColumn(ColumnName = "ChildTable", ColumnDescription = "关联子表名", Length = 200, IsNullable = true)] - public virtual string ChildTable { get; set; } - - /// - /// 关联子表外键 - /// - [SugarColumn(ColumnName = "ChildFk", ColumnDescription = "关联子表外键", Length = 200, IsNullable = true)] - public virtual string ChildFk { get; set; } - - /// - /// 移除表前缀 - /// - [SugarColumn(ColumnName = "TablePrefix", ColumnDescription = "移除表前缀", Length = 200)] - public virtual string TablePrefix { get; set; } - - /// - /// 生成方式 - /// - [SugarColumn(ColumnName = "GenerateType", ColumnDescription = "生成方式", Length = 200)] - public virtual string GenerateType { get; set; } - - /// - /// 所属模块 - /// - [SugarColumn(ColumnName = "Module", ColumnDescription = "所属模块")] - public virtual long Module { get; set; } - - /// - /// 上级目录 - /// - [SugarColumn(ColumnName = "MenuPid", ColumnDescription = "上级目录")] - public virtual long MenuPid { get; set; } - - /// - /// 业务名 - /// - [SugarColumn(ColumnName = "RouteName", ColumnDescription = "路由名", Length = 200)] - public virtual string RouteName { get; set; } - - /// - /// 图标 - /// - [SugarColumn(ColumnName = "Icon", ColumnDescription = "图标", Length = 200)] - public virtual string Icon { get; set; } - - /// - /// 功能名 - /// - [SugarColumn(ColumnName = "FunctionName", ColumnDescription = "功能名", Length = 200)] - public virtual string FunctionName { get; set; } - - /// - /// 功能名后缀 - /// - [SugarColumn(ColumnName = "FunctionNameSuffix", ColumnDescription = "功能名后缀", Length = 200, IsNullable = true)] - public virtual string FunctionNameSuffix { get; set; } - - /// - /// 业务名 - /// - [SugarColumn(ColumnName = "BusName", ColumnDescription = "业务名", Length = 200)] - public virtual string BusName { get; set; } - - /// - /// 类名 - /// - [SugarColumn(ColumnName = "ClassName", ColumnDescription = "类名", Length = 200)] - public virtual string ClassName { get; set; } - - /// - /// 表单布局 - /// - [SugarColumn(ColumnName = "FormLayout", ColumnDescription = "表单布局", Length = 200)] - public virtual string FormLayout { get; set; } - - /// - /// 使用栅格 - /// - [SugarColumn(ColumnName = "GridWhether", ColumnDescription = "使用栅格", Length = 200)] - public virtual string GridWhether { get; set; } - - /// - /// 左侧树 - /// - [SugarColumn(ColumnName = "LeftTree", ColumnDescription = "使用左侧树", Length = 200)] - public virtual string LeftTree { get; set; } - - /// - /// 前端项目路径 - /// - [SugarColumn(ColumnName = "FrontedPath", ColumnDescription = "前端项目路径", IsNullable = true, Length = 200)] - public virtual string FrontedPath { get; set; } - - /// - /// 服务代码存放位置 - /// - [SugarColumn(ColumnName = "ServicePosition", ColumnDescription = "服务代码存放位置", IsNullable = true, Length = 200)] - public virtual string ServicePosition { get; set; } - - /// - /// 控制器代码存放位置 - /// - [SugarColumn(ColumnName = "ControllerPosition", ColumnDescription = "控制器代码存放位置", IsNullable = true, Length = 200)] - public virtual string ControllerPosition { get; set; } - - /// - /// 作者 - /// - [SugarColumn(ColumnName = "AuthorName", ColumnDescription = "作者", Length = 200)] - public virtual string AuthorName { get; set; } - - /// - /// 排序 - /// - [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序")] - public virtual int SortCode { get; set; } - - /// - /// 功能列表 - /// - [SugarColumn(IsIgnore = true)] - public virtual List FuncList { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenConfig.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenConfig.cs deleted file mode 100644 index bda8085..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Entity/GenConfig.cs +++ /dev/null @@ -1,154 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成配置 -/// -[SugarTable("gen_config", TableDescription = "代码生成配置")] -[Tenant(SqlsugarConst.DB_Default)] -public class GenConfig : BaseEntity -{ - /// - /// 基础ID - /// - [SugarColumn(ColumnName = "BasicId", ColumnDescription = "基础配置ID")] - public long BasicId { get; set; } - - /// - /// 字段排序 - /// - [SugarColumn(ColumnName = "FieldIndex", ColumnDescription = "字段排序", IsNullable = true)] - public int FieldIndex { get; set; } - - /// - /// 是否主键 - /// - [SugarColumn(ColumnName = "IsPrimarykey", ColumnDescription = "是否主键", Length = 200)] - public string IsPrimarykey { get; set; } - - /// - /// 字段 - /// - [SugarColumn(ColumnName = "FieldName", ColumnDescription = "字段", Length = 200)] - public string FieldName { get; set; } - - /// - /// 名称 - /// - [SugarColumn(ColumnName = "FieldRemark", ColumnDescription = "名称", Length = 200)] - public string FieldRemark { get; set; } - - /// - /// 类型 - /// - [SugarColumn(ColumnName = "FieldType", ColumnDescription = "类型", Length = 200)] - public string FieldType { get; set; } - - /// - /// 实体类型 - /// - [SugarColumn(ColumnName = "FieldNetType", ColumnDescription = "实体类型", Length = 200)] - public string FieldNetType { get; set; } - - /// - /// 作用类型 - /// - [SugarColumn(ColumnName = "EffectType", ColumnDescription = "作用类型", Length = 200)] - public string EffectType { get; set; } - - /// - /// 外键显示字段 - /// - [SugarColumn(ColumnName = "FkEntityName", ColumnDescription = "外键实体名称", Length = 200, IsNullable = true)] - public string FkEntityName { get; set; } - - /// - /// 外键ID - /// - [SugarColumn(ColumnName = "FkColumnId", ColumnDescription = "外键ID", Length = 200, IsNullable = true)] - public string FkColumnId { get; set; } - - /// - /// 外键显示字段 - /// - [SugarColumn(ColumnName = "FkColumnName", ColumnDescription = "外键显示字段", Length = 200, IsNullable = true)] - public string FkColumnName { get; set; } - - /// - /// 字典 - /// - [SugarColumn(ColumnName = "DictTypeCode", ColumnDescription = "字典", Length = 200, IsNullable = true)] - public string DictTypeCode { get; set; } - - /// - /// 列宽度 - /// - [SugarColumn(ColumnName = "Width", ColumnDescription = "列宽度")] - public int Width { get; set; } - - - /// - /// 列表显示 - /// - [SugarColumn(ColumnName = "WhetherTable", ColumnDescription = "列表显示", Length = 200)] - public string WhetherTable { get; set; } - - /// - /// 列省略 - /// - [SugarColumn(ColumnName = "WhetherRetract", ColumnDescription = "列省略", Length = 200)] - public string WhetherRetract { get; set; } - - /// - /// 可伸缩列 - /// - [SugarColumn(ColumnName = "WhetherResizable", ColumnDescription = "可伸缩列", Length = 200)] - public string WhetherResizable { get; set; } - - /// - /// 是否增改 - /// - [SugarColumn(ColumnName = "WhetherAddUpdate", ColumnDescription = "是否增改", Length = 200)] - public string WhetherAddUpdate { get; set; } - - /// - /// 是否导入导出 - /// - [SugarColumn(ColumnName = "WhetherImportExport", ColumnDescription = "是否导入导出", Length = 200)] - public string WhetherImportExport { get; set; } - - /// - /// 必填 - /// - [SugarColumn(ColumnName = "WhetherRequired", ColumnDescription = "必填", Length = 200)] - public string WhetherRequired { get; set; } - - /// - /// 查询 - /// - [SugarColumn(ColumnName = "QueryWhether", ColumnDescription = "查询", Length = 200)] - public string QueryWhether { get; set; } - - /// - /// 查询方式 - /// - [SugarColumn(ColumnName = "QueryType", ColumnDescription = "查询方式", Length = 200, IsNullable = true)] - public string QueryType { get; set; } - - /// - /// 排序 - /// - [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序")] - public int SortCode { get; set; } - - /// - /// 字段名首字母小写 - /// - [SugarColumn(IsIgnore = true)] - public string FieldNameFirstLower { get; set; } - - /// - /// 字段名首字母大写 - /// - [SugarColumn(IsIgnore = true)] - public string FieldNameFirstUpper { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Development.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Development.json deleted file mode 100644 index 55e513f..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Development.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - //代码生成器设置 - "GenSettings": { - "InitTable": true, //是否初始化表结构 - "InitSeedData": true, //是否初始化种子数据 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Production.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Production.json deleted file mode 100644 index d9c5a43..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Gen.Production.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - //代码生成器设置 - "GenSettings": { - "InitTable": false, //是否初始化表结构 - "InitSeedData": false, //是否初始化种子数据 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/GlobalUsing.cs deleted file mode 100644 index 5c8bffd..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/GlobalUsing.cs +++ /dev/null @@ -1,20 +0,0 @@ -global using Furion; -global using Furion.DependencyInjection; -global using Furion.FriendlyException; -global using Furion.ViewEngine; -global using Mapster; -global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore.Hosting; -global using Microsoft.AspNetCore.Mvc; -global using Microsoft.Extensions.DependencyInjection; -global using Microsoft.Extensions.Logging; -global using SimpleAdmin.Core; -global using SimpleAdmin.Core.Utils; -global using SimpleAdmin.System; -global using SimpleTool; -global using System.ComponentModel.DataAnnotations; -global using System.Text; -global using Furion.DynamicApiController; -global using System.ComponentModel; -global using SimpleAdmin.SqlSugar; -global using SqlSugar; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Options/GenSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Options/GenSettingsOptions.cs deleted file mode 100644 index 03cd249..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Options/GenSettingsOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Furion.ConfigurableOptions; - -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成器配置 -/// -public class GenSettingsOptions : BaseOptions, IConfigurableOptions -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenBaseSeedData.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenBaseSeedData.cs deleted file mode 100644 index 71ecd43..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenBaseSeedData.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 系统配置种子数据 -/// -public class GenBaseSeedData : ISqlSugarEntitySeedData -{ - public IEnumerable SeedData() - { - return SeedDataUtil.GetSeedData("seed_gen_basic.json"); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenConfigSeedData.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenConfigSeedData.cs deleted file mode 100644 index 1ddf542..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/GenConfigSeedData.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 系统配置种子数据 -/// -public class GenConfigSeedData : ISqlSugarEntitySeedData -{ - public IEnumerable SeedData() - { - return SeedDataUtil.GetSeedData("seed_gen_config.json"); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_basic.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_basic.json deleted file mode 100644 index 18bad0c..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_basic.json +++ /dev/null @@ -1,204 +0,0 @@ -{ - "RECORDS": [ - { - "Id": "415472469950533", - "ConfigId": "SimpleAdmin", - "DbTable": "sys_org", - "EntityName": "SysOrg", - "TablePrefix": "Y", - "GenerateType": "PRO", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "vertical-right-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Web.Core", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.503", - "UpdateTime": "2023-5-15 19:47:52.84", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "N", - "ModuleType": "treeList", - "TreeId": "Id", - "TreePid": "ParentId", - "TreeName": "Name", - "ChildTable": "", - "ChildFk": "", - "Functions": "curd,batchDelete,import,export,batchEdit", - "LeftTree": "null" - }, - { - "Id": "415806515720261", - "ConfigId": "SimpleAdmin", - "DbTable": "sys_org", - "EntityName": "SysOrg", - "TablePrefix": "Y", - "GenerateType": "PRO", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "vertical-right-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Web.Core", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.647", - "UpdateTime": "2023-5-15 19:41:19.443", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "N", - "ModuleType": "treeTree", - "TreeId": "Id", - "TreePid": "ParentId", - "TreeName": "Name", - "ChildTable": "", - "ChildFk": "", - "Functions": "curd", - "LeftTree": "null" - }, - { - "Id": "415904006602821", - "ConfigId": "SimpleAdmin", - "DbTable": "sys_org", - "EntityName": "SysOrg", - "TablePrefix": "Y", - "GenerateType": "PRO", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "left-square-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Web.Core", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.133", - "UpdateTime": "2023-5-17 08:34:09.823", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "N", - "ModuleType": "masterChild", - "TreeId": "", - "TreePid": "", - "TreeName": "", - "ChildTable": "SysPosition", - "ChildFk": "OrgId", - "Functions": "curd", - "LeftTree": "null" - }, - { - "Id": "417692167622725", - "ConfigId": "SimpleAdmin", - "DbTable": "gen_test", - "EntityName": "GenTest", - "TablePrefix": "Y", - "GenerateType": "ZIP", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "caret-right-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Application", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.883", - "UpdateTime": "2023-5-17 08:36:40.743", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "N", - "ModuleType": "single", - "TreeId": "", - "TreePid": "", - "TreeName": "", - "ChildTable": "", - "ChildFk": "", - "Functions": "curd", - "LeftTree": "null" - }, - { - "Id": "418032046346309", - "ConfigId": "SimpleAdmin", - "DbTable": "sys_user", - "EntityName": "SysUser", - "TablePrefix": "Y", - "GenerateType": "PRO", - "Module": "212755263003743", - "MenuPid": "212755263003744", - "RouteName": "biz", - "Icon": "vertical-right-outlined", - "FunctionName": "测试", - "FunctionNameSuffix": "管理", - "BusName": "test", - "ClassName": "GenTest", - "FormLayout": "vertical", - "GridWhether": "N", - "FrontedPath": "D:\\SimpleAdminWeb\\SimpleAdminWeb", - "ServicePosition": "SimpleAdmin.Application", - "ControllerPosition": "SimpleAdmin.Web.Core", - "AuthorName": "superAdmin", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.083", - "UpdateTime": "2023-5-29 11:10:10.74", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "IsDelete": "0", - "ExtJson": "", - "DataPermission": "Y", - "ModuleType": "single", - "TreeId": "", - "TreePid": "", - "TreeName": "", - "ChildTable": "", - "ChildFk": "", - "Functions": "curd", - "LeftTree": "null" - } - ] -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_config.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_config.json deleted file mode 100644 index 31b9efc..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SeedData/Json/seed_gen_config.json +++ /dev/null @@ -1,3898 +0,0 @@ -{ - "RECORDS": [ - { - "Id": "415472470216773", - "BasicId": "415472469950533", - "FieldIndex": "0", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.57", - "UpdateTime": "2023-5-15 19:45:29.987", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229061", - "BasicId": "415472469950533", - "FieldIndex": "1", - "FieldName": "ParentId", - "FieldRemark": "父id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "1", - "CreateTime": "2023-5-9 10:21:50.57", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229062", - "BasicId": "415472469950533", - "FieldIndex": "2", - "FieldName": "DirectorId", - "FieldRemark": "主管ID", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229063", - "BasicId": "415472469950533", - "FieldIndex": "3", - "FieldName": "Name", - "FieldRemark": "名称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "like", - "SortCode": "3", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415472470229064", - "BasicId": "415472469950533", - "FieldIndex": "4", - "FieldName": "Names", - "FieldRemark": "全称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229065", - "BasicId": "415472469950533", - "FieldIndex": "5", - "FieldName": "Code", - "FieldRemark": "编码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415472470229066", - "BasicId": "415472469950533", - "FieldIndex": "6", - "FieldName": "Category", - "FieldRemark": "分类", - "FieldType": "nvarchar", - "EffectType": "select", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "ORG_CATEGORY", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "eq", - "SortCode": "6", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415472470229067", - "BasicId": "415472469950533", - "FieldIndex": "7", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "slider", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "7", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415472470229068", - "BasicId": "415472469950533", - "FieldIndex": "8", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229069", - "BasicId": "415472469950533", - "FieldIndex": "9", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229070", - "BasicId": "415472469950533", - "FieldIndex": "10", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229071", - "BasicId": "415472469950533", - "FieldIndex": "11", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-9 15:29:22.517", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229072", - "BasicId": "415472469950533", - "FieldIndex": "12", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229073", - "BasicId": "415472469950533", - "FieldIndex": "13", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229074", - "BasicId": "415472469950533", - "FieldIndex": "14", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415472470229075", - "BasicId": "415472469950533", - "FieldIndex": "15", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-9 10:21:50.573", - "UpdateTime": "2023-5-15 19:47:48.923", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515941445", - "BasicId": "415806515720261", - "FieldIndex": "7", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.7", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957829", - "BasicId": "415806515720261", - "FieldIndex": "0", - "FieldName": "ParentId", - "FieldRemark": "父id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "1", - "CreateTime": "2023-5-10 09:01:04.703", - "UpdateTime": "2023-5-15 19:41:21.28", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957830", - "BasicId": "415806515720261", - "FieldIndex": "1", - "FieldName": "DirectorId", - "FieldRemark": "主管ID", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957831", - "BasicId": "415806515720261", - "FieldIndex": "2", - "FieldName": "Name", - "FieldRemark": "名称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "like", - "SortCode": "3", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415806515957832", - "BasicId": "415806515720261", - "FieldIndex": "3", - "FieldName": "Names", - "FieldRemark": "全称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957833", - "BasicId": "415806515720261", - "FieldIndex": "4", - "FieldName": "Code", - "FieldRemark": "编码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415806515957834", - "BasicId": "415806515720261", - "FieldIndex": "5", - "FieldName": "Category", - "FieldRemark": "分类", - "FieldType": "nvarchar", - "EffectType": "select", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "ROLE_CATEGORY", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "eq", - "SortCode": "6", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415806515957835", - "BasicId": "415806515720261", - "FieldIndex": "6", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "slider", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "7", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957836", - "BasicId": "415806515720261", - "FieldIndex": "8", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957837", - "BasicId": "415806515720261", - "FieldIndex": "9", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957838", - "BasicId": "415806515720261", - "FieldIndex": "0", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515957839", - "BasicId": "415806515720261", - "FieldIndex": "0", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-10 09:12:20.477", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515961925", - "BasicId": "415806515720261", - "FieldIndex": "0", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515961926", - "BasicId": "415806515720261", - "FieldIndex": "13", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515961927", - "BasicId": "415806515720261", - "FieldIndex": "14", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415806515961928", - "BasicId": "415806515720261", - "FieldIndex": "15", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 09:01:04.707", - "UpdateTime": "2023-5-15 19:41:21.283", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006709317", - "BasicId": "415904006602821", - "FieldIndex": "7", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.157", - "UpdateTime": "2023-5-15 19:41:24.913", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006717509", - "BasicId": "415904006602821", - "FieldIndex": "0", - "FieldName": "ParentId", - "FieldRemark": "父id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "1", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006717510", - "BasicId": "415904006602821", - "FieldIndex": "1", - "FieldName": "DirectorId", - "FieldRemark": "主管ID", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006717511", - "BasicId": "415904006602821", - "FieldIndex": "2", - "FieldName": "Name", - "FieldRemark": "名称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "like", - "SortCode": "3", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006717512", - "BasicId": "415904006602821", - "FieldIndex": "3", - "FieldName": "Names", - "FieldRemark": "全称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006717513", - "BasicId": "415904006602821", - "FieldIndex": "4", - "FieldName": "Code", - "FieldRemark": "编码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006717514", - "BasicId": "415904006602821", - "FieldIndex": "5", - "FieldName": "Category", - "FieldRemark": "分类", - "FieldType": "nvarchar", - "EffectType": "radio", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "POSITION_CATEGORY", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "eq", - "SortCode": "6", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006717515", - "BasicId": "415904006602821", - "FieldIndex": "6", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "slider", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "7", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.07", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "415904006721605", - "BasicId": "415904006602821", - "FieldIndex": "8", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721606", - "BasicId": "415904006602821", - "FieldIndex": "9", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721607", - "BasicId": "415904006602821", - "FieldIndex": "10", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721608", - "BasicId": "415904006602821", - "FieldIndex": "11", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-10 15:38:18.29", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721609", - "BasicId": "415904006602821", - "FieldIndex": "12", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721610", - "BasicId": "415904006602821", - "FieldIndex": "13", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721611", - "BasicId": "415904006602821", - "FieldIndex": "14", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "415904006721612", - "BasicId": "415904006602821", - "FieldIndex": "15", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-10 15:37:46.16", - "UpdateTime": "2023-5-17 08:34:11.073", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167675973", - "BasicId": "417692167622725", - "FieldIndex": "7", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.893", - "UpdateTime": "2023-5-15 19:41:27.993", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688261", - "BasicId": "417692167622725", - "FieldIndex": "0", - "FieldName": "Name", - "FieldRemark": "姓名", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "1", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688262", - "BasicId": "417692167622725", - "FieldIndex": "1", - "FieldName": "Sex", - "FieldRemark": "性别", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688263", - "BasicId": "417692167622725", - "FieldIndex": "2", - "FieldName": "Nation", - "FieldRemark": "民族", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "3", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688264", - "BasicId": "417692167622725", - "FieldIndex": "3", - "FieldName": "Age", - "FieldRemark": "年龄", - "FieldType": "int", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688265", - "BasicId": "417692167622725", - "FieldIndex": "4", - "FieldName": "Bir", - "FieldRemark": "生日", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688266", - "BasicId": "417692167622725", - "FieldIndex": "5", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "6", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "417692167688267", - "BasicId": "417692167622725", - "FieldIndex": "8", - "FieldName": "CreateOrgId", - "FieldRemark": "创建者部门Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688268", - "BasicId": "417692167622725", - "FieldIndex": "9", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688269", - "BasicId": "417692167622725", - "FieldIndex": "10", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688270", - "BasicId": "417692167622725", - "FieldIndex": "11", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688271", - "BasicId": "417692167622725", - "FieldIndex": "12", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688272", - "BasicId": "417692167622725", - "FieldIndex": "13", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688273", - "BasicId": "417692167622725", - "FieldIndex": "14", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688274", - "BasicId": "417692167622725", - "FieldIndex": "15", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688275", - "BasicId": "417692167622725", - "FieldIndex": "16", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "417692167688276", - "BasicId": "417692167622725", - "FieldIndex": "6", - "FieldName": "Money", - "FieldRemark": "存款", - "FieldType": "decimal", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "16", - "CreateTime": "2023-5-15 16:53:48.897", - "UpdateTime": "2023-5-17 08:36:41.87", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "decimal", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046575685", - "BasicId": "418032046346309", - "FieldIndex": "0", - "FieldName": "Avatar", - "FieldRemark": "头像", - "FieldType": "nvarchar", - "EffectType": "image", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "GENDER", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "Y", - "QueryType": "like", - "SortCode": "1", - "CreateTime": "2023-5-16 15:56:47.14", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046587973", - "BasicId": "418032046346309", - "FieldIndex": "1", - "FieldName": "Signature", - "FieldRemark": "签名", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "2", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046587974", - "BasicId": "418032046346309", - "FieldIndex": "2", - "FieldName": "Account", - "FieldRemark": "账号", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "3", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "Y" - }, - { - "Id": "418032046587975", - "BasicId": "418032046346309", - "FieldIndex": "3", - "FieldName": "Password", - "FieldRemark": "密码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "Y", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "4", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587976", - "BasicId": "418032046346309", - "FieldIndex": "4", - "FieldName": "Name", - "FieldRemark": "姓名", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "5", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587977", - "BasicId": "418032046346309", - "FieldIndex": "5", - "FieldName": "Nickname", - "FieldRemark": "昵称", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "6", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587978", - "BasicId": "418032046346309", - "FieldIndex": "6", - "FieldName": "Gender", - "FieldRemark": "性别", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "7", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587979", - "BasicId": "418032046346309", - "FieldIndex": "7", - "FieldName": "Birthday", - "FieldRemark": "出生日期", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "8", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587980", - "BasicId": "418032046346309", - "FieldIndex": "8", - "FieldName": "Nation", - "FieldRemark": "民族", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "9", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587981", - "BasicId": "418032046346309", - "FieldIndex": "9", - "FieldName": "HomeAddress", - "FieldRemark": "家庭住址", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "10", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587982", - "BasicId": "418032046346309", - "FieldIndex": "10", - "FieldName": "MailingAddress", - "FieldRemark": "通信地址", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "11", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587983", - "BasicId": "418032046346309", - "FieldIndex": "11", - "FieldName": "IdCardType", - "FieldRemark": "证件类型", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "12", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587984", - "BasicId": "418032046346309", - "FieldIndex": "12", - "FieldName": "IdCardNumber", - "FieldRemark": "证件号码", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "13", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587985", - "BasicId": "418032046346309", - "FieldIndex": "13", - "FieldName": "CultureLevel", - "FieldRemark": "文化程度", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "14", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587986", - "BasicId": "418032046346309", - "FieldIndex": "14", - "FieldName": "PoliticalOutlook", - "FieldRemark": "政治面貌", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "15", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587987", - "BasicId": "418032046346309", - "FieldIndex": "15", - "FieldName": "College", - "FieldRemark": "毕业院校", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "16", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587988", - "BasicId": "418032046346309", - "FieldIndex": "16", - "FieldName": "Education", - "FieldRemark": "学历", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "17", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587989", - "BasicId": "418032046346309", - "FieldIndex": "17", - "FieldName": "EduLength", - "FieldRemark": "学制", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "18", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587990", - "BasicId": "418032046346309", - "FieldIndex": "18", - "FieldName": "Degree", - "FieldRemark": "学位", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "19", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587991", - "BasicId": "418032046346309", - "FieldIndex": "19", - "FieldName": "Phone", - "FieldRemark": "手机", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "20", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046587992", - "BasicId": "418032046346309", - "FieldIndex": "20", - "FieldName": "Email", - "FieldRemark": "邮箱", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "21", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592069", - "BasicId": "418032046346309", - "FieldIndex": "21", - "FieldName": "HomeTel", - "FieldRemark": "家庭电话", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "22", - "CreateTime": "2023-5-16 15:56:47.143", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592070", - "BasicId": "418032046346309", - "FieldIndex": "22", - "FieldName": "OfficeTel", - "FieldRemark": "办公电话", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "23", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592071", - "BasicId": "418032046346309", - "FieldIndex": "23", - "FieldName": "EmergencyPhone", - "FieldRemark": "紧急联系人电话", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "24", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592072", - "BasicId": "418032046346309", - "FieldIndex": "24", - "FieldName": "EmergencyAddress", - "FieldRemark": "紧急联系人地址", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "25", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592073", - "BasicId": "418032046346309", - "FieldIndex": "25", - "FieldName": "EmpNo", - "FieldRemark": "员工编号", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "26", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592074", - "BasicId": "418032046346309", - "FieldIndex": "26", - "FieldName": "EntryDate", - "FieldRemark": "入职日期", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "27", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592075", - "BasicId": "418032046346309", - "FieldIndex": "27", - "FieldName": "OrgId", - "FieldRemark": "机构id", - "FieldType": "bigint", - "EffectType": "fk", - "FkEntityName": "SysOrg", - "FkColumnId": "Id", - "FkColumnName": "Name", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "28", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592076", - "BasicId": "418032046346309", - "FieldIndex": "28", - "FieldName": "PositionId", - "FieldRemark": "职位id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "29", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592077", - "BasicId": "418032046346309", - "FieldIndex": "29", - "FieldName": "PositionLevel", - "FieldRemark": "职级", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "30", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592078", - "BasicId": "418032046346309", - "FieldIndex": "30", - "FieldName": "DirectorId", - "FieldRemark": "主管id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "31", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592079", - "BasicId": "418032046346309", - "FieldIndex": "31", - "FieldName": "PositionJson", - "FieldRemark": "兼任信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "32", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.793", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592080", - "BasicId": "418032046346309", - "FieldIndex": "32", - "FieldName": "LastLoginIp", - "FieldRemark": "上次登录ip", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "33", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592081", - "BasicId": "418032046346309", - "FieldIndex": "33", - "FieldName": "LastLoginAddress", - "FieldRemark": "上次登录地点", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "34", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592082", - "BasicId": "418032046346309", - "FieldIndex": "34", - "FieldName": "LastLoginTime", - "FieldRemark": "上次登录时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "35", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592083", - "BasicId": "418032046346309", - "FieldIndex": "35", - "FieldName": "LastLoginDevice", - "FieldRemark": "上次登录设备", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "36", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592084", - "BasicId": "418032046346309", - "FieldIndex": "36", - "FieldName": "LatestLoginIp", - "FieldRemark": "最新登录ip", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "37", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592085", - "BasicId": "418032046346309", - "FieldIndex": "37", - "FieldName": "LatestLoginAddress", - "FieldRemark": "最新登录地点", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "38", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592086", - "BasicId": "418032046346309", - "FieldIndex": "38", - "FieldName": "LatestLoginTime", - "FieldRemark": "最新登录时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "39", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592087", - "BasicId": "418032046346309", - "FieldIndex": "39", - "FieldName": "LatestLoginDevice", - "FieldRemark": "最新登录设备", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "40", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592088", - "BasicId": "418032046346309", - "FieldIndex": "40", - "FieldName": "UserStatus", - "FieldRemark": "用户状态", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "41", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592089", - "BasicId": "418032046346309", - "FieldIndex": "41", - "FieldName": "SortCode", - "FieldRemark": "排序码", - "FieldType": "int", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "42", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "int", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592090", - "BasicId": "418032046346309", - "FieldIndex": "42", - "FieldName": "NativePlace", - "FieldRemark": "籍贯", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "49", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592091", - "BasicId": "418032046346309", - "FieldIndex": "43", - "FieldName": "EmergencyContact", - "FieldRemark": "紧急联系人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "Y", - "WhetherRetract": "N", - "WhetherAddUpdate": "Y", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "50", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "Y", - "WhetherResizable": "N" - }, - { - "Id": "418032046592092", - "BasicId": "418032046346309", - "FieldIndex": "44", - "FieldName": "Id", - "FieldRemark": "Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "Y", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592093", - "BasicId": "418032046346309", - "FieldIndex": "45", - "FieldName": "CreateTime", - "FieldRemark": "创建时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592094", - "BasicId": "418032046346309", - "FieldIndex": "46", - "FieldName": "UpdateTime", - "FieldRemark": "更新时间", - "FieldType": "datetime", - "EffectType": "datepicker", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "DateTime", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592095", - "BasicId": "418032046346309", - "FieldIndex": "47", - "FieldName": "CreateUserId", - "FieldRemark": "创建者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592096", - "BasicId": "418032046346309", - "FieldIndex": "48", - "FieldName": "UpdateUserId", - "FieldRemark": "修改者Id", - "FieldType": "bigint", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "long", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592097", - "BasicId": "418032046346309", - "FieldIndex": "49", - "FieldName": "IsDelete", - "FieldRemark": "软删除", - "FieldType": "bit", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "", - "CreateUserId": "212725263002001", - "UpdateUserId": "", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "bool", - "CreateUser": "superAdmin", - "UpdateUser": "", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592098", - "BasicId": "418032046346309", - "FieldIndex": "50", - "FieldName": "ExtJson", - "FieldRemark": "扩展信息", - "FieldType": "nvarchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592099", - "BasicId": "418032046346309", - "FieldIndex": "51", - "FieldName": "CreateUser", - "FieldRemark": "创建人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - }, - { - "Id": "418032046592100", - "BasicId": "418032046346309", - "FieldIndex": "52", - "FieldName": "UpdateUser", - "FieldRemark": "更新人", - "FieldType": "varchar", - "EffectType": "input", - "FkEntityName": "", - "FkColumnId": "", - "FkColumnName": "", - "DictTypeCode": "", - "Width": "100", - "WhetherTable": "N", - "WhetherRetract": "N", - "WhetherAddUpdate": "N", - "WhetherRequired": "N", - "QueryWhether": "N", - "QueryType": "", - "SortCode": "99", - "CreateTime": "2023-5-16 15:56:47.147", - "UpdateTime": "2023-5-17 16:06:21.797", - "CreateUserId": "212725263002001", - "UpdateUserId": "212725263002001", - "IsDelete": "0", - "ExtJson": "", - "IsPrimarykey": "N", - "FieldNetType": "string", - "CreateUser": "superAdmin", - "UpdateUser": "superAdmin", - "WhetherImportExport": "N", - "WhetherResizable": "N" - } - ] -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicInput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicInput.cs deleted file mode 100644 index 0e8fd60..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicInput.cs +++ /dev/null @@ -1,180 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成基础添加参数 -/// -public class GenBasicAddInput : GenBasic, IValidatableObject -{ - /// - /// 所属库名称 - /// - [Required(ErrorMessage = "ConfigId不能为空")] - public override string ConfigId { get; set; } - - /// - /// 主表名称 - /// - [Required(ErrorMessage = "BbTable不能为空")] - public override string DbTable { get; set; } - - /// - /// 功能列表 - /// - [Required(ErrorMessage = "FuncList不能为空")] - public override List? FuncList { get; set; } - - /// - /// 生成模版 - /// - [Required(ErrorMessage = "ModuleType不能为空")] - public override string ModuleType { get; set; } - - /// - /// 数据权限 - /// - [Required(ErrorMessage = "DataPermission不能为空")] - public override string DataPermission { get; set; } - - /// - /// 实体名称 - /// - [Required(ErrorMessage = "EntityName不能为空")] - public override string EntityName { get; set; } - - /// - /// 表前缀移除 - /// - [Required(ErrorMessage = "TablePrefix不能为空")] - public override string TablePrefix { get; set; } - - /// - /// 生成方式 - /// - [Required(ErrorMessage = "GenerateType不能为空")] - public override string GenerateType { get; set; } - - /// - /// 所属模块 - /// - [IdNotNull(ErrorMessage = "Module不能为空")] - public override long Module { get; set; } - - /// - /// 路由名 - /// - [Required(ErrorMessage = "RouteName不能为空")] - public override string RouteName { get; set; } - - - /// - /// 图标 - /// - [Required(ErrorMessage = "Icon不能为空")] - public override string Icon { get; set; } - - /// - /// 功能名 - /// - [Required(ErrorMessage = "FunctionName不能为空")] - public override string FunctionName { get; set; } - - /// - /// 业务名 - /// - [Required(ErrorMessage = "BusName不能为空")] - public override string BusName { get; set; } - - /// - /// 类名 - /// - [Required(ErrorMessage = "ClassName不能为空")] - public override string ClassName { get; set; } - - /// - /// 表单布局 - /// - [Required(ErrorMessage = "FormLayout不能为空")] - public override string FormLayout { get; set; } - - /// - /// 使用栅格 - /// - [Required(ErrorMessage = "GridWhether不能为空")] - public override string GridWhether { get; set; } - - /// - /// 左侧树 - /// - [Required(ErrorMessage = "LeftTree不能为空")] - public override string LeftTree { get; set; } - - /// - /// 前端路径 - /// - [Required(ErrorMessage = "FrontedPath不能为空")] - public override string FrontedPath { get; set; } - - /// - /// 服务层 - /// - [Required(ErrorMessage = "ServicePosition不能为空")] - public override string ServicePosition { get; set; } - - /// - /// 控制器层 - /// - [Required(ErrorMessage = "ControllerPosition不能为空")] - public override string ControllerPosition { get; set; } - - /// - /// 排序 - /// - [Required(ErrorMessage = "SortCode不能为空")] - public override int SortCode { get; set; } - - /// - /// 作者名 - /// - [Required(ErrorMessage = "AuthorName不能为空")] - public override string AuthorName { get; set; } - - public IEnumerable Validate(ValidationContext validationContext) - { - //如果是树形结构 - if (ModuleType.Contains("tree")) - { - if (string.IsNullOrEmpty(TreeId) || string.IsNullOrEmpty(TreeName) || string.IsNullOrEmpty(TreePid)) - yield return new ValidationResult($"必须配置树表相关信息", new[] { nameof(TreeId), nameof(TreeName), nameof(TreePid) }); - } - //如果是树形结构 - if (ModuleType.Contains("master")) - { - if (string.IsNullOrEmpty(ChildFk) || string.IsNullOrEmpty(ChildTable)) - yield return new ValidationResult($"必须配置主子表相关信息", new[] { nameof(ChildTable), nameof(ChildFk) }); - } - if (!FuncList.Contains("curd")) - { - yield return new ValidationResult($"必须包含基础的增删改查功能", new[] { nameof(FuncList) }); - } - } -} - -/// -/// 代码生成基础编辑参数 -/// -public class GenBasicEditInput : GenBasicAddInput -{ - [IdNotNull(ErrorMessage = "Id不能为空")] - public override long Id { get; set; } -} - -/// -/// 执行代码生成参数 -/// -public class ExecGenInput : BaseIdInput -{ - /// - /// 生成类型 - /// - public string ExecType { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicOutput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicOutput.cs deleted file mode 100644 index 418cd59..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenBasicOutput.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 表字段信息输出 -/// -public class GenBasicColumnOutput -{ - /// - /// 字段名称 - /// - public string ColumnName { get; set; } - - /// - /// 是否主键 - /// - public bool IsPrimarykey { get; set; } - - /// - /// 字段类型 - /// - public string TypeName { get; set; } - - /// - /// 字段注释 - /// - public string ColumnRemark { get; set; } -} - -/// -/// 预览代码生成结果 -/// -public class GenBasePreviewOutput -{ - /// - /// SQL代码结果集 - /// - public List SqlResults { get; set; } = new List(); - - /// - /// 前端代码结果集 - /// - public List CodeFrontendResults { get; set; } = new List(); - - /// - /// 后端代码结果集 - /// - - public List CodeBackendResults { get; set; } = new List(); - - public class GenBaseCodeResult - { - /// - /// 代码文件名称 - /// - public string CodeFileName { get; set; } - - /// - /// 文件路径 - /// - public string FilePath { get; set; } - - /// - /// 代码文件内容 - /// - public string CodeFileContent { get; set; } - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenViewModel.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenViewModel.cs deleted file mode 100644 index c6cbe68..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/Dto/GenViewModel.cs +++ /dev/null @@ -1,251 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成绑定视图 -/// -public class GenViewModel : GenBasic -{ - #region 基础 - - /// - /// 生成时间 - /// - public string GenTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - - /// - /// 表字段 - /// - public List TableFields { get; set; } - - #endregion 基础 - - #region 菜单 - - /// - /// 菜单ID - /// - public long MenuId { get; set; } = CommonUtils.GetSingleId(); - - /// - /// 菜单编码 - /// - public string MenuCode { get; set; } = RandomHelper.CreateRandomString(10); - - /// - /// /菜单路径 - /// - public string MenuPath - { - get { return $"/{RouteName}/{BusName}"; } - } - - /// - /// /菜单路径 - /// - public string MenuComponent - { - get { return $"{RouteName}/{BusName}/index"; } - } - - #endregion 菜单 - - #region 按钮 - - /// - /// 添加按钮ID - /// - public long AddButtonId { get; set; } = CommonUtils.GetSingleId(); - - /// - /// 批量删除按钮ID - /// - public long BatchDeleteButtonId { get; set; } = CommonUtils.GetSingleId(); - - /// - /// 编辑按钮ID - /// - public long EditButtonId { get; set; } = CommonUtils.GetSingleId(); - - /// - /// 删除按钮ID - /// - public long DeleteButtonId { get; set; } = CommonUtils.GetSingleId(); - - #endregion 按钮 - - #region 后端 - - /// - /// 类名首字母小写 - /// - public string ClassNameFirstLower - { - get { return StringHelper.FirstCharToLower(ClassName); } - } - - /// - /// swagger分组名称 - /// - public string ApiGroup - { - get - { - return ServicePosition.Split(".").Last(); - } - } - - /// - /// 服务名 - /// - public string ServiceName - { - get { return ClassName + "Service"; } - } - - /// - /// 服务名开头首字母小写 - /// - public string ServiceFirstLower - { - get { return ClassNameFirstLower + "Service"; } - } - - #endregion 后端 - - #region 注释描述 - - /// - /// 分页查询 - /// - public string DescriptionPage - { - get { return FunctionName + "分页查询"; } - } - - /// - /// 列表查询 - /// - public string DescriptionList - { - get { return FunctionName + "列表查询"; } - } - - /// - /// 添加 - /// - public string DescriptionAdd - { - get { return "添加" + FunctionName; } - } - - /// - /// 修改 - /// - public string DescriptionEdit - { - get { return "修改" + FunctionName; } - } - - /// - /// 修改 - /// - public string DescriptionDelete - { - get { return "删除" + FunctionName; } - } - - /// - /// 详情 - /// - public string DescriptionDetail - { - get { return FunctionName + "详情"; } - } - - - /// - /// 导入 - /// - public string DescriptionImport - { - get { return FunctionName + "导入"; } - } - - /// - /// 导入模板下载 - /// - public string DescriptionTemplate - { - get { return FunctionName + "导入模板下载"; } - } - - /// - /// 导入预览 - /// - public string DescriptionPreview - { - get { return FunctionName + "导入预览"; } - } - - /// - /// 导入 - /// - public string DescriptionExport - { - get { return FunctionName + "导出"; } - } - - /// - /// 批量编辑 - /// - public string DescriptionEdits - { - get { return FunctionName + "批量编辑"; } - } - - /// - /// 树查询 - /// - public string DescriptionTree - { - get { return FunctionName + "树"; } - } - - #endregion 注释描述 - - #region 参数 - - /// - /// 分页参数 - /// - public string PageInput - { - get { return ClassName + "PageInput"; } - } - - /// - /// 添加参数 - /// - public string AddInput - { - get { return ClassName + "AddInput"; } - } - - /// - /// 编辑参数 - /// - public string EditInput - { - get { return ClassName + "EditInput"; } - } - - /// - /// 树查询参数 - /// - public string TreeInput - { - get { return ClassName + "TreeInput"; } - } - - #endregion 参数 -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs deleted file mode 100644 index 7a4c840..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/GenBasicService.cs +++ /dev/null @@ -1,658 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// -/// -public class GenBasicService : DbRepository, IGenbasicService -{ - private readonly ILogger _logger; - private readonly IViewEngine _viewEngine; - private readonly IGenConfigService _genConfigService; - private readonly IMenuService _menuService; - private readonly IButtonService _buttonService; - private readonly IRoleService _roleService; - private readonly string _sqlDir = "Sql"; - private readonly string _backendDir = "Backend"; - private readonly string _frontDir = "Frontend"; - - public GenBasicService(ILogger logger, - IViewEngine viewEngine, - IGenConfigService genConfigService, - IMenuService menuService, - IButtonService buttonService, IRoleService roleService) - { - _logger = logger; - _viewEngine = viewEngine; - _genConfigService = genConfigService; - _menuService = menuService; - _buttonService = buttonService; - _roleService = roleService; - } - - /// - public async Task> Page(BasePageInput input) - { - var query = Context.Queryable() - .OrderByIF(!string.IsNullOrEmpty(input.SortField), - $"{input.SortField} {input.SortOrder}")//排序 - .OrderBy(it => it.SortCode, OrderByType.Desc)//默认排序 - .OrderBy(it => it.CreateTime, OrderByType.Desc)//默认排序 - .Mapper(it => - { - it.FuncList = it.Functions.Split(",", StringSplitOptions.RemoveEmptyEntries) - .ToList();//功能集合转为列表 - }); - var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 - return pageInfo; - } - - /// - public List GetTables(bool isAll = false) - { - if (isAll) - return SqlSugarUtils.GetTablesByAttribute(); - return SqlSugarUtils.GetTablesByAttribute(); - } - - - - /// - public List GetAssemblies() - { - var names = new List();//结果集 - var excludeList = new List - { - "Web.Entry", "Core", "Cache", "SqlSugar", "Plugin.Core", "Plugin.Gen", "Plugin.Mqtt", - "Plugin.SignalR", "Plugin.Aop" - };//排除的程序集 - //获取所有程序集名称 - var assemblies = App.Assemblies - .Where(it => !it.FullName.StartsWith("Furion")) - .Select(it => it.FullName).ToList(); - assemblies.ForEach(it => - { - var name = it.Split(",")[0];//根据逗号分割取第一个 - //根据.分割获取最后两个 - - - var projectName = string.Join(".", name.Split(".").Skip(1).ToList()); - if (!excludeList.Contains(projectName))//去掉排除的程序集 - { - names.Add(name); - } - }); - return names; - } - - - /// - public async Task Add(GenBasicAddInput input) - { - var entity = input.Adapt();//输入参数转实体 - entity.Functions = string.Join(",", input.FuncList);//功能集合 - var tableColumns = SqlSugarUtils.GetTableColumns(input.ConfigId, input.DbTable);//获取表的字段信息 - var genConfigs = new List();//代码生成配置字段集合 - //遍历字段 - var sortCode = 0; - //遍历字段 - tableColumns.ForEach(it => - { - #region 判断是否想显示 - - var yesOrNo = GenConst.Yes; - if (it.IsPrimarykey || SqlSugarUtils.IsCommonColumn(it.ColumnName))//如果是主键或者是公共字段则不显示 - yesOrNo = GenConst.No; - else - yesOrNo = GenConst.Yes; - - #endregion 判断是否想显示 - - //添加到字段集合 - genConfigs.Add(new GenConfig - { - IsPrimarykey = it.IsPrimarykey ? GenConst.Yes : GenConst.No, - FieldName = it.ColumnName, - FieldType = it.DataType, - FieldNetType = SqlSugarUtils.ConvertDataType(it.DataType), - FieldRemark = it.ColumnDescription ?? it.ColumnName, - EffectType = EffTypeConst.INPUT, - Width = 100, - WhetherTable = yesOrNo, - WhetherAddUpdate = yesOrNo, - WhetherImportExport = yesOrNo, - WhetherResizable = GenConst.No, - WhetherRequired = GenConst.No, - WhetherRetract = GenConst.No, - QueryWhether = GenConst.No, - SortCode = yesOrNo == GenConst.No ? 99 : sortCode//如果是公共字段就排最后 - }); - sortCode++; - }); - var index = 0; - genConfigs = genConfigs.OrderBy(it => it.SortCode).ToList();//排序 - genConfigs.ForEach(it => - { - it.FieldIndex = index; - index++; - }); - if (!genConfigs.Any(it => it.IsPrimarykey == GenConst.Yes))//判断是否有主键 - { - throw Oops.Bah("要生成的表必须有主键"); - } - - //事务 - var result = await itenant.UseTranAsync(async () => - { - entity = await InsertReturnEntityAsync(entity);//输入参数转实体并插入 - genConfigs.ForEach(it => { it.BasicId = entity.Id; });//遍历字段赋值基础Id - await Context.Insertable(genConfigs).ExecuteCommandAsync(); - }); - if (!result.IsSuccess)//如果失败了 - { - //写日志 - _logger.LogError(result.ErrorMessage, result.ErrorException); - throw Oops.Oh(ErrorCodeEnum.A0003); - } - - return entity; - } - - /// - public async Task Delete(List input) - { - //获取所有ID - var ids = input.Select(it => it.Id).ToList(); - if (ids.Count > 0) - { - //事务 - var result = await itenant.UseTranAsync(async () => - { - await DeleteByIdsAsync(ids.Cast().ToArray());//删除基础表 - await Context.Deleteable().Where(it => ids.Contains(it.BasicId)) - .ExecuteCommandAsync();//删除配置表 - }); - if (!result.IsSuccess)//如果失败了 - { - //写日志 - _logger.LogError(result.ErrorMessage, result.ErrorException); - throw Oops.Oh(ErrorCodeEnum.A0002); - } - } - } - - /// - public async Task Edit(GenBasicEditInput input) - { - var entity = input.Adapt();//输入参数转实体 - entity.Functions = string.Join(",", input.FuncList);//功能集合 - await UpdateAsync(entity); - return entity; - } - - /// - public async Task PreviewGen(BaseIdInput input) - { - var genBasic = await GetGenBasic(input.Id);//获取代码生成基础 - return await PreviewGen(genBasic); - } - - /// - public async Task ExecGenPro(ExecGenInput input) - { - var genBasic = await GetGenBasic(input.Id);//获取代码生成基础 - if (genBasic.GenerateType != GenConst.Pro) throw Oops.Bah("当前配置生成方式为:项目中"); - var backendPath = - Path.Combine(new DirectoryInfo(App.WebHostEnvironment.ContentRootPath).Parent - .FullName);//获取主工程目录 - var srcDir = "src";//默认都是代码放在src文件夹 - var frontedPath = genBasic.FrontedPath;//获取前端代码路径, - if (!frontedPath.Contains(srcDir))//如果不包含src - frontedPath = genBasic.FrontedPath.CombinePath(srcDir); - if (await CreateMenuButtonAndRelation(genBasic)) - { - var previewCode = await PreviewGen(genBasic);//获取代码生成预览 - if (input.ExecType != GenConst.ExecAll)//如果不是全部执行 - { - if (input.ExecType == GenConst.ExecBackend) - ExecBackend(previewCode.CodeBackendResults, genBasic, backendPath);//执行后端代码生成 - else if (input.ExecType == GenConst.ExecFrontend) - ExecFronted(previewCode.CodeFrontendResults, genBasic, frontedPath);//执行前端代码生成 - } - else - { - ExecBackend(previewCode.CodeBackendResults, genBasic, backendPath);//执行后端代码生成 - - ExecFronted(previewCode.CodeFrontendResults, genBasic, frontedPath);//执行前端代码生成 - } - } - else - { - throw Oops.Bah("代码生成失败"); - } - } - - /// - public async Task ExecGenZip(ExecGenInput input) - { - var genBasic = await GetGenBasic(input.Id);//获取代码生成基础 - if (genBasic.GenerateType != GenConst.Zip) throw Oops.Bah("当前配置生成方式为:压缩包"); - var temDir = Path.GetTempPath().CombinePath(genBasic.ClassName);//获取临时目录并用类名做存放代码文件文件夹 - File.Delete(temDir + ".zip");// 先删除压缩包 - var previewCode = await PreviewGen(genBasic);//获取代码生成预览 - if (input.ExecType != GenConst.ExecAll)//如果不是全部执行 - { - if (input.ExecType == GenConst.ExecBackend) - { - ExecBackend(previewCode.CodeBackendResults, genBasic, - temDir.CombinePath(_backendDir), true);//执行后端代码生成 - ExecSql(previewCode.SqlResults, temDir);//执行sql生成 - } - else if (input.ExecType == GenConst.ExecFrontend) - ExecFronted(previewCode.CodeFrontendResults, genBasic, - temDir.CombinePath(_frontDir));//执行前端生成 - } - else - { - ExecBackend(previewCode.CodeBackendResults, genBasic, temDir.CombinePath(_backendDir), - true);//执行后端代码生成 - ExecFronted(previewCode.CodeFrontendResults, genBasic, - temDir.CombinePath(_frontDir));//执行前端生成 - } - var zipPath = ZipUtils.CompressDirectory(temDir, true);//压缩文件夹 - var result = new FileStreamResult(new FileStream(zipPath, FileMode.Open), - "application/octet-stream") - { FileDownloadName = $"{genBasic.ClassName}.zip" }; - return result; - } - - #region 方法 - - /// - /// 生成后端代码文件 - /// - /// 后端代码模板 - /// 代码基础 - /// 后端生成路径 - /// 是否是zip方式 - public void ExecBackend(List baseCodeResults, - GenBasic genBasic, - string backendPath, bool isZip = false) - { - var serviceDir = "Services";//服务代码文件夹 - var controllerDir = "Controllers";//服务代码文件夹 - var tempDicName = "";//临时文件夹名称 - var dirList = new HashSet { };//文件夹列表 - var postion = "";//文件夹位置 - var parentDir = _backendDir;//父文件文件夹名称 - var serviceName = genBasic.ServicePosition.Split(".").Last();//取服务层最后一个单词命名为接口层控制器下的文件夹 - baseCodeResults.ForEach(it => - { - var fileInfo = new FileInfo(it.FilePath);//获取文件信息 - var dirName = fileInfo.Directory.Name;//获取文件文件夹名称 - var parentName = fileInfo.Directory.Parent.Name;//获取父文件文件夹名称 - if (dirName == controllerDir)//如果是控制器 - { - dirList.Add(dirName);//添加到当前文件夹到文件夹列表 - dirList.Add(serviceName);//添加服务层目录名到文件夹列表 - postion = genBasic.ControllerPosition;//设置文件夹创建位置为Api层 - } - else if (dirName == serviceDir)//如果是服务 - { - dirList.Remove(controllerDir);//删除接口文件夹 - dirList.Remove(serviceName);//删除服务层目录 - dirList.Add(genBasic.ClassName);//添加ClassName到文件夹列表 - dirList.Add(dirName);//添加到当前文件夹到文件夹列表 - postion = genBasic.ServicePosition;//设置文件夹创建位置为服务层 - } - - if (parentDir != parentName)//如果当前文件的父文件夹不等于partDir表示层级有变动 - { - dirList.Add(dirName);//添加到文件夹列表 - parentDir = parentName;//重新赋值父文件夹 - } - else - { - if (tempDicName != dirName)//如果临时文件夹不是当前文件夹表示同级目录下的另一个文件夹 - { - dirList.Remove(tempDicName);//删除上一个文件夹 - dirList.Add(dirName);//添加当前文件夹到文件夹列表 - } - } - - tempDicName = dirName;//给临时文件夹赋值 - var path = backendPath;//后端文件目录 - if (!isZip) path = backendPath.CombinePath(postion);//如果不是zip方式就加上命名空间 - path = path.CombinePath(dirList.ToArray()); - if (!Directory.Exists(path))//如果文件夹不存在就创建文件夹 - Directory.CreateDirectory(path); - //var fileName = genBasic.ClassName + it.CodeFileName;//文件名等于类名加代码文件名 - //if (it.CodeFileName.StartsWith("IService")) - // fileName = $"I{genBasic.ClassName}Service.cs";//对IService接口要特殊处理 - //path = path.CombinePath(fileName);//最终生成文件地址 - File.WriteAllText(path.CombinePath(it.CodeFileName), it.CodeFileContent, - Encoding.UTF8);//写入文件 - }); - } - - /// - /// 生成前端代码文件 - /// - /// 前端代码模板 - /// 代码基础 - /// 前端生成路径 - public void ExecFronted(List baseCodeResults, - GenBasic genBasic, - string frontedPath) - { - var apiDir = "api"; - var viewDir = "views"; - var parentDir = _frontDir;//父文件文件夹名称 - var dirList = new HashSet { };//文件夹列表 - baseCodeResults.ForEach(it => - { - var fileInfo = new FileInfo(it.FilePath);//获取文件信息 - var dirName = fileInfo.Directory.Name;//获取文件文件夹名称 - var parentName = fileInfo.Directory.Parent.Name;//获取父文件文件夹名称 - var path = frontedPath.CombinePath(fileInfo.Directory.Name) - .CombinePath(genBasic.RouteName);//生成路径为前端路径+代码文件所在文件夹+路由地址 - if (dirName == apiDir)//如果是api文件夹 - it.CodeFileName = - StringHelper.FirstCharToLower(genBasic.ClassName) - + it.CodeFileName;//文件名等于路由名加类名加代码文件名 - else if (dirName == viewDir) - path = path.CombinePath(genBasic.BusName); - if (!Directory.Exists(path))//如果文件夹不存在就创建文件夹 - Directory.CreateDirectory(path); - File.WriteAllText(path.CombinePath(it.CodeFileName), it.CodeFileContent, - Encoding.UTF8);//写入文件 - }); - } - - /// - /// 生成sql代码文件 - /// - /// 后端代码模板 - /// 生成路径 - public void ExecSql(List baseCodeResults, - string execPath) - { - execPath = execPath.CombinePath(_sqlDir);//写在sql目录里面 - if (!Directory.Exists(execPath))//如果文件夹不存在就创建文件夹 - Directory.CreateDirectory(execPath); - baseCodeResults.ForEach(it => - { - File.WriteAllText(execPath.CombinePath(it.CodeFileName), it.CodeFileContent, - Encoding.UTF8);//写入文件 - }); - } - - /// - /// 获取sql代码预览结果 - /// - /// 视图 - /// 模板路径 - /// - public async Task> GetSqlCodeResult( - GenViewModel genViewModel, - string templatePath) - { - var sqlCodeResults = new List();//结果集 - var sqlTemplatePath = Path.Combine(templatePath, _sqlDir);//获取sql模板文件路径 - - var files = GetAllFileInfo(sqlTemplatePath); - foreach (var fileInfo in files) - { - var fileName = fileInfo.Name;//文件名 - var fileNoPrefix = fileName.Split(fileInfo.Extension)[0];//不带模板后缀的文件名 - var tContent = File.ReadAllText(fileInfo.FullName);//读取文件 - var tResult = await GetViewEngine(tContent, genViewModel);//渲染 - //将渲染结果添加到结果集 - sqlCodeResults.Add(new GenBasePreviewOutput.GenBaseCodeResult - { - CodeFileContent = tResult, - CodeFileName = fileNoPrefix, - FilePath = fileInfo.FullName - }); - } - - return sqlCodeResults; - } - - /// - /// 获取后端代码预览结果 - /// - /// 视图 - /// 模板路径 - /// - public async Task> GetBackendCodeResult( - GenViewModel genViewModel, - string templatePath) - { - // templatePath = "D:\\SimpleAdmin\\api\\SimpleAdmin\\SimpleAdmin.Plugin\\SimpleAdmin.Plugin.Gen\\CodeGen";//测试用 - var backendCodeResults = new List();//结果集 - var backendTemplatePath = Path.Combine(templatePath, _backendDir);//获取后端模板文件路径 - var files = GetAllFileInfo(backendTemplatePath); - // files = files.Where(it => it.Name == "Service.cs.vm").ToArray();//测试用 - foreach (var fileInfo in files) - { - var nameWithPrefix = fileInfo.Name;//文件名 - var fileNoPrefix = nameWithPrefix.Split(fileInfo.Extension)[0];//不带模板后缀的文件名 - var tContent = File.ReadAllText(fileInfo.FullName);//读取文件 - var fileName = genViewModel.ClassName + fileNoPrefix;//文件名等于类名加代码文件名 - if (fileNoPrefix.StartsWith("IService")) - fileName = $"I{genViewModel.ClassName}Service.cs";//对IService接口要特殊处理 - var tResult = await GetViewEngine(tContent, genViewModel);//渲染 - //将渲染结果添加到结果集 - backendCodeResults.Add(new GenBasePreviewOutput.GenBaseCodeResult - { - CodeFileContent = tResult, - CodeFileName = fileName, - FilePath = fileInfo.FullName - }); - } - - return backendCodeResults; - } - - /// - /// 获取前端代码预览结果 - /// - /// 视图 - /// 模板路径 - /// - public async Task> GetForntCodeResult( - GenViewModel genViewModel, - string templatePath) - { - // templatePath = "D:\\SimpleAdmin\\api\\SimpleAdmin\\SimpleAdmin.Plugin\\SimpleAdmin.Plugin.Gen\\CodeGen";//测试用 - var frontCodeResults = new List();//结果集 - var frontTemplatePath = Path.Combine(templatePath, _frontDir);//获取前端模板文件路径 - var files = GetAllFileInfo(frontTemplatePath); - // files = files.Where(it => it.Name == "index.vue.vm").ToArray();//测试用 - foreach (var fileInfo in files) - { - var fileName = fileInfo.Name;//文件名 - var fileNoPrefix = fileName.Split(fileInfo.Extension)[0];//不带模板后缀的文件名 - var tContent = File.ReadAllText(fileInfo.FullName);//读取文件 - var tResult = await GetViewEngine(tContent, genViewModel);//渲染 - //将渲染结果添加到结果集 - frontCodeResults.Add(new GenBasePreviewOutput.GenBaseCodeResult - { - CodeFileContent = tResult, - CodeFileName = fileNoPrefix, - FilePath = fileInfo.FullName - }); - } - - return frontCodeResults; - } - - /// - /// 获取代码生成视图 - /// - /// - /// - public async Task GetGenViewModel(GenBasic genBasic) - { - //实体转视图 - var genViewEngine = genBasic.Adapt(); - //获取字段信息 - var tableFieldList = await _genConfigService.List(genBasic.Id); - tableFieldList.ForEach(it => - { - it.FieldNameFirstLower = StringHelper.FirstCharToLower(it.FieldName);//首字母小写 - it.FieldNameFirstUpper = StringHelper.FirstCharToUpper(it.FieldName);//首字母大写 - }); - genViewEngine.TableFields = tableFieldList;//赋值表字段信息 - - return genViewEngine; - } - - /// - /// 视图渲染 - /// - /// 模板内容 - /// 参数 - /// - public async Task GetViewEngine(string tContent, GenViewModel genViewModel) - { - //视图引擎渲染 - var tResult = await _viewEngine.RunCompileFromCachedAsync(tContent, genViewModel, - builderAction: builder => - { - builder.AddAssemblyReference(typeof(GenBasic));//添加程序集 - builder.AddAssemblyReferenceByName("System.Collections");//添加程序集 - builder.AddAssemblyReferenceByName("SimpleTool");//添加程序集 - }); - return tResult; - } - - /// - /// 获得文件夹下所有的文件 - /// - /// 文件夹路径 - /// - private FileInfo[] GetAllFileInfo(string path) - { - var dir = new DirectoryInfo(path); - return dir.GetFiles(".", SearchOption.AllDirectories); - } - - /// - /// 代码生成预览 - /// - /// 基础配置 - /// - public async Task PreviewGen(GenBasic genBasic) - { - var basePath = AppContext.BaseDirectory;//获取项目目录 - var templatePath = basePath.CombinePath("CodeGen");//获取文件路径 - //var templatePath = App.WebHostEnvironment.WebRootPath + @"\CodeGen";//模板文件文件夹 - var genViewModel = await GetGenViewModel(genBasic); - var frontendResult = await GetForntCodeResult(genViewModel, templatePath); - var backendResult = await GetBackendCodeResult(genViewModel, templatePath); - var sqlResult = await GetSqlCodeResult(genViewModel, templatePath); - return new GenBasePreviewOutput - { - CodeBackendResults = backendResult, - SqlResults = sqlResult, - CodeFrontendResults = frontendResult - }; - } - - /// - /// 获取代码生成基础 - /// - /// - /// - private async Task GetGenBasic(long id) - { - var genBasic = await GetByIdAsync(id); - if (genBasic == null) - throw Oops.Bah("代码生成配置不存在"); - genBasic.FuncList = genBasic.Functions.Split(',').ToList(); - return genBasic; - } - - /// - /// 创建代码生成相关的菜单按钮和授权关系 - /// - /// - /// - private async Task CreateMenuButtonAndRelation(GenBasic genBasic) - { - try - { - #region 菜单 - - var title = genBasic.FunctionName + genBasic.FunctionNameSuffix; - var menuRep = ChangeRepository>();//切换仓储 - //获取已经存在的旧菜单 - var oldMenu = await menuRep.GetFirstAsync(it => it.Title == title - && it.Category == CateGoryConst.Resource_MENU - && it.MenuType == ResourceConst.MENU && - it.Code != ResourceConst.System); - if (oldMenu != null)//如果存在就直接和删除(同时删除其下面的菜单、按钮,清除对应的角色与资源信息) - await _menuService.Delete(new List - { new BaseIdInput { Id = oldMenu.Id } }); - //添加菜单参数 - var menu = new MenuAddInput - { - Id = CommonUtils.GetSingleId(), - ParentId = genBasic.MenuPid, - Title = title, - Category = CateGoryConst.Resource_MENU, - Module = genBasic.Module, - Icon = genBasic.Icon, - Name = genBasic.BusName, - Code = RandomHelper.CreateRandomString(10), - Path = $"/{genBasic.RouteName}/{genBasic.BusName}", - Component = $"{genBasic.RouteName}/{genBasic.BusName}/index", - SortCode = 99 - }; - await _menuService.Add(menu);//添加菜单 - - #endregion 菜单 - - #region 按钮 - - //添加按钮参数 - var button = new ButtonAddInput - { - Title = genBasic.FunctionName, - ParentId = menu.Id, - Code = StringHelper.FirstCharToLower(genBasic.ClassName) - }; - var buttonIds = await _buttonService.AddBatch(button);//添加按钮 - - #endregion 按钮 - - #region 角色授权 - - var roleRep = ChangeRepository>();//切换仓储 - var superAdmin = await roleRep.GetFirstAsync(it => - it.Code == RoleConst.SuperAdmin - && it.Category == CateGoryConst.Role_GLOBAL);//获取超级管理员 - //授权菜单参数 - var grantResource = new GrantResourceInput - { - Id = superAdmin.Id, - GrantInfoList = new List - { new RelationRoleResuorce { MenuId = menu.Id, ButtonInfo = buttonIds } }, - IsCodeGen = true - }; - await _roleService.GrantResource(grantResource);//授权菜单 - - #endregion 角色授权 - - return true; - } - catch (Exception ex) - { - _logger.LogError($"代码生成创建菜单和授权报错{ex.Message}", ex.InnerException); - return false; - } - } - - #endregion 方法 -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/IGenbasicService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/IGenbasicService.cs deleted file mode 100644 index 5262f9d..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Basic/IGenbasicService.cs +++ /dev/null @@ -1,69 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成基础服务 -/// -public interface IGenbasicService : ITransient -{ - /// - /// 添加代码生成器基础 - /// - /// - /// - Task Add(GenBasicAddInput input); - - /// - /// 删除代码生成配置 - /// - /// ID列表 - /// - Task Delete(List input); - - /// - /// 编辑代码生成基础配置 - /// - /// - /// 代码生产基础 - Task Edit(GenBasicEditInput input); - - /// - /// 执行代码生成:本地 - /// - /// - /// - Task ExecGenPro(ExecGenInput input); - - /// - /// 执行代码生成:压缩包 - /// - /// - /// - Task ExecGenZip(ExecGenInput input); - - /// - /// 获取项目所有程序集 - /// - /// 程序集列表 - List GetAssemblies(); - - /// - /// 获取表信息 - /// - /// 是否所有表 - /// 实体表列表 - List GetTables(bool isAll = false); - - /// - /// 获取代码生成基础分页 - /// - /// 查询参数 - /// 代码生成基础分页列表 - Task> Page(BasePageInput input); - - /// - /// 代码生成预览 - /// - /// 代码生成基础Id - /// 预览结果 - Task PreviewGen(BaseIdInput input); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/Dto/GenConfigInput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/Dto/GenConfigInput.cs deleted file mode 100644 index 4d1cf07..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/Dto/GenConfigInput.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -public class GenConfigInput -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/GenConfigService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/GenConfigService.cs deleted file mode 100644 index 76eff9f..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/GenConfigService.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// -/// -public class GenConfigService : DbRepository, IGenConfigService -{ - private readonly ILogger logger; - - public GenConfigService(ILogger logger) - { - this.logger = logger; - } - - /// - public async Task> List(long basicId) - { - var configs = await GetListAsync(it => it.BasicId == basicId);//获取配置表相关配置 - configs = configs.OrderBy(it => it.FieldIndex).ToList();//排序一下 - return configs; - } - - /// - public async Task EditBatch(List configs) - { - await UpdateRangeAsync(configs);//批量更新 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/IGenConfigService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/IGenConfigService.cs deleted file mode 100644 index b059316..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Services/Config/IGenConfigService.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace SimpleAdmin.Plugin.Gen; - -/// -/// 代码生成详细配置服务 -/// -public interface IGenConfigService : ITransient -{ - /// - /// 批量更新 - /// - /// - /// - Task EditBatch(List configs); - - /// - /// 查询代码生成详细配置列表 - /// - /// - /// 配置列表 - Task> List(long basicId); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.csproj deleted file mode 100644 index eb3a575..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.csproj +++ /dev/null @@ -1,111 +0,0 @@ - - - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.Gen.xml - enable - enable - - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - - - - - - - - - - - - - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - true - PreserveNewest - PreserveNewest - - - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.xml deleted file mode 100644 index d856b6c..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/SimpleAdmin.Plugin.Gen.xml +++ /dev/null @@ -1,1006 +0,0 @@ - - - - SimpleAdmin.Plugin.Gen - - - - - 代码生成器常量 - - - - - 是 - - - - - 否 - - - - - 压缩包 - - - - - 项目中 - - - - - 全部 - - - - - 前端 - - - - - 后端 - - - - - 代码生成基础控制器 - - - - - 代码生成基础分页 - - - - - - - 获取所有表信息 - - - - - - 获取项目所有程序集 - - - - - - 添加代码生成器 - - - - - - - 编辑代码生成器 - - - - - - - 删除代码生成配置 - - - - - - - 代码生成预览 - - - - - - - 执行代码生成(本地)" - - - - - - - 执行代码生成(压缩包) - - - - - - - 代码生成配置控制器 - - - - - 查询代码生成详细配置列表 - - - - - - - 编辑代码生成详细 - - - - - - - 代码生成基础 - - - - - 所属库 - - - - - 主表 - - - - - 表实体名称 - - - - - 功能列表 - - - - - 数据权限 - - - - - 生成模版 - - - - - 树Id字段 - - - - - 树父Id字段 - - - - - 树名称字段 - - - - - 关联子表名 - - - - - 关联子表外键 - - - - - 移除表前缀 - - - - - 生成方式 - - - - - 所属模块 - - - - - 上级目录 - - - - - 业务名 - - - - - 图标 - - - - - 功能名 - - - - - 功能名后缀 - - - - - 业务名 - - - - - 类名 - - - - - 表单布局 - - - - - 使用栅格 - - - - - 左侧树 - - - - - 前端项目路径 - - - - - 服务代码存放位置 - - - - - 控制器代码存放位置 - - - - - 作者 - - - - - 排序 - - - - - 功能列表 - - - - - 代码生成配置 - - - - - 基础ID - - - - - 字段排序 - - - - - 是否主键 - - - - - 字段 - - - - - 名称 - - - - - 类型 - - - - - 实体类型 - - - - - 作用类型 - - - - - 外键显示字段 - - - - - 外键ID - - - - - 外键显示字段 - - - - - 字典 - - - - - 列宽度 - - - - - 列表显示 - - - - - 列省略 - - - - - 可伸缩列 - - - - - 是否增改 - - - - - 是否导入导出 - - - - - 必填 - - - - - 查询 - - - - - 查询方式 - - - - - 排序 - - - - - 字段名首字母小写 - - - - - 字段名首字母大写 - - - - - 代码生成器配置 - - - - - 系统配置种子数据 - - - - - 系统配置种子数据 - - - - - 代码生成基础添加参数 - - - - - 所属库名称 - - - - - 主表名称 - - - - - 功能列表 - - - - - 生成模版 - - - - - 数据权限 - - - - - 实体名称 - - - - - 表前缀移除 - - - - - 生成方式 - - - - - 所属模块 - - - - - 路由名 - - - - - 图标 - - - - - 功能名 - - - - - 业务名 - - - - - 类名 - - - - - 表单布局 - - - - - 使用栅格 - - - - - 左侧树 - - - - - 前端路径 - - - - - 服务层 - - - - - 控制器层 - - - - - 排序 - - - - - 作者名 - - - - - 代码生成基础编辑参数 - - - - - 执行代码生成参数 - - - - - 生成类型 - - - - - 表字段信息输出 - - - - - 字段名称 - - - - - 是否主键 - - - - - 字段类型 - - - - - 字段注释 - - - - - 预览代码生成结果 - - - - - SQL代码结果集 - - - - - 前端代码结果集 - - - - - 后端代码结果集 - - - - - 代码文件名称 - - - - - 文件路径 - - - - - 代码文件内容 - - - - - 代码生成绑定视图 - - - - - 生成时间 - - - - - 表字段 - - - - - 菜单ID - - - - - 菜单编码 - - - - - /菜单路径 - - - - - /菜单路径 - - - - - 添加按钮ID - - - - - 批量删除按钮ID - - - - - 编辑按钮ID - - - - - 删除按钮ID - - - - - 类名首字母小写 - - - - - swagger分组名称 - - - - - 服务名 - - - - - 服务名开头首字母小写 - - - - - 分页查询 - - - - - 列表查询 - - - - - 添加 - - - - - 修改 - - - - - 修改 - - - - - 详情 - - - - - 导入 - - - - - 导入模板下载 - - - - - 导入预览 - - - - - 导入 - - - - - 批量编辑 - - - - - 树查询 - - - - - 分页参数 - - - - - 添加参数 - - - - - 编辑参数 - - - - - 树查询参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 生成后端代码文件 - - 后端代码模板 - 代码基础 - 后端生成路径 - 是否是zip方式 - - - - 生成前端代码文件 - - 前端代码模板 - 代码基础 - 前端生成路径 - - - - 生成sql代码文件 - - 后端代码模板 - 生成路径 - - - - 获取sql代码预览结果 - - 视图 - 模板路径 - - - - - 获取后端代码预览结果 - - 视图 - 模板路径 - - - - - 获取前端代码预览结果 - - 视图 - 模板路径 - - - - - 获取代码生成视图 - - - - - - - 视图渲染 - - 模板内容 - 参数 - - - - - 获得文件夹下所有的文件 - - 文件夹路径 - - - - - 代码生成预览 - - 基础配置 - - - - - 获取代码生成基础 - - - - - - - 创建代码生成相关的菜单按钮和授权关系 - - - - - - - 代码生成基础服务 - - - - - 添加代码生成器基础 - - - - - - - 删除代码生成配置 - - ID列表 - - - - - 编辑代码生成基础配置 - - - 代码生产基础 - - - - 执行代码生成:本地 - - - - - - - 执行代码生成:压缩包 - - - - - - - 获取项目所有程序集 - - 程序集列表 - - - - 获取表信息 - - 是否所有表 - 实体表列表 - - - - 获取代码生成基础分页 - - 查询参数 - 代码生成基础分页列表 - - - - 代码生成预览 - - 代码生成基础Id - 预览结果 - - - - - - - - - - - - - - - 代码生成详细配置服务 - - - - - 批量更新 - - - - - - - 查询代码生成详细配置列表 - - - 配置列表 - - - - AppStartup启动类 - - - - - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Startup.cs deleted file mode 100644 index 98dc77f..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Gen/Startup.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Reflection; - -namespace SimpleAdmin.Plugin.Gen; - -/// -/// AppStartup启动类 -/// -public class Startup : AppStartup -{ - /// - /// ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - /// 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - /// 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - /// - /// - public void ConfigureServices(IServiceCollection services) - { - //代码生成器配置转实体 - services.AddConfigurableOptions(); - //试图引擎 - services.AddViewEngine(); - } - - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - var fullName = Assembly.GetExecutingAssembly().FullName;//获取程序集全名 - //通过 App.GetOptions 获取选项 - var settings = App.GetOptions(); - CodeFirstUtils.CodeFirst(settings, fullName);//CodeFirst - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs index 1fe11da..ca34f61 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs @@ -25,6 +25,12 @@ public class ResourceConst /// public const string LINK = "LINK"; + + /// + /// 单页 + /// + public const string SPA = "SPA"; + /// /// 系统内置单页面编码 /// diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 6c365b2..6a33e95 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -489,6 +489,11 @@ 外链 + + + 单页 + + 系统内置单页面编码 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs index 004a575..e9c7b05 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs @@ -79,10 +79,10 @@ public class BatchEditService : DbRepository, IBatchEditService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //事务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs index 89086a0..5ea8771 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs @@ -24,7 +24,7 @@ public interface IBatchEditService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 获取需要批量修改的表 @@ -59,7 +59,8 @@ public interface IBatchEditService : ITransient /// 唯一编码 /// 字段信息 /// sqlsugar对应字典 - Task> GetUpdateBatchConfigDict(string code, List columns); + Task> GetUpdateBatchConfigDict(string code, + List columns); /// /// 同步字段 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs index df90dae..8746b1e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs @@ -37,9 +37,9 @@ public class FileService : DbRepository, IFileService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { - var ids = input.Select(it => it.Id).ToList();//获取ID + var ids = input.Ids;//获取ID await DeleteByIdsAsync(ids.Cast().ToArray());//根据ID删除数据库 } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs index c4adce2..ec487ad 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs @@ -10,7 +10,7 @@ public interface IFileService : ITransient /// /// ID列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 文件下载 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs index eb8bfa1..7b8e6b9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs @@ -10,7 +10,7 @@ public interface IMessageService : ITransient /// /// id列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 删除我的消息 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs index 0c2c502..0ea6255 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs @@ -153,10 +153,10 @@ public class MessageService : DbRepository, IMessageService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //事务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs index 8e6625c..d72b8d2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs @@ -17,7 +17,7 @@ public interface IIndexService : ITransient /// /// id列表 /// - Task DeleteSchedule(List input); + Task DeleteSchedule(BaseIdListInput input); /// /// 获取日程列表 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs index fcb5090..0fab5b8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs @@ -9,14 +9,16 @@ public class IndexService : DbRepository, IIndexService public IndexService(IRelationService relationService) { - this._relationService = relationService; + _relationService = relationService; } /// public async Task> ScheduleList(ScheduleListInput input) { - var relations = await GetListAsync(it => it.Category == CateGoryConst.Relation_SYS_USER_SCHEDULE_DATA - && it.ObjectId == UserManager.UserId && it.TargetId == input.ScheduleDate, it => new SysRelation { ExtJson = it.ExtJson, Id = it.Id });//获取当前用户的日程列表 + var relations = await GetListAsync(it => + it.Category == CateGoryConst.Relation_SYS_USER_SCHEDULE_DATA + && it.ObjectId == UserManager.UserId && it.TargetId == input.ScheduleDate, + it => new SysRelation { ExtJson = it.ExtJson, Id = it.Id });//获取当前用户的日程列表 List userSchedules = new List();//结果集 relations.ForEach(it => { @@ -34,14 +36,16 @@ public class IndexService : DbRepository, IIndexService input.ScheduleUserId = UserManager.UserId; input.ScheduleUserName = UserManager.Name; //添加日程 - await _relationService.SaveRelation(CateGoryConst.Relation_SYS_USER_SCHEDULE_DATA, UserManager.UserId, input.ScheduleDate, input.ToJson(), false, false); + await _relationService.SaveRelation(CateGoryConst.Relation_SYS_USER_SCHEDULE_DATA, + UserManager.UserId, input.ScheduleDate, input.ToJson(), + false, false); } /// - public async Task DeleteSchedule(List input) + public async Task DeleteSchedule(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; await DeleteAsync(it => ids.Contains(it.Id) && it.ObjectId == UserManager.UserId); } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs index 0101648..fc9d379 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs @@ -118,7 +118,7 @@ public interface ISysOrgService : ITransient /// 删除参数 /// 名称 /// - Task Delete(List input, string name = SimpleAdminConst.SysOrg); + Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SysOrg); #endregion 删除 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs index 874a946..ea487c1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs @@ -244,10 +244,10 @@ public class SysOrgService : DbRepository, ISysOrgService #region 删除 /// - public async Task Delete(List input, string name = SimpleAdminConst.SysOrg) + public async Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SysOrg) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { var sysOrgs = await GetListAsync();//获取所有组织 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs index adb5aa3..9ca075e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs @@ -19,7 +19,7 @@ public interface ISysPositionService : ITransient /// id列表 /// 名称 /// - Task Delete(List input, string name = SimpleAdminConst.SysPos); + Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SysPos); /// /// 编辑职位 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs index 6ee6f3d..58ae19a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs @@ -104,10 +104,10 @@ public class SysPositionService : DbRepository, ISysPositionService } /// - public async Task Delete(List input, string name = SimpleAdminConst.SysPos) + public async Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SysPos) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //如果组织下有用户则不能删除 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs index 4a736a0..72c606e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs @@ -107,10 +107,10 @@ public class ButtonService : DbRepository, IButtonService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; //获取所有按钮集合 var buttonList = await _resourceService.GetListByCategory(CateGoryConst.Resource_BUTTON); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs index 6c00b02..a883237 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs @@ -24,7 +24,7 @@ public interface IButtonService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑按钮 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs index d0a20a3..b2ad500 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs @@ -46,7 +46,7 @@ public interface IMenuService : ITransient /// /// 删除菜单参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 改变菜单模块 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs index bbb6ad7..b83508f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs @@ -9,18 +9,20 @@ public class MenuService : DbRepository, IMenuService private readonly IResourceService _resourceService; private readonly IRelationService _relationService; - public MenuService(ILogger logger, IResourceService resourceService, IRelationService relationService) + public MenuService(ILogger logger, IResourceService resourceService, + IRelationService relationService) { - this._logger = logger; - this._resourceService = resourceService; - this._relationService = relationService; + _logger = logger; + _resourceService = resourceService; + _relationService = relationService; } /// public List ConstructMenuTrees(List resourceList, long parentId = 0) { //找下级资源ID列表 - var resources = resourceList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); + var resources = resourceList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode) + .ToList(); if (resources.Count > 0)//如果数量大于0 { var data = new List(); @@ -39,8 +41,10 @@ public class MenuService : DbRepository, IMenuService { //获取所有菜单 var sysResources = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); - sysResources = sysResources.WhereIF(input.Module != null, it => it.Module.Value == input.Module.Value)//根据模块查找 - .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title == input.SearchKey)//根据关键字查找 + sysResources = sysResources + .WhereIF(input.Module != null, it => it.Module.Value == input.Module.Value)//根据模块查找 + .WhereIF(!string.IsNullOrEmpty(input.SearchKey), + it => it.Title == input.SearchKey)//根据关键字查找 .ToList(); //构建菜单树 var tree = ConstructMenuTrees(sysResources); @@ -67,14 +71,15 @@ public class MenuService : DbRepository, IMenuService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //获取所有菜单和按钮 - var resourceList = await _resourceService.GetListAsync(new List { CateGoryConst.Resource_MENU, CateGoryConst.Resource_BUTTON }); + var resourceList = await _resourceService.GetListAsync(new List + { CateGoryConst.Resource_MENU, CateGoryConst.Resource_BUTTON }); //找到要删除的菜单 var sysResources = resourceList.Where(it => ids.Contains(it.Id)).ToList(); //查找内置菜单 @@ -98,13 +103,17 @@ public class MenuService : DbRepository, IMenuService { await DeleteByIdsAsync(ids.Cast().ToArray());//删除菜单和按钮 await Context.Deleteable()//关系表删除对应SYS_ROLE_HAS_RESOURCE - .Where(it => it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))).ExecuteCommandAsync(); + .Where(it => + it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE + && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))) + .ExecuteCommandAsync(); }); if (result.IsSuccess)//如果成功了 { await _resourceService.RefreshCache(CateGoryConst.Resource_MENU);//资源表菜单刷新缓存 await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//资源表按钮刷新缓存 - await _relationService.RefreshCache(CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 + await _relationService.RefreshCache(CateGoryConst + .Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 } else { @@ -134,11 +143,14 @@ public class MenuService : DbRepository, IMenuService if (sysResource.ParentId != 0) throw Oops.Bah($"非顶级菜单不可修改所属模块"); //获取所有菜单和模块 - var resourceList = await _resourceService.GetListAsync(new List { CateGoryConst.Resource_MENU, CateGoryConst.Resource_MODULE }); - if (!resourceList.Any(it => it.Category == CateGoryConst.Resource_MODULE && it.Id == input.Module.Value)) + var resourceList = await _resourceService.GetListAsync(new List + { CateGoryConst.Resource_MENU, CateGoryConst.Resource_MODULE }); + if (!resourceList.Any(it => + it.Category == CateGoryConst.Resource_MODULE && it.Id == input.Module.Value)) throw Oops.Bah($"不存在的模块"); //获取所有菜单 - var menuList = resourceList.Where(it => it.Category == CateGoryConst.Resource_MENU).ToList(); + var menuList = resourceList.Where(it => it.Category == CateGoryConst.Resource_MENU) + .ToList(); //获取需要改变模块菜单的所有子菜单 var childList = _resourceService.GetChildListById(menuList, input.Id); childList.ForEach(it => it.Module = input.Module); @@ -160,7 +172,9 @@ public class MenuService : DbRepository, IMenuService //获取所有菜单列表 var menList = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); //判断是否有同级且同名的菜单 - if (menList.Any(it => it.ParentId == sysResource.ParentId && it.Title == sysResource.Title && it.Id != sysResource.Id)) + if (menList.Any(it => + it.ParentId == sysResource.ParentId && it.Title == sysResource.Title + && it.Id != sysResource.Id)) throw Oops.Bah($"存在重复的菜单名称:{sysResource.Title}"); if (sysResource.ParentId != 0) { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs index 6e0aad1..029e374 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs @@ -17,7 +17,7 @@ public interface IModuleService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑模块 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs index 226a16a..d3bd4a9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs @@ -55,10 +55,10 @@ public class ModuleService : DbRepository, IModuleService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //获取所有 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs index 1d516d9..53380e7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs @@ -17,7 +17,7 @@ public interface ISpaService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑单页 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs index d2e7d9e..3f2efd7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs @@ -34,7 +34,7 @@ public class SpaService : DbRepository, ISpaService /// public async Task Add(SpaAddInput input) { - CheckInput(input);//检查参数 + await CheckInput(input);//检查参数 input.Code = RandomHelper.CreateRandomString(10);//code取随机值 var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 @@ -44,17 +44,17 @@ public class SpaService : DbRepository, ISpaService /// public async Task Edit(SpaEditInput input) { - CheckInput(input);//检查参数 + await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await UpdateAsync(sysResource))//更新数据 await _resourceService.RefreshCache(CateGoryConst.Resource_SPA);//刷新缓存 } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { //获取所有 @@ -77,7 +77,7 @@ public class SpaService : DbRepository, ISpaService /// 检查输入参数 /// /// - private void CheckInput(SysResource sysResource) + private async Task CheckInput(SysResource sysResource) { //判断菜单类型 if (sysResource.MenuType == ResourceConst.MENU)//如果是菜单 @@ -101,6 +101,16 @@ public class SpaService : DbRepository, ISpaService { throw Oops.Bah($"单页类型错误:{sysResource.MenuType}");//都不是 } + if (sysResource.IsHome) + { + var spas = await _resourceService.GetListByCategory(ResourceConst.SPA);//获取所有单页 + if (spas.Any(it => it.IsHome && it.Id != sysResource.Id))//如果有多个主页 + { + throw Oops.Bah($"已存在首页,请取消其他主页后再试"); + } + sysResource.IsHide = false;//如果是主页,则不隐藏 + sysResource.IsAffix = true;//如果是主页,则固定 + } //设置为单页 sysResource.Category = CateGoryConst.Resource_SPA; } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs index 3675397..95c0f5d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs @@ -23,7 +23,7 @@ public interface IRoleService : ITransient /// /// 删除参数 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 编辑角色 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs index 12673f6..345e7bc 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs @@ -149,10 +149,10 @@ public class RoleService : DbRepository, IRoleService } /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { var sysRoles = await GetListAsync();//获取所有角色 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs index f9ea604..ab7a855 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs @@ -224,7 +224,7 @@ public partial interface ISysUserService : ITransient /// /// Id列表 /// - Task Delete(List input); + Task Delete(BaseIdListInput input); /// /// 从redis中删除用户信息 @@ -267,7 +267,8 @@ public partial interface ISysUserService : ITransient /// /// /// - Task> Import(ImportResultInput input); + Task> + Import(ImportResultInput input); /// /// 检查导入数据 @@ -275,7 +276,8 @@ public partial interface ISysUserService : ITransient /// 数据 /// 是否初始化错误 /// - Task> CheckImport(List data, bool clearError = false) where T : SysUserImportInput; + Task> CheckImport(List data, bool clearError = false) + where T : SysUserImportInput; #endregion 导入导出 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs index 7805344..1674698 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs @@ -638,10 +638,10 @@ public class SysUserService : DbRepository, ISysUserService #region 删除 /// - public async Task Delete(List input) + public async Task Delete(BaseIdListInput input) { //获取所有ID - var ids = input.Select(it => it.Id).ToList(); + var ids = input.Ids; if (ids.Count > 0) { var containsSuperAdmin = await IsAnyAsync(it => diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs index 6b1734d..f782e3b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs @@ -328,47 +328,6 @@ public class UserCenterService : DbRepository, IUserCenterService return parentList; } - /// - /// 获取我的模块集合 - /// - /// - /// - /// - /// - private List GetMyModules(List allModuleList, List moduleIds, - int spaCount) - { - //获取我的模块信息 - var myModules = allModuleList.Where(it => moduleIds.Contains(it.Id)).ToList(); - // 如果一个模块都没拥有 - if (myModules.Count == 0) - { - // 如果系统中无模块(极端情况) - if (allModuleList.Count == 0) - { - if (spaCount == 0)// 如果系统中无单页面,则返回空列表 - { - return new List(); - } - else - { - // 否则构造一个模块,并添加到拥有模块 - var sysResource = new SysResource(); - sysResource.Id = CommonUtils.GetSingleId(); - sysResource.Path = "/" + RandomHelper.CreateRandomString(10); - sysResource.Category = CateGoryConst.Resource_MODULE; - allModuleList.Add(sysResource); - myModules.Add(sysResource); - } - } - else - { - // 否则将系统中第一个模块作为拥有的模块 - myModules.Add(allModuleList[0]); - } - } - return myModules; - } /// /// 构建Meta @@ -386,20 +345,6 @@ public class UserCenterService : DbRepository, IUserCenterService ActiveMenu = it.ActiveMenu, IsLink = it.Category == ResourceConst.LINK ? it.Path : "" }; - // 如果是单页面 - if (it.Category == CateGoryConst.Resource_SPA) - { - if (it.IsHome) - { - // 如果是首页则设置affix - meta.IsAffix = true; - } - else - { - // 否则隐藏该单页面 - meta.IsHide = true; - } - } it.Meta = meta; }); } diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index 9cd69f4..752927f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -2271,7 +2271,7 @@ - + @@ -2410,7 +2410,7 @@ 添加参数 - + 删除批量 @@ -2812,7 +2812,7 @@ - + @@ -2865,7 +2865,7 @@ 文件管理服务 - + 删除文件 @@ -2966,7 +2966,7 @@ 站内信服务 - + 删除消息 @@ -3035,7 +3035,7 @@ - + @@ -3531,7 +3531,7 @@ 日程参数 - + 删除日程 @@ -3556,7 +3556,7 @@ - + @@ -3747,7 +3747,7 @@ 名称 - + 删除组织 @@ -3819,7 +3819,7 @@ - + @@ -3950,7 +3950,7 @@ 名称 - + 删除职位 @@ -4032,7 +4032,7 @@ - + @@ -4183,7 +4183,7 @@ - + @@ -4241,7 +4241,7 @@ - + 删除按钮 @@ -4381,7 +4381,7 @@ 菜单编辑参数 - + 删除菜单 @@ -4412,7 +4412,7 @@ - + @@ -4459,7 +4459,7 @@ 添加参数 - + 删除模块 @@ -4494,7 +4494,7 @@ - + @@ -4805,7 +4805,7 @@ 添加参数 - + 删除单页 @@ -4840,7 +4840,7 @@ - + @@ -5002,7 +5002,7 @@ 添加参数 - + 删除角色 @@ -5118,7 +5118,7 @@ - + @@ -5400,15 +5400,6 @@ 我的菜单列表 - - - 获取我的模块集合 - - - - - - 构建Meta @@ -6081,7 +6072,7 @@ 批量编辑信息 - + 删除用户 @@ -6221,7 +6212,7 @@ - + diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs index 90863d5..5dbef99 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs @@ -83,7 +83,7 @@ public class BizOrgController : IDynamicApiController /// [HttpPost("delete")] [DisplayName("删除机构")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _orgService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs index 7f53f39..3b6e558 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs @@ -58,7 +58,7 @@ public class BizPositionController /// [HttpPost("delete")] [DisplayName("删除岗位")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _positionService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs index f70005c..c087167 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs @@ -12,7 +12,8 @@ public class BizUserController : IDynamicApiController private readonly IOrgService _orgService; private readonly IPositionService _positionService; - public BizUserController(IUserService userService, IOrgService orgService, IPositionService positionService) + public BizUserController(IUserService userService, IOrgService orgService, + IPositionService positionService) { _userService = userService; _orgService = orgService; @@ -175,7 +176,7 @@ public class BizUserController : IDynamicApiController /// [HttpPost("delete")] [DisplayName("删除人员")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _userService.Delete(input); } @@ -235,7 +236,8 @@ public class BizUserController : IDynamicApiController /// [HttpPost("import")] [DisplayName("人员导入")] - public async Task Import([SuppressMonitor][FromBody] ImportResultInput input) + public async Task Import( + [SuppressMonitor][FromBody] ImportResultInput input) { return await _userService.Import(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs index 773ab8a..90e043f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs @@ -10,19 +10,21 @@ namespace SimpleAdmin.Web.Core; /// [ApiDescriptionSettings("Application", Tag = "测试")] [Route("/biz/test")] -public class GenTestController: IDynamicApiController +public class GenTestController : IDynamicApiController { private readonly IGenTestService _genTestService; private readonly ISysOrgService _sysOrgService; + public GenTestController(IGenTestService genTestService - ,ISysOrgService sysOrgService + , ISysOrgService sysOrgService ) { - this._genTestService = genTestService; + _genTestService = genTestService; _sysOrgService = sysOrgService; } + #region Get请求 - + /// /// 测试分页查询 /// @@ -58,8 +60,8 @@ public class GenTestController: IDynamicApiController { return await _genTestService.Detail(input); } - - + + /// /// 获取组织树选择器 /// @@ -68,9 +70,9 @@ public class GenTestController: IDynamicApiController [DisplayName("组织树查询")] public async Task OrgTreeSelector() { - return await _sysOrgService.Tree(); + return await _sysOrgService.Tree(); } - + /// /// 测试导入预览 /// @@ -84,7 +86,7 @@ public class GenTestController: IDynamicApiController { return await _genTestService.Preview(input); } - + /// /// 测试导入模板下载 /// @@ -95,13 +97,12 @@ public class GenTestController: IDynamicApiController { return await _genTestService.Template(); } - #endregion - + #region Post请求 - + /// /// 添加测试 /// @@ -133,7 +134,7 @@ public class GenTestController: IDynamicApiController /// [HttpPost("delete")] [DisplayName("删除测试")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _genTestService.Delete(input); } @@ -145,11 +146,12 @@ public class GenTestController: IDynamicApiController /// [HttpPost("import")] [DisplayName("测试导入")] - public async Task Import([SuppressMonitor][FromBody] ImportResultInput input) + public async Task Import( + [SuppressMonitor][FromBody] ImportResultInput input) { return await _genTestService.Import(input); } - + /// /// 测试导出 /// @@ -161,7 +163,6 @@ public class GenTestController: IDynamicApiController { return await _genTestService.Export(input); } - - #endregion -} + #endregion +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs index f2f5f6d..ed67167 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs @@ -93,7 +93,7 @@ public class BatchEditController : BaseController /// [HttpPost("delete")] [DisplayName("删除批量更新")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _batchEditService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs index 2e7ea92..9124942 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs @@ -58,7 +58,7 @@ public class FileController : BaseController /// [HttpPost("delete")] [DisplayName("删除文件")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _fileService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs index 7869ea1..c2932c9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs @@ -55,7 +55,7 @@ public class MessageController : BaseController /// [HttpPost("delete")] [DisplayName("删除站内信")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _messageService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs index 61a9448..3ac0f13 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs @@ -11,22 +11,23 @@ public class IndexController : IDynamicApiController private readonly IOperateLogService _operateLogService; private readonly IIndexService _indexService; - public IndexController(IVisitLogService visitLogService, IOperateLogService operateLogService, IIndexService indexService) + public IndexController(IVisitLogService visitLogService, IOperateLogService operateLogService, + IIndexService indexService) { - this._visitLogService = visitLogService; - this._operateLogService = operateLogService; - this._indexService = indexService; + _visitLogService = visitLogService; + _operateLogService = operateLogService; + _indexService = indexService; } /// /// 获取当前用户访问日志列表 /// /// - [HttpGet("visLog/list")] public async Task VisLogList() { - return await _visitLogService.Page(new VisitLogPageInput { Account = UserManager.UserAccount }); + return await _visitLogService.Page(new VisitLogPageInput + { Account = UserManager.UserAccount }); } /// @@ -36,7 +37,8 @@ public class IndexController : IDynamicApiController [HttpGet("opLog/list")] public async Task OpLogList() { - return await _operateLogService.Page(new OperateLogPageInput { Account = UserManager.UserAccount }); + return await _operateLogService.Page(new OperateLogPageInput + { Account = UserManager.UserAccount }); } /// @@ -78,7 +80,7 @@ public class IndexController : IDynamicApiController /// [HttpPost("schedule/deleteSchedule")] [DisplayName("删除日程")] - public async Task DeleteSchedule([FromBody] List input) + public async Task DeleteSchedule([FromBody] BaseIdListInput input) { await _indexService.DeleteSchedule(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs index e3c7ba7..2103de7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs @@ -55,7 +55,7 @@ public class ButtonController : BaseController /// [HttpPost("delete")] [DisplayName("删除按钮")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _buttonService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs index 212dc42..40a394b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs @@ -32,7 +32,8 @@ public class MenuController : BaseController [HttpGet("tree")] public async Task Tree([FromQuery] MenuTreeInput input) { - return await _menuService.Tree(input); ; + return await _menuService.Tree(input); + ; } /// @@ -42,7 +43,8 @@ public class MenuController : BaseController [HttpGet("menuTreeSelector")] public async Task MenuTreeSelector([FromQuery] MenuTreeInput input) { - return await _menuService.Tree(input); ; + return await _menuService.Tree(input); + ; } /// @@ -76,7 +78,8 @@ public class MenuController : BaseController [HttpGet("detail")] public async Task Detail([FromQuery] BaseIdInput input) { - return await _menuService.Detail(input); ; + return await _menuService.Detail(input); + ; } /// @@ -86,7 +89,7 @@ public class MenuController : BaseController /// [HttpPost("delete")] [DisplayName("删除菜单")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _menuService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs index 2ee164b..866711a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs @@ -53,10 +53,9 @@ public class ModuleController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除模块")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _moduleService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs index f805340..45f105a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs @@ -12,7 +12,7 @@ public class OrgController : BaseController public OrgController(ISysOrgService sysOrgService, ISysUserService sysUserService) { _sysOrgService = sysOrgService; - this._sysUserService = sysUserService; + _sysUserService = sysUserService; } #region Get @@ -66,7 +66,8 @@ public class OrgController : BaseController [HttpGet("detail")] public async Task Detail([FromQuery] BaseIdInput input) { - return await _sysOrgService.Detail(input); ; + return await _sysOrgService.Detail(input); + ; } #endregion Get @@ -114,10 +115,9 @@ public class OrgController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除组织")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _sysOrgService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs index cf2b752..43fa761 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs @@ -10,7 +10,7 @@ public class PositionController : BaseController public PositionController(ISysPositionService sysPositionService) { - this._sysPositionService = sysPositionService; + _sysPositionService = sysPositionService; } /// @@ -54,10 +54,9 @@ public class PositionController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除职位")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _sysPositionService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs index 9f22479..7359edd 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs @@ -11,7 +11,8 @@ public class RoleController : BaseController private readonly ISysOrgService _sysOrgService; private readonly ISysUserService _sysUserService; - public RoleController(IRoleService roleService, IResourceService resourceService, ISysOrgService sysOrgService, + public RoleController(IRoleService roleService, IResourceService resourceService, + ISysOrgService sysOrgService, ISysUserService sysUserService) { _roleService = roleService; @@ -62,7 +63,7 @@ public class RoleController : BaseController /// [HttpPost("delete")] [DisplayName("删除角色")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _roleService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs index c3d395f..5a84b2b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs @@ -53,10 +53,9 @@ public class SpaController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除单页")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _spaService.Delete(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs index b670fc2..52221a4 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs @@ -11,7 +11,8 @@ public class UserController : BaseController private readonly ISysPositionService _sysPositionService; private readonly IRoleService _roleService; - public UserController(ISysUserService sysUserService, ISysOrgService sysOrgService, ISysPositionService sysPositionService, + public UserController(ISysUserService sysUserService, ISysOrgService sysOrgService, + ISysPositionService sysPositionService, IRoleService roleService) { _sysUserService = sysUserService; @@ -201,7 +202,7 @@ public class UserController : BaseController /// [HttpPost("delete")] [DisplayName("删除用户")] - public async Task Delete([FromBody] List input) + public async Task Delete([FromBody] BaseIdListInput input) { await _sysUserService.Delete(input); } @@ -285,7 +286,8 @@ public class UserController : BaseController /// [HttpPost("import")] [DisplayName("用户导入")] - public async Task Import([SuppressMonitor][FromBody] ImportResultInput input) + public async Task Import( + [SuppressMonitor][FromBody] ImportResultInput input) { return await _sysUserService.Import(input); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj index 5075ad1..ebd747d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj @@ -13,7 +13,6 @@ - diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index 6874c3b..7aad319 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -77,7 +77,7 @@ - + 删除机构 @@ -129,7 +129,7 @@ - + 删除岗位 @@ -228,7 +228,7 @@ - + 删除人员 @@ -336,7 +336,7 @@ - + 删除测试 @@ -499,7 +499,7 @@ - + 删除批量 @@ -630,7 +630,7 @@ - + 删除文件 @@ -739,7 +739,7 @@ - + 删除站内信 @@ -782,7 +782,7 @@ - + 删除日程 @@ -815,7 +815,7 @@ - + 删除按钮 @@ -872,7 +872,7 @@ - + 删除菜单 @@ -912,7 +912,7 @@ - + 删除模块 @@ -977,7 +977,7 @@ - + 删除组织 @@ -1010,7 +1010,7 @@ - + 删除职位 @@ -1043,7 +1043,7 @@ - + 删除角色 @@ -1142,7 +1142,7 @@ - + 删除单页 @@ -1370,7 +1370,7 @@ - + 删除用户 diff --git a/api/SimpleAdmin/SimpleAdmin.sln b/api/SimpleAdmin/SimpleAdmin.sln index f4303f9..979ee6f 100644 --- a/api/SimpleAdmin/SimpleAdmin.sln +++ b/api/SimpleAdmin/SimpleAdmin.sln @@ -33,8 +33,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.SignalR" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.Core", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.Core\SimpleAdmin.Plugin.Core.csproj", "{4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.Gen", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.Gen\SimpleAdmin.Plugin.Gen.csproj", "{E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "核心插件", "核心插件", "{9EB00985-8989-4020-B0BA-536C90BEDEBC}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "系统模块", "系统模块", "{3B049767-E6E3-4E89-B45B-9066448E0573}" @@ -87,10 +85,6 @@ Global {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}.Debug|Any CPU.Build.0 = Debug|Any CPU {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC}.Release|Any CPU.Build.0 = Release|Any CPU - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C}.Release|Any CPU.Build.0 = Release|Any CPU {8D130807-5AD8-4894-A694-6EBECBF89A5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D130807-5AD8-4894-A694-6EBECBF89A5A}.Debug|Any CPU.Build.0 = Debug|Any CPU {8D130807-5AD8-4894-A694-6EBECBF89A5A}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -119,7 +113,6 @@ Global {7A2AFE93-99B6-4578-AB2C-217B09731E0B} = {3B049767-E6E3-4E89-B45B-9066448E0573} {861B10C0-98C3-4CC7-AB5F-9D381E2EE2C1} = {3B049767-E6E3-4E89-B45B-9066448E0573} {4E618FB6-9BE6-4F52-9D97-1EB50FAFB5EC} = {9EB00985-8989-4020-B0BA-536C90BEDEBC} - {E77A2C65-E977-43F0-BEB7-C315EDBF3C7C} = {3B049767-E6E3-4E89-B45B-9066448E0573} {9EB00985-8989-4020-B0BA-536C90BEDEBC} = {D3630025-B2A9-4B83-99CF-2DD99289D628} {3B049767-E6E3-4E89-B45B-9066448E0573} = {D3630025-B2A9-4B83-99CF-2DD99289D628} {8D130807-5AD8-4894-A694-6EBECBF89A5A} = {9EB00985-8989-4020-B0BA-536C90BEDEBC} -- Gitee From c4b88ae893a5063ca0ca2877650b5b9b6ee3917a Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Tue, 5 Sep 2023 14:36:02 +0800 Subject: [PATCH 04/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=B4=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=EF=BC=8C=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/SimpleAdmin/.editorconfig | 116 + .../SimpleAdmin.Application/Entity/GenTest.cs | 10 +- .../SimpleAdmin.Application/GlobalUsings.cs | 16 +- .../Options/ApplicationSettingsOptions.cs | 10 +- .../Services/GenTest/Dto/GenTestInput.cs | 196 +- .../Services/GenTest/Dto/GenTestOutput.cs | 92 +- .../Services/GenTest/GenTestService.cs | 29 +- .../Services/GenTest/IGenTestService.cs | 19 +- .../Services/Org/IOrgService.cs | 10 +- .../Services/Org/OrgService.cs | 10 +- .../Services/Position/IPositionService.cs | 10 +- .../Services/Position/PositionService.cs | 10 +- .../Services/User/Dto/UserInput.cs | 10 +- .../Services/User/Dto/UserOutput.cs | 10 +- .../Services/User/IUserService.cs | 10 +- .../Services/User/UserService.cs | 10 +- .../SimpleAdmin.Application/Startup.cs | 10 +- .../Dto/MqttConnected.cs | 10 +- .../SimpleAdmin.Background/GlobalUsings.cs | 11 +- .../SimpleAdmin.Background/Program.cs | 8 + .../SimpleAdmin.Background/TestWorker.cs | 17 +- .../SimpleAdmin.Cache/Const/CacheConst.cs | 11 +- .../SimpleAdmin.Cache/GlobalUsing.cs | 10 +- .../Interface/ISimpleCacheHashService.cs | 10 +- .../Interface/ISimpleCacheService.cs | 10 +- .../Options/CacheSettingsOptions.cs | 10 +- .../Service/MemoryCacheHashService.cs | 10 +- .../Service/MemoryCacheService.cs | 10 +- .../Service/RedisCacheHashService.cs | 10 +- .../Service/RedisCacheService.cs | 10 +- api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs | 10 +- .../Attributes/BatchEditAttribute.cs | 10 +- .../Attributes/CodeGenAttribute.cs | 10 +- .../Attributes/IgnoreInitTableAttribute.cs | 10 +- .../Attributes/IgnoreSeedDataAttribute.cs | 10 +- .../Attributes/RolePermissionAttribute.cs | 10 +- .../Attributes/SuperAdminAttribute.cs | 10 +- .../ValidationAttribute/IdNotNull.cs | 10 +- .../BaseInput/BaseFileInput.cs | 10 +- .../SimpleAdmin.Core/BaseInput/BaseIdInput.cs | 10 +- .../BaseInput/BasePageInput.cs | 10 +- .../BaseOutput/BaseSelectorOutput.cs | 10 +- .../Components/GzipCompressionComponent.cs | 13 +- .../Components/LoggingConsoleComponent.cs | 10 +- .../Components/LoggingFileComponent.cs | 9 +- .../SimpleAdmin.Core/Const/ClaimConst.cs | 10 +- .../Const/SimpleAdminConst.cs | 10 +- .../SimpleAdmin.Core/Core.Development.json | 2 +- .../SimpleAdmin.Core/Core.Production.json | 2 +- .../SimpleAdmin.Core/Dto/MqttMessage.cs | 10 +- .../SimpleAdmin.Core/Dto/TokenInfo.cs | 10 +- .../Enum/Auth/AuthDeviceTypeEumu.cs | 10 +- .../Enum/Auth/LoginClientTypeEnum.cs | 10 +- .../SimpleAdmin.Core/Enum/ErrorCodeEnum.cs | 10 +- .../Extension/LinqExtension.cs | 10 +- .../Extension/ObjectExtension.cs | 9 +- .../SimpleAdmin.Core/GlobalUsings.cs | 34 +- .../SimpleAdmin.Core/Options/BaseOptions.cs | 10 +- .../Options/LoggingSetting.cs | 12 +- api/SimpleAdmin/SimpleAdmin.Core/Startup.cs | 10 +- .../UnifyResult/SimpleAdminResult.cs | 10 +- .../UnifyResult/SimpleAdminResultProvider.cs | 13 +- .../Utils/Captcha/CaptchaInfo.cs | 12 +- .../Utils/Captcha/CaptchaType.cs | 10 +- .../Utils/Captcha/CaptchaUtil.cs | 16 +- .../SimpleAdmin.Core/Utils/CommonUtils.cs | 10 +- .../Utils/Cryptogram/CryptogramUtil.cs | 10 +- .../Utils/Cryptogram/SM2Util.cs | 10 +- .../Utils/Cryptogram/SM4Util.cs | 46 +- .../Utils/Cryptogram/Sm/SM2CryptoUtil.cs | 157 +- .../Utils/Cryptogram/Sm/SM4CryptoUtil.cs | 10 +- .../Utils/Image/AvatarUtil.cs | 13 +- .../SimpleAdmin.Core/Utils/Image/ImageUtil.cs | 25 +- .../SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs | 12 +- .../SimpleAdmin.Core/Utils/Zip/ZipUtils.cs | 10 +- .../Aop/GlobalDispatchProxy.cs | 10 +- .../Attributes/CacheAttribute.cs | 10 +- .../SimpleAdmin.Plugin.Aop/GlobalUsing.cs | 10 +- .../Enum/NoticeComponent.cs | 10 +- .../SimpleAdmin.Plugin.Core/GlobalUsing.cs | 10 +- .../Interface/INoticeService.cs | 10 +- .../Options/PluginSettingsOptions.cs | 10 +- .../Const/MqttConst.cs | 10 +- .../Controller/MqttController.cs | 9 +- .../SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs | 12 +- .../SimpleAdmin.Plugin.Mqtt/MqttComponent.cs | 10 +- .../Service/Mqtt/Dto/MqttInput.cs | 10 +- .../Service/Mqtt/Dto/MqttOutput.cs | 10 +- .../Service/Mqtt/IMqttService.cs | 10 +- .../Service/Mqtt/MqttService.cs | 20 +- .../Service/Notice/MqttNoticeService.cs | 10 +- .../SimpleAdmin.Plugin.SignalR/GlobalUsing.cs | 19 +- .../Hub/ISimpleHub.cs | 10 +- .../Hub/SimpleHub.cs | 13 +- .../Provider/UserIdProvider.cs | 11 +- .../Service/SignalrNoticeService.cs | 10 +- .../SignalRComponent.cs | 10 +- .../Const/CateGoryConst.cs | 10 +- .../SimpleAdmin.SqlSugar/Const/DevLogConst.cs | 17 - .../Const/EffTypeConst.cs | 10 +- .../Const/ResourceConst.cs | 16 +- .../SimpleAdmin.SqlSugar/Const/RoleConst.cs | 10 +- .../Const/SqlsugarConst.cs | 10 +- .../{DevConfigConst.cs => SysConfigConst.cs} | 15 +- .../{DevDictConst.cs => SysDictConst.cs} | 28 +- .../SimpleAdmin.SqlSugar/Const/SysLogConst.cs | 25 + .../SimpleAdmin.SqlSugar/Db/DbContext.cs | 10 +- .../SimpleAdmin.SqlSugar/Db/DbRepository.cs | 10 +- .../SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs | 10 +- .../SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs | 10 +- .../SimpleAdmin.SqlSugar/Entity/BaseEntity.cs | 10 +- .../Extension/ISqlSugarEntitySeedData.cs | 10 +- .../Extension/SqlSugarPageExtension.cs | 10 +- .../Extension/SqlSugarUnitOfWork.cs | 11 +- .../SimpleAdmin.SqlSugar/GlobalUsing.cs | 16 +- .../SimpleAdmin.SqlSugar.xml | 283 +- .../SimpleAdmin.SqlSugar/Startup.cs | 8 +- .../Utils/CodeFirstUtils.cs | 16 +- .../Utils/Dto/SqlSugarTableInfo.cs | 10 +- .../Utils/Dto/SqlsugarColumnInfo.cs | 10 +- .../Utils/SeedDataUtil.cs | 10 +- .../Utils/SqlSugarUtils.cs | 10 +- .../Attributes/AntTableAttribute.cs | 10 +- .../Attributes/InDictAttribute.cs | 14 +- .../SimpleAdmin.System/Const/SystemConst.cs | 16 +- .../SimpleAdmin.System/Entity/BatchEdit.cs | 10 +- .../Entity/BatchEditConfig.cs | 10 +- .../Entity/ClientRelation.cs | 10 +- .../SimpleAdmin.System/Entity/ClientUser.cs | 10 +- .../SimpleAdmin.System/Entity/DevRelation.cs | 10 - .../Entity/{DevConfig.cs => SysConfig.cs} | 17 +- .../Entity/{DevDict.cs => SysDict.cs} | 24 +- .../Entity/{DevFile.cs => SysFile.cs} | 17 +- .../{DevLogOperate.cs => SysLogOperate.cs} | 29 +- .../Entity/{DevLogVisit.cs => SysLogVisit.cs} | 20 +- .../Entity/{DevMessage.cs => SysMessage.cs} | 14 +- .../{DevMessageUser.cs => SysMessageUser.cs} | 14 +- .../SimpleAdmin.System/Entity/SysOrg.cs | 10 +- .../SimpleAdmin.System/Entity/SysPosition.cs | 10 +- .../SimpleAdmin.System/Entity/SysRelation.cs | 10 +- .../SimpleAdmin.System/Entity/SysResource.cs | 50 +- .../SimpleAdmin.System/Entity/SysRole.cs | 10 +- .../SimpleAdmin.System/Entity/SysUser.cs | 11 +- .../EventSubscriber/AuthEventSubscriber.cs | 19 +- .../Const/EventSubscriberConst.cs | 10 +- .../EventSubscriber/Dto/LoginEvent.cs | 11 +- .../EventSubscriber/Dto/NoticeEvent.cs | 10 +- .../EventSubscriber/NoticeEventSubsciber.cs | 10 +- .../EventSubscriber/UserEventSubscriber.cs | 10 +- .../ExtJson/RelationMsgUser.cs | 10 +- .../ExtJson/RelationRolePermission.cs | 10 +- .../ExtJson/RelationRoleResuorce.cs | 10 +- .../ExtJson/RelationUserSchedule.cs | 10 +- .../ExtJson/RelationUserWorkBench.cs | 10 +- .../SimpleAdmin.System/GlobalUsings.cs | 20 +- api/SimpleAdmin/SimpleAdmin.System/Mapper.cs | 10 +- .../Options/SystemSettingsOptions.cs | 10 +- .../SimpleAdmin.System/Oss/MinioUtils.cs | 18 +- .../SeedData/BatchEditConfigSeedData.cs | 10 +- .../SeedData/BatchEditSeedData.cs | 10 +- .../SeedData/DevConfigSeedData.cs | 16 +- .../SeedData/DevDictSeedData.cs | 16 +- ...d_dev_config.json => seed_sys_config.json} | 0 ...{seed_dev_dict.json => seed_sys_dict.json} | 0 .../SeedData/SysOrgSeedData.cs | 10 +- .../SeedData/SysPositionSeedData.cs | 10 +- .../SeedData/SysRelationSeedData.cs | 10 +- .../SeedData/SysResourceSeedData.cs | 10 +- .../SeedData/SysRoleSeedData.cs | 10 +- .../SeedData/SysUserSeedData.cs | 10 +- .../Services/Auth/Auth/AuthService.cs | 96 +- .../Services/Auth/Auth/Dto/AuthInput.cs | 10 +- .../Services/Auth/Auth/Dto/AuthOutPut.cs | 10 +- .../Services/Auth/Auth/IAuthService.cs | 10 +- .../Services/Auth/Session/Dto/SessionInput.cs | 10 +- .../Auth/Session/Dto/SessionOutput.cs | 10 +- .../Services/Auth/Session/ISessionService.cs | 10 +- .../Services/Auth/Session/SessionService.cs | 16 +- .../Services/BatchEdit/BatchEditService.cs | 14 +- .../Services/BatchEdit/Dto/BatchEditInput.cs | 22 +- .../Services/BatchEdit/Dto/BatchEditOutput.cs | 10 +- .../Services/BatchEdit/IBatchEditService.cs | 10 +- .../Services/Dev/File/Dto/FileInput.cs | 10 +- .../Services/Dev/File/FileService.cs | 34 +- .../Services/Dev/File/IFileService.cs | 12 +- .../Services/Dev/Message/Dto/MessageInput.cs | 12 +- .../Services/Dev/Message/Dto/MessageOutPut.cs | 13 +- .../Services/Dev/Message/IMessageService.cs | 14 +- .../Services/Dev/Message/MessageService.cs | 40 +- .../Dev/OperateLog/Dto/OperateLogInput.cs | 15 - .../ImportExport/Dto/ImportPreviewInput.cs | 8 +- .../ImportExport/Dto/ImportPreviewOutput.cs | 10 +- .../ImportExport/Dto/ImportResultInput.cs | 10 +- .../ImportExport/Dto/ImportResultOutPut.cs | 10 +- .../ImportExport/Dto/ImportTemplateInput.cs | 10 +- .../ImportExport/IImportExportService.cs | 10 +- .../ImportExport/ImportExportService.cs | 10 +- .../Services/Index/Dto/IndexInput.cs | 10 +- .../Services/Index/Dto/IndexOutput.cs | 10 +- .../Services/Index/IIndexService.cs | 10 +- .../Services/Index/IndexService.cs | 10 +- .../Button/ButtonService.cs | 10 +- .../Button/Dto/ButtonInput.cs | 10 +- .../Button/IButtonService.cs | 10 +- .../Resource => Limit}/Menu/Dto/MenuInput.cs | 31 +- .../Resource => Limit}/Menu/IMenuService.cs | 10 +- .../Resource => Limit}/Menu/MenuService.cs | 10 +- .../Module/Dto/ModuleInput.cs | 10 +- .../Module/IModuleService.cs | 10 +- .../Module/ModuleService.cs | 10 +- .../{System => Limit}/Role/Dto/RoleInput.cs | 10 +- .../{System => Limit}/Role/Dto/RoleOutput.cs | 10 +- .../{System => Limit}/Role/IRoleService.cs | 10 +- .../{System => Limit}/Role/RoleService.cs | 22 +- .../Resource => Limit}/Spa/Dto/SpaInput.cs | 10 +- .../Resource => Limit}/Spa/ISpaService.cs | 10 +- .../Resource => Limit}/Spa/SpaService.cs | 13 +- .../OperateLog/Dto/OperateLogInput.cs | 23 + .../OperateLog/Dto/OperateLogOutput.cs | 10 +- .../OperateLog/IOperateLogService.cs | 14 +- .../OperateLog/OperateLogService.cs | 36 +- .../VisitLog/Dto/VisitLogInput.cs | 10 +- .../VisitLog/Dto/VisitLogOutput.cs | 10 +- .../VisitLog/IVisitLogService.cs | 13 +- .../VisitLog/VisitLogService.cs | 30 +- .../{Dev => Ops}/Config/ConfigService.cs | 38 +- .../{Dev => Ops}/Config/Dto/ConfigInput.cs | 15 +- .../{Dev => Ops}/Config/IConfigService.cs | 18 +- .../Services/{Dev => Ops}/Dict/DictService.cs | 112 +- .../{Dev => Ops}/Dict/Dto/DictInput.cs | 25 +- .../{Dev => Ops}/Dict/IDictService.cs | 22 +- .../Org/Dto/SysOrgInput.cs | 10 +- .../Organization/Org/Dto/SysOrgOutput.cs | 9 + .../Org/ISysOrgService.cs | 10 +- .../Org/SysOrgService.cs | 11 +- .../Position/Dto/PositionInput.cs | 10 +- .../Position/Dto/PositionOutput.cs | 9 + .../Position/ISysPositionService.cs | 10 +- .../Position/SysPositionService.cs | 16 +- .../User/Dto/UserInput.cs | 10 +- .../User/Dto/UserOutPut.cs | 10 +- .../User/ISysUserService.cs | 10 +- .../User/SysUserService.cs | 37 +- .../Services/System/Org/Dto/SysOrgOutput.cs | 1 - .../System/Position/Dto/PositionOutput.cs | 1 - .../System/Relation/Dto/RelationInput.cs | 10 +- .../System/Relation/Dto/RelationOutput.cs | 10 +- .../System/Relation/IRelationService.cs | 10 +- .../System/Relation/RelationService.cs | 10 +- .../{Resource => }/Dto/ResourceOutPut.cs | 10 +- .../{Resource => }/IResourceService.cs | 10 +- .../{Resource => }/ResourceService.cs | 74 +- .../System/UserCenter/Dto/UserCenterInput.cs | 10 +- .../System/UserCenter/Dto/UserCenterOutput.cs | 10 +- .../System/UserCenter/IUserCenterService.cs | 12 +- .../System/UserCenter/UserCenterService.cs | 33 +- .../SimpleAdmin.System.csproj | 134 +- .../SimpleAdmin.System/SimpleAdmin.System.xml | 4494 +++++++++-------- api/SimpleAdmin/SimpleAdmin.System/Startup.cs | 11 +- .../SimpleAdmin.System/System.Production.json | 26 +- .../UserManager/UserManager.cs | 10 +- .../Components/AuthComponent.cs | 10 +- .../Components/LoggingMonitorComponent.cs | 10 +- .../Components/PluginSettingComponent.cs | 10 +- .../Components/WebSettingsComponent.cs | 10 +- .../Application/BizOrgController.cs | 10 +- .../Application/BizPositionController.cs | 10 +- .../Application/BizUserController.cs | 11 +- .../Application/GenTestController.cs | 17 +- .../System/Auth/AuthBController.cs | 10 +- .../System/Auth/SessionController.cs | 10 +- .../Controllers/System/BaseController.cs | 10 +- .../System/BatchEdit/BatchEditController.cs | 10 +- .../Controllers/System/Dev/FileController.cs | 16 +- .../System/Dev/MessageController.cs | 12 +- .../System/Index/IndexController.cs | 14 +- .../{System => Limit}/ButtonController.cs | 11 +- .../{System => Limit}/MenuController.cs | 11 +- .../{System => Limit}/ModuleController.cs | 11 +- .../{System => Limit}/RoleController.cs | 11 +- .../System/{System => Limit}/SpaController.cs | 11 +- .../{Dev => LogAudit}/LogOperateController.cs | 12 +- .../{Dev => LogAudit}/LogVisitController.cs | 12 +- .../System/{Dev => Ops}/ConfigController.cs | 19 +- .../System/{Dev => Ops}/DictController.cs | 13 +- .../{System => Organization}/OrgController.cs | 11 +- .../PositionController.cs | 11 +- .../UserController.cs | 11 +- .../System/System/UserCenterController.cs | 12 +- .../Filter/MyActionFilter.cs | 10 +- .../Filter/MyAuthorizationFilter.cs | 10 +- .../SimpleAdmin.Web.Core/GlobalUsing.cs | 21 +- .../Handlers/JwtHandler.cs | 10 +- .../Handlers/LogExceptionHandler.cs | 10 +- .../Logging/DatabaseLoggingWriter.cs | 69 +- .../Logging/LoggingConst.cs | 10 +- .../Logging/LoggingMonitorJson.cs | 10 +- .../Options/WebSettingsOptions.cs | 10 +- .../SimpleAdmin.Web.Core.csproj | 45 +- .../SimpleAdmin.Web.Core.xml | 550 +- .../SimpleAdmin.Web.Core/Startup.cs | 14 +- .../SimpleAdmin.Web.Entry/Program.cs | 13 +- .../SimpleAdmin.Web.Entry.csproj | 6 +- .../SimpleAdmin.Web.Entry/appsettings.json | 2 +- api/SimpleAdmin/SimpleAdmin.sln | 4 +- 305 files changed, 6242 insertions(+), 3799 deletions(-) create mode 100644 api/SimpleAdmin/.editorconfig delete mode 100644 api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevLogConst.cs rename api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/{DevConfigConst.cs => SysConfigConst.cs} (81%) rename api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/{DevDictConst.cs => SysDictConst.cs} (56%) create mode 100644 api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysLogConst.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.System/Entity/DevRelation.cs rename api/SimpleAdmin/SimpleAdmin.System/Entity/{DevConfig.cs => SysConfig.cs} (52%) rename api/SimpleAdmin/SimpleAdmin.System/Entity/{DevDict.cs => SysDict.cs} (47%) rename api/SimpleAdmin/SimpleAdmin.System/Entity/{DevFile.cs => SysFile.cs} (67%) rename api/SimpleAdmin/SimpleAdmin.System/Entity/{DevLogOperate.cs => SysLogOperate.cs} (50%) rename api/SimpleAdmin/SimpleAdmin.System/Entity/{DevLogVisit.cs => SysLogVisit.cs} (65%) rename api/SimpleAdmin/SimpleAdmin.System/Entity/{DevMessage.cs => SysMessage.cs} (48%) rename api/SimpleAdmin/SimpleAdmin.System/Entity/{DevMessageUser.cs => SysMessageUser.cs} (42%) rename api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/{seed_dev_config.json => seed_sys_config.json} (100%) rename api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/{seed_dev_dict.json => seed_sys_dict.json} (100%) delete mode 100644 api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogInput.cs rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Button/ButtonService.cs (90%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Button/Dto/ButtonInput.cs (54%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Button/IButtonService.cs (56%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Menu/Dto/MenuInput.cs (67%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Menu/IMenuService.cs (66%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Menu/MenuService.cs (91%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Module/Dto/ModuleInput.cs (36%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Module/IModuleService.cs (51%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Module/ModuleService.cs (87%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Limit}/Role/Dto/RoleInput.cs (77%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Limit}/Role/Dto/RoleOutput.cs (46%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Limit}/Role/IRoleService.cs (80%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Limit}/Role/RoleService.cs (95%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Spa/Dto/SpaInput.cs (59%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Spa/ISpaService.cs (50%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System/Resource => Limit}/Spa/SpaService.cs (83%) create mode 100644 api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogInput.cs rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => LogAudit}/OperateLog/Dto/OperateLogOutput.cs (39%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => LogAudit}/OperateLog/IOperateLogService.cs (53%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => LogAudit}/OperateLog/OperateLogService.cs (74%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => LogAudit}/VisitLog/Dto/VisitLogInput.cs (38%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => LogAudit}/VisitLog/Dto/VisitLogOutput.cs (45%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => LogAudit}/VisitLog/IVisitLogService.cs (50%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => LogAudit}/VisitLog/VisitLogService.cs (74%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => Ops}/Config/ConfigService.cs (73%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => Ops}/Config/Dto/ConfigInput.cs (54%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => Ops}/Config/IConfigService.cs (56%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => Ops}/Dict/DictService.cs (60%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => Ops}/Dict/Dto/DictInput.cs (51%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{Dev => Ops}/Dict/IDictService.cs (64%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/Org/Dto/SysOrgInput.cs (74%) create mode 100644 api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/Org/ISysOrgService.cs (84%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/Org/SysOrgService.cs (96%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/Position/Dto/PositionInput.cs (62%) create mode 100644 api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/Position/ISysPositionService.cs (71%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/Position/SysPositionService.cs (90%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/User/Dto/UserInput.cs (90%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/User/Dto/UserOutPut.cs (87%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/User/ISysUserService.cs (90%) rename api/SimpleAdmin/SimpleAdmin.System/Services/{System => Organization}/User/SysUserService.cs (97%) delete mode 100644 api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgOutput.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionOutput.cs rename api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/{Resource => }/Dto/ResourceOutPut.cs (71%) rename api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/{Resource => }/IResourceService.cs (78%) rename api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/{Resource => }/ResourceService.cs (83%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{System => Limit}/ButtonController.cs (68%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{System => Limit}/MenuController.cs (76%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{System => Limit}/ModuleController.cs (64%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{System => Limit}/RoleController.cs (85%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{System => Limit}/SpaController.cs (63%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{Dev => LogAudit}/LogOperateController.cs (67%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{Dev => LogAudit}/LogVisitController.cs (63%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{Dev => Ops}/ConfigController.cs (69%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{Dev => Ops}/DictController.cs (68%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{System => Organization}/OrgController.cs (78%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{System => Organization}/PositionController.cs (65%) rename api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/{System => Organization}/UserController.cs (90%) diff --git a/api/SimpleAdmin/.editorconfig b/api/SimpleAdmin/.editorconfig new file mode 100644 index 0000000..e05a269 --- /dev/null +++ b/api/SimpleAdmin/.editorconfig @@ -0,0 +1,116 @@ + +[*.cs] +#### 命名样式 #### + +# 命名规则 +# 常量和静态只读字段必须大写(多个单词用 _ 分割)和私有字段使用 _ 作为前缀 的示例说明。 + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + + + +dotnet_naming_rule.const_should_be_all_upper.severity = suggestion +dotnet_naming_rule.const_should_be_all_upper.symbols = const +dotnet_naming_rule.const_should_be_all_upper.style = all_upper + +dotnet_naming_rule.static_readonly_field_should_be_all_upper.severity = suggestion +dotnet_naming_rule.static_readonly_field_should_be_all_upper.symbols = static_readonly_field +dotnet_naming_rule.static_readonly_field_should_be_all_upper.style = all_upper + +dotnet_naming_rule.private_or_internal_field_should_be_private_field.severity = suggestion +dotnet_naming_rule.private_or_internal_field_should_be_private_field.symbols = private_or_internal_field +dotnet_naming_rule.private_or_internal_field_should_be_private_field.style = private_field + +# 符号规范 + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# 命名样式 + +#dotnet_naming_style.all_upper.word_separator = _ +#dotnet_naming_style.all_upper.capitalization = all_upper + +dotnet_naming_style.private_field.required_prefix = +dotnet_naming_style.private_field.capitalization = camel_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case +csharp_using_directive_placement = outside_namespace:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_conditional_delegate_call = true:suggestion +csharp_style_var_for_built_in_types = false:silent +csharp_style_var_when_type_is_apparent = false:silent +csharp_style_var_elsewhere = false:silent +csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_braces = true:silent +csharp_style_namespace_declarations = file_scoped:silent +csharp_style_prefer_top_level_statements = true:silent +csharp_style_prefer_method_group_conversion = true:silent +csharp_prefer_static_local_function = true:suggestion +csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent +csharp_style_prefer_switch_expression = true:suggestion +csharp_style_prefer_pattern_matching = true:silent +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_prefer_not_pattern = true:suggestion +csharp_style_prefer_extended_property_pattern = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_prefer_null_check_over_type_check = true:suggestion +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_prefer_local_over_anonymous_function = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion +csharp_style_prefer_tuple_swap = true:suggestion +csharp_style_prefer_utf8_string_literals = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent +csharp_space_around_binary_operators = before_and_after +csharp_indent_labels = one_less_than_current + + +# Add copyright file header +file_header_template = SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:\n1.请不要删除和修改根目录下的LICENSE文件。\n2.请不要删除和修改SimpleAdmin源码头部的版权声明。\n3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin\n4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。\n5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。\n6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs b/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs index bed18d8..2d803b8 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 代码生成基础 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs index 190b275..48ad053 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs @@ -1,4 +1,12 @@ -global using Furion; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion; global using Furion.DependencyInjection; global using Furion.FriendlyException; global using Magicodes.ExporterAndImporter.Core; @@ -10,12 +18,12 @@ global using Microsoft.AspNetCore.Mvc; global using Microsoft.CodeAnalysis; global using Microsoft.Extensions.DependencyInjection; global using OfficeOpenXml.Table; +global using SimpleAdmin.Cache; global using SimpleAdmin.Core; global using SimpleAdmin.Core.Extension; -global using SimpleAdmin.System; -global using SimpleAdmin.Cache; global using SimpleAdmin.SqlSugar; +global using SimpleAdmin.System; global using SimpleTool; global using SqlSugar; global using System.ComponentModel.DataAnnotations; -global using SimpleAdmin.Core.Utils; \ No newline at end of file +global using System.Reflection; diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Options/ApplicationSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Application/Options/ApplicationSettingsOptions.cs index 57b15e5..83e539d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Options/ApplicationSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Options/ApplicationSettingsOptions.cs @@ -1,4 +1,12 @@ -using Furion.ConfigurableOptions; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Furion.ConfigurableOptions; namespace SimpleAdmin.Application; diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestInput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestInput.cs index c5c23b5..ccfbf0c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestInput.cs @@ -1,6 +1,11 @@ -using System; -using System.ComponentModel.DataAnnotations; -using Masuit.Tools.Core.Validator; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + namespace SimpleAdmin.Application; /// @@ -8,58 +13,56 @@ namespace SimpleAdmin.Application; /// public class GenTestPageInput : BasePageInput { - /// - /// 姓名 - /// - public string Name { get; set; } - - /// - /// 组织机构Id - /// - public long OrgId { get; set; } -} + /// + /// 姓名 + /// + public string Name { get; set; } + /// + /// 组织机构Id + /// + public long OrgId { get; set; } +} /// /// 添加测试参数 /// public class GenTestAddInput { - /// - /// 姓名 - /// - public string Name { get; set; } - - /// - /// 性别 - /// - public string Sex { get; set; } - - /// - /// 民族 - /// - public string Nation { get; set; } - - /// - /// 年龄 - /// - public int? Age { get; set; } - - /// - /// 生日 - /// - public DateTime? Bir { get; set; } - - /// - /// 排序码 - /// - public int? SortCode { get; set; } - - /// - /// 存款 - /// - public decimal? Money { get; set; } - + /// + /// 姓名 + /// + public string Name { get; set; } + + /// + /// 性别 + /// + public string Sex { get; set; } + + /// + /// 民族 + /// + public string Nation { get; set; } + + /// + /// 年龄 + /// + public int? Age { get; set; } + + /// + /// 生日 + /// + public DateTime? Bir { get; set; } + + /// + /// 排序码 + /// + public int? SortCode { get; set; } + + /// + /// 存款 + /// + public decimal? Money { get; set; } } /// @@ -74,62 +77,57 @@ public class GenTestEditInput : GenTestAddInput public long Id { get; set; } } - /// /// 测试导入 /// public class GenTestImportInput : ImportTemplateInput { - /// - /// 姓名 - /// - [ImporterHeader(Name = "姓名")] - [Required(ErrorMessage = "姓名不能为空")] - public string Name { get; set; } - - /// - /// 性别 - /// - [ImporterHeader(Name = "性别")] - [Required(ErrorMessage = "性别不能为空")] - public string Sex { get; set; } - - /// - /// 民族 - /// - [ImporterHeader(Name = "民族")] - [Required(ErrorMessage = "民族不能为空")] - public string Nation { get; set; } - - /// - /// 年龄 - /// - [ImporterHeader(Name = "年龄")] - [Required(ErrorMessage = "年龄不能为空")] - public int? Age { get; set; } - - /// - /// 生日 - /// - [ImporterHeader(Name = "生日")] - [Required(ErrorMessage = "生日不能为空")] - public DateTime? Bir { get; set; } - - /// - /// 排序码 - /// - [ImporterHeader(Name = "排序码")] - [Required(ErrorMessage = "排序码不能为空")] - public int? SortCode { get; set; } - - /// - /// 存款 - /// - [ImporterHeader(Name = "存款")] - [Required(ErrorMessage = "存款不能为空")] - public decimal? Money { get; set; } - -} + /// + /// 姓名 + /// + [ImporterHeader(Name = "姓名")] + [Required(ErrorMessage = "姓名不能为空")] + public string Name { get; set; } + /// + /// 性别 + /// + [ImporterHeader(Name = "性别")] + [Required(ErrorMessage = "性别不能为空")] + public string Sex { get; set; } + /// + /// 民族 + /// + [ImporterHeader(Name = "民族")] + [Required(ErrorMessage = "民族不能为空")] + public string Nation { get; set; } + /// + /// 年龄 + /// + [ImporterHeader(Name = "年龄")] + [Required(ErrorMessage = "年龄不能为空")] + public int? Age { get; set; } + + /// + /// 生日 + /// + [ImporterHeader(Name = "生日")] + [Required(ErrorMessage = "生日不能为空")] + public DateTime? Bir { get; set; } + + /// + /// 排序码 + /// + [ImporterHeader(Name = "排序码")] + [Required(ErrorMessage = "排序码不能为空")] + public int? SortCode { get; set; } + + /// + /// 存款 + /// + [ImporterHeader(Name = "存款")] + [Required(ErrorMessage = "存款不能为空")] + public decimal? Money { get; set; } +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestOutput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestOutput.cs index 140189c..4eb8b13 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/Dto/GenTestOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 测试导出 @@ -6,49 +14,45 @@ [ExcelExporter(Name = "测试信息", TableStyle = TableStyles.Light10, AutoFitAllColumn = true)] public class GenTestExportOutput { - /// - /// 姓名 - /// - [ExporterHeader(DisplayName = "姓名")] - public string Name { get; set; } - - /// - /// 性别 - /// - [ExporterHeader(DisplayName = "性别")] - public string Sex { get; set; } - - /// - /// 民族 - /// - [ExporterHeader(DisplayName = "民族")] - public string Nation { get; set; } - - /// - /// 年龄 - /// - [ExporterHeader(DisplayName = "年龄")] - public string Age { get; set; } - - /// - /// 生日 - /// - [ExporterHeader(DisplayName = "生日")] - public string Bir { get; set; } - - /// - /// 排序码 - /// - [ExporterHeader(DisplayName = "排序码")] - public string SortCode { get; set; } - - /// - /// 存款 - /// - [ExporterHeader(DisplayName = "存款")] - public string Money { get; set; } - -} + /// + /// 姓名 + /// + [ExporterHeader(DisplayName = "姓名")] + public string Name { get; set; } + + /// + /// 性别 + /// + [ExporterHeader(DisplayName = "性别")] + public string Sex { get; set; } + + /// + /// 民族 + /// + [ExporterHeader(DisplayName = "民族")] + public string Nation { get; set; } + + /// + /// 年龄 + /// + [ExporterHeader(DisplayName = "年龄")] + public string Age { get; set; } + /// + /// 生日 + /// + [ExporterHeader(DisplayName = "生日")] + public string Bir { get; set; } + /// + /// 排序码 + /// + [ExporterHeader(DisplayName = "排序码")] + public string SortCode { get; set; } + /// + /// 存款 + /// + [ExporterHeader(DisplayName = "存款")] + public string Money { get; set; } +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs index 1b16df3..4a94eaa 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs @@ -1,9 +1,12 @@ -using Furion.FriendlyException; -using Mapster; -using SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + using Microsoft.Extensions.Logging; -using Microsoft.AspNetCore.Mvc; -using SqlSugar; namespace SimpleAdmin.Application; @@ -55,7 +58,7 @@ public class GenTestService : DbRepository, IGenTestService //外键查询 - #endregion + #endregion 查询 #region 新增 @@ -67,7 +70,7 @@ public class GenTestService : DbRepository, IGenTestService await InsertAsync(genTest);//插入数据 } - #endregion + #endregion 新增 #region 编辑 @@ -79,7 +82,7 @@ public class GenTestService : DbRepository, IGenTestService await UpdateAsync(genTest);//更新数据 } - #endregion + #endregion 编辑 #region 删除 @@ -101,11 +104,11 @@ public class GenTestService : DbRepository, IGenTestService ////写日志 //_logger.LogError(result.ErrorMessage, result.ErrorException); //throw Oops.Oh(ErrorCodeEnum.A0002); - //} + //} } } - #endregion + #endregion 删除 #region 导入导出 @@ -147,7 +150,7 @@ public class GenTestService : DbRepository, IGenTestService return result; } - #endregion + #endregion 导入导出 #region 方法 @@ -180,7 +183,7 @@ public class GenTestService : DbRepository, IGenTestService .WhereIF(!string.IsNullOrWhiteSpace(input.Name), it => it.Name.Contains(input.Name.Trim())) .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.CreateOrgId))//根据机构ID查询 - //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 + //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") .OrderBy(it => it.SortCode);//排序 @@ -194,5 +197,5 @@ public class GenTestService : DbRepository, IGenTestService return data; } - #endregion + #endregion 方法 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs index 7e846ea..d035208 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/IGenTestService.cs @@ -1,5 +1,10 @@ -using Furion.DependencyInjection; -using SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Application; @@ -31,7 +36,7 @@ public interface IGenTestService : ITransient /// 详细信息 Task Detail(BaseIdInput input); - #endregion + #endregion 查询 #region 新增 @@ -42,7 +47,7 @@ public interface IGenTestService : ITransient /// Task Add(GenTestAddInput input); - #endregion + #endregion 新增 #region 编辑 @@ -53,7 +58,7 @@ public interface IGenTestService : ITransient /// Task Edit(GenTestEditInput input); - #endregion + #endregion 编辑 #region 删除 @@ -64,7 +69,7 @@ public interface IGenTestService : ITransient /// Task Delete(BaseIdListInput input); - #endregion + #endregion 删除 #region 导入导出 @@ -96,5 +101,5 @@ public interface IGenTestService : ITransient /// Task Export(GenTestPageInput input); - #endregion + #endregion 导入导出 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs index c3e0e5c..5ee53c0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/IOrgService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 机构服务 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs index c9227b3..686c48e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// public class OrgService : DbRepository, IOrgService diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs index b3502a6..4cfd2fa 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/IPositionService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 岗位管理 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs index 79c11e0..b8bc8fe 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserInput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserInput.cs index 30d3891..5598335 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 业务用户导入 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserOutput.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserOutput.cs index 613c09f..618d485 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/Dto/UserOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 业务用户导出 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs index 39656bf..d20e0a0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/IUserService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// 人员管理服务 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs index fc62736..cb2defe 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Application/Startup.cs index 03a27da..4d8e5e4 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Startup.cs @@ -1,4 +1,10 @@ -using System.Reflection; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Application; @@ -26,4 +32,4 @@ public class Startup : AppStartup var settings = App.GetOptions(); CodeFirstUtils.CodeFirst(settings, fullName);//CodeFirst } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs b/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs index 05e3475..7fb374e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs +++ b/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Background; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Background; /// /// Mqtt连接 diff --git a/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs index 575db6c..85cd16c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs @@ -1 +1,10 @@ -global using SimpleMQTT; \ No newline at end of file +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using SimpleMQTT; +global using SimpleAdmin.Cache; diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Program.cs b/api/SimpleAdmin/SimpleAdmin.Background/Program.cs index 54d13f7..7ab9faa 100644 --- a/api/SimpleAdmin/SimpleAdmin.Background/Program.cs +++ b/api/SimpleAdmin/SimpleAdmin.Background/Program.cs @@ -1,3 +1,11 @@ +// SimpleAdmin Apache License Version 2.0 Э鷢ҵĿ²: +// 1.벻Ҫɾ޸ĸĿ¼µLICENSEļ +// 2.벻Ҫɾ޸SimpleAdminԴͷİȨ +// 3.ַԴʱע https://gitee.com/zxzyjs/SimpleAdmin +// 4.ڱƷֻʹ SimpleAdmin Ϊ̨񣬳ҲηַԴ +// 5.벻ýӦΣҰȫΪκʽڷǷΪĿĵΪҪɾ޸ +// 6.κλڱһзɾ׺Σ˾޹ء + try { Console.Title = "SimpleAdmin̨"; diff --git a/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs b/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs index 6620aba..3f74573 100644 --- a/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs +++ b/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs @@ -1,4 +1,12 @@ -using SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using NewLife.Caching; namespace SimpleAdmin.Background; @@ -7,14 +15,13 @@ public class TestWorker : BackgroundService private readonly ILogger _logger; private readonly ISimpleCacheService _simpleCacheService; - public TestWorker(ILogger logger, ISimpleCacheService simpleCacheService) + public TestWorker(ILogger logger, ISimpleCacheService simpleCacheService, ) { _logger = logger; - this._simpleCacheService = simpleCacheService; + _simpleCacheService = simpleCacheService; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs index 2a47eef..b04587f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// Redis常量 @@ -20,7 +28,6 @@ public class CacheConst /// public const string Cache_Hash = "Hash"; - /// /// 用户Token缓存Key /// diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Cache/GlobalUsing.cs index eefbe6d..7288a24 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/GlobalUsing.cs @@ -1,4 +1,12 @@ -global using Furion; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion; global using Masuit.Tools; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Hosting; diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheHashService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheHashService.cs index 66496b7..ad7f50d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheHashService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheHashService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// 缓存服务 diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheService.cs index 5f82485..6964e8a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Interface/ISimpleCacheService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// 缓存服务 diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Options/CacheSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Options/CacheSettingsOptions.cs index 7756de9..195b44c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Options/CacheSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Options/CacheSettingsOptions.cs @@ -1,4 +1,12 @@ -using Furion.ConfigurableOptions; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Furion.ConfigurableOptions; namespace SimpleAdmin.Cache; diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs index 9721502..ba84fab 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs index 908f820..7d13295 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs index e9be27a..aa76808 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs index fda5ae2..50046bd 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs index 5346ffb..b3ebf55 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Cache; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Cache; /// /// AppStartup启动类 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs index 0c9ad30..72d04cf 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 批量更新 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/CodeGenAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/CodeGenAttribute.cs index 616a15d..05c2aa0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/CodeGenAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/CodeGenAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 代码生成 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs index b1a257f..1da09bb 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core { /// /// 忽略初始化表 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreSeedDataAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreSeedDataAttribute.cs index 015c670..7bd373f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreSeedDataAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreSeedDataAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 种子数据忽略新增 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/RolePermissionAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/RolePermissionAttribute.cs index 47b1a59..cd90bc9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/RolePermissionAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/RolePermissionAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 需要角色授权权限 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/SuperAdminAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/SuperAdminAttribute.cs index 86f9893..4afde29 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/SuperAdminAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/SuperAdminAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 管理员才能访问特性 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs index 47498e4..2b2d8a1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 验证Id不能为 空 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseFileInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseFileInput.cs index d30e9cc..7b377c1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseFileInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseFileInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 文件上传输入参数 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs index c9a0e6f..56a9c99 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BaseIdInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 主键Id输入参数 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs index dfa9d36..9b501dd 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 全局分页查询输入参数 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseOutput/BaseSelectorOutput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseOutput/BaseSelectorOutput.cs index faffb79..4a7ac1b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseOutput/BaseSelectorOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseOutput/BaseSelectorOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 基础选择器输出 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/GzipCompressionComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/GzipCompressionComponent.cs index 9376d42..e8a9e89 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/GzipCompressionComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/GzipCompressionComponent.cs @@ -1,5 +1,10 @@ -using Microsoft.AspNetCore.ResponseCompression; -using System.IO.Compression; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core; @@ -19,8 +24,8 @@ public sealed class GzipCompressionComponent : IServiceComponent options.Providers.Add(); options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] { - "text/html; charset=utf-8", "application/xhtml+xml", "application/atom+xml", "image/svg+xml" + "text/html; charset=utf-8", "application/xhtml+xml", "application/atom+xml", "image/svg+xml" }); }); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs index 745846a..fd8959c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 日志写入文件的组件 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs index 54c2510..bec7f12 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs @@ -1,4 +1,10 @@ -using Microsoft.Extensions.Logging; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core; @@ -10,7 +16,6 @@ public sealed class LoggingFileComponent : IServiceComponent private readonly LoggingSetting _loggingSetting = App.GetConfig("Logging", true); private readonly string _monitorName = "System.Logging.LoggingMonitor"; - public void Load(IServiceCollection services, ComponentContext componentContext) { //获取默认日志等级 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs index 81e6a6b..d1da4da 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 授权用户常量 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs index 60e78c1..fce25d1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; public class SimpleAdminConst { diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Core.Development.json b/api/SimpleAdmin/SimpleAdmin.Core/Core.Development.json index 96cbe77..da69914 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Core.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.Core/Core.Development.json @@ -22,4 +22,4 @@ "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" } } -} +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Core.Production.json b/api/SimpleAdmin/SimpleAdmin.Core/Core.Production.json index a3c26d3..33595b5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Core.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.Core/Core.Production.json @@ -22,4 +22,4 @@ "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information" } } -} +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Dto/MqttMessage.cs b/api/SimpleAdmin/SimpleAdmin.Core/Dto/MqttMessage.cs index a12464b..3a034d9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Dto/MqttMessage.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Dto/MqttMessage.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// mqtt消息 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Dto/TokenInfo.cs b/api/SimpleAdmin/SimpleAdmin.Core/Dto/TokenInfo.cs index a333bb6..66a1abc 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Dto/TokenInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Dto/TokenInfo.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// Token信息 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs index 3f30a3c..4ad88d0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 登录设备类型枚举 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/LoginClientTypeEnum.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/LoginClientTypeEnum.cs index fa210a1..9b95eee 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/LoginClientTypeEnum.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/LoginClientTypeEnum.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 登录端类型枚举 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs index ff9d92f..f15c5f7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 通用错误码 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs b/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs index 4ef2fbe..0c3852c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core.Extension; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Extension; /// /// Linq扩展 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs b/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs index 95158ba..fa69fce 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs @@ -1,5 +1,10 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core { diff --git a/api/SimpleAdmin/SimpleAdmin.Core/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.Core/GlobalUsings.cs index 321abfb..2f4b547 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/GlobalUsings.cs @@ -1,4 +1,12 @@ -global using Furion; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion; global using Furion.DataValidation; global using Furion.DependencyInjection; global using Furion.FriendlyException; @@ -8,6 +16,7 @@ global using Microsoft.AspNetCore.Hosting; global using Microsoft.AspNetCore.Http; global using Microsoft.AspNetCore.Mvc; global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Logging; global using System; global using System.Collections.Generic; global using System.ComponentModel; @@ -17,4 +26,25 @@ global using System.Linq; global using System.Text; global using System.Threading.Tasks; global using Yitter.IdGenerator; -global using Microsoft.Extensions.Logging; \ No newline at end of file +global using Microsoft.AspNetCore.ResponseCompression; +global using System.IO.Compression; +global using Newtonsoft.Json; +global using Newtonsoft.Json.Linq; +global using Furion.UnifyResult; +global using Microsoft.AspNetCore.Mvc.Filters; +global using Lazy.Captcha.Core; +global using Lazy.Captcha.Core.Generator.Image; +global using Lazy.Captcha.Core.Generator.Image.Option; +global using Org.BouncyCastle.Utilities.Encoders; +global using Org.BouncyCastle.Crypto.Digests; +global using Org.BouncyCastle.Crypto.Generators; +global using Org.BouncyCastle.Crypto.Parameters; +global using Org.BouncyCastle.Math; +global using Org.BouncyCastle.Math.EC; +global using Org.BouncyCastle.Security; +global using SkiaSharp; +global using System.Drawing; +global using System.Drawing.Drawing2D; +global using ICSharpCode.SharpZipLib.Checksum; +global using ICSharpCode.SharpZipLib.Zip; +global using System.Net; diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Options/BaseOptions.cs b/api/SimpleAdmin/SimpleAdmin.Core/Options/BaseOptions.cs index 54643b9..15b8bf9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Options/BaseOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Options/BaseOptions.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 默认业务配置 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Options/LoggingSetting.cs b/api/SimpleAdmin/SimpleAdmin.Core/Options/LoggingSetting.cs index b8f0ebb..61e1b53 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Options/LoggingSetting.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Options/LoggingSetting.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 日志配置 @@ -15,7 +23,6 @@ public class LoggingSetting /// public bool MessageFormat { get; set; } - /// /// 日志等级 /// @@ -37,7 +44,6 @@ public class LoggingSetting public bool Console { get; set; } } - /// /// 日志等级 /// diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs index 6e1baea..004bfed 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Startup.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// AppStartup启动类 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResult.cs b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResult.cs index 90a68f6..836003a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResult.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResult.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core; /// /// 全局返回结果 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs index a81cca8..c3eccc1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs @@ -1,12 +1,17 @@ -using Furion.UnifyResult; -using Microsoft.AspNetCore.Mvc.Filters; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core; /// /// 规范化RESTful风格返回值 /// -[SuppressSniffer, UnifyModel(typeof(SimpleAdminResult<>))] +[SuppressSniffer][UnifyModel(typeof(SimpleAdminResult<>))] public class SimpleAdminResultProvider : IUnifyResultProvider { /// @@ -94,4 +99,4 @@ public class SimpleAdminResultProvider : IUnifyResultProvider Time = DateTime.Now }; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaInfo.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaInfo.cs index 3dc42d4..e432a01 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaInfo.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core.Utils; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// 验证码信息 @@ -13,7 +21,7 @@ public class CaptchaInfo /// /// 验证码数据流 /// - public byte[] Image { get; set; } + public byte[] Image { get; set; } /// /// base64 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs index 5efa057..2fb2cbc 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core.Utils; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// 验证码类型 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs index f83417a..33ce408 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs @@ -1,7 +1,10 @@ -using Lazy.Captcha.Core.Generator.Image.Option; -using Lazy.Captcha.Core.Generator.Image; -using Lazy.Captcha.Core; -using SkiaSharp; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -19,7 +22,8 @@ public static class CaptchaUtil /// 字体大小 /// 类型 0:数字 1:字符 2:计算 /// - public static CaptchaInfo CreateCaptcha(CaptchaType type = CaptchaType.CHAR, int length = 4, int width = 170, int heigh = 50, int fontSize = 20) + public static CaptchaInfo CreateCaptcha(CaptchaType type = CaptchaType.CHAR, int length = 4, int width = 170, + int heigh = 50, int fontSize = 20) { //初始化验证码 string charCode; @@ -133,4 +137,4 @@ public static class CaptchaUtil } return checkCode; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/CommonUtils.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/CommonUtils.cs index 0a91de0..0aeba3e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/CommonUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/CommonUtils.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core.Utils; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// 公共功能 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs index 77fbb68..603951e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core.Utils; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// 加解密功能 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM2Util.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM2Util.cs index 0aa9eab..056aadd 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM2Util.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM2Util.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core.Utils; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// SM2加密解密 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM4Util.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM4Util.cs index e9d310e..cdeb8d1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM4Util.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/SM4Util.cs @@ -1,4 +1,10 @@ -using Org.BouncyCastle.Utilities.Encoders; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -57,14 +63,14 @@ public class SM4Util /// public static string EncryptECB(SM4Util entity) { - Sm4Context ctx = new Sm4Context + var ctx = new Sm4Context { IsPadding = true }; - byte[] keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); - SM4CryptoUtil sm4 = new SM4CryptoUtil(); + var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); + var sm4 = new SM4CryptoUtil(); sm4.SetKeyEnc(ctx, keyBytes); - byte[] encrypted = sm4.Sm4CryptEcb(ctx, Encoding.Default.GetBytes(entity.Data)); + var encrypted = sm4.Sm4CryptEcb(ctx, Encoding.Default.GetBytes(entity.Data)); return Encoding.Default.GetString(Hex.Encode(encrypted)); } @@ -75,15 +81,15 @@ public class SM4Util /// public static string EncryptCBC(SM4Util entity) { - Sm4Context ctx = new Sm4Context + var ctx = new Sm4Context { IsPadding = true }; - byte[] keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); - byte[] ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); - SM4CryptoUtil sm4 = new SM4CryptoUtil(); + var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); + var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); + var sm4 = new SM4CryptoUtil(); sm4.SetKeyEnc(ctx, keyBytes); - byte[] encrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Encoding.Default.GetBytes(entity.Data)); + var encrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Encoding.Default.GetBytes(entity.Data)); return Convert.ToBase64String(encrypted); } @@ -108,15 +114,15 @@ public class SM4Util /// public static string DecryptECB(SM4Util entity) { - Sm4Context ctx = new Sm4Context + var ctx = new Sm4Context { IsPadding = true, Mode = 0 }; - byte[] keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); - SM4CryptoUtil sm4 = new SM4CryptoUtil(); + var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); + var sm4 = new SM4CryptoUtil(); sm4.Sm4SetKeyDec(ctx, keyBytes); - byte[] decrypted = sm4.Sm4CryptEcb(ctx, Hex.Decode(entity.Data)); + var decrypted = sm4.Sm4CryptEcb(ctx, Hex.Decode(entity.Data)); return Encoding.Default.GetString(decrypted); } @@ -127,16 +133,16 @@ public class SM4Util /// public static string DecryptCBC(SM4Util entity) { - Sm4Context ctx = new Sm4Context + var ctx = new Sm4Context { IsPadding = true, Mode = 0 }; - byte[] keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); - byte[] ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); - SM4CryptoUtil sm4 = new SM4CryptoUtil(); + var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key); + var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv); + var sm4 = new SM4CryptoUtil(); sm4.Sm4SetKeyDec(ctx, keyBytes); - byte[] decrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Convert.FromBase64String(entity.Data)); + var decrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Convert.FromBase64String(entity.Data)); return Encoding.Default.GetString(decrypted); } @@ -159,4 +165,4 @@ public class SM4Util [Description("CBC模式")] CBC = 1 } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs index 1677227..5543a7b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs @@ -1,11 +1,10 @@ -using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.Crypto.Digests; -using Org.BouncyCastle.Crypto.Generators; -using Org.BouncyCastle.Crypto.Parameters; -using Org.BouncyCastle.Math; -using Org.BouncyCastle.Math.EC; -using Org.BouncyCastle.Security; -using Org.BouncyCastle.Utilities.Encoders; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -22,13 +21,13 @@ public class SM2CryptoUtil /// public static SM2Model GetKey() { - SM2 sm2 = SM2.Instance; - AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.GenerateKeyPair(); - ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private; - ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public; - BigInteger privateKey = ecpriv.D; - ECPoint publicKey = ecpub.Q; - SM2Model sM2Model = new SM2Model(); + var sm2 = SM2.Instance; + var key = sm2.ecc_key_pair_generator.GenerateKeyPair(); + var ecpriv = (ECPrivateKeyParameters)key.Private; + var ecpub = (ECPublicKeyParameters)key.Public; + var privateKey = ecpriv.D; + var publicKey = ecpub.Q; + var sM2Model = new SM2Model(); sM2Model.PrivateKey = Encoding.UTF8.GetString(Hex.Encode(privateKey.ToByteArray())).ToUpper(); sM2Model.PublicKey = Encoding.UTF8.GetString(Hex.Encode(publicKey.GetEncoded())).ToUpper(); return sM2Model; @@ -56,7 +55,7 @@ public class SM2CryptoUtil /// 公钥 /// 需要加密的值 /// - public static String Encrypt(byte[] publicKey, byte[] data) + public static string Encrypt(byte[] publicKey, byte[] data) { if (null == publicKey || publicKey.Length == 0) { @@ -67,23 +66,24 @@ public class SM2CryptoUtil return null; } - byte[] source = new byte[data.Length]; - Array.Copy(data, 0, source, 0, data.Length); + var source = new byte[data.Length]; + Array.Copy(data, 0, source, + 0, data.Length); - Cipher cipher = new Cipher(); - SM2 sm2 = SM2.Instance; + var cipher = new Cipher(); + var sm2 = SM2.Instance; - ECPoint userKey = sm2.ecc_curve.DecodePoint(publicKey); + var userKey = sm2.ecc_curve.DecodePoint(publicKey); - ECPoint c1 = cipher.Init_enc(sm2, userKey); + var c1 = cipher.Init_enc(sm2, userKey); cipher.Encrypt(source); - byte[] c3 = new byte[32]; + var c3 = new byte[32]; cipher.Dofinal(c3); - String sc1 = Encoding.UTF8.GetString(Hex.Encode(c1.GetEncoded())); - String sc2 = Encoding.UTF8.GetString(Hex.Encode(source)); - String sc3 = Encoding.UTF8.GetString(Hex.Encode(c3)); + var sc1 = Encoding.UTF8.GetString(Hex.Encode(c1.GetEncoded())); + var sc2 = Encoding.UTF8.GetString(Hex.Encode(source)); + var sc3 = Encoding.UTF8.GetString(Hex.Encode(c3)); return (sc1 + sc2 + sc3).ToUpper(); } @@ -121,20 +121,20 @@ public class SM2CryptoUtil return null; } - String data = Encoding.UTF8.GetString(Hex.Encode(encryptedData)); + var data = Encoding.UTF8.GetString(Hex.Encode(encryptedData)); - byte[] c1Bytes = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(0, 130))); - int c2Len = encryptedData.Length - 97; - byte[] c2 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130, 2 * c2Len))); - byte[] c3 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130 + 2 * c2Len, 64))); + var c1Bytes = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(0, 130))); + var c2Len = encryptedData.Length - 97; + var c2 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130, 2 * c2Len))); + var c3 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130 + 2 * c2Len, 64))); - SM2 sm2 = SM2.Instance; - BigInteger userD = new BigInteger(1, privateKey); + var sm2 = SM2.Instance; + var userD = new BigInteger(1, privateKey); //ECPoint c1 = sm2.ecc_curve.DecodePoint(c1Bytes); - ECPoint c1 = sm2.ecc_curve.DecodePoint(c1Bytes); - Cipher cipher = new Cipher(); + var c1 = sm2.ecc_curve.DecodePoint(c1Bytes); + var cipher = new Cipher(); cipher.Init_dec(userD, c1); cipher.Decrypt(c2); cipher.Dofinal(c3); @@ -155,9 +155,9 @@ public class SM2CryptoUtil public Cipher() { - this.ct = 1; - this.key = new byte[32]; - this.keyOff = 0; + ct = 1; + key = new byte[32]; + keyOff = 0; } public static byte[] byteConvert32Bytes(BigInteger n) @@ -171,7 +171,8 @@ public class SM2CryptoUtil if (n.ToByteArray().Length == 33) { tmpd = new byte[32]; - Array.Copy(n.ToByteArray(), 1, tmpd, 0, 32); + Array.Copy(n.ToByteArray(), 1, tmpd, + 0, 32); } else if (n.ToByteArray().Length == 32) { @@ -180,58 +181,59 @@ public class SM2CryptoUtil else { tmpd = new byte[32]; - for (int i = 0; i < 32 - n.ToByteArray().Length; i++) + for (var i = 0; i < 32 - n.ToByteArray().Length; i++) { tmpd[i] = 0; } - Array.Copy(n.ToByteArray(), 0, tmpd, 32 - n.ToByteArray().Length, n.ToByteArray().Length); + Array.Copy(n.ToByteArray(), 0, tmpd, + 32 - n.ToByteArray().Length, n.ToByteArray().Length); } return tmpd; } private void Reset() { - this.sm3keybase = new SM3Digest(); - this.sm3c3 = new SM3Digest(); + sm3keybase = new SM3Digest(); + sm3c3 = new SM3Digest(); - byte[] p = byteConvert32Bytes(p2.Normalize().XCoord.ToBigInteger()); - this.sm3keybase.BlockUpdate(p, 0, p.Length); - this.sm3c3.BlockUpdate(p, 0, p.Length); + var p = byteConvert32Bytes(p2.Normalize().XCoord.ToBigInteger()); + sm3keybase.BlockUpdate(p, 0, p.Length); + sm3c3.BlockUpdate(p, 0, p.Length); p = byteConvert32Bytes(p2.Normalize().YCoord.ToBigInteger()); - this.sm3keybase.BlockUpdate(p, 0, p.Length); - this.ct = 1; + sm3keybase.BlockUpdate(p, 0, p.Length); + ct = 1; NextKey(); } private void NextKey() { - SM3Digest sm3keycur = new SM3Digest(this.sm3keybase); + var sm3keycur = new SM3Digest(sm3keybase); sm3keycur.Update((byte)(ct >> 24 & 0xff)); sm3keycur.Update((byte)(ct >> 16 & 0xff)); sm3keycur.Update((byte)(ct >> 8 & 0xff)); sm3keycur.Update((byte)(ct & 0xff)); sm3keycur.DoFinal(key, 0); - this.keyOff = 0; - this.ct++; + keyOff = 0; + ct++; } public ECPoint Init_enc(SM2 sm2, ECPoint userKey) { - AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.GenerateKeyPair(); - ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private; - ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public; - BigInteger k = ecpriv.D; - ECPoint c1 = ecpub.Q; - this.p2 = userKey.Multiply(k); + var key = sm2.ecc_key_pair_generator.GenerateKeyPair(); + var ecpriv = (ECPrivateKeyParameters)key.Private; + var ecpub = (ECPublicKeyParameters)key.Public; + var k = ecpriv.D; + var c1 = ecpub.Q; + p2 = userKey.Multiply(k); Reset(); return c1; } public void Encrypt(byte[] data) { - this.sm3c3.BlockUpdate(data, 0, data.Length); - for (int i = 0; i < data.Length; i++) + sm3c3.BlockUpdate(data, 0, data.Length); + for (var i = 0; i < data.Length; i++) { if (keyOff == key.Length) { @@ -243,13 +245,13 @@ public class SM2CryptoUtil public void Init_dec(BigInteger userD, ECPoint c1) { - this.p2 = c1.Multiply(userD); + p2 = c1.Multiply(userD); Reset(); } public void Decrypt(byte[] data) { - for (int i = 0; i < data.Length; i++) + for (var i = 0; i < data.Length; i++) { if (keyOff == key.Length) { @@ -258,14 +260,14 @@ public class SM2CryptoUtil data[i] ^= key[keyOff++]; } - this.sm3c3.BlockUpdate(data, 0, data.Length); + sm3c3.BlockUpdate(data, 0, data.Length); } public void Dofinal(byte[] c3) { - byte[] p = byteConvert32Bytes(p2.Normalize().YCoord.ToBigInteger()); - this.sm3c3.BlockUpdate(p, 0, p.Length); - this.sm3c3.DoFinal(c3, 0); + var p = byteConvert32Bytes(p2.Normalize().YCoord.ToBigInteger()); + sm3c3.BlockUpdate(p, 0, p.Length); + sm3c3.DoFinal(c3, 0); Reset(); } } @@ -288,14 +290,15 @@ public class SM2CryptoUtil } } - public static readonly string[] sm2_param = { - "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",// p,0 - "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",// a,1 - "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",// b,2 - "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",// n,3 - "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",// gx,4 - "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0" // gy,5 - }; + public static readonly string[] sm2_param = + { + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",// p,0 + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",// a,1 + "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",// b,2 + "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",// n,3 + "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",// gx,4 + "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"// gy,5 + }; public string[] ecc_param = sm2_param; @@ -344,10 +347,10 @@ public class SM2CryptoUtil public virtual byte[] Sm2GetZ(byte[] userId, ECPoint userKey) { - SM3Digest sm3 = new SM3Digest(); + var sm3 = new SM3Digest(); byte[] p; // userId length - int len = userId.Length * 8; + var len = userId.Length * 8; sm3.Update((byte)(len >> 8 & 0x00ff)); sm3.Update((byte)(len & 0x00ff)); @@ -372,7 +375,7 @@ public class SM2CryptoUtil sm3.BlockUpdate(p, 0, p.Length); // Z - byte[] md = new byte[sm3.GetDigestSize()]; + var md = new byte[sm3.GetDigestSize()]; sm3.DoFinal(md, 0); return md; @@ -391,4 +394,4 @@ public class SM2CryptoUtil /// public string PrivateKey { get; set; } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs index 9812d3e..de95850 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core.Utils; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Utils; /// /// SM4工具类 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs index 8d9281d..b783fae 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs @@ -1,4 +1,10 @@ -using SkiaSharp; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -73,7 +79,8 @@ public static class AvatarUtil sKPaint.MeasureText(nameWritten, ref size);//计算文字宽度以及高度 var temp = (bmp.Width - size.Size.Width) / 2; var temp1 = (bmp.Height - size.Size.Height) / 2; - canvas.DrawText(nameWritten, temp, temp1 - size.Top, sKPaint);//画文字 + canvas.DrawText(nameWritten, temp, temp1 - size.Top, + sKPaint);//画文字 } } @@ -105,4 +112,4 @@ public static class AvatarUtil } #endregion 姓名生成图片处理 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs index 8b3ed92..5ff89e2 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs @@ -1,6 +1,10 @@ -using SkiaSharp; -using System.Drawing; -using System.Drawing.Drawing2D; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; @@ -45,7 +49,6 @@ public static class ImageUtil } } - /// /// base64转bitmap /// @@ -60,7 +63,6 @@ public static class ImageUtil return bitmap; } - /// /// base64转bitmap /// @@ -83,7 +85,6 @@ public static class ImageUtil return "data:image/png;base64," + base64string; } - /// /// 重新修改尺寸 /// @@ -118,7 +119,8 @@ public static class ImageUtil var g = Graphics.FromImage(b); g.InterpolationMode = InterpolationMode.HighQualityBicubic; //绘制图像 - g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); + g.DrawImage(imgToResize, 0, 0, + destWidth, destHeight); g.Dispose(); return b; } @@ -138,7 +140,9 @@ public static class ImageUtil var g = Graphics.FromImage(b); // 插值算法的质量 g.InterpolationMode = InterpolationMode.HighQualityBicubic; - g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel); + g.DrawImage(bmp, new Rectangle(0, 0, newW, + newH), new Rectangle(0, 0, bmp.Width, + bmp.Height), GraphicsUnit.Pixel); g.Dispose(); return b; } @@ -185,7 +189,8 @@ public static class ImageUtil { try { - var thumbnail = bmp.GetThumbnailImage(w, h, () => false, IntPtr.Zero); + var thumbnail = bmp.GetThumbnailImage(w, h, () => false, + IntPtr.Zero); return thumbnail; } catch (Exception ex) @@ -218,4 +223,4 @@ public static class ImageUtil return null; } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs index 27d7de7..9505e3b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs @@ -1,8 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs index 957da56..882c1c1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs @@ -1,6 +1,10 @@ -using ICSharpCode.SharpZipLib.Checksum; -using ICSharpCode.SharpZipLib.Zip; -using System.Net; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Core.Utils; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs index 6cbb857..a1632a7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Aop; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Aop; /// /// Aop diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Attributes/CacheAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Attributes/CacheAttribute.cs index f636672..76d48fa 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Attributes/CacheAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Attributes/CacheAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Aop; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Aop; /// /// 缓存结果特性 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/GlobalUsing.cs index 5e623d1..648faae 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/GlobalUsing.cs @@ -1,4 +1,12 @@ -global using Furion.DataEncryption; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion.DataEncryption; global using Furion.Reflection; global using Furion.Reflection.Extensions; global using Microsoft.Extensions.DependencyInjection; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs index a045e69..2067dcb 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Core; /// /// 通知组件类型 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs index 306646a..85368b0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs @@ -1 +1,9 @@ -global using Furion.DependencyInjection; \ No newline at end of file +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion.DependencyInjection; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs index 710944b..236bec1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Core; /// /// 通知服务 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs index c605386..3325fd4 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs @@ -1,4 +1,12 @@ -using Furion.ConfigurableOptions; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Furion.ConfigurableOptions; namespace SimpleAdmin.Plugin.Core; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs index 60941cd..d251bd5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Mqtt; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Mqtt; /// /// mqtt常量 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs index 7397b35..7b3d7ae 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs @@ -1,4 +1,10 @@ - +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 using Furion.DynamicApiController; @@ -38,7 +44,6 @@ public class MqttController : IDynamicApiController [NonUnify] public async Task Auth([FromBody] MqttAuthInput input) { - return await _mqttService.Auth(input); } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs index 1992ecd..df476cd 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs @@ -1,4 +1,12 @@ -global using Furion; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion; global using Furion.DependencyInjection; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Hosting; @@ -10,4 +18,4 @@ global using SimpleAdmin.SqlSugar; global using SimpleMQTT; global using Microsoft.AspNetCore.Authorization; global using Microsoft.AspNetCore.Mvc; -global using SimpleAdmin.System; +global using SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs index 8554148..00d5ac9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Mqtt; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Mqtt; /// /// mqtt组件 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs index b6a82b4..ea862ef 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Mqtt; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Mqtt; /// /// mqtt认证参数 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs index 962e601..f0131a3 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Mqtt; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Mqtt; /// /// mqtt登录参数输出 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs index aca239e..86e713a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Mqtt; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Mqtt; /// ///Mqtt服务 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs index 3828deb..e72f458 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs @@ -1,4 +1,12 @@ -using Furion.DataEncryption; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Furion.DataEncryption; using Microsoft.AspNetCore.Http; using SimpleTool; @@ -28,11 +36,11 @@ public class MqttService : IMqttService //获取mqtt配置 var mqttconfig = await _configService.GetListByCategory(CateGoryConst.Config_MQTT_BASE); //地址 - var url = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault(); + var url = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault(); //用户名 - var userName = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_USERNAME).Select(it => it.ConfigValue).FirstOrDefault(); + var userName = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_USERNAME).Select(it => it.ConfigValue).FirstOrDefault(); //密码 - var password = mqttconfig.Where(it => it.ConfigKey == DevConfigConst.MQTT_PARAM_PASSWORD).Select(it => it.ConfigValue).FirstOrDefault(); + var password = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_PASSWORD).Select(it => it.ConfigValue).FirstOrDefault(); #region 用户名特殊处理 @@ -77,8 +85,4 @@ public class MqttService : IMqttService } return mqttAuthOutput; } - - #region 方法 - - #endregion 方法 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs index 400533a..26fad00 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.Mqtt; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.Mqtt; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs index d97fa4a..1adbb98 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs @@ -1,7 +1,20 @@ -global using Furion; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion; global using Furion.DependencyInjection; global using Microsoft.AspNetCore.SignalR; global using Microsoft.Extensions.DependencyInjection; -global using SimpleAdmin.Core; global using SimpleAdmin.Cache; -global using SimpleAdmin.Plugin.Core; \ No newline at end of file +global using SimpleAdmin.Core; +global using SimpleAdmin.Plugin.Core; +global using Furion.InstantMessaging; +global using Masuit.Tools; +global using Microsoft.AspNetCore.Authorization; +global using Furion.DataEncryption; +global using SimpleTool; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs index 37d306a..6030900 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.SignalR; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.SignalR; /// /// 即时通讯集线器 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs index c76457a..e9dba3b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs @@ -1,7 +1,10 @@ -using Furion.InstantMessaging; -using Masuit.Tools; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http.Connections; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Plugin.SignalR; @@ -98,4 +101,4 @@ public class SimpleHub : Hub } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs index 889c563..fae491d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs @@ -1,5 +1,10 @@ -using Furion.DataEncryption; -using SimpleTool; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Plugin.SignalR; @@ -18,4 +23,4 @@ public class UserIdProvider : IUserIdProvider else return connection.ConnectionId; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs index ff6f1b8..acee4e4 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.SignalR; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.SignalR; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs index 9231afd..0dd371d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Plugin.SignalR; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Plugin.SignalR; /// /// SignalR组件 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs index dcd8970..655babc 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 分类常量 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevLogConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevLogConst.cs deleted file mode 100644 index 7fde88f..0000000 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevLogConst.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace SimpleAdmin.SqlSugar; - -/// -/// 日志常量 -/// -public class DevLogConst -{ - /// - /// 成功 - /// - public const string SUCCESS = "SUCCESS"; - - /// - /// 成功 - /// - public const string FAIL = "FAIL"; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs index 39a4d85..0bd4279 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 前端控件作用类型常量 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs index ca34f61..b1bb3cb 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 资源表常量 @@ -20,12 +28,16 @@ public class ResourceConst /// public const string IFRAME = "IFRAME"; + /// + /// 目录 + /// + public const string SUBSET = "SUBSET"; + /// /// 外链 /// public const string LINK = "LINK"; - /// /// 单页 /// diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs index 6f0337b..0e51e36 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 角色常量 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs index 894dd0a..fe6f60e 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// Sqlsugar系统常量类 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevConfigConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysConfigConst.cs similarity index 81% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevConfigConst.cs rename to api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysConfigConst.cs index 0b2ae5e..256da53 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevConfigConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysConfigConst.cs @@ -1,9 +1,17 @@ +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + namespace SimpleAdmin.SqlSugar; /// /// 系统配置常量 /// -public class DevConfigConst +public class SysConfigConst { /// /// 系统默认工作台 @@ -32,7 +40,6 @@ public class DevConfigConst /// public const string LOGIN_ERROR_LOCK = "LOGIN_ERROR_LOCK"; - /// /// 登录错误锁定时长 /// @@ -43,7 +50,7 @@ public class DevConfigConst /// public const string LOGIN_ERROR_COUNT = "LOGIN_ERROR_COUNT"; - #endregion + #endregion 登录策略 #region 密码策略 @@ -92,7 +99,7 @@ public class DevConfigConst /// public const string PWD_CONTAIN_CHARACTER = "PWD_CONTAIN_UPPER"; - #endregion + #endregion 密码策略 #region MQTT diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevDictConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysDictConst.cs similarity index 56% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevDictConst.cs rename to api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysDictConst.cs index f024785..e210f6d 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/DevDictConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysDictConst.cs @@ -1,9 +1,17 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 字典常量 /// -public class DevDictConst +public class SysDictConst { #region 系统字典 @@ -27,8 +35,6 @@ public class DevDictConst /// public const string CULTURE_LEVEL = "CULTURE_LEVEL"; - - #region 系统通用状态 /// @@ -71,5 +77,19 @@ public class DevDictConst #endregion 上传文件引擎 + #region 系统字典分类 + + /// + /// 系统 + /// + public const string DICT_CATEGORY_FRM = "FRM"; + + /// + /// 业务 + /// + public const string DICT_CATEGORY_BIZ = "FRM"; + + #endregion 系统字典分类 + #endregion 系统字典 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysLogConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysLogConst.cs new file mode 100644 index 0000000..d2924a4 --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysLogConst.cs @@ -0,0 +1,25 @@ +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; + +/// +/// 日志常量 +/// +public class SysLogConst +{ + /// + /// 成功 + /// + public const string SUCCESS = "SUCCESS"; + + /// + /// 成功 + /// + public const string FAIL = "FAIL"; +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs index be5da9d..25b1307 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 数据库上下文对象 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs index d5aa0d5..571d863 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 仓储模式对象 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs index 11ad5bd..f38a281 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// sqlsugar数据库配置 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs index 2f57056..f670735 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Dto/LinqPagedList.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// Linq分页泛型集合 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs index 90bad68..7458002 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 主键实体基类 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/ISqlSugarEntitySeedData.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/ISqlSugarEntitySeedData.cs index 95fc54a..8779c47 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/ISqlSugarEntitySeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/ISqlSugarEntitySeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 实体种子数据接口 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs index 2e9ae6d..368d898 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs @@ -1,4 +1,10 @@ -using Masuit.Tools.Models; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.SqlSugar; @@ -186,4 +192,4 @@ public class SqlSugarPagedList /// 是否有下一页 /// public bool HasNextPages { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarUnitOfWork.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarUnitOfWork.cs index db208af..e409616 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarUnitOfWork.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarUnitOfWork.cs @@ -1,5 +1,10 @@ -using Furion.DatabaseAccessor; -using Microsoft.AspNetCore.Mvc.Filters; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.SqlSugar; @@ -69,4 +74,4 @@ public sealed class SqlSugarUnitOfWork : IUnitOfWork { _sqlSugarClient.Dispose(); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/GlobalUsing.cs index 243ed79..919d346 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/GlobalUsing.cs @@ -1,4 +1,12 @@ -global using Furion; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion; global using Furion.DependencyInjection; global using Furion.FriendlyException; global using Mapster; @@ -8,12 +16,14 @@ global using Microsoft.AspNetCore.Hosting; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Hosting; global using Microsoft.Extensions.Logging; +global using NewLife.Serialization; global using SimpleAdmin.Core; global using SimpleAdmin.Core.Utils; -global using SimpleAdmin.SqlSugar; global using SimpleTool; global using SqlSugar; global using System.Data; global using System.Linq.Expressions; global using System.Reflection; -global using NewLife.Serialization; \ No newline at end of file +global using Masuit.Tools.Models; +global using Furion.DatabaseAccessor; +global using Microsoft.AspNetCore.Mvc.Filters; diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 6a33e95..30ab243 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -209,339 +209,354 @@ 公告 - + - 系统配置常量 + 前端控件作用类型常量 - + - 系统默认工作台 + 输入框 - + - 登录验证码开关 + 文本框 - + - 登录验证码开关 + 下拉框 - + - 单用户登录开关 + 单选框 - + - 登录错误锁定时长 + 复选框 - + - 登录错误锁定时长 + 日期选择器 - + - 登录错误次数 + 时间选择器 - + - 默认用户密码 + 数字输入框 - + - 密码定期提醒更新 + 滑动数字条 - + - 密码定期提醒更新时间 + 下拉框 - + - 修改初始密码提醒 + 资源表常量 - + - 密码最小长度 + 目录 - + - 包含数字 + 组件 - + - 包含小写字母 + 内链 - + - 包含大写字母 + 目录 - + - 包含特殊字符 + 外链 - + - mqtt连接地址 + 单页 - + - mqtt连接用户名 + 系统内置单页面编码 - + - mqtt连接密码 + 角色常量 - + - windows系统本地目录 + 超级管理员 - + - Unix系统本地目录 + 业务管理员 - + - MINIO文件AccessKey + Sqlsugar系统常量类 - + - MINIO文件SecetKey + 默认库ConfigId - + - MINIO文件EndPoint + 默认表主键 - + - MINIO文件默认存储桶 + varchar(max) - + - 字典常量 + mysql的longtext - + - 性别 + sqlite的text - + - 名族 + 系统配置常量 - + - 用户证件类型 + 系统默认工作台 - + - 通用文化程度 + 登录验证码开关 - + - 启用 + 登录验证码开关 - + - 停用 + 单用户登录开关 - + - 在线 + 登录错误锁定时长 - + - 离线 + 登录错误锁定时长 - + - 本地 + 登录错误次数 - + - MINIO + 默认用户密码 - + - 日志常量 + 密码定期提醒更新 - + - 成功 + 密码定期提醒更新时间 - + - 成功 + 修改初始密码提醒 - + - 前端控件作用类型常量 + 密码最小长度 - + - 输入框 + 包含数字 - + - 文本框 + 包含小写字母 - + - 下拉框 + 包含大写字母 - + - 单选框 + 包含特殊字符 - + - 复选框 + mqtt连接地址 - + - 日期选择器 + mqtt连接用户名 - + - 时间选择器 + mqtt连接密码 - + - 数字输入框 + windows系统本地目录 - + - 滑动数字条 + Unix系统本地目录 - + - 下拉框 + MINIO文件AccessKey - + - 资源表常量 + MINIO文件SecetKey - + - 目录 + MINIO文件EndPoint - + - 组件 + MINIO文件默认存储桶 - + - 内链 + 字典常量 - + - 外链 + 性别 - + - 单页 + 名族 - + - 系统内置单页面编码 + 用户证件类型 - + - 角色常量 + 通用文化程度 - + - 超级管理员 + 启用 - + - 业务管理员 + 停用 - + - Sqlsugar系统常量类 + 在线 - + - 默认库ConfigId + 离线 - + - 默认表主键 + 本地 - + - varchar(max) + MINIO - + - mysql的longtext + 系统 - + - sqlite的text + 业务 + + + + + 日志常量 + + + + + 成功 + + + + + 成功 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs index 4f5156a..a433e85 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs @@ -1,4 +1,10 @@ -using System.Collections; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.SqlSugar; diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs index 20e6c83..3ce2c36 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs @@ -1,4 +1,11 @@ -using NewLife.Serialization; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + using System.Collections; namespace SimpleAdmin.SqlSugar; @@ -26,7 +33,6 @@ public static class CodeFirstUtils } } - /// /// 初始化数据库表结构 /// @@ -51,8 +57,6 @@ public static class CodeFirstUtils } } - - /// /// 初始化种子数据 /// @@ -99,9 +103,6 @@ public static class CodeFirstUtils } } - - - /// /// 判断类型是否实现某个泛型 /// @@ -184,7 +185,6 @@ public static class CodeFirstUtils return sc != null; } - private static bool IsJsonColumn(PropertyInfo pi) { var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsJson == true); diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs index 5f5f7cd..420bc08 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// Sqlsugar表信息 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs index b9b4f0a..3ed0f03 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// Sqlsugar字段信息 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs index ad12ac5..aeb822d 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// 种子数据工具类 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs index b9dcdb2..22233a1 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.SqlSugar; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.SqlSugar; /// /// Sqlusgar通用功能 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs b/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs index 60ec6e0..ab0c1a4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 前端表格特性 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs b/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs index 75e9a1a..d75f307 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 验证值是否在字典中,大数据慎用 @@ -26,10 +34,10 @@ public class InDictAttribute : ValidationAttribute { switch (DictValue) { - case DevDictConst.GENDER: + case SysDictConst.GENDER: return "性别只能是男和女"; - case DevDictConst.NATION: + case SysDictConst.NATION: return "不存在的民族"; default: diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs index 28430aa..5dd432a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 系统层常量 @@ -8,7 +16,7 @@ public class SystemConst /// /// 系统配置表缓存Key /// - public const string Cache_DevConfig = CacheConst.Cache_Prefix_Web + "DevConfig:"; + public const string Cache_DevConfig = CacheConst.Cache_Prefix_Web + "SysConfig:"; /// /// 登录验证码缓存Key @@ -38,7 +46,7 @@ public class SystemConst /// /// 字典表缓存Key /// - public const string Cache_DevDict = CacheConst.Cache_Prefix_Web + "DevDict"; + public const string Cache_DevDict = CacheConst.Cache_Prefix_Web + "SysDict"; /// /// 关系表缓存Key @@ -68,5 +76,5 @@ public class SystemConst /// public const string Cache_LoginErrorCount = CacheConst.Cache_Prefix_Web + "LoginErrorCount:"; - #endregion + #endregion 登录错误次数 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs index 1851c36..85a4de4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量修改 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs index d753da3..c1b4076 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量修改配置表 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs index ddca066..8928136 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Core.Entity.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Core.Entity.System; /// /// C端用户关系 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs index 7e7dbfa..214d233 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// C端用户 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/DevRelation.cs deleted file mode 100644 index 47baea9..0000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevRelation.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 开发关系表 -/// -[SugarTable("dev_relation", TableDescription = "开发关系表")] -[Tenant(SqlsugarConst.DB_Default)] -public class DevRelation : SysRelation -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevConfig.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs similarity index 52% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevConfig.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs index a0a629a..5f6514c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs @@ -1,11 +1,19 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 配置 /// -[SugarTable("dev_config", TableDescription = "配置")] +[SugarTable("sys_config", TableDescription = "配置")] [Tenant(SqlsugarConst.DB_Default)] -public class DevConfig : BaseEntity +public class SysConfig : BaseEntity { /// /// 配置键 @@ -28,7 +36,8 @@ public class DevConfig : BaseEntity /// /// 备注 /// - [SugarColumn(ColumnName = "Remark", ColumnDescription = "备注", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Remark", ColumnDescription = "备注", Length = 200, + IsNullable = true)] public string Remark { get; set; } /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevDict.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs similarity index 47% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevDict.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs index dee0e87..2940d8e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevDict.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs @@ -1,11 +1,19 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 字典 /// -[SugarTable("dev_dict", TableDescription = "字典表")] +[SugarTable("sys_dict", TableDescription = "字典表")] [Tenant(SqlsugarConst.DB_Default)] -public class DevDict : BaseEntity +public class SysDict : BaseEntity { /// /// 父id @@ -29,7 +37,7 @@ public class DevDict : BaseEntity /// 分类 /// [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200)] - public string Category { get; set; } + public virtual string Category { get; set; } /// /// 排序码 @@ -37,9 +45,15 @@ public class DevDict : BaseEntity [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码")] public int SortCode { get; set; } + /// + /// 状态 + /// + [SugarColumn(ColumnName = "Status", ColumnDescription = "状态", Length = 200)] + public virtual string Status { get; set; } + /// /// 子节点 /// [SugarColumn(IsIgnore = true)] - public List Children { get; set; } + public List Children { get; set; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevFile.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs similarity index 67% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevFile.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs index acd4881..c75351b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevFile.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs @@ -1,11 +1,19 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 文件表 /// -[SugarTable("dev_file", TableDescription = "文件表")] +[SugarTable("sys_file", TableDescription = "文件表")] [Tenant(SqlsugarConst.DB_Default)] -public class DevFile : DataEntityBase +public class SysFile : DataEntityBase { /// /// 存储引擎 @@ -64,6 +72,7 @@ public class DevFile : DataEntityBase /// /// 图片缩略图 /// - [SugarColumn(ColumnName = "Thumbnail", ColumnDescription = "图片缩略图", IsNullable = true, ColumnDataType = StaticConfig.CodeFirst_BigString)] + [SugarColumn(ColumnName = "Thumbnail", ColumnDescription = "图片缩略图", IsNullable = true, + ColumnDataType = StaticConfig.CodeFirst_BigString)] public string Thumbnail { get; set; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogOperate.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs similarity index 50% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogOperate.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs index 035b45f..a5fa92c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogOperate.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs @@ -1,16 +1,25 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 操作日志表 /// -[SugarTable("dev_log_operate", TableDescription = "操作日志表")] +[SugarTable("sys_log_operate", TableDescription = "操作日志表")] [Tenant(SqlsugarConst.DB_Default)] -public class DevLogOperate : DevLogVisit +public class SysLogOperate : SysLogVisit { /// /// 具体消息 /// - [SugarColumn(ColumnName = "ExeMessage", ColumnDescription = "具体消息", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "ExeMessage", ColumnDescription = "具体消息", + ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] public string ExeMessage { get; set; } /// @@ -28,24 +37,28 @@ public class DevLogOperate : DevLogVisit /// /// 请求方式 /// - [SugarColumn(ColumnName = "ReqMethod", ColumnDescription = "请求方式", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "ReqMethod", ColumnDescription = "请求方式", Length = 200, + IsNullable = true)] public string ReqMethod { get; set; } /// /// 请求地址 /// - [SugarColumn(ColumnName = "ReqUrl", ColumnDescription = "请求地址", ColumnDataType = StaticConfig.CodeFirst_BigString)] + [SugarColumn(ColumnName = "ReqUrl", ColumnDescription = "请求地址", + ColumnDataType = StaticConfig.CodeFirst_BigString)] public string ReqUrl { get; set; } /// /// 请求参数 /// - [SugarColumn(ColumnName = "ParamJson", ColumnDescription = "请求参数", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "ParamJson", ColumnDescription = "请求参数", + ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] public string ParamJson { get; set; } /// /// 返回结果 /// - [SugarColumn(ColumnName = "ResultJson", ColumnDescription = "返回结果", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "ResultJson", ColumnDescription = "返回结果", + ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] public string ResultJson { get; set; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogVisit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs similarity index 65% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogVisit.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs index 2cf1821..486804c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevLogVisit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs @@ -1,11 +1,19 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 访问日志表 /// -[SugarTable("dev_log_visit", TableDescription = "访问日志表")] +[SugarTable("sys_log_visit", TableDescription = "访问日志表")] [Tenant(SqlsugarConst.DB_Default)] -public class DevLogVisit : BaseEntity +public class SysLogVisit : BaseEntity { /// /// 日志分类 @@ -58,12 +66,14 @@ public class DevLogVisit : BaseEntity /// /// 操作人姓名 /// - [SugarColumn(ColumnName = "OpUser", ColumnDescription = "操作人姓名", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "OpUser", ColumnDescription = "操作人姓名", Length = 200, + IsNullable = true)] public string OpUser { get; set; } /// /// 操作人姓名 /// - [SugarColumn(ColumnName = "OpAccount", ColumnDescription = "操作人账号", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "OpAccount", ColumnDescription = "操作人账号", Length = 200, + IsNullable = true)] public string OpAccount { get; set; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessage.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs similarity index 48% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessage.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs index 46dbe45..454f7f0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessage.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs @@ -1,11 +1,19 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 站内信 /// -[SugarTable("dev_message", TableDescription = "站内信")] +[SugarTable("sys_message", TableDescription = "站内信")] [Tenant(SqlsugarConst.DB_Default)] -public class DevMessage : BaseEntity +public class SysMessage : BaseEntity { /// /// 分类 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessageUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs similarity index 42% rename from api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessageUser.cs rename to api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs index 02a2230..35e8b9f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/DevMessageUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs @@ -1,11 +1,19 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户消息表 /// -[SugarTable("dev_message_user", TableDescription = "用户消息表")] +[SugarTable("sys_message_user", TableDescription = "用户消息表")] [Tenant(SqlsugarConst.DB_Default)] -public class DevMessageUser : BaseEntity +public class SysMessageUser : BaseEntity { /// /// 消息Id diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs index e6be1f6..32e1263 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 组织 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs index 3afe43f..f9bc15d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 职位表 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs index 573650d..e4719aa 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 系统关系表 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs index 46b6ca5..f428bbb 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 资源 @@ -22,31 +30,24 @@ public class SysResource : BaseEntity /// /// 别名 /// - [SugarColumn(ColumnName = "Name", ColumnDescription = "别名", Length = 200, + [SugarColumn(ColumnName = "Name", ColumnDescription = "别名", Length = 200 + , IsNullable = true)] public string Name { get; set; } /// - /// 别名 + /// 描述 /// - [SugarColumn(ColumnName = "Description", ColumnDescription = "描述", Length = 200, + [SugarColumn(ColumnName = "Description", ColumnDescription = "描述", Length = 200 + , IsNullable = true)] public string Description { get; set; } - - /// - /// 别名 - /// - [SugarColumn(ColumnName = "Avatar", ColumnDescription = "头像", - ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] - public string Avatar { get; set; } - - - /// /// 编码 /// - [SugarColumn(ColumnName = "Code", ColumnDescription = "编码", Length = 200, + [SugarColumn(ColumnName = "Code", ColumnDescription = "编码", Length = 200 + , IsNullable = true)] public virtual string Code { get; set; } @@ -65,8 +66,7 @@ public class SysResource : BaseEntity /// /// 菜单类型 /// - [SugarColumn(ColumnName = "MenuType", ColumnDescription = "菜单类型", Length = 200, - IsNullable = true)] + [SugarColumn(ColumnName = "MenuType", ColumnDescription = "菜单类型", Length = 200, IsNullable = true)] public virtual string MenuType { get; set; } /// @@ -78,8 +78,7 @@ public class SysResource : BaseEntity /// /// 组件 /// - [SugarColumn(ColumnName = "Component", ColumnDescription = "组件", Length = 200, - IsNullable = true)] + [SugarColumn(ColumnName = "Component", ColumnDescription = "组件", Length = 200, IsNullable = true)] public string Component { get; set; } /// @@ -96,17 +95,15 @@ public class SysResource : BaseEntity Length = 200, IsNullable = true)] public string ActiveMenu { get; set; } - /// - /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) /// [SugarColumn(ColumnName = "IsHide", ColumnDescription = "是否在菜单中隐藏 (通常列表详情页需要隐藏) ", IsNullable = true)] public bool IsHide { get; set; } - /// - /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) /// [SugarColumn(ColumnName = "IsFull", ColumnDescription = "菜单是否全屏 (示例:数据大屏页面)", IsNullable = true)] @@ -165,16 +162,13 @@ public class Meta /// public string Title { get; set; } - - /// /// 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) /// public string ActiveMenu { get; set; } - /// - /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) /// public bool IsHide { get; set; } = false; @@ -184,7 +178,7 @@ public class Meta public string IsLink { get; set; } = ""; /// - /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) + /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) /// public bool IsFull { get; set; } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs index 864b202..b1bfce8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs index 00dfcd7..dee0bb8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户信息表 @@ -280,7 +288,6 @@ public class SysUser : BaseEntity [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } - /// /// 默认模块 /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs index 6eb0f6a..7153be6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs @@ -1,4 +1,12 @@ -using IPTools.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using IPTools.Core; using SimpleAdmin.Plugin.Core; namespace SimpleAdmin.System; @@ -54,7 +62,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton //如果上次修改密码时间为空 if (pwdRemindUpdateTime == null) { - var pwdUpdateDefault = loginPolicy.First(x => x.ConfigKey == DevConfigConst.PWD_UPDATE_DEFAULT).ConfigValue.ToBoolean();//获取初始化提醒 + var pwdUpdateDefault = loginPolicy.First(x => x.ConfigKey == SysConfigConst.PWD_UPDATE_DEFAULT).ConfigValue.ToBoolean();//获取初始化提醒 //如果密码初始化提醒为true if (pwdUpdateDefault) { @@ -70,10 +78,10 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton } else { - var pwdRemind = loginPolicy.First(x => x.ConfigKey == DevConfigConst.PWD_REMIND).ConfigValue.ToBoolean();//获取密码提醒天数 + var pwdRemind = loginPolicy.First(x => x.ConfigKey == SysConfigConst.PWD_REMIND).ConfigValue.ToBoolean();//获取密码提醒天数 if (pwdRemind) { - var pwdRemindDay = loginPolicy.First(x => x.ConfigKey == DevConfigConst.PWD_REMIND_DAY).ConfigValue.ToInt();//获取密码提醒时间 + var pwdRemindDay = loginPolicy.First(x => x.ConfigKey == SysConfigConst.PWD_REMIND_DAY).ConfigValue.ToInt();//获取密码提醒时间 if (DateTime.Now - pwdRemindUpdateTime > TimeSpan.FromDays(pwdRemindDay)) { await messageService.Send(new MessageSendInput() @@ -89,7 +97,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton } } - #endregion + #endregion 登录/密码策略 #region 重新赋值属性,设置本次登录信息为最新的信息 @@ -119,7 +127,6 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton }).ExecuteCommandAsync() > 0) _simpleCacheService.HashAdd(SystemConst.Cache_SysUser, sysUser.Id.ToString(), sysUser);//更新Redis信息 - await Task.CompletedTask; } diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs index e8a5bfe..eb41521 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 事件总线常量 diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs index b8eacfc..e2c126a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs @@ -1,4 +1,12 @@ -using UAParser; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using UAParser; namespace SimpleAdmin.System; @@ -17,7 +25,6 @@ public class LoginEvent /// public SysUser SysUser { get; set; } - /// /// Ip地址 /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/NoticeEvent.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/NoticeEvent.cs index 442bcc6..1348213 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/NoticeEvent.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/NoticeEvent.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户登出事件 diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs index c92caff..fb89364 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs @@ -1,4 +1,12 @@ -using SimpleAdmin.Plugin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using SimpleAdmin.Plugin.Core; namespace SimpleAdmin.System; diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs index 9acbea1..af527aa 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户模块事件总线 diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationMsgUser.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationMsgUser.cs index f1f2928..333ab90 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationMsgUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationMsgUser.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 站内信与接收用户拓展 diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRolePermission.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRolePermission.cs index 3048d9f..c6bad16 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRolePermission.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRolePermission.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// SYS_ROLE_HAS_PERMISSION diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs index 3056e46..c7759da 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// SYS_ROLE_HAS_RESOURCE diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserSchedule.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserSchedule.cs index ba0e6c6..757083a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserSchedule.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserSchedule.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// SYS_USER_SCHEDULE_DATA diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserWorkBench.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserWorkBench.cs index 6fce18a..89f964b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserWorkBench.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationUserWorkBench.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// SYS_USER_WORKBENCH_DATA diff --git a/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs index 92bec64..abfd9c3 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs @@ -1,9 +1,18 @@ -global using Furion; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion; global using Furion.DataEncryption; global using Furion.DependencyInjection; global using Furion.EventBus; global using Furion.FriendlyException; global using Magicodes.ExporterAndImporter.Core; +global using Magicodes.ExporterAndImporter.Core.Models; global using Magicodes.ExporterAndImporter.Excel; global using Mapster; global using Masuit.Tools; @@ -14,14 +23,17 @@ global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Logging; global using NewLife.Serialization; global using OfficeOpenXml.Table; +global using SimpleAdmin.Cache; global using SimpleAdmin.Core; global using SimpleAdmin.Core.Utils; -global using SimpleAdmin.Cache; global using SimpleAdmin.SqlSugar; global using SimpleTool; global using SqlSugar; global using System.ComponentModel.DataAnnotations; global using System.Reflection; global using System.Text; -global using Magicodes.ExporterAndImporter.Core.Models; -global using System.Web; \ No newline at end of file +global using System.Web; +global using SkiaSharp; +global using System.Runtime.InteropServices; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Hosting; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Mapper.cs b/api/SimpleAdmin/SimpleAdmin.System/Mapper.cs index 4da317c..1986a14 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Mapper.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Mapper.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 对象映射 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Options/SystemSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.System/Options/SystemSettingsOptions.cs index 8f97960..e5f6c77 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Options/SystemSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Options/SystemSettingsOptions.cs @@ -1,4 +1,12 @@ -using Furion.ConfigurableOptions; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Furion.ConfigurableOptions; namespace SimpleAdmin.System; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs b/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs index eb455b0..b6f9049 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs @@ -1,4 +1,12 @@ -using Minio; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Minio; using Minio.Exceptions; namespace SimpleAdmin.System; @@ -27,10 +35,10 @@ public class MinioUtils : ITransient private async void InitClient() { var configs = await _configService.GetListByCategory(CateGoryConst.Config_FILE_MINIO);//获取minio配置 - var accessKey = configs.Where(it => it.ConfigKey == DevConfigConst.FILE_MINIO_ACCESS_KEY).FirstOrDefault();//MINIO文件AccessKey - var secretKey = configs.Where(it => it.ConfigKey == DevConfigConst.FILE_MINIO_SECRET_KEY).FirstOrDefault();//MINIO文件SecetKey - var endPoint = configs.Where(it => it.ConfigKey == DevConfigConst.FILE_MINIO_END_POINT).FirstOrDefault();//MINIO文件EndPoint - var bucketName = configs.Where(it => it.ConfigKey == DevConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME).FirstOrDefault();//MINIO文件默认存储桶 + var accessKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_ACCESS_KEY).FirstOrDefault();//MINIO文件AccessKey + var secretKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_SECRET_KEY).FirstOrDefault();//MINIO文件SecetKey + var endPoint = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_END_POINT).FirstOrDefault();//MINIO文件EndPoint + var bucketName = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME).FirstOrDefault();//MINIO文件默认存储桶 if (accessKey == null || secretKey == null || endPoint == null || bucketName == null) { throw Oops.Oh($"MINIO客户端未正确配置"); diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditConfigSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditConfigSeedData.cs index 126d727..d80c04a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditConfigSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditConfigSeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量修改字段种子数据 diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditSeedData.cs index 31615dc..42e5978 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/BatchEditSeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量修改配置种子数据 diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevConfigSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevConfigSeedData.cs index e090ff7..4803fb6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevConfigSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevConfigSeedData.cs @@ -1,12 +1,20 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 系统配置种子数据 /// -public class DevConfigSeedData : ISqlSugarEntitySeedData +public class DevConfigSeedData : ISqlSugarEntitySeedData { - public IEnumerable SeedData() + public IEnumerable SeedData() { - return SeedDataUtil.GetSeedData("seed_dev_config.json"); + return SeedDataUtil.GetSeedData("seed_sys_config.json"); } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevDictSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevDictSeedData.cs index 007cbe8..602a767 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevDictSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/DevDictSeedData.cs @@ -1,12 +1,20 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 字典表种子数据 /// -public class DevDictSeedData : ISqlSugarEntitySeedData +public class DevDictSeedData : ISqlSugarEntitySeedData { - public IEnumerable SeedData() + public IEnumerable SeedData() { - return SeedDataUtil.GetSeedData("seed_dev_dict.json"); + return SeedDataUtil.GetSeedData("seed_sys_dict.json"); } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_config.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json similarity index 100% rename from api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_config.json rename to api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_dict.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_dict.json similarity index 100% rename from api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_dev_dict.json rename to api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_dict.json diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysOrgSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysOrgSeedData.cs index bd7a955..cda5531 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysOrgSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysOrgSeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 机构种子数据 diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysPositionSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysPositionSeedData.cs index a9aeb8f..48e2f9b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysPositionSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysPositionSeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 职位表种子数据 diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRelationSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRelationSeedData.cs index e1a0ca9..33be10a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRelationSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRelationSeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 关系表种子数据 diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysResourceSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysResourceSeedData.cs index 6ba130a..8cb556b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysResourceSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysResourceSeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 资源表种子数据 diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRoleSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRoleSeedData.cs index 0849e0c..0c5beaa 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRoleSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysRoleSeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色种子数据 diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysUserSeedData.cs b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysUserSeedData.cs index 69d61a8..e051550 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysUserSeedData.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/SysUserSeedData.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户表种子数据 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs index 889978c..d060f78 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System.Services.Auth; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System.Services.Auth; /// public class AuthService : IAuthService @@ -25,10 +33,12 @@ public class AuthService : IAuthService /// public async Task GetCaptchaInfo() { - var config = await _configService.GetByConfigKey(CateGoryConst.Config_LOGIN_POLICY, DevConfigConst.LOGIN_CAPTCHA_TYPE); + var config = await _configService.GetByConfigKey(CateGoryConst.Config_LOGIN_POLICY, + SysConfigConst.LOGIN_CAPTCHA_TYPE); var captchaType = (CaptchaType)Enum.Parse(typeof(CaptchaType), config.ConfigValue); //生成验证码 - var captchInfo = CaptchaUtil.CreateCaptcha(captchaType, 4, 100, 38); + var captchInfo = CaptchaUtil.CreateCaptcha(captchaType, 4, 100, + 38); //生成请求号,并将验证码放入redis var reqNo = AddValidCodeToRedis(captchInfo.Code); //返回验证码和请求号 @@ -40,7 +50,8 @@ public class AuthService : IAuthService } /// - public async Task GetPhoneValidCode(GetPhoneValidCodeInput input, LoginClientTypeEnum loginClientType) + public async Task GetPhoneValidCode(GetPhoneValidCodeInput input, + LoginClientTypeEnum loginClientType) { await ValidPhoneValidCode(input, loginClientType);//校验手机号验证码 string? phoneValidCode; @@ -60,19 +71,20 @@ public class AuthService : IAuthService return reqNo; } - - /// public async Task Login(LoginInput input, LoginClientTypeEnum loginClientType) { //判断是否有验证码 - var sysBase = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, DevConfigConst.LOGIN_CAPTCHA_OPEN); + var sysBase = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, + SysConfigConst.LOGIN_CAPTCHA_OPEN); if (sysBase != null)//如果有这个配置项 { if (sysBase.ConfigValue.ToBoolean())//如果需要验证码 { //如果没填验证码,提示验证码不能为空 - if (string.IsNullOrEmpty(input.ValidCode) || string.IsNullOrEmpty(input.ValidCodeReqNo)) throw Oops.Bah("验证码不能为空").StatusCode(410); + if (string.IsNullOrEmpty(input.ValidCode) + || string.IsNullOrEmpty(input.ValidCodeReqNo)) + throw Oops.Bah("验证码不能为空").StatusCode(410); ValidValidCode(input.ValidCode, input.ValidCodeReqNo);//校验验证码 } } @@ -100,9 +112,11 @@ public class AuthService : IAuthService } /// - public async Task LoginByPhone(LoginByPhoneInput input, LoginClientTypeEnum loginClientType) + public async Task LoginByPhone(LoginByPhoneInput input, + LoginClientTypeEnum loginClientType) { - await ValidPhoneValidCode(input, loginClientType, false);//校验手机号和验证码,这里不删除Redis,防止输入错误又要重新输入验证码 + await ValidPhoneValidCode(input, loginClientType, + false);//校验手机号和验证码,这里不删除Redis,防止输入错误又要重新输入验证码 // 根据手机号获取用户信息,根据B端或C端判断 if (loginClientType == LoginClientTypeEnum.B)//如果是B端 { @@ -156,10 +170,12 @@ public class AuthService : IAuthService /// /// /// - public void BeforeLogin(List loginPolicy, string userName) + public void BeforeLogin(List loginPolicy, string userName) { - var lockTime = loginPolicy.First(x => x.ConfigKey == DevConfigConst.LOGIN_ERROR_LOCK).ConfigValue.ToInt();//获取锁定时间 - var errorCount = loginPolicy.First(x => x.ConfigKey == DevConfigConst.LOGIN_ERROR_COUNT).ConfigValue.ToInt();//获取错误次数 + var lockTime = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_LOCK) + .ConfigValue.ToInt();//获取锁定时间 + var errorCount = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_COUNT) + .ConfigValue.ToInt();//获取错误次数 var key = SystemConst.Cache_LoginErrorCount + userName;//获取登录错误次数Key值 var errorCountCache = _simpleCacheService.Get(key);//获取登录错误次数 if (errorCountCache >= errorCount) @@ -173,9 +189,10 @@ public class AuthService : IAuthService /// /// /// - public void LoginError(List loginPolicy, string userName) + public void LoginError(List loginPolicy, string userName) { - var resetTime = loginPolicy.First(x => x.ConfigKey == DevConfigConst.LOGIN_ERROR_RESET_TIME).ConfigValue.ToInt();//获取重置时间 + var resetTime = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_RESET_TIME) + .ConfigValue.ToInt();//获取重置时间 var key = SystemConst.Cache_LoginErrorCount + userName;//获取登录错误次数Key值 _simpleCacheService.Increment(key, 1);// 登录错误次数+1 _simpleCacheService.SetExpire(key, TimeSpan.FromMinutes(resetTime));//设置过期时间 @@ -220,7 +237,8 @@ public class AuthService : IAuthService /// 登录端类型 /// 是否删除 /// - public async Task ValidPhoneValidCode(GetPhoneValidCodeInput input, LoginClientTypeEnum loginClientType, bool isDelete = true) + public async Task ValidPhoneValidCode(GetPhoneValidCodeInput input, + LoginClientTypeEnum loginClientType, bool isDelete = true) { ValidValidCode(input.ValidCode, input.ValidCodeReqNo, isDelete);//校验验证码 if (loginClientType == LoginClientTypeEnum.B)//B端登录 @@ -249,7 +267,8 @@ public class AuthService : IAuthService //生成请求号 var reqNo = CommonUtils.GetSingleId().ToString(); //插入redis - _simpleCacheService.Set(SystemConst.Cache_Captcha + reqNo, code, TimeSpan.FromMinutes(expire)); + _simpleCacheService.Set(SystemConst.Cache_Captcha + reqNo, code, + TimeSpan.FromMinutes(expire)); return reqNo; } @@ -260,9 +279,11 @@ public class AuthService : IAuthService /// 登录设备 /// 登录类型 /// - public async Task ExecLoginB(SysUser sysUser, AuthDeviceTypeEumu device, LoginClientTypeEnum loginClientType) + public async Task ExecLoginB(SysUser sysUser, AuthDeviceTypeEumu device, + LoginClientTypeEnum loginClientType) { - if (sysUser.UserStatus == DevDictConst.COMMON_STATUS_DISABLED) throw Oops.Bah("账号已停用");//账号冻结 + if (sysUser.UserStatus == SysDictConst.COMMON_STATUS_DISABLED) + throw Oops.Bah("账号已停用");//账号冻结 if (sysUser.ModuleList.Count == 0) throw Oops.Bah("该账号未分配模块,请联系管理员");//没有分配菜单权限 //生成Token var accessToken = JWTEncryption.Encrypt(new Dictionary @@ -335,13 +356,19 @@ public class AuthService : IAuthService if (tokenInfos != null) { var isSingle = false;//默认不开启单用户登录 - var singleConfig = await _configService.GetByConfigKey(CateGoryConst.Config_LOGIN_POLICY, DevConfigConst.LOGIN_SINGLE_OPEN);//获取系统单用户登录选项 - if (singleConfig != null) isSingle = singleConfig.ConfigValue.ToBoolean();//如果配置不为空则设置单用户登录选项为系统配置的值 + var singleConfig = + await _configService.GetByConfigKey(CateGoryConst.Config_LOGIN_POLICY, + SysConfigConst.LOGIN_SINGLE_OPEN);//获取系统单用户登录选项 + if (singleConfig != null) + isSingle = singleConfig.ConfigValue.ToBoolean();//如果配置不为空则设置单用户登录选项为系统配置的值 //判断是否单用户登录 if (isSingle) { - await SingleLogin(loginEvent.SysUser.Id.ToString(), tokenInfos.Where(it => it.LoginClientType == loginClientType).ToList());//单用户登录方法 - tokenInfos = tokenInfos.Where(it => it.LoginClientType != loginClientType).ToList();//去掉当前登录类型的token + await SingleLogin(loginEvent.SysUser.Id.ToString(), + tokenInfos.Where(it => it.LoginClientType == loginClientType) + .ToList());//单用户登录方法 + tokenInfos = tokenInfos.Where(it => it.LoginClientType != loginClientType) + .ToList();//去掉当前登录类型的token tokenInfos.Add(tokenInfo);//添加到列表 } else @@ -358,7 +385,8 @@ public class AuthService : IAuthService } //添加到token列表 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, loginEvent.SysUser.Id.ToString(), tokenInfos); + _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, loginEvent.SysUser.Id.ToString(), + tokenInfos); } /// @@ -373,21 +401,25 @@ public class AuthService : IAuthService if (tokenInfos != null) { //获取当前用户的token - var token = tokenInfos.Where(it => it.Token == loginEvent.Token && it.LoginClientType == loginClientType).FirstOrDefault(); + var token = tokenInfos + .Where(it => it.Token == loginEvent.Token && it.LoginClientType == loginClientType) + .FirstOrDefault(); if (token != null) tokenInfos.Remove(token); if (tokenInfos.Count > 0) { //更新token列表 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, loginEvent.SysUser.Id.ToString(), tokenInfos); + _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, + loginEvent.SysUser.Id.ToString(), tokenInfos); } else { //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, new string[] - { - loginEvent.SysUser.Id.ToString() - }); + _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, + new string[] + { + loginEvent.SysUser.Id.ToString() + }); } } } @@ -400,7 +432,9 @@ public class AuthService : IAuthService private List GetTokenInfos(long userId) { //redis获取用户token列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId.ToString()); + var tokenInfos = + _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, + userId.ToString()); if (tokenInfos != null) { tokenInfos = tokenInfos.Where(it => it.TokenTimeout > DateTime.Now).ToList();//去掉登录超时的 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs index f8a8010..2d0b78e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 权限认证输入 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs index fb1f14d..d1def0f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthOutPut.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; public class AuthOutPut { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/IAuthService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/IAuthService.cs index 979006b..a0021c8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/IAuthService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/IAuthService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 权限校验服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionInput.cs index 1f801c3..cde412b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 会话分页查询 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionOutput.cs index 4bd9897..69157cb 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/Dto/SessionOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 会话输出 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/ISessionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/ISessionService.cs index 185ece5..82660c9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/ISessionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/ISessionService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 会话管理服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs index 844c4c4..9e3ea91 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs @@ -1,4 +1,12 @@ -using Masuit.Tools.DateTimeExt; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Masuit.Tools.DateTimeExt; using Masuit.Tools.Models; namespace SimpleAdmin.System; @@ -41,8 +49,8 @@ public class SessionService : DbRepository, ISessionService it.TokenSignList = tokenInfos;//令牌列表 //如果有mqtt客户端ID就是在线 it.OnlineStatus = tokenInfos.Any(it => it.ClientIds.Count > 0) - ? DevDictConst.ONLINE_STATUS_ONLINE - : DevDictConst.ONLINE_STATUS_OFFLINE; + ? SysDictConst.ONLINE_STATUS_ONLINE + : SysDictConst.ONLINE_STATUS_OFFLINE; }); var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页 @@ -54,7 +62,7 @@ public class SessionService : DbRepository, ISessionService public async Task> PageC(SessionPageInput input) { return new SqlSugarPagedList() - { PageNum = 1, PageSize = 20, Total = 0, Pages = 1, HasNextPages = false }; + { PageNum = 1, PageSize = 20, Total = 0, Pages = 1, HasNextPages = false }; } /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs index e9c7b05..f1254dc 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// @@ -146,7 +154,7 @@ public class BatchEditService : DbRepository, IBatchEditService { //找到对应字段 batchEdiConfig = await Context.Queryable().Where(it => - it.UId == updateBatch.Id && it.Status == DevDictConst.COMMON_STATUS_ENABLE) + it.UId == updateBatch.Id && it.Status == SysDictConst.COMMON_STATUS_ENABLE) .ToListAsync(); } return batchEdiConfig; @@ -197,7 +205,7 @@ public class BatchEditService : DbRepository, IBatchEditService : columnInfo.ColumnDescription, NetType = netType, DataType = SqlSugarUtils.DataTypeToEff(netType), - Status = DevDictConst.COMMON_STATUS_DISABLED + Status = SysDictConst.COMMON_STATUS_DISABLED }; } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs index 2b3288a..0a8e105 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量分页查询参数 @@ -74,17 +82,21 @@ public class BatchEditConfigInput : BatchEditConfig, IValidatableObject public IEnumerable Validate(ValidationContext validationContext) { - if (Status == DevDictConst.COMMON_STATUS_ENABLE) + if (Status == SysDictConst.COMMON_STATUS_ENABLE) { //如果是api请求并且必填参数有空的 - if (DataType.Contains("api") && (string.IsNullOrEmpty(RequestUrl) || string.IsNullOrEmpty(RequestType) || string.IsNullOrEmpty(RequestLabel) || string.IsNullOrEmpty(RequestValue))) + if (DataType.Contains("api") && (string.IsNullOrEmpty(RequestUrl) + || string.IsNullOrEmpty(RequestType) || string.IsNullOrEmpty(RequestLabel) + || string.IsNullOrEmpty(RequestValue))) { - yield return new ValidationResult($"字段{ColumnName}接口信息必填", new[] { nameof(DataType) }); + yield return new ValidationResult($"字段{ColumnName}接口信息必填", + new[] { nameof(DataType) }); } //如果是字典数据并且字典值为空 if (DataType.Contains("dict") && string.IsNullOrEmpty(DictTypeCode)) { - yield return new ValidationResult($"字段{ColumnName}字典值必填", new[] { nameof(DictTypeCode) }); + yield return new ValidationResult($"字段{ColumnName}字典值必填", + new[] { nameof(DictTypeCode) }); } } } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs index 10b1c27..915e30a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs @@ -1 +1,9 @@ -namespace SimpleAdmin.System; \ No newline at end of file +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs index 5ea8771..8652e3c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/Dto/FileInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/Dto/FileInput.cs index 2c80468..83c402f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/Dto/FileInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/Dto/FileInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 文件分页输出 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs index 8746b1e..d2de99c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs @@ -1,13 +1,17 @@ -using SkiaSharp; -using System.Runtime.InteropServices; -using System.Web; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; /// /// /// -public class FileService : DbRepository, IFileService +public class FileService : DbRepository, IFileService { private readonly IConfigService _configService; @@ -17,9 +21,9 @@ public class FileService : DbRepository, IFileService } /// - public async Task> Page(FilePageInput input) + public async Task> Page(FilePageInput input) { - var query = Context.Queryable() + var query = Context.Queryable() .WhereIF(!string.IsNullOrEmpty(input.Engine), it => it.Engine == input.Engine)//根据关键字查询 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 @@ -94,9 +98,9 @@ public class FileService : DbRepository, IFileService var devFile = await GetByIdAsync(input.Id); if (devFile != null) { - if (devFile.Engine == DevDictConst.FILE_ENGINE_LOCAL) + if (devFile.Engine == SysDictConst.FILE_ENGINE_LOCAL) return GetFileStreamResult(devFile.StoragePath, devFile.Name); - else if (devFile.Engine == DevDictConst.FILE_ENGINE_MINIO) + else if (devFile.Engine == SysDictConst.FILE_ENGINE_MINIO) return await GetFileStreamResultFromMinio(devFile.ObjName, devFile.Name); else return null; @@ -125,14 +129,14 @@ public class FileService : DbRepository, IFileService switch (engine) { //存储本地 - case DevDictConst.FILE_ENGINE_LOCAL: + case SysDictConst.FILE_ENGINE_LOCAL: bucketName = "defaultBucketName";// 存储桶名称 storageUrl = await StorageLocal(objectId, file); break; //存储本地 - case DevDictConst.FILE_ENGINE_MINIO: + case SysDictConst.FILE_ENGINE_MINIO: var config = await _configService.GetByConfigKey(CateGoryConst.Config_FILE_MINIO, - DevConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME); + SysConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME); if (config != null) { bucketName = config.ConfigValue;// 存储桶名称 @@ -146,7 +150,7 @@ public class FileService : DbRepository, IFileService } var fileSizeKb = (long)(file.Length / 1024.0);// 文件大小KB var fileSuffix = Path.GetExtension(file.FileName).ToLower();// 文件后缀 - var devFile = new DevFile + var devFile = new SysFile { Id = objectId, Engine = engine, @@ -189,11 +193,11 @@ public class FileService : DbRepository, IFileService //判断是windos还是linux if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - configKey = DevConfigConst.FILE_LOCAL_FOLDER_FOR_UNIX;//Linux + configKey = SysConfigConst.FILE_LOCAL_FOLDER_FOR_UNIX;//Linux } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { - configKey = DevConfigConst.FILE_LOCAL_FOLDER_FOR_WINDOWS;//Windows + configKey = SysConfigConst.FILE_LOCAL_FOLDER_FOR_WINDOWS;//Windows } //获取路径配置 var config = @@ -284,4 +288,4 @@ public class FileService : DbRepository, IFileService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs index ec487ad..c127204 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/IFileService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 文件管理服务 @@ -41,7 +49,7 @@ public interface IFileService : ITransient /// /// 查询参数 /// 文件列表 - Task> Page(FilePageInput input); + Task> Page(FilePageInput input); /// /// 上传文件到本地返回下载url diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs index bc7d596..6813b0e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; public class MessagePageInput : BasePageInput { @@ -11,7 +19,7 @@ public class MessagePageInput : BasePageInput /// /// 发送参数 /// -public class MessageSendInput : DevMessage, IValidatableObject +public class MessageSendInput : SysMessage, IValidatableObject { /// /// 主题 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageOutPut.cs index c84fbff..a894dcc 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageOutPut.cs @@ -1,16 +1,23 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 消息详情 /// -public class MessageDetailOutPut : DevMessage +public class MessageDetailOutPut : SysMessage { public List ReceiveInfoList { get; set; } = new List(); /// /// 接收信息类 /// - public class ReceiveInfo { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs index 7b8e6b9..6b7b5d6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/IMessageService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 站内信服务 @@ -34,14 +42,14 @@ public interface IMessageService : ITransient /// /// /// - Task> MyMessagePage(MessagePageInput input, long userId); + Task> MyMessagePage(MessagePageInput input, long userId); /// /// 分页查询 /// /// 查询参数 /// - Task> Page(MessagePageInput input); + Task> Page(MessagePageInput input); /// /// 发送站内信 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs index 0ea6255..47bfb04 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs @@ -1,9 +1,17 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// /// -public class MessageService : DbRepository, IMessageService +public class MessageService : DbRepository, IMessageService { private readonly ILogger _logger; private readonly ISimpleCacheService _simpleCacheService; @@ -20,9 +28,9 @@ public class MessageService : DbRepository, IMessageService } /// - public async Task> Page(MessagePageInput input) + public async Task> Page(MessagePageInput input) { - var query = Context.Queryable() + var query = Context.Queryable() .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), @@ -38,17 +46,17 @@ public class MessageService : DbRepository, IMessageService } /// - public async Task> MyMessagePage(MessagePageInput input, + public async Task> MyMessagePage(MessagePageInput input, long userId) { - var query = Context.Queryable() - .LeftJoin((u, m) => u.MessageId == m.Id) + var query = Context.Queryable() + .LeftJoin((u, m) => u.MessageId == m.Id) .Where((u, m) => u.IsDelete == false && u.UserId == userId) .WhereIF(!string.IsNullOrEmpty(input.Category), (u, m) => m.Category == input.Category)//根据分类查询 .OrderBy((u, m) => u.Read, OrderByType.Asc) .OrderBy((u, m) => m.CreateTime, OrderByType.Desc) - .Select((u, m) => new DevMessage + .Select((u, m) => new SysMessage { Id = m.Id.SelectAll(), Read = u.Read @@ -61,12 +69,12 @@ public class MessageService : DbRepository, IMessageService /// public async Task Send(MessageSendInput input) { - var message = input.Adapt();//实体转换 - var messageUsers = new List(); + var message = input.Adapt();//实体转换 + var messageUsers = new List(); input.ReceiverIdList.ForEach(it => { //遍历用户ID列表,生成拓展列表 - messageUsers.Add(new DevMessageUser { UserId = it, Read = false, IsDelete = false }); + messageUsers.Add(new SysMessageUser { UserId = it, Read = false, IsDelete = false }); }); //事务 @@ -100,7 +108,7 @@ public class MessageService : DbRepository, IMessageService if (message != null) { var messageDetail = message.Adapt();//实体转换 - var messageUserRep = ChangeRepository>();//切换仓储 + var messageUserRep = ChangeRepository>();//切换仓储 var messageUsers = await messageUserRep.GetListAsync(it => it.MessageId == message.Id); var myMessage = messageUsers .Where(it => it.UserId == UserManager.UserId && it.MessageId == input.Id) @@ -163,7 +171,7 @@ public class MessageService : DbRepository, IMessageService var result = await itenant.UseTranAsync(async () => { await DeleteAsync(it => ids.Contains(it.Id)); - await Context.Deleteable().Where(it => ids.Contains(it.MessageId)) + await Context.Deleteable().Where(it => ids.Contains(it.MessageId)) .ExecuteCommandAsync(); }); if (!result.IsSuccess)//如果失败了 @@ -178,8 +186,8 @@ public class MessageService : DbRepository, IMessageService /// public async Task DeleteMyMessage(BaseIdInput input, long userId) { - var messageUserRep = ChangeRepository>();//切换仓储 - await Context.Deleteable() + var messageUserRep = ChangeRepository>();//切换仓储 + await Context.Deleteable() .Where(it => it.UserId == userId && it.MessageId == input.Id).IsLogic() .ExecuteCommandAsync();//逻辑删除 } @@ -187,7 +195,7 @@ public class MessageService : DbRepository, IMessageService /// public async Task UnReadCount(long userId) { - var messageUserRep = ChangeRepository>();//切换仓储 + var messageUserRep = ChangeRepository>();//切换仓储 //获取未读数量 var unRead = await messageUserRep.CountAsync(it => it.UserId == userId && it.Read == false && it.IsDelete == false); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogInput.cs deleted file mode 100644 index c5e0c5f..0000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogInput.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace SimpleAdmin.System; - -/// -/// 操作日志分页输入 -/// -public class OperateLogPageInput : VisitLogPageInput -{ -} - -/// -/// 操作日志日志删除输入 -/// -public class OperateLogDeleteInput : VisitLogDeleteInput -{ -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewInput.cs index 2e60830..417b372 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewInput.cs @@ -1,4 +1,10 @@ -using SimpleAdmin.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs index 1ce73cd..8fbefd5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 文件导入通用输出 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultInput.cs index 5fff3ef..5104f32 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 批量导入结果输入 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultOutPut.cs index fdb4efe..ec2aa87 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportResultOutPut.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 导入结果输出 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs index a07d212..ba30d46 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 导入基础输入 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs index 294e9e7..01eee40 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 导入服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs index c642337..5a4fb56 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexInput.cs index 0c710c0..cb8e0f2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 日程列表查询参数 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexOutput.cs index 1a094d9..e0b255d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/Dto/IndexOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; public class ScheduleListOutput : RelationUserSchedule { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs index d72b8d2..c5effe5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IIndexService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 首页服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs index 0fab5b8..af8b433 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs similarity index 90% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs index 72c606e..d1e62db 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/ButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/Dto/ButtonInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/Dto/ButtonInput.cs similarity index 54% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/Dto/ButtonInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/Dto/ButtonInput.cs index 26537f4..3014a0f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/Dto/ButtonInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/Dto/ButtonInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; public class ButtonPageInput : BasePageInput { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/IButtonService.cs similarity index 56% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/IButtonService.cs index a883237..97b1a20 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Button/IButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/IButtonService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 权限按钮服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/Dto/MenuInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs similarity index 67% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/Dto/MenuInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs index a44947e..7d38a0d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/Dto/MenuInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs @@ -1,9 +1,16 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 菜单树查询参数 /// - public class MenuTreeInput { /// @@ -20,7 +27,6 @@ public class MenuTreeInput /// /// 添加菜单参数 /// - public class MenuAddInput : SysResource, IValidatableObject { /// @@ -67,19 +73,22 @@ public class MenuAddInput : SysResource, IValidatableObject public IEnumerable Validate(ValidationContext validationContext) { //如果菜单类型是菜单 - if (MenuType == ResourceConst.MENU) + if (MenuType is ResourceConst.MENU or ResourceConst.SUBSET) { if (string.IsNullOrEmpty(Name)) yield return new ValidationResult("Name不能为空", new[] { nameof(Name) }); if (string.IsNullOrEmpty(Component)) yield return new ValidationResult("Component不能为空", new[] { nameof(Name) }); - } - //如果是内链或者外链 - else if (MenuType == ResourceConst.IFRAME || MenuType == ResourceConst.LINK) - { - Component = null;//设置组件为空 - if (string.IsNullOrEmpty(Name)) - Name = RandomHelper.CreateRandomString(10);//name为随机字符串 + if (MenuType is ResourceConst.SUBSET)//如果是子集 + { + if (string.IsNullOrEmpty(ActiveMenu)) + yield return new ValidationResult("ActiveMenu不能为空", new[] { nameof(Name) }); + IsHome = false; + IsHide = true; + IsFull = false; + IsAffix = false; + IsKeepAlive = true; + } } else { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/IMenuService.cs similarity index 66% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/IMenuService.cs index b2ad500..1b01b63 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/IMenuService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/IMenuService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 菜单服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs similarity index 91% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs index b83508f..a8b4de8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Menu/MenuService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/Dto/ModuleInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/Dto/ModuleInput.cs similarity index 36% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/Dto/ModuleInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/Dto/ModuleInput.cs index f5c49d7..610e212 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/Dto/ModuleInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/Dto/ModuleInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 模块分页输入 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/IModuleService.cs similarity index 51% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/IModuleService.cs index 029e374..343b9d9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/IModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/IModuleService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 模块管理服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs similarity index 87% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs index d3bd4a9..8c315e7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Module/ModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs @@ -1,4 +1,12 @@ -using DnsClient.Internal; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using DnsClient.Internal; namespace SimpleAdmin.System; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs similarity index 77% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs index 57b64d6..c7fdf08 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色查询参数 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs similarity index 46% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleOutput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs index e0575fe..645e93a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/Dto/RoleOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色拥有的资源输出 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/IRoleService.cs similarity index 80% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/IRoleService.cs index 95c0f5d..2b76077 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/IRoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/IRoleService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs similarity index 95% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs index 345e7bc..8a03157 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Role/RoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// //[Injection(Proxy = typeof(GlobalDispatchProxy))] @@ -248,7 +256,7 @@ public class RoleService : DbRepository, IRoleService }); }); - #endregion + #endregion 角色模块处理 #region 角色资源处理 @@ -288,11 +296,11 @@ public class RoleService : DbRepository, IRoleService TargetId = it.ApiRoute, Category = CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION, ExtJson = new RelationRolePermission - { - ApiUrl = it.ApiRoute, - ScopeCategory = defaultDataScope.ScopeCategory, - ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList - } + { + ApiUrl = it.ApiRoute, + ScopeCategory = defaultDataScope.ScopeCategory, + ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList + } .ToJson() }); }); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/Dto/SpaInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/Dto/SpaInput.cs similarity index 59% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/Dto/SpaInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/Dto/SpaInput.cs index 2b0e4ba..b748574 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/Dto/SpaInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/Dto/SpaInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 单页输入参数 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/ISpaService.cs similarity index 50% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/ISpaService.cs index 53380e7..59040d1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/ISpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/ISpaService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 单页服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs similarity index 83% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs index 3f2efd7..7ba402e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Spa/SpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// @@ -94,7 +102,8 @@ public class SpaService : DbRepository, ISpaService else if (sysResource.MenuType == ResourceConst.IFRAME || sysResource.MenuType == ResourceConst.LINK)//如果是内链或者外链 { - sysResource.Name = RandomHelper.CreateNum(10);//设置name为随机数 + // sysResource.Name = RandomHelper.CreateNum(10);//设置name为随机数 + sysResource.Name = null;//设置name为标题 sysResource.Component = null; } else diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogInput.cs new file mode 100644 index 0000000..9363aba --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogInput.cs @@ -0,0 +1,23 @@ +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; + +/// +/// 操作日志分页输入 +/// +public class OperateLogPageInput : VisitLogPageInput +{ +} + +/// +/// 操作日志日志删除输入 +/// +public class OperateLogDeleteInput : VisitLogDeleteInput +{ +} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs similarity index 39% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogOutput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs index 9d2644c..cf4ad6f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/Dto/OperateLogOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 操作日志周统计输出 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/IOperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs similarity index 53% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/IOperateLogService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs index 2bfa6f7..297e9fc 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/IOperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 操作日志服务 @@ -17,14 +25,14 @@ public interface IOperateLogService : ITransient /// /// id /// 日志详情 - Task Detail(BaseIdInput input); + Task Detail(BaseIdInput input); /// /// 操作日志分页查询 /// /// 查询参数 /// 分页列表 - Task> Page(OperateLogPageInput input); + Task> Page(OperateLogPageInput input); /// /// 操作日志周统计 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs similarity index 74% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs index 971ec2a..cf19c67 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/OperateLog/OperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs @@ -1,9 +1,17 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// /// -public class OperateLogService : DbRepository, IOperateLogService +public class OperateLogService : DbRepository, IOperateLogService { /// /// 操作日志中文名称 @@ -16,9 +24,9 @@ public class OperateLogService : DbRepository, IOperateLogService private readonly string NameExecption = "异常日志"; /// - public async Task> Page(OperateLogPageInput input) + public async Task> Page(OperateLogPageInput input) { - var query = Context.Queryable() + var query = Context.Queryable() .WhereIF(!string.IsNullOrEmpty(input.Account), it => it.OpAccount == input.Account)//根据账号查询 .WhereIF(!string.IsNullOrEmpty(input.Category), @@ -43,7 +51,7 @@ public class OperateLogService : DbRepository, IOperateLogService //生成时间表 var queryableLeft = Context.Reportable(dayArray).ToQueryable(); //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 - var queryableRight = Context.Queryable();//声名表 + var queryableRight = Context.Queryable();//声名表 //报表查询 var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) @@ -52,15 +60,15 @@ public class OperateLogService : DbRepository, IOperateLogService .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 .Select((x1, x2) => new - { - OperateCount = + { + OperateCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_OPERATE, 1, 0)),//null的数据要为0所以不能用count - ExceptionCount = + ExceptionCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_EXCEPTION, 1, 0)),//null的数据要为0所以不能用count - Date = x1.ColumnName.ToString("yyyy-MM-dd") - } + Date = x1.ColumnName.ToString("yyyy-MM-dd") + } ).ToListAsync(); //定义返回结果 List result = new List(); @@ -68,9 +76,9 @@ public class OperateLogService : DbRepository, IOperateLogService list.ForEach(it => { result.Add(new OperateLogDayStatisticsOutput - { Date = it.Date, Name = NameOperate, Count = it.OperateCount });//添加访问日志 + { Date = it.Date, Name = NameOperate, Count = it.OperateCount });//添加访问日志 result.Add(new OperateLogDayStatisticsOutput - { Date = it.Date, Name = NameExecption, Count = it.ExceptionCount });//添加异常日志 + { Date = it.Date, Name = NameExecption, Count = it.ExceptionCount });//添加异常日志 }); return result; } @@ -78,7 +86,7 @@ public class OperateLogService : DbRepository, IOperateLogService /// public async Task> TotalCount() { - var data = await Context.Queryable() + var data = await Context.Queryable() .GroupBy(it => it.Category)//根据分类分组 .Select(it => new { @@ -113,7 +121,7 @@ public class OperateLogService : DbRepository, IOperateLogService } /// - public async Task Detail(BaseIdInput input) + public async Task Detail(BaseIdInput input) { return await GetFirstAsync(it => it.Id == input.Id);//删除对应分类日志 } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogInput.cs similarity index 38% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogInput.cs index 8f527e1..abac18b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 访问日志分页输入 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogOutput.cs similarity index 45% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogOutput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogOutput.cs index 3b348f4..af6c26a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/Dto/VisitLogOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/Dto/VisitLogOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 周统计输出 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/IVisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/IVisitLogService.cs similarity index 50% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/IVisitLogService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/IVisitLogService.cs index 180e7cc..cfb040d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/IVisitLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/IVisitLogService.cs @@ -1,9 +1,16 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 访问日志服务 /// - public interface IVisitLogService : ITransient { /// @@ -18,7 +25,7 @@ public interface IVisitLogService : ITransient /// /// 查询参数 /// 日志列表 - Task> Page(VisitLogPageInput input); + Task> Page(VisitLogPageInput input); /// /// 根统计N天来登录和登出数量 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs similarity index 74% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs index d000529..38c7dbf 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/VisitLog/VisitLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs @@ -1,18 +1,26 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// /// -public class VisitLogService : DbRepository, IVisitLogService +public class VisitLogService : DbRepository, IVisitLogService { public VisitLogService() { } /// - public async Task> Page(VisitLogPageInput input) + public async Task> Page(VisitLogPageInput input) { - var query = Context.Queryable() + var query = Context.Queryable() .WhereIF(!string.IsNullOrEmpty(input.Account), it => it.OpAccount == input.Account)//根据账号查询 .WhereIF(!string.IsNullOrEmpty(input.Category), @@ -36,7 +44,7 @@ public class VisitLogService : DbRepository, IVisitLogService //生成时间表 var queryableLeft = Context.Reportable(dayArray).ToQueryable(); //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 - var queryableRight = Context.Queryable();//声名表 + var queryableRight = Context.Queryable();//声名表 //报表查询 var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) @@ -45,15 +53,15 @@ public class VisitLogService : DbRepository, IVisitLogService .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 .Select((x1, x2) => new VisitLogDayStatisticsOutput - { - LoginCount = + { + LoginCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGIN, 1, 0)),//null的数据要为0所以不能用count - LogoutCount = + LogoutCount = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGOUT, 1, 0)),//null的数据要为0所以不能用count - Date = x1.ColumnName.ToString("yyyy-MM-dd") - } + Date = x1.ColumnName.ToString("yyyy-MM-dd") + } ) .ToListAsync(); return list; @@ -62,7 +70,7 @@ public class VisitLogService : DbRepository, IVisitLogService /// public async Task> TotalCount() { - var data = await Context.Queryable() + var data = await Context.Queryable() .GroupBy(it => it.Category)//根据分类分组 .Select(it => new { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs similarity index 73% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs index d1d3840..9376e63 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/ConfigService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs @@ -1,7 +1,15 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// -public class ConfigService : DbRepository, IConfigService +public class ConfigService : DbRepository, IConfigService { private readonly ISimpleCacheService _simpleCacheService; @@ -11,11 +19,11 @@ public class ConfigService : DbRepository, IConfigService } /// - public async Task> GetListByCategory(string category) + public async Task> GetListByCategory(string category) { var key = SystemConst.Cache_DevConfig + category;//系统配置key //先从redis拿配置 - var configList = _simpleCacheService.Get>(key); + var configList = _simpleCacheService.Get>(key); if (configList == null) { //redis没有再去数据可拿 @@ -29,7 +37,7 @@ public class ConfigService : DbRepository, IConfigService } /// - public async Task GetByConfigKey(string category, string configKey) + public async Task GetByConfigKey(string category, string configKey) { var configList = await GetListByCategory(category);//获取系统配置列表 var configValue = @@ -38,9 +46,9 @@ public class ConfigService : DbRepository, IConfigService } /// - public async Task> Page(ConfigPageInput input) + public async Task> Page(ConfigPageInput input) { - var query = Context.Queryable() + var query = Context.Queryable() .Where(it => it.Category == CateGoryConst.Config_BIZ_DEFINE)//自定义配置 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.ConfigKey.Contains(input.SearchKey) @@ -56,7 +64,7 @@ public class ConfigService : DbRepository, IConfigService public async Task Add(ConfigAddInput input) { await CheckInput(input); - var devConfig = input.Adapt();//实体转换 + var devConfig = input.Adapt();//实体转换 if (await InsertAsync(devConfig))//插入数据) await RefreshCache(CateGoryConst.Config_BIZ_DEFINE);//刷新缓存 } @@ -65,7 +73,7 @@ public class ConfigService : DbRepository, IConfigService public async Task Edit(ConfigEditInput input) { await CheckInput(input); - var devConfig = input.Adapt();//实体转换 + var devConfig = input.Adapt();//实体转换 if (await UpdateAsync(devConfig))//更新数据 await RefreshCache(CateGoryConst.Config_BIZ_DEFINE);//刷新缓存 } @@ -83,7 +91,7 @@ public class ConfigService : DbRepository, IConfigService } /// - public async Task EditBatch(List devConfigs) + public async Task EditBatch(List devConfigs) { if (devConfigs.Count > 0) { @@ -126,19 +134,19 @@ public class ConfigService : DbRepository, IConfigService /// /// 检查输入参数 /// - /// - private async Task CheckInput(DevConfig devConfig) + /// + private async Task CheckInput(SysConfig sysConfig) { var configs = await GetListByCategory(CateGoryConst.Config_BIZ_DEFINE);//获取全部字典 //判断是否从存在重复字典名 var hasSameKey = - configs.Any(it => it.ConfigKey == devConfig.ConfigKey && it.Id != devConfig.Id); + configs.Any(it => it.ConfigKey == sysConfig.ConfigKey && it.Id != sysConfig.Id); if (hasSameKey) { - throw Oops.Bah($"存在重复的配置键:{devConfig.ConfigKey}"); + throw Oops.Bah($"存在重复的配置键:{sysConfig.ConfigKey}"); } //设置分类为业务 - devConfig.Category = CateGoryConst.Config_BIZ_DEFINE; + sysConfig.Category = CateGoryConst.Config_BIZ_DEFINE; } #endregion 方法 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/Dto/ConfigInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/Dto/ConfigInput.cs similarity index 54% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/Dto/ConfigInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/Dto/ConfigInput.cs index 32cd055..68c5e64 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/Dto/ConfigInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/Dto/ConfigInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 配置分页参数 @@ -10,7 +18,7 @@ public class ConfigPageInput : BasePageInput /// /// 添加配置参数 /// -public class ConfigAddInput : DevConfig +public class ConfigAddInput : SysConfig { /// /// 配置键 @@ -41,7 +49,6 @@ public class ConfigEditInput : ConfigAddInput /// /// 删除配置参数 /// - public class ConfigDeleteInput : BaseIdInput { } @@ -56,5 +63,5 @@ public class ConfigEditBatchInput /// public string CateGory { get; set; } - public List DevConfigs { get; set; } + public List DevConfigs { get; set; } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/IConfigService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/IConfigService.cs similarity index 56% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/IConfigService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/IConfigService.cs index 16a3693..bae3899 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Config/IConfigService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/IConfigService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 系统配置服务 @@ -31,7 +39,7 @@ public interface IConfigService : ITransient /// /// 配置列表 /// - Task EditBatch(List devConfigs); + Task EditBatch(List devConfigs); /// /// 根据分类和配置键获配置 @@ -39,19 +47,19 @@ public interface IConfigService : ITransient /// 分类 /// 配置键 /// 配置信息 - Task GetByConfigKey(string category, string configKey); + Task GetByConfigKey(string category, string configKey); /// /// 根据分类获取配置列表 /// /// 分类名称 /// 配置列表 - Task> GetListByCategory(string category); + Task> GetListByCategory(string category); /// /// 分页查询其他配置 /// /// 查询参数 /// 其他配置列表 - Task> Page(ConfigPageInput input); + Task> Page(ConfigPageInput input); } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs similarity index 60% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs index 0dad08b..68da6a6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/DictService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs @@ -1,9 +1,17 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// /// -public class DictService : DbRepository, IDictService +public class DictService : DbRepository, IDictService { private readonly ISimpleCacheService _simpleCacheService; @@ -13,13 +21,11 @@ public class DictService : DbRepository, IDictService } /// - public async Task> Page(DictPageInput input) + public async Task> Page(DictPageInput input) { - var query = Context.Queryable() - .WhereIF(!string.IsNullOrEmpty(input.Category), - it => it.Category == input.Category)//根据分类查询 - .WhereIF(input.ParentId != null, - it => it.ParentId == input.ParentId || it.Id == input.ParentId)//根据父ID查询 + var query = Context.Queryable() + .Where(it => it.Category == input.Category)//根据分类查询 + .Where(it => it.ParentId == input.ParentId)//根据父ID查询 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.DictLabel.Contains(input.SearchKey) || it.DictValue.Contains(input.SearchKey))//根据关键字查询 @@ -34,7 +40,7 @@ public class DictService : DbRepository, IDictService public async Task Add(DictAddInput input) { await CheckInput(input);//检查参数 - var devDict = input.Adapt();//实体转换 + var devDict = input.Adapt();//实体转换 if (await InsertAsync(devDict))//插入数据 await RefreshCache();//刷新缓存 } @@ -43,7 +49,7 @@ public class DictService : DbRepository, IDictService public async Task Edit(DictAddInput input) { await CheckInput(input);//检查参数 - var devDict = input.Adapt();//实体转换 + var devDict = input.Adapt();//实体转换 if (await UpdateAsync(devDict))//更新数据 await RefreshCache();//刷新缓存 } @@ -51,28 +57,42 @@ public class DictService : DbRepository, IDictService /// public async Task Delete(DictDeleteInput input) { - //获取所有字典 - var dicts = await GetListAsync(); - //获取当前字典分类 - var category = dicts.Where(it => it.Id == input.Id).Select(it => it.Category) - .FirstOrDefault(); - //如果是系统字典提示不可删除 - //if (category == CateGoryConst.Dict_FRM) throw Oops.Bah("不可删除系统内置字典"); - //获取子节点 - var childens = GetDevDictChilden(dicts, input.Id); - //提取ID - var ids = childens.Select(it => it.Id).ToList(); - ids.Add(input.Id);//加上自己的 - //删除数据 - if (await DeleteByIdsAsync(ids.Cast().ToArray())) - await RefreshCache();//刷新缓存 + //获取所有ID + var ids = input.Ids; + if (ids.Count > 0) + { + //获取所有字典 + var dicts = await GetListAsync(); + //判断是否有系统字典 + var frm = dicts.Any(it => + ids.Contains(it.Id) && it.Category == CateGoryConst.Dict_FRM); + + //如果是系统字典提示不可删除 + if (frm) throw Oops.Bah("不可删除系统内置字典"); + var deleteIds = new List();//要删除的id列表 + deleteIds.AddRange(ids);// + ids.ForEach(it => + { + //获取子节点 + var childens = GetDevDictChilden(dicts, it); + //提取ID + var childenIds = childens.Select(c => c.Id).ToList(); + deleteIds.AddRange(childenIds); + }); + //删除数据 + if (await DeleteByIdsAsync(deleteIds.Cast().ToArray())) + await RefreshCache();//刷新缓存 + } } - /// - public override async Task> GetListAsync() + /// + /// 获取全部 + /// + /// + public override async Task> GetListAsync() { //先从redis拿 - var devDicts = _simpleCacheService.Get>(SystemConst.Cache_DevDict); + var devDicts = _simpleCacheService.Get>(SystemConst.Cache_DevDict); if (devDicts == null) { devDicts = await base.GetListAsync();//去数据库拿 @@ -86,7 +106,7 @@ public class DictService : DbRepository, IDictService } /// - public async Task GetDict(string DictValue) + public async Task GetDict(string DictValue) { var devDicts = await GetListAsync(); var devDict = devDicts.Where(it => it.DictValue == DictValue).FirstOrDefault(); @@ -95,7 +115,7 @@ public class DictService : DbRepository, IDictService /// public async Task> GetValuesByDictValue(string DictValue, - List devDictList = null) + List devDictList = null) { var devDicts = devDictList == null ? await GetListAsync() : devDictList;//获取全部 var id = devDicts.Where(it => it.DictValue == DictValue).Select(it => it.Id) @@ -110,7 +130,7 @@ public class DictService : DbRepository, IDictService /// public async Task>> GetValuesByDictValue(string[] DictValues) { - Dictionary> result = new Dictionary>(); + var result = new Dictionary>(); var devDicts = await GetListAsync();//获取全部 var ids = devDicts.Where(it => DictValues.Contains(it.DictValue)).Select(it => it.Id) .ToList();//根据value找到父节点 @@ -123,7 +143,7 @@ public class DictService : DbRepository, IDictService } /// - public async Task> Tree(DictTreeInput input) + public async Task> Tree(DictTreeInput input) { var devDicts = await GetListAsync();//获取字典列表 var devList = devDicts @@ -133,14 +153,14 @@ public class DictService : DbRepository, IDictService } /// - public List ConstructResourceTrees(List dictList, long parentId = 0) + public List ConstructResourceTrees(List dictList, long parentId = 0) { //找下级字典ID列表 var resources = dictList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode) .ToList(); if (resources.Count > 0)//如果数量大于0 { - var data = new List(); + var data = new List(); foreach (var item in resources)//遍历字典 { item.Children = ConstructResourceTrees(dictList, item.Id);//添加子节点 @@ -148,7 +168,7 @@ public class DictService : DbRepository, IDictService } return data;//返回结果 } - return new List(); + return new List(); } #region 方法 @@ -165,25 +185,25 @@ public class DictService : DbRepository, IDictService /// /// 检查输入参数 /// - /// - private async Task CheckInput(DevDict devDict) + /// + private async Task CheckInput(SysDict sysDict) { var dicts = await GetListAsync();//获取全部字典 //判断是否从存在重复字典名 var hasSameLable = dicts.Any(it => - it.ParentId == devDict.ParentId && it.Category == devDict.Category - && it.DictLabel == devDict.DictLabel && it.Id != devDict.Id); + it.ParentId == sysDict.ParentId && it.Category == sysDict.Category + && it.DictLabel == sysDict.DictLabel && it.Id != sysDict.Id); if (hasSameLable) { - throw Oops.Bah($"存在重复的字典名称:{devDict.DictLabel}"); + throw Oops.Bah($"存在重复的字典名称:{sysDict.DictLabel}"); } //判断是否存在重复字典值 var hasSameValue = dicts.Any(it => - it.ParentId == devDict.ParentId && it.DictValue == devDict.DictValue - && it.Id != devDict.Id); + it.ParentId == sysDict.ParentId && it.DictValue == sysDict.DictValue + && it.Id != sysDict.Id); if (hasSameValue) { - throw Oops.Bah($"存在重复的字典值:{devDict.DictValue}"); + throw Oops.Bah($"存在重复的字典值:{sysDict.DictValue}"); } } @@ -193,13 +213,13 @@ public class DictService : DbRepository, IDictService /// 字典列表 /// 父ID /// - public List GetDevDictChilden(List dictList, long parentId) + public List GetDevDictChilden(List dictList, long parentId) { //找下级ID列表 var resources = dictList.Where(it => it.ParentId == parentId).ToList(); if (resources.Count > 0)//如果数量大于0 { - var data = new List(); + var data = new List(); foreach (var item in resources)//遍历机构 { var orgs = GetDevDictChilden(dictList, item.Id); @@ -208,7 +228,7 @@ public class DictService : DbRepository, IDictService } return data;//返回结果 } - return new List(); + return new List(); } #endregion 方法 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/Dto/DictInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/Dto/DictInput.cs similarity index 51% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/Dto/DictInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/Dto/DictInput.cs index d2afbff..ddf97c7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/Dto/DictInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/Dto/DictInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 字典查询参数 @@ -26,18 +34,18 @@ public class DictPageInput : BasePageInput /// /// 父id /// - public long? ParentId { get; set; } + public long ParentId { get; set; } /// /// 分类 /// - public string Category { get; set; } + public string Category { get; set; } = SysDictConst.DICT_CATEGORY_FRM; } /// /// 添加字典参数 /// -public class DictAddInput : DevDict +public class DictAddInput : SysDict { /// /// 父ID @@ -56,6 +64,13 @@ public class DictAddInput : DevDict [Required(ErrorMessage = "DictValue不能为空")] public override string DictValue { get; set; } + + public override long Id { get; set; } + + /// + /// 状态 + /// + public override string Status { get; set; } = SysDictConst.COMMON_STATUS_ENABLE; } /// @@ -73,6 +88,6 @@ public class DictEditInput : DictAddInput /// /// 删除字典参数 /// -public class DictDeleteInput : BaseIdInput +public class DictDeleteInput : BaseIdListInput { } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/IDictService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs similarity index 64% rename from api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/IDictService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs index 8a337bf..27d1fe1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Dict/IDictService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 字典服务 @@ -18,7 +26,7 @@ public interface IDictService : ITransient /// 字典列表 /// 父ID /// 字典树形结构 - List ConstructResourceTrees(List dictList, long parentId = 0); + List ConstructResourceTrees(List dictList, long parentId = 0); /// /// 删除字典 @@ -39,13 +47,13 @@ public interface IDictService : ITransient /// /// 字典 /// - Task GetDict(string DictValue); + Task GetDict(string DictValue); /// /// 获取所有 /// /// 字典列表 - Task> GetListAsync(); + Task> GetListAsync(); /// /// 根据字典DictValue获取字典值列表 @@ -53,7 +61,7 @@ public interface IDictService : ITransient /// 字典值 /// 字典列表 /// 字典值列表 - Task> GetValuesByDictValue(string DictValue, List devDictList = null); + Task> GetValuesByDictValue(string DictValue, List devDictList = null); /// /// 根据字典DictValue列表获取对应字典值列表 @@ -67,12 +75,12 @@ public interface IDictService : ITransient /// /// 查询参数 /// 字典分页列表 - Task> Page(DictPageInput input); + Task> Page(DictPageInput input); /// /// 获取字典树形结构 /// /// 查询参数 /// 字典树形结构 - Task> Tree(DictTreeInput input); + Task> Tree(DictTreeInput input); } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgInput.cs similarity index 74% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgInput.cs index 7df2175..fc9caa7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 组织分页查询参数 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs new file mode 100644 index 0000000..915e30a --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs @@ -0,0 +1,9 @@ +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs similarity index 84% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs index fc9d379..d7e50a0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/ISysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 组织架构服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs similarity index 96% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs index ea487c1..facac15 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/SysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// public class SysOrgService : DbRepository, ISysOrgService @@ -146,7 +154,6 @@ public class SysOrgService : DbRepository, ISysOrgService return false; } - /// public async Task> GetOrgListByIdList(IdListInput input) { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionInput.cs similarity index 62% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionInput.cs index 72e5356..7a0cec2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 职位分页查询 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs new file mode 100644 index 0000000..915e30a --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs @@ -0,0 +1,9 @@ +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs similarity index 71% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs index 9ca075e..f0414a7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/ISysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 职位服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs similarity index 90% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs index 58ae19a..5a79b52 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/SysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs @@ -1,4 +1,10 @@ -using Masuit.Tools.Models; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; @@ -16,7 +22,10 @@ public class SysPositionService : DbRepository, ISysPositionService _sysOrgService = sysOrgService; } - /// + /// + /// 获取全部 + /// + /// public override async Task> GetListAsync() { //先从Redis拿 @@ -44,7 +53,6 @@ public class SysPositionService : DbRepository, ISysPositionService return positionList; } - /// public async Task> PositionSelector(PositionSelectorInput input) { @@ -187,4 +195,4 @@ public class SysPositionService : DbRepository, ISysPositionService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserInput.cs similarity index 90% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserInput.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserInput.cs index 98a7787..5c9a041 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户选择器参数 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserOutPut.cs similarity index 87% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserOutPut.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserOutPut.cs index 99b3e1b..070bb4b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/Dto/UserOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/Dto/UserOutPut.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 选择用户输出参数 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs similarity index 90% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs index ab7a855..55ea1e1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/ISysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 用户服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs similarity index 97% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs index 1674698..c21eff0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/User/SysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs @@ -1,5 +1,10 @@ -using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; -using System.Linq.Expressions; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; @@ -126,9 +131,6 @@ public class SysUserService : DbRepository, ISysUserService return sysUser; } - - - /// public async Task GetIdByAccount(string account) { @@ -262,12 +264,16 @@ public class SysUserService : DbRepository, ISysUserService { case CateGoryConst.SCOPE_ALL: return null; + case CateGoryConst.SCOPE_ORG_CHILD: return userInfo.ScopeOrgChildList; + case CateGoryConst.SCOPE_ORG: return new List { userInfo.OrgId }; + case CateGoryConst.SCOPE_ORG_DEFINE: return dataScope.DataScopes; + case CateGoryConst.SCOPE_SELF: return new List(); } @@ -408,7 +414,7 @@ public class SysUserService : DbRepository, ISysUserService sysUser.Avatar = AvatarUtil.GetNameImageBase64(sysUser.Name); //获取默认密码 sysUser.Password = await GetDefaultPassWord(true);//设置密码 - sysUser.UserStatus = DevDictConst.COMMON_STATUS_ENABLE;//默认状态 + sysUser.UserStatus = SysDictConst.COMMON_STATUS_ENABLE;//默认状态 await InsertAsync(sysUser);//添加数据 } @@ -479,7 +485,7 @@ public class SysUserService : DbRepository, ISysUserService //设置状态为禁用 if (await UpdateAsync(it => new SysUser { - UserStatus = DevDictConst.COMMON_STATUS_DISABLED + UserStatus = SysDictConst.COMMON_STATUS_DISABLED }, it => it.Id == input.Id)) DeleteUserFromRedis(input.Id);//从redis删除用户信息 } @@ -492,7 +498,7 @@ public class SysUserService : DbRepository, ISysUserService //设置状态为启用 if (await UpdateAsync(it => new SysUser { - UserStatus = DevDictConst.COMMON_STATUS_ENABLE + UserStatus = SysDictConst.COMMON_STATUS_ENABLE }, it => it.Id == input.Id)) DeleteUserFromRedis(input.Id);//从redis删除用户信息 } @@ -901,26 +907,26 @@ public class SysUserService : DbRepository, ISysUserService #region 校验性别等字典 - var genders = await _dictService.GetValuesByDictValue(DevDictConst.GENDER, dicts); + var genders = await _dictService.GetValuesByDictValue(SysDictConst.GENDER, dicts); if (!genders.Contains(item.Gender)) item.ErrorInfo.Add(nameof(item.Gender), $"性别只能是男和女"); if (!string.IsNullOrEmpty(item.Nation)) { - var nations = await _dictService.GetValuesByDictValue(DevDictConst.NATION, dicts); + var nations = await _dictService.GetValuesByDictValue(SysDictConst.NATION, dicts); if (!nations.Contains(item.Nation)) item.ErrorInfo.Add(nameof(item.Nation), $"不存在的民族"); } if (!string.IsNullOrEmpty(item.IdCardType)) { var idCarTypes = - await _dictService.GetValuesByDictValue(DevDictConst.IDCARD_TYPE, dicts); + await _dictService.GetValuesByDictValue(SysDictConst.IDCARD_TYPE, dicts); if (!idCarTypes.Contains(item.IdCardType)) item.ErrorInfo.Add(nameof(item.IdCardType), $"证件类型错误"); } if (!string.IsNullOrEmpty(item.CultureLevel)) { var cultrueLevels = - await _dictService.GetValuesByDictValue(DevDictConst.CULTURE_LEVEL, dicts); + await _dictService.GetValuesByDictValue(SysDictConst.CULTURE_LEVEL, dicts); if (!cultrueLevels.Contains(item.CultureLevel)) item.ErrorInfo.Add(nameof(item.CultureLevel), $"文化程度有误"); } @@ -941,7 +947,7 @@ public class SysUserService : DbRepository, ISysUserService //默认值赋值 sysUsers.ForEach(user => { - user.UserStatus = DevDictConst.COMMON_STATUS_ENABLE;//状态 + user.UserStatus = SysDictConst.COMMON_STATUS_ENABLE;//状态 user.Phone = CryptogramUtil.Sm4Encrypt(user.Phone);//手机号 user.Password = defaultPassword;//默认密码 user.Avatar = AvatarUtil.GetNameImageBase64(user.Name);//默认头像 @@ -960,7 +966,7 @@ public class SysUserService : DbRepository, ISysUserService { //获取默认密码 var defaultPassword = (await _configService.GetByConfigKey(CateGoryConst.Config_PWD_POLICY, - DevConfigConst.PWD_DEFAULT_PASSWORD)).ConfigValue; + SysConfigConst.PWD_DEFAULT_PASSWORD)).ConfigValue; return isSm4 ? CryptogramUtil.Sm4Encrypt(defaultPassword) : defaultPassword;//判断是否需要加密 } @@ -1026,7 +1032,7 @@ public class SysUserService : DbRepository, ISysUserService /// /// 获取Sqlsugar的ISugarQueryable - /// + /// /// /// private async Task> GetQuery(UserPageInput input) @@ -1059,7 +1065,6 @@ public class SysUserService : DbRepository, ISysUserService return query; } - /// /// 数据库获取用户信息 /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgOutput.cs deleted file mode 100644 index 10b1c27..0000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Org/Dto/SysOrgOutput.cs +++ /dev/null @@ -1 +0,0 @@ -namespace SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionOutput.cs deleted file mode 100644 index 10b1c27..0000000 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Position/Dto/PositionOutput.cs +++ /dev/null @@ -1 +0,0 @@ -namespace SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs index 10b1c27..915e30a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs @@ -1 +1,9 @@ -namespace SimpleAdmin.System; \ No newline at end of file +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationOutput.cs index 52dd398..14d7bb3 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System.Services.System.Relation.Dto; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System.Services.System.Relation.Dto; public class RelationOutput { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs index 339b5ee..caa7a8c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/IRelationService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 关系服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs index c9ef5d7..8c5c67c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// public class Relationservice : DbRepository, IRelationService diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/Dto/ResourceOutPut.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceOutPut.cs similarity index 71% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/Dto/ResourceOutPut.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceOutPut.cs index 2e147a5..5ce1288 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/Dto/ResourceOutPut.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Dto/ResourceOutPut.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 角色授权资源树输出 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs similarity index 78% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs index 57710d7..2a9ae2b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/IResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 资源服务 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs similarity index 83% rename from api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs rename to api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs index 6b1f36b..44a615e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/Resource/ResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs @@ -1,4 +1,12 @@ -using System.ComponentModel; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using System.ComponentModel; namespace SimpleAdmin.System; @@ -29,7 +37,13 @@ public class ResourceService : DbRepository, IResourceService var sysResources = new List(); //定义资源分类列表,如果是空的则获取全部资源 - categoryList = categoryList != null ? categoryList : new List { CateGoryConst.Resource_MENU, CateGoryConst.Resource_BUTTON, CateGoryConst.Resource_SPA, CateGoryConst.Resource_MODULE }; + categoryList = categoryList != null + ? categoryList + : new List + { + CateGoryConst.Resource_MENU, CateGoryConst.Resource_BUTTON, + CateGoryConst.Resource_SPA, CateGoryConst.Resource_MODULE + }; //遍历列表 foreach (var category in categoryList) { @@ -45,11 +59,15 @@ public class ResourceService : DbRepository, IResourceService public async Task> GetaModuleAndMenuAndSpaList() { //获取所有的菜单和模块以及单页面列表, - var sysResources = await GetListAsync(new List { CateGoryConst.Resource_MODULE, CateGoryConst.Resource_MENU, CateGoryConst.Resource_SPA }); + var sysResources = await GetListAsync(new List + { + CateGoryConst.Resource_MODULE, CateGoryConst.Resource_MENU, CateGoryConst.Resource_SPA + }); if (sysResources != null) { //并按分类和排序码排序 - sysResources = sysResources.OrderBy(it => it.Category).ThenBy(it => it.SortCode).ToList(); + sysResources = sysResources.OrderBy(it => it.Category).ThenBy(it => it.SortCode) + .ToList(); } return sysResources; } @@ -58,12 +76,14 @@ public class ResourceService : DbRepository, IResourceService public async Task> GetMenuAndSpaListByModuleId(long id) { //获取所有的菜单和模块以及单页面列表, - var sysResources = await GetListAsync(new List { CateGoryConst.Resource_MENU, CateGoryConst.Resource_SPA }); + var sysResources = await GetListAsync(new List + { CateGoryConst.Resource_MENU, CateGoryConst.Resource_SPA }); if (sysResources != null) { //并按分类和排序码排序 sysResources = sysResources - .Where(it => it.Category == CateGoryConst.Resource_SPA || it.Module == id)//根据模块ID获取菜单 + .Where(it => + it.Category == CateGoryConst.Resource_SPA || it.Module == id)//根据模块ID获取菜单 .OrderBy(it => it.Category).ThenBy(it => it.SortCode).ToList();//排序 } return sysResources; @@ -104,7 +124,8 @@ public class ResourceService : DbRepository, IResourceService } /// - public List GetChildListById(List sysResources, long resId, bool isContainOneself = true) + public List GetChildListById(List sysResources, long resId, + bool isContainOneself = true) { //查找下级 var childLsit = GetResourceChilden(sysResources, resId); @@ -121,7 +142,8 @@ public class ResourceService : DbRepository, IResourceService public async Task> GetListByCategory(string category) { //先从Redis拿 - var sysResources = _simpleCacheService.Get>(SystemConst.Cache_SysResource + category); + var sysResources = + _simpleCacheService.Get>(SystemConst.Cache_SysResource + category); if (sysResources == null) { //redis没有就去数据库拿 @@ -158,7 +180,9 @@ public class ResourceService : DbRepository, IResourceService var permissions = new List();//权限列表 // 获取所有需要数据权限的控制器 - var controllerTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(RolePermissionAttribute), false)); + var controllerTypes = App.EffectiveTypes.Where(u => + !u.IsInterface && !u.IsAbstract && u.IsClass + && u.IsDefined(typeof(RolePermissionAttribute), false)); foreach (var controller in controllerTypes) { //获取数据权限特性 @@ -176,7 +200,8 @@ public class ResourceService : DbRepository, IResourceService foreach (var menthod in menthods) { //获取忽略数据权限特性 - var ignoreRolePermission = menthod.GetCustomAttribute(); + var ignoreRolePermission = + menthod.GetCustomAttribute(); if (ignoreRolePermission == null)//如果是空的代表需要数据权限 { //获取接口描述 @@ -225,9 +250,6 @@ public class ResourceService : DbRepository, IResourceService return menus; } - - - #region 方法 /// @@ -300,12 +322,15 @@ public class ResourceService : DbRepository, IResourceService /// /// 模块ID /// - public async Task> GetRoleGrantResourceMenus(long moduleId) + public async Task> GetRoleGrantResourceMenus( + long moduleId) { var roleGrantResourceMenus = new List();//定义结果 - var allMenuList = (await GetListByCategory(CateGoryConst.Resource_MENU)).Where(it => it.Module == moduleId).ToList();//获取所有菜单列表 + var allMenuList = (await GetListByCategory(CateGoryConst.Resource_MENU)) + .Where(it => it.Module == moduleId).ToList();//获取所有菜单列表 var allButtonList = await GetListByCategory(CateGoryConst.Resource_BUTTON);//获取所有按钮列表 - var parentMenuList = allMenuList.Where(it => it.ParentId == SimpleAdminConst.Zero).ToList();//获取一级目录 + var parentMenuList = + allMenuList.Where(it => it.ParentId == SimpleAdminConst.Zero).ToList();//获取一级目录 //遍历一级目录 foreach (var parent in parentMenuList) @@ -321,22 +346,26 @@ public class ResourceService : DbRepository, IResourceService foreach (var menu in menuList) { //如果菜单类型是菜单 - if (menu.MenuType == ResourceConst.MENU) + if (menu.MenuType is ResourceConst.MENU or ResourceConst.SUBSET) { //获取菜单下按钮集合并转换成对应实体 - var buttonList = allButtonList.Where(it => it.ParentId == menu.Id).ToList(); - var buttons = buttonList.Adapt>(); + var buttonList = allButtonList.Where(it => it.ParentId == menu.Id) + .ToList(); + var buttons = buttonList + .Adapt>(); roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu { Id = menu.Id, ParentId = parent.Id, ParentName = parent.Title, Module = moduleId, - Title = GetRoleGrantResourceMenuTitle(menuList, menu),//菜单名称需要特殊处理因为有二级菜单 + Title = GetRoleGrantResourceMenuTitle(menuList, + menu),//菜单名称需要特殊处理因为有二级菜单 Button = buttons }); } - else if (menu.MenuType == ResourceConst.LINK || menu.MenuType == ResourceConst.IFRAME)//如果是内链或者外链 + else if (menu.MenuType == ResourceConst.LINK + || menu.MenuType == ResourceConst.IFRAME)//如果是内链或者外链 { //直接加到资源列表 roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu @@ -378,7 +407,8 @@ public class ResourceService : DbRepository, IResourceService { //获取菜单下按钮集合并转换成对应实体 var buttonList = allButtonList.Where(it => it.ParentId == parent.Id).ToList(); - roleGrantResourcesButtons.Button = buttonList.Adapt>(); + roleGrantResourcesButtons.Button = + buttonList.Adapt>(); } roleGrantResourceMenus.Add(roleGrantResourcesButtons); } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs index 995e119..0b244aa 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 编辑个人信息参数 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs index ea979e9..9ebedc1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 我的机构数样式 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs index ffddfd7..c9abe71 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 个人信息中心服务 @@ -31,7 +39,7 @@ public interface IUserCenterService : ITransient /// /// 查询参数 /// 站内信列表 - Task> LoginMessagePage(MessagePageInput input); + Task> LoginMessagePage(MessagePageInput input); /// /// 读取登录用户站内信详情 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs index f782e3b..9136134 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs @@ -1,4 +1,12 @@ -using System.Text.RegularExpressions; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using System.Text.RegularExpressions; namespace SimpleAdmin.System; @@ -105,7 +113,7 @@ public class UserCenterService : DbRepository, IUserCenterService { //如果没数据去系统配置里取默认的工作台 var devConfig = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, - DevConfigConst.SYS_DEFAULT_WORKBENCH_DATA); + SysConfigConst.SYS_DEFAULT_WORKBENCH_DATA); if (devConfig != null) { return devConfig.ConfigValue.ToLower();//返回工作台信息 @@ -134,7 +142,7 @@ public class UserCenterService : DbRepository, IUserCenterService } /// - public async Task> LoginMessagePage(MessagePageInput input) + public async Task> LoginMessagePage(MessagePageInput input) { var messages = await _messageService.MyMessagePage(input, UserManager.UserId);//分页查询 return messages; @@ -236,16 +244,16 @@ public class UserCenterService : DbRepository, IUserCenterService var newPassword = CryptogramUtil.Sm2Decrypt(input.NewPassword);//sm2解密 var loginPolicy = await _configService.GetListByCategory(CateGoryConst.Config_PWD_POLICY);//获取密码策略 - var containNumber = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_NUM) + var containNumber = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_NUM) .ConfigValue.ToBoolean();//是否包含数字 - var containLower = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_LOWER) + var containLower = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_LOWER) .ConfigValue.ToBoolean();//是否包含小写 - var containUpper = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_UPPER) + var containUpper = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_UPPER) .ConfigValue.ToBoolean();//是否包含大写 var containChar = loginPolicy - .First(it => it.ConfigKey == DevConfigConst.PWD_CONTAIN_CHARACTER).ConfigValue + .First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_CHARACTER).ConfigValue .ToBoolean();//是否包含特殊字符 - var minLength = loginPolicy.First(it => it.ConfigKey == DevConfigConst.PWD_MIN_LENGTH) + var minLength = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_MIN_LENGTH) .ConfigValue.ToInt();//最小长度 if (minLength > newPassword.Length) throw Oops.Bah($"密码长度不能小于{minLength}"); @@ -328,7 +336,6 @@ public class UserCenterService : DbRepository, IUserCenterService return parentList; } - /// /// 构建Meta /// @@ -340,8 +347,12 @@ public class UserCenterService : DbRepository, IUserCenterService //定义meta var meta = new Meta { - Icon = it.Icon, Title = it.Title, IsAffix = it.IsAffix, IsHide = it.IsHide, - IsKeepAlive = it.IsKeepAlive, IsFull = it.IsFull, + Icon = it.Icon, + Title = it.Title, + IsAffix = it.IsAffix, + IsHide = it.IsHide, + IsKeepAlive = it.IsKeepAlive, + IsFull = it.IsFull, ActiveMenu = it.ActiveMenu, IsLink = it.Category == ResourceConst.LINK ? it.Path : "" }; diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj index 3e76d74..0fd38c7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj @@ -1,79 +1,79 @@  - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.System.xml - enable - enable - True - + + net7.0;net6.0 + 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 + SimpleAdmin.System.xml + enable + enable + True + - - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - + + 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 + - - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - + + 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 + + + + + + - - - + + + + + - - - - - + + + PreserveNewest + + + PreserveNewest + + - - - - - + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + - - - PreserveNewest - - - PreserveNewest - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - + + + diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index 752927f..ed6838c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -426,271 +426,271 @@ 排序码 - + 配置 - + 配置键 - + 配置值 - + 分类 - + 备注 - + 排序码 - + 字典 - + 父id - + 字典文字 - + 字典值 - + 分类 - + 排序码 - + + + 状态 + + + 子节点 - + 文件表 - + 存储引擎 - + 存储桶 - + 文件名称 - + 文件后缀 - + 文件大小kb - + 文件大小(格式化后) - + 文件的对象名(唯一名称) - + 文件存储路径 - + 文件下载路径 - + 图片缩略图 - + 操作日志表 - + 具体消息 - + 类名称 - + 方法名称 - + 请求方式 - + 请求地址 - + 请求参数 - + 返回结果 - + 访问日志表 - + 日志分类 - + 日志名称 - + 执行状态 - + 操作ip - + 操作地址 - + 操作浏览器 - + 操作系统 - + 操作时间 - + 操作人姓名 - + 操作人姓名 - + 站内信 - + 分类 - + 主题 - + 正文 - + 是否已读 - + 用户消息表 - + 消息Id - + 用户Id - + 已读未读 - - - 开发关系表 - - 组织 @@ -813,12 +813,7 @@ - 别名 - - - - - 别名 + 描述 @@ -863,12 +858,12 @@ - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + 是否在菜单中隐藏 (通常列表详情页需要隐藏) @@ -923,7 +918,7 @@ - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + 是否在菜单中隐藏 (通常列表详情页需要隐藏) @@ -933,7 +928,7 @@ - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + 是否在菜单中隐藏 (通常列表详情页需要隐藏) @@ -1736,14 +1731,14 @@ - + 登录之前执行的方法 - + 登录错误操作 @@ -2459,3824 +2454,3835 @@ id - - + + + 文件分页输出 + - - + + + 文件引擎 + - + + + + + + - + - + - + - + - + - + - 刷新缓存 + 存储文件 - 分类 - + + - + - 检查输入参数 + 存储本地文件 - + + - + - 配置分页参数 + 存储到minio + + + - + - 添加配置参数 + 获取文件大小 + + - + - 配置键 + 判断是否是图片 + 后缀名 + - + - 配置值 + 文件管理服务 - + - 编辑配置参数 + 删除文件 + ID列表 + - + - ID + 文件下载 + 文件iD + 文件流 - + - 删除配置参数 + 获取FileStreamResult文件流 + 路径 + 文件名 + 路径是否是文件夹 + - + - 批量修改输入参数 + 获取FileStreamResult文件流 + 文件数组 + 文件名 + - + - 分类 + 文件分页查询 + 查询参数 + 文件列表 - + - 系统配置服务 + 上传文件到本地返回下载url + 文件引擎 + 文件 + - + - 新增配置 + 站内信分类 - 新增参数 - - + - 删除配置 + 发送参数 - 删除 - - + - 修改配置 + 主题 - 修改参数 - - + - 批量编辑 + 分类 - 配置列表 - - + - 根据分类和配置键获配置 + 接收人Id - 分类 - 配置键 - 配置信息 - + - 根据分类获取配置列表 + 消息详情 - 分类名称 - 配置列表 - + - 分页查询其他配置 + 接收信息类 - 查询参数 - 其他配置列表 - + - + 接收人ID - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - 刷新缓存 + 接收人姓名 - + - 检查输入参数 + 是否已读 - - + - 获取字典所有下级 + 站内信服务 - 字典列表 - 父ID - - + - 字典查询参数 + 删除消息 + id列表 + - + - 字典树参数 + 删除我的消息 + + + - + - 字典分类 + 获取消息详情 + 消息ID + 是否是自己 + 消息详情 - + - 字典查询参数 + 我的消息列表 + + + - - - 父id + + + 分页查询 + 查询参数 + - - - 分类 + + + 发送站内信 + 站内信信息 + - + - 添加字典参数 + 获取未读消息数 + + - + - 父ID + - - - 字典名称 - + + - - - 字典值 - + + - - - 编辑字典参数 - + + - + + + + + + + + + + + + + - ID + 导入预览输入 - + - 删除字典参数 + 文件导入通用输出 - + - 字典服务 + 是否有错误 - + - 添加字典 + 动态表头 - 输入参数 - - + - 构建字典树形结构 + 数据 - 字典列表 - 父ID - 字典树形结构 - + - 删除字典 + 动态表头 - 删除参数 - - + - 编辑字典 + 标题 - 输入参数 - - + - 获取字典 + 数据源 - 字典 - - + - 获取所有 + 宽度 - 字典列表 - + - 根据字典DictValue获取字典值列表 + 超过宽度将自动省略 - 字典值 - 字典列表 - 字典值列表 - + - 根据字典DictValue列表获取对应字典值列表 + 是否是日期格式 - 字典值列表 - - + - 字典分页查询 + 批量导入结果输入 - 查询参数 - 字典分页列表 + - + - 获取字典树形结构 + 数据 - 查询参数 - 字典树形结构 - + - 文件分页输出 + 导入结果输出 - + - 文件引擎 + 是否成功 - + - + 总数 - - - - - - - - - - - - - - - - - - - + - 存储文件 + 导入数量 - - - + - 存储本地文件 + 错误数 - - - + - 存储到minio + 数据 - - - - + - 获取文件大小 + 导入基础输入 - - - + - 判断是否是图片 + Id - 后缀名 - - + - 文件管理服务 + 是否有错误 - + - 删除文件 + 错误详情 - ID列表 - - + - 文件下载 + 导入服务 - 文件iD - 文件流 - + - 获取FileStreamResult文件流 + 导出数据 - 路径 + + 数据 文件名 - 路径是否是文件夹 - + 文件流 - + - 获取FileStreamResult文件流 + 获取本地模板 - 文件数组 文件名 - + 模板文件夹路径:默认wwwroot下的Template + 文件流 - + - 文件分页查询 + 生成模板 - 查询参数 - 文件列表 + 实体类 + 文件名 + 文件流 - + - 上传文件到本地返回下载url + 获取导入预览 - 文件引擎 + 文件 - - - - - 站内信分类 - + 导入预览结果 - + - 发送参数 + 获取预计导入结果 + + 数据 + 成功导入数据 + 预计导入结果 - + - 主题 + 导入文件验证 + 文件 + 文件最大体积(M) + 允许的格式 - + - 分类 + 模板数据验证 + 模板类实体 + 结果 + 导入预览数据 - + - 接收人Id + - - - 消息详情 - + + - - - 接收信息类 - + + - + + + + + + + + + + + + + - 接收人ID + 获取文件流 + + + + - + - 接收人姓名 + 获取文件流 + + + - + - 是否已读 + 获取文件名 + + - + - 站内信服务 + 获取本地模板路径 + - + - 删除消息 + 日程列表查询参数 - id列表 - - + - 删除我的消息 + 日程日期 - - - - + - 获取消息详情 + 日程日期 - 消息ID - 是否是自己 - 消息详情 - + - 我的消息列表 + 日程内容 - - - - + - 分页查询 + 日程时间 - 查询参数 - - + - 发送站内信 + ID - 站内信信息 + + + + 首页服务 + + + + + 添加日程 + + 日程参数 - + - 获取未读消息数 + 删除日程 - + id列表 - + - + 获取日程列表 + 查询参数 + 日程列表 - - + + + + - - + + - - + + - + + + + + + + + + + + + - + - + - + - + - 操作日志分页输入 + 检查输入参数 + - + - 操作日志日志删除输入 + 父ID - + - 操作日志周统计输出 + 添加按钮参数 - + - 日期 + 父ID - + - 名称 + 标题 - + - 数量 + 编码 - + - 操作日志统计 + ID - + - 操作日志服务 + 权限按钮服务 - + - 根据分类删除操作日志 + 添加按钮 - 分类名称 + 添加参数 - + - 日志详情 + 批量添加 - id - 日志详情 + + - + - 操作日志分页查询 + 删除按钮 - 查询参数 - 分页列表 + 删除参数 + - + - 操作日志周统计 + 编辑按钮 - 天数 - 统计结果 + 编辑参数 + - + - 操作日志总览 + 按钮分页查询 - 异常日志和操作日志的数量 + 查询条件 + 按钮分页列表 - + - + 菜单树查询参数 - + - 操作日志中文名称 + 模块 - + - 异常日志中文名称 + 关键字 - - - - - - - - - - - - - - - - + - 访问日志分页输入 + 添加菜单参数 - + - 分类 + 父ID - + - 账号 + 标题 - + - 访问日志删除输入 + 菜单类型 - + - 分类 + 模块 - + - 周统计输出 + 路径 - + - 日期 + 图标 - + - 登录次数 + 特殊验证 + + + - + - 登出次数 + 编辑菜单输入参数 - + - 访问日志总数输出 + ID - + - 类型 + 改变模块输入参数 - + - 数量 + 模块ID - + - 访问日志服务 + 菜单服务 - + - 根据分类删除 + 添加菜单 - 分类名称 + 添加参数 - + - 访问日志分页查询 + 详情 - 查询参数 - 日志列表 + id + 详细信息 - + - 根统计N天来登录和登出数量 + 构建菜单树形结构 - 天使 - 统计信息 + 菜单列表 + 父ID + 菜单形结构 - + - 统计登录登出总览 + 获取菜单树 - 登录和登出的数量 + 菜单树查询参数 + 菜单树列表 - + - + 编辑菜单 + + 菜单编辑参数 + + + + + 删除菜单 + 删除菜单参数 + - + + + 改变菜单模块 + + 改变菜单模块参数 + + + + + + + + + + + - + - + - + - + + + + + + + - 导入预览输入 + 检查输入参数 + - + - 文件导入通用输出 + 模块分页输入 - + - 是否有错误 + 添加模块输入 - + - 动态表头 + 编辑模块输入 - + - 数据 + ID - + - 动态表头 + 模块管理服务 - + - 标题 + 添加模块 + 添加参数 + - + - 数据源 + 删除模块 + 删除参数 + - + - 宽度 + 编辑模块 + 编辑参数 + - + - 超过宽度将自动省略 + 分页查询 + 分页参数 + - + - 是否是日期格式 + - + + + + + + + + + + + + + - 批量导入结果输入 + 检查输入参数 - + - + - 数据 + 角色查询参数 - + - 导入结果输出 + 角色添加参数 - + - 是否成功 + 名称 - + - 总数 + 分类 - + - 导入数量 + 角色编辑参数 - + - 错误数 + Id - + - 数据 + 角色授权资源参数 - + - 导入基础输入 + 角色Id - + - Id + 授权资源信息 - + - 是否有错误 + 是否代码生成 - + - 错误详情 + 角色授权资源参数 - + - 导入服务 + 角色Id - + - 导出数据 + 授权权限信息 - - 数据 - 文件名 - 文件流 - + - 获取本地模板 + 角色授权用户参数 - 文件名 - 模板文件夹路径:默认wwwroot下的Template - 文件流 - + - 生成模板 + Id - 实体类 - 文件名 - 文件流 - + - 获取导入预览 + 授权权限信息 - - 文件 - 导入预览结果 - + - 获取预计导入结果 + 角色选择器参数 - - 数据 - 成功导入数据 - 预计导入结果 - + - 导入文件验证 + 组织ID - 文件 - 文件最大体积(M) - 允许的格式 - + - 模板数据验证 + 机构ID列表 - 模板类实体 - 结果 - 导入预览数据 - + - + 关键字 - - + + + 角色分类 + - - + + + 角色拥有的资源输出 + - - + + + Id + - - + + + 已授权资源信息 + - - + + + 角色拥有权限输出 + - - + + + 角色Id + - + - 获取文件流 + 已授权资源信息 + + + + + 角色服务 + + + + + 获取所有角色 - - - - + - 获取文件流 + 添加角色 - - + 添加参数 - + - 获取文件名 + 删除角色 - + 删除参数 - + - 获取本地模板路径 + 编辑角色 + 编辑参数 - + - 日程列表查询参数 + 根据用户ID获取用户角色集合 + 用户ID + - + - 日程日期 + 给角色授权权限 + 授权信息 + - + - 日程日期 + 给角色授权 + 授权参数 + - + - 日程内容 + 给角色授权用户 + 授权信息 + - + - 日程时间 + 获取角色拥有权限 + 角色ID + - + - ID + 角色拥有资源 + 角色id + 资源类型 + 角色拥有资源信息 - + - 首页服务 + 获取角色下的用户 + 角色ID + - + - 添加日程 + 分页查询角色 - 日程参数 + 查询参数 - + - 删除日程 + 刷新缓存 - id列表 - + - 获取日程列表 + 获取角色授权权限选择器 - 查询参数 - 日程列表 + 角色ID + - + - + 角色选择器 + + - + + + 根据id集合获取角色集合 + + + + + + + + - + - + - - - 组织分页查询参数 - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 父ID + 检查输入参数 + - + - 机构列表 + 单页输入参数 - + - 组织添加参数 + 菜单类型 - + - 组织修改参数 + 单页输入参数 - + - Id + 标题 - + - 组织复制参数 + 菜单类型 - + - 目标ID + 路径 - + - 组织Id列表 + 图标 - + - 是否包含下级 + 单页修改参数 - + - 组织导入 + ID - - - 名称 - - - - - 上级组织 + + + 单页服务 - - - 分类 + + + 添加单页 + 添加参数 + - - - 排序码 + + + 删除单页 + 删除参数 + - - - 主管账号 + + + 编辑单页 + 编辑参数 + - + - 组织树查询参数 - 懒加载用 + 分页查询 + + - + - 父Id + - + + + + + + + + + + + + + - 组织架构服务 + 检查输入参数 + - + - 检查组织是否存在 + 操作日志分页输入 - 组织列表 - 组织名称 - 父Id - 组织Id - 是否存在,存在返回组织ID - + - 组织详情 + 操作日志日志删除输入 - id参数 - 组织信息 - + - 根据组织ID获取 下级 + 操作日志周统计输出 - 组织ID - 是否包含自己 - - + - 获取所有组织 + 日期 - 组织列表 - + - 获取机构及下级ID列表 + 名称 - - - - + - 根据组织Id递归获取上级 + 数量 - 组织列表 - 组织Id - 是否包含自己 - - + - 获取组织信息 + 操作日志统计 - 组织id - 组织信息 - + - 组织分页查询 + 操作日志服务 - 查询参数 - 分页信息 - + - 根据ID列表获取组织列表 + 根据分类删除操作日志 - + 分类名称 - + - 添加组织 + 日志详情 - 添加参数 - 名称 - + id + 日志详情 - + - 复制组织 + 操作日志分页查询 - 机构复制参数 - + 查询参数 + 分页列表 - + - 编辑组织 + 操作日志周统计 - 编辑参数 - 名称 - + 天数 + 统计结果 - + - 删除组织 + 操作日志总览 - 删除参数 - 名称 - + 异常日志和操作日志的数量 - + - 构建组织树形结构 + - 组织列表 - 父ID - 树型结构 - + - 刷新缓存 + 操作日志中文名称 - - + - 获取组织树型结构 + 异常日志中文名称 - 机构ID列表 - 组织选择器(懒加载用) - 组织树列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - - + + + 访问日志分页输入 + - + - 检查输入参数 + 分类 - - - + - 根据组织Id列表获取所有父级组织 + 账号 - - - - + - 获取组织所有下级 + 访问日志删除输入 - - - - + - 获取组织下级(懒加载) + 分类 - - - - + - 赋值组织的所有下级 + 周统计输出 - 组织列表 - 父Id - 新父Id - - + - 重新生成组织实体 + 日期 - - + - 获取全称 + 登录次数 - 组织列表 - 父Id - 组织名称 - + - 职位分页查询 + 登出次数 - + - 组织ID + 访问日志总数输出 - + - 职位列表 + 类型 - + - 分类 + 数量 - + - 职位新增参数 + 访问日志服务 - + - 组织ID + 根据分类删除 + 分类名称 + - + - 名称 + 访问日志分页查询 + 查询参数 + 日志列表 - + - 分类 + 根统计N天来登录和登出数量 + 天使 + 统计信息 - + - 机构编辑参数 + 统计登录登出总览 + 登录和登出的数量 - + - Id + - - - 机构选择器参数 - + + - - - 职位服务 - + + - - - 添加职位 - - 添加参数 - 名称 - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 删除职位 + 刷新缓存 - id列表 - 名称 + 分类 - + - 编辑职位 + 检查输入参数 - 编辑参数 - 名称 - + - + - 获取职位列表 + 配置分页参数 - 职位列表 - + - 获取职位信息 + 添加配置参数 - 职位ID - 职位信息 - + - 职位分页查询 + 配置键 - 查询参数 - 分页列表 - + - 职位选择器 + 配置值 - 查询参数 - - + - 刷新缓存 + 编辑配置参数 - - + - 根据id集合获取职位集合 + ID - - - + - + 删除配置参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - 检查输入参数 + 批量修改输入参数 - - 名称 - + - 关系服务 + 分类 - + - 根据分类获取关系表信息 + 系统配置服务 - 分类名称 - 关系表 - + - 通过对象ID和分类获取关系列表 + 新增配置 - 对象ID - 分类 + 新增参数 - + - 通过对象ID列表和分类获取关系列表 + 删除配置 - 对象ID - 分类 + 删除 - + - 通过目标ID和分类获取关系列表 + 修改配置 - 目标ID - 分类 + 修改参数 - + - 通过目标ID列表和分类获取关系列表 + 批量编辑 - - + 配置列表 - + - 获取关系表用户工作台 + 根据分类和配置键获配置 - 用户ID - 关系表数据 + 分类 + 配置键 + 配置信息 - + - 更新缓存 + 根据分类获取配置列表 - 分类 - + 分类名称 + 配置列表 - + - 保存关系 + 分页查询其他配置 - 分类 - 对象ID - 目标ID - 拓展信息 - 是否清除老的数据 - 是否刷新缓存 - - - - - 批量保存关系 - - 分类 - 对象ID - 目标ID列表 - 拓展信息列表 - 是否清除老的数据 - + 查询参数 + 其他配置列表 - + - 根据角色ID获取模块ID列表 + - 角色ID列表 - 模块ID列表 - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - + - + 获取全部 + - - + + - + - + - + - + - + - 检查输入参数 + 刷新缓存 - - + - 父ID + 检查输入参数 + - + - 添加按钮参数 + 获取字典所有下级 + 字典列表 + 父ID + - + - 父ID + 字典查询参数 - + - 标题 + 字典树参数 - + - 编码 + 字典分类 - + - ID + 字典查询参数 - + + + 父id + + + + + 分类 + + + - 权限按钮服务 + 添加字典参数 - + - 添加按钮 + 父ID - 添加参数 - - + - 批量添加 + 字典名称 - - - + - 删除按钮 + 字典值 - 删除参数 - - + - 编辑按钮 + 状态 - 编辑参数 - - + - 按钮分页查询 + 编辑字典参数 - 查询条件 - 按钮分页列表 - + - 菜单树查询参数 + ID - + - 模块 + 删除字典参数 - + - 关键字 + 字典服务 - + - 添加菜单参数 + 添加字典 + 输入参数 + - + - 父ID + 构建字典树形结构 + 字典列表 + 父ID + 字典树形结构 - + - 标题 + 删除字典 + 删除参数 + - + - 菜单类型 + 编辑字典 + 输入参数 + - + - 模块 + 获取字典 + 字典 + - + - 路径 + 获取所有 + 字典列表 - + - 图标 + 根据字典DictValue获取字典值列表 + 字典值 + 字典列表 + 字典值列表 - + - 特殊验证 + 根据字典DictValue列表获取对应字典值列表 - + 字典值列表 - - + - 编辑菜单输入参数 + 字典分页查询 + 查询参数 + 字典分页列表 - + - ID + 获取字典树形结构 + 查询参数 + 字典树形结构 - + - 改变模块输入参数 + 组织分页查询参数 - + - 模块ID + 父ID - + - 菜单服务 + 机构列表 - + - 添加菜单 + 组织添加参数 - 添加参数 - - + - 详情 + 组织修改参数 - id - 详细信息 - + - 构建菜单树形结构 + Id - 菜单列表 - 父ID - 菜单形结构 - + - 获取菜单树 + 组织复制参数 - 菜单树查询参数 - 菜单树列表 - + - 编辑菜单 + 目标ID - 菜单编辑参数 - - + - 删除菜单 + 组织Id列表 - 删除菜单参数 - - + - 改变菜单模块 + 是否包含下级 - 改变菜单模块参数 - - + - + 组织导入 - - - - - - - - - - - + + + 名称 + - - + + + 上级组织 + - - + + + 分类 + - - + + + 排序码 + - - - 检查输入参数 + + + 主管账号 - - + - 模块分页输入 + 组织树查询参数 + 懒加载用 - + - 添加模块输入 + 父Id - + - 编辑模块输入 + 组织架构服务 - + - ID + 检查组织是否存在 + 组织列表 + 组织名称 + 父Id + 组织Id + 是否存在,存在返回组织ID - + - 模块管理服务 + 组织详情 + id参数 + 组织信息 - + - 添加模块 + 根据组织ID获取 下级 - 添加参数 + 组织ID + 是否包含自己 - + - 删除模块 + 获取所有组织 - 删除参数 - + 组织列表 - + - 编辑模块 + 获取机构及下级ID列表 - 编辑参数 + + - + - 分页查询 + 根据组织Id递归获取上级 - 分页参数 + 组织列表 + 组织Id + 是否包含自己 - + - + 获取组织信息 + 组织id + 组织信息 - - - - - - - - - - - - - + - 检查输入参数 + 组织分页查询 - + 查询参数 + 分页信息 - + - 角色授权资源树输出 + 根据ID列表获取组织列表 + + - + - 模块id + 添加组织 + 添加参数 + 名称 + - + - 模块名称 + 复制组织 + 机构复制参数 + - + - 模块图标 + 编辑组织 + 编辑参数 + 名称 + - + - 模块下菜单集合 + 删除组织 + 删除参数 + 名称 + - + - 授权菜单类 + 构建组织树形结构 + 组织列表 + 父ID + 树型结构 - + - 菜单id + 刷新缓存 + - + - 父id + 获取组织树型结构 + 机构ID列表 + 组织选择器(懒加载用) + 组织树列表 - - - 父名称 - + + - - - 模块名称 - + + - - - 模块id - + + - - - 菜单下按钮集合 - + + - - - 按钮id - + + - - - 标题 - + + - - - 接口描述 - + + - - - 路由名称 - + + - - - 权限名称 - + + - - - 资源服务 - + + - - - 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 - - 所有的菜单和模块以及单页面列表 + + - + + + + + + + + + + + + + + + + + + + - 根据模块ID获取菜单和单页面列表 + 检查输入参数 - - + + - + - 根据资源ID获取所有下级资源 + 根据组织Id列表获取所有父级组织 - 资源ID - 是否包含自己 - 资源列表 + + + - + - 根据资源ID获取所有下级资源 + 获取组织所有下级 - 资源列表 - 资源ID - 是否包含自己 - 资源列表 + + + - + - 获取ID获取Code列表 + 获取组织下级(懒加载) - id列表 - 分类 - Code列表 + + + - + - 获取资源列表 + 赋值组织的所有下级 - 资源分类列表 + 组织列表 + 父Id + 新父Id - + - 根据分类获取资源列表 + 重新生成组织实体 - 分类名称 - 资源列表 + - + - 根据菜单ID获取菜单 + 获取全称 - id列表 - 分类 - + 组织列表 + 父Id + 组织名称 - + - 获取权限授权树 + 职位分页查询 - 路由列表 - - + - 刷新缓存 + 组织ID - 分类名称 - - + - 角色授权资源树 + 职位列表 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - 获取路由地址名称 + 分类 - 控制器地址 - 路由名称 - - + - 获取资源所有下级 + 职位新增参数 - 资源列表 - 父ID - - + - 获取上级 + 组织ID - - - - + - 获取授权菜单 + 名称 - 模块ID - - + - 获取授权菜单类菜单名称 + 分类 - 菜单列表 - 当前菜单 - - + - 单页输入参数 + 机构编辑参数 - + - 菜单类型 + Id - + - 单页输入参数 + 机构选择器参数 - + - 标题 + 职位服务 - + - 菜单类型 + 添加职位 + 添加参数 + 名称 + - + - 路径 + 删除职位 + id列表 + 名称 + - + - 图标 + 编辑职位 + 编辑参数 + 名称 + - + - 单页修改参数 + 获取职位列表 + 职位列表 - + - ID + 获取职位信息 + 职位ID + 职位信息 - + - 单页服务 + 职位分页查询 + 查询参数 + 分页列表 - + - 添加单页 + 职位选择器 - 添加参数 + 查询参数 - + - 删除单页 + 刷新缓存 - 删除参数 - + - 编辑单页 + 根据id集合获取职位集合 - 编辑参数 + - + - 分页查询 + - - - + - + 获取全部 + - + + + + - + - + + + + - + - + + + + + + + 检查输入参数 - + + 名称 - + - 角色查询参数 + 用户选择器参数 - + - 角色添加参数 + 组织ID - + - 名称 + 机构ID列表 - + - 分类 + 关键字 - + - 角色编辑参数 + 用户分页查询参数 - + - Id + 所属组织 - + - 角色授权资源参数 + 动态查询条件 - + - 角色Id + 用户状态 - + - 授权资源信息 + 添加用户参数 - + - 是否代码生成 + 账号 - + - 角色授权资源参数 + 姓名 - + - 角色Id + 组织id - + - 授权权限信息 + 职位id - + - 角色授权用户参数 + 编辑用户参数 - + Id - + - 授权权限信息 + 用户授权角色参数 - + - 角色选择器参数 + Id - + - 组织ID + 授权权限信息 - + - 机构ID列表 + 默认数据权限 - + - 关键字 + 用户导入 - + - 角色分类 + 账号 - - - 角色拥有的资源输出 + + + 姓名 - - - Id + + + 性别 - - - 已授权资源信息 + + + 昵称 - - - 角色拥有权限输出 + + + 手机 + 这里使用了SM4自动加密解密 - - - 角色Id + + + 邮箱 - + - 已授权资源信息 + 所属机构 - + - 角色服务 + 职位 - - - 获取所有角色 + + + 出生日期 - - - - 添加角色 + + + 民族 - 添加参数 - - - - 删除角色 + + + 籍贯 - 删除参数 - - - - 编辑角色 + + + 家庭住址 - 编辑参数 - - - - 根据用户ID获取用户角色集合 + + + 通信地址 - 用户ID - - - - 给角色授权权限 + + + 证件类型 - 授权信息 - - - - 给角色授权 + + + 证件号码 - 授权参数 - - - - 给角色授权用户 + + + 文化程度 - 授权信息 - - - - 获取角色拥有权限 + + + 政治面貌 - 角色ID - - - - 角色拥有资源 + + + 毕业院校 - 角色id - 资源类型 - 角色拥有资源信息 - - - 获取角色下的用户 + + + 学历 - 角色ID - - - - 分页查询角色 + + + 学制 - 查询参数 - - - - 刷新缓存 + + + 学位 - - - - 获取角色授权权限选择器 + + + 家庭电话 - 角色ID - - - - 角色选择器 + + + 办公电话 - - - - - 根据id集合获取角色集合 + + + 紧急联系人 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 紧急联系人电话 + - - + + + 紧急联系人地址 + - - - 检查输入参数 + + + 员工编号 - - - - 编辑个人信息参数 + + + 入职日期 - + - 姓名 + 部门Id - + - 签名图片 + 职位Id - + - 更新个人工作台 + 选择用户输出参数 - + - 工作台数据 + Id - + - 更新个人密码 + 组织ID - + - 密码 + 账号 - + - 新密码 + 姓名 - - - 设置默认模块输入 + + + 性别 - + - 模块Id + 组织名称 - + - 是否默认 + 职位名称 - + - 我的机构数样式 + 头像 - + - Id + 用户信息输出 - + - 名称 + 用户信息 - - - 父ID + + + 账号 - - - 子节点 + + + 姓名 - - - 样式 + + + 昵称 - - - 我的机构样式 + + + 性别 - - - 背景色 + + + 手机 + 这里使用了SM4自动加密解密 - - - 字体颜色 + + + 邮箱 - + - 个人信息中心服务 + 所属机构 - + - 获取登录用户菜单 + 职位 - - - - - 获取个人工作台 + + + 出生日期 - - - - 获取组织架构 + + + 民族 - 组织架构 - - - 获取登录用户的站内信分页 + + + 籍贯 - 查询参数 - 站内信列表 - - - 读取登录用户站内信详情 + + + 家庭住址 - 消息ID - 消息详情 - - - 获取未读消息数量 + + + 通信地址 - 未读消息数量 - - - 更新个人信息 + + + 证件类型 - 信息参数 - - - - 更新签名 + + + 证件号码 - 签名图片 - - - - 编辑个人工作台 + + + 文化程度 - 工作台字符串 - - - - 删除我的消息 + + + 政治面貌 - 消息Id - - - - 修改个人密码 + + + 毕业院校 - 密码信息 - - - - 修改头像 + + + 学历 - 头像文件 - - - - 修改默认模块 + + + 学制 - 默认模块输入参数 - - - - - - - - - - - - - - - + + + 学位 + - - + + + 家庭电话 + - - + + + 办公电话 + - - + + + 紧急联系人 + - - + + + 紧急联系人电话 + - - + + + 紧急联系人地址 + - - + + + 员工编号 + - - + + + 入职日期 + - - + + + 职级 + - - + + + 用户服务 + - + - 获取父菜单集合 + 根据用户ID获取按钮ID集合 - 所有菜单列表 - 我的菜单列表 + - + - 构建Meta + 根据账号获取用户信息 - 我的菜单集合 + 用户名 + 用户信息 - + - 构建机构树 + 根据用户ID和机构ID获取角色权限 - 机构列表 - 父ID - 用户ID + + - + - 用户选择器参数 + 根据手机号获取用户账号 + 手机号 + 用户账号名称 - + - 组织ID + 用户选择器 + 查询参数 + - + - 机构ID列表 + 用户分页查询 + 查询参数 + 用户分页列表 - + - 关键字 + 用户列表 + 查询 + - + - 用户分页查询参数 + 根据用户Id获取用户信息 + 用户ID + 用户信息 - + - 所属组织 + 根据用户Id获取用户信息 + 用户ID + 转换的实体 + - + + + 根据用户账号获取用户ID + + 用户账号 + + + - 动态查询条件 + 根据用户手机获取用户信息 + 手机号 + 用户信息 - + - 用户状态 + 获取用户拥有角色 + 用户ID + - + + + 获取当前API用户的数据范围 + null:代表拥有全部数据权限 + [xx,xx]:代表拥有部分机构的权限 + []:代表仅自己权限 + + 机构列表 + + - 添加用户参数 + 获取用户拥有的资源 + 用户id + 资源列表 - + - 账号 + 获取用户拥有的权限 + 用户id + 权限列表 - + - 姓名 + 用户权限树选择 + 用户id + 权限列表 - + - 组织id + 根据id集合获取用户集合 + Id集合 + - + - 职位id + 用户详情 + + - + - 编辑用户参数 + 添加用户 + 添加参数 + - + - Id + 编辑 + 编辑参数 + - + - 用户授权角色参数 + 启用用户 + 用户Id + - + - Id + 禁用用户 + 用户Id + - + - 授权权限信息 + 重置密码 + 用户Id + - + - 默认数据权限 + 给用户授权角色 + 授权参数 + - + - 用户导入 + 给用户授权资源 + 授权参数 + - + - 账号 + 给用户授权权限 + + - - - 姓名 + + + 设置用户默认值 + + - - - 性别 + + + 批量编辑 + 批量编辑信息 + - - - 昵称 + + + 删除用户 + Id列表 + - - - 手机 - 这里使用了SM4自动加密解密 + + + 从redis中删除用户信息 + 用户ID列表 - - - 邮箱 + + + 从redis中删除用户信息 + 用户ID - + - 所属机构 + 导出用户 + + - + - 职位 + 导入模板下载 + 模板 - - - 出生日期 + + + 导入预览 + 预览参数 + 预览结果 - - - 民族 + + + 用户导入 + + - - - 籍贯 + + + 检查导入数据 + 数据 + 是否初始化错误 + - - - 家庭住址 + + + - - - 通信地址 - + + - - - 证件类型 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 获取默认密码 + - - - 证件号码 + + + 检查输入参数 + - - - 文化程度 + + + 检查是否为自己 + + 操作名称 - - - 政治面貌 + + + 根据日期计算年龄 + + - - - 毕业院校 + + + 获取Sqlsugar的ISugarQueryable + + - - - 学历 + + + 数据库获取用户信息 + 用户ID + - - - 学制 + + + 关系服务 - - - 学位 + + + 根据分类获取关系表信息 + 分类名称 + 关系表 - - - 家庭电话 + + + 通过对象ID和分类获取关系列表 + 对象ID + 分类 + - - - 办公电话 + + + 通过对象ID列表和分类获取关系列表 + 对象ID + 分类 + - - - 紧急联系人 + + + 通过目标ID和分类获取关系列表 + 目标ID + 分类 + - - - 紧急联系人电话 + + + 通过目标ID列表和分类获取关系列表 + + + - - - 紧急联系人地址 + + + 获取关系表用户工作台 + 用户ID + 关系表数据 - - - 员工编号 + + + 更新缓存 + 分类 + - - - 入职日期 + + + 保存关系 + 分类 + 对象ID + 目标ID + 拓展信息 + 是否清除老的数据 + 是否刷新缓存 + - + - 部门Id + 批量保存关系 + 分类 + 对象ID + 目标ID列表 + 拓展信息列表 + 是否清除老的数据 + - + - 职位Id + 根据角色ID获取模块ID列表 + 角色ID列表 + 模块ID列表 - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - 选择用户输出参数 + 角色授权资源树输出 - + - Id + 模块id - + - 组织ID + 模块名称 - + - 账号 + 模块图标 - + - 姓名 + 模块下菜单集合 - - - 性别 + + + 授权菜单类 - + - 组织名称 + 菜单id - + - 职位名称 + 父id - + - 头像 + 父名称 - + - 用户信息输出 + 模块名称 - + - 用户信息 + 模块id - - - 账号 + + + 菜单下按钮集合 - - - 姓名 + + + 按钮id - - - 昵称 + + + 标题 - - - 性别 + + + 接口描述 - - - 手机 - 这里使用了SM4自动加密解密 + + + 路由名称 - - - 邮箱 + + + 权限名称 - + - 所属机构 + 资源服务 - + - 职位 + 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 + 所有的菜单和模块以及单页面列表 - - - 出生日期 + + + 根据模块ID获取菜单和单页面列表 + + - - - 民族 + + + 根据资源ID获取所有下级资源 + 资源ID + 是否包含自己 + 资源列表 - - - 籍贯 + + + 根据资源ID获取所有下级资源 + 资源列表 + 资源ID + 是否包含自己 + 资源列表 - - - 家庭住址 + + + 获取ID获取Code列表 + id列表 + 分类 + Code列表 - - - 通信地址 + + + 获取资源列表 + 资源分类列表 + - - - 证件类型 + + + 根据分类获取资源列表 + 分类名称 + 资源列表 - - - 证件号码 + + + 根据菜单ID获取菜单 + id列表 + 分类 + - - - 文化程度 + + + 获取权限授权树 + 路由列表 + - - - 政治面貌 + + + 刷新缓存 + 分类名称 + - - - 毕业院校 + + + 角色授权资源树 + - - - 学历 - + + - - - 学制 - + + - - - 学位 - + + - - - 家庭电话 - + + - - - 办公电话 - + + - - - 紧急联系人 - + + - - - 紧急联系人电话 - + + - - - 紧急联系人地址 - + + - - - 员工编号 - + + - - - 入职日期 - + + - - - 职级 - + + - + + + + - 用户服务 + 获取路由地址名称 + 控制器地址 + 路由名称 + - + - 根据用户ID获取按钮ID集合 + 获取资源所有下级 - + 资源列表 + 父ID - + - 根据账号获取用户信息 + 获取上级 - 用户名 - 用户信息 + + + - + - 根据用户ID和机构ID获取角色权限 + 获取授权菜单 - - + 模块ID - + - 根据手机号获取用户账号 + 获取授权菜单类菜单名称 - 手机号 - 用户账号名称 + 菜单列表 + 当前菜单 + - + - 用户选择器 + 编辑个人信息参数 - 查询参数 - - + - 用户分页查询 + 姓名 - 查询参数 - 用户分页列表 - + - 用户列表 + 签名图片 - 查询 - - + - 根据用户Id获取用户信息 + 更新个人工作台 - 用户ID - 用户信息 - + - 根据用户Id获取用户信息 + 工作台数据 - 用户ID - 转换的实体 - - - - 根据用户账号获取用户ID - - 用户账号 - + + + 更新个人密码 + - + - 根据用户手机获取用户信息 + 密码 - 手机号 - 用户信息 - + - 获取用户拥有角色 + 新密码 - 用户ID - - - - 获取当前API用户的数据范围 - null:代表拥有全部数据权限 - [xx,xx]:代表拥有部分机构的权限 - []:代表仅自己权限 - - 机构列表 + + + 设置默认模块输入 + - + - 获取用户拥有的资源 + 模块Id - 用户id - 资源列表 - + - 获取用户拥有的权限 + 是否默认 - 用户id - 权限列表 - + - 用户权限树选择 + 我的机构数样式 - 用户id - 权限列表 - + - 根据id集合获取用户集合 + Id - Id集合 - - + - 用户详情 + 名称 - - - + - 添加用户 + 父ID - 添加参数 - - + - 编辑 + 子节点 - 编辑参数 - - + - 启用用户 + 样式 - 用户Id - - + - 禁用用户 + 我的机构样式 - 用户Id - - + - 重置密码 + 背景色 - 用户Id - - + - 给用户授权角色 + 字体颜色 - 授权参数 - - + - 给用户授权资源 + 个人信息中心服务 - 授权参数 - - + - 给用户授权权限 + 获取登录用户菜单 - + - 设置用户默认值 + 获取个人工作台 - - + - 批量编辑 + 获取组织架构 - 批量编辑信息 - + 组织架构 - + - 删除用户 + 获取登录用户的站内信分页 - Id列表 - + 查询参数 + 站内信列表 - + - 从redis中删除用户信息 + 读取登录用户站内信详情 - 用户ID列表 + 消息ID + 消息详情 - + - 从redis中删除用户信息 + 获取未读消息数量 - 用户ID + 未读消息数量 - + - 导出用户 + 更新个人信息 - + 信息参数 - + - 导入模板下载 + 更新签名 - 模板 + 签名图片 + - + - 导入预览 + 编辑个人工作台 - 预览参数 - 预览结果 + 工作台字符串 + - + - 用户导入 + 删除我的消息 - + 消息Id - + - 检查导入数据 + 修改个人密码 - 数据 - 是否初始化错误 + 密码信息 - + - + 修改头像 + 头像文件 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 修改默认模块 + + 默认模块输入参数 + - - + + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - + - + - + - - - - + - + - - - - - - - - - - - + + - - + + - - + + - + - 获取默认密码 + 获取父菜单集合 + 所有菜单列表 + 我的菜单列表 - - - 检查输入参数 - - - - - - 检查是否为自己 - - - 操作名称 - - + - 根据日期计算年龄 + 构建Meta - - - - - - 获取Sqlsugar的ISugarQueryable - - - + 我的菜单集合 - + - 数据库获取用户信息 + 构建机构树 - 用户ID + 机构列表 + 父ID + 用户ID diff --git a/api/SimpleAdmin/SimpleAdmin.System/Startup.cs b/api/SimpleAdmin/SimpleAdmin.System/Startup.cs index ec89823..2aa465f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Startup.cs @@ -1,5 +1,10 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.System; @@ -31,4 +36,4 @@ public class Startup : AppStartup var settings = App.GetOptions(); CodeFirstUtils.CodeFirst(settings, fullName);//CodeFirst } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/System.Production.json b/api/SimpleAdmin/SimpleAdmin.System/System.Production.json index e7579ea..0909017 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/System.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.System/System.Production.json @@ -1,26 +1,26 @@ { - //swagger - "[openapi:System]": { - "Order": 99, //int ͣԽǰ棬Ĭ 0 - "Title": "RBACȨģ", //÷⣬string - "Description": " .NET 򵥣ͨãС", - "Version": "1.0.0", //÷汾Ĭ 1.0 - "TermsOfService": "https://www.cnblogs.com/huguodong/", //ӵַUri + //swagger分组设置 + "[openapi:Default]": { + "Order": 99, //分组排序,int 类型,数字越大排前面,默认 0 + "Title": "RBAC权限模块", //配置分组标题,string 类型 + "Description": "让 .NET 开发更简单,更通用,更流行。", + "Version": "1.0.0", //配置分组版本,默认 1.0 + "TermsOfService": "https://www.cnblogs.com/huguodong/", //配置相关链接地址,Uri 类型 "Contact": { - //ϵʽ - "Name": "פɽ´", + //配置联系方式 + "Name": "少林寺驻北固山办事处大神父王喇嘛", "Url": "https://gitee.com/huguodong520", "Email": "531035580@qq.com" }, "License": { - //Э飬OpenApiLicense + //配置协议,OpenApiLicense 类型 "Name": "Apache-2.0", "Url": "https://gitee.com/huguodong520/SimpleAdmin/blob/master/LICENSE" } }, - //ϵͳ + //系统层设置 "SystemSettings": { - "InitTable": false, //Ƿʼṹ - "InitSeedData": false, //Ƿʼ + "InitTable": false, //是否初始化表结构 + "InitSeedData": false, //是否初始化种子数据 } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs b/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs index 60224dd..3059193 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.System; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.System; /// /// 当前登录用户信息 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs index 2e20f4b..8bbcdf1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs @@ -1,4 +1,12 @@ -using Microsoft.AspNetCore.Authentication.JwtBearer; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Microsoft.AspNetCore.Authentication.JwtBearer; namespace SimpleAdmin.Web.Core; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs index 54148ad..c500134 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs @@ -1,4 +1,12 @@ -using UAParser; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using UAParser; namespace SimpleAdmin.Web.Core; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs index 2d32f18..595b897 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs @@ -1,4 +1,12 @@ -using SimpleAdmin.Plugin.Mqtt; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using SimpleAdmin.Plugin.Mqtt; using SimpleAdmin.Plugin.SignalR; namespace SimpleAdmin.Web.Core; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/WebSettingsComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/WebSettingsComponent.cs index 62599e9..f1295d1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/WebSettingsComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/WebSettingsComponent.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// Web设置组件 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs index 5dbef99..c87ff14 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizOrgController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 机构管理控制器 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs index 3b6e558..1a34392 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizPositionController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 岗位管理控制器 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs index c087167..333c11e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/BizUserController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 人员管理控制器 @@ -116,7 +124,6 @@ public class BizUserController : IDynamicApiController return await _userService.RoleSelector(input); } - /// /// 人员详情 /// diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs index 90e043f..bb462ac 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/Application/GenTestController.cs @@ -1,7 +1,10 @@ -using Microsoft.AspNetCore.Mvc; -using System.ComponentModel; -using Furion.DynamicApiController; -using SimpleAdmin.Application; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Web.Core; @@ -61,7 +64,6 @@ public class GenTestController : IDynamicApiController return await _genTestService.Detail(input); } - /// /// 获取组织树选择器 /// @@ -98,8 +100,7 @@ public class GenTestController : IDynamicApiController return await _genTestService.Template(); } - #endregion - + #endregion Get请求 #region Post请求 @@ -164,5 +165,5 @@ public class GenTestController : IDynamicApiController return await _genTestService.Export(input); } - #endregion + #endregion Post请求 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs index 000b4f9..48fa558 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// B端登录控制器 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/SessionController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/SessionController.cs index 4efde3c..d9e5325 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/SessionController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/SessionController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 会话管理控制器 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BaseController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BaseController.cs index a9aceda..db3c003 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BaseController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BaseController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 基础控制器 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs index ed67167..a3e2181 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/BatchEdit/BatchEditController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 批量控制器 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs index 9124942..90e605a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs @@ -1,10 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 文件管理控制器 /// [ApiDescriptionSettings(Tag = "文件管理")] -[Route("dev/[controller]")] +[Route("sys/dev/[controller]")] public class FileController : BaseController { private readonly IFileService _fileService; @@ -35,7 +43,7 @@ public class FileController : BaseController [DisableRequestSizeLimit] public async Task UploadLocal([FromForm] IFormFile File) { - return await _fileService.UploadFile(DevDictConst.FILE_ENGINE_LOCAL, File); + return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_LOCAL, File); } /// @@ -48,7 +56,7 @@ public class FileController : BaseController [DisableRequestSizeLimit] public async Task UploadMinio([FromForm] IFormFile File) { - return await _fileService.UploadFile(DevDictConst.FILE_ENGINE_MINIO, File); + return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_MINIO, File); } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs index c2932c9..2ac603a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/MessageController.cs @@ -1,10 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 站内信控制器 /// [ApiDescriptionSettings(Tag = "站内信")] -[Route("dev/[controller]")] +[Route("sys/dev/[controller]")] public class MessageController : BaseController { private readonly IMessageService _messageService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs index 3ac0f13..4fdd7cd 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Index/IndexController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 系统首页控制器 @@ -27,7 +35,7 @@ public class IndexController : IDynamicApiController public async Task VisLogList() { return await _visitLogService.Page(new VisitLogPageInput - { Account = UserManager.UserAccount }); + { Account = UserManager.UserAccount }); } /// @@ -38,7 +46,7 @@ public class IndexController : IDynamicApiController public async Task OpLogList() { return await _operateLogService.Page(new OperateLogPageInput - { Account = UserManager.UserAccount }); + { Account = UserManager.UserAccount }); } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ButtonController.cs similarity index 68% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ButtonController.cs index 2103de7..db50c8b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ButtonController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ButtonController.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 权限按钮控制器 /// [ApiDescriptionSettings(Tag = "权限按钮")] +[Route("sys/limit/[controller]")] public class ButtonController : BaseController { private readonly IButtonService _buttonService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs similarity index 76% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs index 40a394b..330be0a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/MenuController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 菜单管理控制器 /// [ApiDescriptionSettings(Tag = "菜单管理")] +[Route("sys/limit/[controller]")] public class MenuController : BaseController { private readonly IMenuService _menuService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ModuleController.cs similarity index 64% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ModuleController.cs index 866711a..0c31c51 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/ModuleController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/ModuleController.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 模块管理控制器 /// [ApiDescriptionSettings(Tag = "模块管理")] +[Route("sys/limit/[controller]")] public class ModuleController : BaseController { private readonly IModuleService _moduleService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs similarity index 85% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs index 7359edd..21c03fd 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/RoleController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 角色管理控制器 /// [ApiDescriptionSettings(Tag = "角色管理")] +[Route("sys/limit/[controller]")] public class RoleController : BaseController { private readonly IRoleService _roleService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/SpaController.cs similarity index 63% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/SpaController.cs index 5a84b2b..d7935e8 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/SpaController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/SpaController.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 单页管理控制器 /// [ApiDescriptionSettings(Tag = "单页管理")] +[Route("sys/limit/[controller]")] public class SpaController : BaseController { private readonly ISpaService _spaService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogOperateController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs similarity index 67% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogOperateController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs index 5da2563..ff3aad1 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogOperateController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs @@ -1,10 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 操作日志控制器 /// [ApiDescriptionSettings(Tag = "操作日志")] -[Route("dev/[controller]")] +[Route("sys/log/[controller]")] public class LogOperateController : BaseController { private readonly IOperateLogService _operateLogService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogVisitController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs similarity index 63% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogVisitController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs index 03dc286..43b1cf9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/LogVisitController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs @@ -1,10 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 访问日志控制器 /// [ApiDescriptionSettings(Tag = "访问日志")] -[Route("dev/[controller]")] +[Route("sys/log/[controller]")] public class LogVisitController : BaseController { private readonly IVisitLogService _visitLogService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/ConfigController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs similarity index 69% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/ConfigController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs index 5ad1cb0..8ca1d7c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/ConfigController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs @@ -1,10 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 系统配置控制器 /// [ApiDescriptionSettings(Tag = "系统配置")] -[Route("dev/[controller]")] +[Route("sys/ops/[controller]")] public class ConfigController : BaseController { private readonly IConfigService _configService;//系统配置服务 @@ -20,10 +28,11 @@ public class ConfigController : BaseController /// [HttpGet("sysBaseList")] [AllowAnonymous] - public async Task> SysBaseList() + public async Task> SysBaseList() { var sysBase = await _configService.GetListByCategory(CateGoryConst.Config_SYS_BASE);//系统基础 - var loginPolicy = await _configService.GetListByCategory(CateGoryConst.Config_LOGIN_POLICY);//登录策略 + var loginPolicy = + await _configService.GetListByCategory(CateGoryConst.Config_LOGIN_POLICY);//登录策略 sysBase.AddRange(loginPolicy);//合并登录策略 return sysBase; } @@ -92,7 +101,7 @@ public class ConfigController : BaseController /// [HttpPost("editBatch")] [DisplayName("修改配置")] - public async Task EditBatch([FromBody] List devConfigs) + public async Task EditBatch([FromBody] List devConfigs) { await _configService.EditBatch(devConfigs); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/DictController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/DictController.cs similarity index 68% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/DictController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/DictController.cs index 87da51e..6fe7cb7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/DictController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/DictController.cs @@ -1,10 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 系统字典控制器 /// [ApiDescriptionSettings(Tag = "系统字典")] -[Route("dev/[controller]")] +[Route("sys/ops/[controller]")] public class DictController : BaseController { private readonly IDictService _dictService; @@ -65,7 +73,6 @@ public class DictController : BaseController /// /// /// - [HttpPost("delete")] [DisplayName("删除字典")] public async Task Delete([FromBody] DictDeleteInput input) diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs similarity index 78% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs index 45f105a..40524d0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/OrgController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 组织管理控制器 /// [ApiDescriptionSettings(Tag = "组织管理")] +[Route("sys/organization/[controller]")] public class OrgController : BaseController { private readonly ISysOrgService _sysOrgService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/PositionController.cs similarity index 65% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/PositionController.cs index 43fa761..d74d709 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/PositionController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/PositionController.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 职位管理控制器 /// [ApiDescriptionSettings(Tag = "职位管理")] +[Route("sys/organization/[controller]")] public class PositionController : BaseController { private readonly ISysPositionService _sysPositionService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/UserController.cs similarity index 90% rename from api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs rename to api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/UserController.cs index 52221a4..78a3bc0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/UserController.cs @@ -1,9 +1,18 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 用户管理控制器 /// [ApiDescriptionSettings(Tag = "用户管理")] +[Route("sys/organization/[controller]")] public class UserController : BaseController { private readonly ISysUserService _sysUserService; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs index 077d525..2b1f801 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 用户个人信息控制器 @@ -158,8 +166,6 @@ public class UserCenterController : IDynamicApiController return await _userCenterService.UpdateAvatar(input); } - - /// /// 根据id集合获取用户集合 /// diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs index 131a526..ddd24de 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs @@ -1,4 +1,12 @@ -using Furion.FriendlyException; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Furion.FriendlyException; namespace SimpleAdmin.Web.Core; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs index 5dcd703..3d7e70c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 自定义授权筛选器 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs index 31b1079..6a12568 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs @@ -1,4 +1,12 @@ -global using Furion; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +global using Furion; global using Furion.DynamicApiController; global using Furion.Logging; global using Microsoft.AspNetCore.Authorization; @@ -11,8 +19,8 @@ global using Microsoft.AspNetCore.Mvc.Controllers; global using Microsoft.AspNetCore.Mvc.Filters; global using Microsoft.Extensions.DependencyInjection; global using SimpleAdmin.Application; -global using SimpleAdmin.Core; global using SimpleAdmin.Cache; +global using SimpleAdmin.Core; global using SimpleAdmin.Plugin.Core; global using SimpleAdmin.SqlSugar; global using SimpleAdmin.System; @@ -20,4 +28,11 @@ global using System; global using System.Collections.Generic; global using System.ComponentModel; global using System.Linq; -global using System.Threading.Tasks; \ No newline at end of file +global using System.Threading.Tasks; +global using Microsoft.AspNetCore.HttpOverrides; +global using Microsoft.Extensions.FileProviders; +global using Microsoft.Extensions.Hosting; +global using Newtonsoft.Json; +global using Newtonsoft.Json.Serialization; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Hosting; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs index c4ea36b..1ba3b9b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs @@ -1,7 +1,15 @@ -using System.Security.Claims; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + using Furion.Authorization; using Furion.DataEncryption; using Furion.Logging.Extensions; +using System.Security.Claims; namespace SimpleAdmin.Web.Core; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs index 1f76e33..1082572 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs @@ -1,4 +1,12 @@ -using DnsClient.Internal; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using DnsClient.Internal; using Furion.DependencyInjection; using Furion.FriendlyException; using Microsoft.Extensions.Logging; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs index 5d3afc4..c55487c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs @@ -1,4 +1,12 @@ -using IPTools.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using IPTools.Core; using Masuit.Tools; using Microsoft.Extensions.Logging; using NewLife.Serialization; @@ -40,7 +48,8 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter var path = logMsg.Context.Get(LoggingConst.Path).ToString();//获取操作名称 var method = logMsg.Context.Get(LoggingConst.Method).ToString();//获取方法 //表示访问日志 - if (operation == EventSubscriberConst.LoginB || operation == EventSubscriberConst.LoginOutB) + if (operation == EventSubscriberConst.LoginB + || operation == EventSubscriberConst.LoginOutB) { //如果没有异常信息 if (loggingMonitor.Exception == null) @@ -50,7 +59,8 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter else { //添加到异常日志 - await CreateOperationLog(operation, path, loggingMonitor, client); + await CreateOperationLog(operation, path, loggingMonitor, + client); } } else @@ -59,7 +69,8 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter if (!operation.Contains("/") && method == "POST") { //添加到操作日志 - await CreateOperationLog(operation, path, loggingMonitor, client); + await CreateOperationLog(operation, path, loggingMonitor, + client); } } } @@ -71,7 +82,8 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter /// 访问类型 /// loggingMonitor /// 客户端信息 - private async Task CreateVisitLog(string operation, LoggingMonitorJson loggingMonitor, ClientInfo clientInfo) + private async Task CreateVisitLog(string operation, LoggingMonitorJson loggingMonitor, + ClientInfo clientInfo) { var name = "";//用户姓名 var opAccount = "";//用户账号 @@ -86,15 +98,19 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter else { //如果是登录出,用户信息就从AuthorizationClaims里拿 - name = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.Name).Select(it => it.Value).FirstOrDefault(); - opAccount = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault(); + name = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.Name) + .Select(it => it.Value).FirstOrDefault(); + opAccount = loggingMonitor.AuthorizationClaims + .Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault(); } //日志表实体 - var devLogVisit = new DevLogVisit + var devLogVisit = new SysLogVisit { Name = operation, - Category = operation == EventSubscriberConst.LoginB ? CateGoryConst.Log_LOGIN : CateGoryConst.Log_LOGOUT, - ExeStatus = DevLogConst.SUCCESS, + Category = operation == EventSubscriberConst.LoginB + ? CateGoryConst.Log_LOGIN + : CateGoryConst.Log_LOGOUT, + ExeStatus = SysLogConst.SUCCESS, OpAddress = GetLoginAddress(loggingMonitor.RemoteIPv4), OpIp = loggingMonitor.RemoteIPv4, OpBrowser = clientInfo.UA.Family + clientInfo.UA.Major, @@ -114,15 +130,20 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter /// loggingMonitor /// 客户端信息 /// - private async Task CreateOperationLog(string operation, string path, LoggingMonitorJson loggingMonitor, ClientInfo clientInfo) + private async Task CreateOperationLog(string operation, string path, + LoggingMonitorJson loggingMonitor, ClientInfo clientInfo) { //用户名称 - var name = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.Name).Select(it => it.Value).FirstOrDefault(); + var name = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.Name) + .Select(it => it.Value).FirstOrDefault(); //账号 - var opAccount = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault(); + var opAccount = loggingMonitor.AuthorizationClaims + ?.Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault(); //获取参数json字符串, - var paramJson = loggingMonitor.Parameters == null || loggingMonitor.Parameters.Count == 0 ? null : loggingMonitor.Parameters[0].Value.ToJsonString(); + var paramJson = loggingMonitor.Parameters == null || loggingMonitor.Parameters.Count == 0 + ? null + : loggingMonitor.Parameters[0].Value.ToJsonString(); //获取结果json字符串 var resultJson = string.Empty; @@ -130,18 +151,21 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter { if (loggingMonitor.ReturnInformation.Value != null)//如果返回值不为空 { - var time = loggingMonitor.ReturnInformation.Value.Time != null ? DateTime.Parse(loggingMonitor.ReturnInformation.Value.Time) : DateTime.Now;//转成时间 - loggingMonitor.ReturnInformation.Value.Time = time.ToString(CultureInfo.CurrentCulture);//转成字符串 + var time = loggingMonitor.ReturnInformation.Value.Time != null + ? DateTime.Parse(loggingMonitor.ReturnInformation.Value.Time) + : DateTime.Now;//转成时间 + loggingMonitor.ReturnInformation.Value.Time = + time.ToString(CultureInfo.CurrentCulture);//转成字符串 resultJson = loggingMonitor.ReturnInformation.Value.ToJsonString(); } } //操作日志表实体 - var devLogOperate = new DevLogOperate + var devLogOperate = new SysLogOperate { Name = operation, Category = CateGoryConst.Log_OPERATE, - ExeStatus = DevLogConst.SUCCESS, + ExeStatus = SysLogConst.SUCCESS, OpAddress = GetLoginAddress(loggingMonitor.RemoteIPv4), OpIp = loggingMonitor.RemoteIPv4, OpBrowser = clientInfo.UA.Family + clientInfo.UA.Major, @@ -160,8 +184,9 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter if (loggingMonitor.Exception != null) { devLogOperate.Category = CateGoryConst.Log_EXCEPTION;//操作类型为异常 - devLogOperate.ExeStatus = DevLogConst.FAIL;//操作状态为失败 - devLogOperate.ExeMessage = loggingMonitor.Exception.Type + ":" + loggingMonitor.Exception.Message + "\n" + loggingMonitor.Exception.StackTrace; + devLogOperate.ExeStatus = SysLogConst.FAIL;//操作状态为失败 + devLogOperate.ExeMessage = loggingMonitor.Exception.Type + ":" + + loggingMonitor.Exception.Message + "\n" + loggingMonitor.Exception.StackTrace; } await _db.InsertableWithAttr(devLogOperate).IgnoreColumns(true).ExecuteCommandAsync();//入库 } @@ -184,7 +209,9 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter ipInfo.City, ipInfo.NetworkOperator };//定义登录地址列表 - LoginAddress = string.Join("|", LoginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 + LoginAddress = + string.Join("|", + LoginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 } catch (global::System.Exception ex) { diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs index 3ee3d3b..1980b7e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 日志常量 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs index 87e7c3a..fff6af5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs @@ -1,4 +1,12 @@ -namespace SimpleAdmin.Web.Core; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Web.Core; /// /// 请求信息格式化 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Options/WebSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Options/WebSettingsOptions.cs index c54187a..542367a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Options/WebSettingsOptions.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Options/WebSettingsOptions.cs @@ -1,4 +1,12 @@ -using Furion.ConfigurableOptions; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +using Furion.ConfigurableOptions; namespace SimpleAdmin.Web.Core; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj index ebd747d..0ca7dc8 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj @@ -1,29 +1,30 @@  - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Web.Core.xml - enable - + + net7.0;net6.0 + 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 + SimpleAdmin.Web.Core.xml + enable + - - - + + + - - - - - + + + + + + + + + PreserveNewest + + + PreserveNewest + + - - - PreserveNewest - - - PreserveNewest - - diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index 7aad319..cbbd1d9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -513,97 +513,6 @@ - - - 系统配置控制器 - - - - - 获取系统基础配置 - - - - - - 获取配置列表 - - 分类 - - - - - 配置分页 - - - - - - - 添加配置 - - - - - - - 修改配置 - - - - - - - 删除配置 - - - - - - - 配置批量更新 - - - - - - 系统字典控制器 - - - - - 获取字典树 - - - - - - 字典分页查询 - - - - - - - 添加字典 - - - - - - - 修改字典 - - - - - - - 删除字典 - - - - 文件管理控制器 @@ -644,75 +553,6 @@ - - - 操作日志控制器 - - - - - 字典分页查询 - - - - - - - 操作日志周统计柱状图图 - - - - - - 操作日志数量总览饼图 - - - - - - 清空日志 - - - - - - - 日志详情 - - - - - - - 访问日志控制器 - - - - - 字典分页查询 - - - - - - - 访问日志周统计折线图 - - - - - - 访问日志总览饼图 - - - - - - 清空日志 - - - - 站内信控制器 @@ -919,350 +759,395 @@ - + - 组织管理控制器 + 角色管理控制器 - + - 获取组织树 + 角色分页查询 + - + - 获取组织树选择器 + 添加角色 + - + - 组织分页查询 + 修改角色 - + - 获取用户选择器 + 删除角色 + - + - 获取组织详情 + 获取角色授权资源树 - - + - 复制组织 + 获取角色拥有资源 - + - 添加组织 + 给角色授权资源 - + - 修改组织 + 获取权限授权树 - - + - 删除组织 + 获取角色拥有权限 - + - 职位管理控制器 + 给角色授权权限 + + - + - 职位分页查询 + 获取组织树选择器 - - + - 添加职位 + 获取用户选择器 - - + - 修改职位 + 获取角色下的用户 - + - 删除职位 + 给角色授权用户 - + - 角色管理控制器 + 单页管理控制器 - + - 角色分页查询 + 单页分页查询 - + - 添加角色 + 添加单页 - + - 修改角色 + 修改单页 - + - 删除角色 + 删除单页 - + - 获取角色授权资源树 + 操作日志控制器 - - + - 获取角色拥有资源 + 字典分页查询 - + - 给角色授权资源 + 操作日志周统计柱状图图 - - + - 获取权限授权树 + 操作日志数量总览饼图 - + - 获取角色拥有权限 + 清空日志 - + - 给角色授权权限 + 日志详情 - + - 获取组织树选择器 + 访问日志控制器 + + + + 字典分页查询 + + - + - 获取用户选择器 + 访问日志周统计折线图 - + - 获取角色下的用户 + 访问日志总览饼图 - - + - 给角色授权用户 + 清空日志 - + - 单页管理控制器 + 系统配置控制器 - + - 单页分页查询 + 获取系统基础配置 - - + - 添加单页 + 获取配置列表 + + 分类 + + + + + 配置分页 - + - 修改单页 + 添加配置 - + - 删除单页 + 修改配置 - + - 用户个人信息控制器 + 删除配置 + + - + - 获取个人菜单 + 配置批量更新 - + - 获取个人工作台 + 系统字典控制器 + + + + + 获取字典树 - + - 编辑个人信息 + 字典分页查询 - + - 更新签名 + 添加字典 - + - 获取组织架构 + 修改字典 + - + - 编辑工作台 + 删除字典 - + - 获取登录用户的站内信分页 + 组织管理控制器 + + + + + 获取组织树 - - + - 读取登录用户站内信详情 + 获取组织树选择器 + + + + + + 组织分页查询 - + - 未读消息数 + 获取用户选择器 - + - 删除我的消息 + 获取组织详情 - + - 修改密码 + 复制组织 - + - 修改头像 + 添加组织 - + - 根据id集合获取用户集合 + 修改组织 + - + - 根据id集合获取职位集合 + 删除组织 + - + - 根据id集合获取组织集合 + 职位管理控制器 + + + + + 职位分页查询 + - + - 根据id集合获取角色集合 + 添加职位 + - + - 修改默认模块 + 修改职位 + + + + + + + 删除职位 + @@ -1433,6 +1318,121 @@ + + + 用户个人信息控制器 + + + + + 获取个人菜单 + + + + + + 获取个人工作台 + + + + + + 编辑个人信息 + + + + + + + 更新签名 + + + + + + + 获取组织架构 + + + + + + 编辑工作台 + + + + + + + 获取登录用户的站内信分页 + + + + + + + 读取登录用户站内信详情 + + + + + + + 未读消息数 + + + + + + 删除我的消息 + + + + + + + 修改密码 + + + + + + + 修改头像 + + + + + + + 根据id集合获取用户集合 + + + + + + 根据id集合获取职位集合 + + + + + + 根据id集合获取组织集合 + + + + + + 根据id集合获取角色集合 + + + + + + 修改默认模块 + + + 操作筛选器 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs index 6dcc04a..3b705da 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs @@ -1,8 +1,10 @@ -using Microsoft.AspNetCore.HttpOverrides; -using Microsoft.Extensions.FileProviders; -using Microsoft.Extensions.Hosting; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 namespace SimpleAdmin.Web.Core; @@ -115,4 +117,4 @@ public class Startup : AppStartup endpoints.MapControllers(); }); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs b/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs index 0d14181..7fff41e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs @@ -1,11 +1,16 @@ -using System.Drawing; +// SimpleAdmin Apache License Version 2.0 Э鷢ҵĿ²: +// 1.벻Ҫɾ޸ĸĿ¼µLICENSEļ +// 2.벻Ҫɾ޸SimpleAdminԴͷİȨ +// 3.ַԴʱע https://gitee.com/zxzyjs/SimpleAdmin +// 4.ڱƷֻʹ SimpleAdmin Ϊ̨񣬳ҲηַԴ +// 5.벻ýӦΣҰȫΪκʽڷǷΪĿĵΪҪɾ޸ +// 6.κλڱһзɾ׺Σ˾޹ء Console.WriteLine(@"Դַ: https://gitee.com/zxzyjs/SimpleAdmin"); Console.WriteLine(@"ʾַ: http://153.101.199.83:12802/login"); Console.WriteLine(@"QQ:531035580"); -Console.WriteLine("ûлڣֻм򵥡ȶЧ"); -Colorful.Console.WriteAsciiAlternating("SimpleAdmin", new Colorful.FrequencyBasedColorAlternator(3, Color.Yellow, Color.GreenYellow)); +Console.WriteLine("ܾʺɽ,ֻʵ,.NET "); Serve.Run(RunOptions.Default.ConfigureBuilder(builder => { builder.WebHost.UseUrls(builder.Configuration["AppSettings:Urls"]); -})); \ No newline at end of file +})); diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj index 610e604..42a641f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj @@ -13,12 +13,12 @@ - - + + - + diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/appsettings.json b/api/SimpleAdmin/SimpleAdmin.Web.Entry/appsettings.json index 1319254..5b03b0b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/appsettings.json +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/appsettings.json @@ -15,7 +15,7 @@ "KeepName": true, //是否保持原有名称不处理,bool,默认 false "AsLowerCamelCase": true //启用小驼峰命名(首字母小写),默认 false }, - + //swagger设置 "SpecificationDocumentSettings": { "DocumentTitle": "SimpleAdmin通用后台管理系统", diff --git a/api/SimpleAdmin/SimpleAdmin.sln b/api/SimpleAdmin/SimpleAdmin.sln index 979ee6f..bb2e1c6 100644 --- a/api/SimpleAdmin/SimpleAdmin.sln +++ b/api/SimpleAdmin/SimpleAdmin.sln @@ -39,9 +39,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "系统模块", "系统模 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Plugin.Aop", "SimpleAdmin.Plugin\SimpleAdmin.Plugin.Aop\SimpleAdmin.Plugin.Aop.csproj", "{8D130807-5AD8-4894-A694-6EBECBF89A5A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAdmin.SqlSugar", "SimpleAdmin.SqlSugar\SimpleAdmin.SqlSugar.csproj", "{AA783B66-6F91-4164-86D4-6D053E5A549C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.SqlSugar", "SimpleAdmin.SqlSugar\SimpleAdmin.SqlSugar.csproj", "{AA783B66-6F91-4164-86D4-6D053E5A549C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleAdmin.Cache", "SimpleAdmin.Cache\SimpleAdmin.Cache.csproj", "{B34C3A3E-EE0E-4D4F-9A3C-AADA575FA977}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleAdmin.Cache", "SimpleAdmin.Cache\SimpleAdmin.Cache.csproj", "{B34C3A3E-EE0E-4D4F-9A3C-AADA575FA977}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution -- Gitee From eb8ed084ac34c892a4154dcf309711118a8bc34e Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Tue, 5 Sep 2023 16:11:15 +0800 Subject: [PATCH 05/70] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/SimpleAdmin/.editorconfig | 114 +--- .../SimpleAdmin.Application/Entity/GenTest.cs | 4 +- .../Services/GenTest/GenTestService.cs | 6 +- .../Services/Org/OrgService.cs | 12 +- .../Services/Position/PositionService.cs | 12 +- .../Services/User/UserService.cs | 16 +- .../SimpleAdmin.Background/TestWorker.cs | 2 +- .../SimpleAdmin.Cache/Const/CacheConst.cs | 10 +- .../Service/MemoryCacheService.cs | 10 +- .../SimpleAdmin.Cache/SimpleAdmin.Cache.xml | 8 +- api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs | 4 +- .../Components/LoggingConsoleComponent.cs | 17 +- .../SimpleAdmin.Core/Const/ClaimConst.cs | 12 +- .../Const/SimpleAdminConst.cs | 24 +- .../SimpleAdmin.Core/SimpleAdmin.Core.xml | 32 +- .../Aop/GlobalDispatchProxy.cs | 111 ++-- .../Const/MqttConst.cs | 12 +- .../Service/Mqtt/Dto/MqttOutput.cs | 4 +- .../Service/Mqtt/MqttService.cs | 12 +- .../Service/Notice/MqttNoticeService.cs | 20 +- .../SimpleAdmin.Plugin.Mqtt.xml | 12 +- .../Hub/SimpleHub.cs | 6 +- .../Provider/UserIdProvider.cs | 2 +- .../Const/SqlsugarConst.cs | 12 +- .../SimpleAdmin.SqlSugar/Db/DbContext.cs | 18 +- .../SimpleAdmin.SqlSugar/Db/DbRepository.cs | 8 +- .../SimpleAdmin.SqlSugar.xml | 484 +--------------- .../SimpleAdmin.SqlSugar/Startup.cs | 8 +- .../Utils/CodeFirstUtils.cs | 8 +- .../Utils/SqlSugarUtils.cs | 6 +- .../Const/CateGoryConst.cs | 74 +-- .../Const/SysConfigConst.cs | 4 +- .../Const/SysDictConst.cs | 4 +- .../Const/SysLogConst.cs | 4 +- .../Const/SysResourceConst.cs} | 8 +- .../Const/SysRoleConst.cs} | 10 +- .../SimpleAdmin.System/Const/SystemConst.cs | 26 +- .../SimpleAdmin.System/Entity/BatchEdit.cs | 19 +- .../Entity/BatchEditConfig.cs | 34 +- .../Entity/ClientRelation.cs | 7 +- .../SimpleAdmin.System/Entity/ClientUser.cs | 106 ++-- .../SimpleAdmin.System/Entity/SysConfig.cs | 4 +- .../SimpleAdmin.System/Entity/SysDict.cs | 4 +- .../SimpleAdmin.System/Entity/SysFile.cs | 4 +- .../Entity/SysLogOperate.cs | 4 +- .../SimpleAdmin.System/Entity/SysLogVisit.cs | 7 +- .../SimpleAdmin.System/Entity/SysMessage.cs | 7 +- .../Entity/SysMessageUser.cs | 4 +- .../SimpleAdmin.System/Entity/SysOrg.cs | 4 +- .../SimpleAdmin.System/Entity/SysPosition.cs | 4 +- .../SimpleAdmin.System/Entity/SysRelation.cs | 7 +- .../SimpleAdmin.System/Entity/SysResource.cs | 10 +- .../SimpleAdmin.System/Entity/SysRole.cs | 16 +- .../SimpleAdmin.System/Entity/SysUser.cs | 103 ++-- .../EventSubscriber/AuthEventSubscriber.cs | 36 +- .../Const/EventSubscriberConst.cs | 12 +- .../EventSubscriber/NoticeEventSubsciber.cs | 12 +- .../EventSubscriber/UserEventSubscriber.cs | 8 +- .../SimpleAdmin.System/Oss/MinioUtils.cs | 50 +- .../Services/Auth/Auth/AuthService.cs | 44 +- .../Services/Auth/Session/SessionService.cs | 22 +- .../Services/BatchEdit/BatchEditService.cs | 6 +- .../Services/Dev/File/FileService.cs | 18 +- .../Services/Dev/Message/Dto/MessageInput.cs | 4 +- .../Services/Dev/Message/MessageService.cs | 8 +- .../ImportExport/ImportExportService.cs | 20 +- .../Services/Index/IndexService.cs | 6 +- .../Services/Limit/Button/ButtonService.cs | 28 +- .../Services/Limit/Menu/Dto/MenuInput.cs | 10 +- .../Services/Limit/Menu/MenuService.cs | 34 +- .../Services/Limit/Module/ModuleService.cs | 22 +- .../Services/Limit/Role/RoleService.cs | 120 ++-- .../Services/Limit/Spa/SpaService.cs | 24 +- .../LogAudit/OperateLog/OperateLogService.cs | 32 +- .../LogAudit/VisitLog/VisitLogService.cs | 24 +- .../Services/Ops/Config/ConfigService.cs | 20 +- .../Services/Ops/Dict/DictService.cs | 24 +- .../Services/Ops/Dict/IDictService.cs | 14 +- .../Organization/Org/ISysOrgService.cs | 8 +- .../Organization/Org/SysOrgService.cs | 26 +- .../Position/ISysPositionService.cs | 8 +- .../Position/SysPositionService.cs | 14 +- .../Organization/User/SysUserService.cs | 104 ++-- .../System/Relation/RelationService.cs | 14 +- .../System/Resource/ResourceService.cs | 38 +- .../System/UserCenter/UserCenterService.cs | 22 +- .../SimpleAdmin.System/SimpleAdmin.System.xml | 519 +++++++++++++++++- .../UserManager/UserManager.cs | 42 +- .../Components/LoggingMonitorComponent.cs | 52 +- .../System/Auth/AuthBController.cs | 6 +- .../Controllers/System/Dev/FileController.cs | 14 +- .../System/Limit/MenuController.cs | 4 +- .../System/Limit/RoleController.cs | 4 +- .../System/Ops/ConfigController.cs | 6 +- .../Handlers/JwtHandler.cs | 41 +- .../Logging/DatabaseLoggingWriter.cs | 44 +- .../Logging/LoggingConst.cs | 10 +- .../Logging/LoggingMonitorJson.cs | 4 +- .../SimpleAdmin.Web.Core.xml | 14 +- 99 files changed, 1565 insertions(+), 1507 deletions(-) rename api/SimpleAdmin/{SimpleAdmin.SqlSugar => SimpleAdmin.System}/Const/CateGoryConst.cs (68%) rename api/SimpleAdmin/{SimpleAdmin.SqlSugar => SimpleAdmin.System}/Const/SysConfigConst.cs (99%) rename api/SimpleAdmin/{SimpleAdmin.SqlSugar => SimpleAdmin.System}/Const/SysDictConst.cs (98%) rename api/SimpleAdmin/{SimpleAdmin.SqlSugar => SimpleAdmin.System}/Const/SysLogConst.cs (96%) rename api/SimpleAdmin/{SimpleAdmin.SqlSugar/Const/ResourceConst.cs => SimpleAdmin.System/Const/SysResourceConst.cs} (93%) rename api/SimpleAdmin/{SimpleAdmin.SqlSugar/Const/RoleConst.cs => SimpleAdmin.System/Const/SysRoleConst.cs} (85%) diff --git a/api/SimpleAdmin/.editorconfig b/api/SimpleAdmin/.editorconfig index e05a269..f965e86 100644 --- a/api/SimpleAdmin/.editorconfig +++ b/api/SimpleAdmin/.editorconfig @@ -1,24 +1,7 @@ [*.cs] -#### 命名样式 #### - -# 命名规则 -# 常量和静态只读字段必须大写(多个单词用 _ 分割)和私有字段使用 _ 作为前缀 的示例说明。 - -dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion -dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface -dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i - -dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.types_should_be_pascal_case.symbols = types -dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case - -dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members -dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case - - - +#### Naming styles #### +# Naming rules dotnet_naming_rule.const_should_be_all_upper.severity = suggestion dotnet_naming_rule.const_should_be_all_upper.symbols = const dotnet_naming_rule.const_should_be_all_upper.style = all_upper @@ -31,86 +14,29 @@ dotnet_naming_rule.private_or_internal_field_should_be_private_field.severity = dotnet_naming_rule.private_or_internal_field_should_be_private_field.symbols = private_or_internal_field dotnet_naming_rule.private_or_internal_field_should_be_private_field.style = private_field -# 符号规范 +# Symbol specifications +dotnet_naming_symbols.const.applicable_kinds = field +dotnet_naming_symbols.const.applicable_accessibilities = * +dotnet_naming_symbols.const.required_modifiers = const -dotnet_naming_symbols.interface.applicable_kinds = interface -dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.interface.required_modifiers = +dotnet_naming_symbols.static_readonly_field.applicable_kinds = field +dotnet_naming_symbols.static_readonly_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.static_readonly_field.required_modifiers = readonly, static -dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum -dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.types.required_modifiers = +dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field +dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected +dotnet_naming_symbols.private_or_internal_field.required_modifiers = -dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method -dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.non_field_members.required_modifiers = - -# 命名样式 - -#dotnet_naming_style.all_upper.word_separator = _ -#dotnet_naming_style.all_upper.capitalization = all_upper - -dotnet_naming_style.private_field.required_prefix = +# Naming styles +dotnet_naming_style.private_field.required_prefix = _ +dotnet_naming_style.private_field.required_suffix = +dotnet_naming_style.private_field.word_separator = dotnet_naming_style.private_field.capitalization = camel_case -dotnet_naming_style.begins_with_i.required_prefix = I -dotnet_naming_style.begins_with_i.required_suffix = -dotnet_naming_style.begins_with_i.word_separator = -dotnet_naming_style.begins_with_i.capitalization = pascal_case - -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = -dotnet_naming_style.pascal_case.capitalization = pascal_case - -dotnet_naming_style.pascal_case.required_prefix = -dotnet_naming_style.pascal_case.required_suffix = -dotnet_naming_style.pascal_case.word_separator = -dotnet_naming_style.pascal_case.capitalization = pascal_case -csharp_using_directive_placement = outside_namespace:silent -csharp_style_expression_bodied_methods = false:silent -csharp_style_expression_bodied_constructors = false:silent -csharp_style_expression_bodied_operators = false:silent -csharp_style_expression_bodied_properties = true:silent -csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_accessors = true:silent -csharp_style_expression_bodied_lambdas = true:silent -csharp_style_expression_bodied_local_functions = false:silent -csharp_style_conditional_delegate_call = true:suggestion -csharp_style_var_for_built_in_types = false:silent -csharp_style_var_when_type_is_apparent = false:silent -csharp_style_var_elsewhere = false:silent -csharp_prefer_simple_using_statement = true:suggestion -csharp_prefer_braces = true:silent -csharp_style_namespace_declarations = file_scoped:silent -csharp_style_prefer_top_level_statements = true:silent -csharp_style_prefer_method_group_conversion = true:silent -csharp_prefer_static_local_function = true:suggestion -csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent -csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent -csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent -csharp_style_prefer_switch_expression = true:suggestion -csharp_style_prefer_pattern_matching = true:silent -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_prefer_not_pattern = true:suggestion -csharp_style_prefer_extended_property_pattern = true:suggestion -csharp_style_throw_expression = true:suggestion -csharp_style_prefer_null_check_over_type_check = true:suggestion -csharp_prefer_simple_default_expression = true:suggestion -csharp_style_prefer_local_over_anonymous_function = true:suggestion -csharp_style_prefer_index_operator = true:suggestion -csharp_style_prefer_range_operator = true:suggestion -csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion -csharp_style_prefer_tuple_swap = true:suggestion -csharp_style_prefer_utf8_string_literals = true:suggestion -csharp_style_inlined_variable_declaration = true:suggestion -csharp_style_deconstructed_variable_declaration = true:suggestion -csharp_style_unused_value_assignment_preference = discard_variable:suggestion -csharp_style_unused_value_expression_statement_preference = discard_variable:silent -csharp_space_around_binary_operators = before_and_after -csharp_indent_labels = one_less_than_current - +dotnet_naming_style.all_upper.required_prefix = +dotnet_naming_style.all_upper.required_suffix = +dotnet_naming_style.all_upper.word_separator = _ +dotnet_naming_style.all_upper.capitalization = all_upper # Add copyright file header file_header_template = SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:\n1.请不要删除和修改根目录下的LICENSE文件。\n2.请不要删除和修改SimpleAdmin源码头部的版权声明。\n3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin\n4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。\n5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。\n6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs b/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs index 2d803b8..022df5c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 代码生成基础 /// [SugarTable("gen_test", TableDescription = "代码生成测试")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] [CodeGen] [BatchEdit] public class GenTest : DataEntityBase @@ -52,4 +52,4 @@ public class GenTest : DataEntityBase /// 排序码 /// public int SortCode { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs index 4a94eaa..c1ef5d0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/GenTest/GenTestService.cs @@ -161,7 +161,7 @@ public class GenTestService : DbRepository, IGenTestService private async Task CheckInput(GenTest genTest) { var errorMessage = $"您没有权限操作该数据"; - if (genTest.Id == SimpleAdminConst.Zero) + if (genTest.Id == SimpleAdminConst.ZERO) { //表示新增 } @@ -183,7 +183,7 @@ public class GenTestService : DbRepository, IGenTestService .WhereIF(!string.IsNullOrWhiteSpace(input.Name), it => it.Name.Contains(input.Name.Trim())) .WhereIF(input.OrgId > 0, it => orgIds.Contains(it.CreateOrgId))//根据机构ID查询 - //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 + //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") .OrderBy(it => it.SortCode);//排序 @@ -198,4 +198,4 @@ public class GenTestService : DbRepository, IGenTestService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs index 686c48e..b0829a3 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs @@ -47,15 +47,15 @@ public class OrgService : DbRepository, IOrgService /// public async Task Add(SysOrgAddInput input) { - await CheckInput(input, SimpleAdminConst.Add);//检查参数 - await _sysOrgService.Add(input, SimpleAdminConst.BizOrg); + await CheckInput(input, SimpleAdminConst.ADD);//检查参数 + await _sysOrgService.Add(input, SimpleAdminConst.BIZ_ORG); } /// public async Task Edit(SysOrgEditInput input) { - await CheckInput(input, SimpleAdminConst.Edit);//检查参数 - await _sysOrgService.Edit(input, SimpleAdminConst.BizOrg); + await CheckInput(input, SimpleAdminConst.EDIT);//检查参数 + await _sysOrgService.Edit(input, SimpleAdminConst.BIZ_ORG); } /// @@ -93,7 +93,7 @@ public class OrgService : DbRepository, IOrgService if (orgs.Any(it => it.CreateUserId != UserManager.UserId)) throw Oops.Bah($"只能删除自己创建的机构"); } - await _sysOrgService.Delete(input, SimpleAdminConst.BizOrg);//删除操作 + await _sysOrgService.Delete(input, SimpleAdminConst.BIZ_ORG);//删除操作 } /// @@ -139,4 +139,4 @@ public class OrgService : DbRepository, IOrgService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs index b8bc8fe..87573ed 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs @@ -36,8 +36,8 @@ public class PositionService : DbRepository, IPositionService /// public async Task Add(PositionAddInput input) { - await CheckInput(input, SimpleAdminConst.Add);//检查参数 - await _sysPositionService.Add(input, SimpleAdminConst.BizPos);//添加岗位 + await CheckInput(input, SimpleAdminConst.ADD);//检查参数 + await _sysPositionService.Add(input, SimpleAdminConst.BIZ_POS);//添加岗位 } /// @@ -64,14 +64,14 @@ public class PositionService : DbRepository, IPositionService if (positions.Any(it => it.CreateUserId != UserManager.UserId)) throw Oops.Bah($"只能删除自己创建的岗位"); } - await _sysPositionService.Delete(input, SimpleAdminConst.BizOrg);//删除岗位 + await _sysPositionService.Delete(input, SimpleAdminConst.BIZ_ORG);//删除岗位 } /// public async Task Edit(PositionEditInput input) { - await CheckInput(input, SimpleAdminConst.Edit);//检查参数 - await _sysPositionService.Edit(input, SimpleAdminConst.BizPos);//编辑 + await CheckInput(input, SimpleAdminConst.EDIT);//检查参数 + await _sysPositionService.Edit(input, SimpleAdminConst.BIZ_POS);//编辑 } /// @@ -125,4 +125,4 @@ public class PositionService : DbRepository, IPositionService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs index cb2defe..96e965d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs @@ -115,7 +115,7 @@ public class UserService : DbRepository, IUserService /// public async Task Add(UserAddInput input) { - await CheckInput(input, SimpleAdminConst.Add);//检查参数 + await CheckInput(input, SimpleAdminConst.ADD);//检查参数 await _sysUserService.Add(input);//添加 } @@ -126,7 +126,7 @@ public class UserService : DbRepository, IUserService /// public async Task Edit(UserEditInput input) { - await CheckInput(input, SimpleAdminConst.Edit);//检查参数 + await CheckInput(input, SimpleAdminConst.EDIT);//检查参数 await _sysUserService.Edit(input);//编辑 } @@ -151,28 +151,28 @@ public class UserService : DbRepository, IUserService /// public async Task DisableUser(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.Disable);//检查权限 + await CheckPermission(input.Id, SimpleAdminConst.DISABLE);//检查权限 await _sysUserService.DisableUser(input);//禁用 } /// public async Task EnableUser(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.Enable);//检查权限 + await CheckPermission(input.Id, SimpleAdminConst.ENABLE);//检查权限 await _sysUserService.EnableUser(input);//启用 } /// public async Task GrantRole(UserGrantRoleInput input) { - await CheckPermission(input.Id, SimpleAdminConst.Disable);//检查权限 + await CheckPermission(input.Id, SimpleAdminConst.DISABLE);//检查权限 await _sysUserService.GrantRole(input);//授权 } /// public async Task ResetPassword(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.ResestPwd);//检查权限 + await CheckPermission(input.Id, SimpleAdminConst.RESEST_PWD);//检查权限 await _sysUserService.ResetPassword(input);//重置密码 } @@ -369,7 +369,7 @@ public class UserService : DbRepository, IUserService var dataScope = await _sysUserService.GetLoginUserApiDataScope(); //动态查询条件 var exp = Expressionable.Create(); - exp.And(u => u.Account != RoleConst.SuperAdmin); + exp.And(u => u.Account != SysRoleConst.SUPER_ADMIN); exp.AndIF(dataScope is { Count: > 0 }, u => dataScope.Contains(u.OrgId));//用户机构在数据范围内 exp.AndIF(dataScope is { Count: 0 }, u => u.Id == UserManager.UserId);//用户ID等于自己 input.Expression = exp; @@ -377,4 +377,4 @@ public class UserService : DbRepository, IUserService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs b/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs index 3f74573..73b7d25 100644 --- a/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs +++ b/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs @@ -15,7 +15,7 @@ public class TestWorker : BackgroundService private readonly ILogger _logger; private readonly ISimpleCacheService _simpleCacheService; - public TestWorker(ILogger logger, ISimpleCacheService simpleCacheService, ) + public TestWorker(ILogger logger, ISimpleCacheService simpleCacheService ) { _logger = logger; _simpleCacheService = simpleCacheService; diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs index b04587f..80ae0de 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Const/CacheConst.cs @@ -16,20 +16,20 @@ public class CacheConst /// /// Redis Key前缀(可删除) /// - public const string Cache_Prefix_Web = "SimpleAdminWeb:"; + public const string CACHE_PREFIX_WEB = "SimpleAdminWeb:"; /// /// Redis Key前缀(需要持久化,不随系统重启删除) /// - public const string Cache_Prefix = "SimpleAdmin:"; + public const string CACHE_PREFIX = "SimpleAdmin:"; /// /// Redis Hash类型 /// - public const string Cache_Hash = "Hash"; + public const string CACHE_HASH = "Hash"; /// /// 用户Token缓存Key /// - public const string Cache_UserToken = Cache_Prefix + "UserToken"; -} \ No newline at end of file + public const string CACHE_USER_TOKEN = CACHE_PREFIX + "UserToken"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs index 7d13295..e1bd9a0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs @@ -14,7 +14,7 @@ namespace SimpleAdmin.Cache; /// public partial class MemoryCacheService : ISimpleCacheService { - public readonly MemoryCache _memoryCache; + private readonly MemoryCache _memoryCache; public MemoryCacheService() { @@ -218,10 +218,12 @@ public partial class MemoryCacheService : ISimpleCacheService } /// - public IDisposable AcquireLock(string key, int msTimeout, int msExpire, bool throwOnFailure) + public IDisposable AcquireLock(string key, int msTimeout, int msExpire, + bool throwOnFailure) { - return _memoryCache.AcquireLock(key, msTimeout, msExpire, throwOnFailure); + return _memoryCache.AcquireLock(key, msTimeout, msExpire, + throwOnFailure); } #endregion 事务 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.xml b/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.xml index 9c773d9..b45402f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.xml +++ b/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.xml @@ -9,22 +9,22 @@ Redis常量 - + Redis Key前缀(可删除) - + Redis Key前缀(需要持久化,不随系统重启删除) - + Redis Hash类型 - + 用户Token缓存Key diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs index b3ebf55..56ffbbe 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Startup.cs @@ -50,7 +50,7 @@ public class Startup : AppStartup { var redis = App.GetService();//获取redis服务 //删除redis的key - redis.DelByPattern(CacheConst.Cache_Prefix_Web); + redis.DelByPattern(CacheConst.CACHE_PREFIX_WEB); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs index fd8959c..7960b95 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs @@ -41,7 +41,8 @@ public sealed class LoggingConsoleComponent : IServiceComponent return logMsg.Message; } }; - options.WriteHandler = (logMsg, scopeProvider, writer, fmtMsg, opt) => + options.WriteHandler = (logMsg, scopeProvider, writer, + fmtMsg, opt) => { if (logMsg.LogName == _monitorName && !_loggingSetting.Monitor.Console) return; var consoleColor = ConsoleColor.White; @@ -67,8 +68,8 @@ public sealed class LoggingConsoleComponent : IServiceComponent public static class TextWriterExtensions { - private const string DefaultForegroundColor = "\x1B[39m\x1B[22m"; - private const string DefaultBackgroundColor = "\x1B[49m"; + private const string DEFAULT_FOREGROUND_COLOR = "\x1B[39m\x1B[22m"; + private const string DEFAULT_BACKGROUND_COLOR = "\x1B[49m"; public static void WriteWithColor( this TextWriter textWriter, @@ -99,11 +100,11 @@ public static class TextWriterExtensions if (foregroundColor != null) { - textWriter.Write(DefaultForegroundColor); + textWriter.Write(DEFAULT_FOREGROUND_COLOR); } if (backgroundColor != null) { - textWriter.Write(DefaultBackgroundColor); + textWriter.Write(DEFAULT_BACKGROUND_COLOR); } } @@ -127,7 +128,7 @@ public static class TextWriterExtensions ConsoleColor.Cyan => "\x1B[1m\x1B[36m", ConsoleColor.White => "\x1B[1m\x1B[37m", - _ => DefaultForegroundColor + _ => DEFAULT_FOREGROUND_COLOR }; } @@ -144,7 +145,7 @@ public static class TextWriterExtensions ConsoleColor.DarkCyan => "\x1B[46m", ConsoleColor.Gray => "\x1B[47m", - _ => DefaultBackgroundColor + _ => DEFAULT_BACKGROUND_COLOR }; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs index d1da4da..e8e7747 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/ClaimConst.cs @@ -16,25 +16,25 @@ public class ClaimConst /// /// 用户Id /// - public const string UserId = "UserId"; + public const string USER_ID = "UserId"; /// /// 账号 /// - public const string Account = "Account"; + public const string ACCOUNT = "Account"; /// /// 名称 /// - public const string Name = "Name"; + public const string NAME = "Name"; /// /// 账号类型 /// - public const string IsSuperAdmin = "IsSuperAdmin"; + public const string IS_SUPER_ADMIN = "IsSuperAdmin"; /// /// 组织机构Id /// - public const string OrgId = "OrgId"; -} \ No newline at end of file + public const string ORG_ID = "OrgId"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs index fce25d1..1e2fd53 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs @@ -15,32 +15,32 @@ public class SimpleAdminConst /// /// 添加操作 /// - public const string Add = "添加"; + public const string ADD = "添加"; /// /// 编辑操作 /// - public const string Edit = "编辑"; + public const string EDIT = "编辑"; /// /// 启用操作 /// - public const string Enable = "启用"; + public const string ENABLE = "启用"; /// /// 禁用操作 /// - public const string Disable = "禁用"; + public const string DISABLE = "禁用"; /// /// 重置密码操作 /// - public const string ResestPwd = "重置密码"; + public const string RESEST_PWD = "重置密码"; /// /// 用户授权操作 /// - public const string GrantRole = "授权"; + public const string GRANT_ROLE = "授权"; #endregion 操作 @@ -49,27 +49,27 @@ public class SimpleAdminConst /// /// 组织 /// - public const string SysOrg = "组织"; + public const string SYS_ORG = "组织"; /// /// 机构 /// - public const string BizOrg = "机构"; + public const string BIZ_ORG = "机构"; /// /// 职位 /// - public const string SysPos = "职位"; + public const string SYS_POS = "职位"; /// /// 岗位 /// - public const string BizPos = "岗位"; + public const string BIZ_POS = "岗位"; #endregion 别称 /// /// 0 /// - public const int Zero = 0; -} \ No newline at end of file + public const int ZERO = 0; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml index cf0a48c..4e1ca9c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml @@ -161,82 +161,82 @@ 授权用户常量 - + 用户Id - + 账号 - + 名称 - + 账号类型 - + 组织机构Id - + 添加操作 - + 编辑操作 - + 启用操作 - + 禁用操作 - + 重置密码操作 - + 用户授权操作 - + 组织 - + 机构 - + 职位 - + 岗位 - + 0 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs index a1632a7..f1fec99 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs @@ -117,16 +117,16 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy //判断需不需要读取缓存 if (cacheAttribute != null) { - var _redisManager = Services.GetService();// 获取redis服务 + var redisManager = Services.GetService();// 获取redis服务 var cacheKey = cacheAttribute.CustomKeyValue ?? CustomCacheKey(cacheAttribute.KeyPrefix, method, args);//如果redisKey值,如果有自定义值就用自定义Key,否则以前缀+系统自动生成的Key var cacheValue = string.Empty; - if (cacheAttribute.StoreType == CacheConst.Cache_Hash)//如果存的是Hash值 + if (cacheAttribute.StoreType == CacheConst.CACHE_HASH)//如果存的是Hash值 { - cacheValue = _redisManager.HashGet(cacheKey, new string[] { args[0].ToString() })[0];//从redis获取Hash数据取第一个,注意是 string 类型 + cacheValue = redisManager.HashGet(cacheKey, new string[] { args[0].ToString() })[0];//从redis获取Hash数据取第一个,注意是 string 类型 } else { - cacheValue = _redisManager.Get(cacheKey);//注意是 string 类型,方法GetValue + cacheValue = redisManager.Get(cacheKey);//注意是 string 类型,方法GetValue } if (!string.IsNullOrEmpty(cacheValue))//如果返回值不是空 { @@ -182,29 +182,29 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy var cacheKey = cacheAttribute.CustomKeyValue ?? CustomCacheKey(cacheAttribute.KeyPrefix, method, args); if (!string.IsNullOrWhiteSpace(cacheKey))//如果有key { - var _redisManager = Services.GetService();// 获取redis服务 + var redisManager = Services.GetService();// 获取redis服务 if (cacheAttribute.IsDelete)//判断是否是删除操作 { //删除Redis整个KEY - _redisManager.Remove(cacheKey); + redisManager.Remove(cacheKey); } else { if (returnValue == null) { return; } - if (cacheAttribute.StoreType == CacheConst.Cache_Hash)//如果是hash类型的 + if (cacheAttribute.StoreType == CacheConst.CACHE_HASH)//如果是hash类型的 { //插入到hash,这里规定是方法的第一个参数 - _redisManager.HashAdd(cacheKey, args[0].ToString(), returnValue); + redisManager.HashAdd(cacheKey, args[0].ToString(), returnValue); } else { if (cacheAttribute.AbsoluteExpiration != null)//如果有超时时间 { - _redisManager.Set(cacheKey, returnValue, cacheAttribute.AbsoluteExpiration.Value);//插入redis + redisManager.Set(cacheKey, returnValue, cacheAttribute.AbsoluteExpiration.Value);//插入redis } else { - _redisManager.Set(cacheKey, returnValue);//插入redis + redisManager.Set(cacheKey, returnValue);//插入redis } } } @@ -234,7 +234,7 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy { var typeName = Target.GetType().Name;//获取实例名 var methodName = method.Name;//获取方法名 - key = $"{CacheConst.Cache_Prefix_Web}{typeName}:{methodName}:";//生成Key + key = $"{CacheConst.CACHE_PREFIX_WEB}{typeName}:{methodName}:";//生成Key foreach (var param in methodArguments)//遍历参数列表 { key = $"{key}{param}:";//生成加上参数的KEY @@ -330,40 +330,41 @@ internal static class GetCacheKey //已经修改过代码body应该不会是null值了 if (!(expression is BinaryExpression body)) return string.Empty; - var Operator = GetOperator(body.NodeType); - var Left = Resolve(body.Left); - var Right = Resolve(body.Right); - var Result = string.Format("({0} {1} {2})", Left, Operator, Right); - return Result; + var @operator = GetOperator(body.NodeType); + var left = Resolve(body.Left); + var right = Resolve(body.Right); + var result = string.Format("({0} {1} {2})", left, @operator, + right); + return result; } private static string ResolveFunc(Expression left, Expression right, ExpressionType expressiontype) { - var Name = (left as MemberExpression).Member.Name; - var Value = (right as ConstantExpression).Value; - var Operator = GetOperator(expressiontype); - return Name + Operator + Value ?? "null"; + var name = (left as MemberExpression).Member.Name; + var value = (right as ConstantExpression).Value; + var @operator = GetOperator(expressiontype); + return name + @operator + value ?? "null"; } private static string ResolveLinqToObject(Expression expression, object value, ExpressionType? expressiontype = null) { - var MethodCall = expression as MethodCallExpression; - var MethodName = MethodCall.Method.Name; - switch (MethodName) + var methodCall = expression as MethodCallExpression; + var methodName = methodCall.Method.Name; + switch (methodName) { case "Contains": - if (MethodCall.Object != null) - return Like(MethodCall); - return In(MethodCall, value); + if (methodCall.Object != null) + return Like(methodCall); + return In(methodCall, value); case "Count": - return Len(MethodCall, value, expressiontype.Value); + return Len(methodCall, value, expressiontype.Value); case "LongCount": - return Len(MethodCall, value, expressiontype.Value); + return Len(methodCall, value, expressiontype.Value); default: - throw new Exception(string.Format("不支持{0}方法的查找!", MethodName)); + throw new Exception(string.Format("不支持{0}方法的查找!", methodName)); } } @@ -387,40 +388,42 @@ internal static class GetCacheKey private static string In(MethodCallExpression expression, object isTrue) { - var Argument1 = (expression.Arguments[0] as MemberExpression).Expression as ConstantExpression; - var Argument2 = expression.Arguments[1] as MemberExpression; - var Field_Array = Argument1.Value.GetType().GetFields().First(); - object[] Array = Field_Array.GetValue(Argument1.Value) as object[]; - List SetInPara = new List(); - for (var i = 0; i < Array.Length; i++) + var argument1 = (expression.Arguments[0] as MemberExpression).Expression as ConstantExpression; + var argument2 = expression.Arguments[1] as MemberExpression; + var fieldArray = argument1.Value.GetType().GetFields().First(); + object[] array = fieldArray.GetValue(argument1.Value) as object[]; + List setInPara = new List(); + for (var i = 0; i < array.Length; i++) { - var Value = Array[i].ToString(); - SetInPara.Add(Value); + var value = array[i].ToString(); + setInPara.Add(value); } - var Name = Argument2.Member.Name; - var Operator = Convert.ToBoolean(isTrue) ? "in" : " not in"; - var CompName = string.Join(",", SetInPara); - var Result = string.Format("{0} {1} ({2})", Name, Operator, CompName); - return Result; + var name = argument2.Member.Name; + var @operator = Convert.ToBoolean(isTrue) ? "in" : " not in"; + var compName = string.Join(",", setInPara); + var result = string.Format("{0} {1} ({2})", name, @operator, + compName); + return result; } private static string Like(MethodCallExpression expression) { - var Temp = expression.Arguments[0]; - var lambda = Expression.Lambda(Temp); + var temp = expression.Arguments[0]; + var lambda = Expression.Lambda(temp); var fn = lambda.Compile(); - var tempValue = Expression.Constant(fn.DynamicInvoke(null), Temp.Type); - var Value = string.Format("%{0}%", tempValue); - var Name = (expression.Object as MemberExpression).Member.Name; - var Result = string.Format("{0} like {1}", Name, Value); - return Result; + var tempValue = Expression.Constant(fn.DynamicInvoke(null), temp.Type); + var value = string.Format("%{0}%", tempValue); + var name = (expression.Object as MemberExpression).Member.Name; + var result = string.Format("{0} like {1}", name, value); + return result; } private static string Len(MethodCallExpression expression, object value, ExpressionType expressiontype) { - object Name = (expression.Arguments[0] as MemberExpression).Member.Name; - var Operator = GetOperator(expressiontype); - var Result = string.Format("len({0}){1}{2}", Name, Operator, value.ToString()); - return Result; + object name = (expression.Arguments[0] as MemberExpression).Member.Name; + var @operator = GetOperator(expressiontype); + var result = string.Format("len({0}){1}{2}", name, @operator, + value.ToString()); + return result; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs index d251bd5..58c4300 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs @@ -16,25 +16,25 @@ public class MqttConst /// /// mqtt认证登录信息key /// - public const string Cache_MqttClientUser = CacheConst.Cache_Prefix_Web + "MqttClientUser:"; + public const string CACHE_MQTT_CLIENT_USER = CacheConst.CACHE_PREFIX_WEB + "MqttClientUser:"; /// /// mqtt主题前缀 /// - public const string Mqtt_TopicPrefix = "SimpleAdmin/"; + public const string MQTT_TOPIC_PREFIX = "SimpleAdmin/"; /// /// 登出 /// - public const string Mqtt_Message_LoginOut = "LoginOut"; + public const string MQTT_MESSAGE_LOGIN_OUT = "LoginOut"; /// /// 新消息 /// - public const string Mqtt_Message_New = "NewMessage"; + public const string MQTT_MESSAGE_NEW = "NewMessage"; /// /// 修改密码 /// - public const string Mqtt_Message_UpdatePassword = "UpdatePassword"; -} \ No newline at end of file + public const string MQTT_MESSAGE_UPDATE_PASSWORD = "UpdatePassword"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs index f0131a3..2648979 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs @@ -53,5 +53,5 @@ public class MqttAuthOutput /// /// 是否超级管理员 /// - public bool Is_superuser { get; set; } = false; -} \ No newline at end of file + public bool IsSuperuser { get; set; } = false; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs index e72f458..b8c9238 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs @@ -34,7 +34,7 @@ public class MqttService : IMqttService var user = await _sysUserService.GetUserById(UserManager.UserId);//获取用户信息 var token = JWTEncryption.GetJwtBearerToken((DefaultHttpContext)App.HttpContext);// 获取当前token //获取mqtt配置 - var mqttconfig = await _configService.GetListByCategory(CateGoryConst.Config_MQTT_BASE); + var mqttconfig = await _configService.GetListByCategory(CateGoryConst.CONFIG_MQTT_BASE); //地址 var url = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault(); //用户名 @@ -59,14 +59,14 @@ public class MqttService : IMqttService #endregion 密码特殊处理 var clientId = $"{user.Id}_{RandomHelper.CreateLetterAndNumber(5)}";//客户端ID - _simpleCacheService.Set(MqttConst.Cache_MqttClientUser + clientId, token, TimeSpan.FromMinutes(1));//将该客户端ID对应的token插入redis后面可以根据这个判断是哪个token登录的 + _simpleCacheService.Set(MqttConst.CACHE_MQTT_CLIENT_USER + clientId, token, TimeSpan.FromMinutes(1));//将该客户端ID对应的token插入redis后面可以根据这个判断是哪个token登录的 return new MqttParameterOutput { ClientId = clientId, Password = password, Url = url, UserName = userName, - Topics = new List { MqttConst.Mqtt_TopicPrefix + user.Id }//默认监听自己 + Topics = new List { MqttConst.MQTT_TOPIC_PREFIX + user.Id }//默认监听自己 }; } @@ -74,10 +74,10 @@ public class MqttService : IMqttService public async Task Auth(MqttAuthInput input) { var user = await _sysUserService.GetUserByAccount(input.Username); - var mqttAuthOutput = new MqttAuthOutput { Is_superuser = false, Result = "deny" }; + var mqttAuthOutput = new MqttAuthOutput { IsSuperuser = false, Result = "deny" }; //获取用户token - var tokens = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, user.Id.ToString()); + var tokens = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, user.Id.ToString()); if (tokens != null) { if (tokens.Any(it => it.Token == input.Password))//判断是否有token @@ -85,4 +85,4 @@ public class MqttService : IMqttService } return mqttAuthOutput; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs index 26fad00..a34cd83 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs @@ -21,27 +21,27 @@ public class MqttNoticeService : INoticeService /// public async Task UpdatePassWord(string userId, List clientIds, string message) { - var _mqttClientManager = GetMqttClientManager(); + var mqttClientManager = GetMqttClientManager(); //发送修改密码消息 - await _mqttClientManager.GetClient().PublishAsync(MqttConst.Mqtt_TopicPrefix + userId, new MqttMessage + await mqttClientManager.GetClient().PublishAsync(MqttConst.MQTT_TOPIC_PREFIX + userId, new MqttMessage { Data = new { Message = message, ClientIds = clientIds }, - MsgType = MqttConst.Mqtt_Message_UpdatePassword + MsgType = MqttConst.MQTT_MESSAGE_UPDATE_PASSWORD }); } /// public async Task NewMesage(List userIds, List clientIds, string message) { - var _mqttClientManager = GetMqttClientManager(); + var mqttClientManager = GetMqttClientManager(); //遍历用户Id foreach (var userId in userIds) { //发送消息 - await _mqttClientManager.GetClient().PublishAsync(MqttConst.Mqtt_TopicPrefix + userId, new MqttMessage + await mqttClientManager.GetClient().PublishAsync(MqttConst.MQTT_TOPIC_PREFIX + userId, new MqttMessage { Data = new { Message = message }, - MsgType = MqttConst.Mqtt_Message_New + MsgType = MqttConst.MQTT_MESSAGE_NEW }); } } @@ -49,12 +49,12 @@ public class MqttNoticeService : INoticeService /// public async Task UserLoginOut(string userId, List clientIds, string message) { - var _mqttClientManager = GetMqttClientManager(); + var mqttClientManager = GetMqttClientManager(); //发送通知下线消息 - await _mqttClientManager.GetClient().PublishAsync(MqttConst.Mqtt_TopicPrefix + userId, new MqttMessage + await mqttClientManager.GetClient().PublishAsync(MqttConst.MQTT_TOPIC_PREFIX + userId, new MqttMessage { Data = new { Message = message, ClientIds = clientIds }, - MsgType = MqttConst.Mqtt_Message_LoginOut + MsgType = MqttConst.MQTT_MESSAGE_LOGIN_OUT }); } @@ -68,4 +68,4 @@ public class MqttNoticeService : INoticeService var service = App.GetService(); return service; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml index 1516ce2..bda1054 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml @@ -9,27 +9,27 @@ mqtt常量 - + mqtt认证登录信息key - + mqtt主题前缀 - + 登出 - + 新消息 - + 修改密码 @@ -137,7 +137,7 @@ 结果 "allow" | "deny" | "ignore", // Default `"ignore"` - + 是否超级管理员 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs index e9dba3b..93d9644 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs @@ -73,7 +73,7 @@ public class SimpleHub : Hub if (!string.IsNullOrEmpty(userId)) { //获取redis当前用户的token信息列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); + var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId); if (tokenInfos != null) { if (ifConnect) @@ -83,7 +83,7 @@ public class SimpleHub : Hub if (tokenInfo != null) { tokenInfo.ClientIds.Add(userIdentifier);//添加到客户端列表 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//更新Redis + _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//更新Redis } } else @@ -93,7 +93,7 @@ public class SimpleHub : Hub if (tokenInfo != null) { tokenInfo.ClientIds.RemoveWhere(it => it == userIdentifier);//从客户端列表删除 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//更新Redis + _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//更新Redis } } } diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs index fae491d..ea9b5c9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs @@ -17,7 +17,7 @@ public class UserIdProvider : IUserIdProvider { var token = connection.GetHttpContext().Request.Query["access_token"];//获取token var claims = JWTEncryption.ReadJwtToken(token)?.Claims;//解析token - var userId = claims.FirstOrDefault(u => u.Type == ClaimConst.UserId)?.Value;//获取用户ID + var userId = claims.FirstOrDefault(u => u.Type == ClaimConst.USER_ID)?.Value;//获取用户ID if (!string.IsNullOrEmpty(userId))//如果不为空 return $"{userId}_{RandomHelper.CreateLetterAndNumber(5)}";//返回用户ID else diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs index fe6f60e..618007a 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs @@ -16,29 +16,29 @@ public class SqlsugarConst /// /// 默认库ConfigId /// - public const string DB_Default = "SimpleAdmin"; + public const string DB_DEFAULT = "SimpleAdmin"; /// /// 默认表主键 /// - public const string DB_PrimaryKey = "Id"; + public const string DB_PRIMARY_KEY = "Id"; #region 数据库字段类型 /// /// varchar(max) /// - public const string NVarCharMax = "nvarchar(max)"; + public const string N_VAR_CHAR_MAX = "nvarchar(max)"; /// /// mysql的longtext /// - public const string LongText = "longtext"; + public const string LONG_TEXT = "longtext"; /// /// sqlite的text /// - public const string Text = "text"; + public const string TEXT = "text"; #endregion 数据库字段类型 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs index 25b1307..333f469 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs @@ -16,15 +16,15 @@ public static class DbContext /// /// 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 /// - public static readonly List DbConfigs = App.GetConfig>("SqlSugarSettings:ConnectionStrings"); + public static readonly List DB_CONFIGS = App.GetConfig>("SqlSugarSettings:ConnectionStrings"); /// /// SqlSugar 数据库实例 /// - public static readonly SqlSugarScope Db = new SqlSugarScope(DbConfigs.Adapt>(), db => + public static readonly SqlSugarScope DB = new SqlSugarScope(DB_CONFIGS.Adapt>(), db => { //遍历配置的数据库 - DbConfigs.ForEach(it => + DB_CONFIGS.ForEach(it => { var sqlsugarScope = db.GetConnectionScope(it.ConfigId);//获取当前库 MoreSetting(sqlsugarScope);//更多设置 @@ -142,11 +142,11 @@ public static class DbContext { //创建人和创建机构ID if (entityInfo.PropertyName == nameof(BaseEntity.CreateUserId)) - entityInfo.SetValue(App.User.FindFirst(ClaimConst.UserId)?.Value); + entityInfo.SetValue(App.User.FindFirst(ClaimConst.USER_ID)?.Value); if (entityInfo.PropertyName == nameof(BaseEntity.CreateUser)) - entityInfo.SetValue(App.User?.FindFirst(ClaimConst.Account)?.Value); + entityInfo.SetValue(App.User?.FindFirst(ClaimConst.ACCOUNT)?.Value); if (entityInfo.PropertyName == nameof(DataEntityBase.CreateOrgId)) - entityInfo.SetValue(App.User.FindFirst(ClaimConst.OrgId)?.Value); + entityInfo.SetValue(App.User.FindFirst(ClaimConst.ORG_ID)?.Value); } } // 更新操作 @@ -159,9 +159,9 @@ public static class DbContext if (App.User != null) { if (entityInfo.PropertyName == nameof(BaseEntity.UpdateUserId)) - entityInfo.SetValue(App.User?.FindFirst(ClaimConst.UserId)?.Value); + entityInfo.SetValue(App.User?.FindFirst(ClaimConst.USER_ID)?.Value); if (entityInfo.PropertyName == nameof(BaseEntity.UpdateUser)) - entityInfo.SetValue(App.User?.FindFirst(ClaimConst.Account)?.Value); + entityInfo.SetValue(App.User?.FindFirst(ClaimConst.ACCOUNT)?.Value); } } }; @@ -206,4 +206,4 @@ public static class DbContext { Console.WriteLine($"=============={msg}=============="); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs index 571d863..8f057fc 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs @@ -14,12 +14,12 @@ namespace SimpleAdmin.SqlSugar; [SuppressSniffer] public partial class DbRepository : SimpleClient where T : class, new() { - protected ITenant itenant = null;//多租户事务、GetConnection、IsAnyConnection等功能 + protected ITenant Itenant = null;//多租户事务、GetConnection、IsAnyConnection等功能 public DbRepository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null { - Context = DbContext.Db.GetConnectionScopeWithAttr();//ioc注入的对象 - itenant = DbContext.Db; + Context = DbContext.DB.GetConnectionScopeWithAttr();//ioc注入的对象 + Itenant = DbContext.DB; } #region 仓储方法拓展 @@ -106,4 +106,4 @@ public partial class DbRepository : SimpleClient where T : class, new() #endregion 单查 #endregion 仓储方法拓展 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 30ab243..53befc4 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -4,211 +4,6 @@ SimpleAdmin.SqlSugar - - - 分类常量 - - - - - 系统基础 - - - - - 登录策略 - - - - - 密码策略 - - - - - 业务定义 - - - - - 文件-本地 - - - - - 文件-MINIO - - - - - MQTT配置 - - - - - 用户有哪些角色 - - - - - 角色有哪些资源 - - - - - 角色有哪些模块 - - - - - 用户有哪些资源 - - - - - 角色有哪些权限 - - - - - 角色有哪些权限 - - - - - 用户工作台数据 - - - - - 用户日程数据 - - - - - 站内信与接收用户 - - - - - 本人 - - - - - 所有 - - - - - 仅所属组织 - - - - - 所属组织及以下 - - - - - 自定义 - - - - - 模块 - - - - - 菜单 - - - - - 单页 - - - - - 按钮 - - - - - 登录 - - - - - 登出 - - - - - 操作 - - - - - 异常 - - - - - 框架 - - - - - 业务 - - - - - 部门 - - - - - 公司 - - - - - 高层 - - - - - 中层 - - - - - 基层 - - - - - 全局 - - - - - 机构 - - - - - 通知 - - - - - 公告 - - 前端控件作用类型常量 @@ -264,312 +59,47 @@ 下拉框 - - - 资源表常量 - - - - - 目录 - - - - - 组件 - - - - - 内链 - - - - - 目录 - - - - - 外链 - - - - - 单页 - - - - - 系统内置单页面编码 - - - - - 角色常量 - - - - - 超级管理员 - - - - - 业务管理员 - - Sqlsugar系统常量类 - + 默认库ConfigId - + 默认表主键 - + varchar(max) - + mysql的longtext - + sqlite的text - - - 系统配置常量 - - - - - 系统默认工作台 - - - - - 登录验证码开关 - - - - - 登录验证码开关 - - - - - 单用户登录开关 - - - - - 登录错误锁定时长 - - - - - 登录错误锁定时长 - - - - - 登录错误次数 - - - - - 默认用户密码 - - - - - 密码定期提醒更新 - - - - - 密码定期提醒更新时间 - - - - - 修改初始密码提醒 - - - - - 密码最小长度 - - - - - 包含数字 - - - - - 包含小写字母 - - - - - 包含大写字母 - - - - - 包含特殊字符 - - - - - mqtt连接地址 - - - - - mqtt连接用户名 - - - - - mqtt连接密码 - - - - - windows系统本地目录 - - - - - Unix系统本地目录 - - - - - MINIO文件AccessKey - - - - - MINIO文件SecetKey - - - - - MINIO文件EndPoint - - - - - MINIO文件默认存储桶 - - - - - 字典常量 - - - - - 性别 - - - - - 名族 - - - - - 用户证件类型 - - - - - 通用文化程度 - - - - - 启用 - - - - - 停用 - - - - - 在线 - - - - - 离线 - - - - - 本地 - - - - - MINIO - - - - - 系统 - - - - - 业务 - - - - - 日志常量 - - - - - 成功 - - - - - 成功 - - 数据库上下文对象 - + 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 - + SqlSugar 数据库实例 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs index a433e85..c5eacfc 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs @@ -29,9 +29,9 @@ public class Startup : AppStartup public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //遍历配置 - DbContext.DbConfigs.ForEach(it => + DbContext.DB_CONFIGS.ForEach(it => { - var connection = DbContext.Db.GetConnection(it.ConfigId);//获取数据库连接对象 + var connection = DbContext.DB.GetConnection(it.ConfigId);//获取数据库连接对象 connection.DbMaintenance.CreateDatabase();//创建数据库,如果存在则不创建 }); } @@ -42,10 +42,10 @@ public class Startup : AppStartup /// private static void CheckSameConfigId() { - var configIdGroup = DbContext.DbConfigs.GroupBy(it => it.ConfigId).ToList(); + var configIdGroup = DbContext.DB_CONFIGS.GroupBy(it => it.ConfigId).ToList(); foreach (var configId in configIdGroup) { if (configId.ToList().Count > 1) throw Oops.Oh($"Sqlsugar连接配置ConfigId:{configId.Key}重复了"); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs index 3ce2c36..88d9bc2 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs @@ -48,7 +48,7 @@ public static class CodeFirstUtils var ignoreInit = entityType.GetCustomAttribute();//获取忽略初始化特性 if (ignoreInit != null) continue;//如果有忽略初始化特性 if (tenantAtt == null) continue;//如果没有租户特性就下一个 - var db = DbContext.Db.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 + var db = DbContext.DB.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 var splitTable = entityType.GetCustomAttribute();//获取自动分表特性 if (splitTable == null)//如果特性是空 db.CodeFirst.InitTables(entityType);//普通创建 @@ -79,8 +79,8 @@ public static class CodeFirstUtils var entityType = seedType.GetInterfaces().First().GetGenericArguments().First();//获取实体类型 var tenantAtt = entityType.GetCustomAttribute();//获取sqlsugar租户特性 if (tenantAtt == null) continue;//如果没有租户特性就下一个 - var db = DbContext.Db.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 - var config = DbContext.DbConfigs.FirstOrDefault(u => u.ConfigId == tenantAtt.configId.ToString());//获取数据库配置 + var db = DbContext.DB.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 + var config = DbContext.DB_CONFIGS.FirstOrDefault(u => u.ConfigId == tenantAtt.configId.ToString());//获取数据库配置 // var seedDataTable = seedData.ToList().ToDataTable();//获取种子数据:已弃用 var entityInfo = db.EntityMaintenance.GetEntityInfo(entityType); // seedDataTable.TableName = db.EntityMaintenance.GetEntityInfo(entityType).DbTableName;//获取表名 @@ -190,4 +190,4 @@ public static class CodeFirstUtils var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsJson == true); return sc != null; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs index 22233a1..de451f7 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs @@ -33,7 +33,7 @@ public static class SqlSugarUtils var configId = teanant.configId.ToString();//获取租户Id if (teanant != null) { - var connection = DbContext.Db.GetConnection(teanant.configId.ToString());//根据租户ID获取连接信息 + var connection = DbContext.DB.GetConnection(teanant.configId.ToString());//根据租户ID获取连接信息 var entityInfo = connection.EntityMaintenance.GetEntityInfo(entityType);//获取实体信息 if (entityInfo != null) { @@ -61,7 +61,7 @@ public static class SqlSugarUtils public static List GetTableColumns(string configId, string tableName) { var columns = new List();//结果集 - var connection = DbContext.Db.GetConnection(configId); + var connection = DbContext.DB.GetConnection(configId); var dbColumnInfos = connection.DbMaintenance.GetColumnInfosByTableName(tableName);//根据表名获取表信息 if (dbColumnInfos != null) { @@ -204,4 +204,4 @@ public static class SqlSugarUtils }; return columnList.Contains(columnName); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/CateGoryConst.cs similarity index 68% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/CateGoryConst.cs index 655babc..eac5b4c 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/CateGoryConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/CateGoryConst.cs @@ -6,7 +6,7 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.SqlSugar; +namespace SimpleAdmin.System; /// /// 分类常量 @@ -18,32 +18,32 @@ public class CateGoryConst /// /// 系统基础 /// - public const string Config_SYS_BASE = "SYS_BASE"; + public const string CONFIG_SYS_BASE = "SYS_BASE"; /// /// 登录策略 /// - public const string Config_LOGIN_POLICY = "LOGIN_POLICY"; + public const string CONFIG_LOGIN_POLICY = "LOGIN_POLICY"; /// /// 密码策略 /// - public const string Config_PWD_POLICY = "PWD_POLICY"; + public const string CONFIG_PWD_POLICY = "PWD_POLICY"; /// /// 业务定义 /// - public const string Config_BIZ_DEFINE = "BIZ_DEFINE"; + public const string CONFIG_BIZ_DEFINE = "BIZ_DEFINE"; /// /// 文件-本地 /// - public const string Config_FILE_LOCAL = "FILE_LOCAL"; + public const string CONFIG_FILE_LOCAL = "FILE_LOCAL"; /// /// 文件-MINIO /// - public const string Config_FILE_MINIO = "FILE_MINIO"; + public const string CONFIG_FILE_MINIO = "FILE_MINIO"; #endregion 系统配置 @@ -52,7 +52,7 @@ public class CateGoryConst /// /// MQTT配置 /// - public const string Config_MQTT_BASE = "MQTT_BASE"; + public const string CONFIG_MQTT_BASE = "MQTT_BASE"; #endregion Mqtt配置 @@ -61,47 +61,47 @@ public class CateGoryConst /// /// 用户有哪些角色 /// - public const string Relation_SYS_USER_HAS_ROLE = "SYS_USER_HAS_ROLE"; + public const string RELATION_SYS_USER_HAS_ROLE = "SYS_USER_HAS_ROLE"; /// /// 角色有哪些资源 /// - public const string Relation_SYS_ROLE_HAS_RESOURCE = "SYS_ROLE_HAS_RESOURCE"; + public const string RELATION_SYS_ROLE_HAS_RESOURCE = "SYS_ROLE_HAS_RESOURCE"; /// /// 角色有哪些模块 /// - public const string Relation_SYS_ROLE_HAS_MODULE = "SYS_ROLE_HAS_MODULE"; + public const string RELATION_SYS_ROLE_HAS_MODULE = "SYS_ROLE_HAS_MODULE"; /// ///用户有哪些资源 /// - public const string Relation_SYS_USER_HAS_RESOURCE = "SYS_USER_HAS_RESOURCE"; + public const string RELATION_SYS_USER_HAS_RESOURCE = "SYS_USER_HAS_RESOURCE"; /// /// 角色有哪些权限 /// - public const string Relation_SYS_ROLE_HAS_PERMISSION = "SYS_ROLE_HAS_PERMISSION"; + public const string RELATION_SYS_ROLE_HAS_PERMISSION = "SYS_ROLE_HAS_PERMISSION"; /// /// 角色有哪些权限 /// - public const string Relation_SYS_USER_HAS_PERMISSION = "SYS_USER_HAS_PERMISSION"; + public const string RELATION_SYS_USER_HAS_PERMISSION = "SYS_USER_HAS_PERMISSION"; /// /// 用户工作台数据 /// - public const string Relation_SYS_USER_WORKBENCH_DATA = "SYS_USER_WORKBENCH_DATA"; + public const string RELATION_SYS_USER_WORKBENCH_DATA = "SYS_USER_WORKBENCH_DATA"; /// /// 用户日程数据 /// - public const string Relation_SYS_USER_SCHEDULE_DATA = "SYS_USER_SCHEDULE_DATA"; + public const string RELATION_SYS_USER_SCHEDULE_DATA = "SYS_USER_SCHEDULE_DATA"; /// /// 站内信与接收用户 /// - public const string Relation_MSG_TO_USER = "MSG_TO_USER"; + public const string RELATION_MSG_TO_USER = "MSG_TO_USER"; #endregion 关系表 @@ -139,22 +139,22 @@ public class CateGoryConst /// /// 模块 /// - public const string Resource_MODULE = "MODULE"; + public const string RESOURCE_MODULE = "MODULE"; /// /// 菜单 /// - public const string Resource_MENU = "MENU"; + public const string RESOURCE_MENU = "MENU"; /// /// 单页 /// - public const string Resource_SPA = "SPA"; + public const string RESOURCE_SPA = "SPA"; /// /// 按钮 /// - public const string Resource_BUTTON = "BUTTON"; + public const string RESOURCE_BUTTON = "BUTTON"; #endregion 资源表 @@ -163,22 +163,22 @@ public class CateGoryConst /// /// 登录 /// - public const string Log_LOGIN = "LOGIN"; + public const string LOG_LOGIN = "LOGIN"; /// /// 登出 /// - public const string Log_LOGOUT = "LOGOUT"; + public const string LOG_LOGOUT = "LOGOUT"; /// /// 操作 /// - public const string Log_OPERATE = "OPERATE"; + public const string LOG_OPERATE = "OPERATE"; /// /// 异常 /// - public const string Log_EXCEPTION = "EXCEPTION"; + public const string LOG_EXCEPTION = "EXCEPTION"; #endregion 日志表 @@ -187,12 +187,12 @@ public class CateGoryConst /// /// 框架 /// - public const string Dict_FRM = "FRM"; + public const string DICT_FRM = "FRM"; /// /// 业务 /// - public const string Dict_BIZ = "BIZ"; + public const string DICT_BIZ = "BIZ"; #endregion 字典表 @@ -201,12 +201,12 @@ public class CateGoryConst /// /// 部门 /// - public const string Org_DEPT = "DEPT"; + public const string ORG_DEPT = "DEPT"; /// /// 公司 /// - public const string Org_COMPANY = "COMPANY"; + public const string ORG_COMPANY = "COMPANY"; #endregion 组织表 @@ -215,17 +215,17 @@ public class CateGoryConst /// /// 高层 /// - public const string Position_HIGH = "HIGH"; + public const string POSITION_HIGH = "HIGH"; /// /// 中层 /// - public const string Position_MIDDLE = "MIDDLE"; + public const string POSITION_MIDDLE = "MIDDLE"; /// /// 基层 /// - public const string Position_LOW = "LOW"; + public const string POSITION_LOW = "LOW"; #endregion 职位表 @@ -234,12 +234,12 @@ public class CateGoryConst /// /// 全局 /// - public const string Role_GLOBAL = "GLOBAL"; + public const string ROLE_GLOBAL = "GLOBAL"; /// /// 机构 /// - public const string Role_ORG = "ORG"; + public const string ROLE_ORG = "ORG"; #endregion 角色表 @@ -248,12 +248,12 @@ public class CateGoryConst /// /// 通知 /// - public const string Message_INFORM = "INFORM"; + public const string MESSAGE_INFORM = "INFORM"; /// /// 公告 /// - public const string Message_NOTICE = "NOTICE"; + public const string MESSAGE_NOTICE = "NOTICE"; #endregion 站内信表 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysConfigConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs similarity index 99% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysConfigConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs index 256da53..5ba5813 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysConfigConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs @@ -6,7 +6,7 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.SqlSugar; +namespace SimpleAdmin.System; /// /// 系统配置常量 @@ -153,4 +153,4 @@ public class SysConfigConst public const string FILE_MINIO_DEFAULT_BUCKET_NAME = "FILE_MINIO_DEFAULT_BUCKET_NAME"; #endregion 存储引擎 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysDictConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs similarity index 98% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysDictConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs index e210f6d..932a76b 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysDictConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs @@ -6,7 +6,7 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.SqlSugar; +namespace SimpleAdmin.System; /// /// 字典常量 @@ -92,4 +92,4 @@ public class SysDictConst #endregion 系统字典分类 #endregion 系统字典 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysLogConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysLogConst.cs similarity index 96% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysLogConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/SysLogConst.cs index d2924a4..3903672 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SysLogConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysLogConst.cs @@ -6,7 +6,7 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.SqlSugar; +namespace SimpleAdmin.System; /// /// 日志常量 @@ -22,4 +22,4 @@ public class SysLogConst /// 成功 /// public const string FAIL = "FAIL"; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs similarity index 93% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs index b1bb3cb..558d5fa 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/ResourceConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs @@ -6,12 +6,12 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.SqlSugar; +namespace SimpleAdmin.System; /// /// 资源表常量 /// -public class ResourceConst +public class SysResourceConst { /// /// 目录 @@ -46,5 +46,5 @@ public class ResourceConst /// /// 系统内置单页面编码 /// - public const string System = "system"; -} \ No newline at end of file + public const string SYSTEM = "system"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysRoleConst.cs similarity index 85% rename from api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs rename to api/SimpleAdmin/SimpleAdmin.System/Const/SysRoleConst.cs index 0e51e36..da743de 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/RoleConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysRoleConst.cs @@ -6,20 +6,20 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.SqlSugar; +namespace SimpleAdmin.System; /// /// 角色常量 /// -public class RoleConst +public class SysRoleConst { /// /// 超级管理员 /// - public const string SuperAdmin = "superAdmin"; + public const string SUPER_ADMIN = "superAdmin"; /// /// 业务管理员 /// - public const string BizAdmin = "bizAdmin"; -} \ No newline at end of file + public const string BIZ_ADMIN = "bizAdmin"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs index 5dd432a..274db01 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs @@ -16,57 +16,57 @@ public class SystemConst /// /// 系统配置表缓存Key /// - public const string Cache_DevConfig = CacheConst.Cache_Prefix_Web + "SysConfig:"; + public const string CACHE_DEV_CONFIG = CacheConst.CACHE_PREFIX_WEB + "SysConfig:"; /// /// 登录验证码缓存Key /// - public const string Cache_Captcha = CacheConst.Cache_Prefix_Web + "Captcha:"; + public const string CACHE_CAPTCHA = CacheConst.CACHE_PREFIX_WEB + "Captcha:"; /// /// 用户表缓存Key /// - public const string Cache_SysUser = CacheConst.Cache_Prefix_Web + "SysUser"; + public const string CACHE_SYS_USER = CacheConst.CACHE_PREFIX_WEB + "SysUser"; /// /// 用户手机号关系缓存Key /// - public const string Cache_SysUserPhone = CacheConst.Cache_Prefix_Web + "SysUserPhone"; + public const string CACHE_SYS_USER_PHONE = CacheConst.CACHE_PREFIX_WEB + "SysUserPhone"; /// /// 用户手机号关系缓存Key /// - public const string Cache_SysUserAccount = CacheConst.Cache_Prefix_Web + "SysUserAccount"; + public const string CACHE_SYS_USER_ACCOUNT = CacheConst.CACHE_PREFIX_WEB + "SysUserAccount"; /// /// 资源表缓存Key /// - public const string Cache_SysResource = CacheConst.Cache_Prefix_Web + "SysResource:"; + public const string CACHE_SYS_RESOURCE = CacheConst.CACHE_PREFIX_WEB + "SysResource:"; /// /// 字典表缓存Key /// - public const string Cache_DevDict = CacheConst.Cache_Prefix_Web + "SysDict"; + public const string CACHE_DEV_DICT = CacheConst.CACHE_PREFIX_WEB + "SysDict"; /// /// 关系表缓存Key /// - public const string Cache_SysRelation = CacheConst.Cache_Prefix_Web + "SysRelation:"; + public const string CACHE_SYS_RELATION = CacheConst.CACHE_PREFIX_WEB + "SysRelation:"; /// /// 机构表缓存Key /// - public const string Cache_SysOrg = CacheConst.Cache_Prefix_Web + "SysOrg"; + public const string CACHE_SYS_ORG = CacheConst.CACHE_PREFIX_WEB + "SysOrg"; /// /// 角色表缓存Key /// - public const string Cache_SysRole = CacheConst.Cache_Prefix_Web + "SysRole"; + public const string CACHE_SYS_ROLE = CacheConst.CACHE_PREFIX_WEB + "SysRole"; /// /// 职位表缓存Key /// - public const string Cache_SysPosition = CacheConst.Cache_Prefix_Web + "SysPosition"; + public const string CACHE_SYS_POSITION = CacheConst.CACHE_PREFIX_WEB + "SysPosition"; #region 登录错误次数 @@ -74,7 +74,7 @@ public class SystemConst /// /// 登录错误次数缓存Key /// - public const string Cache_LoginErrorCount = CacheConst.Cache_Prefix_Web + "LoginErrorCount:"; + public const string CACHE_LOGIN_ERROR_COUNT = CacheConst.CACHE_PREFIX_WEB + "LoginErrorCount:"; #endregion 登录错误次数 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs index 85a4de4..cdfee2c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs @@ -12,37 +12,42 @@ namespace SimpleAdmin.System; /// 批量修改 /// [SugarTable("batch_edit", TableDescription = "批量修改")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] [CodeGen] public class BatchEdit : PrimaryKeyEntity { /// /// 唯一编码 /// - [SugarColumn(ColumnName = "Code", ColumnDescription = "唯一编码", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "Code", ColumnDescription = "唯一编码", Length = 100, + IsNullable = false)] public string Code { get; set; } /// /// 所属库 /// - [SugarColumn(ColumnName = "ConfigId", ColumnDescription = "所属库", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "ConfigId", ColumnDescription = "所属库", Length = 100, + IsNullable = false)] public string ConfigId { get; set; } /// /// 实体名 /// - [SugarColumn(ColumnName = "EntityName", ColumnDescription = "实体名", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "EntityName", ColumnDescription = "实体名", Length = 100, + IsNullable = false)] public string EntityName { get; set; } /// /// 表名 /// - [SugarColumn(ColumnName = "TableName", ColumnDescription = "表名", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "TableName", ColumnDescription = "表名", Length = 100, + IsNullable = false)] public string TableName { get; set; } /// /// 表描述 /// - [SugarColumn(ColumnName = "TableDescription", ColumnDescription = "表描述", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "TableDescription", ColumnDescription = "表描述", Length = 100, + IsNullable = false)] public string TableDescription { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs index c1b4076..24c7f2a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 批量修改配置表 /// [SugarTable("batch_edit_config", TableDescription = "批量修改配置表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class BatchEditConfig : PrimaryKeyEntity { /// @@ -24,60 +24,70 @@ public class BatchEditConfig : PrimaryKeyEntity /// /// 字段名 /// - [SugarColumn(ColumnName = "ColumnName", ColumnDescription = "字段名", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "ColumnName", ColumnDescription = "字段名", Length = 100, + IsNullable = false)] public string ColumnName { get; set; } /// /// 字段描述 /// - [SugarColumn(ColumnName = "ColumnComment", ColumnDescription = "字段描述", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "ColumnComment", ColumnDescription = "字段描述", Length = 100, + IsNullable = false)] public string ColumnComment { get; set; } /// /// 作用类型 /// - [SugarColumn(ColumnName = "DataType", ColumnDescription = "作用类型", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "DataType", ColumnDescription = "作用类型", Length = 100, + IsNullable = false)] public string DataType { get; set; } /// /// 字典值 /// - [SugarColumn(ColumnName = "DictTypeCode", ColumnDescription = "字典值", Length = 100, IsNullable = true)] + [SugarColumn(ColumnName = "DictTypeCode", ColumnDescription = "字典值", Length = 100, + IsNullable = true)] public string DictTypeCode { get; set; } /// /// 数据库类型 /// - [SugarColumn(ColumnName = "NetType", ColumnDescription = "数据库类型", Length = 100, IsNullable = true)] + [SugarColumn(ColumnName = "NetType", ColumnDescription = "数据库类型", Length = 100, + IsNullable = true)] public string NetType { get; set; } /// /// 接口名称 /// - [SugarColumn(ColumnName = "RequestUrl", ColumnDescription = "接口名称", Length = 100, IsNullable = true)] + [SugarColumn(ColumnName = "RequestUrl", ColumnDescription = "接口名称", Length = 100, + IsNullable = true)] public string RequestUrl { get; set; } /// /// 接口类型 /// - [SugarColumn(ColumnName = "RequestType", ColumnDescription = "接口类型", Length = 100, IsNullable = true)] + [SugarColumn(ColumnName = "RequestType", ColumnDescription = "接口类型", Length = 100, + IsNullable = true)] public string RequestType { get; set; } /// /// 接口结果标签 /// - [SugarColumn(ColumnName = "RequestLabel", ColumnDescription = "接口结果标签", Length = 100, IsNullable = true)] + [SugarColumn(ColumnName = "RequestLabel", ColumnDescription = "接口结果标签", Length = 100, + IsNullable = true)] public string RequestLabel { get; set; } /// /// 接口结果值 /// - [SugarColumn(ColumnName = "RequestValue", ColumnDescription = "接口结果值", Length = 100, IsNullable = true)] + [SugarColumn(ColumnName = "RequestValue", ColumnDescription = "接口结果值", Length = 100, + IsNullable = true)] public string RequestValue { get; set; } /// /// 启用状态 /// - [SugarColumn(ColumnName = "Status", ColumnDescription = "状态", Length = 100, IsNullable = false)] + [SugarColumn(ColumnName = "Status", ColumnDescription = "状态", Length = 100, + IsNullable = false)] public string Status { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs index 8928136..03dd4ad 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.Core.Entity.System; /// C端用户关系 /// [SugarTable("client_relation", TableDescription = "关系")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class ClientRelation : PrimaryKeyEntity { /// @@ -30,6 +30,7 @@ public class ClientRelation : PrimaryKeyEntity /// /// 分类 /// - [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200, + IsNullable = true)] public string Category { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs index 214d233..7fce3ac 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs @@ -12,73 +12,84 @@ namespace SimpleAdmin.System; /// C端用户 /// [SugarTable("client_user", TableDescription = "C端用户")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class ClientUser : DataEntityBase { /// /// 头像 /// - [SugarColumn(ColumnName = "Avatar", ColumnDescription = "头像", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "Avatar", ColumnDescription = "头像", ColumnDataType = StaticConfig.CodeFirst_BigString, + IsNullable = true)] public string Avatar { get; set; } /// /// 签名 /// - [SugarColumn(ColumnName = "Signature", ColumnDescription = "签名", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "Signature", ColumnDescription = "签名", ColumnDataType = StaticConfig.CodeFirst_BigString, + IsNullable = true)] public string Signature { get; set; } /// /// 账号 /// - [SugarColumn(ColumnName = "Account", ColumnDescription = "账号", Length = 200, IsNullable = false)] + [SugarColumn(ColumnName = "Account", ColumnDescription = "账号", Length = 200, + IsNullable = false)] public string Account { get; set; } /// /// 密码 /// - [SugarColumn(ColumnName = "Password", ColumnDescription = "密码", Length = 200, IsNullable = false)] + [SugarColumn(ColumnName = "Password", ColumnDescription = "密码", Length = 200, + IsNullable = false)] public string Password { get; set; } /// /// 姓名 /// - [SugarColumn(ColumnName = "Name", ColumnDescription = "姓名", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Name", ColumnDescription = "姓名", Length = 200, + IsNullable = true)] public string Name { get; set; } /// /// 昵称 /// - [SugarColumn(ColumnName = "Nickname", ColumnDescription = "昵称", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Nickname", ColumnDescription = "昵称", Length = 200, + IsNullable = true)] public string Nickname { get; set; } /// /// 性别 /// - [SugarColumn(ColumnName = "Gender", ColumnDescription = "性别", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Gender", ColumnDescription = "性别", Length = 200, + IsNullable = true)] public string Gender { get; set; } /// /// 年龄 /// - [SugarColumn(ColumnName = "Age", ColumnDescription = "年龄", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Age", ColumnDescription = "年龄", Length = 200, + IsNullable = true)] public string Age { get; set; } /// /// 出生日期 /// - [SugarColumn(ColumnName = "Birthday", ColumnDescription = "出生日期", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Birthday", ColumnDescription = "出生日期", Length = 200, + IsNullable = true)] public string Birthday { get; set; } /// /// 民族 /// - [SugarColumn(ColumnName = "Nation", ColumnDescription = "民族", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Nation", ColumnDescription = "民族", Length = 200, + IsNullable = true)] public string Nation { get; set; } /// /// 籍贯 /// - [SugarColumn(ColumnName = "NativePlace", ColumnDescription = "籍贯", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "NativePlace", ColumnDescription = "籍贯", Length = 200, + IsNullable = true)] public string NativePlace { get; set; } /// @@ -96,85 +107,99 @@ public class ClientUser : DataEntityBase /// /// 证件类型 /// - [SugarColumn(ColumnName = "IdCardType", ColumnDescription = "证件类型", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "IdCardType", ColumnDescription = "证件类型", Length = 200, + IsNullable = true)] public string IdCardType { get; set; } /// /// 证件号码 /// - [SugarColumn(ColumnName = "IdCardNumber", ColumnDescription = "证件号码", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "IdCardNumber", ColumnDescription = "证件号码", Length = 200, + IsNullable = true)] public string IdCardNumber { get; set; } /// /// 文化程度 /// - [SugarColumn(ColumnName = "CultureLevel", ColumnDescription = "文化程度", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "CultureLevel", ColumnDescription = "文化程度", Length = 200, + IsNullable = true)] public string CultureLevel { get; set; } /// /// 政治面貌 /// - [SugarColumn(ColumnName = "PoliticalOutlook", ColumnDescription = "政治面貌", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "PoliticalOutlook", ColumnDescription = "政治面貌", Length = 200, + IsNullable = true)] public string PoliticalOutlook { get; set; } /// /// 毕业院校 /// - [SugarColumn(ColumnName = "College", ColumnDescription = "毕业院校", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "College", ColumnDescription = "毕业院校", Length = 200, + IsNullable = true)] public string College { get; set; } /// /// 学历 /// - [SugarColumn(ColumnName = "Education", ColumnDescription = "学历", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Education", ColumnDescription = "学历", Length = 200, + IsNullable = true)] public string Education { get; set; } /// /// 学制 /// - [SugarColumn(ColumnName = "EduLength", ColumnDescription = "学制", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EduLength", ColumnDescription = "学制", Length = 200, + IsNullable = true)] public string EduLength { get; set; } /// /// 学位 /// - [SugarColumn(ColumnName = "Degree", ColumnDescription = "学位", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Degree", ColumnDescription = "学位", Length = 200, + IsNullable = true)] public string Degree { get; set; } /// /// 手机 /// - [SugarColumn(ColumnName = "Phone", ColumnDescription = "手机", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Phone", ColumnDescription = "手机", Length = 200, + IsNullable = true)] public string Phone { get; set; } /// /// 邮箱 /// - [SugarColumn(ColumnName = "Email", ColumnDescription = "邮箱", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Email", ColumnDescription = "邮箱", Length = 200, + IsNullable = true)] public string Email { get; set; } /// /// 家庭电话 /// - [SugarColumn(ColumnName = "HomeTel", ColumnDescription = "家庭电话", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "HomeTel", ColumnDescription = "家庭电话", Length = 200, + IsNullable = true)] public string HomeTel { get; set; } /// /// 办公电话 /// - [SugarColumn(ColumnName = "OfficeTel", ColumnDescription = "办公电话", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "OfficeTel", ColumnDescription = "办公电话", Length = 200, + IsNullable = true)] public string OfficeTel { get; set; } /// /// 紧急联系人 /// - [SugarColumn(ColumnName = "EmergencyContact", ColumnDescription = "紧急联系人", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EmergencyContact", ColumnDescription = "紧急联系人", Length = 200, + IsNullable = true)] public string EmergencyContact { get; set; } /// /// 紧急联系人电话 /// - [SugarColumn(ColumnName = "EmergencyPhone", ColumnDescription = "紧急联系人电话", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EmergencyPhone", ColumnDescription = "紧急联系人电话", Length = 200, + IsNullable = true)] public string EmergencyPhone { get; set; } /// @@ -186,13 +211,15 @@ public class ClientUser : DataEntityBase /// /// 员工编号 /// - [SugarColumn(ColumnName = "EmpNo", ColumnDescription = "员工编号", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EmpNo", ColumnDescription = "员工编号", Length = 200, + IsNullable = true)] public string EmpNo { get; set; } /// /// 入职日期 /// - [SugarColumn(ColumnName = "EntryDate", ColumnDescription = "入职日期", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EntryDate", ColumnDescription = "入职日期", Length = 200, + IsNullable = true)] public string EntryDate { get; set; } /// @@ -210,7 +237,8 @@ public class ClientUser : DataEntityBase /// /// 职级 /// - [SugarColumn(ColumnName = "PositionLevel", ColumnDescription = "职级", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "PositionLevel", ColumnDescription = "职级", Length = 200, + IsNullable = true)] public string PositionLevel { get; set; } /// @@ -222,19 +250,22 @@ public class ClientUser : DataEntityBase /// /// 兼任信息 /// - [SugarColumn(ColumnName = "PositionJson", ColumnDescription = "兼任信息", Length = 100, IsNullable = true)] + [SugarColumn(ColumnName = "PositionJson", ColumnDescription = "兼任信息", Length = 100, + IsNullable = true)] public string PositionJson { get; set; } /// /// 上次登录ip /// - [SugarColumn(ColumnName = "LastLoginIp", ColumnDescription = "上次登录ip", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "LastLoginIp", ColumnDescription = "上次登录ip", Length = 200, + IsNullable = true)] public string LastLoginIp { get; set; } /// /// 上次登录地点 /// - [SugarColumn(ColumnName = "LastLoginAddress", ColumnDescription = "上次登录地点", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "LastLoginAddress", ColumnDescription = "上次登录地点", Length = 200, + IsNullable = true)] public string LastLoginAddress { get; set; } /// @@ -252,13 +283,15 @@ public class ClientUser : DataEntityBase /// /// 最新登录ip /// - [SugarColumn(ColumnName = "LatestLoginIp", ColumnDescription = "最新登录ip", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "LatestLoginIp", ColumnDescription = "最新登录ip", Length = 200, + IsNullable = true)] public string LatestLoginIp { get; set; } /// /// 最新登录地点 /// - [SugarColumn(ColumnName = "LatestLoginAddress", ColumnDescription = "最新登录地点", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "LatestLoginAddress", ColumnDescription = "最新登录地点", Length = 200, + IsNullable = true)] public string LatestLoginAddress { get; set; } /// @@ -276,7 +309,8 @@ public class ClientUser : DataEntityBase /// /// 用户状态 /// - [SugarColumn(ColumnName = "UserStatus", ColumnDescription = "用户状态", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "UserStatus", ColumnDescription = "用户状态", Length = 200, + IsNullable = true)] public string UserStatus { get; set; } /// @@ -284,4 +318,4 @@ public class ClientUser : DataEntityBase /// [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs index 5f6514c..e76ddb0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 配置 /// [SugarTable("sys_config", TableDescription = "配置")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysConfig : BaseEntity { /// @@ -45,4 +45,4 @@ public class SysConfig : BaseEntity /// [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int SortCode { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs index 2940d8e..fa4c77f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 字典 /// [SugarTable("sys_dict", TableDescription = "字典表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysDict : BaseEntity { /// @@ -56,4 +56,4 @@ public class SysDict : BaseEntity /// [SugarColumn(IsIgnore = true)] public List Children { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs index c75351b..825cf5e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 文件表 /// [SugarTable("sys_file", TableDescription = "文件表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysFile : DataEntityBase { /// @@ -75,4 +75,4 @@ public class SysFile : DataEntityBase [SugarColumn(ColumnName = "Thumbnail", ColumnDescription = "图片缩略图", IsNullable = true, ColumnDataType = StaticConfig.CodeFirst_BigString)] public string Thumbnail { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs index a5fa92c..ffcd89d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 操作日志表 /// [SugarTable("sys_log_operate", TableDescription = "操作日志表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysLogOperate : SysLogVisit { /// @@ -61,4 +61,4 @@ public class SysLogOperate : SysLogVisit [SugarColumn(ColumnName = "ResultJson", ColumnDescription = "返回结果", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] public string ResultJson { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs index 486804c..19ddadf 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 访问日志表 /// [SugarTable("sys_log_visit", TableDescription = "访问日志表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysLogVisit : BaseEntity { /// @@ -73,7 +73,6 @@ public class SysLogVisit : BaseEntity /// /// 操作人姓名 /// - [SugarColumn(ColumnName = "OpAccount", ColumnDescription = "操作人账号", Length = 200, - IsNullable = true)] + [SugarColumn(ColumnName = "OpAccount", ColumnDescription = "操作人账号", Length = 200, IsNullable = true)] public string OpAccount { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs index 454f7f0..2d45208 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 站内信 /// [SugarTable("sys_message", TableDescription = "站内信")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysMessage : BaseEntity { /// @@ -30,7 +30,8 @@ public class SysMessage : BaseEntity /// /// 正文 /// - [SugarColumn(ColumnName = "Content", ColumnDescription = "正文", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "Content", ColumnDescription = "正文", ColumnDataType = StaticConfig.CodeFirst_BigString, + IsNullable = true)] public virtual string Content { get; set; } /// @@ -38,4 +39,4 @@ public class SysMessage : BaseEntity /// [SugarColumn(IsIgnore = true)] public bool Read { get; set; } = true; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs index 35e8b9f..78873a3 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 用户消息表 /// [SugarTable("sys_message_user", TableDescription = "用户消息表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysMessageUser : BaseEntity { /// @@ -32,4 +32,4 @@ public class SysMessageUser : BaseEntity /// [SugarColumn(ColumnName = "Read", ColumnDescription = "已读未读", IsNullable = false)] public bool Read { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs index 32e1263..dfe47eb 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 组织 /// [SugarTable("sys_org", TableDescription = "组织")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] [CodeGen] public class SysOrg : BaseEntity { @@ -69,4 +69,4 @@ public class SysOrg : BaseEntity /// [SugarColumn(IsIgnore = true)] public bool? IsLeaf { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs index f9bc15d..7d0e247 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 职位表 /// [SugarTable("sys_position", TableDescription = "职位表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] [CodeGen] public class SysPosition : DataEntityBase { @@ -45,4 +45,4 @@ public class SysPosition : DataEntityBase /// [SugarColumn(ColumnName = "SortCode", ColumnDescription = "排序码", IsNullable = true)] public int? SortCode { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs index e4719aa..d234573 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 系统关系表 /// [SugarTable("sys_relation", TableDescription = "系统关系表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysRelation : PrimaryKeyEntity { /// @@ -30,6 +30,7 @@ public class SysRelation : PrimaryKeyEntity /// /// 分类 /// - [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200, IsNullable = false)] + [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200, + IsNullable = false)] public string Category { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs index f428bbb..a2cf7bf 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 资源 /// [SugarTable("sys_resource", TableDescription = "资源")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysResource : BaseEntity { /// @@ -66,7 +66,8 @@ public class SysResource : BaseEntity /// /// 菜单类型 /// - [SugarColumn(ColumnName = "MenuType", ColumnDescription = "菜单类型", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "MenuType", ColumnDescription = "菜单类型", Length = 200, + IsNullable = true)] public virtual string MenuType { get; set; } /// @@ -78,7 +79,8 @@ public class SysResource : BaseEntity /// /// 组件 /// - [SugarColumn(ColumnName = "Component", ColumnDescription = "组件", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Component", ColumnDescription = "组件", Length = 200, + IsNullable = true)] public string Component { get; set; } /// @@ -191,4 +193,4 @@ public class Meta /// 菜单是否固定在标签页中 (首页通常是固定项) /// public bool IsKeepAlive { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs index b1bfce8..0d5bd0a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 角色 /// [SugarTable("sys_role", TableDescription = "角色")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] public class SysRole : DataEntityBase { /// @@ -24,25 +24,29 @@ public class SysRole : DataEntityBase /// /// 名称 /// - [SugarColumn(ColumnName = "Name", ColumnDescription = "名称", Length = 200, IsNullable = false)] + [SugarColumn(ColumnName = "Name", ColumnDescription = "名称", Length = 200, + IsNullable = false)] public virtual string Name { get; set; } /// /// 编码 /// - [SugarColumn(ColumnName = "Code", ColumnDescription = "编码", Length = 200, IsNullable = false)] + [SugarColumn(ColumnName = "Code", ColumnDescription = "编码", Length = 200, + IsNullable = false)] public string Code { get; set; } /// /// 分类 /// - [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200, IsNullable = false)] + [SugarColumn(ColumnName = "Category", ColumnDescription = "分类", Length = 200, + IsNullable = false)] public virtual string Category { get; set; } /// /// 默认数据范围 /// - [SugarColumn(ColumnName = "DefaultDataScope", ColumnDescription = "默认数据范围", IsJson = true, ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = false)] + [SugarColumn(ColumnName = "DefaultDataScope", ColumnDescription = "默认数据范围", IsJson = true, + ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = false)] public virtual DefaultDataScope DefaultDataScope { get; set; } /// @@ -71,4 +75,4 @@ public class DefaultDataScope /// 自定义机构范围列表 /// public List ScopeDefineOrgIdList { get; set; } = new List(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs index dee0bb8..b6ec44e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 用户信息表 /// [SugarTable("sys_user", TableDescription = "用户信息表")] -[Tenant(SqlsugarConst.DB_Default)] +[Tenant(SqlsugarConst.DB_DEFAULT)] [BatchEdit] [CodeGen] public class SysUser : BaseEntity @@ -20,61 +20,71 @@ public class SysUser : BaseEntity /// /// 头像 /// - [SugarColumn(ColumnName = "Avatar", ColumnDescription = "头像", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "Avatar", ColumnDescription = "头像", ColumnDataType = StaticConfig.CodeFirst_BigString, + IsNullable = true)] public virtual string Avatar { get; set; } /// /// 签名 /// - [SugarColumn(ColumnName = "Signature", ColumnDescription = "签名", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "Signature", ColumnDescription = "签名", ColumnDataType = StaticConfig.CodeFirst_BigString, + IsNullable = true)] public string Signature { get; set; } /// /// 账号 /// - [SugarColumn(ColumnName = "Account", ColumnDescription = "账号", Length = 200, IsNullable = false)] + [SugarColumn(ColumnName = "Account", ColumnDescription = "账号", Length = 200, + IsNullable = false)] public virtual string Account { get; set; } /// /// 密码 /// - [SugarColumn(ColumnName = "Password", ColumnDescription = "密码", Length = 200, IsNullable = false)] + [SugarColumn(ColumnName = "Password", ColumnDescription = "密码", Length = 200, + IsNullable = false)] public string Password { get; set; } /// /// 姓名 /// - [SugarColumn(ColumnName = "Name", ColumnDescription = "姓名", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Name", ColumnDescription = "姓名", Length = 200, + IsNullable = true)] public virtual string Name { get; set; } /// /// 昵称 /// - [SugarColumn(ColumnName = "Nickname", ColumnDescription = "昵称", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Nickname", ColumnDescription = "昵称", Length = 200, + IsNullable = true)] public string Nickname { get; set; } /// /// 性别 /// - [SugarColumn(ColumnName = "Gender", ColumnDescription = "性别", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Gender", ColumnDescription = "性别", Length = 200, + IsNullable = true)] public string Gender { get; set; } /// /// 出生日期 /// - [SugarColumn(ColumnName = "Birthday", ColumnDescription = "出生日期", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Birthday", ColumnDescription = "出生日期", Length = 200, + IsNullable = true)] public string Birthday { get; set; } /// /// 民族 /// - [SugarColumn(ColumnName = "Nation", ColumnDescription = "民族", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Nation", ColumnDescription = "民族", Length = 200, + IsNullable = true)] public string Nation { get; set; } /// /// 籍贯 /// - [SugarColumn(ColumnName = "NativePlace", ColumnDescription = "籍贯", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "NativePlace", ColumnDescription = "籍贯", Length = 200, + IsNullable = true)] public string NativePlace { get; set; } /// @@ -92,86 +102,100 @@ public class SysUser : BaseEntity /// /// 证件类型 /// - [SugarColumn(ColumnName = "IdCardType", ColumnDescription = "证件类型", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "IdCardType", ColumnDescription = "证件类型", Length = 200, + IsNullable = true)] public string IdCardType { get; set; } /// /// 证件号码 /// - [SugarColumn(ColumnName = "IdCardNumber", ColumnDescription = "证件号码", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "IdCardNumber", ColumnDescription = "证件号码", Length = 200, + IsNullable = true)] public string IdCardNumber { get; set; } /// /// 文化程度 /// - [SugarColumn(ColumnName = "CultureLevel", ColumnDescription = "文化程度", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "CultureLevel", ColumnDescription = "文化程度", Length = 200, + IsNullable = true)] public string CultureLevel { get; set; } /// /// 政治面貌 /// - [SugarColumn(ColumnName = "PoliticalOutlook", ColumnDescription = "政治面貌", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "PoliticalOutlook", ColumnDescription = "政治面貌", Length = 200, + IsNullable = true)] public string PoliticalOutlook { get; set; } /// /// 毕业院校 /// - [SugarColumn(ColumnName = "College", ColumnDescription = "毕业院校", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "College", ColumnDescription = "毕业院校", Length = 200, + IsNullable = true)] public string College { get; set; } /// /// 学历 /// - [SugarColumn(ColumnName = "Education", ColumnDescription = "学历", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Education", ColumnDescription = "学历", Length = 200, + IsNullable = true)] public string Education { get; set; } /// /// 学制 /// - [SugarColumn(ColumnName = "EduLength", ColumnDescription = "学制", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EduLength", ColumnDescription = "学制", Length = 200, + IsNullable = true)] public string EduLength { get; set; } /// /// 学位 /// - [SugarColumn(ColumnName = "Degree", ColumnDescription = "学位", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Degree", ColumnDescription = "学位", Length = 200, + IsNullable = true)] public string Degree { get; set; } /// /// 手机 /// 这里使用了SM4自动加密解密 /// - [SugarColumn(ColumnName = "Phone", ColumnDescription = "手机", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Phone", ColumnDescription = "手机", Length = 200, + IsNullable = true)] public string Phone { get; set; } /// /// 邮箱 /// - [SugarColumn(ColumnName = "Email", ColumnDescription = "邮箱", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "Email", ColumnDescription = "邮箱", Length = 200, + IsNullable = true)] public string Email { get; set; } /// /// 家庭电话 /// - [SugarColumn(ColumnName = "HomeTel", ColumnDescription = "家庭电话", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "HomeTel", ColumnDescription = "家庭电话", Length = 200, + IsNullable = true)] public string HomeTel { get; set; } /// /// 办公电话 /// - [SugarColumn(ColumnName = "OfficeTel", ColumnDescription = "办公电话", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "OfficeTel", ColumnDescription = "办公电话", Length = 200, + IsNullable = true)] public string OfficeTel { get; set; } /// /// 紧急联系人 /// - [SugarColumn(ColumnName = "EmergencyContact", ColumnDescription = "紧急联系人", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EmergencyContact", ColumnDescription = "紧急联系人", Length = 200, + IsNullable = true)] public string EmergencyContact { get; set; } /// /// 紧急联系人电话 /// - [SugarColumn(ColumnName = "EmergencyPhone", ColumnDescription = "紧急联系人电话", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EmergencyPhone", ColumnDescription = "紧急联系人电话", Length = 200, + IsNullable = true)] public string EmergencyPhone { get; set; } /// @@ -183,13 +207,15 @@ public class SysUser : BaseEntity /// /// 员工编号 /// - [SugarColumn(ColumnName = "EmpNo", ColumnDescription = "员工编号", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EmpNo", ColumnDescription = "员工编号", Length = 200, + IsNullable = true)] public string EmpNo { get; set; } /// /// 入职日期 /// - [SugarColumn(ColumnName = "EntryDate", ColumnDescription = "入职日期", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "EntryDate", ColumnDescription = "入职日期", Length = 200, + IsNullable = true)] public string EntryDate { get; set; } /// @@ -207,7 +233,8 @@ public class SysUser : BaseEntity /// /// 职级 /// - [SugarColumn(ColumnName = "PositionLevel", ColumnDescription = "职级", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "PositionLevel", ColumnDescription = "职级", Length = 200, + IsNullable = true)] public string PositionLevel { get; set; } /// @@ -219,7 +246,8 @@ public class SysUser : BaseEntity /// /// 兼任信息 /// - [SugarColumn(ColumnName = "PositionJson", ColumnDescription = "兼任信息", IsJson = true, ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] + [SugarColumn(ColumnName = "PositionJson", ColumnDescription = "兼任信息", IsJson = true, + ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)] public List PositionJson { get; set; } /// @@ -231,13 +259,15 @@ public class SysUser : BaseEntity /// /// 上次登录ip /// - [SugarColumn(ColumnName = "LastLoginIp", ColumnDescription = "上次登录ip", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "LastLoginIp", ColumnDescription = "上次登录ip", Length = 200, + IsNullable = true)] public string LastLoginIp { get; set; } /// /// 上次登录地点 /// - [SugarColumn(ColumnName = "LastLoginAddress", ColumnDescription = "上次登录地点", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "LastLoginAddress", ColumnDescription = "上次登录地点", Length = 200, + IsNullable = true)] public string LastLoginAddress { get; set; } /// @@ -255,13 +285,15 @@ public class SysUser : BaseEntity /// /// 最新登录ip /// - [SugarColumn(ColumnName = "LatestLoginIp", ColumnDescription = "最新登录ip", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "LatestLoginIp", ColumnDescription = "最新登录ip", Length = 200, + IsNullable = true)] public string LatestLoginIp { get; set; } /// /// 最新登录地点 /// - [SugarColumn(ColumnName = "LatestLoginAddress", ColumnDescription = "最新登录地点", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "LatestLoginAddress", ColumnDescription = "最新登录地点", Length = 200, + IsNullable = true)] public string LatestLoginAddress { get; set; } /// @@ -279,7 +311,8 @@ public class SysUser : BaseEntity /// /// 用户状态 /// - [SugarColumn(ColumnName = "UserStatus", ColumnDescription = "用户状态", Length = 200, IsNullable = true)] + [SugarColumn(ColumnName = "UserStatus", ColumnDescription = "用户状态", Length = 200, + IsNullable = true)] public string UserStatus { get; set; } /// @@ -401,4 +434,4 @@ public class PositionJson /// 主管ID /// public long? DirectorId { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs index 7153be6..e9b6d13 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs @@ -18,15 +18,15 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton { private readonly ISimpleCacheService _simpleCacheService; private readonly INamedServiceProvider _namedServiceProvider; - public IServiceProvider _services { get; } + public IServiceProvider Services { get; } private readonly SqlSugarScope _db; public AuthEventSubscriber(ISimpleCacheService simpleCacheService, IServiceProvider services, INamedServiceProvider namedServiceProvider) { - _db = DbContext.Db; + _db = DbContext.DB; _simpleCacheService = simpleCacheService; _namedServiceProvider = namedServiceProvider; - _services = services; + Services = services; } /// @@ -34,27 +34,27 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.LoginB)] + [EventSubscribe(EventSubscriberConst.LOGIN_B)] public async Task Login(EventHandlerExecutingContext context) { var loginEvent = (LoginEvent)context.Source.Payload;//获取参数 - var LoginAddress = GetLoginAddress(loginEvent.Ip); + var loginAddress = GetLoginAddress(loginEvent.Ip); var sysUser = loginEvent.SysUser; #region 登录/密码策略 - var key = SystemConst.Cache_LoginErrorCount + sysUser.Account;//获取登录错误次数Key值 + var key = SystemConst.CACHE_LOGIN_ERROR_COUNT + sysUser.Account;//获取登录错误次数Key值 _simpleCacheService.Remove(key);//移除登录错误次数 // 创建新的作用域 - using var scope = _services.CreateScope(); + using var scope = Services.CreateScope(); // 解析服务 var configService = scope.ServiceProvider.GetRequiredService(); var messageService = scope.ServiceProvider.GetRequiredService(); var pwdRemindUpdateTime = sysUser.PwdRemindUpdateTime;//获取上次提醒修改密码时间 - var loginPolicy = await configService.GetListByCategory(CateGoryConst.Config_PWD_POLICY);//获取密码策略 + var loginPolicy = await configService.GetListByCategory(CateGoryConst.CONFIG_PWD_POLICY);//获取密码策略 //获取用户token列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, sysUser.Id.ToString()); + var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, sysUser.Id.ToString()); var userToken = tokenInfos.Where(it => it.Token == loginEvent.Token).FirstOrDefault(); if (userToken != null) { @@ -70,7 +70,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton { Subject = subject, Content = $"请及时修改初始密码", - Category = CateGoryConst.Message_INFORM, + Category = CateGoryConst.MESSAGE_INFORM, ReceiverIdList = new List() { sysUser.Id } }); } @@ -88,7 +88,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton { Subject = subject, Content = $"已超过{pwdRemindDay}天未修改密码,请及时修改密码", - Category = CateGoryConst.Message_INFORM, + Category = CateGoryConst.MESSAGE_INFORM, ReceiverIdList = new List() { sysUser.Id } }); } @@ -105,7 +105,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton sysUser.LastLoginDevice = sysUser.LatestLoginDevice; sysUser.LastLoginIp = sysUser.LatestLoginIp; sysUser.LastLoginTime = sysUser.LatestLoginTime; - sysUser.LatestLoginAddress = LoginAddress; + sysUser.LatestLoginAddress = loginAddress; sysUser.LatestLoginDevice = loginEvent.Device.ToString(); sysUser.LatestLoginIp = loginEvent.Ip; sysUser.LatestLoginTime = loginEvent.DateTime; @@ -125,7 +125,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton it.LatestLoginTime, LastUpdatePwdTime = it.PwdRemindUpdateTime }).ExecuteCommandAsync() > 0) - _simpleCacheService.HashAdd(SystemConst.Cache_SysUser, sysUser.Id.ToString(), sysUser);//更新Redis信息 + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_USER, sysUser.Id.ToString(), sysUser);//更新Redis信息 await Task.CompletedTask; } @@ -135,7 +135,7 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.LoginOutB)] + [EventSubscribe(EventSubscriberConst.LOGIN_OUT_B)] public async Task LoginOut(EventHandlerExecutingContext context) { _ = (LoginEvent)context.Source.Payload;//获取参数 @@ -151,9 +151,9 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton try { var ipInfo = IpTool.Search(ip); - var LoginAddressList = new List() { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator };//定义登录地址列表 - var LoginAddress = string.Join("|", LoginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 - return LoginAddress; + var loginAddressList = new List() { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator };//定义登录地址列表 + var loginAddress = string.Join("|", loginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 + return loginAddress; } catch { @@ -174,4 +174,4 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton var noticeService = _namedServiceProvider.GetService(noticeComponent);//获取服务 return noticeService; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs index eb41521..d69a162 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Const/EventSubscriberConst.cs @@ -18,12 +18,12 @@ public class EventSubscriberConst /// /// B端登录 /// - public const string LoginB = "B端登录"; + public const string LOGIN_B = "B端登录"; /// /// B端登录 /// - public const string LoginOutB = "B端登出"; + public const string LOGIN_OUT_B = "B端登出"; #endregion AuthEventSubscriber @@ -32,7 +32,7 @@ public class EventSubscriberConst /// /// 清除用户缓存 /// - public const string ClearUserCache = "清除用户缓存"; + public const string CLEAR_USER_CACHE = "清除用户缓存"; #endregion UserEventSubscriber @@ -41,12 +41,12 @@ public class EventSubscriberConst /// /// 通知用户下线 /// - public const string UserLoginOut = "通知用户下线"; + public const string USER_LOGIN_OUT = "通知用户下线"; /// /// 新消息 /// - public const string NewMessage = "新消息"; + public const string NEW_MESSAGE = "新消息"; #endregion NoticeEventSubscriber -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs index fb89364..bd4af08 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs @@ -18,12 +18,12 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton private readonly ISimpleCacheService _simpleCacheService; private readonly INamedServiceProvider _namedServiceProvider; - public IServiceScopeFactory _scopeFactory { get; } + private readonly IServiceScopeFactory _scopeFactory; private readonly SqlSugarScope _db; public NoticeEventSubsciber(ISimpleCacheService simpleCacheService, IServiceScopeFactory scopeFactory, INamedServiceProvider namedServiceProvider) { - _db = DbContext.Db; + _db = DbContext.DB; _simpleCacheService = simpleCacheService; _scopeFactory = scopeFactory; _namedServiceProvider = namedServiceProvider; @@ -34,7 +34,7 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.UserLoginOut)] + [EventSubscribe(EventSubscriberConst.USER_LOGIN_OUT)] public async Task UserLoginOut(EventHandlerExecutingContext context) { var loginEvent = (UserLoginOutEvent)context.Source.Payload;//获取参数 @@ -53,14 +53,14 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.NewMessage)] + [EventSubscribe(EventSubscriberConst.NEW_MESSAGE)] public async Task NewMessage(EventHandlerExecutingContext context) { var newMessageEvent = (NewMessageEvent)context.Source.Payload;//获取参数 var clientIds = new List(); //获取用户token列表 - var tokenInfos = _simpleCacheService.HashGet>(CacheConst.Cache_UserToken, newMessageEvent.UserIds.ToArray()); + var tokenInfos = _simpleCacheService.HashGet>(CacheConst.CACHE_USER_TOKEN, newMessageEvent.UserIds.ToArray()); tokenInfos.ForEach(it => { if (it != null) @@ -102,4 +102,4 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton var noticeService = _namedServiceProvider.GetService(noticeComponent);//获取服务 return noticeService; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs index af527aa..0d039ce 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/UserEventSubscriber.cs @@ -17,7 +17,7 @@ public class UserEventSubscriber : IEventSubscriber, ISingleton public UserEventSubscriber(IServiceProvider services) { - this._services = services; + _services = services; } /// @@ -25,7 +25,7 @@ public class UserEventSubscriber : IEventSubscriber, ISingleton /// /// /// - [EventSubscribe(EventSubscriberConst.ClearUserCache)] + [EventSubscribe(EventSubscriberConst.CLEAR_USER_CACHE)] public async Task DeleteUserCacheByRoleIds(EventHandlerExecutingContext context) { var roleIds = (List)context.Source.Payload;//获取角色ID @@ -35,7 +35,7 @@ public class UserEventSubscriber : IEventSubscriber, ISingleton // 解析角色服务 var relationService = scope.ServiceProvider.GetRequiredService(); //获取用户和角色关系 - var relations = await relationService.GetRelationListByTargetIdListAndCategory(roleIds.Select(it => it.ToString()).ToList(), CateGoryConst.Relation_SYS_USER_HAS_ROLE); + var relations = await relationService.GetRelationListByTargetIdListAndCategory(roleIds.Select(it => it.ToString()).ToList(), CateGoryConst.RELATION_SYS_USER_HAS_ROLE); if (relations.Count > 0) { var userIds = relations.Select(it => it.ObjectId).ToList();//用户ID列表 @@ -45,4 +45,4 @@ public class UserEventSubscriber : IEventSubscriber, ISingleton userService.DeleteUserFromRedis(userIds); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs b/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs index b6f9049..aaf1ea3 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs @@ -16,15 +16,15 @@ namespace SimpleAdmin.System; /// public class MinioUtils : ITransient { - public MinioClient minioClient; - private string defaultBucketName; - private string defaultEndPoint; - private string defaultPrefix = "http://"; + public MinioClient MinioClient; + private string _defaultBucketName; + private string _defaultEndPoint; + private string _defaultPrefix = "http://"; private readonly IConfigService _configService; public MinioUtils(IConfigService configService) { - this._configService = configService; + _configService = configService; InitClient(); } @@ -34,7 +34,7 @@ public class MinioUtils : ITransient /// private async void InitClient() { - var configs = await _configService.GetListByCategory(CateGoryConst.Config_FILE_MINIO);//获取minio配置 + var configs = await _configService.GetListByCategory(CateGoryConst.CONFIG_FILE_MINIO);//获取minio配置 var accessKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_ACCESS_KEY).FirstOrDefault();//MINIO文件AccessKey var secretKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_SECRET_KEY).FirstOrDefault();//MINIO文件SecetKey var endPoint = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_END_POINT).FirstOrDefault();//MINIO文件EndPoint @@ -46,16 +46,16 @@ public class MinioUtils : ITransient try { //默认值赋值 - defaultBucketName = bucketName.ConfigValue; - defaultEndPoint = endPoint.ConfigValue; - if (defaultEndPoint.ToLower().StartsWith("http")) + _defaultBucketName = bucketName.ConfigValue; + _defaultEndPoint = endPoint.ConfigValue; + if (_defaultEndPoint.ToLower().StartsWith("http")) { - var point = defaultEndPoint.Split("//").ToList();//分割、 - defaultPrefix = $"{point[0]}//"; - defaultEndPoint = point[1]; + var point = _defaultEndPoint.Split("//").ToList();//分割、 + _defaultPrefix = $"{point[0]}//"; + _defaultEndPoint = point[1]; } - this.minioClient = new MinioClient().WithEndpoint(defaultEndPoint).WithCredentials(accessKey.ConfigValue, secretKey.ConfigValue).Build();//初始化monio对象 - this.minioClient.WithTimeout(5000);//超时时间 + MinioClient = new MinioClient().WithEndpoint(_defaultEndPoint).WithCredentials(accessKey.ConfigValue, secretKey.ConfigValue).Build();//初始化monio对象 + MinioClient.WithTimeout(5000);//超时时间 } catch (Exception ex) { @@ -75,9 +75,9 @@ public class MinioUtils : ITransient try { using var fileStream = file.OpenReadStream();//获取文件流 - PutObjectArgs putObjectArgs = new PutObjectArgs().WithBucket(defaultBucketName).WithObject(objectName).WithStreamData(fileStream).WithObjectSize(file.Length).WithContentType(contentType); - await minioClient.PutObjectAsync(putObjectArgs); - return $"{defaultPrefix}{defaultEndPoint}/{defaultBucketName}/{objectName}";//默认http + var putObjectArgs = new PutObjectArgs().WithBucket(_defaultBucketName).WithObject(objectName).WithStreamData(fileStream).WithObjectSize(file.Length).WithContentType(contentType); + await MinioClient.PutObjectAsync(putObjectArgs); + return $"{_defaultPrefix}{_defaultEndPoint}/{_defaultBucketName}/{objectName}";//默认http } catch (MinioException e) { @@ -99,13 +99,13 @@ public class MinioUtils : ITransient var stream = new MemoryStream(); try { - var getObjectArgs = new GetObjectArgs().WithBucket(defaultBucketName) - .WithObject(objectName) - .WithCallbackStream(cb => - { - cb.CopyTo(stream); - }); - await minioClient.GetObjectAsync(getObjectArgs); + var getObjectArgs = new GetObjectArgs().WithBucket(_defaultBucketName) + .WithObject(objectName) + .WithCallbackStream(cb => + { + cb.CopyTo(stream); + }); + await MinioClient.GetObjectAsync(getObjectArgs); //System.InvalidOperationException: Response Content-Length mismatch: too few bytes written (0 of 30788) if (stream.CanSeek) @@ -123,4 +123,4 @@ public class MinioUtils : ITransient throw Oops.Oh($"下载文件失败!", e); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs index d060f78..391374c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs @@ -33,7 +33,7 @@ public class AuthService : IAuthService /// public async Task GetCaptchaInfo() { - var config = await _configService.GetByConfigKey(CateGoryConst.Config_LOGIN_POLICY, + var config = await _configService.GetByConfigKey(CateGoryConst.CONFIG_LOGIN_POLICY, SysConfigConst.LOGIN_CAPTCHA_TYPE); var captchaType = (CaptchaType)Enum.Parse(typeof(CaptchaType), config.ConfigValue); //生成验证码 @@ -75,7 +75,7 @@ public class AuthService : IAuthService public async Task Login(LoginInput input, LoginClientTypeEnum loginClientType) { //判断是否有验证码 - var sysBase = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, + var sysBase = await _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.LOGIN_CAPTCHA_OPEN); if (sysBase != null)//如果有这个配置项 { @@ -89,7 +89,7 @@ public class AuthService : IAuthService } } var password = CryptogramUtil.Sm2Decrypt(input.Password);//SM2解密 - var loginPolicy = await _configService.GetListByCategory(CateGoryConst.Config_LOGIN_POLICY); + var loginPolicy = await _configService.GetListByCategory(CateGoryConst.CONFIG_LOGIN_POLICY); BeforeLogin(loginPolicy, input.Account);//登录前校验 // 根据账号获取用户信息,根据B端或C端判断 if (loginClientType == LoginClientTypeEnum.B)//如果是B端 @@ -148,7 +148,7 @@ public class AuthService : IAuthService }; RemoveTokenFromRedis(loginEvent, loginClientType);//移除token //发布登出事件总线 - await _eventPublisher.PublishAsync(EventSubscriberConst.LoginOutB, loginEvent); + await _eventPublisher.PublishAsync(EventSubscriberConst.LOGIN_OUT_B, loginEvent); } } @@ -176,7 +176,7 @@ public class AuthService : IAuthService .ConfigValue.ToInt();//获取锁定时间 var errorCount = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_COUNT) .ConfigValue.ToInt();//获取错误次数 - var key = SystemConst.Cache_LoginErrorCount + userName;//获取登录错误次数Key值 + var key = SystemConst.CACHE_LOGIN_ERROR_COUNT + userName;//获取登录错误次数Key值 var errorCountCache = _simpleCacheService.Get(key);//获取登录错误次数 if (errorCountCache >= errorCount) { @@ -193,7 +193,7 @@ public class AuthService : IAuthService { var resetTime = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_RESET_TIME) .ConfigValue.ToInt();//获取重置时间 - var key = SystemConst.Cache_LoginErrorCount + userName;//获取登录错误次数Key值 + var key = SystemConst.CACHE_LOGIN_ERROR_COUNT + userName;//获取登录错误次数Key值 _simpleCacheService.Increment(key, 1);// 登录错误次数+1 _simpleCacheService.SetExpire(key, TimeSpan.FromMinutes(resetTime));//设置过期时间 } @@ -206,7 +206,7 @@ public class AuthService : IAuthService /// 是否从Redis删除 public void ValidValidCode(string validCode, string validCodeReqNo, bool isDelete = true) { - var key = SystemConst.Cache_Captcha + validCodeReqNo;//获取验证码Key值 + var key = SystemConst.CACHE_CAPTCHA + validCodeReqNo;//获取验证码Key值 var code = _simpleCacheService.Get(key);//从redis拿数据 if (isDelete) RemoveValidCodeFromRedis(validCodeReqNo);//如果需要删除验证码 if (code != null && validCode != null)//如果有 @@ -226,7 +226,7 @@ public class AuthService : IAuthService /// public void RemoveValidCodeFromRedis(string validCodeReqNo) { - var key = SystemConst.Cache_Captcha + validCodeReqNo;//获取验证码Key值 + var key = SystemConst.CACHE_CAPTCHA + validCodeReqNo;//获取验证码Key值 _simpleCacheService.Remove(key);//删除验证码 } @@ -267,7 +267,7 @@ public class AuthService : IAuthService //生成请求号 var reqNo = CommonUtils.GetSingleId().ToString(); //插入redis - _simpleCacheService.Set(SystemConst.Cache_Captcha + reqNo, code, + _simpleCacheService.Set(SystemConst.CACHE_CAPTCHA + reqNo, code, TimeSpan.FromMinutes(expire)); return reqNo; } @@ -289,19 +289,19 @@ public class AuthService : IAuthService var accessToken = JWTEncryption.Encrypt(new Dictionary { { - ClaimConst.UserId, sysUser.Id + ClaimConst.USER_ID, sysUser.Id }, { - ClaimConst.Account, sysUser.Account + ClaimConst.ACCOUNT, sysUser.Account }, { - ClaimConst.Name, sysUser.Name + ClaimConst.NAME, sysUser.Name }, { - ClaimConst.IsSuperAdmin, sysUser.RoleCodeList.Contains(RoleConst.SuperAdmin) + ClaimConst.IS_SUPER_ADMIN, sysUser.RoleCodeList.Contains(SysRoleConst.SUPER_ADMIN) }, { - ClaimConst.OrgId, sysUser.OrgId + ClaimConst.ORG_ID, sysUser.OrgId } }); var expire = App.GetConfig("JWTSettings:ExpiredTime");//获取过期时间(分钟) @@ -321,7 +321,7 @@ public class AuthService : IAuthService Token = accessToken }; await WriteTokenToRedis(logingEvent, loginClientType);//写入token到redis - await _eventPublisher.PublishAsync(EventSubscriberConst.LoginB, logingEvent);//发布登录事件总线 + await _eventPublisher.PublishAsync(EventSubscriberConst.LOGIN_B, logingEvent);//发布登录事件总线 //返回结果 return new LoginOutPut { @@ -357,7 +357,7 @@ public class AuthService : IAuthService { var isSingle = false;//默认不开启单用户登录 var singleConfig = - await _configService.GetByConfigKey(CateGoryConst.Config_LOGIN_POLICY, + await _configService.GetByConfigKey(CateGoryConst.CONFIG_LOGIN_POLICY, SysConfigConst.LOGIN_SINGLE_OPEN);//获取系统单用户登录选项 if (singleConfig != null) isSingle = singleConfig.ConfigValue.ToBoolean();//如果配置不为空则设置单用户登录选项为系统配置的值 @@ -385,7 +385,7 @@ public class AuthService : IAuthService } //添加到token列表 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, loginEvent.SysUser.Id.ToString(), + _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, loginEvent.SysUser.Id.ToString(), tokenInfos); } @@ -409,13 +409,13 @@ public class AuthService : IAuthService if (tokenInfos.Count > 0) { //更新token列表 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, + _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, loginEvent.SysUser.Id.ToString(), tokenInfos); } else { //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, new string[] { loginEvent.SysUser.Id.ToString() @@ -433,7 +433,7 @@ public class AuthService : IAuthService { //redis获取用户token列表 var tokenInfos = - _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, + _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId.ToString()); if (tokenInfos != null) { @@ -449,7 +449,7 @@ public class AuthService : IAuthService /// Token列表 private async Task SingleLogin(string userId, List tokenInfos) { - await _eventPublisher.PublishAsync(EventSubscriberConst.UserLoginOut, new UserLoginOutEvent + await _eventPublisher.PublishAsync(EventSubscriberConst.USER_LOGIN_OUT, new UserLoginOutEvent { Message = "您的账号已在别处登录!", TokenInfos = tokenInfos, @@ -458,4 +458,4 @@ public class AuthService : IAuthService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs index 9e3ea91..d46b66d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs @@ -62,7 +62,7 @@ public class SessionService : DbRepository, ISessionService public async Task> PageC(SessionPageInput input) { return new SqlSugarPagedList() - { PageNum = 1, PageSize = 20, Total = 0, Pages = 1, HasNextPages = false }; + { PageNum = 1, PageSize = 20, Total = 0, Pages = 1, HasNextPages = false }; } /// @@ -109,9 +109,9 @@ public class SessionService : DbRepository, ISessionService var userId = input.Id.ToString(); //token列表 var tokenInfos = - _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); + _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId); //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, new string[] { userId }); await NoticeUserLoginOut(userId, tokenInfos); } @@ -122,16 +122,16 @@ public class SessionService : DbRepository, ISessionService var userId = input.Id.ToString(); //获取该用户的token信息 var tokenInfos = - _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); + _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId); //当前需要踢掉用户的token var deleteTokens = tokenInfos.Where(it => input.Tokens.Contains(it.Token)).ToList(); //踢掉包含token列表的token信息 tokenInfos = tokenInfos.Where(it => !input.Tokens.Contains(it.Token)).ToList(); if (tokenInfos.Count > 0) - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, + _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//如果还有token则更新token else - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, new string[] { userId });//否则直接删除key await NoticeUserLoginOut(userId, deleteTokens); } @@ -146,7 +146,7 @@ public class SessionService : DbRepository, ISessionService { var clockSkew = App.GetConfig("JWTSettings:ClockSkew");//获取过期时间容错值(秒) //redis获取token信息hash集合,并转成字典 - var bTokenDic = _simpleCacheService.HashGetAll>(CacheConst.Cache_UserToken) + var bTokenDic = _simpleCacheService.HashGetAll>(CacheConst.CACHE_USER_TOKEN) .ToDictionary(u => u.Key, u => u.Value); if (bTokenDic != null) { @@ -167,12 +167,12 @@ public class SessionService : DbRepository, ISessionService }); if (bTokenDic.Count > 0) { - _simpleCacheService.HashSet(CacheConst.Cache_UserToken, + _simpleCacheService.HashSet(CacheConst.CACHE_USER_TOKEN, bTokenDic);//如果还有token则更新token } else { - _simpleCacheService.Remove(CacheConst.Cache_UserToken);//否则直接删除key + _simpleCacheService.Remove(CacheConst.CACHE_USER_TOKEN);//否则直接删除key } return bTokenDic; } @@ -209,7 +209,7 @@ public class SessionService : DbRepository, ISessionService /// private async Task NoticeUserLoginOut(string userId, List tokenInfos) { - await _eventPublisher.PublishAsync(EventSubscriberConst.UserLoginOut, new UserLoginOutEvent + await _eventPublisher.PublishAsync(EventSubscriberConst.USER_LOGIN_OUT, new UserLoginOutEvent { Message = "您已被强制下线!", TokenInfos = tokenInfos, @@ -218,4 +218,4 @@ public class SessionService : DbRepository, ISessionService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs index f1254dc..aefbd78 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs @@ -58,7 +58,7 @@ public class BatchEditService : DbRepository, IBatchEditService } }); //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { entity = await InsertReturnEntityAsync(entity);//输入参数转实体并插入 batchEdiConfig.ForEach(it => { it.UId = entity.Id; });//遍历字段赋值基础Id @@ -94,7 +94,7 @@ public class BatchEditService : DbRepository, IBatchEditService if (ids.Count > 0) { //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 await Context.Deleteable().Where(it => ids.Contains(it.UId)) @@ -223,4 +223,4 @@ public class BatchEditService : DbRepository, IBatchEditService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs index d2de99c..1b7c981 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs @@ -135,7 +135,7 @@ public class FileService : DbRepository, IFileService break; //存储本地 case SysDictConst.FILE_ENGINE_MINIO: - var config = await _configService.GetByConfigKey(CateGoryConst.Config_FILE_MINIO, + var config = await _configService.GetByConfigKey(CateGoryConst.CONFIG_FILE_MINIO, SysConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME); if (config != null) { @@ -162,7 +162,7 @@ public class FileService : DbRepository, IFileService SizeInfo = GetSizeInfo(fileSizeKb), StoragePath = storageUrl }; - if (engine != CateGoryConst.Config_FILE_LOCAL)//如果不是本地,设置下载地址 + if (engine != CateGoryConst.CONFIG_FILE_LOCAL)//如果不是本地,设置下载地址 { devFile.DownloadPath = storageUrl; } @@ -201,7 +201,7 @@ public class FileService : DbRepository, IFileService } //获取路径配置 var config = - await _configService.GetByConfigKey(CateGoryConst.Config_FILE_LOCAL, configKey); + await _configService.GetByConfigKey(CateGoryConst.CONFIG_FILE_LOCAL, configKey); if (config != null) { uploadFileFolder = config.ConfigValue;//赋值路径 @@ -251,16 +251,16 @@ public class FileService : DbRepository, IFileService private string GetSizeInfo(long fileSizeKb) { var b = fileSizeKb * 1024; - const int MB = 1024 * 1024; - const int KB = 1024; - if (b / MB >= 1) + const int mb = 1024 * 1024; + const int kb = 1024; + if (b / mb >= 1) { - return Math.Round(b / (float)MB, 2) + "MB"; + return Math.Round(b / (float)mb, 2) + "MB"; } - if (b / KB >= 1) + if (b / kb >= 1) { - return Math.Round(b / (float)KB, 2) + "KB"; + return Math.Round(b / (float)kb, 2) + "KB"; } if (b == 0) { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs index 6813b0e..5f9a562 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/Dto/MessageInput.cs @@ -41,9 +41,9 @@ public class MessageSendInput : SysMessage, IValidatableObject public IEnumerable Validate(ValidationContext validationContext) { - if (Category != CateGoryConst.Message_INFORM && Category != CateGoryConst.Message_NOTICE) + if (Category != CateGoryConst.MESSAGE_INFORM && Category != CateGoryConst.MESSAGE_NOTICE) { yield return new ValidationResult("分类错误", new[] { nameof(Category) }); } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs index 47bfb04..bd63e90 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs @@ -78,7 +78,7 @@ public class MessageService : DbRepository, IMessageService }); //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { message = await InsertReturnEntityAsync(message);//添加消息 messageUsers.ForEach(it => it.MessageId = message.Id);//添加关系 @@ -86,7 +86,7 @@ public class MessageService : DbRepository, IMessageService }); if (result.IsSuccess)//如果成功了 { - await _eventPublisher.PublishAsync(EventSubscriberConst.NewMessage, new NewMessageEvent + await _eventPublisher.PublishAsync(EventSubscriberConst.NEW_MESSAGE, new NewMessageEvent { UserIds = input.ReceiverIdList.Select(it => it.ToString()).ToList(), Message = input.Subject @@ -168,7 +168,7 @@ public class MessageService : DbRepository, IMessageService if (ids.Count > 0) { //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { await DeleteAsync(it => ids.Contains(it.Id)); await Context.Deleteable().Where(it => ids.Contains(it.MessageId)) @@ -201,4 +201,4 @@ public class MessageService : DbRepository, IMessageService it.UserId == userId && it.Read == false && it.IsDelete == false); return unRead; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs index 5a4fb56..d4ac1b5 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs @@ -20,7 +20,7 @@ public class ImportExportService : IImportExportService { if (file == null) throw Oops.Bah("文件不能为空"); if (file.Length > maxSzie * 1024 * 1024) throw Oops.Bah($"文件大小不允许超过{maxSzie}M"); - var fileSuffix = Path.GetExtension(file.FileName).ToLower().Split(".")[1]; // 文件后缀 + var fileSuffix = Path.GetExtension(file.FileName).ToLower().Split(".")[1];// 文件后缀 string[] allowTypeS = allowTypes == null ? new string[] { "xlsx" } : allowTypes;//允许上传的文件类型 if (!allowTypeS.Contains(fileSuffix)) throw Oops.Bah(errorMessage: "文件格式错误"); } @@ -59,11 +59,11 @@ public class ImportExportService : IImportExportService //导入的数据转集合 var data = importResult.Data.ToList(); var systemError = new string[] { };//系统错误提示 - //遍历错误列,将错误字典中的中文改成英文跟实体对应 + //遍历错误列,将错误字典中的中文改成英文跟实体对应 importResult.RowErrors.ForEach(row => { IDictionary fieldErrors = new Dictionary();//定义字典 - //遍历错误列,赋值给新的字典 + //遍历错误列,赋值给新的字典 row.FieldErrors.ForEach(it => { var errrVaule = it.Value; @@ -86,8 +86,8 @@ public class ImportExportService : IImportExportService /// public async Task GenerateTemplate(string fileName) where T : class, new() { - IImporter Importer = new ExcelImporter(); - var byteArray = await Importer.GenerateTemplateBytes(); + IImporter importer = new ExcelImporter(); + var byteArray = await importer.GenerateTemplateBytes(); var result = GetFileStreamResult(byteArray, fileName); return result; } @@ -103,11 +103,11 @@ public class ImportExportService : IImportExportService public async Task> GetImportPreview(IFormFile file) where T : ImportTemplateInput, new() { ImportVerification(file);//验证文件 - IImporter Importer = new ExcelImporter(); + IImporter importer = new ExcelImporter(); using var fileStream = file.OpenReadStream();//获取文件流 - var import = await Importer.Import(fileStream);//导入的文件转化为带入结果 - var ImportPreview = TemplateDataVerification(import);//验证数据完整度 - return ImportPreview; + var import = await importer.Import(fileStream);//导入的文件转化为带入结果 + var importPreview = TemplateDataVerification(import);//验证数据完整度 + return importPreview; } /// @@ -198,4 +198,4 @@ public class ImportExportService : IImportExportService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs index af8b433..4a4a741 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs @@ -24,7 +24,7 @@ public class IndexService : DbRepository, IIndexService public async Task> ScheduleList(ScheduleListInput input) { var relations = await GetListAsync(it => - it.Category == CateGoryConst.Relation_SYS_USER_SCHEDULE_DATA + it.Category == CateGoryConst.RELATION_SYS_USER_SCHEDULE_DATA && it.ObjectId == UserManager.UserId && it.TargetId == input.ScheduleDate, it => new SysRelation { ExtJson = it.ExtJson, Id = it.Id });//获取当前用户的日程列表 List userSchedules = new List();//结果集 @@ -44,7 +44,7 @@ public class IndexService : DbRepository, IIndexService input.ScheduleUserId = UserManager.UserId; input.ScheduleUserName = UserManager.Name; //添加日程 - await _relationService.SaveRelation(CateGoryConst.Relation_SYS_USER_SCHEDULE_DATA, + await _relationService.SaveRelation(CateGoryConst.RELATION_SYS_USER_SCHEDULE_DATA, UserManager.UserId, input.ScheduleDate, input.ToJson(), false, false); } @@ -56,4 +56,4 @@ public class IndexService : DbRepository, IIndexService var ids = input.Ids; await DeleteAsync(it => ids.Contains(it.Id) && it.ObjectId == UserManager.UserId); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs index d1e62db..ee15a68 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs @@ -33,7 +33,7 @@ public class ButtonService : DbRepository, IButtonService { var query = Context.Queryable() .Where(it => - it.ParentId == input.ParentId && it.Category == CateGoryConst.Resource_BUTTON) + it.ParentId == input.ParentId && it.Category == CateGoryConst.RESOURCE_BUTTON) .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey) || it.Path.Contains(input.SearchKey))//根据关键字查询 @@ -50,7 +50,7 @@ public class ButtonService : DbRepository, IButtonService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//刷新缓存 } /// @@ -83,7 +83,7 @@ public class ButtonService : DbRepository, IButtonService //添加到数据库 if (await InsertRangeAsync(sysResources))//插入数据 { - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//刷新缓存 return sysResources.Select(it => it.Id).ToList(); } else @@ -98,13 +98,13 @@ public class ButtonService : DbRepository, IButtonService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { await UpdateAsync(sysResource);//更新按钮 }); if (result.IsSuccess)//如果成功了 { - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//资源表按钮刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//资源表按钮刷新缓存 } else { @@ -120,19 +120,19 @@ public class ButtonService : DbRepository, IButtonService //获取所有ID var ids = input.Ids; //获取所有按钮集合 - var buttonList = await _resourceService.GetListByCategory(CateGoryConst.Resource_BUTTON); + var buttonList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_BUTTON); #region 处理关系表角色资源信息 //获取所有菜单集合 - var menuList = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); + var menuList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU); //获取按钮的父菜单id集合 var parentIds = buttonList.Where(it => ids.Contains(it.Id)) .Select(it => it.ParentId.Value.ToString()).ToList(); //获取关系表分类为SYS_ROLE_HAS_RESOURCE数据 var roleResources = await _relationService.GetRelationByCategory(CateGoryConst - .Relation_SYS_ROLE_HAS_RESOURCE); + .RELATION_SYS_ROLE_HAS_RESOURCE); //获取相关关系表数据 var relationList = roleResources .Where(it => parentIds.Contains(it.TargetId))//目标ID是父ID中 @@ -154,7 +154,7 @@ public class ButtonService : DbRepository, IButtonService #endregion 处理关系表角色资源信息 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 if (relationList.Count > 0) @@ -165,9 +165,9 @@ public class ButtonService : DbRepository, IButtonService }); if (result.IsSuccess)//如果成功了 { - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//资源表按钮刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//资源表按钮刷新缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新角色资源缓存 + .RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新角色资源缓存 } else { @@ -187,15 +187,15 @@ public class ButtonService : DbRepository, IButtonService { //获取所有按钮和菜单 var buttonList = await _resourceService.GetListAsync(new List - { CateGoryConst.Resource_BUTTON, CateGoryConst.Resource_MENU }); + { CateGoryConst.RESOURCE_BUTTON, CateGoryConst.RESOURCE_MENU }); //判断code是否重复 if (buttonList.Any(it => it.Code == sysResource.Code && it.Id != sysResource.Id)) throw Oops.Bah($"存在重复的按钮编码:{sysResource.Code}"); //判断菜单是否存在 if (!buttonList.Any(it => it.Id == sysResource.ParentId)) throw Oops.Bah($"不存在的父级菜单:{sysResource.ParentId}"); - sysResource.Category = CateGoryConst.Resource_BUTTON;//设置分类为按钮 + sysResource.Category = CateGoryConst.RESOURCE_BUTTON;//设置分类为按钮 } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs index 7d38a0d..80fe724 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/Dto/MenuInput.cs @@ -44,7 +44,7 @@ public class MenuAddInput : SysResource, IValidatableObject /// /// 菜单类型 /// - public override string MenuType { get; set; } = ResourceConst.MENU; + public override string MenuType { get; set; } = SysResourceConst.MENU; /// /// 模块 @@ -73,13 +73,13 @@ public class MenuAddInput : SysResource, IValidatableObject public IEnumerable Validate(ValidationContext validationContext) { //如果菜单类型是菜单 - if (MenuType is ResourceConst.MENU or ResourceConst.SUBSET) + if (MenuType is SysResourceConst.MENU or SysResourceConst.SUBSET) { if (string.IsNullOrEmpty(Name)) yield return new ValidationResult("Name不能为空", new[] { nameof(Name) }); if (string.IsNullOrEmpty(Component)) yield return new ValidationResult("Component不能为空", new[] { nameof(Name) }); - if (MenuType is ResourceConst.SUBSET)//如果是子集 + if (MenuType is SysResourceConst.SUBSET)//如果是子集 { if (string.IsNullOrEmpty(ActiveMenu)) yield return new ValidationResult("ActiveMenu不能为空", new[] { nameof(Name) }); @@ -96,7 +96,7 @@ public class MenuAddInput : SysResource, IValidatableObject Component = null;//设置组件为空 } //设置分类为菜单 - Category = CateGoryConst.Resource_MENU; + Category = CateGoryConst.RESOURCE_MENU; } } @@ -122,4 +122,4 @@ public class MenuChangeModuleInput : BaseIdInput /// [Required(ErrorMessage = "Module不能为空")] public long? Module { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs index a8b4de8..1c6e817 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs @@ -48,7 +48,7 @@ public class MenuService : DbRepository, IMenuService public async Task> Tree(MenuTreeInput input) { //获取所有菜单 - var sysResources = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); + var sysResources = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU); sysResources = sysResources .WhereIF(input.Module != null, it => it.Module.Value == input.Module.Value)//根据模块查找 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), @@ -66,7 +66,7 @@ public class MenuService : DbRepository, IMenuService var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_MENU);//刷新菜单缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MENU);//刷新菜单缓存 } /// @@ -75,7 +75,7 @@ public class MenuService : DbRepository, IMenuService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await UpdateAsync(sysResource))//更新数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_MENU);//刷新菜单缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MENU);//刷新菜单缓存 } /// @@ -87,11 +87,11 @@ public class MenuService : DbRepository, IMenuService { //获取所有菜单和按钮 var resourceList = await _resourceService.GetListAsync(new List - { CateGoryConst.Resource_MENU, CateGoryConst.Resource_BUTTON }); + { CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_BUTTON }); //找到要删除的菜单 var sysResources = resourceList.Where(it => ids.Contains(it.Id)).ToList(); //查找内置菜单 - var system = sysResources.Where(it => it.Code == ResourceConst.System).FirstOrDefault(); + var system = sysResources.Where(it => it.Code == SysResourceConst.SYSTEM).FirstOrDefault(); if (system != null) throw Oops.Bah($"不可删除系统菜单:{system.Title}"); //需要删除的资源ID列表 @@ -107,21 +107,21 @@ public class MenuService : DbRepository, IMenuService }); ids.AddRange(resourceIds);//添加到删除ID列表 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除菜单和按钮 await Context.Deleteable()//关系表删除对应SYS_ROLE_HAS_RESOURCE .Where(it => - it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE + it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))) .ExecuteCommandAsync(); }); if (result.IsSuccess)//如果成功了 { - await _resourceService.RefreshCache(CateGoryConst.Resource_MENU);//资源表菜单刷新缓存 - await _resourceService.RefreshCache(CateGoryConst.Resource_BUTTON);//资源表按钮刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MENU);//资源表菜单刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//资源表按钮刷新缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 + .RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 } else { @@ -135,7 +135,7 @@ public class MenuService : DbRepository, IMenuService /// public async Task Detail(BaseIdInput input) { - var sysResources = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); + var sysResources = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU); var resource = sysResources.Where(it => it.Id == input.Id).FirstOrDefault(); return resource; } @@ -152,12 +152,12 @@ public class MenuService : DbRepository, IMenuService throw Oops.Bah($"非顶级菜单不可修改所属模块"); //获取所有菜单和模块 var resourceList = await _resourceService.GetListAsync(new List - { CateGoryConst.Resource_MENU, CateGoryConst.Resource_MODULE }); + { CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_MODULE }); if (!resourceList.Any(it => - it.Category == CateGoryConst.Resource_MODULE && it.Id == input.Module.Value)) + it.Category == CateGoryConst.RESOURCE_MODULE && it.Id == input.Module.Value)) throw Oops.Bah($"不存在的模块"); //获取所有菜单 - var menuList = resourceList.Where(it => it.Category == CateGoryConst.Resource_MENU) + var menuList = resourceList.Where(it => it.Category == CateGoryConst.RESOURCE_MENU) .ToList(); //获取需要改变模块菜单的所有子菜单 var childList = _resourceService.GetChildListById(menuList, input.Id); @@ -165,7 +165,7 @@ public class MenuService : DbRepository, IMenuService //更新数据 await UpdateRangeAsync(childList); //刷新菜单缓存 - await _resourceService.RefreshCache(CateGoryConst.Resource_MENU); + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MENU); } } @@ -178,7 +178,7 @@ public class MenuService : DbRepository, IMenuService private async Task CheckInput(SysResource sysResource) { //获取所有菜单列表 - var menList = await _resourceService.GetListByCategory(CateGoryConst.Resource_MENU); + var menList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MENU); //判断是否有同级且同名的菜单 if (menList.Any(it => it.ParentId == sysResource.ParentId && it.Title == sysResource.Title @@ -203,4 +203,4 @@ public class MenuService : DbRepository, IMenuService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs index 8c315e7..1e24cac 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs @@ -34,7 +34,7 @@ public class ModuleService : DbRepository, IModuleService public async Task> Page(ModulePageInput input) { var query = Context.Queryable() - .Where(it => it.Category == CateGoryConst.Resource_MODULE)//模块 + .Where(it => it.Category == CateGoryConst.RESOURCE_MODULE)//模块 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Title.Contains(input.SearchKey))//根据关键字查询 .OrderByIF(!string.IsNullOrEmpty(input.SortField), @@ -50,7 +50,7 @@ public class ModuleService : DbRepository, IModuleService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_MODULE);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MODULE);//刷新缓存 } /// @@ -59,7 +59,7 @@ public class ModuleService : DbRepository, IModuleService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await UpdateAsync(sysResource))//更新数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_MODULE);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_MODULE);//刷新缓存 } /// @@ -74,14 +74,14 @@ public class ModuleService : DbRepository, IModuleService //找到要删除的模块 var sysresources = resourceList.Where(it => ids.Contains(it.Id)).ToList(); //查找内置模块 - var system = sysresources.Where(it => it.Code == ResourceConst.System).FirstOrDefault(); + var system = sysresources.Where(it => it.Code == SysResourceConst.SYSTEM).FirstOrDefault(); if (system != null) throw Oops.Bah($"不可删除系统内置模块:{system.Title}"); //获取模块下的所有菜单Id列表 var menuIds = resourceList .Where(it => ids.Contains(it.Module.ToLong()) - && it.ParentId.ToLong() == SimpleAdminConst.Zero).Select(it => it.Id).ToList(); + && it.ParentId.ToLong() == SimpleAdminConst.ZERO).Select(it => it.Id).ToList(); //需要删除的资源ID列表 var resourceIds = new List(); //遍历列表 @@ -95,12 +95,12 @@ public class ModuleService : DbRepository, IModuleService }); ids.AddRange(resourceIds); //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除菜单和按钮 await Context.Deleteable()//关系表删除对应SYS_ROLE_HAS_RESOURCE .Where(it => - it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE + it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE && resourceIds.Contains(SqlFunc.ToInt64(it.TargetId))) .ExecuteCommandAsync(); }); @@ -108,7 +108,7 @@ public class ModuleService : DbRepository, IModuleService { await _resourceService.RefreshCache();//资源表刷新缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 + .RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新缓存 } else { @@ -128,7 +128,7 @@ public class ModuleService : DbRepository, IModuleService private async Task CheckInput(SysResource sysResource) { var sysResourceList = - await _resourceService.GetListByCategory(CateGoryConst.Resource_MODULE); + await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MODULE); //判断是否从存在重复模块 var hasSameName = sysResourceList.Any(it => it.Title == sysResource.Title && it.Id != sysResource.Id); @@ -137,8 +137,8 @@ public class ModuleService : DbRepository, IModuleService throw Oops.Bah($"存在重复的模块:{sysResource.Title}"); } //设置为模块 - sysResource.Category = CateGoryConst.Resource_MODULE; + sysResource.Category = CateGoryConst.RESOURCE_MODULE; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs index 8a03157..33359c0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs @@ -23,8 +23,7 @@ public class RoleService : DbRepository, IRoleService ISimpleCacheService simpleCacheService, IRelationService relationService, ISysOrgService sysOrgService, - IResourceService resourceService, - IEventPublisher eventPublisher) + IResourceService resourceService, IEventPublisher eventPublisher) { _logger = logger; _simpleCacheService = simpleCacheService; @@ -34,11 +33,14 @@ public class RoleService : DbRepository, IRoleService _eventPublisher = eventPublisher; } - /// + /// + /// 获取所有 + /// + /// public override async Task> GetListAsync() { //先从Redis拿 - var sysRoles = _simpleCacheService.Get>(SystemConst.Cache_SysRole); + var sysRoles = _simpleCacheService.Get>(SystemConst.CACHE_SYS_ROLE); if (sysRoles == null) { //redis没有就去数据库拿 @@ -46,7 +48,7 @@ public class RoleService : DbRepository, IRoleService if (sysRoles.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.Cache_SysRole, sysRoles); + _simpleCacheService.Set(SystemConst.CACHE_SYS_ROLE, sysRoles); } } return sysRoles; @@ -58,7 +60,7 @@ public class RoleService : DbRepository, IRoleService var cods = new List();//角色代码集合 var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, - CateGoryConst.Relation_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID + CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID var roleIdList = roleList.Select(x => x.TargetId.ToLong()).ToList();//角色ID列表 if (roleIdList.Count > 0) { @@ -98,7 +100,7 @@ public class RoleService : DbRepository, IRoleService public async Task Edit(RoleEditInput input) { //判断是否超管 - if (input.Code == RoleConst.SuperAdmin) + if (input.Code == SysRoleConst.SUPER_ADMIN) throw Oops.Bah($"不可编辑超管角色"); await CheckInput(input);//检查参数 var role = await GetFirstAsync(it => it.Id == input.Id);//获取角色 @@ -111,7 +113,7 @@ public class RoleService : DbRepository, IRoleService //获取角色授权列表 var relations = await _relationService.GetRelationByCategory(CateGoryConst - .Relation_SYS_ROLE_HAS_PERMISSION); + .RELATION_SYS_ROLE_HAS_PERMISSION); //找到当前角色的 permissions = relations.Where(it => it.ObjectId == input.Id).ToList(); permissions.ForEach(it => @@ -132,7 +134,7 @@ public class RoleService : DbRepository, IRoleService } var sysRole = input.Adapt();//实体转换 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { await UpdateAsync(sysRole);//更新角色 if (permissions.Any())//如果有授权权限就更新 @@ -143,8 +145,8 @@ public class RoleService : DbRepository, IRoleService await RefreshCache();//刷新缓存 if (permissions.Any())//如果有授权权 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_ROLE_HAS_PERMISSION);//关系表刷新SYS_ROLE_HAS_PERMISSION缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + .RELATION_SYS_ROLE_HAS_PERMISSION);//关系表刷新SYS_ROLE_HAS_PERMISSION缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List { input.Id });//清除角色下用户缓存 } else @@ -166,7 +168,7 @@ public class RoleService : DbRepository, IRoleService var sysRoles = await GetListAsync();//获取所有角色 var hasSuperAdmin = sysRoles.Any(it => - it.Code == RoleConst.SuperAdmin && ids.Contains(it.Id));//判断是否有超级管理员 + it.Code == SysRoleConst.SUPER_ADMIN && ids.Contains(it.Id));//判断是否有超级管理员 if (hasSuperAdmin) throw Oops.Bah($"不可删除系统内置超管角色"); //数据库是string所以这里转下 @@ -174,11 +176,11 @@ public class RoleService : DbRepository, IRoleService //定义删除的关系 var delRelations = new List { - CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE, - CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION + CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE, + CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION }; //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 var relationRep = ChangeRepository>();//切换仓储 @@ -188,18 +190,18 @@ public class RoleService : DbRepository, IRoleService //删除关系表角色与用户关系 await relationRep.DeleteAsync(it => targetIds.Contains(it.TargetId) - && it.Category == CateGoryConst.Relation_SYS_USER_HAS_ROLE); + && it.Category == CateGoryConst.RELATION_SYS_USER_HAS_ROLE); }); if (result.IsSuccess)//如果成功了 { await RefreshCache();//刷新缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 + .RELATION_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_ROLE_HAS_RESOURCE);//关系表刷新Relation_SYS_ROLE_HAS_RESOURCE缓存 + .RELATION_SYS_ROLE_HAS_RESOURCE);//关系表刷新Relation_SYS_ROLE_HAS_RESOURCE缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_ROLE_HAS_PERMISSION);//关系表刷新Relation_SYS_ROLE_HAS_PERMISSION缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + .RELATION_SYS_ROLE_HAS_PERMISSION);//关系表刷新Relation_SYS_ROLE_HAS_PERMISSION缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, ids);//清除角色下用户缓存 } else @@ -215,7 +217,7 @@ public class RoleService : DbRepository, IRoleService public async Task OwnResource(BaseIdInput input, string category) { var roleOwnResource = new RoleOwnResourceOutput() { Id = input.Id };//定义结果集 - var GrantInfoList = new List();//已授权信息集合 + var grantInfoList = new List();//已授权信息集合 //获取关系列表 var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, category); @@ -224,16 +226,16 @@ public class RoleService : DbRepository, IRoleService { //将扩展信息转为实体 var relationRole = it.ExtJson.ToJsonEntity(); - GrantInfoList.Add(relationRole);//添加到已授权信息 + grantInfoList.Add(relationRole);//添加到已授权信息 }); - roleOwnResource.GrantInfoList = GrantInfoList;//赋值已授权信息 + roleOwnResource.GrantInfoList = grantInfoList;//赋值已授权信息 return roleOwnResource; } /// public async Task GrantResource(GrantResourceInput input) { - var allMenus = await _resourceService.GetListByCategory(ResourceConst.MENU);//获取所有菜单 + var allMenus = await _resourceService.GetListByCategory(SysResourceConst.MENU);//获取所有菜单 var menuIds = input.GrantInfoList.Select(it => it.MenuId).ToList();//菜单ID var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 var relationRoles = new List();//要添加的角色资源和授权关系表 @@ -252,7 +254,7 @@ public class RoleService : DbRepository, IRoleService { ObjectId = sysRole.Id, TargetId = it.ToString(), - Category = CateGoryConst.Relation_SYS_ROLE_HAS_MODULE + Category = CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE }); }); @@ -268,7 +270,7 @@ public class RoleService : DbRepository, IRoleService { ObjectId = sysRole.Id, TargetId = menuIds[i].ToString(), - Category = CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE, + Category = CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE, ExtJson = extJsons?[i] }); } @@ -294,13 +296,13 @@ public class RoleService : DbRepository, IRoleService { ObjectId = sysRole.Id, TargetId = it.ApiRoute, - Category = CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION, + Category = CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION, ExtJson = new RelationRolePermission - { - ApiUrl = it.ApiRoute, - ScopeCategory = defaultDataScope.ScopeCategory, - ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList - } + { + ApiUrl = it.ApiRoute, + ScopeCategory = defaultDataScope.ScopeCategory, + ScopeDefineOrgIdList = defaultDataScope.ScopeDefineOrgIdList + } .ToJson() }); }); @@ -312,25 +314,25 @@ public class RoleService : DbRepository, IRoleService #region 保存数据库 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { var relatioRep = ChangeRepository>();//切换仓储 //如果不是代码生成,就删除老的 if (!input.IsCodeGen) await relatioRep.DeleteAsync(it => it.ObjectId == sysRole.Id - && (it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION - || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE - || it.Category == CateGoryConst.Relation_SYS_ROLE_HAS_MODULE)); + && (it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION + || it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE + || it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE)); await relatioRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 { await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_ROLE_HAS_RESOURCE);//刷新关系缓存 + .RELATION_SYS_ROLE_HAS_RESOURCE);//刷新关系缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_ROLE_HAS_PERMISSION);//刷新关系缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + .RELATION_SYS_ROLE_HAS_PERMISSION);//刷新关系缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List { input.Id });//发送事件清除角色下用户缓存 } else @@ -348,18 +350,18 @@ public class RoleService : DbRepository, IRoleService public async Task OwnPermission(BaseIdInput input) { var roleOwnPermission = new RoleOwnPermissionOutput { Id = input.Id };//定义结果集 - var GrantInfoList = new List();//已授权信息集合 + var grantInfoList = new List();//已授权信息集合 //获取关系列表 var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, - CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); + CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION); //遍历关系表 relations.ForEach(it => { //将扩展信息转为实体 var relationPermission = it.ExtJson.ToJsonEntity(); - GrantInfoList.Add(relationPermission);//添加到已授权信息 + grantInfoList.Add(relationPermission);//添加到已授权信息 }); - roleOwnPermission.GrantInfoList = GrantInfoList;//赋值已授权信息 + roleOwnPermission.GrantInfoList = grantInfoList;//赋值已授权信息 return roleOwnPermission; } @@ -371,10 +373,10 @@ public class RoleService : DbRepository, IRoleService { var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiurl列表 var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION, + await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION, input.Id, apiUrls, extJsons, true);//添加到数据库 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List { input.Id });//清除角色下用户缓存 } } @@ -385,7 +387,7 @@ public class RoleService : DbRepository, IRoleService //获取关系列表 var relations = await _relationService.GetRelationListByTargetIdAndCategory(input.Id.ToString(), - CateGoryConst.Relation_SYS_USER_HAS_ROLE); + CateGoryConst.RELATION_SYS_USER_HAS_ROLE); return relations.Select(it => it.ObjectId).ToList(); } @@ -400,25 +402,25 @@ public class RoleService : DbRepository, IRoleService { ObjectId = it, TargetId = input.Id.ToString(), - Category = CateGoryConst.Relation_SYS_USER_HAS_ROLE + Category = CateGoryConst.RELATION_SYS_USER_HAS_ROLE }); }); //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { var relationRep = ChangeRepository>();//切换仓储 var targetId = input.Id.ToString();//目标ID转string await relationRep.DeleteAsync(it => it.TargetId == targetId - && it.Category == CateGoryConst.Relation_SYS_USER_HAS_ROLE);//删除老的 + && it.Category == CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//删除老的 await relationRep.InsertRangeAsync(sysRelations);//添加新的 }); if (result.IsSuccess)//如果成功了 { await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_USER_HAS_ROLE);//刷新关系表SYS_USER_HAS_ROLE缓存 - await _eventPublisher.PublishAsync(EventSubscriberConst.ClearUserCache, + .RELATION_SYS_USER_HAS_ROLE);//刷新关系表SYS_USER_HAS_ROLE缓存 + await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List { input.Id });//清除角色下用户缓存 } else @@ -454,14 +456,14 @@ public class RoleService : DbRepository, IRoleService //获取角色资源关系 var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst - .Relation_SYS_ROLE_HAS_RESOURCE); + .RELATION_SYS_ROLE_HAS_RESOURCE); var menuIds = relationsRes.Where(it => it.ObjectId == input.Id) .Select(it => it.TargetId.ToLong()).ToList(); if (menuIds.Any()) { //获取菜单信息 var menus = - await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); + await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.RESOURCE_MENU); //获取权限授权树 var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); @@ -477,7 +479,7 @@ public class RoleService : DbRepository, IRoleService /// public async Task RefreshCache() { - _simpleCacheService.Remove(SystemConst.Cache_SysRole);//删除KEY + _simpleCacheService.Remove(SystemConst.CACHE_SYS_ROLE);//删除KEY await GetListAsync();//重新缓存 } @@ -498,13 +500,13 @@ public class RoleService : DbRepository, IRoleService private async Task CheckInput(SysRole sysRole) { //判断分类 - if (sysRole.Category != CateGoryConst.Role_GLOBAL - && sysRole.Category != CateGoryConst.Role_ORG) + if (sysRole.Category != CateGoryConst.ROLE_GLOBAL + && sysRole.Category != CateGoryConst.ROLE_ORG) throw Oops.Bah($"角色所属分类错误:{sysRole.Category}"); //如果是机构角色orgId不能为空 - if (sysRole.Category == CateGoryConst.Role_ORG && sysRole.OrgId == null) + if (sysRole.Category == CateGoryConst.ROLE_ORG && sysRole.OrgId == null) throw Oops.Bah($"orgId不能为空"); - else if (sysRole.Category == CateGoryConst.Role_GLOBAL)//如果是全局 + else if (sysRole.Category == CateGoryConst.ROLE_GLOBAL)//如果是全局 sysRole.OrgId = null;//机构id设null var sysRoles = await GetListAsync();//获取所有 @@ -520,4 +522,4 @@ public class RoleService : DbRepository, IRoleService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs index 7ba402e..63d5108 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs @@ -26,7 +26,7 @@ public class SpaService : DbRepository, ISpaService public async Task> Page(SpaPageInput input) { var query = Context.Queryable() - .Where(it => it.Category == CateGoryConst.Resource_SPA)//单页 + .Where(it => it.Category == CateGoryConst.RESOURCE_SPA)//单页 .WhereIF(!string.IsNullOrEmpty(input.MenuType), it => it.MenuType == input.MenuType)//根据菜单类型查询 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), @@ -46,7 +46,7 @@ public class SpaService : DbRepository, ISpaService input.Code = RandomHelper.CreateRandomString(10);//code取随机值 var sysResource = input.Adapt();//实体转换 if (await InsertAsync(sysResource))//插入数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_SPA);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_SPA);//刷新缓存 } /// @@ -55,7 +55,7 @@ public class SpaService : DbRepository, ISpaService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 if (await UpdateAsync(sysResource))//更新数据 - await _resourceService.RefreshCache(CateGoryConst.Resource_SPA);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_SPA);//刷新缓存 } /// @@ -66,16 +66,16 @@ public class SpaService : DbRepository, ISpaService if (ids.Count > 0) { //获取所有 - var resourceList = await _resourceService.GetListByCategory(CateGoryConst.Resource_SPA); + var resourceList = await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_SPA); //找到要删除的 var sysresources = resourceList.Where(it => ids.Contains(it.Id)).ToList(); //查找内置单页面 - var system = sysresources.Where(it => it.Code == ResourceConst.System).FirstOrDefault(); + var system = sysresources.Where(it => it.Code == SysResourceConst.SYSTEM).FirstOrDefault(); if (system != null) throw Oops.Bah($"不可删除系统内置单页面:{system.Title}"); //删除菜单 await DeleteAsync(sysresources); - await _resourceService.RefreshCache(CateGoryConst.Resource_SPA);//刷新缓存 + await _resourceService.RefreshCache(CateGoryConst.RESOURCE_SPA);//刷新缓存 } } @@ -88,7 +88,7 @@ public class SpaService : DbRepository, ISpaService private async Task CheckInput(SysResource sysResource) { //判断菜单类型 - if (sysResource.MenuType == ResourceConst.MENU)//如果是菜单 + if (sysResource.MenuType == SysResourceConst.MENU)//如果是菜单 { if (string.IsNullOrEmpty(sysResource.Name)) { @@ -99,8 +99,8 @@ public class SpaService : DbRepository, ISpaService throw Oops.Bah($"组件地址不能为空"); } } - else if (sysResource.MenuType == ResourceConst.IFRAME - || sysResource.MenuType == ResourceConst.LINK)//如果是内链或者外链 + else if (sysResource.MenuType == SysResourceConst.IFRAME + || sysResource.MenuType == SysResourceConst.LINK)//如果是内链或者外链 { // sysResource.Name = RandomHelper.CreateNum(10);//设置name为随机数 sysResource.Name = null;//设置name为标题 @@ -112,7 +112,7 @@ public class SpaService : DbRepository, ISpaService } if (sysResource.IsHome) { - var spas = await _resourceService.GetListByCategory(ResourceConst.SPA);//获取所有单页 + var spas = await _resourceService.GetListByCategory(SysResourceConst.SPA);//获取所有单页 if (spas.Any(it => it.IsHome && it.Id != sysResource.Id))//如果有多个主页 { throw Oops.Bah($"已存在首页,请取消其他主页后再试"); @@ -121,8 +121,8 @@ public class SpaService : DbRepository, ISpaService sysResource.IsAffix = true;//如果是主页,则固定 } //设置为单页 - sysResource.Category = CateGoryConst.Resource_SPA; + sysResource.Category = CateGoryConst.RESOURCE_SPA; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs index cf19c67..a05b23a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs @@ -16,12 +16,12 @@ public class OperateLogService : DbRepository, IOperateLogService /// /// 操作日志中文名称 /// - private readonly string NameOperate = "操作日志"; + private readonly string _nameOperate = "操作日志"; /// /// 异常日志中文名称 /// - private readonly string NameExecption = "异常日志"; + private readonly string _nameExecption = "异常日志"; /// public async Task> Page(OperateLogPageInput input) @@ -60,15 +60,15 @@ public class OperateLogService : DbRepository, IOperateLogService .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 .Select((x1, x2) => new - { - OperateCount = - SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_OPERATE, + { + OperateCount = + SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.LOG_OPERATE, 1, 0)),//null的数据要为0所以不能用count - ExceptionCount = - SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_EXCEPTION, + ExceptionCount = + SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.LOG_EXCEPTION, 1, 0)),//null的数据要为0所以不能用count - Date = x1.ColumnName.ToString("yyyy-MM-dd") - } + Date = x1.ColumnName.ToString("yyyy-MM-dd") + } ).ToListAsync(); //定义返回结果 List result = new List(); @@ -76,9 +76,9 @@ public class OperateLogService : DbRepository, IOperateLogService list.ForEach(it => { result.Add(new OperateLogDayStatisticsOutput - { Date = it.Date, Name = NameOperate, Count = it.OperateCount });//添加访问日志 + { Date = it.Date, Name = _nameOperate, Count = it.OperateCount });//添加访问日志 result.Add(new OperateLogDayStatisticsOutput - { Date = it.Date, Name = NameExecption, Count = it.ExceptionCount });//添加异常日志 + { Date = it.Date, Name = _nameExecption, Count = it.ExceptionCount });//添加异常日志 }); return result; } @@ -99,15 +99,15 @@ public class OperateLogService : DbRepository, IOperateLogService //添加操作日志数据 new OperateLogTotalCountOutpu { - Type = NameOperate, - Value = data.Where(it => it.Category == CateGoryConst.Log_OPERATE) + Type = _nameOperate, + Value = data.Where(it => it.Category == CateGoryConst.LOG_OPERATE) .Select(it => it.Count).FirstOrDefault() }, //添加异常日志数据 new OperateLogTotalCountOutpu { - Type = NameExecption, - Value = data.Where(it => it.Category == CateGoryConst.Log_EXCEPTION) + Type = _nameExecption, + Value = data.Where(it => it.Category == CateGoryConst.LOG_EXCEPTION) .Select(it => it.Count).FirstOrDefault() } }; @@ -125,4 +125,4 @@ public class OperateLogService : DbRepository, IOperateLogService { return await GetFirstAsync(it => it.Id == input.Id);//删除对应分类日志 } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs index 38c7dbf..00ab696 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs @@ -53,15 +53,15 @@ public class VisitLogService : DbRepository, IVisitLogService .GroupBy((x1, x2) => x1.ColumnName)//根据时间分组 .OrderBy((x1, x2) => x1.ColumnName)//根据时间升序排序 .Select((x1, x2) => new VisitLogDayStatisticsOutput - { - LoginCount = - SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGIN, 1, + { + LoginCount = + SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.LOG_LOGIN, 1, 0)),//null的数据要为0所以不能用count - LogoutCount = - SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.Log_LOGOUT, 1, + LogoutCount = + SqlFunc.AggregateSum(SqlFunc.IIF(x2.Category == CateGoryConst.LOG_LOGOUT, 1, 0)),//null的数据要为0所以不能用count - Date = x1.ColumnName.ToString("yyyy-MM-dd") - } + Date = x1.ColumnName.ToString("yyyy-MM-dd") + } ) .ToListAsync(); return list; @@ -83,15 +83,15 @@ public class VisitLogService : DbRepository, IVisitLogService //添加登录数据 new VisitLogTotalCountOutput { - Type = EventSubscriberConst.LoginB, - Value = data.Where(it => it.Category == CateGoryConst.Log_LOGIN) + Type = EventSubscriberConst.LOGIN_B, + Value = data.Where(it => it.Category == CateGoryConst.LOG_LOGIN) .Select(it => it.Count).FirstOrDefault() }, //添加登出数据 new VisitLogTotalCountOutput { - Type = EventSubscriberConst.LoginOutB, - Value = data.Where(it => it.Category == CateGoryConst.Log_LOGOUT) + Type = EventSubscriberConst.LOGIN_OUT_B, + Value = data.Where(it => it.Category == CateGoryConst.LOG_LOGOUT) .Select(it => it.Count).FirstOrDefault() } }; @@ -103,4 +103,4 @@ public class VisitLogService : DbRepository, IVisitLogService { await DeleteAsync(it => it.Category == category);//删除对应分类日志 } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs index 9376e63..2cdabc6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs @@ -21,7 +21,7 @@ public class ConfigService : DbRepository, IConfigService /// public async Task> GetListByCategory(string category) { - var key = SystemConst.Cache_DevConfig + category;//系统配置key + var key = SystemConst.CACHE_DEV_CONFIG + category;//系统配置key //先从redis拿配置 var configList = _simpleCacheService.Get>(key); if (configList == null) @@ -49,7 +49,7 @@ public class ConfigService : DbRepository, IConfigService public async Task> Page(ConfigPageInput input) { var query = Context.Queryable() - .Where(it => it.Category == CateGoryConst.Config_BIZ_DEFINE)//自定义配置 + .Where(it => it.Category == CateGoryConst.CONFIG_BIZ_DEFINE)//自定义配置 .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.ConfigKey.Contains(input.SearchKey) || it.ConfigKey.Contains(input.SearchKey))//根据关键字查询 @@ -66,7 +66,7 @@ public class ConfigService : DbRepository, IConfigService await CheckInput(input); var devConfig = input.Adapt();//实体转换 if (await InsertAsync(devConfig))//插入数据) - await RefreshCache(CateGoryConst.Config_BIZ_DEFINE);//刷新缓存 + await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存 } /// @@ -75,18 +75,18 @@ public class ConfigService : DbRepository, IConfigService await CheckInput(input); var devConfig = input.Adapt();//实体转换 if (await UpdateAsync(devConfig))//更新数据 - await RefreshCache(CateGoryConst.Config_BIZ_DEFINE);//刷新缓存 + await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存 } /// public async Task Delete(ConfigDeleteInput input) { //获取所有业务配置 - var configs = await GetListByCategory(CateGoryConst.Config_BIZ_DEFINE); + var configs = await GetListByCategory(CateGoryConst.CONFIG_BIZ_DEFINE); if (configs.Any(it => it.Id == input.Id))//如果有当前配置 { if (await DeleteByIdAsync(input.Id))//删除配置 - await RefreshCache(CateGoryConst.Config_BIZ_DEFINE);//刷新缓存 + await RefreshCache(CateGoryConst.CONFIG_BIZ_DEFINE);//刷新缓存 } } @@ -127,7 +127,7 @@ public class ConfigService : DbRepository, IConfigService /// private async Task RefreshCache(string category) { - _simpleCacheService.Remove(SystemConst.Cache_DevConfig + category);//redis删除 + _simpleCacheService.Remove(SystemConst.CACHE_DEV_CONFIG + category);//redis删除 await GetListByCategory(category);//重新获取 } @@ -137,7 +137,7 @@ public class ConfigService : DbRepository, IConfigService /// private async Task CheckInput(SysConfig sysConfig) { - var configs = await GetListByCategory(CateGoryConst.Config_BIZ_DEFINE);//获取全部字典 + var configs = await GetListByCategory(CateGoryConst.CONFIG_BIZ_DEFINE);//获取全部字典 //判断是否从存在重复字典名 var hasSameKey = configs.Any(it => it.ConfigKey == sysConfig.ConfigKey && it.Id != sysConfig.Id); @@ -146,8 +146,8 @@ public class ConfigService : DbRepository, IConfigService throw Oops.Bah($"存在重复的配置键:{sysConfig.ConfigKey}"); } //设置分类为业务 - sysConfig.Category = CateGoryConst.Config_BIZ_DEFINE; + sysConfig.Category = CateGoryConst.CONFIG_BIZ_DEFINE; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs index 68da6a6..8b27ebe 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs @@ -65,7 +65,7 @@ public class DictService : DbRepository, IDictService var dicts = await GetListAsync(); //判断是否有系统字典 var frm = dicts.Any(it => - ids.Contains(it.Id) && it.Category == CateGoryConst.Dict_FRM); + ids.Contains(it.Id) && it.Category == CateGoryConst.DICT_FRM); //如果是系统字典提示不可删除 if (frm) throw Oops.Bah("不可删除系统内置字典"); @@ -92,13 +92,13 @@ public class DictService : DbRepository, IDictService public override async Task> GetListAsync() { //先从redis拿 - var devDicts = _simpleCacheService.Get>(SystemConst.Cache_DevDict); + var devDicts = _simpleCacheService.Get>(SystemConst.CACHE_DEV_DICT); if (devDicts == null) { devDicts = await base.GetListAsync();//去数据库拿 if (devDicts.Count > 0) { - _simpleCacheService.Set(SystemConst.Cache_DevDict, devDicts);//如果数据库有数,更新redis + _simpleCacheService.Set(SystemConst.CACHE_DEV_DICT, devDicts);//如果数据库有数,更新redis return devDicts; } } @@ -106,19 +106,19 @@ public class DictService : DbRepository, IDictService } /// - public async Task GetDict(string DictValue) + public async Task GetDict(string dictValue) { var devDicts = await GetListAsync(); - var devDict = devDicts.Where(it => it.DictValue == DictValue).FirstOrDefault(); + var devDict = devDicts.Where(it => it.DictValue == dictValue).FirstOrDefault(); return devDict; } /// - public async Task> GetValuesByDictValue(string DictValue, + public async Task> GetValuesByDictValue(string dictValue, List devDictList = null) { var devDicts = devDictList == null ? await GetListAsync() : devDictList;//获取全部 - var id = devDicts.Where(it => it.DictValue == DictValue).Select(it => it.Id) + var id = devDicts.Where(it => it.DictValue == dictValue).Select(it => it.Id) .FirstOrDefault();//根据value找到父节点 if (id > 0) return devDicts.Where(it => it.ParentId == id).Select(it => it.DictValue) @@ -128,13 +128,13 @@ public class DictService : DbRepository, IDictService } /// - public async Task>> GetValuesByDictValue(string[] DictValues) + public async Task>> GetValuesByDictValue(string[] dictValues) { var result = new Dictionary>(); var devDicts = await GetListAsync();//获取全部 - var ids = devDicts.Where(it => DictValues.Contains(it.DictValue)).Select(it => it.Id) + var ids = devDicts.Where(it => dictValues.Contains(it.DictValue)).Select(it => it.Id) .ToList();//根据value找到父节点 - foreach (var dictValue in DictValues) + foreach (var dictValue in dictValues) { var data = await GetValuesByDictValue(dictValue, devDicts); result.Add(dictValue, data); @@ -178,7 +178,7 @@ public class DictService : DbRepository, IDictService /// private async Task RefreshCache() { - _simpleCacheService.Remove(SystemConst.Cache_DevDict); + _simpleCacheService.Remove(SystemConst.CACHE_DEV_DICT); await GetListAsync(); } @@ -232,4 +232,4 @@ public class DictService : DbRepository, IDictService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs index 27d1fe1..de274c3 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/IDictService.cs @@ -45,9 +45,9 @@ public interface IDictService : ITransient /// /// 获取字典 /// - /// 字典 + /// 字典 /// - Task GetDict(string DictValue); + Task GetDict(string dictValue); /// /// 获取所有 @@ -58,17 +58,17 @@ public interface IDictService : ITransient /// /// 根据字典DictValue获取字典值列表 /// - /// 字典值 + /// 字典值 /// 字典列表 /// 字典值列表 - Task> GetValuesByDictValue(string DictValue, List devDictList = null); + Task> GetValuesByDictValue(string dictValue, List devDictList = null); /// /// 根据字典DictValue列表获取对应字典值列表 /// - /// 字典值列表 + /// 字典值列表 /// - Task>> GetValuesByDictValue(string[] DictValues); + Task>> GetValuesByDictValue(string[] dictValues); /// /// 字典分页查询 @@ -83,4 +83,4 @@ public interface IDictService : ITransient /// 查询参数 /// 字典树形结构 Task> Tree(DictTreeInput input); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs index d7e50a0..c3a7471 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs @@ -95,7 +95,7 @@ public interface ISysOrgService : ITransient /// 添加参数 /// 名称 /// - Task Add(SysOrgAddInput input, string name = SimpleAdminConst.SysOrg); + Task Add(SysOrgAddInput input, string name = SimpleAdminConst.SYS_ORG); /// /// 复制组织 @@ -114,7 +114,7 @@ public interface ISysOrgService : ITransient /// 编辑参数 /// 名称 /// - Task Edit(SysOrgEditInput input, string name = SimpleAdminConst.SysOrg); + Task Edit(SysOrgEditInput input, string name = SimpleAdminConst.SYS_ORG); #endregion 编辑 @@ -126,7 +126,7 @@ public interface ISysOrgService : ITransient /// 删除参数 /// 名称 /// - Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SysOrg); + Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SYS_ORG); #endregion 删除 @@ -155,4 +155,4 @@ public interface ISysOrgService : ITransient Task> Tree(List orgIds = null, SysOrgTreeInput treeInput = null); #endregion 其他 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs index facac15..c421fc9 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs @@ -27,7 +27,7 @@ public class SysOrgService : DbRepository, ISysOrgService public override async Task> GetListAsync() { //先从Redis拿 - var sysOrgs = _simpleCacheService.Get>(SystemConst.Cache_SysOrg); + var sysOrgs = _simpleCacheService.Get>(SystemConst.CACHE_SYS_ORG); if (sysOrgs == null) { //redis没有就去数据库拿 @@ -35,7 +35,7 @@ public class SysOrgService : DbRepository, ISysOrgService if (sysOrgs.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.Cache_SysOrg, sysOrgs); + _simpleCacheService.Set(SystemConst.CACHE_SYS_ORG, sysOrgs); } } return sysOrgs; @@ -96,7 +96,7 @@ public class SysOrgService : DbRepository, ISysOrgService /// public async Task> Tree(List orgIds = null, SysOrgTreeInput treeInput = null) { - long parentId = SimpleAdminConst.Zero;//父级ID + long parentId = SimpleAdminConst.ZERO;//父级ID //获取所有组织 var sysOrgs = await GetListAsync(); if (orgIds != null) @@ -167,7 +167,7 @@ public class SysOrgService : DbRepository, ISysOrgService #region 新增 /// - public async Task Add(SysOrgAddInput input, string name = SimpleAdminConst.SysOrg) + public async Task Add(SysOrgAddInput input, string name = SimpleAdminConst.SYS_ORG) { await CheckInput(input, name);//检查参数 var sysOrg = input.Adapt();//实体转换 @@ -188,7 +188,7 @@ public class SysOrgService : DbRepository, ISysOrgService throw Oops.Bah($"不能包含自己"); //获取目标组织 var target = orgList.Where(it => it.Id == input.TargetId).FirstOrDefault(); - if (target != null || input.TargetId == SimpleAdminConst.Zero) + if (target != null || input.TargetId == SimpleAdminConst.ZERO) { //需要复制的组织名称列表 var orgNames = orgList.Where(it => ids.Contains(it.Id)).Select(it => it.Name).ToList(); @@ -223,7 +223,7 @@ public class SysOrgService : DbRepository, ISysOrgService //遍历机构重新赋值全称 addOrgList.ForEach(it => { - it.Names = it.ParentId == SimpleAdminConst.Zero + it.Names = it.ParentId == SimpleAdminConst.ZERO ? it.Name : GetNames(orgList, it.ParentId, it.Name); }); @@ -238,7 +238,7 @@ public class SysOrgService : DbRepository, ISysOrgService #region 编辑 /// - public async Task Edit(SysOrgEditInput input, string name = SimpleAdminConst.SysOrg) + public async Task Edit(SysOrgEditInput input, string name = SimpleAdminConst.SYS_ORG) { await CheckInput(input, name);//检查参数 var sysOrg = input.Adapt();//实体转换 @@ -251,7 +251,7 @@ public class SysOrgService : DbRepository, ISysOrgService #region 删除 /// - public async Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SysOrg) + public async Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SYS_ORG) { //获取所有ID var ids = input.Ids; @@ -311,8 +311,8 @@ public class SysOrgService : DbRepository, ISysOrgService /// public async Task RefreshCache() { - _simpleCacheService.Remove(SystemConst.Cache_SysOrg);//从redis删除 - _simpleCacheService.Remove(SystemConst.Cache_SysUser);//清空redis所有的用户信息 + _simpleCacheService.Remove(SystemConst.CACHE_SYS_ORG);//从redis删除 + _simpleCacheService.Remove(SystemConst.CACHE_SYS_USER);//清空redis所有的用户信息 await GetListAsync();//刷新缓存 } @@ -346,8 +346,8 @@ public class SysOrgService : DbRepository, ISysOrgService private async Task CheckInput(SysOrg sysOrg, string name) { //判断分类是否正确 - if (sysOrg.Category != CateGoryConst.Org_COMPANY - && sysOrg.Category != CateGoryConst.Org_DEPT) + if (sysOrg.Category != CateGoryConst.ORG_COMPANY + && sysOrg.Category != CateGoryConst.ORG_DEPT) throw Oops.Bah($"{name}所属分类错误:{sysOrg.Category}"); var sysOrgs = await GetListAsync();//获取全部 @@ -506,4 +506,4 @@ public class SysOrgService : DbRepository, ISysOrgService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs index f0414a7..1f39a28 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs @@ -19,7 +19,7 @@ public interface ISysPositionService : ITransient /// 添加参数 /// 名称 /// - Task Add(PositionAddInput input, string name = SimpleAdminConst.SysPos); + Task Add(PositionAddInput input, string name = SimpleAdminConst.SYS_POS); /// /// 删除职位 @@ -27,7 +27,7 @@ public interface ISysPositionService : ITransient /// id列表 /// 名称 /// - Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SysPos); + Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SYS_POS); /// /// 编辑职位 @@ -35,7 +35,7 @@ public interface ISysPositionService : ITransient /// 编辑参数 /// 名称 /// - Task Edit(PositionEditInput input, string name = SimpleAdminConst.SysPos); + Task Edit(PositionEditInput input, string name = SimpleAdminConst.SYS_POS); /// /// 获取职位列表 @@ -76,4 +76,4 @@ public interface ISysPositionService : ITransient /// /// Task> GetPositionListByIdList(IdListInput input); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs index 5a79b52..340409b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs @@ -30,7 +30,7 @@ public class SysPositionService : DbRepository, ISysPositionService { //先从Redis拿 var sysPositions = - _simpleCacheService.Get>(SystemConst.Cache_SysPosition); + _simpleCacheService.Get>(SystemConst.CACHE_SYS_POSITION); if (sysPositions == null) { //redis没有就去数据库拿 @@ -38,7 +38,7 @@ public class SysPositionService : DbRepository, ISysPositionService if (sysPositions.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.Cache_SysPosition, sysPositions); + _simpleCacheService.Set(SystemConst.CACHE_SYS_POSITION, sysPositions); } } return sysPositions; @@ -93,7 +93,7 @@ public class SysPositionService : DbRepository, ISysPositionService } /// - public async Task Add(PositionAddInput input, string name = SimpleAdminConst.SysPos) + public async Task Add(PositionAddInput input, string name = SimpleAdminConst.SYS_POS) { await CheckInput(input, name);//检查参数 var sysPosition = input.Adapt();//实体转换 @@ -103,7 +103,7 @@ public class SysPositionService : DbRepository, ISysPositionService } /// - public async Task Edit(PositionEditInput input, string name = SimpleAdminConst.SysPos) + public async Task Edit(PositionEditInput input, string name = SimpleAdminConst.SYS_POS) { await CheckInput(input, name);//检查参数 var sysPosition = input.Adapt();//实体转换 @@ -112,7 +112,7 @@ public class SysPositionService : DbRepository, ISysPositionService } /// - public async Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SysPos) + public async Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SYS_POS) { //获取所有ID var ids = input.Ids; @@ -150,7 +150,7 @@ public class SysPositionService : DbRepository, ISysPositionService /// public async Task RefreshCache() { - _simpleCacheService.Remove(SystemConst.Cache_SysPosition);//删除Key + _simpleCacheService.Remove(SystemConst.CACHE_SYS_POSITION);//删除Key await GetListAsync();//重新写入缓存 } @@ -166,7 +166,7 @@ public class SysPositionService : DbRepository, ISysPositionService //所有分类放一个列表 var positionCategorys = new List() { - CateGoryConst.Position_HIGH, CateGoryConst.Position_LOW, CateGoryConst.Position_MIDDLE + CateGoryConst.POSITION_HIGH, CateGoryConst.POSITION_LOW, CateGoryConst.POSITION_MIDDLE }; if (!positionCategorys.Contains(sysPosition.Category)) throw Oops.Bah($"{name}所属分类错误:{sysPosition.Category}"); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs index c21eff0..124445b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs @@ -86,7 +86,7 @@ public class SysUserService : DbRepository, ISysUserService public async Task GetIdByPhone(string phone) { //先从Redis拿 - var userId = _simpleCacheService.HashGetOne(SystemConst.Cache_SysUserPhone, phone); + var userId = _simpleCacheService.HashGetOne(SystemConst.CACHE_SYS_USER_PHONE, phone); if (userId == 0) { phone = CryptogramUtil.Sm4Encrypt(phone);//SM4加密一下 @@ -95,7 +95,7 @@ public class SysUserService : DbRepository, ISysUserService if (userId > 0) { //插入Redis - _simpleCacheService.HashAdd(SystemConst.Cache_SysUserPhone, phone, userId); + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_USER_PHONE, phone, userId); } } return userId; @@ -106,7 +106,7 @@ public class SysUserService : DbRepository, ISysUserService { //先从Redis拿 var sysUser = - _simpleCacheService.HashGetOne(SystemConst.Cache_SysUser, userId.ToString()); + _simpleCacheService.HashGetOne(SystemConst.CACHE_SYS_USER, userId.ToString()); if (sysUser == null) { sysUser = await GetUserFromDb(userId);//从数据库拿用户信息 @@ -119,7 +119,7 @@ public class SysUserService : DbRepository, ISysUserService { //先从Redis拿 var sysUser = - _simpleCacheService.HashGetOne(SystemConst.Cache_SysUser, userId.ToString()); + _simpleCacheService.HashGetOne(SystemConst.CACHE_SYS_USER, userId.ToString()); if (sysUser == null) { var user = await GetUserFromDb(userId);//从数据库拿用户信息 @@ -136,7 +136,7 @@ public class SysUserService : DbRepository, ISysUserService { //先从Redis拿 var userId = - _simpleCacheService.HashGetOne(SystemConst.Cache_SysUserAccount, account); + _simpleCacheService.HashGetOne(SystemConst.CACHE_SYS_USER_ACCOUNT, account); if (userId == 0) { //单查获取用户账号对应ID @@ -144,7 +144,7 @@ public class SysUserService : DbRepository, ISysUserService if (userId != 0) { //插入Redis - _simpleCacheService.HashAdd(SystemConst.Cache_SysUserAccount, account, userId); + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_USER_ACCOUNT, account, userId); } } return userId; @@ -157,20 +157,20 @@ public class SysUserService : DbRepository, ISysUserService //获取用户资源集合 var resourceList = await _relationService.GetRelationListByObjectIdAndCategory(userId, - CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); + CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE); var buttonIdList = new List();//按钮ID集合 if (resourceList.Count == 0)//如果有表示用户单独授权了不走用户角色 { //获取用户角色关系集合 var roleList = await _relationService.GetRelationListByObjectIdAndCategory(userId, - CateGoryConst.Relation_SYS_USER_HAS_ROLE); + CateGoryConst.RELATION_SYS_USER_HAS_ROLE); var roleIdList = roleList.Select(x => x.TargetId.ToLong()).ToList();//角色ID列表 if (roleIdList.Count > 0)//如果该用户有角色 { resourceList = await _relationService.GetRelationListByObjectIdListAndCategory(roleIdList, - CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE);//获取资源集合 + CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//获取资源集合 } } resourceList.ForEach(it => @@ -182,7 +182,7 @@ public class SysUserService : DbRepository, ISysUserService if (buttonIdList.Count > 0) { buttonCodeList = - await _resourceService.GetCodeByIds(buttonIdList, CateGoryConst.Resource_BUTTON); + await _resourceService.GetCodeByIds(buttonIdList, CateGoryConst.RESOURCE_BUTTON); } return buttonCodeList; } @@ -193,18 +193,18 @@ public class SysUserService : DbRepository, ISysUserService var permissions = new List();//权限集合 var sysRelations = await _relationService.GetRelationListByObjectIdAndCategory(userId, - CateGoryConst.Relation_SYS_USER_HAS_PERMISSION);//根据用户ID获取用户权限 + CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION);//根据用户ID获取用户权限 if (sysRelations.Count == 0)//如果有表示用户单独授权了不走用户角色 { var roleIdList = await _relationService.GetRelationListByObjectIdAndCategory(userId, - CateGoryConst.Relation_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID + CateGoryConst.RELATION_SYS_USER_HAS_ROLE);//根据用户ID获取角色ID if (roleIdList.Count > 0)//如果角色ID不为空 { //获取角色权限信息 sysRelations = await _relationService.GetRelationListByObjectIdListAndCategory( roleIdList.Select(it => it.TargetId.ToLong()).ToList(), - CateGoryConst.Relation_SYS_ROLE_HAS_PERMISSION); + CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION); } } var relationGroup = @@ -323,14 +323,14 @@ public class SysUserService : DbRepository, ISysUserService { var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, - CateGoryConst.Relation_SYS_USER_HAS_ROLE); + CateGoryConst.RELATION_SYS_USER_HAS_ROLE); return relations.Select(it => it.TargetId.ToLong()).ToList(); } /// public async Task OwnResource(BaseIdInput input) { - return await _roleService.OwnResource(input, CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); + return await _roleService.OwnResource(input, CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE); } /// @@ -343,7 +343,7 @@ public class SysUserService : DbRepository, ISysUserService var grantInfoList = new List();//已授权信息集合 //获取关系列表 var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, - CateGoryConst.Relation_SYS_USER_HAS_PERMISSION); + CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION); //遍历关系表 relations.ForEach(it => { @@ -362,14 +362,14 @@ public class SysUserService : DbRepository, ISysUserService //获取用户资源关系 var relationsRes = await _relationService.GetRelationByCategory(CateGoryConst - .Relation_SYS_USER_HAS_RESOURCE); + .RELATION_SYS_USER_HAS_RESOURCE); var menuIds = relationsRes.Where(it => it.ObjectId == input.Id) .Select(it => it.TargetId.ToLong()).ToList(); if (menuIds.Any()) { //获取菜单信息 var menus = - await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); + await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.RESOURCE_MENU); //获取权限授权树 var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList()); @@ -429,7 +429,7 @@ public class SysUserService : DbRepository, ISysUserService var exist = await GetUserById(input.Id);//获取用户信息 if (exist != null) { - var isSuperAdmin = exist.Account == RoleConst.SuperAdmin;//判断是否有超管 + var isSuperAdmin = exist.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin && !UserManager.SuperAdmin) throw Oops.Bah($"不可修改系统内置超管用户账号"); var name = exist.Name;//姓名 @@ -454,7 +454,7 @@ public class SysUserService : DbRepository, ISysUserService { DeleteUserFromRedis(sysUser.Id);//删除用户缓存 //删除用户token缓存 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, new string[] { sysUser.Id.ToString() }); } } @@ -478,10 +478,10 @@ public class SysUserService : DbRepository, ISysUserService var sysUser = await GetUserById(input.Id);//获取用户信息 if (sysUser != null) { - var isSuperAdmin = sysUser.Account == RoleConst.SuperAdmin;//判断是否有超管 + var isSuperAdmin = sysUser.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin) throw Oops.Bah($"不可禁用系统内置超管用户账号"); - CheckSelf(input.Id, SimpleAdminConst.Disable);//判断是不是自己 + CheckSelf(input.Id, SimpleAdminConst.DISABLE);//判断是不是自己 //设置状态为禁用 if (await UpdateAsync(it => new SysUser { @@ -494,7 +494,7 @@ public class SysUserService : DbRepository, ISysUserService /// public async Task EnableUser(BaseIdInput input) { - CheckSelf(input.Id, SimpleAdminConst.Enable);//判断是不是自己 + CheckSelf(input.Id, SimpleAdminConst.ENABLE);//判断是不是自己 //设置状态为启用 if (await UpdateAsync(it => new SysUser { @@ -521,12 +521,12 @@ public class SysUserService : DbRepository, ISysUserService var sysUser = await GetUserById(input.Id);//获取用户信息 if (sysUser != null) { - var isSuperAdmin = sysUser.Account == RoleConst.SuperAdmin;//判断是否有超管 + var isSuperAdmin = sysUser.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin) throw Oops.Bah($"不能给超管分配角色"); - CheckSelf(input.Id, SimpleAdminConst.GrantRole);//判断是不是自己 + CheckSelf(input.Id, SimpleAdminConst.GRANT_ROLE);//判断是不是自己 //给用户赋角色 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_USER_HAS_ROLE, + await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_USER_HAS_ROLE, input.Id, input.RoleIdList.Select(it => it.ToString()).ToList(), null, true); DeleteUserFromRedis(input.Id);//从redis删除用户信息 @@ -552,7 +552,7 @@ public class SysUserService : DbRepository, ISysUserService { ObjectId = sysUser.Id, TargetId = menuIds[i].ToString(), - Category = CateGoryConst.Relation_SYS_USER_HAS_RESOURCE, + Category = CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE, ExtJson = extJsons == null ? null : extJsons[i] }); } @@ -566,7 +566,7 @@ public class SysUserService : DbRepository, ISysUserService //获取菜单信息 var menus = - await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.Resource_MENU); + await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.RESOURCE_MENU); if (menus.Count > 0) { //获取权限授权树 @@ -579,7 +579,7 @@ public class SysUserService : DbRepository, ISysUserService { ObjectId = sysUser.Id, TargetId = it.ApiRoute, - Category = CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, + Category = CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION, ExtJson = new RelationRolePermission { ApiUrl = it.ApiRoute, @@ -596,21 +596,21 @@ public class SysUserService : DbRepository, ISysUserService #region 保存数据库 //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { var relatioRep = ChangeRepository>();//切换仓储 await relatioRep.DeleteAsync(it => it.ObjectId == sysUser.Id - && (it.Category == CateGoryConst.Relation_SYS_USER_HAS_PERMISSION - || it.Category == CateGoryConst.Relation_SYS_USER_HAS_RESOURCE)); + && (it.Category == CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION + || it.Category == CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE)); await relatioRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 { await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_USER_HAS_PERMISSION);//刷新关系缓存 + .RELATION_SYS_USER_HAS_PERMISSION);//刷新关系缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_USER_HAS_RESOURCE);//刷新关系缓存 + .RELATION_SYS_USER_HAS_RESOURCE);//刷新关系缓存 DeleteUserFromRedis(input.Id);//删除该用户缓存 } else @@ -632,7 +632,7 @@ public class SysUserService : DbRepository, ISysUserService { var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiurl列表 var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 - await _relationService.SaveRelationBatch(CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, + await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION, input.Id, apiUrls, extJsons, true);//添加到数据库 DeleteUserFromRedis(input.Id); @@ -651,7 +651,7 @@ public class SysUserService : DbRepository, ISysUserService if (ids.Count > 0) { var containsSuperAdmin = await IsAnyAsync(it => - it.Account == RoleConst.SuperAdmin && ids.Contains(it.Id));//判断是否有超管 + it.Account == SysRoleConst.SUPER_ADMIN && ids.Contains(it.Id));//判断是否有超管 if (containsSuperAdmin) throw Oops.Bah($"不可删除系统内置超管用户"); if (ids.Contains(UserManager.UserId)) @@ -691,12 +691,12 @@ public class SysUserService : DbRepository, ISysUserService //定义删除的关系 var delRelations = new List { - CateGoryConst.Relation_SYS_USER_HAS_RESOURCE, - CateGoryConst.Relation_SYS_USER_HAS_PERMISSION, - CateGoryConst.Relation_SYS_USER_HAS_ROLE + CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE, + CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION, + CateGoryConst.RELATION_SYS_USER_HAS_ROLE }; //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { //清除该用户作为主管信息 await UpdateAsync(it => new SysUser @@ -719,15 +719,15 @@ public class SysUserService : DbRepository, ISysUserService { DeleteUserFromRedis(ids);//redis删除用户 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 + .RELATION_SYS_USER_HAS_ROLE);//关系表刷新SYS_USER_HAS_ROLE缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_USER_HAS_RESOURCE);//关系表刷新SYS_USER_HAS_ROLE缓存 + .RELATION_SYS_USER_HAS_RESOURCE);//关系表刷新SYS_USER_HAS_ROLE缓存 await _relationService.RefreshCache(CateGoryConst - .Relation_SYS_USER_HAS_PERMISSION);//关系表刷新SYS_USER_HAS_ROLE缓存 + .RELATION_SYS_USER_HAS_PERMISSION);//关系表刷新SYS_USER_HAS_ROLE缓存 // TODO 此处需要将这些用户踢下线,并永久注销这些用户 var idArray = ids.Select(it => it.ToString()).ToArray(); //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.Cache_UserToken, idArray); + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, idArray); } else { @@ -752,19 +752,19 @@ public class SysUserService : DbRepository, ISysUserService { var userIds = ids.Select(it => it.ToString()).ToArray();//id转string列表 var sysUsers = - _simpleCacheService.HashGet(SystemConst.Cache_SysUser, userIds);//获取用户列表 + _simpleCacheService.HashGet(SystemConst.CACHE_SYS_USER, userIds);//获取用户列表 sysUsers = sysUsers.Where(it => it != null).ToList();//过滤掉不存在的 if (sysUsers.Count > 0) { var accounts = sysUsers.Select(it => it.Account).ToArray();//账号集合 var phones = sysUsers.Select(it => it.Phone).ToArray();//手机号集合 //删除用户信息 - _simpleCacheService.HashDel(SystemConst.Cache_SysUser, userIds); + _simpleCacheService.HashDel(SystemConst.CACHE_SYS_USER, userIds); //删除账号 - _simpleCacheService.HashDel(SystemConst.Cache_SysUserAccount, accounts); + _simpleCacheService.HashDel(SystemConst.CACHE_SYS_USER_ACCOUNT, accounts); //删除手机 if (phones != null) - _simpleCacheService.HashDel(SystemConst.Cache_SysUserPhone, phones); + _simpleCacheService.HashDel(SystemConst.CACHE_SYS_USER_PHONE, phones); } } @@ -965,7 +965,7 @@ public class SysUserService : DbRepository, ISysUserService private async Task GetDefaultPassWord(bool isSm4 = false) { //获取默认密码 - var defaultPassword = (await _configService.GetByConfigKey(CateGoryConst.Config_PWD_POLICY, + var defaultPassword = (await _configService.GetByConfigKey(CateGoryConst.CONFIG_PWD_POLICY, SysConfigConst.PWD_DEFAULT_PASSWORD)).ConfigValue; return isSm4 ? CryptogramUtil.Sm4Encrypt(defaultPassword) : defaultPassword;//判断是否需要加密 } @@ -1107,14 +1107,14 @@ public class SysUserService : DbRepository, ISysUserService var moduleIds = await _relationService.GetModuleByRoleId(sysUser.RoleIdList);//获取模块列表 var modules = await _resourceService.GetResourcesByIds(moduleIds, - CateGoryConst.Resource_MODULE);//获取模块列表 + CateGoryConst.RESOURCE_MODULE);//获取模块列表 sysUser.ModuleList = modules;//模块列表赋值给用户 //插入Redis - _simpleCacheService.HashAdd(SystemConst.Cache_SysUser, sysUser.Id.ToString(), sysUser); + _simpleCacheService.HashAdd(SystemConst.CACHE_SYS_USER, sysUser.Id.ToString(), sysUser); return sysUser; } return null; } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs index 8c5c67c..cd926af 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs @@ -25,7 +25,7 @@ public class Relationservice : DbRepository, IRelationService /// public async Task> GetRelationByCategory(string category) { - var key = SystemConst.Cache_SysRelation + category; + var key = SystemConst.CACHE_SYS_RELATION + category; //先从Redis拿 var sysRelations = _simpleCacheService.Get>(key); if (sysRelations == null) @@ -52,7 +52,7 @@ public class Relationservice : DbRepository, IRelationService /// public async Task GetWorkbench(long userId) { - var sysRelations = await GetRelationByCategory(CateGoryConst.Relation_SYS_USER_WORKBENCH_DATA); + var sysRelations = await GetRelationByCategory(CateGoryConst.RELATION_SYS_USER_WORKBENCH_DATA); var result = sysRelations.Where(it => it.ObjectId == userId).FirstOrDefault();//获取个人工作台 return result; } @@ -84,7 +84,7 @@ public class Relationservice : DbRepository, IRelationService /// public async Task RefreshCache(string category) { - var key = SystemConst.Cache_SysRelation + category;//key + var key = SystemConst.CACHE_SYS_RELATION + category;//key _simpleCacheService.Remove(key);//删除redis await GetRelationByCategory(category);//更新缓存 } @@ -105,7 +105,7 @@ public class Relationservice : DbRepository, IRelationService }); } //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { if (clear) await DeleteAsync(it => it.ObjectId == objectId && it.Category == category);//删除老的 @@ -135,7 +135,7 @@ public class Relationservice : DbRepository, IRelationService ExtJson = extJson }; //事务 - var result = await itenant.UseTranAsync(async () => + var result = await Itenant.UseTranAsync(async () => { if (clear) await DeleteAsync(it => it.ObjectId == objectId && it.Category == category);//删除老的 @@ -158,11 +158,11 @@ public class Relationservice : DbRepository, IRelationService public async Task> GetModuleByRoleId(List roleIdList) { var moduleIds = new List(); - var relation = await GetRelationByCategory(CateGoryConst.Relation_SYS_ROLE_HAS_MODULE);//获取关系集合 + var relation = await GetRelationByCategory(CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE);//获取关系集合 if (relation != null && relation.Count > 0) { moduleIds = relation.Where(it => roleIdList.Contains(it.ObjectId)).Select(it => it.TargetId.ToLong()).ToList(); } return moduleIds; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs index 44a615e..3451ccd 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs @@ -41,8 +41,8 @@ public class ResourceService : DbRepository, IResourceService ? categoryList : new List { - CateGoryConst.Resource_MENU, CateGoryConst.Resource_BUTTON, - CateGoryConst.Resource_SPA, CateGoryConst.Resource_MODULE + CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_BUTTON, + CateGoryConst.RESOURCE_SPA, CateGoryConst.RESOURCE_MODULE }; //遍历列表 foreach (var category in categoryList) @@ -61,7 +61,7 @@ public class ResourceService : DbRepository, IResourceService //获取所有的菜单和模块以及单页面列表, var sysResources = await GetListAsync(new List { - CateGoryConst.Resource_MODULE, CateGoryConst.Resource_MENU, CateGoryConst.Resource_SPA + CateGoryConst.RESOURCE_MODULE, CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_SPA }); if (sysResources != null) { @@ -77,13 +77,13 @@ public class ResourceService : DbRepository, IResourceService { //获取所有的菜单和模块以及单页面列表, var sysResources = await GetListAsync(new List - { CateGoryConst.Resource_MENU, CateGoryConst.Resource_SPA }); + { CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_SPA }); if (sysResources != null) { //并按分类和排序码排序 sysResources = sysResources .Where(it => - it.Category == CateGoryConst.Resource_SPA || it.Module == id)//根据模块ID获取菜单 + it.Category == CateGoryConst.RESOURCE_SPA || it.Module == id)//根据模块ID获取菜单 .OrderBy(it => it.Category).ThenBy(it => it.SortCode).ToList();//排序 } return sysResources; @@ -96,13 +96,13 @@ public class ResourceService : DbRepository, IResourceService if (category == null) { //删除全部key - _simpleCacheService.DelByPattern(SystemConst.Cache_SysResource); + _simpleCacheService.DelByPattern(SystemConst.CACHE_SYS_RESOURCE); await GetListAsync(); } else { //否则只删除一个Key - _simpleCacheService.Remove(SystemConst.Cache_SysResource + category); + _simpleCacheService.Remove(SystemConst.CACHE_SYS_RESOURCE + category); await GetListByCategory(category); } } @@ -143,7 +143,7 @@ public class ResourceService : DbRepository, IResourceService { //先从Redis拿 var sysResources = - _simpleCacheService.Get>(SystemConst.Cache_SysResource + category); + _simpleCacheService.Get>(SystemConst.CACHE_SYS_RESOURCE + category); if (sysResources == null) { //redis没有就去数据库拿 @@ -151,7 +151,7 @@ public class ResourceService : DbRepository, IResourceService if (sysResources.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.Cache_SysResource + category, sysResources); + _simpleCacheService.Set(SystemConst.CACHE_SYS_RESOURCE + category, sysResources); } } return sysResources; @@ -162,7 +162,7 @@ public class ResourceService : DbRepository, IResourceService { var resourceTreeSelectors = new List();//定义结果 //获取模块列表 - var moduleList = await GetListByCategory(CateGoryConst.Resource_MODULE); + var moduleList = await GetListByCategory(CateGoryConst.RESOURCE_MODULE); //遍历模块 foreach (var module in moduleList) { @@ -326,17 +326,17 @@ public class ResourceService : DbRepository, IResourceService long moduleId) { var roleGrantResourceMenus = new List();//定义结果 - var allMenuList = (await GetListByCategory(CateGoryConst.Resource_MENU)) + var allMenuList = (await GetListByCategory(CateGoryConst.RESOURCE_MENU)) .Where(it => it.Module == moduleId).ToList();//获取所有菜单列表 - var allButtonList = await GetListByCategory(CateGoryConst.Resource_BUTTON);//获取所有按钮列表 + var allButtonList = await GetListByCategory(CateGoryConst.RESOURCE_BUTTON);//获取所有按钮列表 var parentMenuList = - allMenuList.Where(it => it.ParentId == SimpleAdminConst.Zero).ToList();//获取一级目录 + allMenuList.Where(it => it.ParentId == SimpleAdminConst.ZERO).ToList();//获取一级目录 //遍历一级目录 foreach (var parent in parentMenuList) { //如果是目录则去遍历下级 - if (parent.MenuType == ResourceConst.CATALOG) + if (parent.MenuType == SysResourceConst.CATALOG) { //获取所有下级菜单 var menuList = GetChildListById(allMenuList, parent.Id, false); @@ -346,7 +346,7 @@ public class ResourceService : DbRepository, IResourceService foreach (var menu in menuList) { //如果菜单类型是菜单 - if (menu.MenuType is ResourceConst.MENU or ResourceConst.SUBSET) + if (menu.MenuType is SysResourceConst.MENU or SysResourceConst.SUBSET) { //获取菜单下按钮集合并转换成对应实体 var buttonList = allButtonList.Where(it => it.ParentId == menu.Id) @@ -364,8 +364,8 @@ public class ResourceService : DbRepository, IResourceService Button = buttons }); } - else if (menu.MenuType == ResourceConst.LINK - || menu.MenuType == ResourceConst.IFRAME)//如果是内链或者外链 + else if (menu.MenuType == SysResourceConst.LINK + || menu.MenuType == SysResourceConst.IFRAME)//如果是内链或者外链 { //直接加到资源列表 roleGrantResourceMenus.Add(new ResTreeSelector.RoleGrantResourceMenu @@ -403,7 +403,7 @@ public class ResourceService : DbRepository, IResourceService Title = parent.Title }; //如果菜单类型是菜单 - if (parent.MenuType == ResourceConst.MENU) + if (parent.MenuType == SysResourceConst.MENU) { //获取菜单下按钮集合并转换成对应实体 var buttonList = allButtonList.Where(it => it.ParentId == parent.Id).ToList(); @@ -440,4 +440,4 @@ public class ResourceService : DbRepository, IResourceService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs index 9136134..a973689 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs @@ -51,12 +51,12 @@ public class UserCenterService : DbRepository, IUserCenterService //获取用户所拥有的资源集合 var resourceList = await _relationService.GetRelationListByObjectIdAndCategory(userInfo.Id, - CateGoryConst.Relation_SYS_USER_HAS_RESOURCE); + CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE); if (resourceList.Count == 0)//如果没有就获取角色的 //获取角色所拥有的资源集合 resourceList = await _relationService.GetRelationListByObjectIdListAndCategory( - userInfo.RoleIdList, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); + userInfo.RoleIdList, CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); //定义菜单ID列表 var menuIdList = new HashSet(); //获取菜单Id集合 @@ -71,11 +71,11 @@ public class UserCenterService : DbRepository, IUserCenterService { switch (it.Category) { - case CateGoryConst.Resource_MENU://菜单 + case CateGoryConst.RESOURCE_MENU://菜单 allMenuList.Add(it);//添加到菜单列表 break; - case CateGoryConst.Resource_SPA://单页 + case CateGoryConst.RESOURCE_SPA://单页 allSpaList.Add(it);//添加到单页列表 break; } @@ -88,7 +88,7 @@ public class UserCenterService : DbRepository, IUserCenterService // 遍历单页列表 allSpaList.ForEach(it => { - it.ParentId = SimpleAdminConst.Zero; + it.ParentId = SimpleAdminConst.ZERO; }); myMenus.AddRange(allSpaList);//单页添加到菜单 //构建meta @@ -112,7 +112,7 @@ public class UserCenterService : DbRepository, IUserCenterService else { //如果没数据去系统配置里取默认的工作台 - var devConfig = await _configService.GetByConfigKey(CateGoryConst.Config_SYS_BASE, + var devConfig = await _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, SysConfigConst.SYS_DEFAULT_WORKBENCH_DATA); if (devConfig != null) { @@ -130,7 +130,7 @@ public class UserCenterService : DbRepository, IUserCenterService { var orgList = await _sysOrgService.GetListAsync();//获取全部机构 var parentOrgs = _sysOrgService.GetOrgParents(orgList, UserManager.OrgId);//获取父节点列表 - var topOrg = parentOrgs.Where(it => it.ParentId == SimpleAdminConst.Zero) + var topOrg = parentOrgs.Where(it => it.ParentId == SimpleAdminConst.ZERO) .FirstOrDefault();//获取顶级节点 if (topOrg != null) { @@ -223,7 +223,7 @@ public class UserCenterService : DbRepository, IUserCenterService public async Task UpdateWorkbench(UpdateWorkbenchInput input) { //关系表保存个人工作台 - await _relationService.SaveRelation(CateGoryConst.Relation_SYS_USER_WORKBENCH_DATA, + await _relationService.SaveRelation(CateGoryConst.RELATION_SYS_USER_WORKBENCH_DATA, UserManager.UserId, null, input.WorkbenchData, true); } @@ -243,7 +243,7 @@ public class UserCenterService : DbRepository, IUserCenterService if (userInfo.Password != password) throw Oops.Bah("原密码错误"); var newPassword = CryptogramUtil.Sm2Decrypt(input.NewPassword);//sm2解密 var loginPolicy = - await _configService.GetListByCategory(CateGoryConst.Config_PWD_POLICY);//获取密码策略 + await _configService.GetListByCategory(CateGoryConst.CONFIG_PWD_POLICY);//获取密码策略 var containNumber = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_NUM) .ConfigValue.ToBoolean();//是否包含数字 var containLower = loginPolicy.First(it => it.ConfigKey == SysConfigConst.PWD_CONTAIN_LOWER) @@ -354,7 +354,7 @@ public class UserCenterService : DbRepository, IUserCenterService IsKeepAlive = it.IsKeepAlive, IsFull = it.IsFull, ActiveMenu = it.ActiveMenu, - IsLink = it.Category == ResourceConst.LINK ? it.Path : "" + IsLink = it.Category == SysResourceConst.LINK ? it.Path : "" }; it.Meta = meta; }); @@ -393,4 +393,4 @@ public class UserCenterService : DbRepository, IUserCenterService } #endregion 方法 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index ed6838c..f348f69 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -41,67 +41,537 @@ + + + 分类常量 + + + + + 系统基础 + + + + + 登录策略 + + + + + 密码策略 + + + + + 业务定义 + + + + + 文件-本地 + + + + + 文件-MINIO + + + + + MQTT配置 + + + + + 用户有哪些角色 + + + + + 角色有哪些资源 + + + + + 角色有哪些模块 + + + + + 用户有哪些资源 + + + + + 角色有哪些权限 + + + + + 角色有哪些权限 + + + + + 用户工作台数据 + + + + + 用户日程数据 + + + + + 站内信与接收用户 + + + + + 本人 + + + + + 所有 + + + + + 仅所属组织 + + + + + 所属组织及以下 + + + + + 自定义 + + + + + 模块 + + + + + 菜单 + + + + + 单页 + + + + + 按钮 + + + + + 登录 + + + + + 登出 + + + + + 操作 + + + + + 异常 + + + + + 框架 + + + + + 业务 + + + + + 部门 + + + + + 公司 + + + + + 高层 + + + + + 中层 + + + + + 基层 + + + + + 全局 + + + + + 机构 + + + + + 通知 + + + + + 公告 + + + + + 系统配置常量 + + + + + 系统默认工作台 + + + + + 登录验证码开关 + + + + + 登录验证码开关 + + + + + 单用户登录开关 + + + + + 登录错误锁定时长 + + + + + 登录错误锁定时长 + + + + + 登录错误次数 + + + + + 默认用户密码 + + + + + 密码定期提醒更新 + + + + + 密码定期提醒更新时间 + + + + + 修改初始密码提醒 + + + + + 密码最小长度 + + + + + 包含数字 + + + + + 包含小写字母 + + + + + 包含大写字母 + + + + + 包含特殊字符 + + + + + mqtt连接地址 + + + + + mqtt连接用户名 + + + + + mqtt连接密码 + + + + + windows系统本地目录 + + + + + Unix系统本地目录 + + + + + MINIO文件AccessKey + + + + + MINIO文件SecetKey + + + + + MINIO文件EndPoint + + + + + MINIO文件默认存储桶 + + + + + 字典常量 + + + + + 性别 + + + + + 名族 + + + + + 用户证件类型 + + + + + 通用文化程度 + + + + + 启用 + + + + + 停用 + + + + + 在线 + + + + + 离线 + + + + + 本地 + + + + + MINIO + + + + + 系统 + + + + + 业务 + + + + + 日志常量 + + + + + 成功 + + + + + 成功 + + + + + 资源表常量 + + + + + 目录 + + + + + 组件 + + + + + 内链 + + + + + 目录 + + + + + 外链 + + + + + 单页 + + + + + 系统内置单页面编码 + + + + + 角色常量 + + + + + 超级管理员 + + + + + 业务管理员 + + 系统层常量 - + 系统配置表缓存Key - + 登录验证码缓存Key - + 用户表缓存Key - + 用户手机号关系缓存Key - + 用户手机号关系缓存Key - + 资源表缓存Key - + 字典表缓存Key - + 关系表缓存Key - + 机构表缓存Key - + 角色表缓存Key - + 职位表缓存Key - + 登录错误次数缓存Key @@ -1364,27 +1834,27 @@ 事件总线常量 - + B端登录 - + B端登录 - + 清除用户缓存 - + 通知用户下线 - + 新消息 @@ -3601,7 +4071,10 @@ - + + 获取所有 + + @@ -3834,12 +4307,12 @@ - + 操作日志中文名称 - + 异常日志中文名称 @@ -4270,7 +4743,7 @@ 获取字典 - 字典 + 字典 @@ -4283,7 +4756,7 @@ 根据字典DictValue获取字典值列表 - 字典值 + 字典值 字典列表 字典值列表 @@ -4291,7 +4764,7 @@ 根据字典DictValue列表获取对应字典值列表 - 字典值列表 + 字典值列表 diff --git a/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs b/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs index 3059193..2f64c09 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/UserManager/UserManager.cs @@ -16,25 +16,55 @@ public class UserManager /// /// 当前用户Id /// - public static long UserId => (App.User?.FindFirst(ClaimConst.UserId)?.Value).ToLong(); + public static long UserId + { + get + { + return (App.User?.FindFirst(ClaimConst.USER_ID)?.Value).ToLong(); + } + } /// /// 当前用户账号 /// - public static string UserAccount => App.User?.FindFirst(ClaimConst.Account)?.Value; + public static string UserAccount + { + get + { + return App.User?.FindFirst(ClaimConst.ACCOUNT)?.Value; + } + } /// /// 当前用户昵称 /// - public static string Name => App.User?.FindFirst(ClaimConst.Name)?.Value; + public static string Name + { + get + { + return App.User?.FindFirst(ClaimConst.NAME)?.Value; + } + } /// /// 是否超级管理员 /// - public static bool SuperAdmin => (App.User?.FindFirst(ClaimConst.IsSuperAdmin)?.Value).ToBoolean(); + public static bool SuperAdmin + { + get + { + return (App.User?.FindFirst(ClaimConst.IS_SUPER_ADMIN)?.Value).ToBoolean(); + } + } /// /// 机构ID /// - public static long OrgId => (App.User?.FindFirst(ClaimConst.OrgId)?.Value).ToLong(); -} \ No newline at end of file + public static long OrgId + { + get + { + return (App.User?.FindFirst(ClaimConst.ORG_ID)?.Value).ToLong(); + } + } +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs index c500134..bc3551d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs @@ -19,31 +19,31 @@ public sealed class LoggingMonitorComponent : IServiceComponent { //Monitor日志配置 services.AddMonitorLogging(options => - { - options.JsonIndented = true;// 是否美化 JSON - options.GlobalEnabled = true;//全局启用 - options.ConfigureLogger((logger, logContext, context) => - { - var httpContext = context.HttpContext;//获取httpContext - //获取头 - var userAgent = httpContext.Request.Headers["User-Agent"]; - if (string.IsNullOrEmpty(userAgent)) userAgent = "Other";//如果没有这个头就指定一个 - //获取客户端信息 - var client = Parser.GetDefault().Parse(userAgent); - // 获取控制器/操作描述器 - var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; - //操作名称默认是控制器名加方法名,自定义操作名称要在action上加Description特性 - //var option = $"{controllerActionDescriptor.ControllerName}/{controllerActionDescriptor.ActionName}"; - ////获取特性 - //var monitor = controllerActionDescriptor.MethodInfo.GetCustomAttribute(); - //if (monitor != null)//如果有LoggingMonitor特性 - // option = monitor.Description;//则将操作名称赋值为控制器上写的title - //logContext.Set(LoggingConst.Operation, option);//传操作名称 - logContext.Set(LoggingConst.Client, client);//客户端信息 - logContext.Set(LoggingConst.Path, httpContext.Request.Path.Value);//请求地址 - logContext.Set(LoggingConst.Method, httpContext.Request.Method);//请求方法 - }); - }); + { + options.JsonIndented = true;// 是否美化 JSON + options.GlobalEnabled = true;//全局启用 + options.ConfigureLogger((logger, logContext, context) => + { + var httpContext = context.HttpContext;//获取httpContext + //获取头 + var userAgent = httpContext.Request.Headers["User-Agent"]; + if (string.IsNullOrEmpty(userAgent)) userAgent = "Other";//如果没有这个头就指定一个 + //获取客户端信息 + var client = Parser.GetDefault().Parse(userAgent); + // 获取控制器/操作描述器 + var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; + //操作名称默认是控制器名加方法名,自定义操作名称要在action上加Description特性 + //var option = $"{controllerActionDescriptor.ControllerName}/{controllerActionDescriptor.ActionName}"; + ////获取特性 + //var monitor = controllerActionDescriptor.MethodInfo.GetCustomAttribute(); + //if (monitor != null)//如果有LoggingMonitor特性 + // option = monitor.Description;//则将操作名称赋值为控制器上写的title + //logContext.Set(LoggingConst.Operation, option);//传操作名称 + logContext.Set(LoggingConst.CLIENT, client);//客户端信息 + logContext.Set(LoggingConst.PATH, httpContext.Request.Path.Value);//请求地址 + logContext.Set(LoggingConst.METHOD, httpContext.Request.Method);//请求方法 + }); + }); //日志写入数据库配置 services.AddDatabaseLogging(options => { @@ -53,4 +53,4 @@ public sealed class LoggingMonitorComponent : IServiceComponent }; }); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs index 48fa558..80be955 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs @@ -52,7 +52,7 @@ public class AuthBController : IDynamicApiController /// [AllowAnonymous] [HttpPost("login")] - [DisplayName(EventSubscriberConst.LoginB)] + [DisplayName(EventSubscriberConst.LOGIN_B)] public async Task Login(LoginInput input) { return await _authService.Login(input, LoginClientTypeEnum.B); @@ -75,7 +75,7 @@ public class AuthBController : IDynamicApiController /// /// [HttpPost("logout")] - [DisplayName(EventSubscriberConst.LoginOutB)] + [DisplayName(EventSubscriberConst.LOGIN_OUT_B)] public async Task LoginOut([FromBody] LoginOutIput input) { await _authService.LoginOut(input.Token, LoginClientTypeEnum.B); @@ -90,4 +90,4 @@ public class AuthBController : IDynamicApiController { return await _authService.GetLoginUser(); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs index 90e605a..c1e7e73 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Dev/FileController.cs @@ -36,27 +36,27 @@ public class FileController : BaseController /// /// 上传本地文件 /// - /// + /// /// [HttpPost("uploadLocal")] [DisplayName("上传本地文件")] [DisableRequestSizeLimit] - public async Task UploadLocal([FromForm] IFormFile File) + public async Task UploadLocal([FromForm] IFormFile file) { - return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_LOCAL, File); + return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_LOCAL, file); } /// /// 上传MINIO文件 /// - /// + /// /// [HttpPost("uploadMinio")] [DisplayName("上传MINIO文件")] [DisableRequestSizeLimit] - public async Task UploadMinio([FromForm] IFormFile File) + public async Task UploadMinio([FromForm] IFormFile file) { - return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_MINIO, File); + return await _fileService.UploadFile(SysDictConst.FILE_ENGINE_MINIO, file); } /// @@ -82,4 +82,4 @@ public class FileController : BaseController { return await _fileService.Download(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs index 330be0a..4f9ed6f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs @@ -31,7 +31,7 @@ public class MenuController : BaseController [HttpGet("moduleSelector")] public async Task ModuleSelector() { - return await _resourceService.GetListByCategory(CateGoryConst.Resource_MODULE); + return await _resourceService.GetListByCategory(CateGoryConst.RESOURCE_MODULE); } /// @@ -114,4 +114,4 @@ public class MenuController : BaseController { await _menuService.ChangeModule(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs index 21c03fd..6f9a0b5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/RoleController.cs @@ -95,7 +95,7 @@ public class RoleController : BaseController [HttpGet("ownResource")] public async Task OwnResource([FromQuery] BaseIdInput input) { - return await _roleService.OwnResource(input, CateGoryConst.Relation_SYS_ROLE_HAS_RESOURCE); + return await _roleService.OwnResource(input, CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE); } /// @@ -185,4 +185,4 @@ public class RoleController : BaseController { await _roleService.GrantUser(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs index 8ca1d7c..d79e267 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Ops/ConfigController.cs @@ -30,9 +30,9 @@ public class ConfigController : BaseController [AllowAnonymous] public async Task> SysBaseList() { - var sysBase = await _configService.GetListByCategory(CateGoryConst.Config_SYS_BASE);//系统基础 + var sysBase = await _configService.GetListByCategory(CateGoryConst.CONFIG_SYS_BASE);//系统基础 var loginPolicy = - await _configService.GetListByCategory(CateGoryConst.Config_LOGIN_POLICY);//登录策略 + await _configService.GetListByCategory(CateGoryConst.CONFIG_LOGIN_POLICY);//登录策略 sysBase.AddRange(loginPolicy);//合并登录策略 return sysBase; } @@ -105,4 +105,4 @@ public class ConfigController : BaseController { await _configService.EditBatch(devConfigs); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs index 1ba3b9b..f07247d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs @@ -22,10 +22,11 @@ public class JwtHandler : AppAuthorizeHandler /// public override async Task HandleAsync(AuthorizationHandlerContext context) { - var expire = App.GetConfig("JWTSettings:ExpiredTime"); //获取过期时间(分钟) + var expire = App.GetConfig("JWTSettings:ExpiredTime");//获取过期时间(分钟) var currentHttpContext = context.GetCurrentHttpContext(); //自动刷新Token - if (JWTEncryption.AutoRefreshToken(context, currentHttpContext, expire, expire * 2)) + if (JWTEncryption.AutoRefreshToken(context, currentHttpContext, expire, + expire * 2)) { //判断token是否有效 if (CheckTokenFromRedis(currentHttpContext, expire)) @@ -34,12 +35,12 @@ public class JwtHandler : AppAuthorizeHandler } else { - currentHttpContext.Response.StatusCode = 401; //返回401给授权筛选器用 + currentHttpContext.Response.StatusCode = 401;//返回401给授权筛选器用 } } else { - context.Fail(); // 授权失败 + context.Fail();// 授权失败 if (currentHttpContext == null) return; currentHttpContext.SignoutToSwagger(); @@ -54,27 +55,27 @@ public class JwtHandler : AppAuthorizeHandler /// private bool CheckTokenFromRedis(DefaultHttpContext context, int expire) { - var token = JWTEncryption.GetJwtBearerToken(context); //获取当前token - var userId = App.User?.FindFirstValue(ClaimConst.UserId); //获取用户ID - var _simpleCacheService = App.GetService(); //获取redis实例 + var token = JWTEncryption.GetJwtBearerToken(context);//获取当前token + var userId = App.User?.FindFirstValue(ClaimConst.USER_ID);//获取用户ID + var simpleCacheService = App.GetService();//获取redis实例 var tokenInfos = - _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); //获取token信息 - if (tokenInfos == null) //如果还是空 + simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId);//获取token信息 + if (tokenInfos == null)//如果还是空 { return false; } - var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault(); //获取redis中token值是当前token的对象 + var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault();//获取redis中token值是当前token的对象 if (tokenInfo != null) { // 自动刷新token返回新的Token var accessToken = context.Response.Headers["access-token"].ToString(); - if (!string.IsNullOrEmpty(accessToken)) //如果有新的刷新token + if (!string.IsNullOrEmpty(accessToken))//如果有新的刷新token { "返回新的刷新token".LogDebug(); - tokenInfo.Token = accessToken; //新的token - tokenInfo.TokenTimeout = DateTime.Now.AddMinutes(expire); //新的过期时间 - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos); //更新tokne信息到redis + tokenInfo.Token = accessToken;//新的token + tokenInfo.TokenTimeout = DateTime.Now.AddMinutes(expire);//新的过期时间 + simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//更新tokne信息到redis } } else @@ -110,12 +111,12 @@ public class JwtHandler : AppAuthorizeHandler if (UserManager.SuperAdmin) return true; // 获取超级管理员特性 var isSpuerAdmin = httpContext.GetMetadata(); - if (isSpuerAdmin != null) //如果是超级管理员才能访问的接口 + if (isSpuerAdmin != null)//如果是超级管理员才能访问的接口 { //获取忽略超级管理员特性 var ignoreSpuerAdmin = httpContext.GetMetadata(); - if (ignoreSpuerAdmin == null && !UserManager.SuperAdmin) //如果只能超级管理员访问并且用户不是超级管理员 - return false; //直接没权限 + if (ignoreSpuerAdmin == null && !UserManager.SuperAdmin)//如果只能超级管理员访问并且用户不是超级管理员 + return false;//直接没权限 } //获取角色授权特性 @@ -132,16 +133,16 @@ public class JwtHandler : AppAuthorizeHandler var userInfo = await App.GetService().GetUserById(UserManager.UserId); if (userInfo != null) { - if (!userInfo.PermissionCodeList.Contains(routeName)) //如果当前路由信息不包含在角色授权路由列表中则认证失败 + if (!userInfo.PermissionCodeList.Contains(routeName))//如果当前路由信息不包含在角色授权路由列表中则认证失败 return false; } else { - return false; //没有用户信息则返回认证失败 + return false;//没有用户信息则返回认证失败 } } } return true; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs index c55487c..9886436 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs @@ -26,7 +26,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter public DatabaseLoggingWriter(ILogger logger) { - _db = DbContext.Db; + _db = DbContext.DB; _logger = logger; } @@ -44,12 +44,12 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter { //获取操作名称 var operation = loggingMonitor.DisplayTitle; - var client = (ClientInfo)logMsg.Context.Get(LoggingConst.Client);//获取客户端信息 - var path = logMsg.Context.Get(LoggingConst.Path).ToString();//获取操作名称 - var method = logMsg.Context.Get(LoggingConst.Method).ToString();//获取方法 + var client = (ClientInfo)logMsg.Context.Get(LoggingConst.CLIENT);//获取客户端信息 + var path = logMsg.Context.Get(LoggingConst.PATH).ToString();//获取操作名称 + var method = logMsg.Context.Get(LoggingConst.METHOD).ToString();//获取方法 //表示访问日志 - if (operation == EventSubscriberConst.LoginB - || operation == EventSubscriberConst.LoginOutB) + if (operation == EventSubscriberConst.LOGIN_B + || operation == EventSubscriberConst.LOGIN_OUT_B) { //如果没有异常信息 if (loggingMonitor.Exception == null) @@ -87,7 +87,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter { var name = "";//用户姓名 var opAccount = "";//用户账号 - if (operation == EventSubscriberConst.LoginB) + if (operation == EventSubscriberConst.LOGIN_B) { //如果是登录,用户信息就从返回值里拿 var result = loggingMonitor.ReturnInformation.Value.ToJson();//返回值转json @@ -98,18 +98,18 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter else { //如果是登录出,用户信息就从AuthorizationClaims里拿 - name = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.Name) + name = loggingMonitor.AuthorizationClaims.Where(it => it.Type == ClaimConst.NAME) .Select(it => it.Value).FirstOrDefault(); opAccount = loggingMonitor.AuthorizationClaims - .Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault(); + .Where(it => it.Type == ClaimConst.ACCOUNT).Select(it => it.Value).FirstOrDefault(); } //日志表实体 var devLogVisit = new SysLogVisit { Name = operation, - Category = operation == EventSubscriberConst.LoginB - ? CateGoryConst.Log_LOGIN - : CateGoryConst.Log_LOGOUT, + Category = operation == EventSubscriberConst.LOGIN_B + ? CateGoryConst.LOG_LOGIN + : CateGoryConst.LOG_LOGOUT, ExeStatus = SysLogConst.SUCCESS, OpAddress = GetLoginAddress(loggingMonitor.RemoteIPv4), OpIp = loggingMonitor.RemoteIPv4, @@ -134,11 +134,11 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter LoggingMonitorJson loggingMonitor, ClientInfo clientInfo) { //用户名称 - var name = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.Name) + var name = loggingMonitor.AuthorizationClaims?.Where(it => it.Type == ClaimConst.NAME) .Select(it => it.Value).FirstOrDefault(); //账号 var opAccount = loggingMonitor.AuthorizationClaims - ?.Where(it => it.Type == ClaimConst.Account).Select(it => it.Value).FirstOrDefault(); + ?.Where(it => it.Type == ClaimConst.ACCOUNT).Select(it => it.Value).FirstOrDefault(); //获取参数json字符串, var paramJson = loggingMonitor.Parameters == null || loggingMonitor.Parameters.Count == 0 @@ -164,7 +164,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter var devLogOperate = new SysLogOperate { Name = operation, - Category = CateGoryConst.Log_OPERATE, + Category = CateGoryConst.LOG_OPERATE, ExeStatus = SysLogConst.SUCCESS, OpAddress = GetLoginAddress(loggingMonitor.RemoteIPv4), OpIp = loggingMonitor.RemoteIPv4, @@ -183,7 +183,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter //如果异常不为空 if (loggingMonitor.Exception != null) { - devLogOperate.Category = CateGoryConst.Log_EXCEPTION;//操作类型为异常 + devLogOperate.Category = CateGoryConst.LOG_EXCEPTION;//操作类型为异常 devLogOperate.ExeStatus = SysLogConst.FAIL;//操作状态为失败 devLogOperate.ExeMessage = loggingMonitor.Exception.Type + ":" + loggingMonitor.Exception.Message + "\n" + loggingMonitor.Exception.StackTrace; @@ -198,25 +198,25 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter /// private string GetLoginAddress(string ip) { - var LoginAddress = "未知"; + var loginAddress = "未知"; try { var ipInfo = IpTool.Search(ip);//解析IP信息 - var LoginAddressList = new List() + var loginAddressList = new List() { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator };//定义登录地址列表 - LoginAddress = + loginAddress = string.Join("|", - LoginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 + loginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 } catch (global::System.Exception ex) { _logger.LogError("IP解析错误" + ex, ex); } - return LoginAddress; + return loginAddress; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs index 1980b7e..8445997 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingConst.cs @@ -16,20 +16,20 @@ public class LoggingConst /// /// 操作名称 /// - public const string Operation = "Operation"; + public const string OPERATION = "Operation"; /// /// 客户端信息 /// - public const string Client = "Client"; + public const string CLIENT = "Client"; /// /// 请求地址 /// - public const string Path = "Path"; + public const string PATH = "Path"; /// /// 请求方法:POST/GET /// - public const string Method = "Method"; -} \ No newline at end of file + public const string METHOD = "Method"; +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs index fff6af5..bdd4699 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs @@ -166,7 +166,7 @@ public class ReturnInformation /// /// 额外信息 /// - public object extras { get; set; } + public object Extras { get; set; } /// /// 内如 @@ -220,4 +220,4 @@ public class Validation /// 错误详情 /// public string Message { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index cbbd1d9..3bde38f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -529,14 +529,14 @@ 上传本地文件 - + 上传MINIO文件 - + @@ -1513,22 +1513,22 @@ 日志常量 - + 操作名称 - + 客户端信息 - + 请求地址 - + 请求方法:POST/GET @@ -1683,7 +1683,7 @@ 消息 - + 额外信息 -- Gitee From 4d64b4157cddfe5f503f13a80ba365a86cdc2033 Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Thu, 7 Sep 2023 14:00:31 +0800 Subject: [PATCH 06/70] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9D=9Esqlserver?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E9=BB=98=E8=AE=A4nvarchar=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SimpleAdmin.SqlSugar/Db/DbContext.cs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs index 333f469..45e9238 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs @@ -6,6 +6,8 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 +using DbType = SqlSugar.DbType; + namespace SimpleAdmin.SqlSugar; /// @@ -26,11 +28,11 @@ public static class DbContext //遍历配置的数据库 DB_CONFIGS.ForEach(it => { - var sqlsugarScope = db.GetConnectionScope(it.ConfigId);//获取当前库 - MoreSetting(sqlsugarScope);//更多设置 - ExternalServicesSetting(sqlsugarScope, it);//实体拓展配置 - AopSetting(sqlsugarScope);//aop配置 - FilterSetting(sqlsugarScope);//过滤器配置 + var sqlSugarScope = db.GetConnectionScope(it.ConfigId);//获取当前库 + MoreSetting(sqlSugarScope, it.DbType);//更多设置 + ExternalServicesSetting(sqlSugarScope, it);//实体拓展配置 + AopSetting(sqlSugarScope);//aop配置 + FilterSetting(sqlSugarScope);//过滤器配置 }); }); @@ -175,12 +177,13 @@ public static class DbContext /// /// 实体更多配置 /// - /// - private static void MoreSetting(SqlSugarScopeProvider db) + /// db + /// 数据库类型 + private static void MoreSetting(SqlSugarScopeProvider db, DbType dbType) { db.CurrentConnectionConfig.MoreSettings = new ConnMoreSettings { - SqlServerCodeFirstNvarchar = true//设置默认nvarchar + SqlServerCodeFirstNvarchar = dbType == DbType.SqlServer//设置默认nvarchar }; } -- Gitee From 8daf4995dadee0beb2bc287a0a50a01b01e53380 Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Thu, 7 Sep 2023 14:02:48 +0800 Subject: [PATCH 07/70] =?UTF-8?q?=E9=80=82=E9=85=8D=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SimpleAdmin.SqlSugar.xml | 5 +++-- .../Services/Auth/Auth/AuthService.cs | 6 ++---- .../LogAudit/OperateLog/OperateLogService.cs | 6 +++--- .../SimpleAdmin.System/SimpleAdmin.System.xml | 2 +- .../System/LogAudit/LogOperateController.cs | 4 ++-- .../SimpleAdmin.Web.Entry/Program.cs | 20 +++++++++---------- .../SimpleAdmin.Web.Entry.csproj | 1 - 7 files changed, 21 insertions(+), 23 deletions(-) diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 53befc4..29280e9 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -117,11 +117,12 @@ - + 实体更多配置 - + db + 数据库类型 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs index 391374c..ca543ed 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs @@ -172,10 +172,8 @@ public class AuthService : IAuthService /// public void BeforeLogin(List loginPolicy, string userName) { - var lockTime = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_LOCK) - .ConfigValue.ToInt();//获取锁定时间 - var errorCount = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_COUNT) - .ConfigValue.ToInt();//获取错误次数 + var lockTime = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_LOCK).ConfigValue.ToInt();//获取锁定时间 + var errorCount = loginPolicy.First(x => x.ConfigKey == SysConfigConst.LOGIN_ERROR_COUNT).ConfigValue.ToInt();//获取错误次数 var key = SystemConst.CACHE_LOGIN_ERROR_COUNT + userName;//获取登录错误次数Key值 var errorCountCache = _simpleCacheService.Get(key);//获取登录错误次数 if (errorCountCache >= errorCount) diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs index a05b23a..2949da4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs @@ -21,7 +21,7 @@ public class OperateLogService : DbRepository, IOperateLogService /// /// 异常日志中文名称 /// - private readonly string _nameExecption = "异常日志"; + private readonly string _nameException = "异常日志"; /// public async Task> Page(OperateLogPageInput input) @@ -78,7 +78,7 @@ public class OperateLogService : DbRepository, IOperateLogService result.Add(new OperateLogDayStatisticsOutput { Date = it.Date, Name = _nameOperate, Count = it.OperateCount });//添加访问日志 result.Add(new OperateLogDayStatisticsOutput - { Date = it.Date, Name = _nameExecption, Count = it.ExceptionCount });//添加异常日志 + { Date = it.Date, Name = _nameException, Count = it.ExceptionCount });//添加异常日志 }); return result; } @@ -106,7 +106,7 @@ public class OperateLogService : DbRepository, IOperateLogService //添加异常日志数据 new OperateLogTotalCountOutpu { - Type = _nameExecption, + Type = _nameException, Value = data.Where(it => it.Category == CateGoryConst.LOG_EXCEPTION) .Select(it => it.Count).FirstOrDefault() } diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index f348f69..9c0d094 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -4312,7 +4312,7 @@ 操作日志中文名称 - + 异常日志中文名称 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs index ff3aad1..ad2f865 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs @@ -37,7 +37,7 @@ public class LogOperateController : BaseController /// 操作日志周统计柱状图图 /// /// - [HttpGet("barChartData")] + [HttpGet("columnChartData")] public async Task BarChartData() { return await _operateLogService.StatisticsByDay(7); @@ -74,4 +74,4 @@ public class LogOperateController : BaseController { return await _operateLogService.Detail(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs b/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs index 7fff41e..2044f75 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs @@ -1,15 +1,15 @@ -// SimpleAdmin Apache License Version 2.0 Э鷢ҵĿ²: -// 1.벻Ҫɾ޸ĸĿ¼µLICENSEļ -// 2.벻Ҫɾ޸SimpleAdminԴͷİȨ -// 3.ַԴʱע https://gitee.com/zxzyjs/SimpleAdmin -// 4.ڱƷֻʹ SimpleAdmin Ϊ̨񣬳ҲηַԴ -// 5.벻ýӦΣҰȫΪκʽڷǷΪĿĵΪҪɾ޸ -// 6.κλڱһзɾ׺Σ˾޹ء +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -Console.WriteLine(@"Դַ: https://gitee.com/zxzyjs/SimpleAdmin"); -Console.WriteLine(@"ʾַ: http://153.101.199.83:12802/login"); +Console.WriteLine(@"源码地址: https://gitee.com/zxzyjs/SimpleAdmin"); +Console.WriteLine(@"演示地址: http://153.101.199.83:12802/login"); Console.WriteLine(@"QQ:531035580"); -Console.WriteLine("ܾʺɽ,ֻʵ,.NET "); +Console.WriteLine("拒绝屎山,只玩真实,让.NET 开发更简单!"); Serve.Run(RunOptions.Default.ConfigureBuilder(builder => { builder.WebHost.UseUrls(builder.Configuration["AppSettings:Urls"]); diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj index 42a641f..a0bdaca 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj @@ -14,7 +14,6 @@ - -- Gitee From 0e1b8ec2ca914f322c2f1c1688bfdb8350b21362 Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Fri, 8 Sep 2023 10:26:38 +0800 Subject: [PATCH 08/70] =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=A1=A8=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E8=87=AA=E5=8A=A8=E5=88=86=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/User/UserService.cs | 2 +- .../Const/SimpleAdminConst.cs | 2 +- .../SimpleAdmin.Core/SimpleAdmin.Core.xml | 465 +++++++++--------- .../Const/EffTypeConst.cs | 4 +- .../SimpleAdmin.SqlSugar/Db/DbRepository.cs | 26 +- .../SimpleAdmin.SqlSugar.xml | 227 +++++---- .../Utils/SqlSugarUtils.cs | 2 +- .../Entity/SysLogOperate.cs | 2 +- .../SimpleAdmin.System/Entity/SysLogVisit.cs | 7 +- .../LogAudit/OperateLog/OperateLogService.cs | 17 +- .../LogAudit/VisitLog/VisitLogService.cs | 16 +- .../SimpleAdmin.System/SimpleAdmin.System.xml | 10 + .../System/LogAudit/LogOperateController.cs | 2 +- .../System/LogAudit/LogVisitController.cs | 4 +- .../Logging/DatabaseLoggingWriter.cs | 4 +- .../SimpleAdmin.Web.Core.xml | 4 +- 16 files changed, 427 insertions(+), 367 deletions(-) diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs index 96e965d..d0abbab 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs @@ -172,7 +172,7 @@ public class UserService : DbRepository, IUserService /// public async Task ResetPassword(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.RESEST_PWD);//检查权限 + await CheckPermission(input.Id, SimpleAdminConst.RESET_PWD);//检查权限 await _sysUserService.ResetPassword(input);//重置密码 } diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs index 1e2fd53..a15be4f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs @@ -35,7 +35,7 @@ public class SimpleAdminConst /// /// 重置密码操作 /// - public const string RESEST_PWD = "重置密码"; + public const string RESET_PWD = "重置密码"; /// /// 用户授权操作 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml index 4e1ca9c..8712cce 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml @@ -6,379 +6,379 @@ - 批量更新 + 批量更新 - 代码生成 + 代码生成 - 忽略初始化表 + 忽略初始化表 - 种子数据忽略新增 + 种子数据忽略新增 - 种子数据忽略修改 + 种子数据忽略修改 - 需要角色授权权限 + 需要角色授权权限 - 忽略角色授权权限 + 忽略角色授权权限 - 管理员才能访问特性 + 管理员才能访问特性 - 忽略超级管理员才能访问特性 + 忽略超级管理员才能访问特性 - 验证Id不能为 空 + 验证Id不能为 空 - 验证Id列表不能为空 + 验证Id列表不能为空 - 文件上传输入参数 + 文件上传输入参数 - 文件 + 文件 - 主键Id输入参数 + 主键Id输入参数 - 主键Id + 主键Id - 主键Id列表 + 主键Id列表 - Id列表输入 + Id列表输入 - 全局分页查询输入参数 + 全局分页查询输入参数 - 当前页码 + 当前页码 - 每页条数 + 每页条数 - 排序字段 + 排序字段 - 排序方式,升序:ascend;降序:descend" + 排序方式,升序:ascend;降序:descend" - 关键字 + 关键字 - 基础选择器输出 + 基础选择器输出 - 值 + 值 - 显示文本 + 显示文本 - Gzip压缩组件 + Gzip压缩组件 - 日志写入文件的组件 + 日志写入文件的组件 - 日志写入文件的组件 + 日志写入文件的组件 - 日志格式化 + 日志格式化 - 授权用户常量 + 授权用户常量 - 用户Id + 用户Id - 账号 + 账号 - 名称 + 名称 - 账号类型 + 账号类型 - 组织机构Id + 组织机构Id - 添加操作 + 添加操作 - 编辑操作 + 编辑操作 - 启用操作 + 启用操作 - 禁用操作 + 禁用操作 - + - 重置密码操作 + 重置密码操作 - 用户授权操作 + 用户授权操作 - 组织 + 组织 - 机构 + 机构 - 职位 + 职位 - 岗位 + 岗位 - 0 + 0 - mqtt消息 + mqtt消息 - 消息分类 + 消息分类 - 消息内容 + 消息内容 - 时间 + 时间 - Token信息 + Token信息 - MQTT客户端ID列表 + MQTT客户端ID列表 - 设备 + 设备 - 登录端 + 登录端 - 过期时间 + 过期时间 - Token + Token - 超时时间 + 超时时间 - token剩余有效期 + token剩余有效期 - token剩余有效期百分比 + token剩余有效期百分比 - 登录设备类型枚举 + 登录设备类型枚举 - PC端 + PC端 - 移动端 + 移动端 - 小程序 + 小程序 - 登录端类型枚举 + 登录端类型枚举 - B端 + B端 - C端 + C端 - 通用错误码 + 通用错误码 - 系统异常 + 系统异常 - 数据不存在 + 数据不存在 - 删除失败 + 删除失败 - 操作失败 + 操作失败 - 没有权限 + 没有权限 - Linq扩展 + Linq扩展 - 是否都包含 + 是否都包含 第一个列表 @@ -387,19 +387,19 @@ - object拓展 + object拓展 - json字符串序列化 + json字符串序列化 - json字符串序列化 + json字符串序列化 @@ -407,120 +407,120 @@ - json字符串序列化 + json字符串序列化 - 默认业务配置 + 默认业务配置 - 初始化表 + 初始化表 - 初始化数据 + 初始化数据 - 日志配置 + 日志配置 - LoggingMonitor配置 + LoggingMonitor配置 - 是否日志消息格式化 + 是否日志消息格式化 - 日志等级 + 日志等级 - LoggingMonitor配置 + LoggingMonitor配置 - 写入文件 + 写入文件 - 写入控制台 + 写入控制台 - 日志等级 + 日志等级 - 默认日志等级 + 默认日志等级 - 最大日志等级 + 最大日志等级 - AppStartup启动类 + AppStartup启动类 - 全局返回结果 + 全局返回结果 - 状态码 + 状态码 - 错误信息 + 错误信息 - 数据 + 数据 - 附加数据 + 附加数据 - 时间 + 时间 - 规范化RESTful风格返回值 + 规范化RESTful风格返回值 - 异常返回 + 异常返回 @@ -528,7 +528,7 @@ - 成功返回 + 成功返回 @@ -536,7 +536,7 @@ - 验证失败返回 + 验证失败返回 @@ -544,7 +544,7 @@ - 状态码响应拦截 + 状态码响应拦截 @@ -553,7 +553,7 @@ - 返回 RESTful 风格结果集 + 返回 RESTful 风格结果集 状态码 是否成功 @@ -563,52 +563,52 @@ - 验证码信息 + 验证码信息 - 验证码 + 验证码 - 验证码数据流 + 验证码数据流 - base64 + base64 - 验证码类型 + 验证码类型 - 纯数字验证码 + 纯数字验证码 - 数字加字母验证码 + 数字加字母验证码 - 数字运算验证码 + 数字运算验证码 - 生成验证码功能 + 生成验证码功能 - 获取验证码 + 获取验证码 验证码数 长度 @@ -619,193 +619,193 @@ - 获取数字验证码 + 获取数字验证码 验证码数 - 获取字符验证码 + 获取字符验证码 验证码数 - 获取运算符验证码 + 获取运算符验证码 - 公共功能 + 公共功能 - 获取唯一Id + 获取唯一Id - 加解密功能 + 加解密功能 - SM2解密 + SM2解密 密文 明文 - SM2加密 + SM2加密 明文 密文 - SM4解密 + SM4解密 密文 明文 - SM4加密 + SM4加密 明文 密文 - SM2加密解密 + SM2加密解密 - 公钥 + 公钥 - 私钥 + 私钥 - 公钥加密明文 + 公钥加密明文 明文 密文 - 私钥解密密文 + 私钥解密密文 密文 明文 - Sm4算法 - 对标国际DES算法 + Sm4算法 + 对标国际DES算法 - 数据 + 数据 - 秘钥 + 秘钥 - 向量 + 向量 - 明文是否是十六进制 + 明文是否是十六进制 - 加密模式(默认ECB) - 统一改为ECB模式 + 加密模式(默认ECB) + 统一改为ECB模式 - ECB加密 + ECB加密 - CBC加密 + CBC加密 - 解密 + 解密 - ECB解密 + ECB解密 - CBC解密 + CBC解密 - 加密类型 + 加密类型 - ECB(电码本模式) + ECB(电码本模式) - CBC(密码分组链接模式) + CBC(密码分组链接模式) - SM2工具类 + SM2工具类 - 获取公钥私钥 + 获取公钥私钥 - 加密 + 加密 公钥 需要加密的值 @@ -813,23 +813,23 @@ - 加密 + 加密 公钥 需要加密的值 - - - - - - + + + + + + - 解密 + 解密 @@ -837,22 +837,22 @@ - 公钥 + 公钥 - 私钥 + 私钥 - SM4工具类 + SM4工具类 - 加密 非线性τ函数B=τ(A) + 加密 非线性τ函数B=τ(A) @@ -860,7 +860,7 @@ - 解密 非线性τ函数B=τ(A) + 解密 非线性τ函数B=τ(A) @@ -868,7 +868,7 @@ - 循环移位,为32位的x循环左移n位 + 循环移位,为32位的x循环左移n位 @@ -876,43 +876,43 @@ - 将密钥逆序 + 将密钥逆序 - S盒 + S盒 - 系统参数FK + 系统参数FK - 固定参数CK + 固定参数CK - Sm4的S盒取值 + Sm4的S盒取值 - 线性变换 L + 线性变换 L - 轮函数 F + 轮函数 F @@ -923,21 +923,21 @@ - 轮密钥rk + 轮密钥rk - 加密密钥 + 加密密钥 - 解密函数 + 解密函数 轮密钥 输入分组的密文 @@ -945,7 +945,7 @@ - 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串 + 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串 1表示加密,0表示解密 @@ -953,21 +953,21 @@ - 设置加密的key + 设置加密的key - 设置解密的key + 设置解密的key - ECB + ECB @@ -975,7 +975,7 @@ - CBC + CBC @@ -984,39 +984,39 @@ - SM4处理中心 + SM4处理中心 - 1表示加密,0表示解密 + 1表示加密,0表示解密 - 密钥 + 密钥 - 是否补足16进制字符串 + 是否补足16进制字符串 - 头像功能 + 头像功能 - 获取姓名对应的颜色值 + 获取姓名对应的颜色值 - 获取姓名对应的图片 + 获取姓名对应的图片 @@ -1025,7 +1025,7 @@ - 获取图片base64格式 + 获取图片base64格式 名称 宽 @@ -1034,49 +1034,49 @@ - 用 正则表达式 判断字符是不是汉字 + 用 正则表达式 判断字符是不是汉字 待判断字符或字符串 真:是汉字;假:不是 - 图片转换成base64 + 图片转换成base64 - 图片转换成base64 + 图片转换成base64 - base64转bitmap + base64转bitmap - base64转bitmap + base64转bitmap - base64转image格式 + base64转image格式 - 重新修改尺寸 + 重新修改尺寸 图片 尺寸 @@ -1084,25 +1084,25 @@ - Resize图片 + Resize图片 - 原始Bitmap + 原始Bitmap 新的宽度 新的高度 处理以后的图片 - Resize图片 + Resize图片 - 原始Bitmap + 原始Bitmap 新的宽度 新的高度 处理以后的图片 - 获取缩略图 + 获取缩略图 宽 @@ -1111,7 +1111,7 @@ - 获取缩略图 + 获取缩略图 宽 @@ -1120,12 +1120,12 @@ - 密码相关通用类 + 密码相关通用类 - 密码相似度 + 密码相似度 @@ -1133,7 +1133,7 @@ - 计算莱文斯坦距离算法 + 计算莱文斯坦距离算法 @@ -1141,7 +1141,7 @@ - 压缩单个文件 + 压缩单个文件 要压缩的文件 压缩后的文件 @@ -1150,28 +1150,28 @@ - 压缩单个文件 + 压缩单个文件 要进行压缩的文件名 压缩后生成的压缩文件名 - 压缩多个文件到指定路径 + 压缩多个文件到指定路径 压缩到哪个路径 压缩文件名称 - 压缩多层目录 + 压缩多层目录 待压缩目录 压缩后生成的压缩文件名,绝对路径 - 压缩多层目录 + 压缩多层目录 待压缩目录 压缩后生成的压缩文件名,绝对路径 @@ -1179,7 +1179,7 @@ - 递归遍历目录 + 递归遍历目录 需遍历的目录 压缩输出流对象 @@ -1188,7 +1188,7 @@ - 解压缩一个 zip 文件。 + 解压缩一个 zip 文件。 压缩文件 解压目录 @@ -1197,7 +1197,7 @@ - 解压缩一个 zip 文件。 + 解压缩一个 zip 文件。 压缩文件 解压目录 @@ -1205,15 +1205,15 @@ - 解压缩一个 zip 文件。 - 覆盖已存在的文件。 + 解压缩一个 zip 文件。 + 覆盖已存在的文件。 压缩文件 解压目录 - 获取压缩文件中指定类型的文件 + 获取压缩文件中指定类型的文件 压缩文件 文件类型(.txt|.exe) @@ -1221,14 +1221,14 @@ - 获取压缩文件中的所有文件 + 获取压缩文件中的所有文件 压缩文件 文件名称列表(包含子目录) - 打包线上线下文件 + 打包线上线下文件 压缩文件名称 文件列表 @@ -1241,38 +1241,37 @@ 是否删除原文件夹 - - 获取所有文件 - - + + 获取所有文件 + + - - 获取一个文件夹下的所有文件夹里的文件 - - - + + 获取一个文件夹下的所有文件夹里的文件 + + - - 获取一个文件夹下的文件 - - 目录名称 - 文件列表HastTable + + 获取一个文件夹下的文件 + + 目录名称 + 文件列表HastTable - 文件对象 + 文件对象 - 文件名称 + 文件名称 - 文件路径 + 文件路径 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs index 0bd4279..b24edb5 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/EffTypeConst.cs @@ -51,7 +51,7 @@ public class EffTypeConst /// /// 数字输入框 /// - public const string INPUTNUMBER = "inputNumber"; + public const string INPUT_NUMBER = "inputNumber"; /// /// 滑动数字条 @@ -62,4 +62,4 @@ public class EffTypeConst /// 下拉框 /// public const string SWITCH = "switch"; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs index 8f057fc..5c990c4 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs @@ -98,11 +98,35 @@ public partial class DbRepository : SimpleClient where T : class, new() /// 查询条件 /// 查询字段 /// - public virtual Task GetFirstAsync(Expression> whereExpression, Expression> selectExpression) + protected virtual Task GetFirstAsync(Expression> whereExpression, Expression> selectExpression) { return Context.Queryable().Where(whereExpression).Select(selectExpression).FirstAsync(); } + /// + /// 根据条件查询获取自动分表的单个数据 + /// + /// 条件表达式 + /// 开始时间 + /// 结束时间 + /// 实体 + public virtual Task GetFirstSplitTableAsync(Expression> whereExpression, DateTime startTime, DateTime endTime) + { + return Context.Queryable().Where(whereExpression).SplitTable(startTime, endTime).FirstAsync(); + } + + /// + /// 根据条件查询获取自动分表的单个数据 + /// + /// 条件表达式 + /// 分表查询表达式 + /// 实体 + public virtual Task GetFirstSplitTableAsync(Expression> whereExpression, + Func, IEnumerable> getTableNamesFunc) + { + return Context.Queryable().Where(whereExpression).SplitTable(getTableNamesFunc).FirstAsync(); + } + #endregion 单查 #endregion 仓储方法拓展 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 29280e9..74b368a 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -6,144 +6,144 @@ - 前端控件作用类型常量 + 前端控件作用类型常量 - 输入框 + 输入框 - 文本框 + 文本框 - 下拉框 + 下拉框 - 单选框 + 单选框 - 复选框 + 复选框 - 日期选择器 + 日期选择器 - 时间选择器 + 时间选择器 - + - 数字输入框 + 数字输入框 - 滑动数字条 + 滑动数字条 - 下拉框 + 下拉框 - Sqlsugar系统常量类 + Sqlsugar系统常量类 - 默认库ConfigId + 默认库ConfigId - 默认表主键 + 默认表主键 - varchar(max) + varchar(max) - mysql的longtext + mysql的longtext - sqlite的text + sqlite的text - 数据库上下文对象 + 数据库上下文对象 - 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 + 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 - SqlSugar 数据库实例 + SqlSugar 数据库实例 - 实体拓展配置,自定义类型多库兼容 + 实体拓展配置,自定义类型多库兼容 - Aop设置 + Aop设置 - 实体更多配置 + 实体更多配置 db 数据库类型 - 过滤器设置 + 过滤器设置 - 假删除过滤器 + 假删除过滤器 - 仓储模式对象 + 仓储模式对象 - 批量插入判断走普通导入还是大数据 + 批量插入判断走普通导入还是大数据 数据 阈值 @@ -151,7 +151,7 @@ - 获取列表指定多个字段 + 获取列表指定多个字段 查询条件 查询字段 @@ -159,7 +159,7 @@ - 获取列表指定单个字段 + 获取列表指定单个字段 查询条件 查询字段 @@ -167,7 +167,7 @@ - 获取列表指定单个字段 + 获取列表指定单个字段 查询条件 查询字段 @@ -175,7 +175,7 @@ - 获取指定表的单个字段 + 获取指定表的单个字段 查询条件 查询字段 @@ -183,113 +183,130 @@ - 获取指定表的单个字段 + 获取指定表的单个字段 查询条件 查询字段 + + + 根据条件查询获取自动分表的单个数据 + + 条件表达式 + 开始时间 + 结束时间 + 实体 + + + + 根据条件查询获取自动分表的单个数据 + + 条件表达式 + 分表查询表达式 + 实体 + - sqlsugar数据库配置 + sqlsugar数据库配置 - 是否驼峰转下划线 + 是否驼峰转下划线 - Linq分页泛型集合 + Linq分页泛型集合 - 主键实体基类 + 主键实体基类 - 主键Id + 主键Id - 拓展信息 + 拓展信息 - 框架实体基类 + 框架实体基类 - 创建时间 + 创建时间 - 更新时间 + 更新时间 - 创建者Id + 创建者Id - 修改者Id + 修改者Id - 创建人 + 创建人 - 更新人 + 更新人 - 软删除 + 软删除 - 业务数据实体基类(数据权限) + 业务数据实体基类(数据权限) - 创建者部门Id + 创建者部门Id - 实体种子数据接口 + 实体种子数据接口 - 种子数据 + 种子数据 - Sqlsugar分页拓展类 + Sqlsugar分页拓展类 - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -299,7 +316,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -309,7 +326,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -321,7 +338,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -333,7 +350,7 @@ - 分页查询 + 分页查询 数据列表 @@ -343,65 +360,65 @@ - SqlSugar 分页泛型集合 + SqlSugar 分页泛型集合 - 页码 + 页码 - 数量 + 数量 - 总条数 + 总条数 - 总页数 + 总页数 - 当前页集合 + 当前页集合 - 是否有上一页 + 是否有上一页 - 是否有下一页 + 是否有下一页 - SqlSugar 事务和工作单元 + SqlSugar 事务和工作单元 - SqlSugar 对象 + SqlSugar 对象 - 构造函数 + 构造函数 - 开启工作单元处理 + 开启工作单元处理 @@ -409,7 +426,7 @@ - 提交工作单元处理 + 提交工作单元处理 @@ -417,7 +434,7 @@ - 回滚工作单元处理 + 回滚工作单元处理 @@ -425,7 +442,7 @@ - 执行完毕(无论成功失败) + 执行完毕(无论成功失败) @@ -433,50 +450,50 @@ - AppStartup启动类 + AppStartup启动类 - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 + ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 + 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! + 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - 检查是否有相同的ConfigId + 检查是否有相同的ConfigId - CodeFirst功能类 + CodeFirst功能类 - CodeFirst生成数据库表结构和种子数据 + CodeFirst生成数据库表结构和种子数据 codefirst选项 程序集名称 - 初始化数据库表结构 + 初始化数据库表结构 程序集名称 - 初始化种子数据 + 初始化种子数据 程序集名称 - 判断类型是否实现某个泛型 + 判断类型是否实现某个泛型 类型 泛型类型 @@ -484,7 +501,7 @@ - List转DataTable + List转DataTable @@ -492,97 +509,97 @@ - 排除SqlSugar忽略的列 + 排除SqlSugar忽略的列 - Sqlsugar字段信息 + Sqlsugar字段信息 - 字段名称 + 字段名称 - 是否主键 + 是否主键 - 字段类型 + 字段类型 - 字段注释 + 字段注释 - Sqlsugar表信息 + Sqlsugar表信息 - - 所属库 + + 所属库 - 表名称 + 表名称 - 实体名 + 实体名 - 表注释 + 表注释 - 表字段 + 表字段 - 种子数据工具类 + 种子数据工具类 - 种子数据格式实体类,遵循Navicat导出json格式 + 种子数据格式实体类,遵循Navicat导出json格式 - 数据 + 数据 - Sqlusgar通用功能 + Sqlusgar通用功能 - 根据特性获取所有表信息 + 根据特性获取所有表信息 - 获取字段信息 + 获取字段信息 @@ -590,21 +607,21 @@ - 数据库字段类型转.NET类型 + 数据库字段类型转.NET类型 字段类型 - 数据类型转显示类型 + 数据类型转显示类型 - 是否通用字段 + 是否通用字段 字段名 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs index de451f7..237381e 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs @@ -175,7 +175,7 @@ public static class SqlSugarUtils return dataType switch { "string" => EffTypeConst.INPUT, - "int" => EffTypeConst.INPUTNUMBER, + "int" => EffTypeConst.INPUT_NUMBER, "long" => EffTypeConst.INPUT, "float" => EffTypeConst.INPUT, "double" => EffTypeConst.INPUT, diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs index ffcd89d..c19af8f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs @@ -11,7 +11,7 @@ namespace SimpleAdmin.System; /// /// 操作日志表 /// -[SugarTable("sys_log_operate", TableDescription = "操作日志表")] +[SugarTable("sys_log_operate_{year}{month}{day}", TableDescription = "操作日志表")] [Tenant(SqlsugarConst.DB_DEFAULT)] public class SysLogOperate : SysLogVisit { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs index 19ddadf..9e34962 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs @@ -11,7 +11,8 @@ namespace SimpleAdmin.System; /// /// 访问日志表 /// -[SugarTable("sys_log_visit", TableDescription = "访问日志表")] +[SugarTable("sys_log_visit_{year}{month}{day}", TableDescription = "访问日志表")] +[SplitTable(SplitType.Year)]//按年分表 (自带分表支持 年、季、月、周、日) [Tenant(SqlsugarConst.DB_DEFAULT)] public class SysLogVisit : BaseEntity { @@ -61,13 +62,13 @@ public class SysLogVisit : BaseEntity /// 操作时间 /// [SugarColumn(ColumnName = "OpTime", ColumnDescription = "操作时间")] + [SplitField]//分表字段 在插入的时候会根据这个字段插入哪个表,在更新删除的时候用这个字段找出相关表 public DateTime OpTime { get; set; } /// /// 操作人姓名 /// - [SugarColumn(ColumnName = "OpUser", ColumnDescription = "操作人姓名", Length = 200, - IsNullable = true)] + [SugarColumn(ColumnName = "OpUser", ColumnDescription = "操作人姓名", Length = 200, IsNullable = true)] public string OpUser { get; set; } /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs index 2949da4..049d9cc 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs @@ -23,6 +23,11 @@ public class OperateLogService : DbRepository, IOperateLogService /// private readonly string _nameException = "异常日志"; + /// + /// 分表最多查近多少年的数据 + /// + private readonly int _maxTabs = 100; + /// public async Task> Page(OperateLogPageInput input) { @@ -35,6 +40,7 @@ public class OperateLogService : DbRepository, IOperateLogService it => it.Name.Contains(input.SearchKey) || it.OpIp.Contains(input.SearchKey))//根据关键字查询 .IgnoreColumns(it => new { it.ParamJson, it.ResultJson }) + .SplitTable(tabs => tabs.Take(_maxTabs)) .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 .OrderBy(it => it.CreateTime, OrderByType.Desc); @@ -51,7 +57,7 @@ public class OperateLogService : DbRepository, IOperateLogService //生成时间表 var queryableLeft = Context.Reportable(dayArray).ToQueryable(); //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 - var queryableRight = Context.Queryable();//声名表 + var queryableRight = Context.Queryable().SplitTable(tabs => tabs.Take(_maxTabs));//声名表 //报表查询 var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) @@ -71,7 +77,7 @@ public class OperateLogService : DbRepository, IOperateLogService } ).ToListAsync(); //定义返回结果 - List result = new List(); + var result = new List(); //遍历结果 list.ForEach(it => { @@ -87,6 +93,7 @@ public class OperateLogService : DbRepository, IOperateLogService public async Task> TotalCount() { var data = await Context.Queryable() + .SplitTable(tabs => tabs.Take(_maxTabs)) .GroupBy(it => it.Category)//根据分类分组 .Select(it => new { @@ -94,7 +101,7 @@ public class OperateLogService : DbRepository, IOperateLogService Count = SqlFunc.AggregateCount(it.Category)//数量 }).ToListAsync(); //定义结果数组 - List operageLogTotalCounts = new List + var operateLogTotalCounts = new List { //添加操作日志数据 new OperateLogTotalCountOutpu @@ -111,7 +118,7 @@ public class OperateLogService : DbRepository, IOperateLogService .Select(it => it.Count).FirstOrDefault() } }; - return operageLogTotalCounts; + return operateLogTotalCounts; } /// @@ -123,6 +130,6 @@ public class OperateLogService : DbRepository, IOperateLogService /// public async Task Detail(BaseIdInput input) { - return await GetFirstAsync(it => it.Id == input.Id);//删除对应分类日志 + return await GetFirstSplitTableAsync(it => it.Id == input.Id, tabs => tabs.Take(_maxTabs)); } } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs index 00ab696..2a97367 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs @@ -13,9 +13,10 @@ namespace SimpleAdmin.System; /// public class VisitLogService : DbRepository, IVisitLogService { - public VisitLogService() - { - } + /// + /// 分表最多查近多少年的数据 + /// + private readonly int _maxTabs = 100; /// public async Task> Page(VisitLogPageInput input) @@ -28,6 +29,7 @@ public class VisitLogService : DbRepository, IVisitLogService .WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey) || it.OpIp.Contains(input.SearchKey))//根据关键字查询 + .SplitTable(tabs => tabs.Take(_maxTabs)) .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序 .OrderBy(it => it.CreateTime, OrderByType.Desc); @@ -44,7 +46,7 @@ public class VisitLogService : DbRepository, IVisitLogService //生成时间表 var queryableLeft = Context.Reportable(dayArray).ToQueryable(); //ReportableDateType.MonthsInLast1yea 表式近一年月份 并且queryable之后还能在where过滤 - var queryableRight = Context.Queryable();//声名表 + var queryableRight = Context.Queryable().SplitTable(tabs => tabs.Take(_maxTabs));//声名表 //报表查询 var list = await Context.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) @@ -62,8 +64,7 @@ public class VisitLogService : DbRepository, IVisitLogService 0)),//null的数据要为0所以不能用count Date = x1.ColumnName.ToString("yyyy-MM-dd") } - ) - .ToListAsync(); + ).ToListAsync(); return list; } @@ -71,6 +72,7 @@ public class VisitLogService : DbRepository, IVisitLogService public async Task> TotalCount() { var data = await Context.Queryable() + .SplitTable(tabs => tabs.Take(_maxTabs)) .GroupBy(it => it.Category)//根据分类分组 .Select(it => new { @@ -78,7 +80,7 @@ public class VisitLogService : DbRepository, IVisitLogService Count = SqlFunc.AggregateCount(it.Category)//数量 }).ToListAsync(); //定义结果数组 - List visitLogTotalCounts = new List + var visitLogTotalCounts = new List { //添加登录数据 new VisitLogTotalCountOutput diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index 9c0d094..42e08b7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -4317,6 +4317,11 @@ 异常日志中文名称 + + + 分表最多查近多少年的数据 + + @@ -4429,6 +4434,11 @@ + + + 分表最多查近多少年的数据 + + diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs index ad2f865..07f09c2 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogOperateController.cs @@ -23,7 +23,7 @@ public class LogOperateController : BaseController } /// - /// 字典分页查询 + /// 操作日志分页查询 /// /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs index 43b1cf9..5254016 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/LogAudit/LogVisitController.cs @@ -23,7 +23,7 @@ public class LogVisitController : BaseController } /// - /// 字典分页查询 + /// 访问日志分页查询 /// /// /// @@ -63,4 +63,4 @@ public class LogVisitController : BaseController { await _visitLogService.Delete(input.Category); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs index 9886436..b2f8e8a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs @@ -119,7 +119,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter OpUser = name, OpAccount = opAccount }; - await _db.InsertableWithAttr(devLogVisit).IgnoreColumns(true).ExecuteCommandAsync();//入库 + await _db.InsertableWithAttr(devLogVisit).IgnoreColumns(true).SplitTable().ExecuteCommandAsync();//入库 } /// @@ -188,7 +188,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter devLogOperate.ExeMessage = loggingMonitor.Exception.Type + ":" + loggingMonitor.Exception.Message + "\n" + loggingMonitor.Exception.StackTrace; } - await _db.InsertableWithAttr(devLogOperate).IgnoreColumns(true).ExecuteCommandAsync();//入库 + await _db.InsertableWithAttr(devLogOperate).IgnoreColumns(true).SplitTable().ExecuteCommandAsync();//入库 } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index 3bde38f..a1bf71f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -898,7 +898,7 @@ - 字典分页查询 + 操作日志分页查询 @@ -936,7 +936,7 @@ - 字典分页查询 + 访问日志分页查询 -- Gitee From f1b32d9827247cdc055f749af744d89691ec1485 Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Fri, 8 Sep 2023 11:39:09 +0800 Subject: [PATCH 09/70] =?UTF-8?q?=E5=8D=87=E7=BA=A7nuget=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SimpleAdmin.Background.csproj | 2 +- .../SimpleAdmin.Cache.csproj | 2 +- .../SimpleAdmin.Core/SimpleAdmin.Core.csproj | 6 +- .../SimpleAdmin.Core/SimpleAdmin.Core.xml | 463 +++++++++--------- .../SimpleAdmin.Plugin.Mqtt.csproj | 2 +- .../SimpleAdmin.SqlSugar.csproj | 2 +- .../SimpleAdmin.SqlSugar.xml | 212 ++++---- 7 files changed, 345 insertions(+), 344 deletions(-) diff --git a/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj b/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj index deb8159..76442b5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj @@ -42,6 +42,6 @@ - + diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.csproj b/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.csproj index 3a06574..c83c0b6 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Cache/SimpleAdmin.Cache.csproj @@ -9,7 +9,7 @@ - + diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj index 4fb1c11..568c481 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj @@ -11,13 +11,13 @@ - + - - + + diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml index 8712cce..0e6366d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml @@ -6,379 +6,379 @@ - 批量更新 + 批量更新 - 代码生成 + 代码生成 - 忽略初始化表 + 忽略初始化表 - 种子数据忽略新增 + 种子数据忽略新增 - 种子数据忽略修改 + 种子数据忽略修改 - 需要角色授权权限 + 需要角色授权权限 - 忽略角色授权权限 + 忽略角色授权权限 - 管理员才能访问特性 + 管理员才能访问特性 - 忽略超级管理员才能访问特性 + 忽略超级管理员才能访问特性 - 验证Id不能为 空 + 验证Id不能为 空 - 验证Id列表不能为空 + 验证Id列表不能为空 - 文件上传输入参数 + 文件上传输入参数 - 文件 + 文件 - 主键Id输入参数 + 主键Id输入参数 - 主键Id + 主键Id - 主键Id列表 + 主键Id列表 - Id列表输入 + Id列表输入 - 全局分页查询输入参数 + 全局分页查询输入参数 - 当前页码 + 当前页码 - 每页条数 + 每页条数 - 排序字段 + 排序字段 - 排序方式,升序:ascend;降序:descend" + 排序方式,升序:ascend;降序:descend" - 关键字 + 关键字 - 基础选择器输出 + 基础选择器输出 - 值 + 值 - 显示文本 + 显示文本 - Gzip压缩组件 + Gzip压缩组件 - 日志写入文件的组件 + 日志写入文件的组件 - 日志写入文件的组件 + 日志写入文件的组件 - 日志格式化 + 日志格式化 - 授权用户常量 + 授权用户常量 - 用户Id + 用户Id - 账号 + 账号 - 名称 + 名称 - 账号类型 + 账号类型 - 组织机构Id + 组织机构Id - 添加操作 + 添加操作 - 编辑操作 + 编辑操作 - 启用操作 + 启用操作 - 禁用操作 + 禁用操作 - 重置密码操作 + 重置密码操作 - 用户授权操作 + 用户授权操作 - 组织 + 组织 - 机构 + 机构 - 职位 + 职位 - 岗位 + 岗位 - 0 + 0 - mqtt消息 + mqtt消息 - 消息分类 + 消息分类 - 消息内容 + 消息内容 - 时间 + 时间 - Token信息 + Token信息 - MQTT客户端ID列表 + MQTT客户端ID列表 - 设备 + 设备 - 登录端 + 登录端 - 过期时间 + 过期时间 - Token + Token - 超时时间 + 超时时间 - token剩余有效期 + token剩余有效期 - token剩余有效期百分比 + token剩余有效期百分比 - 登录设备类型枚举 + 登录设备类型枚举 - PC端 + PC端 - 移动端 + 移动端 - 小程序 + 小程序 - 登录端类型枚举 + 登录端类型枚举 - B端 + B端 - C端 + C端 - 通用错误码 + 通用错误码 - 系统异常 + 系统异常 - 数据不存在 + 数据不存在 - 删除失败 + 删除失败 - 操作失败 + 操作失败 - 没有权限 + 没有权限 - Linq扩展 + Linq扩展 - 是否都包含 + 是否都包含 第一个列表 @@ -387,19 +387,19 @@ - object拓展 + object拓展 - json字符串序列化 + json字符串序列化 - json字符串序列化 + json字符串序列化 @@ -407,120 +407,120 @@ - json字符串序列化 + json字符串序列化 - 默认业务配置 + 默认业务配置 - 初始化表 + 初始化表 - 初始化数据 + 初始化数据 - 日志配置 + 日志配置 - LoggingMonitor配置 + LoggingMonitor配置 - 是否日志消息格式化 + 是否日志消息格式化 - 日志等级 + 日志等级 - LoggingMonitor配置 + LoggingMonitor配置 - 写入文件 + 写入文件 - 写入控制台 + 写入控制台 - 日志等级 + 日志等级 - 默认日志等级 + 默认日志等级 - 最大日志等级 + 最大日志等级 - AppStartup启动类 + AppStartup启动类 - 全局返回结果 + 全局返回结果 - 状态码 + 状态码 - 错误信息 + 错误信息 - 数据 + 数据 - 附加数据 + 附加数据 - 时间 + 时间 - 规范化RESTful风格返回值 + 规范化RESTful风格返回值 - 异常返回 + 异常返回 @@ -528,7 +528,7 @@ - 成功返回 + 成功返回 @@ -536,7 +536,7 @@ - 验证失败返回 + 验证失败返回 @@ -544,7 +544,7 @@ - 状态码响应拦截 + 状态码响应拦截 @@ -553,7 +553,7 @@ - 返回 RESTful 风格结果集 + 返回 RESTful 风格结果集 状态码 是否成功 @@ -563,52 +563,52 @@ - 验证码信息 + 验证码信息 - 验证码 + 验证码 - 验证码数据流 + 验证码数据流 - base64 + base64 - 验证码类型 + 验证码类型 - 纯数字验证码 + 纯数字验证码 - 数字加字母验证码 + 数字加字母验证码 - 数字运算验证码 + 数字运算验证码 - 生成验证码功能 + 生成验证码功能 - 获取验证码 + 获取验证码 验证码数 长度 @@ -619,193 +619,193 @@ - 获取数字验证码 + 获取数字验证码 验证码数 - 获取字符验证码 + 获取字符验证码 验证码数 - 获取运算符验证码 + 获取运算符验证码 - 公共功能 + 公共功能 - 获取唯一Id + 获取唯一Id - 加解密功能 + 加解密功能 - SM2解密 + SM2解密 密文 明文 - SM2加密 + SM2加密 明文 密文 - SM4解密 + SM4解密 密文 明文 - SM4加密 + SM4加密 明文 密文 - SM2加密解密 + SM2加密解密 - 公钥 + 公钥 - 私钥 + 私钥 - 公钥加密明文 + 公钥加密明文 明文 密文 - 私钥解密密文 + 私钥解密密文 密文 明文 - Sm4算法 - 对标国际DES算法 + Sm4算法 + 对标国际DES算法 - 数据 + 数据 - 秘钥 + 秘钥 - 向量 + 向量 - 明文是否是十六进制 + 明文是否是十六进制 - 加密模式(默认ECB) - 统一改为ECB模式 + 加密模式(默认ECB) + 统一改为ECB模式 - ECB加密 + ECB加密 - CBC加密 + CBC加密 - 解密 + 解密 - ECB解密 + ECB解密 - CBC解密 + CBC解密 - 加密类型 + 加密类型 - ECB(电码本模式) + ECB(电码本模式) - CBC(密码分组链接模式) + CBC(密码分组链接模式) - SM2工具类 + SM2工具类 - 获取公钥私钥 + 获取公钥私钥 - 加密 + 加密 公钥 需要加密的值 @@ -813,23 +813,23 @@ - 加密 + 加密 公钥 需要加密的值 - - - - - - + + + + + + - 解密 + 解密 @@ -837,22 +837,22 @@ - 公钥 + 公钥 - 私钥 + 私钥 - SM4工具类 + SM4工具类 - 加密 非线性τ函数B=τ(A) + 加密 非线性τ函数B=τ(A) @@ -860,7 +860,7 @@ - 解密 非线性τ函数B=τ(A) + 解密 非线性τ函数B=τ(A) @@ -868,7 +868,7 @@ - 循环移位,为32位的x循环左移n位 + 循环移位,为32位的x循环左移n位 @@ -876,43 +876,43 @@ - 将密钥逆序 + 将密钥逆序 - S盒 + S盒 - 系统参数FK + 系统参数FK - 固定参数CK + 固定参数CK - Sm4的S盒取值 + Sm4的S盒取值 - 线性变换 L + 线性变换 L - 轮函数 F + 轮函数 F @@ -923,21 +923,21 @@ - 轮密钥rk + 轮密钥rk - 加密密钥 + 加密密钥 - 解密函数 + 解密函数 轮密钥 输入分组的密文 @@ -945,7 +945,7 @@ - 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串 + 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串 1表示加密,0表示解密 @@ -953,21 +953,21 @@ - 设置加密的key + 设置加密的key - 设置解密的key + 设置解密的key - ECB + ECB @@ -975,7 +975,7 @@ - CBC + CBC @@ -984,39 +984,39 @@ - SM4处理中心 + SM4处理中心 - 1表示加密,0表示解密 + 1表示加密,0表示解密 - 密钥 + 密钥 - 是否补足16进制字符串 + 是否补足16进制字符串 - 头像功能 + 头像功能 - 获取姓名对应的颜色值 + 获取姓名对应的颜色值 - 获取姓名对应的图片 + 获取姓名对应的图片 @@ -1025,7 +1025,7 @@ - 获取图片base64格式 + 获取图片base64格式 名称 宽 @@ -1034,49 +1034,49 @@ - 用 正则表达式 判断字符是不是汉字 + 用 正则表达式 判断字符是不是汉字 待判断字符或字符串 真:是汉字;假:不是 - 图片转换成base64 + 图片转换成base64 - 图片转换成base64 + 图片转换成base64 - base64转bitmap + base64转bitmap - base64转bitmap + base64转bitmap - base64转image格式 + base64转image格式 - 重新修改尺寸 + 重新修改尺寸 图片 尺寸 @@ -1084,25 +1084,25 @@ - Resize图片 + Resize图片 - 原始Bitmap + 原始Bitmap 新的宽度 新的高度 处理以后的图片 - Resize图片 + Resize图片 - 原始Bitmap + 原始Bitmap 新的宽度 新的高度 处理以后的图片 - 获取缩略图 + 获取缩略图 宽 @@ -1111,7 +1111,7 @@ - 获取缩略图 + 获取缩略图 宽 @@ -1120,12 +1120,12 @@ - 密码相关通用类 + 密码相关通用类 - 密码相似度 + 密码相似度 @@ -1133,7 +1133,7 @@ - 计算莱文斯坦距离算法 + 计算莱文斯坦距离算法 @@ -1141,7 +1141,7 @@ - 压缩单个文件 + 压缩单个文件 要压缩的文件 压缩后的文件 @@ -1150,28 +1150,28 @@ - 压缩单个文件 + 压缩单个文件 要进行压缩的文件名 压缩后生成的压缩文件名 - 压缩多个文件到指定路径 + 压缩多个文件到指定路径 压缩到哪个路径 压缩文件名称 - 压缩多层目录 + 压缩多层目录 待压缩目录 压缩后生成的压缩文件名,绝对路径 - 压缩多层目录 + 压缩多层目录 待压缩目录 压缩后生成的压缩文件名,绝对路径 @@ -1179,7 +1179,7 @@ - 递归遍历目录 + 递归遍历目录 需遍历的目录 压缩输出流对象 @@ -1188,7 +1188,7 @@ - 解压缩一个 zip 文件。 + 解压缩一个 zip 文件。 压缩文件 解压目录 @@ -1197,7 +1197,7 @@ - 解压缩一个 zip 文件。 + 解压缩一个 zip 文件。 压缩文件 解压目录 @@ -1205,15 +1205,15 @@ - 解压缩一个 zip 文件。 - 覆盖已存在的文件。 + 解压缩一个 zip 文件。 + 覆盖已存在的文件。 压缩文件 解压目录 - 获取压缩文件中指定类型的文件 + 获取压缩文件中指定类型的文件 压缩文件 文件类型(.txt|.exe) @@ -1221,14 +1221,14 @@ - 获取压缩文件中的所有文件 + 获取压缩文件中的所有文件 压缩文件 文件名称列表(包含子目录) - 打包线上线下文件 + 打包线上线下文件 压缩文件名称 文件列表 @@ -1241,37 +1241,38 @@ 是否删除原文件夹 - - 获取所有文件 - - + + 获取所有文件 + + - - 获取一个文件夹下的所有文件夹里的文件 - - + + 获取一个文件夹下的所有文件夹里的文件 + + + - - 获取一个文件夹下的文件 - - 目录名称 - 文件列表HastTable + + 获取一个文件夹下的文件 + + 目录名称 + 文件列表HastTable - 文件对象 + 文件对象 - 文件名称 + 文件名称 - 文件路径 + 文件路径 diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj index 73136c4..5766b68 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj @@ -9,7 +9,7 @@ - + diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj index 708bbb9..a19e4ca 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj @@ -8,7 +8,7 @@ enable - + diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 74b368a..3cd0b95 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -6,144 +6,144 @@ - 前端控件作用类型常量 + 前端控件作用类型常量 - 输入框 + 输入框 - 文本框 + 文本框 - 下拉框 + 下拉框 - 单选框 + 单选框 - 复选框 + 复选框 - 日期选择器 + 日期选择器 - 时间选择器 + 时间选择器 - 数字输入框 + 数字输入框 - 滑动数字条 + 滑动数字条 - 下拉框 + 下拉框 - Sqlsugar系统常量类 + Sqlsugar系统常量类 - 默认库ConfigId + 默认库ConfigId - 默认表主键 + 默认表主键 - varchar(max) + varchar(max) - mysql的longtext + mysql的longtext - sqlite的text + sqlite的text - 数据库上下文对象 + 数据库上下文对象 - 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 + 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 - SqlSugar 数据库实例 + SqlSugar 数据库实例 - 实体拓展配置,自定义类型多库兼容 + 实体拓展配置,自定义类型多库兼容 - Aop设置 + Aop设置 - 实体更多配置 + 实体更多配置 db 数据库类型 - 过滤器设置 + 过滤器设置 - 假删除过滤器 + 假删除过滤器 - 仓储模式对象 + 仓储模式对象 - 批量插入判断走普通导入还是大数据 + 批量插入判断走普通导入还是大数据 数据 阈值 @@ -151,7 +151,7 @@ - 获取列表指定多个字段 + 获取列表指定多个字段 查询条件 查询字段 @@ -159,7 +159,7 @@ - 获取列表指定单个字段 + 获取列表指定单个字段 查询条件 查询字段 @@ -167,7 +167,7 @@ - 获取列表指定单个字段 + 获取列表指定单个字段 查询条件 查询字段 @@ -175,7 +175,7 @@ - 获取指定表的单个字段 + 获取指定表的单个字段 查询条件 查询字段 @@ -183,7 +183,7 @@ - 获取指定表的单个字段 + 获取指定表的单个字段 查询条件 查询字段 @@ -191,7 +191,7 @@ - 根据条件查询获取自动分表的单个数据 + 根据条件查询获取自动分表的单个数据 条件表达式 开始时间 @@ -200,7 +200,7 @@ - 根据条件查询获取自动分表的单个数据 + 根据条件查询获取自动分表的单个数据 条件表达式 分表查询表达式 @@ -208,105 +208,105 @@ - sqlsugar数据库配置 + sqlsugar数据库配置 - 是否驼峰转下划线 + 是否驼峰转下划线 - Linq分页泛型集合 + Linq分页泛型集合 - 主键实体基类 + 主键实体基类 - 主键Id + 主键Id - 拓展信息 + 拓展信息 - 框架实体基类 + 框架实体基类 - 创建时间 + 创建时间 - 更新时间 + 更新时间 - 创建者Id + 创建者Id - 修改者Id + 修改者Id - 创建人 + 创建人 - 更新人 + 更新人 - 软删除 + 软删除 - 业务数据实体基类(数据权限) + 业务数据实体基类(数据权限) - 创建者部门Id + 创建者部门Id - 实体种子数据接口 + 实体种子数据接口 - 种子数据 + 种子数据 - Sqlsugar分页拓展类 + Sqlsugar分页拓展类 - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -316,7 +316,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -326,7 +326,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -338,7 +338,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -350,7 +350,7 @@ - 分页查询 + 分页查询 数据列表 @@ -360,65 +360,65 @@ - SqlSugar 分页泛型集合 + SqlSugar 分页泛型集合 - 页码 + 页码 - 数量 + 数量 - 总条数 + 总条数 - 总页数 + 总页数 - 当前页集合 + 当前页集合 - 是否有上一页 + 是否有上一页 - 是否有下一页 + 是否有下一页 - SqlSugar 事务和工作单元 + SqlSugar 事务和工作单元 - SqlSugar 对象 + SqlSugar 对象 - 构造函数 + 构造函数 - 开启工作单元处理 + 开启工作单元处理 @@ -426,7 +426,7 @@ - 提交工作单元处理 + 提交工作单元处理 @@ -434,7 +434,7 @@ - 回滚工作单元处理 + 回滚工作单元处理 @@ -442,7 +442,7 @@ - 执行完毕(无论成功失败) + 执行完毕(无论成功失败) @@ -450,50 +450,50 @@ - AppStartup启动类 + AppStartup启动类 - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 + ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 + 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! + 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - 检查是否有相同的ConfigId + 检查是否有相同的ConfigId - CodeFirst功能类 + CodeFirst功能类 - CodeFirst生成数据库表结构和种子数据 + CodeFirst生成数据库表结构和种子数据 codefirst选项 程序集名称 - 初始化数据库表结构 + 初始化数据库表结构 程序集名称 - 初始化种子数据 + 初始化种子数据 程序集名称 - 判断类型是否实现某个泛型 + 判断类型是否实现某个泛型 类型 泛型类型 @@ -501,7 +501,7 @@ - List转DataTable + List转DataTable @@ -509,97 +509,97 @@ - 排除SqlSugar忽略的列 + 排除SqlSugar忽略的列 - Sqlsugar字段信息 + Sqlsugar字段信息 - 字段名称 + 字段名称 - 是否主键 + 是否主键 - 字段类型 + 字段类型 - 字段注释 + 字段注释 - Sqlsugar表信息 + Sqlsugar表信息 - - 所属库 + + 所属库 - 表名称 + 表名称 - 实体名 + 实体名 - 表注释 + 表注释 - 表字段 + 表字段 - 种子数据工具类 + 种子数据工具类 - 种子数据格式实体类,遵循Navicat导出json格式 + 种子数据格式实体类,遵循Navicat导出json格式 - 数据 + 数据 - Sqlusgar通用功能 + Sqlusgar通用功能 - 根据特性获取所有表信息 + 根据特性获取所有表信息 - 获取字段信息 + 获取字段信息 @@ -607,21 +607,21 @@ - 数据库字段类型转.NET类型 + 数据库字段类型转.NET类型 字段类型 - 数据类型转显示类型 + 数据类型转显示类型 - 是否通用字段 + 是否通用字段 字段名 -- Gitee From f546bc39b16081b246e53523935d610718794cc5 Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Fri, 8 Sep 2023 15:38:23 +0800 Subject: [PATCH 10/70] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Const/ApplicationConst.cs | 27 + .../Services/Org/OrgService.cs | 10 +- .../Services/Position/PositionService.cs | 10 +- .../Services/User/UserService.cs | 12 +- .../SimpleAdmin.Application.csproj | 45 +- .../Const/SimpleAdminConst.cs | 58 - .../Const/MqttConst.cs | 20 + .../Service/Mqtt/MqttService.cs | 9 +- .../Attributes/BatchEditAttribute.cs | 4 +- .../Const/SysConfigConst.cs | 19 - .../SimpleAdmin.System/Const/SysDictConst.cs | 4 +- .../Const/SysResourceConst.cs | 4 +- .../SimpleAdmin.System/Const/SystemConst.cs | 50 +- ...tSubsciber.cs => NoticeEventSubscriber.cs} | 5 +- .../Organization/Org/ISysOrgService.cs | 6 +- .../Organization/Org/SysOrgService.cs | 6 +- .../Position/ISysPositionService.cs | 6 +- .../Position/SysPositionService.cs | 6 +- .../Organization/User/SysUserService.cs | 8 +- .../SimpleAdmin.System/SimpleAdmin.System.xml | 3104 +++++++++-------- 20 files changed, 1718 insertions(+), 1695 deletions(-) create mode 100644 api/SimpleAdmin/SimpleAdmin.Application/Const/ApplicationConst.cs rename api/SimpleAdmin/{SimpleAdmin.Core => SimpleAdmin.System}/Attributes/BatchEditAttribute.cs (96%) rename api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/{NoticeEventSubsciber.cs => NoticeEventSubscriber.cs} (94%) diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Const/ApplicationConst.cs b/api/SimpleAdmin/SimpleAdmin.Application/Const/ApplicationConst.cs new file mode 100644 index 0000000..a9caa4c --- /dev/null +++ b/api/SimpleAdmin/SimpleAdmin.Application/Const/ApplicationConst.cs @@ -0,0 +1,27 @@ +// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: +// 1.请不要删除和修改根目录下的LICENSE文件。 +// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 +// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin +// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 +// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 +// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 + +namespace SimpleAdmin.Application; + +public class ApplicationConst +{ + #region 别称 + + /// + /// 机构 + /// + public const string BIZ_ORG = "机构"; + + + /// + /// 岗位 + /// + public const string BIZ_POS = "岗位"; + + #endregion 别称 +} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs index b0829a3..a11f26d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs @@ -47,15 +47,15 @@ public class OrgService : DbRepository, IOrgService /// public async Task Add(SysOrgAddInput input) { - await CheckInput(input, SimpleAdminConst.ADD);//检查参数 - await _sysOrgService.Add(input, SimpleAdminConst.BIZ_ORG); + await CheckInput(input, SystemConst.ADD);//检查参数 + await _sysOrgService.Add(input, ApplicationConst.BIZ_ORG); } /// public async Task Edit(SysOrgEditInput input) { - await CheckInput(input, SimpleAdminConst.EDIT);//检查参数 - await _sysOrgService.Edit(input, SimpleAdminConst.BIZ_ORG); + await CheckInput(input, SystemConst.EDIT);//检查参数 + await _sysOrgService.Edit(input, ApplicationConst.BIZ_ORG); } /// @@ -93,7 +93,7 @@ public class OrgService : DbRepository, IOrgService if (orgs.Any(it => it.CreateUserId != UserManager.UserId)) throw Oops.Bah($"只能删除自己创建的机构"); } - await _sysOrgService.Delete(input, SimpleAdminConst.BIZ_ORG);//删除操作 + await _sysOrgService.Delete(input, ApplicationConst.BIZ_ORG);//删除操作 } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs index 87573ed..4c2b24a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs @@ -36,8 +36,8 @@ public class PositionService : DbRepository, IPositionService /// public async Task Add(PositionAddInput input) { - await CheckInput(input, SimpleAdminConst.ADD);//检查参数 - await _sysPositionService.Add(input, SimpleAdminConst.BIZ_POS);//添加岗位 + await CheckInput(input, SystemConst.ADD);//检查参数 + await _sysPositionService.Add(input, ApplicationConst.BIZ_POS);//添加岗位 } /// @@ -64,14 +64,14 @@ public class PositionService : DbRepository, IPositionService if (positions.Any(it => it.CreateUserId != UserManager.UserId)) throw Oops.Bah($"只能删除自己创建的岗位"); } - await _sysPositionService.Delete(input, SimpleAdminConst.BIZ_ORG);//删除岗位 + await _sysPositionService.Delete(input, ApplicationConst.BIZ_ORG);//删除岗位 } /// public async Task Edit(PositionEditInput input) { - await CheckInput(input, SimpleAdminConst.EDIT);//检查参数 - await _sysPositionService.Edit(input, SimpleAdminConst.BIZ_POS);//编辑 + await CheckInput(input, SystemConst.EDIT);//检查参数 + await _sysPositionService.Edit(input, ApplicationConst.BIZ_POS);//编辑 } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs index d0abbab..e010c7f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs @@ -115,7 +115,7 @@ public class UserService : DbRepository, IUserService /// public async Task Add(UserAddInput input) { - await CheckInput(input, SimpleAdminConst.ADD);//检查参数 + await CheckInput(input, SystemConst.ADD);//检查参数 await _sysUserService.Add(input);//添加 } @@ -126,7 +126,7 @@ public class UserService : DbRepository, IUserService /// public async Task Edit(UserEditInput input) { - await CheckInput(input, SimpleAdminConst.EDIT);//检查参数 + await CheckInput(input, SystemConst.EDIT);//检查参数 await _sysUserService.Edit(input);//编辑 } @@ -151,28 +151,28 @@ public class UserService : DbRepository, IUserService /// public async Task DisableUser(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.DISABLE);//检查权限 + await CheckPermission(input.Id, SystemConst.DISABLE);//检查权限 await _sysUserService.DisableUser(input);//禁用 } /// public async Task EnableUser(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.ENABLE);//检查权限 + await CheckPermission(input.Id, SystemConst.ENABLE);//检查权限 await _sysUserService.EnableUser(input);//启用 } /// public async Task GrantRole(UserGrantRoleInput input) { - await CheckPermission(input.Id, SimpleAdminConst.DISABLE);//检查权限 + await CheckPermission(input.Id, SystemConst.DISABLE);//检查权限 await _sysUserService.GrantRole(input);//授权 } /// public async Task ResetPassword(BaseIdInput input) { - await CheckPermission(input.Id, SimpleAdminConst.RESET_PWD);//检查权限 + await CheckPermission(input.Id, SystemConst.RESET_PWD);//检查权限 await _sysUserService.ResetPassword(input);//重置密码 } diff --git a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj index 375b450..e999519 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj @@ -1,29 +1,30 @@  - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Application.xml - enable - + + net7.0;net6.0 + 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 + SimpleAdmin.Application.xml + enable + - - - - - + + + + + - - - + + + + + + + PreserveNewest + + + PreserveNewest + + - - - PreserveNewest - - - PreserveNewest - - diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs index a15be4f..386af56 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Const/SimpleAdminConst.cs @@ -10,64 +10,6 @@ namespace SimpleAdmin.Core; public class SimpleAdminConst { - #region 操作 - - /// - /// 添加操作 - /// - public const string ADD = "添加"; - - /// - /// 编辑操作 - /// - public const string EDIT = "编辑"; - - /// - /// 启用操作 - /// - public const string ENABLE = "启用"; - - /// - /// 禁用操作 - /// - public const string DISABLE = "禁用"; - - /// - /// 重置密码操作 - /// - public const string RESET_PWD = "重置密码"; - - /// - /// 用户授权操作 - /// - public const string GRANT_ROLE = "授权"; - - #endregion 操作 - - #region 别称 - - /// - /// 组织 - /// - public const string SYS_ORG = "组织"; - - /// - /// 机构 - /// - public const string BIZ_ORG = "机构"; - - /// - /// 职位 - /// - public const string SYS_POS = "职位"; - - /// - /// 岗位 - /// - public const string BIZ_POS = "岗位"; - - #endregion 别称 - /// /// 0 /// diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs index 58c4300..e3c77e8 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs @@ -37,4 +37,24 @@ public class MqttConst /// 修改密码 /// public const string MQTT_MESSAGE_UPDATE_PASSWORD = "UpdatePassword"; + + + #region MQTT + + /// + /// mqtt连接地址 + /// + public const string MQTT_PARAM_URL = "MQTT_PARAM_URL"; + + /// + /// mqtt连接用户名 + /// + public const string MQTT_PARAM_USERNAME = "MQTT_PARAM_USERNAME"; + + /// + /// mqtt连接密码 + /// + public const string MQTT_PARAM_PASSWORD = "MQTT_PARAM_PASSWORD"; + + #endregion MQTT } diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs index b8c9238..b5ece4a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs @@ -36,11 +36,11 @@ public class MqttService : IMqttService //获取mqtt配置 var mqttconfig = await _configService.GetListByCategory(CateGoryConst.CONFIG_MQTT_BASE); //地址 - var url = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault(); + var url = mqttconfig.Where(it => it.ConfigKey == MqttConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault(); //用户名 - var userName = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_USERNAME).Select(it => it.ConfigValue).FirstOrDefault(); + var userName = mqttconfig.Where(it => it.ConfigKey == MqttConst.MQTT_PARAM_USERNAME).Select(it => it.ConfigValue).FirstOrDefault(); //密码 - var password = mqttconfig.Where(it => it.ConfigKey == SysConfigConst.MQTT_PARAM_PASSWORD).Select(it => it.ConfigValue).FirstOrDefault(); + var password = mqttconfig.Where(it => it.ConfigKey == MqttConst.MQTT_PARAM_PASSWORD).Select(it => it.ConfigValue).FirstOrDefault(); #region 用户名特殊处理 @@ -59,7 +59,8 @@ public class MqttService : IMqttService #endregion 密码特殊处理 var clientId = $"{user.Id}_{RandomHelper.CreateLetterAndNumber(5)}";//客户端ID - _simpleCacheService.Set(MqttConst.CACHE_MQTT_CLIENT_USER + clientId, token, TimeSpan.FromMinutes(1));//将该客户端ID对应的token插入redis后面可以根据这个判断是哪个token登录的 + _simpleCacheService.Set(MqttConst.CACHE_MQTT_CLIENT_USER + clientId, token, + TimeSpan.FromMinutes(1));//将该客户端ID对应的token插入redis后面可以根据这个判断是哪个token登录的 return new MqttParameterOutput { ClientId = clientId, diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs b/api/SimpleAdmin/SimpleAdmin.System/Attributes/BatchEditAttribute.cs similarity index 96% rename from api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs rename to api/SimpleAdmin/SimpleAdmin.System/Attributes/BatchEditAttribute.cs index 72d04cf..cfc5437 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/BatchEditAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Attributes/BatchEditAttribute.cs @@ -6,11 +6,11 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.Core; +namespace SimpleAdmin.System; /// /// 批量更新 /// public class BatchEditAttribute : Attribute { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs index 5ba5813..cd9dad2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs @@ -101,25 +101,6 @@ public class SysConfigConst #endregion 密码策略 - #region MQTT - - /// - /// mqtt连接地址 - /// - public const string MQTT_PARAM_URL = "MQTT_PARAM_URL"; - - /// - /// mqtt连接用户名 - /// - public const string MQTT_PARAM_USERNAME = "MQTT_PARAM_USERNAME"; - - /// - /// mqtt连接密码 - /// - public const string MQTT_PARAM_PASSWORD = "MQTT_PARAM_PASSWORD"; - - #endregion MQTT - #region 存储引擎 /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs index 932a76b..6fd7d35 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysDictConst.cs @@ -28,7 +28,7 @@ public class SysDictConst /// /// 用户证件类型 /// - public const string IDCARD_TYPE = "IDCARD_TYPE"; + public const string ID_CARD_TYPE = "ID_CARD_TYPE"; /// /// 通用文化程度 @@ -87,7 +87,7 @@ public class SysDictConst /// /// 业务 /// - public const string DICT_CATEGORY_BIZ = "FRM"; + public const string DICT_CATEGORY_BIZ = "BIZ"; #endregion 系统字典分类 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs index 558d5fa..d22a2e6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysResourceConst.cs @@ -19,7 +19,7 @@ public class SysResourceConst public const string CATALOG = "CATALOG"; /// - /// 组件 + /// 菜单 /// public const string MENU = "MENU"; @@ -29,7 +29,7 @@ public class SysResourceConst public const string IFRAME = "IFRAME"; /// - /// 目录 + /// 子页 /// public const string SUBSET = "SUBSET"; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs index 274db01..f776c15 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SystemConst.cs @@ -68,7 +68,6 @@ public class SystemConst /// public const string CACHE_SYS_POSITION = CacheConst.CACHE_PREFIX_WEB + "SysPosition"; - #region 登录错误次数 /// @@ -77,4 +76,53 @@ public class SystemConst public const string CACHE_LOGIN_ERROR_COUNT = CacheConst.CACHE_PREFIX_WEB + "LoginErrorCount:"; #endregion 登录错误次数 + + #region 操作 + + /// + /// 添加操作 + /// + public const string ADD = "添加"; + + /// + /// 编辑操作 + /// + public const string EDIT = "编辑"; + + /// + /// 启用操作 + /// + public const string ENABLE = "启用"; + + /// + /// 禁用操作 + /// + public const string DISABLE = "禁用"; + + /// + /// 重置密码操作 + /// + public const string RESET_PWD = "重置密码"; + + /// + /// 用户授权操作 + /// + public const string GRANT_ROLE = "授权"; + + #endregion 操作 + + #region 别称 + + /// + /// 组织 + /// + public const string SYS_ORG = "组织"; + + + /// + /// 职位 + /// + public const string SYS_POS = "职位"; + + #endregion 别称 } diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs similarity index 94% rename from api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs rename to api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs index bd4af08..c0b7b37 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubsciber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs @@ -13,7 +13,7 @@ namespace SimpleAdmin.System; /// /// 通知事件总线 /// -public class NoticeEventSubsciber : IEventSubscriber, ISingleton +public class NoticeEventSubscriber : IEventSubscriber, ISingleton { private readonly ISimpleCacheService _simpleCacheService; private readonly INamedServiceProvider _namedServiceProvider; @@ -21,7 +21,8 @@ public class NoticeEventSubsciber : IEventSubscriber, ISingleton private readonly IServiceScopeFactory _scopeFactory; private readonly SqlSugarScope _db; - public NoticeEventSubsciber(ISimpleCacheService simpleCacheService, IServiceScopeFactory scopeFactory, INamedServiceProvider namedServiceProvider) + public NoticeEventSubscriber(ISimpleCacheService simpleCacheService, IServiceScopeFactory scopeFactory, + INamedServiceProvider namedServiceProvider) { _db = DbContext.DB; _simpleCacheService = simpleCacheService; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs index c3a7471..8f2d0d4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs @@ -95,7 +95,7 @@ public interface ISysOrgService : ITransient /// 添加参数 /// 名称 /// - Task Add(SysOrgAddInput input, string name = SimpleAdminConst.SYS_ORG); + Task Add(SysOrgAddInput input, string name = SystemConst.SYS_ORG); /// /// 复制组织 @@ -114,7 +114,7 @@ public interface ISysOrgService : ITransient /// 编辑参数 /// 名称 /// - Task Edit(SysOrgEditInput input, string name = SimpleAdminConst.SYS_ORG); + Task Edit(SysOrgEditInput input, string name = SystemConst.SYS_ORG); #endregion 编辑 @@ -126,7 +126,7 @@ public interface ISysOrgService : ITransient /// 删除参数 /// 名称 /// - Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SYS_ORG); + Task Delete(BaseIdListInput input, string name = SystemConst.SYS_ORG); #endregion 删除 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs index c421fc9..f9cc32b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs @@ -167,7 +167,7 @@ public class SysOrgService : DbRepository, ISysOrgService #region 新增 /// - public async Task Add(SysOrgAddInput input, string name = SimpleAdminConst.SYS_ORG) + public async Task Add(SysOrgAddInput input, string name = SystemConst.SYS_ORG) { await CheckInput(input, name);//检查参数 var sysOrg = input.Adapt();//实体转换 @@ -238,7 +238,7 @@ public class SysOrgService : DbRepository, ISysOrgService #region 编辑 /// - public async Task Edit(SysOrgEditInput input, string name = SimpleAdminConst.SYS_ORG) + public async Task Edit(SysOrgEditInput input, string name = SystemConst.SYS_ORG) { await CheckInput(input, name);//检查参数 var sysOrg = input.Adapt();//实体转换 @@ -251,7 +251,7 @@ public class SysOrgService : DbRepository, ISysOrgService #region 删除 /// - public async Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SYS_ORG) + public async Task Delete(BaseIdListInput input, string name = SystemConst.SYS_ORG) { //获取所有ID var ids = input.Ids; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs index 1f39a28..57a30fc 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/ISysPositionService.cs @@ -19,7 +19,7 @@ public interface ISysPositionService : ITransient /// 添加参数 /// 名称 /// - Task Add(PositionAddInput input, string name = SimpleAdminConst.SYS_POS); + Task Add(PositionAddInput input, string name = SystemConst.SYS_POS); /// /// 删除职位 @@ -27,7 +27,7 @@ public interface ISysPositionService : ITransient /// id列表 /// 名称 /// - Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SYS_POS); + Task Delete(BaseIdListInput input, string name = SystemConst.SYS_POS); /// /// 编辑职位 @@ -35,7 +35,7 @@ public interface ISysPositionService : ITransient /// 编辑参数 /// 名称 /// - Task Edit(PositionEditInput input, string name = SimpleAdminConst.SYS_POS); + Task Edit(PositionEditInput input, string name = SystemConst.SYS_POS); /// /// 获取职位列表 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs index 340409b..c46caeb 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs @@ -93,7 +93,7 @@ public class SysPositionService : DbRepository, ISysPositionService } /// - public async Task Add(PositionAddInput input, string name = SimpleAdminConst.SYS_POS) + public async Task Add(PositionAddInput input, string name = SystemConst.SYS_POS) { await CheckInput(input, name);//检查参数 var sysPosition = input.Adapt();//实体转换 @@ -103,7 +103,7 @@ public class SysPositionService : DbRepository, ISysPositionService } /// - public async Task Edit(PositionEditInput input, string name = SimpleAdminConst.SYS_POS) + public async Task Edit(PositionEditInput input, string name = SystemConst.SYS_POS) { await CheckInput(input, name);//检查参数 var sysPosition = input.Adapt();//实体转换 @@ -112,7 +112,7 @@ public class SysPositionService : DbRepository, ISysPositionService } /// - public async Task Delete(BaseIdListInput input, string name = SimpleAdminConst.SYS_POS) + public async Task Delete(BaseIdListInput input, string name = SystemConst.SYS_POS) { //获取所有ID var ids = input.Ids; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs index 124445b..408f771 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs @@ -481,7 +481,7 @@ public class SysUserService : DbRepository, ISysUserService var isSuperAdmin = sysUser.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin) throw Oops.Bah($"不可禁用系统内置超管用户账号"); - CheckSelf(input.Id, SimpleAdminConst.DISABLE);//判断是不是自己 + CheckSelf(input.Id, SystemConst.DISABLE);//判断是不是自己 //设置状态为禁用 if (await UpdateAsync(it => new SysUser { @@ -494,7 +494,7 @@ public class SysUserService : DbRepository, ISysUserService /// public async Task EnableUser(BaseIdInput input) { - CheckSelf(input.Id, SimpleAdminConst.ENABLE);//判断是不是自己 + CheckSelf(input.Id, SystemConst.ENABLE);//判断是不是自己 //设置状态为启用 if (await UpdateAsync(it => new SysUser { @@ -524,7 +524,7 @@ public class SysUserService : DbRepository, ISysUserService var isSuperAdmin = sysUser.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin) throw Oops.Bah($"不能给超管分配角色"); - CheckSelf(input.Id, SimpleAdminConst.GRANT_ROLE);//判断是不是自己 + CheckSelf(input.Id, SystemConst.GRANT_ROLE);//判断是不是自己 //给用户赋角色 await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_USER_HAS_ROLE, input.Id, input.RoleIdList.Select(it => it.ToString()).ToList(), null, @@ -919,7 +919,7 @@ public class SysUserService : DbRepository, ISysUserService if (!string.IsNullOrEmpty(item.IdCardType)) { var idCarTypes = - await _dictService.GetValuesByDictValue(SysDictConst.IDCARD_TYPE, dicts); + await _dictService.GetValuesByDictValue(SysDictConst.ID_CARD_TYPE, dicts); if (!idCarTypes.Contains(item.IdCardType)) item.ErrorInfo.Add(nameof(item.IdCardType), $"证件类型错误"); } diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index 42e08b7..1418573 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -6,2117 +6,2117 @@ - 前端表格特性 + 前端表格特性 - 是否是日期格式 + 是否是日期格式 - 是否自动省略 + 是否自动省略 - 宽度 + 宽度 - 验证值是否在字典中,大数据慎用 + 验证值是否在字典中,大数据慎用 - 字典值 + 字典值 - 获取错误信息 + 获取错误信息 - 分类常量 + 分类常量 - 系统基础 + 系统基础 - 登录策略 + 登录策略 - 密码策略 + 密码策略 - 业务定义 + 业务定义 - 文件-本地 + 文件-本地 - 文件-MINIO + 文件-MINIO - MQTT配置 + MQTT配置 - 用户有哪些角色 + 用户有哪些角色 - 角色有哪些资源 + 角色有哪些资源 - 角色有哪些模块 + 角色有哪些模块 - - 用户有哪些资源 - + + 用户有哪些资源 + - 角色有哪些权限 + 角色有哪些权限 - 角色有哪些权限 + 角色有哪些权限 - 用户工作台数据 + 用户工作台数据 - 用户日程数据 + 用户日程数据 - 站内信与接收用户 + 站内信与接收用户 - 本人 + 本人 - 所有 + 所有 - 仅所属组织 + 仅所属组织 - 所属组织及以下 + 所属组织及以下 - 自定义 + 自定义 - 模块 + 模块 - 菜单 + 菜单 - 单页 + 单页 - 按钮 + 按钮 - 登录 + 登录 - 登出 + 登出 - 操作 + 操作 - 异常 + 异常 - 框架 + 框架 - 业务 + 业务 - 部门 + 部门 - 公司 + 公司 - 高层 + 高层 - 中层 + 中层 - 基层 + 基层 - 全局 + 全局 - 机构 + 机构 - 通知 + 通知 - 公告 + 公告 - 系统配置常量 + 系统配置常量 - 系统默认工作台 + 系统默认工作台 - 登录验证码开关 + 登录验证码开关 - 登录验证码开关 + 登录验证码开关 - 单用户登录开关 + 单用户登录开关 - 登录错误锁定时长 + 登录错误锁定时长 - 登录错误锁定时长 + 登录错误锁定时长 - 登录错误次数 + 登录错误次数 - 默认用户密码 + 默认用户密码 - 密码定期提醒更新 + 密码定期提醒更新 - 密码定期提醒更新时间 + 密码定期提醒更新时间 - 修改初始密码提醒 + 修改初始密码提醒 - 密码最小长度 + 密码最小长度 - 包含数字 + 包含数字 - 包含小写字母 + 包含小写字母 - 包含大写字母 + 包含大写字母 - 包含特殊字符 + 包含特殊字符 - mqtt连接地址 + mqtt连接地址 - mqtt连接用户名 + mqtt连接用户名 - mqtt连接密码 + mqtt连接密码 - windows系统本地目录 + windows系统本地目录 - Unix系统本地目录 + Unix系统本地目录 - MINIO文件AccessKey + MINIO文件AccessKey - MINIO文件SecetKey + MINIO文件SecetKey - MINIO文件EndPoint + MINIO文件EndPoint - MINIO文件默认存储桶 + MINIO文件默认存储桶 - 字典常量 + 字典常量 - 性别 + 性别 - 名族 + 名族 - + - 用户证件类型 + 用户证件类型 - 通用文化程度 + 通用文化程度 - 启用 + 启用 - 停用 + 停用 - 在线 + 在线 - 离线 + 离线 - 本地 + 本地 - MINIO + MINIO - 系统 + 系统 - 业务 + 业务 - 日志常量 + 日志常量 - 成功 + 成功 - 成功 + 成功 - 资源表常量 + 资源表常量 - 目录 + 目录 - 组件 + 组件 - 内链 + 内链 - 目录 + 目录 - 外链 + 外链 - 单页 + 单页 - 系统内置单页面编码 + 系统内置单页面编码 - 角色常量 + 角色常量 - 超级管理员 + 超级管理员 - 业务管理员 + 业务管理员 - 系统层常量 + 系统层常量 - 系统配置表缓存Key + 系统配置表缓存Key - 登录验证码缓存Key + 登录验证码缓存Key - 用户表缓存Key + 用户表缓存Key - 用户手机号关系缓存Key + 用户手机号关系缓存Key - 用户手机号关系缓存Key + 用户手机号关系缓存Key - 资源表缓存Key + 资源表缓存Key - 字典表缓存Key + 字典表缓存Key - 关系表缓存Key + 关系表缓存Key - 机构表缓存Key + 机构表缓存Key - 角色表缓存Key + 角色表缓存Key - 职位表缓存Key + 职位表缓存Key - 登录错误次数缓存Key + 登录错误次数缓存Key - - 批量修改 + + 批量修改 - - 唯一编码 + + 唯一编码 - - 所属库 + + 所属库 - - 实体名 + + 实体名 - - 表名 + + 表名 - - 表描述 + + 表描述 - - 批量修改配置表 + + 批量修改配置表 - - 批量配置Id + + 批量配置Id - - 字段名 + + 字段名 - - 字段描述 + + 字段描述 - - 作用类型 + + 作用类型 - - 字典值 + + 字典值 - - 数据库类型 + + 数据库类型 - 接口名称 + 接口名称 - 接口类型 + 接口类型 - 接口结果标签 + 接口结果标签 - 接口结果值 + 接口结果值 - 启用状态 + 启用状态 - - C端用户 + + C端用户 - - 头像 + + 头像 - - 签名 + + 签名 - - 账号 + + 账号 - - 密码 + + 密码 - - 姓名 + + 姓名 - - 昵称 + + 昵称 - - 性别 + + 性别 - - 年龄 + + 年龄 - - 出生日期 + + 出生日期 - - 民族 + + 民族 - - 籍贯 + + 籍贯 - - 家庭住址 + + 家庭住址 - - 通信地址 + + 通信地址 - - 证件类型 + + 证件类型 - - 证件号码 + + 证件号码 - - 文化程度 + + 文化程度 - - 政治面貌 + + 政治面貌 - - 毕业院校 + + 毕业院校 - - 学历 + + 学历 - - 学制 + + 学制 - - 学位 + + 学位 - - 手机 + + 手机 - - 邮箱 + + 邮箱 - - 家庭电话 + + 家庭电话 - - 办公电话 + + 办公电话 - - 紧急联系人 + + 紧急联系人 - - 紧急联系人电话 + + 紧急联系人电话 - - 紧急联系人地址 + + 紧急联系人地址 - - 员工编号 + + 员工编号 - - 入职日期 + + 入职日期 - - 机构id + + 机构id - - 职位id + + 职位id - - 职级 + + 职级 - - 主管id + + 主管id - - 兼任信息 + + 兼任信息 - - 上次登录ip + + 上次登录ip - - 上次登录地点 + + 上次登录地点 - - 上次登录时间 + + 上次登录时间 - - 上次登录设备 + + 上次登录设备 - - 最新登录ip + + 最新登录ip - - 最新登录地点 + + 最新登录地点 - - 最新登录时间 + + 最新登录时间 - - 最新登录设备 + + 最新登录设备 - - 用户状态 + + 用户状态 - - 排序码 + + 排序码 - - 配置 + + 配置 - - 配置键 + + 配置键 - - 配置值 + + 配置值 - - 分类 + + 分类 - - 备注 + + 备注 - - 排序码 + + 排序码 - - 字典 + + 字典 - - 父id + + 父id - - 字典文字 + + 字典文字 - - 字典值 + + 字典值 - - 分类 + + 分类 - - 排序码 + + 排序码 - - 状态 + + 状态 - 子节点 + 子节点 - - 文件表 + + 文件表 - - 存储引擎 + + 存储引擎 - - 存储桶 + + 存储桶 - - 文件名称 + + 文件名称 - - 文件后缀 + + 文件后缀 - - 文件大小kb + + 文件大小kb - - 文件大小(格式化后) + + 文件大小(格式化后) - - 文件的对象名(唯一名称) + + 文件的对象名(唯一名称) - - 文件存储路径 + + 文件存储路径 - - 文件下载路径 + + 文件下载路径 - - 图片缩略图 + + 图片缩略图 - - 操作日志表 + + 操作日志表 - - 具体消息 + + 具体消息 - - 类名称 + + 类名称 - - 方法名称 + + 方法名称 - - 请求方式 + + 请求方式 - - 请求地址 + + 请求地址 - - 请求参数 + + 请求参数 - - 返回结果 + + 返回结果 - - 访问日志表 + + 访问日志表 - - 日志分类 + + 日志分类 - - 日志名称 + + 日志名称 - - 执行状态 + + 执行状态 - - 操作ip + + 操作ip - - 操作地址 + + 操作地址 - - 操作浏览器 + + 操作浏览器 - - 操作系统 + + 操作系统 - - 操作时间 + + 操作时间 - - 操作人姓名 + + 操作人姓名 - - 操作人姓名 + + 操作人姓名 - - 站内信 + + 站内信 - - 分类 + + 分类 - - 主题 + + 主题 - - 正文 + + 正文 - 是否已读 + 是否已读 - - 用户消息表 + + 用户消息表 - - 消息Id + + 消息Id - - 用户Id + + 用户Id - - 已读未读 + + 已读未读 - - 组织 + + 组织 - - 父id + + 父id - - 主管ID + + 主管ID - - 名称 + + 名称 - - 全称 + + 全称 - - 编码 + + 编码 - - 分类 + + 分类 - - 排序码 + + 排序码 - 子节点 + 子节点 - 设置为叶子节点(设置了loadData时有效) + 设置为叶子节点(设置了loadData时有效) - - 职位表 + + 职位表 - - 组织id + + 组织id - - 名称 + + 名称 - - 编码 + + 编码 - - 分类 + + 分类 - - 排序码 + + 排序码 - - 系统关系表 + + 系统关系表 - - 对象ID + + 对象ID - - 目标ID + + 目标ID - - 分类 + + 分类 - - 资源 + + 资源 - - 父id + + 父id - - 标题 + + 标题 - - 别名 + + 别名 - - 描述 + + 描述 - - 编码 + + 编码 - - 分类 + + 分类 - - 模块 + + 模块 - - 菜单类型 + + 菜单类型 - - 路径 + + 路径 - - 组件 + + 组件 - - 图标 + + 图标 - - 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + + 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) - - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - - 菜单是否固定在标签页中 (首页通常是固定项) + + 菜单是否固定在标签页中 (首页通常是固定项) - - 菜单是否固定在标签页中 (首页通常是固定项) + + 菜单是否固定在标签页中 (首页通常是固定项) - - 是否为首页 + + 是否为首页 - - 排序码 + + 排序码 - 菜单元标签 + 菜单元标签 - 子节点 + 子节点 - 菜单元标签 + 菜单元标签 - 图标 + 图标 - 标题 + 标题 - - 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + + 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) - - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - 路由外链时填写的访问地址 + 路由外链时填写的访问地址 - - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - - 菜单是否固定在标签页中 (首页通常是固定项) + + 菜单是否固定在标签页中 (首页通常是固定项) - - 菜单是否固定在标签页中 (首页通常是固定项) + + 菜单是否固定在标签页中 (首页通常是固定项) - - 角色 + + 角色 - - 组织id + + 组织id - - 名称 + + 名称 - - 编码 + + 编码 - - 分类 + + 分类 - - 默认数据范围 + + 默认数据范围 - - 排序码 + + 排序码 - 默认数据范围 + 默认数据范围 - 数据范围等级 + 数据范围等级 - 数据范围 + 数据范围 - 自定义机构范围列表 + 自定义机构范围列表 - - 用户信息表 + + 用户信息表 - - 头像 + + 头像 - - 签名 + + 签名 - - 账号 + + 账号 - - 密码 + + 密码 - - 姓名 + + 姓名 - - 昵称 + + 昵称 - - 性别 + + 性别 - - 出生日期 + + 出生日期 - - 民族 + + 民族 - - 籍贯 + + 籍贯 - - 家庭住址 + + 家庭住址 - - 通信地址 + + 通信地址 - - 证件类型 + + 证件类型 - - 证件号码 + + 证件号码 - - 文化程度 + + 文化程度 - - 政治面貌 + + 政治面貌 - - 毕业院校 + + 毕业院校 - - 学历 + + 学历 - - 学制 + + 学制 - - 学位 + + 学位 - - 手机 - 这里使用了SM4自动加密解密 + + 手机 + 这里使用了SM4自动加密解密 - - 邮箱 + + 邮箱 - - 家庭电话 + + 家庭电话 - - 办公电话 + + 办公电话 - - 紧急联系人 + + 紧急联系人 - - 紧急联系人电话 + + 紧急联系人电话 - - 紧急联系人地址 + + 紧急联系人地址 - - 员工编号 + + 员工编号 - - 入职日期 + + 入职日期 - - 机构id + + 机构id - - 职位id + + 职位id - - 职级 + + 职级 - - 主管id + + 主管id - - 兼任信息 + + 兼任信息 - - 上次修改密码时间 + + 上次修改密码时间 - - 上次登录ip + + 上次登录ip - - 上次登录地点 + + 上次登录地点 - - 上次登录时间 + + 上次登录时间 - - 上次登录设备 + + 上次登录设备 - - 最新登录ip + + 最新登录ip - - 最新登录地点 + + 最新登录地点 - - 最新登录时间 + + 最新登录时间 - - 最新登录设备 + + 最新登录设备 - - 用户状态 + + 用户状态 - - 排序码 + + 排序码 - - 默认模块 + + 默认模块 - 机构信息 + 机构信息 - 机构信息全称 + 机构信息全称 - 职位信息 + 职位信息 - 按钮码集合 + 按钮码集合 - 权限码集合 + 权限码集合 - 角色码集合 + 角色码集合 - 角色ID集合 + 角色ID集合 - 数据范围集合 + 数据范围集合 - 默认数据范围 + 默认数据范围 - 机构及以下机构ID集合 + 机构及以下机构ID集合 - 机构及以下机构ID集合 + 机构及以下机构ID集合 - 数据范围类 + 数据范围类 - API接口 + API接口 - 数据范围分类 + 数据范围分类 - 数据范围的机构ID列表 + 数据范围的机构ID列表 - 兼任信息 + 兼任信息 - 组织ID + 组织ID - 机构ID + 机构ID - 主管ID + 主管ID - 认证模块事件总线 + 认证模块事件总线 - 登录事件 + 登录事件 - 登出事件 + 登出事件 - 解析IP地址 + 解析IP地址 ip地址 - 获取通知服务 + 获取通知服务 - 事件总线常量 + 事件总线常量 - B端登录 + B端登录 - B端登录 + B端登录 - 清除用户缓存 + 清除用户缓存 - 通知用户下线 + 通知用户下线 - 新消息 + 新消息 - 登录事件参数 + 登录事件参数 - 请求上下文 + 请求上下文 - 用户信息 + 用户信息 - Ip地址 + Ip地址 - 登录设备 + 登录设备 - Tokens + Tokens - 过期时间 + 过期时间 - 时间 + 时间 - 用户登出事件 + 用户登出事件 - 用户Id + 用户Id - token信息 + token信息 - 内容 + 内容 - 新消息事件 + 新消息事件 - 用户Id + 用户Id - 内容 + 内容 - + - 通知事件总线 + 通知事件总线 - + - 通知用户下线事件 + 通知用户下线事件 - + - 有新的消息 + 有新的消息 - + - 获取服务 + 获取服务 - + - 获取通知服务 + 获取通知服务 - 用户模块事件总线 + 用户模块事件总线 - 根据角色ID列表清除用户缓存 + 根据角色ID列表清除用户缓存 - 站内信与接收用户拓展 - MSG_TO_USER + 站内信与接收用户拓展 + MSG_TO_USER - 是否已读 + 是否已读 - SYS_ROLE_HAS_PERMISSION - 角色权限关系扩展 + SYS_ROLE_HAS_PERMISSION + 角色权限关系扩展 - 数据范围 + 数据范围 - 自定义机构范围列表 + 自定义机构范围列表 - 接口Url + 接口Url - SYS_ROLE_HAS_RESOURCE - 角色有哪些资源扩展 + SYS_ROLE_HAS_RESOURCE + 角色有哪些资源扩展 - 菜单ID + 菜单ID - 按钮信息 + 按钮信息 - SYS_USER_SCHEDULE_DATA - 用户日程扩展 + SYS_USER_SCHEDULE_DATA + 用户日程扩展 - 日程日期 + 日程日期 - 日程时间 + 日程时间 - 日程内容 + 日程内容 - 用户id + 用户id - 用户姓名 + 用户姓名 - SYS_USER_WORKBENCH_DATA - 用户工作台扩展 + SYS_USER_WORKBENCH_DATA + 用户工作台扩展 - 快捷方式列表 + 快捷方式列表 - 工作台快捷方式信息 + 工作台快捷方式信息 - id + id - 标题 + 标题 - 图标 + 图标 - 路由地址 + 路由地址 - 对象映射 + 对象映射 - 系统配置 + 系统配置 - Minio功能类 + Minio功能类 - 初始化操作 + 初始化操作 - 上传文件 - 返回Minio文件完整Url + 上传文件 - 返回Minio文件完整Url 存储桶里的对象名称,例:/mnt/photos/island.jpg 文件 @@ -2125,59 +2125,59 @@ - 下载文件 + 下载文件 - 批量修改字段种子数据 + 批量修改字段种子数据 - 批量修改配置种子数据 + 批量修改配置种子数据 - 系统配置种子数据 + 系统配置种子数据 - 字典表种子数据 + 字典表种子数据 - 机构种子数据 + 机构种子数据 - 职位表种子数据 + 职位表种子数据 - 关系表种子数据 + 关系表种子数据 - 资源表种子数据 + 资源表种子数据 - 角色种子数据 + 角色种子数据 - 用户表种子数据 + 用户表种子数据 @@ -2203,21 +2203,21 @@ - 登录之前执行的方法 + 登录之前执行的方法 - 登录错误操作 + 登录错误操作 - 校验验证码方法 + 校验验证码方法 验证码 请求号 @@ -2225,13 +2225,13 @@ - 从Redis中删除验证码 + 从Redis中删除验证码 - 校验手机验证码 + 校验手机验证码 输入参数 登录端类型 @@ -2240,7 +2240,7 @@ - 添加验证码到redis + 添加验证码到redis 验证码 过期时间 @@ -2248,7 +2248,7 @@ - 执行B端登录 + 执行B端登录 用户信息 登录设备 @@ -2257,256 +2257,258 @@ - 写入用户token到redis + 写入用户token到redis 登录事件参数 登录类型 - redis删除用户token + redis删除用户token 登录事件参数 登录类型 - 获取用户token列表 + 获取用户token列表 用户ID token列表 - 单用户登录通知用户下线 + 单用户登录通知用户下线 用户ID Token列表 - 权限认证输入 + 权限认证输入 - 验证码 + 验证码 - 请求号 + 请求号 - 登录输入参数 + 登录输入参数 - - 账号 + + 账号 - superAdmin + superAdmin - - 密码 + + 密码 - 04fc514b346f14b23d7cf5e6f64663b030512aa380a9e7d311288ed1e8be7b863ae5ee0bb570df2405fc9daff2b2d1ac627a0fbbd49ef2c6b8fac4fd5e4b9a1b7120999bdc0a8e425aa37abab3aec6f9f3570775ff901f2845e957b0c2d0542e21fbf1bbb65c04 + + 04fc514b346f14b23d7cf5e6f64663b030512aa380a9e7d311288ed1e8be7b863ae5ee0bb570df2405fc9daff2b2d1ac627a0fbbd49ef2c6b8fac4fd5e4b9a1b7120999bdc0a8e425aa37abab3aec6f9f3570775ff901f2845e957b0c2d0542e21fbf1bbb65c04 + - 设备类型,默认PC + 设备类型,默认PC 0 - 登出输入参数 + 登出输入参数 - token + token - 获取短信验证码输入 + 获取短信验证码输入 - 手机号 + 手机号 - 手机号登录输入 + 手机号登录输入 - 设备类型,默认PC + 设备类型,默认PC 0 - 验证码返回 + 验证码返回 - 验证码图片,Base64 + 验证码图片,Base64 - 验证码请求号 + 验证码请求号 - 登录返回参数 + 登录返回参数 - 令牌Token + 令牌Token - 账号 + 账号 - 姓名 + 姓名 - 默认模块 + 默认模块 - 模块列表 + 模块列表 - 登录用互信息 + 登录用互信息 - - 头像 + + 头像 - - 签名 + + 签名 - - 账号 + + 账号 - - 姓名 + + 姓名 - - 昵称 + + 昵称 - 手机号 + 手机号 - 生日 + 生日 - 邮箱 + 邮箱 - - 性别 + + 性别 - - 家庭住址 + + 家庭住址 - 机构信息 + 机构信息 - 机构信息全称 + 机构信息全称 - 职位信息 + 职位信息 - 角色码集合 + 角色码集合 - 按钮码集合 + 按钮码集合 - 机构及以下机构ID集合 + 机构及以下机构ID集合 - - 默认模块 + + 默认模块 - 权限校验服务 + 权限校验服务 - 获取图形验证码 + 获取图形验证码 - 获取登录用户信息 + 获取登录用户信息 - 获取手机短信验证码 + 获取手机短信验证码 验证码参数 登录类型 @@ -2514,7 +2516,7 @@ - 登录 + 登录 登录参数 登录类型 @@ -2522,7 +2524,7 @@ - 手机号登录 + 手机号登录 登录参数 登录端类型 @@ -2530,7 +2532,7 @@ - 退出登录 + 退出登录 token 登出类型 @@ -2538,154 +2540,154 @@ - 会话分页查询 + 会话分页查询 - - 账号 + + 账号 - - 姓名 + + 姓名 - - 最新登录ip + + 最新登录ip - Token退出参数 + Token退出参数 - token + token - 会话输出 + 会话输出 - 主键Id + 主键Id - - 头像 + + 头像 - - 账号 + + 账号 - - 姓名 + + 姓名 - 在线状态 + 在线状态 - - 最新登录ip + + 最新登录ip - - 最新登录地点 + + 最新登录地点 - - 最新登录时间 + + 最新登录时间 - 令牌数量 + 令牌数量 - 令牌信息集合 + 令牌信息集合 - 会话统计结果 + 会话统计结果 - 当前会话总数量 + 当前会话总数量 - 最大签发令牌数 + 最大签发令牌数 - 在线用户数 + 在线用户数 - BC端会话比例 + BC端会话比例 - 会话管理服务 + 会话管理服务 - 会话统计 + 会话统计 统计结果 - 强退会话 + 强退会话 用户ID - 强退token + 强退token token列表 - B端会话分页查询 + B端会话分页查询 查询参数 B端会话列表 - C端会话分页查询 + C端会话分页查询 查询参数 C端会话列表 - + @@ -2705,45 +2707,45 @@ - 获取redis中token信息列表 + 获取redis中token信息列表 - 获取token剩余时间信息 + 获取token剩余时间信息 token列表 登录类型 - 通知用户下线 + 通知用户下线 - + - + - + - + - + - + @@ -2756,162 +2758,162 @@ - 获取配置 + 获取配置 - 检查输入参数 + 检查输入参数 - 批量分页查询参数 + 批量分页查询参数 - 唯一编码 + 唯一编码 - 所属库 + 所属库 - 实体名 + 实体名 - 表名 + 表名 - 添加批量参数 + 添加批量参数 - 唯一编码 + 唯一编码 - 所属库 + 所属库 - 实体名 + 实体名 - 表名 + 表名 - 表描述 + 表描述 - 修改批量参数 + 修改批量参数 - Id + Id - 批量修改输入 + 批量修改输入 - 批量编辑Code + 批量编辑Code - Id列表 + Id列表 - 字段列表 + 字段列表 - 批量修改DTO + 批量修改DTO - 批量服务 + 批量服务 - 批量分页查询 + 批量分页查询 查询参数 分页结果 - 添加批量 + 添加批量 添加参数 - 删除批量 + 删除批量 删除参数 - 获取需要批量修改的表 + 获取需要批量修改的表 - 获取批量修改配置 + 获取批量修改配置 - 配置字段 + 配置字段 字段信息 - 批量配置字段列表 + 批量配置字段列表 唯一编码 列表 - 获取字典配置 + 获取字典配置 唯一编码 字段信息 @@ -2919,24 +2921,24 @@ - 同步字段 + 同步字段 id - 文件分页输出 + 文件分页输出 - 文件引擎 + 文件引擎 - + @@ -2959,21 +2961,21 @@ - 存储文件 + 存储文件 - 存储本地文件 + 存储本地文件 - 存储到minio + 存储到minio @@ -2981,40 +2983,40 @@ - 获取文件大小 + 获取文件大小 - 判断是否是图片 + 判断是否是图片 后缀名 - 文件管理服务 + 文件管理服务 - 删除文件 + 删除文件 ID列表 - 文件下载 + 文件下载 文件iD 文件流 - 获取FileStreamResult文件流 + 获取FileStreamResult文件流 路径 文件名 @@ -3023,7 +3025,7 @@ - 获取FileStreamResult文件流 + 获取FileStreamResult文件流 文件数组 文件名 @@ -3031,14 +3033,14 @@ - 文件分页查询 + 文件分页查询 查询参数 文件列表 - 上传文件到本地返回下载url + 上传文件到本地返回下载url 文件引擎 文件 @@ -3046,69 +3048,69 @@ - 站内信分类 + 站内信分类 - 发送参数 + 发送参数 - 主题 + 主题 - 分类 + 分类 - 接收人Id + 接收人Id - 消息详情 + 消息详情 - 接收信息类 + 接收信息类 - 接收人ID + 接收人ID - 接收人姓名 + 接收人姓名 - 是否已读 + 是否已读 - 站内信服务 + 站内信服务 - 删除消息 + 删除消息 id列表 - 删除我的消息 + 删除我的消息 @@ -3116,7 +3118,7 @@ - 获取消息详情 + 获取消息详情 消息ID 是否是自己 @@ -3124,7 +3126,7 @@ - 我的消息列表 + 我的消息列表 @@ -3132,175 +3134,175 @@ - 分页查询 + 分页查询 查询参数 - 发送站内信 + 发送站内信 站内信信息 - 获取未读消息数 + 获取未读消息数 - + - + - + - + - + - + - + - + - 导入预览输入 + 导入预览输入 - 文件导入通用输出 + 文件导入通用输出 - 是否有错误 + 是否有错误 - 动态表头 + 动态表头 - 数据 + 数据 - 动态表头 + 动态表头 - 标题 + 标题 - 数据源 + 数据源 - 宽度 + 宽度 - 超过宽度将自动省略 + 超过宽度将自动省略 - 是否是日期格式 + 是否是日期格式 - 批量导入结果输入 + 批量导入结果输入 - 数据 + 数据 - 导入结果输出 + 导入结果输出 - 是否成功 + 是否成功 - 总数 + 总数 - 导入数量 + 导入数量 - 错误数 + 错误数 - 数据 + 数据 - 导入基础输入 + 导入基础输入 - Id + Id - 是否有错误 + 是否有错误 - 错误详情 + 错误详情 - 导入服务 + 导入服务 - 导出数据 + 导出数据 数据 @@ -3309,7 +3311,7 @@ - 获取本地模板 + 获取本地模板 文件名 模板文件夹路径:默认wwwroot下的Template @@ -3317,7 +3319,7 @@ - 生成模板 + 生成模板 实体类 文件名 @@ -3325,7 +3327,7 @@ - 获取导入预览 + 获取导入预览 文件 @@ -3333,7 +3335,7 @@ - 获取预计导入结果 + 获取预计导入结果 数据 @@ -3342,7 +3344,7 @@ - 导入文件验证 + 导入文件验证 文件 文件最大体积(M) @@ -3350,7 +3352,7 @@ - 模板数据验证 + 模板数据验证 模板类实体 结果 @@ -3358,7 +3360,7 @@ - + @@ -3381,7 +3383,7 @@ - 获取文件流 + 获取文件流 @@ -3390,7 +3392,7 @@ - 获取文件流 + 获取文件流 @@ -3398,76 +3400,76 @@ - 获取文件名 + 获取文件名 - 获取本地模板路径 + 获取本地模板路径 - 日程列表查询参数 + 日程列表查询参数 - 日程日期 + 日程日期 - 日程日期 + 日程日期 - 日程内容 + 日程内容 - 日程时间 + 日程时间 - ID + ID - 首页服务 + 首页服务 - 添加日程 + 添加日程 日程参数 - 删除日程 + 删除日程 id列表 - 获取日程列表 + 获取日程列表 查询参数 日程列表 - + @@ -3481,153 +3483,153 @@ - + - + - + - + - + - 检查输入参数 + 检查输入参数 - 父ID + 父ID - 添加按钮参数 + 添加按钮参数 - 父ID + 父ID - 标题 + 标题 - 编码 + 编码 - ID + ID - 权限按钮服务 + 权限按钮服务 - 添加按钮 + 添加按钮 添加参数 - 批量添加 + 批量添加 - 删除按钮 + 删除按钮 删除参数 - 编辑按钮 + 编辑按钮 编辑参数 - 按钮分页查询 + 按钮分页查询 查询条件 按钮分页列表 - 菜单树查询参数 + 菜单树查询参数 - 模块 + 模块 - 关键字 + 关键字 - 添加菜单参数 + 添加菜单参数 - 父ID + 父ID - 标题 + 标题 - 菜单类型 + 菜单类型 - 模块 + 模块 - 路径 + 路径 - 图标 + 图标 - 特殊验证 + 特殊验证 @@ -3635,46 +3637,46 @@ - 编辑菜单输入参数 + 编辑菜单输入参数 - ID + ID - 改变模块输入参数 + 改变模块输入参数 - 模块ID + 模块ID - 菜单服务 + 菜单服务 - 添加菜单 + 添加菜单 添加参数 - 详情 + 详情 id 详细信息 - 构建菜单树形结构 + 构建菜单树形结构 菜单列表 父ID @@ -3682,345 +3684,345 @@ - 获取菜单树 + 获取菜单树 菜单树查询参数 菜单树列表 - 编辑菜单 + 编辑菜单 菜单编辑参数 - 删除菜单 + 删除菜单 删除菜单参数 - 改变菜单模块 + 改变菜单模块 改变菜单模块参数 - + - + - + - + - + - + - + - 检查输入参数 + 检查输入参数 - 模块分页输入 + 模块分页输入 - 添加模块输入 + 添加模块输入 - 编辑模块输入 + 编辑模块输入 - ID + ID - 模块管理服务 + 模块管理服务 - 添加模块 + 添加模块 添加参数 - 删除模块 + 删除模块 删除参数 - 编辑模块 + 编辑模块 编辑参数 - 分页查询 + 分页查询 分页参数 - + - + - + - + - 检查输入参数 + 检查输入参数 - 角色查询参数 + 角色查询参数 - 角色添加参数 + 角色添加参数 - 名称 + 名称 - 分类 + 分类 - 角色编辑参数 + 角色编辑参数 - Id + Id - 角色授权资源参数 + 角色授权资源参数 - 角色Id + 角色Id - 授权资源信息 + 授权资源信息 - 是否代码生成 + 是否代码生成 - 角色授权资源参数 + 角色授权资源参数 - 角色Id + 角色Id - 授权权限信息 + 授权权限信息 - 角色授权用户参数 + 角色授权用户参数 - Id + Id - 授权权限信息 + 授权权限信息 - 角色选择器参数 + 角色选择器参数 - 组织ID + 组织ID - 机构ID列表 + 机构ID列表 - 关键字 + 关键字 - 角色分类 + 角色分类 - 角色拥有的资源输出 + 角色拥有的资源输出 - Id + Id - 已授权资源信息 + 已授权资源信息 - 角色拥有权限输出 + 角色拥有权限输出 - 角色Id + 角色Id - 已授权资源信息 + 已授权资源信息 - 角色服务 + 角色服务 - 获取所有角色 + 获取所有角色 - 添加角色 + 添加角色 添加参数 - 删除角色 + 删除角色 删除参数 - 编辑角色 + 编辑角色 编辑参数 - 根据用户ID获取用户角色集合 + 根据用户ID获取用户角色集合 用户ID - 给角色授权权限 + 给角色授权权限 授权信息 - 给角色授权 + 给角色授权 授权参数 - 给角色授权用户 + 给角色授权用户 授权信息 - 获取角色拥有权限 + 获取角色拥有权限 角色ID - 角色拥有资源 + 角色拥有资源 角色id 资源类型 @@ -4028,41 +4030,41 @@ - 获取角色下的用户 + 获取角色下的用户 角色ID - 分页查询角色 + 分页查询角色 查询参数 - 刷新缓存 + 刷新缓存 - 获取角色授权权限选择器 + 获取角色授权权限选择器 角色ID - 角色选择器 + 角色选择器 - 根据id集合获取角色集合 + 根据id集合获取角色集合 @@ -4072,7 +4074,7 @@ - 获取所有 + 获取所有 @@ -4083,373 +4085,373 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - 检查输入参数 + 检查输入参数 - 单页输入参数 + 单页输入参数 - 菜单类型 + 菜单类型 - 单页输入参数 + 单页输入参数 - 标题 + 标题 - 菜单类型 + 菜单类型 - 路径 + 路径 - 图标 + 图标 - 单页修改参数 + 单页修改参数 - ID + ID - 单页服务 + 单页服务 - 添加单页 + 添加单页 添加参数 - 删除单页 + 删除单页 删除参数 - 编辑单页 + 编辑单页 编辑参数 - 分页查询 + 分页查询 - + - + - + - + - 检查输入参数 + 检查输入参数 - 操作日志分页输入 + 操作日志分页输入 - 操作日志日志删除输入 + 操作日志日志删除输入 - 操作日志周统计输出 + 操作日志周统计输出 - 日期 + 日期 - 名称 + 名称 - 数量 + 数量 - 操作日志统计 + 操作日志统计 - 操作日志服务 + 操作日志服务 - 根据分类删除操作日志 + 根据分类删除操作日志 分类名称 - 日志详情 + 日志详情 id 日志详情 - 操作日志分页查询 + 操作日志分页查询 查询参数 分页列表 - 操作日志周统计 + 操作日志周统计 天数 统计结果 - 操作日志总览 + 操作日志总览 异常日志和操作日志的数量 - + - 操作日志中文名称 + 操作日志中文名称 - 异常日志中文名称 + 异常日志中文名称 - 分表最多查近多少年的数据 + 分表最多查近多少年的数据 - + - + - + - + - + - 访问日志分页输入 + 访问日志分页输入 - 分类 + 分类 - 账号 + 账号 - 访问日志删除输入 + 访问日志删除输入 - 分类 + 分类 - 周统计输出 + 周统计输出 - 日期 + 日期 - 登录次数 + 登录次数 - 登出次数 + 登出次数 - 访问日志总数输出 + 访问日志总数输出 - 类型 + 类型 - 数量 + 数量 - 访问日志服务 + 访问日志服务 - 根据分类删除 + 根据分类删除 分类名称 - 访问日志分页查询 + 访问日志分页查询 查询参数 日志列表 - 根统计N天来登录和登出数量 + 根统计N天来登录和登出数量 天使 统计信息 - 统计登录登出总览 + 统计登录登出总览 登录和登出的数量 - + - 分表最多查近多少年的数据 + 分表最多查近多少年的数据 - + - + - + - + @@ -4477,98 +4479,98 @@ - 刷新缓存 + 刷新缓存 分类 - 检查输入参数 + 检查输入参数 - 配置分页参数 + 配置分页参数 - 添加配置参数 + 添加配置参数 - 配置键 + 配置键 - 配置值 + 配置值 - 编辑配置参数 + 编辑配置参数 - ID + ID - 删除配置参数 + 删除配置参数 - 批量修改输入参数 + 批量修改输入参数 - 分类 + 分类 - 系统配置服务 + 系统配置服务 - 新增配置 + 新增配置 新增参数 - 删除配置 + 删除配置 删除 - 修改配置 + 修改配置 修改参数 - 批量编辑 + 批量编辑 配置列表 - 根据分类和配置键获配置 + 根据分类和配置键获配置 分类 配置键 @@ -4576,70 +4578,70 @@ - 根据分类获取配置列表 + 根据分类获取配置列表 分类名称 配置列表 - 分页查询其他配置 + 分页查询其他配置 查询参数 其他配置列表 - + - + - + - + - + - 获取全部 + 获取全部 - + - + - + - + - + - 刷新缓存 + 刷新缓存 - 检查输入参数 + 检查输入参数 - 获取字典所有下级 + 获取字典所有下级 字典列表 父ID @@ -4647,89 +4649,89 @@ - 字典查询参数 + 字典查询参数 - 字典树参数 + 字典树参数 - 字典分类 + 字典分类 - 字典查询参数 + 字典查询参数 - - 父id + + 父id - - 分类 + + 分类 - 添加字典参数 + 添加字典参数 - 父ID + 父ID - 字典名称 + 字典名称 - 字典值 + 字典值 - 状态 + 状态 - 编辑字典参数 + 编辑字典参数 - ID + ID - 删除字典参数 + 删除字典参数 - 字典服务 + 字典服务 - 添加字典 + 添加字典 输入参数 - 构建字典树形结构 + 构建字典树形结构 字典列表 父ID @@ -4737,34 +4739,34 @@ - 删除字典 + 删除字典 删除参数 - 编辑字典 + 编辑字典 输入参数 - 获取字典 + 获取字典 字典 - 获取所有 + 获取所有 字典列表 - 根据字典DictValue获取字典值列表 + 根据字典DictValue获取字典值列表 字典值 字典列表 @@ -4772,124 +4774,124 @@ - 根据字典DictValue列表获取对应字典值列表 + 根据字典DictValue列表获取对应字典值列表 字典值列表 - 字典分页查询 + 字典分页查询 查询参数 字典分页列表 - 获取字典树形结构 + 获取字典树形结构 查询参数 字典树形结构 - 组织分页查询参数 + 组织分页查询参数 - 父ID + 父ID - 机构列表 + 机构列表 - 组织添加参数 + 组织添加参数 - 组织修改参数 + 组织修改参数 - Id + Id - 组织复制参数 + 组织复制参数 - 目标ID + 目标ID - 组织Id列表 + 组织Id列表 - 是否包含下级 + 是否包含下级 - 组织导入 + 组织导入 - - 名称 + + 名称 - - 上级组织 + + 上级组织 - - 分类 + + 分类 - - 排序码 + + 排序码 - - 主管账号 + + 主管账号 - 组织树查询参数 - 懒加载用 + 组织树查询参数 + 懒加载用 - 父Id + 父Id - 组织架构服务 + 组织架构服务 - 检查组织是否存在 + 检查组织是否存在 组织列表 组织名称 @@ -4899,14 +4901,14 @@ - 组织详情 + 组织详情 id参数 组织信息 - 根据组织ID获取 下级 + 根据组织ID获取 下级 组织ID 是否包含自己 @@ -4914,13 +4916,13 @@ - 获取所有组织 + 获取所有组织 组织列表 - 获取机构及下级ID列表 + 获取机构及下级ID列表 @@ -4928,7 +4930,7 @@ - 根据组织Id递归获取上级 + 根据组织Id递归获取上级 组织列表 组织Id @@ -4937,28 +4939,28 @@ - 获取组织信息 + 获取组织信息 组织id 组织信息 - 组织分页查询 + 组织分页查询 查询参数 分页信息 - 根据ID列表获取组织列表 + 根据ID列表获取组织列表 - 添加组织 + 添加组织 添加参数 名称 @@ -4966,14 +4968,14 @@ - 复制组织 + 复制组织 机构复制参数 - 编辑组织 + 编辑组织 编辑参数 名称 @@ -4981,7 +4983,7 @@ - 删除组织 + 删除组织 删除参数 名称 @@ -4989,7 +4991,7 @@ - 构建组织树形结构 + 构建组织树形结构 组织列表 父ID @@ -4997,13 +4999,13 @@ - 刷新缓存 + 刷新缓存 - 获取组织树型结构 + 获取组织树型结构 机构ID列表 组织选择器(懒加载用) @@ -5013,63 +5015,63 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - 检查输入参数 + 检查输入参数 - 根据组织Id列表获取所有父级组织 + 根据组织Id列表获取所有父级组织 @@ -5077,7 +5079,7 @@ - 获取组织所有下级 + 获取组织所有下级 @@ -5085,7 +5087,7 @@ - 获取组织下级(懒加载) + 获取组织下级(懒加载) @@ -5093,7 +5095,7 @@ - 赋值组织的所有下级 + 赋值组织的所有下级 组织列表 父Id @@ -5102,13 +5104,13 @@ - 重新生成组织实体 + 重新生成组织实体 - 获取全称 + 获取全称 组织列表 父Id @@ -5116,67 +5118,67 @@ - 职位分页查询 + 职位分页查询 - 组织ID + 组织ID - 职位列表 + 职位列表 - 分类 + 分类 - 职位新增参数 + 职位新增参数 - 组织ID + 组织ID - 名称 + 名称 - 分类 + 分类 - 机构编辑参数 + 机构编辑参数 - Id + Id - 机构选择器参数 + 机构选择器参数 - 职位服务 + 职位服务 - 添加职位 + 添加职位 添加参数 名称 @@ -5184,7 +5186,7 @@ - 删除职位 + 删除职位 id列表 名称 @@ -5192,7 +5194,7 @@ - 编辑职位 + 编辑职位 编辑参数 名称 @@ -5200,560 +5202,560 @@ - 获取职位列表 + 获取职位列表 职位列表 - 获取职位信息 + 获取职位信息 职位ID 职位信息 - 职位分页查询 + 职位分页查询 查询参数 分页列表 - 职位选择器 + 职位选择器 查询参数 - 刷新缓存 + 刷新缓存 - 根据id集合获取职位集合 + 根据id集合获取职位集合 - + - 获取全部 + 获取全部 - + - + - + - + - + - + - 检查输入参数 + 检查输入参数 名称 - 用户选择器参数 + 用户选择器参数 - 组织ID + 组织ID - 机构ID列表 + 机构ID列表 - 关键字 + 关键字 - 用户分页查询参数 + 用户分页查询参数 - 所属组织 + 所属组织 - 动态查询条件 + 动态查询条件 - 用户状态 + 用户状态 - 添加用户参数 + 添加用户参数 - 账号 + 账号 - 姓名 + 姓名 - 组织id + 组织id - 职位id + 职位id - 编辑用户参数 + 编辑用户参数 - Id + Id - 用户授权角色参数 + 用户授权角色参数 - Id + Id - 授权权限信息 + 授权权限信息 - 默认数据权限 + 默认数据权限 - 用户导入 + 用户导入 - 账号 + 账号 - - 姓名 + + 姓名 - - 性别 + + 性别 - - 昵称 + + 昵称 - - 手机 - 这里使用了SM4自动加密解密 + + 手机 + 这里使用了SM4自动加密解密 - - 邮箱 + + 邮箱 - 所属机构 + 所属机构 - 职位 + 职位 - - 出生日期 + + 出生日期 - - 民族 + + 民族 - - 籍贯 + + 籍贯 - - 家庭住址 + + 家庭住址 - - 通信地址 + + 通信地址 - - 证件类型 + + 证件类型 - - 证件号码 + + 证件号码 - - 文化程度 + + 文化程度 - - 政治面貌 + + 政治面貌 - - 毕业院校 + + 毕业院校 - - 学历 + + 学历 - - 学制 + + 学制 - - 学位 + + 学位 - - 家庭电话 + + 家庭电话 - - 办公电话 + + 办公电话 - - 紧急联系人 + + 紧急联系人 - - 紧急联系人电话 + + 紧急联系人电话 - - 紧急联系人地址 + + 紧急联系人地址 - - 员工编号 + + 员工编号 - - 入职日期 + + 入职日期 - 部门Id + 部门Id - 职位Id + 职位Id - 选择用户输出参数 + 选择用户输出参数 - Id + Id - 组织ID + 组织ID - 账号 + 账号 - 姓名 + 姓名 - - 性别 + + 性别 - 组织名称 + 组织名称 - 职位名称 + 职位名称 - 头像 + 头像 - 用户信息输出 + 用户信息输出 - 用户信息 + 用户信息 - - 账号 + + 账号 - - 姓名 + + 姓名 - - 昵称 + + 昵称 - - 性别 + + 性别 - - 手机 - 这里使用了SM4自动加密解密 + + 手机 + 这里使用了SM4自动加密解密 - - 邮箱 + + 邮箱 - 所属机构 + 所属机构 - 职位 + 职位 - - 出生日期 + + 出生日期 - - 民族 + + 民族 - - 籍贯 + + 籍贯 - - 家庭住址 + + 家庭住址 - - 通信地址 + + 通信地址 - - 证件类型 + + 证件类型 - - 证件号码 + + 证件号码 - - 文化程度 + + 文化程度 - - 政治面貌 + + 政治面貌 - - 毕业院校 + + 毕业院校 - - 学历 + + 学历 - - 学制 + + 学制 - - 学位 + + 学位 - - 家庭电话 + + 家庭电话 - - 办公电话 + + 办公电话 - - 紧急联系人 + + 紧急联系人 - - 紧急联系人电话 + + 紧急联系人电话 - - 紧急联系人地址 + + 紧急联系人地址 - - 员工编号 + + 员工编号 - - 入职日期 + + 入职日期 - - 职级 + + 职级 - 用户服务 + 用户服务 - 根据用户ID获取按钮ID集合 + 根据用户ID获取按钮ID集合 - 根据账号获取用户信息 + 根据账号获取用户信息 用户名 用户信息 - 根据用户ID和机构ID获取角色权限 + 根据用户ID和机构ID获取角色权限 @@ -5761,231 +5763,231 @@ - 根据手机号获取用户账号 + 根据手机号获取用户账号 手机号 用户账号名称 - 用户选择器 + 用户选择器 查询参数 - 用户分页查询 + 用户分页查询 查询参数 用户分页列表 - 用户列表 + 用户列表 查询 - 根据用户Id获取用户信息 + 根据用户Id获取用户信息 用户ID 用户信息 - 根据用户Id获取用户信息 + 根据用户Id获取用户信息 用户ID 转换的实体 - - 根据用户账号获取用户ID - - 用户账号 - + + 根据用户账号获取用户ID + + 用户账号 + - 根据用户手机获取用户信息 + 根据用户手机获取用户信息 手机号 用户信息 - 获取用户拥有角色 + 获取用户拥有角色 用户ID - - 获取当前API用户的数据范围 - null:代表拥有全部数据权限 - [xx,xx]:代表拥有部分机构的权限 - []:代表仅自己权限 - - 机构列表 + + 获取当前API用户的数据范围 + null:代表拥有全部数据权限 + [xx,xx]:代表拥有部分机构的权限 + []:代表仅自己权限 + + 机构列表 - 获取用户拥有的资源 + 获取用户拥有的资源 用户id 资源列表 - 获取用户拥有的权限 + 获取用户拥有的权限 用户id 权限列表 - 用户权限树选择 + 用户权限树选择 用户id 权限列表 - 根据id集合获取用户集合 + 根据id集合获取用户集合 Id集合 - 用户详情 + 用户详情 - 添加用户 + 添加用户 添加参数 - 编辑 + 编辑 编辑参数 - 启用用户 + 启用用户 用户Id - 禁用用户 + 禁用用户 用户Id - 重置密码 + 重置密码 用户Id - 给用户授权角色 + 给用户授权角色 授权参数 - 给用户授权资源 + 给用户授权资源 授权参数 - 给用户授权权限 + 给用户授权权限 - 设置用户默认值 + 设置用户默认值 - 批量编辑 + 批量编辑 批量编辑信息 - 删除用户 + 删除用户 Id列表 - 从redis中删除用户信息 + 从redis中删除用户信息 用户ID列表 - 从redis中删除用户信息 + 从redis中删除用户信息 用户ID - 导出用户 + 导出用户 - 导入模板下载 + 导入模板下载 模板 - 导入预览 + 导入预览 预览参数 预览结果 - 用户导入 + 用户导入 - 检查导入数据 + 检查导入数据 数据 是否初始化错误 @@ -5993,7 +5995,7 @@ - + @@ -6036,19 +6038,19 @@ - + - + - + - + - + @@ -6069,22 +6071,22 @@ - + - + - + - + - + @@ -6106,59 +6108,59 @@ - 获取默认密码 + 获取默认密码 - 检查输入参数 + 检查输入参数 - 检查是否为自己 + 检查是否为自己 操作名称 - 根据日期计算年龄 + 根据日期计算年龄 - 获取Sqlsugar的ISugarQueryable + 获取Sqlsugar的ISugarQueryable - 数据库获取用户信息 + 数据库获取用户信息 用户ID - 关系服务 + 关系服务 - 根据分类获取关系表信息 + 根据分类获取关系表信息 分类名称 关系表 - 通过对象ID和分类获取关系列表 + 通过对象ID和分类获取关系列表 对象ID 分类 @@ -6166,7 +6168,7 @@ - 通过对象ID列表和分类获取关系列表 + 通过对象ID列表和分类获取关系列表 对象ID 分类 @@ -6174,7 +6176,7 @@ - 通过目标ID和分类获取关系列表 + 通过目标ID和分类获取关系列表 目标ID 分类 @@ -6182,7 +6184,7 @@ - 通过目标ID列表和分类获取关系列表 + 通过目标ID列表和分类获取关系列表 @@ -6190,21 +6192,21 @@ - 获取关系表用户工作台 + 获取关系表用户工作台 用户ID 关系表数据 - 更新缓存 + 更新缓存 分类 - 保存关系 + 保存关系 分类 对象ID @@ -6216,7 +6218,7 @@ - 批量保存关系 + 批量保存关系 分类 对象ID @@ -6227,7 +6229,7 @@ - 根据角色ID获取模块ID列表 + 根据角色ID获取模块ID列表 角色ID列表 模块ID列表 @@ -6267,110 +6269,110 @@ - 角色授权资源树输出 + 角色授权资源树输出 - 模块id + 模块id - 模块名称 + 模块名称 - 模块图标 + 模块图标 - 模块下菜单集合 + 模块下菜单集合 - 授权菜单类 + 授权菜单类 - 菜单id + 菜单id - 父id + 父id - 父名称 + 父名称 - 模块名称 + 模块名称 - 模块id + 模块id - 菜单下按钮集合 + 菜单下按钮集合 - 按钮id + 按钮id - 标题 + 标题 - 接口描述 + 接口描述 - 路由名称 + 路由名称 - 权限名称 + 权限名称 - 资源服务 + 资源服务 - 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 + 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 所有的菜单和模块以及单页面列表 - 根据模块ID获取菜单和单页面列表 + 根据模块ID获取菜单和单页面列表 - 根据资源ID获取所有下级资源 + 根据资源ID获取所有下级资源 资源ID 是否包含自己 @@ -6378,7 +6380,7 @@ - 根据资源ID获取所有下级资源 + 根据资源ID获取所有下级资源 资源列表 资源ID @@ -6387,7 +6389,7 @@ - 获取ID获取Code列表 + 获取ID获取Code列表 id列表 分类 @@ -6395,21 +6397,21 @@ - 获取资源列表 + 获取资源列表 资源分类列表 - 根据分类获取资源列表 + 根据分类获取资源列表 分类名称 资源列表 - 根据菜单ID获取菜单 + 根据菜单ID获取菜单 id列表 分类 @@ -6417,21 +6419,21 @@ - 获取权限授权树 + 获取权限授权树 路由列表 - 刷新缓存 + 刷新缓存 分类名称 - 角色授权资源树 + 角色授权资源树 @@ -6439,7 +6441,7 @@ - + @@ -6454,26 +6456,26 @@ - + - + - + - + - + - + - 获取路由地址名称 + 获取路由地址名称 控制器地址 路由名称 @@ -6481,7 +6483,7 @@ - 获取资源所有下级 + 获取资源所有下级 资源列表 父ID @@ -6489,7 +6491,7 @@ - 获取上级 + 获取上级 @@ -6497,14 +6499,14 @@ - 获取授权菜单 + 获取授权菜单 模块ID - 获取授权菜单类菜单名称 + 获取授权菜单类菜单名称 菜单列表 当前菜单 @@ -6512,193 +6514,193 @@ - 编辑个人信息参数 + 编辑个人信息参数 - 姓名 + 姓名 - 签名图片 + 签名图片 - 更新个人工作台 + 更新个人工作台 - 工作台数据 + 工作台数据 - 更新个人密码 + 更新个人密码 - 密码 + 密码 - 新密码 + 新密码 - 设置默认模块输入 + 设置默认模块输入 - 模块Id + 模块Id - 是否默认 + 是否默认 - 我的机构数样式 + 我的机构数样式 - Id + Id - 名称 + 名称 - 父ID + 父ID - 子节点 + 子节点 - 样式 + 样式 - 我的机构样式 + 我的机构样式 - 背景色 + 背景色 - 字体颜色 + 字体颜色 - 个人信息中心服务 + 个人信息中心服务 - 获取登录用户菜单 + 获取登录用户菜单 - 获取个人工作台 + 获取个人工作台 - 获取组织架构 + 获取组织架构 组织架构 - 获取登录用户的站内信分页 + 获取登录用户的站内信分页 查询参数 站内信列表 - 读取登录用户站内信详情 + 读取登录用户站内信详情 消息ID 消息详情 - 获取未读消息数量 + 获取未读消息数量 未读消息数量 - 更新个人信息 + 更新个人信息 信息参数 - 更新签名 + 更新签名 签名图片 - 编辑个人工作台 + 编辑个人工作台 工作台字符串 - 删除我的消息 + 删除我的消息 消息Id - 修改个人密码 + 修改个人密码 密码信息 - 修改头像 + 修改头像 头像文件 - 修改默认模块 + 修改默认模块 默认模块输入参数 @@ -6707,47 +6709,47 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - 获取父菜单集合 + 获取父菜单集合 所有菜单列表 我的菜单列表 @@ -6755,13 +6757,13 @@ - 构建Meta + 构建Meta 我的菜单集合 - 构建机构树 + 构建机构树 机构列表 父ID @@ -6770,65 +6772,65 @@ - AppStartup启动类 + AppStartup启动类 - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 + ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 + 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! + 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - 当前登录用户信息 + 当前登录用户信息 - 当前用户Id + 当前用户Id - 当前用户账号 + 当前用户账号 - 当前用户昵称 + 当前用户昵称 - 是否超级管理员 + 是否超级管理员 - 机构ID + 机构ID - C端用户关系 + C端用户关系 - - 对象ID + + 对象ID - - 目标ID + + 目标ID - - 分类 + + 分类 -- Gitee From 450551b9dab0e1f71941c1342588a0f37555e6bf Mon Sep 17 00:00:00 2001 From: "hugudong@zxzyjs.com" Date: Fri, 8 Sep 2023 19:10:54 +0800 Subject: [PATCH 11/70] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {web => nginx}/SimpleAdmin.conf | 0 web/.editorconfig | 15 + web/.env | 11 + web/.env.development | 22 + web/.env.production | 24 + web/.env.test | 21 + web/.eslintignore | 15 + web/.eslintrc.cjs | 61 + web/.gitignore | 26 + web/.husky/commit-msg | 4 + web/.husky/pre-commit | 4 + web/.prettierignore | 9 + web/.prettierrc.cjs | 41 + web/.stylelintignore | 4 + web/.stylelintrc.cjs | 40 + web/.vscode/extensions.json | 14 + web/.vscode/settings.json | 92 + web/CHANGELOG.md | 246 + web/LICENSE | 21 + web/README.md | 98 + web/build/getEnv.ts | 46 + web/build/plugins.ts | 149 + web/build/proxy.ts | 30 + web/commitlint.config.cjs | 162 + web/components.d.ts | 84 + web/index.html | 105 + web/lint-staged.config.cjs | 8 + web/package.json | 131 + web/pnpm-lock.yaml | 9860 +++++++++++++++++ web/postcss.config.cjs | 5 + web/public/favicon.ico | Bin 0 -> 4286 bytes web/public/logo.png | Bin 0 -> 898776 bytes web/src/App.vue | 23 + web/src/api/helper/axiosCancel.ts | 47 + web/src/api/helper/checkStatus.ts | 43 + web/src/api/index.ts | 15 + web/src/api/interface/auth/index.ts | 14 + web/src/api/interface/auth/login.ts | 109 + web/src/api/interface/index.ts | 100 + web/src/api/interface/sys/index.ts | 18 + web/src/api/interface/sys/limit/button.ts | 49 + web/src/api/interface/sys/limit/index.ts | 17 + web/src/api/interface/sys/limit/menu.ts | 51 + web/src/api/interface/sys/limit/module.ts | 36 + web/src/api/interface/sys/limit/spa.ts | 58 + web/src/api/interface/sys/ops/config.ts | 22 + web/src/api/interface/sys/ops/dict.ts | 48 + web/src/api/interface/sys/ops/index.ts | 15 + web/src/api/interface/sys/upload.ts | 19 + web/src/api/interface/sys/userCenter.ts | 21 + web/src/api/modules/auth/index.ts | 14 + web/src/api/modules/auth/login.ts | 37 + web/src/api/modules/index.ts | 15 + web/src/api/modules/sys/index.ts | 19 + web/src/api/modules/sys/limit/button.ts | 42 + web/src/api/modules/sys/limit/index.ts | 17 + web/src/api/modules/sys/limit/menu.ts | 42 + web/src/api/modules/sys/limit/module.ts | 37 + web/src/api/modules/sys/limit/spa.ts | 36 + web/src/api/modules/sys/ops/config.ts | 23 + web/src/api/modules/sys/ops/dict.ts | 44 + web/src/api/modules/sys/ops/index.ts | 15 + web/src/api/modules/sys/upload.ts | 17 + web/src/api/modules/sys/user.ts | 71 + web/src/api/modules/sys/userCenter.ts | 32 + web/src/api/request/index.ts | 33 + web/src/api/request/instance.ts | 232 + web/src/api/request/request.ts | 78 + web/src/assets/fonts/DIN.otf | Bin 0 -> 27828 bytes web/src/assets/fonts/MetroDF.ttf | Bin 0 -> 106934 bytes web/src/assets/fonts/YouSheBiaoTiHei.ttf | Bin 0 -> 1414784 bytes web/src/assets/fonts/font.scss | 14 + web/src/assets/iconfont/iconfont.scss | 44 + web/src/assets/iconfont/iconfont.ttf | Bin 0 -> 5088 bytes web/src/assets/iconfontPlus/iconfont.scss | 17 + web/src/assets/iconfontPlus/iconfont.ttf | Bin 0 -> 1672 bytes web/src/assets/icons/xianxingdaoyu.svg | 1 + web/src/assets/icons/xianxingdiqiu.svg | 1 + web/src/assets/icons/xianxingditu.svg | 1 + web/src/assets/icons/xianxingfanchuan.svg | 1 + web/src/assets/icons/xianxingfeiji.svg | 1 + web/src/assets/icons/xianxinglvhangriji.svg | 1 + web/src/assets/icons/xianxingtianqiyubao.svg | 1 + .../assets/icons/xianxingxiangjipaizhao.svg | 1 + web/src/assets/icons/xianxingxiarilengyin.svg | 1 + web/src/assets/icons/xianxingyoulun.svg | 1 + web/src/assets/icons/xianxingzijiayou.svg | 1 + web/src/assets/images/403.png | Bin 0 -> 12713 bytes web/src/assets/images/404.png | Bin 0 -> 7788 bytes web/src/assets/images/500.png | Bin 0 -> 8069 bytes web/src/assets/images/avatar.gif | Bin 0 -> 6334 bytes web/src/assets/images/login_bg.svg | 33 + web/src/assets/images/login_left.png | Bin 0 -> 35966 bytes web/src/assets/images/login_left1.png | Bin 0 -> 42169 bytes web/src/assets/images/login_left2.png | Bin 0 -> 31959 bytes web/src/assets/images/login_left3.png | Bin 0 -> 111980 bytes web/src/assets/images/login_left4.png | Bin 0 -> 153248 bytes web/src/assets/images/login_left5.png | Bin 0 -> 282032 bytes web/src/assets/images/logo.png | Bin 0 -> 898776 bytes web/src/assets/images/logo.svg | 1 + web/src/assets/images/msg01.png | Bin 0 -> 6527 bytes web/src/assets/images/msg02.png | Bin 0 -> 6550 bytes web/src/assets/images/msg03.png | Bin 0 -> 6484 bytes web/src/assets/images/msg04.png | Bin 0 -> 6774 bytes web/src/assets/images/msg05.png | Bin 0 -> 6099 bytes web/src/assets/images/notData.png | Bin 0 -> 1168 bytes web/src/assets/images/welcome.png | Bin 0 -> 75638 bytes web/src/assets/svg/ikun.svg | 1898 ++++ web/src/assets/svg/logo.svg | 1 + web/src/auto-import.d.ts | 70 + web/src/components/CheckCard/checkCard.d.ts | 27 + web/src/components/CheckCard/index.vue | 128 + web/src/components/CheckCard/props.ts | 46 + web/src/components/ChooseModule/index.vue | 92 + web/src/components/CodeHighLight/index.vue | 52 + web/src/components/ErrorMessage/403.vue | 19 + web/src/components/ErrorMessage/404.vue | 19 + web/src/components/ErrorMessage/500.vue | 19 + web/src/components/ErrorMessage/index.scss | 32 + web/src/components/FormContainer/index.vue | 52 + .../components/Grid/components/GridItem.vue | 68 + web/src/components/Grid/index.vue | 167 + web/src/components/Grid/interface/index.ts | 6 + web/src/components/Loading/index.scss | 67 + web/src/components/Loading/index.vue | 13 + .../ProTable/components/ColSetting.vue | 45 + .../ProTable/components/Pagination.vue | 29 + .../ProTable/components/TableColumn.vue | 56 + web/src/components/ProTable/index.vue | 278 + .../components/ProTable/interface/index.ts | 81 + .../SearchForm/components/SearchFormItem.vue | 92 + web/src/components/SearchForm/index.vue | 85 + web/src/components/SelectIcon/index.scss | 39 + web/src/components/SelectIcon/index.vue | 89 + web/src/components/SelectIconPlus/index.scss | 39 + web/src/components/SelectIconPlus/index.vue | 186 + .../components/SelectIconPlus/interface.ts | 42 + .../Selectors/MenuSelector/index.vue | 76 + .../Selectors/MenuSelector/interface.ts | 25 + web/src/components/SvgIcon/index.vue | 41 + web/src/components/SwitchDark/index.vue | 12 + web/src/components/TreeFilter/index.scss | 38 + web/src/components/TreeFilter/index.vue | 150 + web/src/config/index.ts | 31 + web/src/config/nprogress.ts | 26 + web/src/config/piniaPersist.ts | 33 + web/src/config/serviceLoading.ts | 61 + web/src/directives/index.ts | 29 + web/src/directives/modules/auth.ts | 31 + web/src/enums/configEnum.ts | 21 + web/src/enums/dictEnum.ts | 76 + web/src/enums/formEnum.ts | 23 + web/src/enums/httpEnum.ts | 63 + web/src/enums/index.ts | 18 + web/src/hooks/interface/index.ts | 45 + web/src/hooks/useAuthButtons.ts | 52 + web/src/hooks/useEcharts.ts | 27 + web/src/hooks/useHandleData.ts | 48 + web/src/hooks/useSelection.ts | 34 + web/src/hooks/useTable.ts | 157 + web/src/hooks/useTheme.ts | 124 + web/src/layouts/LayoutClassic/index.scss | 60 + web/src/layouts/LayoutClassic/index.vue | 62 + web/src/layouts/LayoutColumns/index.scss | 95 + web/src/layouts/LayoutColumns/index.vue | 104 + web/src/layouts/LayoutTransverse/index.scss | 60 + web/src/layouts/LayoutTransverse/index.vue | 57 + web/src/layouts/LayoutVertical/index.scss | 48 + web/src/layouts/LayoutVertical/index.vue | 56 + web/src/layouts/components/Footer/index.scss | 11 + web/src/layouts/components/Footer/index.vue | 9 + .../layouts/components/Header/ToolBarLeft.vue | 23 + .../components/Header/ToolBarRight.vue | 51 + .../Header/components/AssemblySize.vue | 39 + .../components/Header/components/Avatar.vue | 87 + .../Header/components/Breadcrumb.vue | 93 + .../Header/components/ChangeModule.vue | 18 + .../Header/components/CollapseIcon.vue | 21 + .../Header/components/Fullscreen.vue | 27 + .../Header/components/InfoDialog.vue | 22 + .../components/Header/components/Message.vue | 113 + .../Header/components/PasswordDialog.vue | 22 + .../Header/components/SearchMenu.vue | 115 + .../Header/components/ThemeSetting.vue | 14 + .../components/Main/components/Maximize.vue | 39 + web/src/layouts/components/Main/index.scss | 10 + web/src/layouts/components/Main/index.vue | 75 + web/src/layouts/components/Menu/SubMenu.vue | 87 + .../components/Tabs/components/MoreButton.vue | 87 + web/src/layouts/components/Tabs/index.scss | 69 + web/src/layouts/components/Tabs/index.vue | 109 + .../layouts/components/ThemeDrawer/index.scss | 137 + .../layouts/components/ThemeDrawer/index.vue | 191 + web/src/layouts/index.vue | 32 + web/src/layouts/indexAsync.vue | 36 + web/src/main.ts | 54 + web/src/routers/index.ts | 114 + web/src/routers/modules/dynamicRouter.ts | 98 + web/src/routers/modules/staticRouter.ts | 76 + web/src/stores/index.ts | 21 + web/src/stores/interface/index.ts | 56 + web/src/stores/modules/auth.ts | 143 + web/src/stores/modules/dict.ts | 83 + web/src/stores/modules/global.ts | 66 + web/src/stores/modules/index.ts | 6 + web/src/stores/modules/keepAlive.ts | 36 + web/src/stores/modules/tabs.ts | 78 + web/src/stores/modules/user.ts | 94 + web/src/styles/common.scss | 121 + web/src/styles/element-dark.scss | 28 + web/src/styles/element.scss | 258 + web/src/styles/reset.scss | 142 + web/src/styles/theme/aside.ts | 16 + web/src/styles/theme/header.ts | 25 + web/src/styles/theme/menu.ts | 31 + web/src/styles/var.scss | 2 + web/src/typings/global.d.ts | 94 + web/src/typings/props.d.ts | 32 + web/src/typings/window.d.ts | 21 + web/src/utils/calculate.ts | 22 + web/src/utils/color.ts | 72 + web/src/utils/echarts/index.ts | 53 + web/src/utils/eleValidate.ts | 26 + web/src/utils/errorHandler.ts | 41 + web/src/utils/formRules.ts | 19 + web/src/utils/index.ts | 310 + web/src/utils/is/index.ts | 125 + web/src/utils/mittBus.ts | 5 + web/src/utils/serviceDict.ts | 17 + web/src/utils/smCrypto.ts | 29 + web/src/utils/svg.ts | 25 + web/src/views/about/index.vue | 80 + web/src/views/home/index.scss | 12 + web/src/views/home/index.vue | 11 + .../login/components/phone-login/index.vue | 107 + .../login/components/pwd-login/index.vue | 132 + web/src/views/login/index.scss | 83 + web/src/views/login/index.vue | 43 + .../sys/limit/button/components/batch.vue | 80 + .../sys/limit/button/components/form.vue | 98 + web/src/views/sys/limit/button/index.vue | 140 + .../limit/menu/components/changeModule.vue | 91 + .../views/sys/limit/menu/components/form.vue | 225 + web/src/views/sys/limit/menu/index.vue | 202 + .../sys/limit/module/components/form.vue | 106 + web/src/views/sys/limit/module/index.vue | 93 + .../views/sys/limit/spa/components/form.vue | 203 + web/src/views/sys/limit/spa/index.vue | 113 + .../views/sys/ops/dict/components/form.vue | 123 + web/src/views/sys/ops/dict/index.vue | 230 + web/src/vite-env.d.ts | 8 + web/tsconfig.json | 43 + web/uno.config.ts | 81 + web/vite.config.ts | 77 + 254 files changed, 24954 insertions(+) rename {web => nginx}/SimpleAdmin.conf (100%) create mode 100644 web/.editorconfig create mode 100644 web/.env create mode 100644 web/.env.development create mode 100644 web/.env.production create mode 100644 web/.env.test create mode 100644 web/.eslintignore create mode 100644 web/.eslintrc.cjs create mode 100644 web/.gitignore create mode 100644 web/.husky/commit-msg create mode 100644 web/.husky/pre-commit create mode 100644 web/.prettierignore create mode 100644 web/.prettierrc.cjs create mode 100644 web/.stylelintignore create mode 100644 web/.stylelintrc.cjs create mode 100644 web/.vscode/extensions.json create mode 100644 web/.vscode/settings.json create mode 100644 web/CHANGELOG.md create mode 100644 web/LICENSE create mode 100644 web/README.md create mode 100644 web/build/getEnv.ts create mode 100644 web/build/plugins.ts create mode 100644 web/build/proxy.ts create mode 100644 web/commitlint.config.cjs create mode 100644 web/components.d.ts create mode 100644 web/index.html create mode 100644 web/lint-staged.config.cjs create mode 100644 web/package.json create mode 100644 web/pnpm-lock.yaml create mode 100644 web/postcss.config.cjs create mode 100644 web/public/favicon.ico create mode 100644 web/public/logo.png create mode 100644 web/src/App.vue create mode 100644 web/src/api/helper/axiosCancel.ts create mode 100644 web/src/api/helper/checkStatus.ts create mode 100644 web/src/api/index.ts create mode 100644 web/src/api/interface/auth/index.ts create mode 100644 web/src/api/interface/auth/login.ts create mode 100644 web/src/api/interface/index.ts create mode 100644 web/src/api/interface/sys/index.ts create mode 100644 web/src/api/interface/sys/limit/button.ts create mode 100644 web/src/api/interface/sys/limit/index.ts create mode 100644 web/src/api/interface/sys/limit/menu.ts create mode 100644 web/src/api/interface/sys/limit/module.ts create mode 100644 web/src/api/interface/sys/limit/spa.ts create mode 100644 web/src/api/interface/sys/ops/config.ts create mode 100644 web/src/api/interface/sys/ops/dict.ts create mode 100644 web/src/api/interface/sys/ops/index.ts create mode 100644 web/src/api/interface/sys/upload.ts create mode 100644 web/src/api/interface/sys/userCenter.ts create mode 100644 web/src/api/modules/auth/index.ts create mode 100644 web/src/api/modules/auth/login.ts create mode 100644 web/src/api/modules/index.ts create mode 100644 web/src/api/modules/sys/index.ts create mode 100644 web/src/api/modules/sys/limit/button.ts create mode 100644 web/src/api/modules/sys/limit/index.ts create mode 100644 web/src/api/modules/sys/limit/menu.ts create mode 100644 web/src/api/modules/sys/limit/module.ts create mode 100644 web/src/api/modules/sys/limit/spa.ts create mode 100644 web/src/api/modules/sys/ops/config.ts create mode 100644 web/src/api/modules/sys/ops/dict.ts create mode 100644 web/src/api/modules/sys/ops/index.ts create mode 100644 web/src/api/modules/sys/upload.ts create mode 100644 web/src/api/modules/sys/user.ts create mode 100644 web/src/api/modules/sys/userCenter.ts create mode 100644 web/src/api/request/index.ts create mode 100644 web/src/api/request/instance.ts create mode 100644 web/src/api/request/request.ts create mode 100644 web/src/assets/fonts/DIN.otf create mode 100644 web/src/assets/fonts/MetroDF.ttf create mode 100644 web/src/assets/fonts/YouSheBiaoTiHei.ttf create mode 100644 web/src/assets/fonts/font.scss create mode 100644 web/src/assets/iconfont/iconfont.scss create mode 100644 web/src/assets/iconfont/iconfont.ttf create mode 100644 web/src/assets/iconfontPlus/iconfont.scss create mode 100644 web/src/assets/iconfontPlus/iconfont.ttf create mode 100644 web/src/assets/icons/xianxingdaoyu.svg create mode 100644 web/src/assets/icons/xianxingdiqiu.svg create mode 100644 web/src/assets/icons/xianxingditu.svg create mode 100644 web/src/assets/icons/xianxingfanchuan.svg create mode 100644 web/src/assets/icons/xianxingfeiji.svg create mode 100644 web/src/assets/icons/xianxinglvhangriji.svg create mode 100644 web/src/assets/icons/xianxingtianqiyubao.svg create mode 100644 web/src/assets/icons/xianxingxiangjipaizhao.svg create mode 100644 web/src/assets/icons/xianxingxiarilengyin.svg create mode 100644 web/src/assets/icons/xianxingyoulun.svg create mode 100644 web/src/assets/icons/xianxingzijiayou.svg create mode 100644 web/src/assets/images/403.png create mode 100644 web/src/assets/images/404.png create mode 100644 web/src/assets/images/500.png create mode 100644 web/src/assets/images/avatar.gif create mode 100644 web/src/assets/images/login_bg.svg create mode 100644 web/src/assets/images/login_left.png create mode 100644 web/src/assets/images/login_left1.png create mode 100644 web/src/assets/images/login_left2.png create mode 100644 web/src/assets/images/login_left3.png create mode 100644 web/src/assets/images/login_left4.png create mode 100644 web/src/assets/images/login_left5.png create mode 100644 web/src/assets/images/logo.png create mode 100644 web/src/assets/images/logo.svg create mode 100644 web/src/assets/images/msg01.png create mode 100644 web/src/assets/images/msg02.png create mode 100644 web/src/assets/images/msg03.png create mode 100644 web/src/assets/images/msg04.png create mode 100644 web/src/assets/images/msg05.png create mode 100644 web/src/assets/images/notData.png create mode 100644 web/src/assets/images/welcome.png create mode 100644 web/src/assets/svg/ikun.svg create mode 100644 web/src/assets/svg/logo.svg create mode 100644 web/src/auto-import.d.ts create mode 100644 web/src/components/CheckCard/checkCard.d.ts create mode 100644 web/src/components/CheckCard/index.vue create mode 100644 web/src/components/CheckCard/props.ts create mode 100644 web/src/components/ChooseModule/index.vue create mode 100644 web/src/components/CodeHighLight/index.vue create mode 100644 web/src/components/ErrorMessage/403.vue create mode 100644 web/src/components/ErrorMessage/404.vue create mode 100644 web/src/components/ErrorMessage/500.vue create mode 100644 web/src/components/ErrorMessage/index.scss create mode 100644 web/src/components/FormContainer/index.vue create mode 100644 web/src/components/Grid/components/GridItem.vue create mode 100644 web/src/components/Grid/index.vue create mode 100644 web/src/components/Grid/interface/index.ts create mode 100644 web/src/components/Loading/index.scss create mode 100644 web/src/components/Loading/index.vue create mode 100644 web/src/components/ProTable/components/ColSetting.vue create mode 100644 web/src/components/ProTable/components/Pagination.vue create mode 100644 web/src/components/ProTable/components/TableColumn.vue create mode 100644 web/src/components/ProTable/index.vue create mode 100644 web/src/components/ProTable/interface/index.ts create mode 100644 web/src/components/SearchForm/components/SearchFormItem.vue create mode 100644 web/src/components/SearchForm/index.vue create mode 100644 web/src/components/SelectIcon/index.scss create mode 100644 web/src/components/SelectIcon/index.vue create mode 100644 web/src/components/SelectIconPlus/index.scss create mode 100644 web/src/components/SelectIconPlus/index.vue create mode 100644 web/src/components/SelectIconPlus/interface.ts create mode 100644 web/src/components/Selectors/MenuSelector/index.vue create mode 100644 web/src/components/Selectors/MenuSelector/interface.ts create mode 100644 web/src/components/SvgIcon/index.vue create mode 100644 web/src/components/SwitchDark/index.vue create mode 100644 web/src/components/TreeFilter/index.scss create mode 100644 web/src/components/TreeFilter/index.vue create mode 100644 web/src/config/index.ts create mode 100644 web/src/config/nprogress.ts create mode 100644 web/src/config/piniaPersist.ts create mode 100644 web/src/config/serviceLoading.ts create mode 100644 web/src/directives/index.ts create mode 100644 web/src/directives/modules/auth.ts create mode 100644 web/src/enums/configEnum.ts create mode 100644 web/src/enums/dictEnum.ts create mode 100644 web/src/enums/formEnum.ts create mode 100644 web/src/enums/httpEnum.ts create mode 100644 web/src/enums/index.ts create mode 100644 web/src/hooks/interface/index.ts create mode 100644 web/src/hooks/useAuthButtons.ts create mode 100644 web/src/hooks/useEcharts.ts create mode 100644 web/src/hooks/useHandleData.ts create mode 100644 web/src/hooks/useSelection.ts create mode 100644 web/src/hooks/useTable.ts create mode 100644 web/src/hooks/useTheme.ts create mode 100644 web/src/layouts/LayoutClassic/index.scss create mode 100644 web/src/layouts/LayoutClassic/index.vue create mode 100644 web/src/layouts/LayoutColumns/index.scss create mode 100644 web/src/layouts/LayoutColumns/index.vue create mode 100644 web/src/layouts/LayoutTransverse/index.scss create mode 100644 web/src/layouts/LayoutTransverse/index.vue create mode 100644 web/src/layouts/LayoutVertical/index.scss create mode 100644 web/src/layouts/LayoutVertical/index.vue create mode 100644 web/src/layouts/components/Footer/index.scss create mode 100644 web/src/layouts/components/Footer/index.vue create mode 100644 web/src/layouts/components/Header/ToolBarLeft.vue create mode 100644 web/src/layouts/components/Header/ToolBarRight.vue create mode 100644 web/src/layouts/components/Header/components/AssemblySize.vue create mode 100644 web/src/layouts/components/Header/components/Avatar.vue create mode 100644 web/src/layouts/components/Header/components/Breadcrumb.vue create mode 100644 web/src/layouts/components/Header/components/ChangeModule.vue create mode 100644 web/src/layouts/components/Header/components/CollapseIcon.vue create mode 100644 web/src/layouts/components/Header/components/Fullscreen.vue create mode 100644 web/src/layouts/components/Header/components/InfoDialog.vue create mode 100644 web/src/layouts/components/Header/components/Message.vue create mode 100644 web/src/layouts/components/Header/components/PasswordDialog.vue create mode 100644 web/src/layouts/components/Header/components/SearchMenu.vue create mode 100644 web/src/layouts/components/Header/components/ThemeSetting.vue create mode 100644 web/src/layouts/components/Main/components/Maximize.vue create mode 100644 web/src/layouts/components/Main/index.scss create mode 100644 web/src/layouts/components/Main/index.vue create mode 100644 web/src/layouts/components/Menu/SubMenu.vue create mode 100644 web/src/layouts/components/Tabs/components/MoreButton.vue create mode 100644 web/src/layouts/components/Tabs/index.scss create mode 100644 web/src/layouts/components/Tabs/index.vue create mode 100644 web/src/layouts/components/ThemeDrawer/index.scss create mode 100644 web/src/layouts/components/ThemeDrawer/index.vue create mode 100644 web/src/layouts/index.vue create mode 100644 web/src/layouts/indexAsync.vue create mode 100644 web/src/main.ts create mode 100644 web/src/routers/index.ts create mode 100644 web/src/routers/modules/dynamicRouter.ts create mode 100644 web/src/routers/modules/staticRouter.ts create mode 100644 web/src/stores/index.ts create mode 100644 web/src/stores/interface/index.ts create mode 100644 web/src/stores/modules/auth.ts create mode 100644 web/src/stores/modules/dict.ts create mode 100644 web/src/stores/modules/global.ts create mode 100644 web/src/stores/modules/index.ts create mode 100644 web/src/stores/modules/keepAlive.ts create mode 100644 web/src/stores/modules/tabs.ts create mode 100644 web/src/stores/modules/user.ts create mode 100644 web/src/styles/common.scss create mode 100644 web/src/styles/element-dark.scss create mode 100644 web/src/styles/element.scss create mode 100644 web/src/styles/reset.scss create mode 100644 web/src/styles/theme/aside.ts create mode 100644 web/src/styles/theme/header.ts create mode 100644 web/src/styles/theme/menu.ts create mode 100644 web/src/styles/var.scss create mode 100644 web/src/typings/global.d.ts create mode 100644 web/src/typings/props.d.ts create mode 100644 web/src/typings/window.d.ts create mode 100644 web/src/utils/calculate.ts create mode 100644 web/src/utils/color.ts create mode 100644 web/src/utils/echarts/index.ts create mode 100644 web/src/utils/eleValidate.ts create mode 100644 web/src/utils/errorHandler.ts create mode 100644 web/src/utils/formRules.ts create mode 100644 web/src/utils/index.ts create mode 100644 web/src/utils/is/index.ts create mode 100644 web/src/utils/mittBus.ts create mode 100644 web/src/utils/serviceDict.ts create mode 100644 web/src/utils/smCrypto.ts create mode 100644 web/src/utils/svg.ts create mode 100644 web/src/views/about/index.vue create mode 100644 web/src/views/home/index.scss create mode 100644 web/src/views/home/index.vue create mode 100644 web/src/views/login/components/phone-login/index.vue create mode 100644 web/src/views/login/components/pwd-login/index.vue create mode 100644 web/src/views/login/index.scss create mode 100644 web/src/views/login/index.vue create mode 100644 web/src/views/sys/limit/button/components/batch.vue create mode 100644 web/src/views/sys/limit/button/components/form.vue create mode 100644 web/src/views/sys/limit/button/index.vue create mode 100644 web/src/views/sys/limit/menu/components/changeModule.vue create mode 100644 web/src/views/sys/limit/menu/components/form.vue create mode 100644 web/src/views/sys/limit/menu/index.vue create mode 100644 web/src/views/sys/limit/module/components/form.vue create mode 100644 web/src/views/sys/limit/module/index.vue create mode 100644 web/src/views/sys/limit/spa/components/form.vue create mode 100644 web/src/views/sys/limit/spa/index.vue create mode 100644 web/src/views/sys/ops/dict/components/form.vue create mode 100644 web/src/views/sys/ops/dict/index.vue create mode 100644 web/src/vite-env.d.ts create mode 100644 web/tsconfig.json create mode 100644 web/uno.config.ts create mode 100644 web/vite.config.ts diff --git a/web/SimpleAdmin.conf b/nginx/SimpleAdmin.conf similarity index 100% rename from web/SimpleAdmin.conf rename to nginx/SimpleAdmin.conf diff --git a/web/.editorconfig b/web/.editorconfig new file mode 100644 index 0000000..aa721d0 --- /dev/null +++ b/web/.editorconfig @@ -0,0 +1,15 @@ +# @see: http://editorconfig.org + +root = true + +[*] # 表示所有文件适用 +charset = utf-8 # 设置文件字符集为 utf-8 +end_of_line = lf # 控制换行类型(lf | cr | crlf) +insert_final_newline = true # 始终在文件末尾插入一个新行 +indent_style = space # 缩进风格(tab | space) +indent_size = 2 # 缩进大小 +max_line_length = 130 # 最大行长度 + +[*.md] # 表示仅对 md 文件适用以下规则 +max_line_length = off # 关闭最大行长度限制 +trim_trailing_whitespace = false # 关闭末尾空格修剪 diff --git a/web/.env b/web/.env new file mode 100644 index 0000000..3d57a67 --- /dev/null +++ b/web/.env @@ -0,0 +1,11 @@ +# title +VITE_GLOB_APP_TITLE = SimpleAdmin + +# 本地运行端口号 +VITE_PORT = 8848 + +# 启动时自动打开浏览器 +VITE_OPEN = true + +# 打包后是否生成包分析文件 +VITE_REPORT = true diff --git a/web/.env.development b/web/.env.development new file mode 100644 index 0000000..07c36d5 --- /dev/null +++ b/web/.env.development @@ -0,0 +1,22 @@ +# 本地环境 +VITE_USER_NODE_ENV = development + +# 公共基础路径 +VITE_PUBLIC_PATH = / + +# 打包时是否删除 console +VITE_DROP_CONSOLE = true + +# 是否开启 VitePWA +VITE_PWA = false + +# 开发环境接口地址 +VITE_API_URL = http://127.0.0.1:5566 + +# 否开启代理 +VITE_HTTP_PROXY = true + +# 开发环境跨域代理,支持配置多个 +# VITE_PROXY = [["/api","https://mock.mengxuegu.com/mock/629d727e6163854a32e8307e"]] +VITE_PROXY = [["/api","http://127.0.0.1:5566"]] +# VITE_PROXY = [["/api-easymock","https://mock.mengxuegu.com"],["/api-fastmock","https://www.fastmock.site"]] diff --git a/web/.env.production b/web/.env.production new file mode 100644 index 0000000..5c35ce6 --- /dev/null +++ b/web/.env.production @@ -0,0 +1,24 @@ +# 线上环境 +VITE_USER_NODE_ENV = production + +# 公共基础路径 +VITE_PUBLIC_PATH = / + +# 是否启用 gzip 或 brotli 压缩打包,如果需要多个压缩规则,可以使用 “,” 分隔 +# Optional: gzip | brotli | none +VITE_BUILD_COMPRESS = none + +# 打包压缩后是否删除源文件 +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +# 打包时是否删除 console +VITE_DROP_CONSOLE = true + +# 是否开启 VitePWA +VITE_PWA = true + +# 否开启代理 +VITE_HTTP_PROXY = true + +# 线上环境接口地址 +VITE_API_URL = "https://www.fastmock.site/mock/f81e8333c1a9276214bcdbc170d9e0a0" diff --git a/web/.env.test b/web/.env.test new file mode 100644 index 0000000..80303c7 --- /dev/null +++ b/web/.env.test @@ -0,0 +1,21 @@ +# 测试环境 +VITE_USER_NODE_ENV = test + +# 公共基础路径 +VITE_PUBLIC_PATH = / + +# 是否启用 gzip 或 brotli 压缩打包,如果需要多个压缩规则,可以使用 “,” 分隔 +# Optional: gzip | brotli | none +VITE_BUILD_COMPRESS = none + +# 打包压缩后是否删除源文件 +VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false + +# 打包时是否删除 console +VITE_DROP_CONSOLE = true + +# 是否开启 VitePWA +VITE_PWA = false + +# 测试环境接口地址 +VITE_API_URL = "https://www.fastmock.site/mock/f81e8333c1a9276214bcdbc170d9e0a0" diff --git a/web/.eslintignore b/web/.eslintignore new file mode 100644 index 0000000..2debdc3 --- /dev/null +++ b/web/.eslintignore @@ -0,0 +1,15 @@ +*.sh +node_modules +*.md +*.woff +*.ttf +.vscode +.idea +dist +/public +/docs +.husky +.local +/bin +/src/mock/* +stats.html diff --git a/web/.eslintrc.cjs b/web/.eslintrc.cjs new file mode 100644 index 0000000..90ee1eb --- /dev/null +++ b/web/.eslintrc.cjs @@ -0,0 +1,61 @@ +// @see: http://eslint.cn + +module.exports = { + root: true, + env: { + browser: true, + node: true, + es6: true + }, + // 指定如何解析语法 + parser: "vue-eslint-parser", + // 优先级低于 parse 的语法解析配置 + parserOptions: { + parser: "@typescript-eslint/parser", + ecmaVersion: 2020, + sourceType: "module", + jsxPragma: "React", + ecmaFeatures: { + jsx: true + } + }, + // 继承某些已有的规则 + extends: ["plugin:vue/vue3-recommended", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"], + /** + * "off" 或 0 ==> 关闭规则 + * "warn" 或 1 ==> 打开的规则作为警告(不影响代码执行) + * "error" 或 2 ==> 规则作为一个错误(代码不能执行,界面报错) + */ + rules: { + // eslint (http://eslint.cn/docs/rules) + "no-var": "error", // 要求使用 let 或 const 而不是 var + "no-multiple-empty-lines": ["error", { max: 1 }], // 不允许多个空行 + "prefer-const": "off", // 使用 let 关键字声明但在初始分配后从未重新分配的变量,要求使用 const + "no-use-before-define": "off", // 禁止在 函数/类/变量 定义之前使用它们 + + // typeScript (https://typescript-eslint.io/rules) + "@typescript-eslint/no-unused-vars": "error", // 禁止定义未使用的变量 + "@typescript-eslint/prefer-ts-expect-error": "error", // 禁止使用 @ts-ignore + "@typescript-eslint/ban-ts-comment": "error", // 禁止 @ts- 使用注释或要求在指令后进行描述 + "@typescript-eslint/no-inferrable-types": "off", // 可以轻松推断的显式类型可能会增加不必要的冗长 + "@typescript-eslint/no-namespace": "off", // 禁止使用自定义 TypeScript 模块和命名空间 + "@typescript-eslint/no-explicit-any": "off", // 禁止使用 any 类型 + "@typescript-eslint/ban-types": "off", // 禁止使用特定类型 + "@typescript-eslint/no-var-requires": "off", // 允许使用 require() 函数导入模块 + "@typescript-eslint/no-empty-function": "off", // 禁止空函数 + "@typescript-eslint/no-non-null-assertion": "off", // 不允许使用后缀运算符的非空断言(!) + + // vue (https://eslint.vuejs.org/rules) + "vue/script-setup-uses-vars": "error", // 防止 + + + diff --git a/web/lint-staged.config.cjs b/web/lint-staged.config.cjs new file mode 100644 index 0000000..04d1d40 --- /dev/null +++ b/web/lint-staged.config.cjs @@ -0,0 +1,8 @@ +module.exports = { + "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"], + "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": ["prettier --write--parser json"], + "package.json": ["prettier --write"], + "*.vue": ["eslint --fix", "prettier --write", "stylelint --fix"], + "*.{scss,less,styl,html}": ["stylelint --fix", "prettier --write"], + "*.md": ["prettier --write"] +}; diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..eb46b15 --- /dev/null +++ b/web/package.json @@ -0,0 +1,131 @@ +{ + "name": "simple-admin", + "private": true, + "version": "3.0.0", + "type": "module", + "description": "小而美的通用后台管理系统", + "author": { + "name": "huguodong", + "email": "531035580@qq.com", + "url": "https://gitee.com/zxzyjs" + }, + "license": "MIT", + "homepage": "https://gitee.com/zxzyjs/SimpleAdmin", + "repository": { + "type": "git", + "url": "git@gitee.com:zxzyjs/SimpleAdmin.git" + }, + "bugs": { + "url": "https://gitee.com/zxzyjs/SimpleAdmin/issues" + }, + "scripts": { + "dev": "vite", + "serve": "vite", + "build:dev": "vue-tsc && vite build --mode development", + "build:test": "vue-tsc && vite build --mode test", + "build:pro": "vue-tsc && vite build --mode production", + "type:check": "vue-tsc --noEmit --skipLibCheck", + "preview": "npm run build:dev && vite preview", + "lint:eslint": "eslint --fix --ext .js,.ts,.vue ./src", + "lint:prettier": "prettier --write \"src/**/*.{js,ts,json,tsx,css,less,scss,vue,html,md}\"", + "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/", + "lint:lint-staged": "lint-staged", + "prepare": "husky install", + "release": "standard-version", + "commit": "git add -A && czg && git push" + }, + "dependencies": { + "@antv/g2plot": "^2.4.31", + "@element-plus/icons-vue": "^2.1.0", + "@highlightjs/vue-plugin": "^2.1.0", + "@iconify/vue": "^4.1.1", + "@vueuse/core": "^10.3.0", + "axios": "^1.4.0", + "dayjs": "^1.11.9", + "echarts": "^5.4.3", + "element-plus": "^2.3.4", + "highlight.js": "^11.8.0", + "md5": "^2.3.0", + "mitt": "^3.0.1", + "nprogress": "^0.2.0", + "pinia": "^2.1.6", + "pinia-plugin-persistedstate": "^3.2.0", + "print-js": "^1.6.0", + "qs": "^6.11.2", + "screenfull": "^6.0.2", + "sortablejs": "^1.15.0", + "vue": "^3.3.4", + "vue-router": "^4.2.4" + }, + "devDependencies": { + "@commitlint/cli": "^17.6.7", + "@commitlint/config-conventional": "^17.6.7", + "@iconify/json": "^2.2.102", + "@types/md5": "^2.3.2", + "@types/nprogress": "^0.2.0", + "@types/qs": "^6.9.7", + "@types/sm-crypto": "^0.3.1", + "@types/sortablejs": "^1.15.1", + "@typescript-eslint/eslint-plugin": "^6.2.1", + "@typescript-eslint/parser": "^6.2.1", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "autoprefixer": "^10.4.14", + "cz-git": "^1.7.0", + "czg": "^1.7.0", + "eslint": "^8.44.0", + "eslint-config-prettier": "^8.9.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-vue": "^9.16.1", + "husky": "^8.0.3", + "lint-staged": "^13.2.3", + "naive-ui": "^2.34.4", + "postcss": "^8.4.27", + "postcss-html": "^1.5.0", + "prettier": "^3.0.0", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "^1.64.2", + "sm-crypto": "^0.3.12", + "standard-version": "^9.5.0", + "stylelint": "^15.10.2", + "stylelint-config-html": "^1.1.0", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-recommended-scss": "^12.0.0", + "stylelint-config-recommended-vue": "^1.5.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^10.0.0", + "typescript": "^5.1.6", + "unocss": "^0.54.3", + "unplugin-auto-import": "^0.16.6", + "unplugin-icons": "^0.16.5", + "unplugin-vue-components": "^0.25.1", + "unplugin-vue-setup-extend-plus": "^1.0.0", + "vite": "^4.4.8", + "vite-plugin-compression": "^0.5.1", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-html": "^3.2.0", + "vite-plugin-pwa": "^0.16.4", + "vite-plugin-svg-icons": "^2.0.1", + "vue-tsc": "^1.8.8" + }, + "engines": { + "node": ">=16.0.0" + }, + "browserslist": { + "production": [ + "> 1%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "config": { + "commitizen": { + "path": "node_modules/cz-git" + } + } +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml new file mode 100644 index 0000000..6fe147a --- /dev/null +++ b/web/pnpm-lock.yaml @@ -0,0 +1,9860 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@antv/g2plot': + specifier: ^2.4.31 + version: 2.4.31 + '@element-plus/icons-vue': + specifier: ^2.1.0 + version: 2.1.0(vue@3.3.4) + '@highlightjs/vue-plugin': + specifier: ^2.1.0 + version: 2.1.0(highlight.js@11.8.0)(vue@3.3.4) + '@iconify/vue': + specifier: ^4.1.1 + version: 4.1.1(vue@3.3.4) + '@vueuse/core': + specifier: ^10.3.0 + version: 10.3.0(vue@3.3.4) + axios: + specifier: ^1.4.0 + version: 1.4.0 + dayjs: + specifier: ^1.11.9 + version: 1.11.9 + echarts: + specifier: ^5.4.3 + version: 5.4.3 + element-plus: + specifier: ^2.3.4 + version: 2.3.4(vue@3.3.4) + highlight.js: + specifier: ^11.8.0 + version: 11.8.0 + md5: + specifier: ^2.3.0 + version: 2.3.0 + mitt: + specifier: ^3.0.1 + version: 3.0.1 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + pinia: + specifier: ^2.1.6 + version: 2.1.6(typescript@5.1.6)(vue@3.3.4) + pinia-plugin-persistedstate: + specifier: ^3.2.0 + version: 3.2.0(pinia@2.1.6) + print-js: + specifier: ^1.6.0 + version: 1.6.0 + qs: + specifier: ^6.11.2 + version: 6.11.2 + screenfull: + specifier: ^6.0.2 + version: 6.0.2 + sortablejs: + specifier: ^1.15.0 + version: 1.15.0 + vue: + specifier: ^3.3.4 + version: 3.3.4 + vue-router: + specifier: ^4.2.4 + version: 4.2.4(vue@3.3.4) + +devDependencies: + '@commitlint/cli': + specifier: ^17.6.7 + version: 17.6.7 + '@commitlint/config-conventional': + specifier: ^17.6.7 + version: 17.6.7 + '@iconify/json': + specifier: ^2.2.102 + version: 2.2.102 + '@types/md5': + specifier: ^2.3.2 + version: 2.3.2 + '@types/nprogress': + specifier: ^0.2.0 + version: 0.2.0 + '@types/qs': + specifier: ^6.9.7 + version: 6.9.7 + '@types/sm-crypto': + specifier: ^0.3.1 + version: 0.3.1 + '@types/sortablejs': + specifier: ^1.15.1 + version: 1.15.1 + '@typescript-eslint/eslint-plugin': + specifier: ^6.2.1 + version: 6.2.1(@typescript-eslint/parser@6.2.1)(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/parser': + specifier: ^6.2.1 + version: 6.2.1(eslint@8.44.0)(typescript@5.1.6) + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.2.3(vite@4.4.8)(vue@3.3.4) + '@vitejs/plugin-vue-jsx': + specifier: ^3.0.1 + version: 3.0.1(vite@4.4.8)(vue@3.3.4) + autoprefixer: + specifier: ^10.4.14 + version: 10.4.14(postcss@8.4.27) + cz-git: + specifier: ^1.7.0 + version: 1.7.0 + czg: + specifier: ^1.7.0 + version: 1.7.0 + eslint: + specifier: ^8.44.0 + version: 8.44.0 + eslint-config-prettier: + specifier: ^8.9.0 + version: 8.9.0(eslint@8.44.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.0.0(eslint-config-prettier@8.9.0)(eslint@8.44.0)(prettier@3.0.0) + eslint-plugin-vue: + specifier: ^9.16.1 + version: 9.16.1(eslint@8.44.0) + husky: + specifier: ^8.0.3 + version: 8.0.3 + lint-staged: + specifier: ^13.2.3 + version: 13.2.3 + naive-ui: + specifier: ^2.34.4 + version: 2.34.4(vue@3.3.4) + postcss: + specifier: ^8.4.27 + version: 8.4.27 + postcss-html: + specifier: ^1.5.0 + version: 1.5.0 + prettier: + specifier: ^3.0.0 + version: 3.0.0 + rollup-plugin-visualizer: + specifier: ^5.9.2 + version: 5.9.2(rollup@2.79.1) + sass: + specifier: ^1.64.2 + version: 1.64.2 + sm-crypto: + specifier: ^0.3.12 + version: 0.3.12 + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + stylelint: + specifier: ^15.10.2 + version: 15.10.2 + stylelint-config-html: + specifier: ^1.1.0 + version: 1.1.0(postcss-html@1.5.0)(stylelint@15.10.2) + stylelint-config-recess-order: + specifier: ^4.3.0 + version: 4.3.0(stylelint@15.10.2) + stylelint-config-recommended-scss: + specifier: ^12.0.0 + version: 12.0.0(postcss@8.4.27)(stylelint@15.10.2) + stylelint-config-recommended-vue: + specifier: ^1.5.0 + version: 1.5.0(postcss-html@1.5.0)(stylelint@15.10.2) + stylelint-config-standard: + specifier: ^34.0.0 + version: 34.0.0(stylelint@15.10.2) + stylelint-config-standard-scss: + specifier: ^10.0.0 + version: 10.0.0(postcss@8.4.27)(stylelint@15.10.2) + typescript: + specifier: ^5.1.6 + version: 5.1.6 + unocss: + specifier: ^0.54.3 + version: 0.54.3(postcss@8.4.27)(rollup@2.79.1)(vite@4.4.8) + unplugin-auto-import: + specifier: ^0.16.6 + version: 0.16.6(@vueuse/core@10.3.0)(rollup@2.79.1) + unplugin-icons: + specifier: ^0.16.5 + version: 0.16.5 + unplugin-vue-components: + specifier: ^0.25.1 + version: 0.25.1(rollup@2.79.1)(vue@3.3.4) + unplugin-vue-setup-extend-plus: + specifier: ^1.0.0 + version: 1.0.0 + vite: + specifier: ^4.4.8 + version: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@4.4.8) + vite-plugin-eslint: + specifier: ^1.8.1 + version: 1.8.1(eslint@8.44.0)(vite@4.4.8) + vite-plugin-html: + specifier: ^3.2.0 + version: 3.2.0(vite@4.4.8) + vite-plugin-pwa: + specifier: ^0.16.4 + version: 0.16.4(vite@4.4.8)(workbox-build@7.0.0)(workbox-window@7.0.0) + vite-plugin-svg-icons: + specifier: ^2.0.1 + version: 2.0.1(vite@4.4.8) + vue-tsc: + specifier: ^1.8.8 + version: 1.8.8(typescript@5.1.6) + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@antfu/install-pkg@0.1.1: + resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + dev: true + + /@antfu/utils@0.7.5: + resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} + dev: true + + /@antv/adjust@0.2.5: + resolution: {integrity: sha512-MfWZOkD9CqXRES6MBGRNe27Q577a72EIwyMnE29wIlPliFvJfWwsrONddpGU7lilMpVKecS3WAzOoip3RfPTRQ==} + dependencies: + '@antv/util': 2.0.17 + tslib: 1.14.1 + dev: false + + /@antv/attr@0.3.5: + resolution: {integrity: sha512-wuj2gUo6C8Q2ASSMrVBuTcb5LcV+Tc0Egiy6bC42D0vxcQ+ta13CLxgMmHz8mjD0FxTPJDXSciyszRSC5TdLsg==} + dependencies: + '@antv/color-util': 2.0.6 + '@antv/scale': 0.3.18 + '@antv/util': 2.0.17 + tslib: 2.6.1 + dev: false + + /@antv/color-util@2.0.6: + resolution: {integrity: sha512-KnPEaAH+XNJMjax9U35W67nzPI+QQ2x27pYlzmSIWrbj4/k8PGrARXfzDTjwoozHJY8qG62Z+Ww6Alhu2FctXQ==} + dependencies: + '@antv/util': 2.0.17 + tslib: 2.6.1 + dev: false + + /@antv/component@0.8.35: + resolution: {integrity: sha512-VnRa5X77nBPI952o2xePEEMSNZ6g2mcUDrQY8mVL2kino/8TFhqDq5fTRmDXZyWyIYd4ulJTz5zgeSwAnX/INQ==} + dependencies: + '@antv/color-util': 2.0.6 + '@antv/dom-util': 2.0.4 + '@antv/g-base': 0.5.15 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 2.0.15 + '@antv/scale': 0.3.18 + '@antv/util': 2.0.17 + fecha: 4.2.3 + tslib: 2.6.1 + dev: false + + /@antv/coord@0.3.1: + resolution: {integrity: sha512-rFE94C8Xzbx4xmZnHh2AnlB3Qm1n5x0VT3OROy257IH6Rm4cuzv1+tZaUBATviwZd99S+rOY9telw/+6C9GbRw==} + dependencies: + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/util': 2.0.17 + tslib: 2.6.1 + dev: false + + /@antv/dom-util@2.0.4: + resolution: {integrity: sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ==} + dependencies: + tslib: 2.6.1 + dev: false + + /@antv/event-emitter@0.1.3: + resolution: {integrity: sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==} + dev: false + + /@antv/g-base@0.5.15: + resolution: {integrity: sha512-QOtq50QpnKez9J75/Z8j2yZ7QDQdk8R8mVQJiHtaEO5eI7DM4ZbrsWff/Ew26JYmPWdq7nbRuARMAD4PX9uuLA==} + dependencies: + '@antv/event-emitter': 0.1.3 + '@antv/g-math': 0.1.9 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 2.0.15 + '@antv/util': 2.0.17 + '@types/d3-timer': 2.0.1 + d3-ease: 1.0.7 + d3-interpolate: 3.0.1 + d3-timer: 1.0.10 + detect-browser: 5.3.0 + tslib: 2.6.1 + dev: false + + /@antv/g-canvas@0.5.14: + resolution: {integrity: sha512-IUGLEMIMAUYgaBMT8h3FTmYQYz7sjQkKWwh6Psqx+UPK86fySa+G8fMRrh1EqAL07jVB+GRnn6Ym+3FoFUgeFg==} + dependencies: + '@antv/g-base': 0.5.15 + '@antv/g-math': 0.1.9 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 2.0.15 + '@antv/util': 2.0.17 + gl-matrix: 3.4.3 + tslib: 2.6.1 + dev: false + + /@antv/g-math@0.1.9: + resolution: {integrity: sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==} + dependencies: + '@antv/util': 2.0.17 + gl-matrix: 3.4.3 + dev: false + + /@antv/g-svg@0.5.7: + resolution: {integrity: sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw==} + dependencies: + '@antv/g-base': 0.5.15 + '@antv/g-math': 0.1.9 + '@antv/util': 2.0.17 + detect-browser: 5.3.0 + tslib: 2.6.1 + dev: false + + /@antv/g2@4.2.10: + resolution: {integrity: sha512-/ZlJ/DFJBCvtEQgE6roxdd6sBml0fZ8ZVfzG+HdjGpA7/ceURb8XkxUcqa0E8NV+e4sFijnaAhBCdUm2whiuyA==} + dependencies: + '@antv/adjust': 0.2.5 + '@antv/attr': 0.3.5 + '@antv/color-util': 2.0.6 + '@antv/component': 0.8.35 + '@antv/coord': 0.3.1 + '@antv/dom-util': 2.0.4 + '@antv/event-emitter': 0.1.3 + '@antv/g-base': 0.5.15 + '@antv/g-canvas': 0.5.14 + '@antv/g-svg': 0.5.7 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 2.0.15 + '@antv/scale': 0.3.18 + '@antv/util': 2.0.17 + tslib: 2.6.1 + dev: false + + /@antv/g2plot@2.4.31: + resolution: {integrity: sha512-SlWHYVsJgRN7E1Oe5Qk6yWBrSWmctmloknFmklaqe9vEeK+YB9ZLUffZvtAHT10mA2NZ+VjGUhlnMNgR9M1PQg==} + dependencies: + '@antv/color-util': 2.0.6 + '@antv/event-emitter': 0.1.3 + '@antv/g-base': 0.5.15 + '@antv/g2': 4.2.10 + '@antv/matrix-util': 3.1.0-beta.3 + '@antv/path-util': 3.0.1 + '@antv/scale': 0.3.18 + '@antv/util': 2.0.17 + d3-hierarchy: 2.0.0 + d3-regression: 1.3.10 + fmin: 0.0.2 + pdfast: 0.2.0 + size-sensor: 1.0.2 + tslib: 2.6.1 + dev: false + + /@antv/matrix-util@3.0.4: + resolution: {integrity: sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==} + dependencies: + '@antv/util': 2.0.17 + gl-matrix: 3.4.3 + tslib: 2.6.1 + dev: false + + /@antv/matrix-util@3.1.0-beta.3: + resolution: {integrity: sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A==} + dependencies: + '@antv/util': 2.0.17 + gl-matrix: 3.4.3 + tslib: 2.6.1 + dev: false + + /@antv/path-util@2.0.15: + resolution: {integrity: sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==} + dependencies: + '@antv/matrix-util': 3.0.4 + '@antv/util': 2.0.17 + tslib: 2.6.1 + dev: false + + /@antv/path-util@3.0.1: + resolution: {integrity: sha512-tpvAzMpF9Qm6ik2YSMqICNU5tco5POOW7S4XoxZAI/B0L26adU+Md/SmO0BBo2SpuywKvzPH3hPT3xmoyhr04Q==} + dependencies: + gl-matrix: 3.4.3 + lodash-es: 4.17.21 + tslib: 2.6.1 + dev: false + + /@antv/scale@0.3.18: + resolution: {integrity: sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w==} + dependencies: + '@antv/util': 2.0.17 + fecha: 4.2.3 + tslib: 2.6.1 + dev: false + + /@antv/util@2.0.17: + resolution: {integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==} + dependencies: + csstype: 3.1.2 + tslib: 2.6.1 + dev: false + + /@apideck/better-ajv-errors@0.3.6(ajv@8.12.0): + resolution: {integrity: sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==} + engines: {node: '>=10'} + peerDependencies: + ajv: '>=8' + dependencies: + ajv: 8.12.0 + json-schema: 0.4.0 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + + /@babel/code-frame@7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/code-frame@7.21.4: + resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + dev: true + + /@babel/compat-data@7.21.0: + resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.21.3: + resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.22.11: + resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helpers': 7.22.11 + '@babel/parser': 7.22.11 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.21.3: + resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + dev: true + + /@babel/generator@7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.10: + resolution: {integrity: sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets@7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-class-features-plugin@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-regexp-features-plugin@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + regexpu-core: 5.3.2 + semver: 6.3.1 + dev: true + + /@babel/helper-define-polyfill-provider@0.4.2(@babel/core@7.22.11): + resolution: {integrity: sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-member-expression-to-functions@7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-member-expression-to-functions@7.22.5: + resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-module-imports@7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-module-transforms@7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + + /@babel/helper-optimise-call-expression@7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-plugin-utils@7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-remap-async-to-generator@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-wrap-function': 7.22.10 + dev: true + + /@babel/helper-replace-supers@7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + dev: true + + /@babel/helper-simple-access@7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-split-export-declaration@7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/helper-string-parser@7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-wrap-function@7.22.10: + resolution: {integrity: sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.22.5 + '@babel/template': 7.22.5 + '@babel/types': 7.22.11 + dev: true + + /@babel/helpers@7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helpers@7.22.11: + resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.21.3: + resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.5 + dev: true + + /@babel/parser@7.21.8: + resolution: {integrity: sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.5 + + /@babel/parser@7.22.11: + resolution: {integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.11 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-transform-optional-chaining': 7.22.11(@babel/core@7.22.11) + dev: true + + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11): + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.11): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-attributes@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.11): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.3): + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.11): + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-arrow-functions@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-async-generator-functions@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-0pAlmeRJn6wU84zzZsEOx1JV1Jf8fqO9ok7wofIJwUnplYo247dcd24P+cMJht7ts9xkzdtB0EPHmOb7F+KzXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-async-to-generator@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-remap-async-to-generator': 7.22.9(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-block-scoped-functions@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-block-scoping@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-properties@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-class-static-block@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-classes@7.22.6(@babel/core@7.22.11): + resolution: {integrity: sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + dev: true + + /@babel/plugin-transform-computed-properties@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/template': 7.22.5 + dev: true + + /@babel/plugin-transform-destructuring@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dotall-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-duplicate-keys@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-dynamic-import@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-exponentiation-operator@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-export-namespace-from@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-function-name@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-json-strings@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-literals@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-logical-assignment-operators@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-member-expression-literals@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-amd@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-commonjs@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-o2+bg7GDS60cJMgz9jWqRUsWkMzLCxp+jFDeDUT5sjRlAxcJWZ2ylNdI7QQ2+CH5hWu7OnN+Cv3htt7AkSf96g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-systemjs@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + dev: true + + /@babel/plugin-transform-modules-umd@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-new-target@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-nullish-coalescing-operator@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-numeric-separator@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-object-rest-spread@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-nX8cPFa6+UmbepISvlf5jhQyaC7ASs/7UxHmMkuJ/k5xSHvDPPaibMo+v3TXwU/Pjqhep/nFNpd3zn4YR59pnw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.11 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-object-super@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-optional-catch-binding@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-optional-chaining@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-7X2vGqH2ZKu7Imx0C+o5OysRwtF/wzdCAqmcD1N1v2Ww8CtOSC+p+VoV76skm47DLvBZ8kBFic+egqxM9S/p4g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-parameters@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-methods@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-private-property-in-object@7.22.11(@babel/core@7.22.11): + resolution: {integrity: sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.11(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) + dev: true + + /@babel/plugin-transform-property-literals@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-regenerator@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + regenerator-transform: 0.15.2 + dev: true + + /@babel/plugin-transform-reserved-words@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-shorthand-properties@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-spread@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + dev: true + + /@babel/plugin-transform-sticky-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-template-literals@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typeof-symbol@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.3): + resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.3) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-unicode-escapes@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-property-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-unicode-sets-regex@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-create-regexp-features-plugin': 7.22.9(@babel/core@7.22.11) + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/preset-env@7.22.10(@babel/core@7.22.11): + resolution: {integrity: sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.11 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.22.11) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.11) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-import-assertions': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-import-attributes': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.11) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.11) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-async-generator-functions': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-block-scoping': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-class-properties': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-class-static-block': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-classes': 7.22.6(@babel/core@7.22.11) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-destructuring': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-dotall-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-duplicate-keys': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-dynamic-import': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-exponentiation-operator': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-export-namespace-from': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-json-strings': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-logical-assignment-operators': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-modules-amd': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-modules-commonjs': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-modules-systemjs': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-modules-umd': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-new-target': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-nullish-coalescing-operator': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-numeric-separator': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-object-rest-spread': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-optional-catch-binding': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-optional-chaining': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-private-methods': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-private-property-in-object': 7.22.11(@babel/core@7.22.11) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-regenerator': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-reserved-words': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-typeof-symbol': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-unicode-escapes': 7.22.10(@babel/core@7.22.11) + '@babel/plugin-transform-unicode-property-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-unicode-sets-regex': 7.22.5(@babel/core@7.22.11) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.22.11) + '@babel/types': 7.22.11 + babel-plugin-polyfill-corejs2: 0.4.5(@babel/core@7.22.11) + babel-plugin-polyfill-corejs3: 0.8.3(@babel/core@7.22.11) + babel-plugin-polyfill-regenerator: 0.5.2(@babel/core@7.22.11) + core-js-compat: 3.32.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.22.11): + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/types': 7.22.11 + esutils: 2.0.3 + dev: true + + /@babel/regjsgen@0.8.0: + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + dev: true + + /@babel/runtime@7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + + /@babel/runtime@7.22.11: + resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.0 + dev: true + + /@babel/template@7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 + dev: true + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/parser': 7.22.11 + '@babel/types': 7.22.11 + dev: true + + /@babel/traverse@7.21.3: + resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.21.4 + '@babel/generator': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.8 + '@babel/types': 7.21.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse@7.22.11: + resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.11 + '@babel/types': 7.22.11 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.21.3: + resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@babel/types@7.21.5: + resolution: {integrity: sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@babel/types@7.22.11: + resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + + /@commitlint/cli@17.6.7: + resolution: {integrity: sha512-nzZmfO5KIOupYppn1MsnYX/80I+KDlxiwkks3CJT0XT+t34UgqGi3eSyEuzgcIjPlORk5/GMaAEiys78iLfGMg==} + engines: {node: '>=v14'} + hasBin: true + dependencies: + '@commitlint/format': 17.4.4 + '@commitlint/lint': 17.6.7 + '@commitlint/load': 17.6.7 + '@commitlint/read': 17.5.1 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-conventional@17.6.7: + resolution: {integrity: sha512-4oTpEUC0HRM54QRHBPMOJW1pETp7usxXn9RuNYNWHcmu8wi1mpws95hvS20u2n6HtIkTn0jfn7vHioCm4AGUTw==} + engines: {node: '>=v14'} + dependencies: + conventional-changelog-conventionalcommits: 5.0.0 + dev: true + + /@commitlint/config-validator@17.6.7: + resolution: {integrity: sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure@17.6.7: + resolution: {integrity: sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@17.4.0: + resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/format@17.4.4: + resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@17.6.7: + resolution: {integrity: sha512-vqyNRqtbq72P2JadaoWiuoLtXIs9SaAWDqdtef6G2zsoXqKFc7vqj1f+thzVgosXG3X/5K9jNp+iYijmvOfc/g==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + semver: 7.5.2 + dev: true + + /@commitlint/lint@17.6.7: + resolution: {integrity: sha512-TW+AozfuOFMrHn+jdwtz0IWu8REKFp0eryOvoBp2r8IXNc4KihKB1spAiUB6SFyHD6hVVeolz12aHnJ3Mb+xVQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/is-ignored': 17.6.7 + '@commitlint/parse': 17.6.7 + '@commitlint/rules': 17.6.7 + '@commitlint/types': 17.4.4 + dev: true + + /@commitlint/load@17.6.7: + resolution: {integrity: sha512-QZ2rJTbX55BQdYrCm/p6+hh/pFBgC9nTJxfsrK6xRPe2thiQzHN0AQDBqBwAirn6gIkHrjIbCbtAE6kiDYLjrw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.6.7 + '@commitlint/execute-rule': 17.4.0 + '@commitlint/resolve-extends': 17.6.7 + '@commitlint/types': 17.4.4 + '@types/node': 18.15.3 + chalk: 4.1.2 + cosmiconfig: 8.2.0 + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.15.3)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1(@types/node@18.15.3)(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/message@17.4.2: + resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/parse@17.6.7: + resolution: {integrity: sha512-ibO03BgEns+JJpohpBZYD49mCdSNMg6fTv7vA5yqzEFWkBQk5NWhEBw2yG+Z1UClStIRkMkAYyI2HzoQG9tCQQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read@17.5.1: + resolution: {integrity: sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/top-level': 17.4.0 + '@commitlint/types': 17.4.4 + fs-extra: 11.1.0 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@17.6.7: + resolution: {integrity: sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.6.7 + '@commitlint/types': 17.4.4 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@17.6.7: + resolution: {integrity: sha512-x/SDwDTN3w3Gr5xkhrIORu96rlKCc8ZLYEMXRqi9+MB33st2mKcGvKa5uJuigHlbl3xm75bAAubATrodVrjguQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/ensure': 17.6.7 + '@commitlint/message': 17.4.2 + '@commitlint/to-lines': 17.4.0 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@17.4.0: + resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/top-level@17.4.0: + resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} + engines: {node: '>=v14'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@17.4.4: + resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@css-render/plugin-bem@0.15.12(css-render@0.15.12): + resolution: {integrity: sha512-Lq2jSOZn+wYQtsyaFj6QRz2EzAnd3iW5fZeHO1WSXQdVYwvwGX0ZiH3X2JQgtgYLT1yeGtrwrqJdNdMEUD2xTw==} + peerDependencies: + css-render: ~0.15.12 + dependencies: + css-render: 0.15.12 + dev: true + + /@css-render/vue3-ssr@0.15.12(vue@3.3.4): + resolution: {integrity: sha512-AQLGhhaE0F+rwybRCkKUdzBdTEM/5PZBYy+fSYe1T9z9+yxMuV/k7ZRqa4M69X+EI1W8pa4kc9Iq2VjQkZx4rg==} + peerDependencies: + vue: ^3.0.11 + dependencies: + vue: 3.3.4 + dev: true + + /@csstools/css-parser-algorithms@2.3.0(@csstools/css-tokenizer@2.1.1): + resolution: {integrity: sha512-dTKSIHHWc0zPvcS5cqGP+/TPFUJB0ekJ9dGKvMAFoNuBFhDPBt9OMGNZiIA5vTiNdGHHBeScYPXIGBMnVOahsA==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-tokenizer': ^2.1.1 + dependencies: + '@csstools/css-tokenizer': 2.1.1 + dev: true + + /@csstools/css-tokenizer@2.1.1: + resolution: {integrity: sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==} + engines: {node: ^14 || ^16 || >=18} + dev: true + + /@csstools/media-query-list-parser@2.1.2(@csstools/css-parser-algorithms@2.3.0)(@csstools/css-tokenizer@2.1.1): + resolution: {integrity: sha512-M8cFGGwl866o6++vIY7j1AKuq9v57cf+dGepScwCcbut9ypJNr4Cj+LLTWligYUZ0uyhEoJDKt5lvyBfh2L3ZQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + '@csstools/css-parser-algorithms': ^2.3.0 + '@csstools/css-tokenizer': ^2.1.1 + dependencies: + '@csstools/css-parser-algorithms': 2.3.0(@csstools/css-tokenizer@2.1.1) + '@csstools/css-tokenizer': 2.1.1 + dev: true + + /@csstools/selector-specificity@3.0.0(postcss-selector-parser@6.0.13): + resolution: {integrity: sha512-hBI9tfBtuPIi885ZsZ32IMEU/5nlZH/KOVYJCOh7gyMxaVLGmLedYqFN6Ui1LXkI8JlC8IsuC0rF0btcRZKd5g==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss-selector-parser: ^6.0.13 + dependencies: + postcss-selector-parser: 6.0.13 + dev: true + + /@ctrl/tinycolor@3.6.0: + resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==} + engines: {node: '>=10'} + dev: false + + /@element-plus/icons-vue@2.1.0(vue@3.3.4): + resolution: {integrity: sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==} + peerDependencies: + vue: ^3.2.0 + dependencies: + vue: 3.3.4 + dev: false + + /@emotion/hash@0.8.0: + resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + dev: true + + /@esbuild/android-arm64@0.18.11: + resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.11: + resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.11: + resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.11: + resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.11: + resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.11: + resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.11: + resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.11: + resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.11: + resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.11: + resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.11: + resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.11: + resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.11: + resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.11: + resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.11: + resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.11: + resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.11: + resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.11: + resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.11: + resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.11: + resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.11: + resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.11: + resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.44.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.44.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@eslint-community/regexpp@4.4.0: + resolution: {integrity: sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint-community/regexpp@4.6.2: + resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.0: + resolution: {integrity: sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.0 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.44.0: + resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@floating-ui/core@1.2.4: + resolution: {integrity: sha512-SQOeVbMwb1di+mVWWJLpsUTToKfqVNioXys011beCAhyOIFtS+GQoW4EQSneuxzmQKddExDwQ+X0hLl4lJJaSQ==} + dev: false + + /@floating-ui/dom@1.2.4: + resolution: {integrity: sha512-4+k+BLhtWj+peCU60gp0+rHeR8+Ohqx6kjJf/lHMnJ8JD5Qj6jytcq1+SZzRwD7rvHKRhR7TDiWWddrNrfwQLg==} + dependencies: + '@floating-ui/core': 1.2.4 + dev: false + + /@highlightjs/vue-plugin@2.1.0(highlight.js@11.8.0)(vue@3.3.4): + resolution: {integrity: sha512-E+bmk4ncca+hBEYRV2a+1aIzIV0VSY/e5ArjpuSN9IO7wBJrzUE2u4ESCwrbQD7sAy+jWQjkV5qCCWgc+pu7CQ==} + peerDependencies: + highlight.js: ^11.0.1 + vue: ^3 + dependencies: + highlight.js: 11.8.0 + vue: 3.3.4 + dev: false + + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@iconify/json@2.2.102: + resolution: {integrity: sha512-GzTbgFxu5KF17HYj1i4gCr6qpIeEOuFsVEuuePy33vH1vs2IA0a0ox/ZVQDBWhNZHYAIZHL6XBC4m/vsr0J+qA==} + dependencies: + '@iconify/types': 2.0.0 + pathe: 1.1.1 + dev: true + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + /@iconify/utils@2.1.7: + resolution: {integrity: sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw==} + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.5 + '@iconify/types': 2.0.0 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@iconify/vue@4.1.1(vue@3.3.4): + resolution: {integrity: sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==} + peerDependencies: + vue: '>=3' + dependencies: + '@iconify/types': 2.0.0 + vue: 3.3.4 + dev: false + + /@jridgewell/gen-mapping@0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@juggle/resize-observer@3.4.0: + resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.1 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.1 + dev: true + + /@polka/url@1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: true + + /@rollup/plugin-babel@5.3.1(@babel/core@7.22.11)(rollup@2.79.1): + resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-module-imports': 7.22.5 + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + rollup: 2.79.1 + dev: true + + /@rollup/plugin-node-resolve@11.2.1(rollup@2.79.1): + resolution: {integrity: sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + '@types/resolve': 1.17.1 + builtin-modules: 3.3.0 + deepmerge: 4.3.1 + is-module: 1.0.0 + resolve: 1.22.4 + rollup: 2.79.1 + dev: true + + /@rollup/plugin-replace@2.4.2(rollup@2.79.1): + resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@2.79.1) + magic-string: 0.25.9 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@2.79.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/pluginutils@5.0.2(rollup@2.79.1): + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + rollup: 2.79.1 + dev: true + + /@surma/rollup-plugin-off-main-thread@2.2.3: + resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} + dependencies: + ejs: 3.1.9 + json5: 2.2.3 + magic-string: 0.25.9 + string.prototype.matchall: 4.0.8 + dev: true + + /@sxzz/popperjs-es@2.11.7: + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + dev: false + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/bigi@1.4.3: + resolution: {integrity: sha512-oP82FmXt9/WksX+kyBJvMV/JjYb0EsGBUns+Ogw3SjCifBDudxHFwtBt01ZD7m6bGHHzgIKkOU/lRZEhwBTsKw==} + dev: true + + /@types/d3-timer@2.0.1: + resolution: {integrity: sha512-TF8aoF5cHcLO7W7403blM7L1T+6NF3XMyN3fxyUolq2uOcFeicG/khQg/dGxiCJWoAcmYulYN7LYSRKO54IXaA==} + dev: false + + /@types/eslint@8.21.2: + resolution: {integrity: sha512-EMpxUyystd3uZVByZap1DACsMXvb82ypQnGn89e1Y0a+LYu3JJscUd/gqhRsVFDkaD2MIiWo0MT8EfXr3DGRKw==} + dependencies: + '@types/estree': 1.0.0 + '@types/json-schema': 7.0.11 + dev: true + + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + + /@types/estree@1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: true + + /@types/json-schema@7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + + /@types/katex@0.14.0: + resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==} + dev: true + + /@types/lodash-es@4.17.7: + resolution: {integrity: sha512-z0ptr6UI10VlU6l5MYhGwS4mC8DZyYer2mCoyysZtSF7p26zOX8UpbrV0YpNYLGS8K4PUFIyEr62IMFFjveSiQ==} + dependencies: + '@types/lodash': 4.14.191 + + /@types/lodash@4.14.191: + resolution: {integrity: sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==} + + /@types/md5@2.3.2: + resolution: {integrity: sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node@18.15.3: + resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} + dev: true + + /@types/node@20.5.6: + resolution: {integrity: sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==} + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/nprogress@0.2.0: + resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==} + dev: true + + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/resolve@1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 20.5.6 + dev: true + + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true + + /@types/sm-crypto@0.3.1: + resolution: {integrity: sha512-O2enURyEJzpog267wOWvyW8oYTjrI4peEthpU29CROl3kgCdR+MS8gdZaSO6CzVbEmQPUtRrox0rDHabalhREw==} + dependencies: + '@types/bigi': 1.4.3 + dev: true + + /@types/sortablejs@1.15.1: + resolution: {integrity: sha512-g/JwBNToh6oCTAwNS8UGVmjO7NLDKsejVhvE4x1eWiPTC3uCuNsa/TD4ssvX3du+MLiM+SHPNDuijp8y76JzLQ==} + dev: true + + /@types/svgo@2.6.4: + resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} + dependencies: + '@types/node': 18.15.3 + dev: true + + /@types/trusted-types@2.0.3: + resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} + dev: true + + /@types/web-bluetooth@0.0.16: + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + dev: false + + /@types/web-bluetooth@0.0.17: + resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} + + /@typescript-eslint/eslint-plugin@6.2.1(@typescript-eslint/parser@6.2.1)(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-iZVM/ALid9kO0+I81pnp1xmYiFyqibAHzrqX4q5YvvVEyJqY+e6rfTXSCsc2jUxGNqJqTfFSSij/NFkZBiBzLw==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.6.2 + '@typescript-eslint/parser': 6.2.1(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 6.2.1 + '@typescript-eslint/type-utils': 6.2.1(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/utils': 6.2.1(eslint@8.44.0)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.2.1 + debug: 4.3.4 + eslint: 8.44.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.2.1(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-Ld+uL1kYFU8e6btqBFpsHkwQ35rw30IWpdQxgOqOh4NfxSDH6uCkah1ks8R/RgQqI5hHPXMaLy9fbFseIe+dIg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.2.1 + '@typescript-eslint/types': 6.2.1 + '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 6.2.1 + debug: 4.3.4 + eslint: 8.44.0 + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.2.1: + resolution: {integrity: sha512-UCqBF9WFqv64xNsIEPfBtenbfodPXsJ3nPAr55mGPkQIkiQvgoWNo+astj9ZUfJfVKiYgAZDMnM6dIpsxUMp3Q==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.2.1 + '@typescript-eslint/visitor-keys': 6.2.1 + dev: true + + /@typescript-eslint/type-utils@6.2.1(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-fTfCgomBMIgu2Dh2Or3gMYgoNAnQm3RLtRp+jP7A8fY+LJ2+9PNpi5p6QB5C4RSP+U3cjI0vDlI3mspAkpPVbQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) + '@typescript-eslint/utils': 6.2.1(eslint@8.44.0)(typescript@5.1.6) + debug: 4.3.4 + eslint: 8.44.0 + ts-api-utils: 1.0.1(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.2.1: + resolution: {integrity: sha512-528bGcoelrpw+sETlyM91k51Arl2ajbNT9L4JwoXE2dvRe1yd8Q64E4OL7vHYw31mlnVsf+BeeLyAZUEQtqahQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.2.1(typescript@5.1.6): + resolution: {integrity: sha512-G+UJeQx9AKBHRQBpmvr8T/3K5bJa485eu+4tQBxFq0KoT22+jJyzo1B50JDT9QdC1DEmWQfdKsa8ybiNWYsi0Q==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.2.1 + '@typescript-eslint/visitor-keys': 6.2.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.1(typescript@5.1.6) + typescript: 5.1.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.2.1(eslint@8.44.0)(typescript@5.1.6): + resolution: {integrity: sha512-eBIXQeupYmxVB6S7x+B9SdBeB6qIdXKjgQBge2J+Ouv8h9Cxm5dHf/gfAZA6dkMaag+03HdbVInuXMmqFB/lKQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.2.1 + '@typescript-eslint/types': 6.2.1 + '@typescript-eslint/typescript-estree': 6.2.1(typescript@5.1.6) + eslint: 8.44.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.2.1: + resolution: {integrity: sha512-iTN6w3k2JEZ7cyVdZJTVJx2Lv7t6zFA8DCrJEHD2mwfc16AEvvBWVhbFh34XyG2NORCd0viIgQY1+u7kPI0WpA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.2.1 + eslint-visitor-keys: 3.4.1 + dev: true + + /@unocss/astro@0.54.3(rollup@2.79.1)(vite@4.4.8): + resolution: {integrity: sha512-/gmnSIIsYtAVPbcIGXuuaoCM71x8s8I0VtsEQZicNB51ux7BhSyXIQ5CE/W384NqTaqJt7gHVfbjn+io4ZSJXw==} + dependencies: + '@unocss/core': 0.54.3 + '@unocss/reset': 0.54.3 + '@unocss/vite': 0.54.3(rollup@2.79.1)(vite@4.4.8) + transitivePeerDependencies: + - rollup + - vite + dev: true + + /@unocss/cli@0.54.3(rollup@2.79.1): + resolution: {integrity: sha512-IZkza5EWYVgYC5ZbJyFw7xUpoucpvaF/lW2pqXcjywONadq18TWwvu+LPExOZ37ycHE0uid50tzfN4oqgtJIXQ==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@ampproject/remapping': 2.2.1 + '@rollup/pluginutils': 5.0.2(rollup@2.79.1) + '@unocss/config': 0.54.3 + '@unocss/core': 0.54.3 + '@unocss/preset-uno': 0.54.3 + cac: 6.7.14 + chokidar: 3.5.3 + colorette: 2.0.20 + consola: 3.2.3 + fast-glob: 3.3.1 + magic-string: 0.30.2 + pathe: 1.1.1 + perfect-debounce: 1.0.0 + transitivePeerDependencies: + - rollup + dev: true + + /@unocss/config@0.54.3: + resolution: {integrity: sha512-afyJTtYZxq0N5ZpFlVcQfwVzDZjyKrHS/gL0SrXRBfj0W3s2FuPeDDMC6QOFLUwKH58snI6bzzE7ao7kLTRecA==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.54.3 + unconfig: 0.3.10 + dev: true + + /@unocss/core@0.54.3: + resolution: {integrity: sha512-XAVfnq6hO7Zaa5VnsFKi1KQKgUS3jOhZYgdedIgJVx2WkmkpM/UQ2lummIlB27uHp0o+Wzf5kueKlMS3q+2lvA==} + dev: true + + /@unocss/extractor-arbitrary-variants@0.54.3: + resolution: {integrity: sha512-Vab8pb1EQZ4KO63N/w2nvean8DlAhTurupmNWEqLzj7XsfH6IMJiUyonYXxTUKWY8oLsHEh3OOTuLMv7NV7bSQ==} + dependencies: + '@unocss/core': 0.54.3 + dev: true + + /@unocss/inspector@0.54.3: + resolution: {integrity: sha512-1DyYr1Oe/OT4u7CH6Zrga1IIG41r3gJnvTA0I49QcGCE5rRR1lk/RFX4Js1exlRsWfqTCue9c1J32K5ymyCn1w==} + dependencies: + gzip-size: 6.0.0 + sirv: 2.0.3 + dev: true + + /@unocss/postcss@0.54.3(postcss@8.4.27): + resolution: {integrity: sha512-LPVSa+euzeh9Nzsb/IJI2ZeW0SUeifn0dRmPtB3bTOHkVeVba8IFWPzU3grC+m2tU9ysiTLs/9U2tLObljfC3g==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + dependencies: + '@unocss/config': 0.54.3 + '@unocss/core': 0.54.3 + css-tree: 2.3.1 + fast-glob: 3.3.1 + magic-string: 0.30.2 + postcss: 8.4.27 + dev: true + + /@unocss/preset-attributify@0.54.3: + resolution: {integrity: sha512-DuxNOCByPfboDXN/80RxiD3O5yWJwzQRsIGlHNufs6HEj+hET6ArSBZuxph7gnfSdZUZxi9YonSZjop61iC5TA==} + dependencies: + '@unocss/core': 0.54.3 + dev: true + + /@unocss/preset-icons@0.54.3: + resolution: {integrity: sha512-RIZ9gewKqKuvnDvi66rHzBShiWjUPS4I1JchKMkofX8h4uJniPtQFb2Yy5YRzm0YL5eZPWjLQK5uHiNN+EhMkg==} + dependencies: + '@iconify/utils': 2.1.7 + '@unocss/core': 0.54.3 + ofetch: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@unocss/preset-mini@0.54.3: + resolution: {integrity: sha512-HgjoAn3TwO0jimNPoEF5q8mOHUlHChKfIdTdPUGg4zIfFK+lPBSsmTJFnTRNx/Hr2YkaiTV2C9pDBRFazw/zwQ==} + dependencies: + '@unocss/core': 0.54.3 + '@unocss/extractor-arbitrary-variants': 0.54.3 + dev: true + + /@unocss/preset-tagify@0.54.3: + resolution: {integrity: sha512-5151PeVaZ3EqGR6Xla2KPtsh/B+f7ghC83Tv9e4TPnRisNteWsj4CzwvqQoKv9xWeHVBkvhaXl5msv/mbtrKEA==} + dependencies: + '@unocss/core': 0.54.3 + dev: true + + /@unocss/preset-typography@0.54.3: + resolution: {integrity: sha512-Fm6d9huYax0f0L48we7QER5+XCicp1O9CvP+10AwXgizBwrqmXo+BFafodc65QPOAnGUixmGpJjSgm6kN/76Hw==} + dependencies: + '@unocss/core': 0.54.3 + '@unocss/preset-mini': 0.54.3 + dev: true + + /@unocss/preset-uno@0.54.3: + resolution: {integrity: sha512-uz1uh/LYQ9lXkGOrBMx+aBtwphl9GA1u1aooMuP4bxXqsaA/jlcoJGb1PD+y2b4aDoY27Vc/IhLVxwMVd42Emw==} + dependencies: + '@unocss/core': 0.54.3 + '@unocss/preset-mini': 0.54.3 + '@unocss/preset-wind': 0.54.3 + dev: true + + /@unocss/preset-web-fonts@0.54.3: + resolution: {integrity: sha512-z8hmt1voo8UpWJvPFiNR+y83gXuN+/l1l4SHZ/yiVQtSsO7R/po6p0qTb0t1hNlk4tUcAz8Olq8ArmU3x8QyJA==} + dependencies: + '@unocss/core': 0.54.3 + ofetch: 1.1.1 + dev: true + + /@unocss/preset-wind@0.54.3: + resolution: {integrity: sha512-il9OtJ9WWQBFLXRJBZc9ItMh5ILC5ZML+fnRpjkQ2y+tq29/eQzw23WusYuSWpS5fT/IwiGKDBGPteRx7ZZwYA==} + dependencies: + '@unocss/core': 0.54.3 + '@unocss/preset-mini': 0.54.3 + dev: true + + /@unocss/reset@0.54.3: + resolution: {integrity: sha512-5FjdfZKvwJ0JrUr2rVWnZzHfg7jOCMaJjD93VvCdFIr8Q9dChSzuZoWGCcx6EEsZm5zEfpB7+qwwz6Y2lN9vxg==} + dev: true + + /@unocss/scope@0.54.3: + resolution: {integrity: sha512-bR9TQ4430KgjGoGKM6SRO41tbntbC3z/8xIjJ7W1VVHo7pxnfdqBI7cDqL5kF3bIDdhszVwpsCMsc1PiURPu6A==} + dev: true + + /@unocss/transformer-attributify-jsx-babel@0.54.3: + resolution: {integrity: sha512-M9c3Q1Xik/+P1l4db/g/PIoRrfwlara9KFz3JPSNcortF8I5OFf6vDV0JMWTVvv/PSy2sgMbihTUF97eYOPVpA==} + dependencies: + '@unocss/core': 0.54.3 + dev: true + + /@unocss/transformer-attributify-jsx@0.54.3: + resolution: {integrity: sha512-3JdoFXpT5QLf3TdLxt28iwmjMmeujjsnZsT7ZP9mN83h/Dka+mUQHhQPMwSzSvNUursXMamiqRximC8PwozJng==} + dependencies: + '@unocss/core': 0.54.3 + dev: true + + /@unocss/transformer-compile-class@0.54.3: + resolution: {integrity: sha512-KgkMmr9TEd/SIrniGKull/iH2dCAf88ozVWoMuyay/DqUCfAFq5vlQ+2lmhSv3mANS0BIVQwP4lONmrw38iQVw==} + dependencies: + '@unocss/core': 0.54.3 + dev: true + + /@unocss/transformer-directives@0.54.3: + resolution: {integrity: sha512-0aowyhk9pL2ZQ8avb6Yr21w8Fe3m/55j7meulXPyLxAbXw5qatRx37TBeKVJ9BbvnfBQtj/49z9jXj2bXNpoMA==} + dependencies: + '@unocss/core': 0.54.3 + css-tree: 2.3.1 + dev: true + + /@unocss/transformer-variant-group@0.54.3: + resolution: {integrity: sha512-4YZSi2LBTvrvPKDFZdb7rmqAlFr+hf4f92MfmPDRPwFp/qvJeO2UoBUCkiZoTjLHzCykHuLEJUiXgr3QNO2D1A==} + dependencies: + '@unocss/core': 0.54.3 + dev: true + + /@unocss/vite@0.54.3(rollup@2.79.1)(vite@4.4.8): + resolution: {integrity: sha512-UxVo7WQpTAr5uHyjLKW1xs5kcecctUXsPApUChFxQwHRUeMT1gnBftd0r7dtSwdsdELClbIUgRVCrpFAPy2Y3g==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 + dependencies: + '@ampproject/remapping': 2.2.1 + '@rollup/pluginutils': 5.0.2(rollup@2.79.1) + '@unocss/config': 0.54.3 + '@unocss/core': 0.54.3 + '@unocss/inspector': 0.54.3 + '@unocss/scope': 0.54.3 + '@unocss/transformer-directives': 0.54.3 + chokidar: 3.5.3 + fast-glob: 3.3.1 + magic-string: 0.30.2 + vite: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + transitivePeerDependencies: + - rollup + dev: true + + /@vitejs/plugin-vue-jsx@3.0.1(vite@4.4.8)(vue@3.3.4): + resolution: {integrity: sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.3) + '@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.21.3) + vite: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + vue: 3.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue@4.2.3(vite@4.4.8)(vue@3.3.4): + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + vue: 3.3.4 + dev: true + + /@volar/language-core@1.10.0: + resolution: {integrity: sha512-ddyWwSYqcbEZNFHm+Z3NZd6M7Ihjcwl/9B5cZd8kECdimVXUFdFi60XHWD27nrWtUQIsUYIG7Ca1WBwV2u2LSQ==} + dependencies: + '@volar/source-map': 1.10.0 + dev: true + + /@volar/source-map@1.10.0: + resolution: {integrity: sha512-/ibWdcOzDGiq/GM1JU2eX8fH1bvAhl66hfe8yEgLEzg9txgr6qb5sQ/DEz5PcDL75tF5H5sCRRwn8Eu8ezi9mw==} + dependencies: + muggle-string: 0.3.1 + dev: true + + /@volar/typescript@1.10.0: + resolution: {integrity: sha512-OtqGtFbUKYC0pLNIk3mHQp5xWnvL1CJIUc9VE39VdZ/oqpoBh5jKfb9uJ45Y4/oP/WYTrif/Uxl1k8VTPz66Gg==} + dependencies: + '@volar/language-core': 1.10.0 + dev: true + + /@vue/babel-helper-vue-transform-on@1.0.2: + resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} + dev: true + + /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.21.3): + resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} + dependencies: + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.3) + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + '@vue/babel-helper-vue-transform-on': 1.0.2 + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true + + /@vue/compiler-core@3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.21.8 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + dev: true + + /@vue/compiler-core@3.3.4: + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + dependencies: + '@babel/parser': 7.21.8 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + + /@vue/compiler-dom@3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + dev: true + + /@vue/compiler-dom@3.3.4: + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + + /@vue/compiler-sfc@3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.21.3 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.27 + source-map: 0.6.1 + dev: true + + /@vue/compiler-sfc@3.3.4: + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + dependencies: + '@babel/parser': 7.21.8 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.2 + postcss: 8.4.27 + source-map-js: 1.0.2 + + /@vue/compiler-ssr@3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + dev: true + + /@vue/compiler-ssr@3.3.4: + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + + /@vue/devtools-api@6.5.0: + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + dev: false + + /@vue/language-core@1.8.8(typescript@5.1.6): + resolution: {integrity: sha512-i4KMTuPazf48yMdYoebTkgSOJdFraE4pQf0B+FTOFkbB+6hAfjrSou/UmYWRsWyZV6r4Rc6DDZdI39CJwL0rWw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.10.0 + '@volar/source-map': 1.10.0 + '@vue/compiler-dom': 3.3.4 + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + minimatch: 9.0.3 + muggle-string: 0.3.1 + typescript: 5.1.6 + vue-template-compiler: 2.7.14 + dev: true + + /@vue/reactivity-transform@3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.21.8 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + dev: true + + /@vue/reactivity-transform@3.3.4: + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + dependencies: + '@babel/parser': 7.21.8 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.2 + + /@vue/reactivity@3.3.4: + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + dependencies: + '@vue/shared': 3.3.4 + + /@vue/runtime-core@3.3.4: + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + + /@vue/runtime-dom@3.3.4: + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.1.2 + + /@vue/server-renderer@3.3.4(vue@3.3.4): + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + + /@vue/shared@3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + dev: true + + /@vue/shared@3.3.4: + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + + /@vue/typescript@1.8.8(typescript@5.1.6): + resolution: {integrity: sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==} + dependencies: + '@volar/typescript': 1.10.0 + '@vue/language-core': 1.8.8(typescript@5.1.6) + transitivePeerDependencies: + - typescript + dev: true + + /@vueuse/core@10.3.0(vue@3.3.4): + resolution: {integrity: sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==} + dependencies: + '@types/web-bluetooth': 0.0.17 + '@vueuse/metadata': 10.3.0 + '@vueuse/shared': 10.3.0(vue@3.3.4) + vue-demi: 0.14.5(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + /@vueuse/core@9.13.0(vue@3.3.4): + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.3.4) + vue-demi: 0.14.5(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/metadata@10.3.0: + resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} + + /@vueuse/metadata@9.13.0: + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + dev: false + + /@vueuse/shared@10.3.0(vue@3.3.4): + resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} + dependencies: + vue-demi: 0.14.5(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + /@vueuse/shared@9.13.0(vue@3.3.4): + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + dependencies: + vue-demi: 0.14.5(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /align-text@0.1.4: + resolution: {integrity: sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + longest: 1.0.1 + repeat-string: 1.6.1 + dev: false + + /amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + dev: false + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /arraybuffer.prototype.slice@1.0.1: + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /autoprefixer@10.4.14(postcss@8.4.27): + resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.5 + caniuse-lite: 1.0.30001522 + fraction.js: 4.2.0 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.27 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /babel-plugin-polyfill-corejs2@0.4.5(@babel/core@7.22.11): + resolution: {integrity: sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.11 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-corejs3@0.8.3(@babel/core@7.22.11): + resolution: {integrity: sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) + core-js-compat: 3.32.1 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-polyfill-regenerator@0.5.2(@babel/core@7.22.11): + resolution: {integrity: sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-define-polyfill-provider': 0.4.2(@babel/core@7.22.11) + transitivePeerDependencies: + - supports-color + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /balanced-match@2.0.0: + resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + dev: true + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + + /big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001522 + electron-to-chromium: 1.4.501 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true + + /browserslist@4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001522 + electron-to-chromium: 1.4.330 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10(browserslist@4.21.5) + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.1 + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase-keys@7.0.2: + resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} + engines: {node: '>=12'} + dependencies: + camelcase: 6.3.0 + map-obj: 4.3.0 + quick-lru: 5.1.1 + type-fest: 1.4.0 + dev: true + + /camelcase@1.2.1: + resolution: {integrity: sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==} + engines: {node: '>=0.10.0'} + dev: false + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001522: + resolution: {integrity: sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==} + dev: true + + /center-align@0.1.3: + resolution: {integrity: sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==} + engines: {node: '>=0.10.0'} + dependencies: + align-text: 0.1.4 + lazy-cache: 1.0.4 + dev: false + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /clean-css@5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /cliui@2.1.0: + resolution: {integrity: sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==} + dependencies: + center-align: 0.1.3 + right-align: 0.1.3 + wordwrap: 0.0.2 + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: true + + /colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@10.0.0: + resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: true + + /connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + dev: true + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + dev: true + + /consola@3.2.3: + resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} + engines: {node: ^14.18.0 || >=16.10.0} + dev: true + + /contour_plot@0.0.1: + resolution: {integrity: sha512-Nil2HI76Xux6sVGORvhSS8v66m+/h5CwFkBJDO+U5vWaMdNC0yXNCsGDPbzPhvqOEU5koebhdEvD372LI+IyLw==} + dev: false + + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-config-spec@2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + dev: true + + /conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-conventionalcommits@5.0.0: + resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + dev: true + + /conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + dev: true + + /conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + dependencies: + q: 1.5.1 + dev: true + + /conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + dev: true + + /conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.7 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.0 + split: 1.0.1 + through2: 4.0.2 + dev: true + + /conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + dev: true + + /conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /conventional-recommended-bump@6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 2.3.4 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + git-raw-commits: 2.0.11 + git-semver-tags: 4.1.1 + meow: 8.1.2 + q: 1.5.1 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /core-js-compat@3.32.1: + resolution: {integrity: sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA==} + dependencies: + browserslist: 4.21.10 + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: true + + /cosmiconfig-typescript-loader@4.3.0(@types/node@18.15.3)(cosmiconfig@8.2.0)(ts-node@10.9.1)(typescript@5.1.6): + resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=3' + dependencies: + '@types/node': 18.15.3 + cosmiconfig: 8.2.0 + ts-node: 10.9.1(@types/node@18.15.3)(typescript@5.1.6) + typescript: 5.1.6 + dev: true + + /cosmiconfig@8.2.0: + resolution: {integrity: sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: false + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + dev: true + + /css-functions-list@3.2.0: + resolution: {integrity: sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg==} + engines: {node: '>=12.22'} + dev: true + + /css-render@0.15.12: + resolution: {integrity: sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==} + dependencies: + '@emotion/hash': 0.8.0 + csstype: 3.0.11 + dev: true + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /csstype@3.0.11: + resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==} + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /cz-git@1.7.0: + resolution: {integrity: sha512-A9ix8zJtRfuj7aXrlS2K6SqrFy/9VcoHOeZKEYM0qG4h++9p4/vkeEjHpwxHN0S2ARtbmlKypjrhVkFtFnBG1Q==} + engines: {node: '>=v12.20.0'} + dev: true + + /czg@1.7.0: + resolution: {integrity: sha512-Y0pC2Ff2PoVRWGHCdZI13Gag8RdhMA9t9Invyjr/efyGbgust8TSQEVvMM4MidAuB7zm8PvGytljk6Segjr4DA==} + engines: {node: '>=v12.20.0'} + hasBin: true + dev: true + + /d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + dev: false + + /d3-ease@1.0.7: + resolution: {integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==} + dev: false + + /d3-hierarchy@2.0.0: + resolution: {integrity: sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==} + dev: false + + /d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: false + + /d3-regression@1.3.10: + resolution: {integrity: sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw==} + dev: false + + /d3-timer@1.0.10: + resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} + dev: false + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /date-fns-tz@1.3.8(date-fns@2.30.0): + resolution: {integrity: sha512-qwNXUFtMHTTU6CFSFjoJ80W8Fzzp24LntbjFFBgL/faqds4e5mo9mftoRLgr3Vi1trISsg4awSpYVsOQCRnapQ==} + peerDependencies: + date-fns: '>=2.0.0' + dependencies: + date-fns: 2.30.0 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.21.0 + dev: true + + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true + + /dayjs@1.11.9: + resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} + dev: false + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + /decamelize@5.0.1: + resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} + engines: {node: '>=10'} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /deep-equal@1.1.1: + resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.5 + object-keys: 1.1.1 + regexp.prototype.flags: 1.5.0 + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.1.1 + titleize: 3.0.0 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.6 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: true + + /defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: false + + /defu@6.1.2: + resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /destr@2.0.1: + resolution: {integrity: sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==} + dev: true + + /detect-browser@5.3.0: + resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} + dev: false + + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-serializer@0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: true + + /domelementtype@1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@2.4.2: + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} + dependencies: + domelementtype: 1.3.1 + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /domutils@3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.1 + dev: true + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: true + + /dotgitignore@2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} + dependencies: + find-up: 3.0.0 + minimatch: 3.1.2 + dev: true + + /dotignore@0.1.2: + resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} + hasBin: true + dependencies: + minimatch: 3.1.2 + dev: false + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /echarts@5.4.3: + resolution: {integrity: sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==} + dependencies: + tslib: 2.3.0 + zrender: 5.4.4 + dev: false + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.5 + dev: true + + /electron-to-chromium@1.4.330: + resolution: {integrity: sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==} + dev: true + + /electron-to-chromium@1.4.501: + resolution: {integrity: sha512-NCF5hZUg73MEP0guvIM+BjPs9W07UeAuc5XCNqRZZTKJxLjE0ZS/Zo5UsV8bbs2y/jeKRPFPzdWdBfOGEZTXKg==} + dev: true + + /element-plus@2.3.4(vue@3.3.4): + resolution: {integrity: sha512-SQr0J9z7N4z48WYk/l9NE2tizl8Q7j2OhqlpTc42k4pGncry3+rVX6dsmcsglFynn6vt3NzYxWJqmLFyDKQq+g==} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@ctrl/tinycolor': 3.6.0 + '@element-plus/icons-vue': 2.1.0(vue@3.3.4) + '@floating-ui/dom': 1.2.4 + '@popperjs/core': /@sxzz/popperjs-es@2.11.7 + '@types/lodash': 4.14.191 + '@types/lodash-es': 4.17.7 + '@vueuse/core': 9.13.0(vue@3.3.4) + async-validator: 4.2.5 + dayjs: 1.11.9 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.7)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.3.4 + transitivePeerDependencies: + - '@vue/composition-api' + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + dev: true + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /entities@4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.22.1: + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + /esbuild@0.18.11: + resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.11 + '@esbuild/android-arm64': 0.18.11 + '@esbuild/android-x64': 0.18.11 + '@esbuild/darwin-arm64': 0.18.11 + '@esbuild/darwin-x64': 0.18.11 + '@esbuild/freebsd-arm64': 0.18.11 + '@esbuild/freebsd-x64': 0.18.11 + '@esbuild/linux-arm': 0.18.11 + '@esbuild/linux-arm64': 0.18.11 + '@esbuild/linux-ia32': 0.18.11 + '@esbuild/linux-loong64': 0.18.11 + '@esbuild/linux-mips64el': 0.18.11 + '@esbuild/linux-ppc64': 0.18.11 + '@esbuild/linux-riscv64': 0.18.11 + '@esbuild/linux-s390x': 0.18.11 + '@esbuild/linux-x64': 0.18.11 + '@esbuild/netbsd-x64': 0.18.11 + '@esbuild/openbsd-x64': 0.18.11 + '@esbuild/sunos-x64': 0.18.11 + '@esbuild/win32-arm64': 0.18.11 + '@esbuild/win32-ia32': 0.18.11 + '@esbuild/win32-x64': 0.18.11 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /eslint-config-prettier@8.9.0(eslint@8.44.0): + resolution: {integrity: sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.44.0 + dev: true + + /eslint-plugin-prettier@5.0.0(eslint-config-prettier@8.9.0)(eslint@8.44.0)(prettier@3.0.0): + resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.44.0 + eslint-config-prettier: 8.9.0(eslint@8.44.0) + prettier: 3.0.0 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 + dev: true + + /eslint-plugin-vue@9.16.1(eslint@8.44.0): + resolution: {integrity: sha512-2FtnTqazA6aYONfDuOZTk0QzwhAwi7Z4+uJ7+GHeGxcKapjqWlDsRWDenvyG/utyOfAS5bVRmAG3cEWiYEz2bA==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + eslint: 8.44.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.13 + semver: 7.5.4 + vue-eslint-parser: 9.3.1(eslint@8.44.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.44.0: + resolution: {integrity: sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.44.0) + '@eslint-community/regexpp': 4.4.0 + '@eslint/eslintrc': 2.1.0 + '@eslint/js': 8.44.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.6.0 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.0: + resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.1 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /evtd@0.2.4: + resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: false + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + dependencies: + locate-path: 2.0.0 + dev: true + + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + dependencies: + locate-path: 3.0.0 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /fmin@0.0.2: + resolution: {integrity: sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A==} + dependencies: + contour_plot: 0.0.1 + json2module: 0.0.3 + rollup: 0.25.8 + tape: 4.16.2 + uglify-js: 2.8.29 + dev: false + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + + /get-own-enumerable-property-symbols@3.0.2: + resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + dev: true + + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + dev: true + + /git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + meow: 8.1.2 + semver: 6.3.0 + dev: true + + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + dependencies: + ini: 1.3.8 + dev: true + + /gl-matrix@3.4.3: + resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + dependencies: + global-prefix: 3.0.0 + dev: true + + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globjoin@0.1.4: + resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + + /graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /highlight.js@11.8.0: + resolution: {integrity: sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==} + engines: {node: '>=12.0.0'} + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.2 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.16.6 + dev: true + + /html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + dev: true + + /htmlparser2@3.10.1: + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} + dependencies: + domelementtype: 1.3.1 + domhandler: 2.4.2 + domutils: 1.7.0 + entities: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + + /htmlparser2@8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.0: + resolution: {integrity: sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==} + engines: {node: '>=14.18.0'} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /immutable@4.3.0: + resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + + /is-accessor-descriptor@0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-accessor-descriptor@1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + + /is-data-descriptor@0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-data-descriptor@1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-descriptor@0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: true + + /is-descriptor@1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + dev: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-regexp@1.0.0: + resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /jake@10.8.5: + resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + + /jest-worker@26.6.2: + resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.5.6 + merge-stream: 2.0.0 + supports-color: 7.2.0 + dev: true + + /jiti@1.19.1: + resolution: {integrity: sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==} + hasBin: true + dev: true + + /js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-tokens@8.0.1: + resolution: {integrity: sha512-3AGrZT6tuMm1ZWWn9mLXh7XMfi2YtiLNPALCVxBCiUVq0LD1OQMxV/AdS/s7rLJU5o9i/jBZw/N4vXXL5dm29A==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + dev: true + + /jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json2module@0.0.3: + resolution: {integrity: sha512-qYGxqrRrt4GbB8IEOy1jJGypkNsjWoIMlZt4bAsmUScCA507Hbc2p1JOhBzqn45u3PWafUgH2OnzyNU7udO/GA==} + hasBin: true + dependencies: + rw: 1.3.3 + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /jsonpointer@5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /known-css-properties@0.27.0: + resolution: {integrity: sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==} + dev: true + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /lazy-cache@1.0.4: + resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} + engines: {node: '>=0.10.0'} + dev: false + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@13.2.3: + resolution: {integrity: sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + chalk: 5.2.0 + cli-truncate: 3.1.0 + commander: 10.0.0 + debug: 4.3.4 + execa: 7.1.1 + lilconfig: 2.1.0 + listr2: 5.0.8 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.12.3 + pidtree: 0.6.0 + string-argv: 0.3.1 + yaml: 2.3.0 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + + /listr2@5.0.8: + resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.0 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /loader-utils@1.4.2: + resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 1.0.2 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + /lodash-unified@1.0.3(@types/lodash-es@4.17.7)(lodash-es@4.17.21)(lodash@4.17.21): + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + dependencies: + '@types/lodash-es': 4.17.7 + lodash: 4.17.21 + lodash-es: 4.17.21 + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + dev: true + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /longest@1.0.1: + resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==} + engines: {node: '>=0.10.0'} + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.1 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.26.7: + resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} + engines: {node: '>=12'} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /mathml-tag-names@2.1.3: + resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} + dev: true + + /md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + dev: false + + /mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + + /memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + dev: false + + /meow@10.1.5: + resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 7.0.2 + decamelize: 5.0.1 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 8.0.0 + redent: 4.0.0 + trim-newlines: 4.1.1 + type-fest: 1.4.0 + yargs-parser: 20.2.9 + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-options@1.0.1: + resolution: {integrity: sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==} + engines: {node: '>=4'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@3.1.0: + resolution: {integrity: sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 1.0.0 + extend-shallow: 2.0.1 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 5.1.0 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.2.0 + dev: true + + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + dev: true + + /naive-ui@2.34.4(vue@3.3.4): + resolution: {integrity: sha512-aPG8PDfhSzIzn/jSC9y3Jb3Pe2wHJ7F0cFV1EWlbImSrZECeUmoc+fIcOSWbizoztkKfaUAeKwYdMl09MKkj1g==} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@css-render/plugin-bem': 0.15.12(css-render@0.15.12) + '@css-render/vue3-ssr': 0.15.12(vue@3.3.4) + '@types/katex': 0.14.0 + '@types/lodash': 4.14.191 + '@types/lodash-es': 4.17.7 + async-validator: 4.2.5 + css-render: 0.15.12 + date-fns: 2.30.0 + date-fns-tz: 1.3.8(date-fns@2.30.0) + evtd: 0.2.4 + highlight.js: 11.8.0 + lodash: 4.17.21 + lodash-es: 4.17.21 + seemly: 0.3.6 + treemate: 0.3.11 + vdirs: 0.1.8(vue@3.3.4) + vooks: 0.2.12(vue@3.3.4) + vue: 3.3.4 + vueuc: 0.4.51(vue@3.3.4) + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.1 + dev: true + + /node-fetch-native@1.2.0: + resolution: {integrity: sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ==} + dev: true + + /node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + dependencies: + css-select: 4.3.0 + he: 1.2.0 + dev: true + + /node-releases@2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.4 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.0 + semver: 7.5.2 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + dev: false + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /ofetch@1.1.1: + resolution: {integrity: sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ==} + dependencies: + destr: 2.0.1 + node-fetch-native: 1.2.0 + ufo: 1.2.0 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + dependencies: + p-try: 1.0.0 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + dependencies: + p-limit: 1.3.0 + dev: true + + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.1 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.21.4 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.1 + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + dev: true + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pdfast@0.2.0: + resolution: {integrity: sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA==} + dev: false + + /perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pinia-plugin-persistedstate@3.2.0(pinia@2.1.6): + resolution: {integrity: sha512-tZbNGf2vjAQcIm7alK40sE51Qu/m9oWr+rEgNm/2AWr1huFxj72CjvpQcIQzMknDBJEkQznCLAGtJTIcLKrKdw==} + peerDependencies: + pinia: ^2.0.0 + dependencies: + pinia: 2.1.6(typescript@5.1.6)(vue@3.3.4) + dev: false + + /pinia@2.1.6(typescript@5.1.6)(vue@3.3.4): + resolution: {integrity: sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + dependencies: + '@vue/devtools-api': 6.5.0 + typescript: 5.1.6 + vue: 3.3.4 + vue-demi: 0.14.5(vue@3.3.4) + dev: false + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /postcss-html@1.5.0: + resolution: {integrity: sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==} + engines: {node: ^12 || >=14} + dependencies: + htmlparser2: 8.0.1 + js-tokens: 8.0.1 + postcss: 8.4.27 + postcss-safe-parser: 6.0.0(postcss@8.4.27) + dev: true + + /postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + dev: true + + /postcss-prefix-selector@1.16.0(postcss@5.2.18): + resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==} + peerDependencies: + postcss: '>4 <9' + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-resolve-nested-selector@0.1.1: + resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} + dev: true + + /postcss-safe-parser@6.0.0(postcss@8.4.27): + resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.3.3 + dependencies: + postcss: 8.4.27 + dev: true + + /postcss-scss@4.0.6(postcss@8.4.27): + resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.19 + dependencies: + postcss: 8.4.27 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-sorting@8.0.2(postcss@8.4.27): + resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} + peerDependencies: + postcss: ^8.4.20 + dependencies: + postcss: 8.4.27 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + dev: true + + /postcss@8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /posthtml-parser@0.2.1: + resolution: {integrity: sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==} + dependencies: + htmlparser2: 3.10.1 + isobject: 2.1.0 + dev: true + + /posthtml-rename-id@1.0.12: + resolution: {integrity: sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /posthtml-render@1.4.0: + resolution: {integrity: sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==} + engines: {node: '>=10'} + dev: true + + /posthtml-svg-mode@1.0.3: + resolution: {integrity: sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==} + dependencies: + merge-options: 1.0.1 + posthtml: 0.9.2 + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /posthtml@0.9.2: + resolution: {integrity: sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==} + engines: {node: '>=0.10.0'} + dependencies: + posthtml-parser: 0.2.1 + posthtml-render: 1.4.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.2.0 + dev: true + + /prettier@3.0.0: + resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-bytes@6.1.0: + resolution: {integrity: sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: true + + /print-js@1.6.0: + resolution: {integrity: sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==} + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg-up@8.0.0: + resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} + engines: {node: '>=12'} + dependencies: + find-up: 5.0.0 + read-pkg: 6.0.0 + type-fest: 1.4.0 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-pkg@6.0.0: + resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} + engines: {node: '>=12'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 1.4.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + dependencies: + indent-string: 5.0.0 + strip-indent: 4.0.0 + dev: true + + /regenerate-unicode-properties@10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} + engines: {node: '>=4'} + dependencies: + regenerate: 1.4.2 + dev: true + + /regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + dev: true + + /regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + dependencies: + '@babel/runtime': 7.22.11 + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + + /regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.0 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + dev: true + + /regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + dependencies: + jsesc: 0.5.0 + dev: true + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /resumer@0.0.0: + resolution: {integrity: sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==} + dependencies: + through: 2.3.8 + dev: false + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /right-align@0.1.3: + resolution: {integrity: sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==} + engines: {node: '>=0.10.0'} + dependencies: + align-text: 0.1.4 + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup-plugin-terser@7.0.2(rollup@2.79.1): + resolution: {integrity: sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==} + deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser + peerDependencies: + rollup: ^2.0.0 + dependencies: + '@babel/code-frame': 7.22.10 + jest-worker: 26.6.2 + rollup: 2.79.1 + serialize-javascript: 4.0.0 + terser: 5.19.2 + dev: true + + /rollup-plugin-visualizer@5.9.2(rollup@2.79.1): + resolution: {integrity: sha512-waHktD5mlWrYFrhOLbti4YgQCn1uR24nYsNuXxg7LkPH8KdTXVWR9DNY1WU0QqokyMixVXJS4J04HNrVTMP01A==} + engines: {node: '>=14'} + hasBin: true + peerDependencies: + rollup: 2.x || 3.x + peerDependenciesMeta: + rollup: + optional: true + dependencies: + open: 8.4.2 + picomatch: 2.3.1 + rollup: 2.79.1 + source-map: 0.7.4 + yargs: 17.7.1 + dev: true + + /rollup@0.25.8: + resolution: {integrity: sha512-a2S4Bh3bgrdO4BhKr2E4nZkjTvrJ2m2bWjMTzVYtoqSCn0HnuxosXnaJUHrMEziOWr3CzL9GjilQQKcyCQpJoA==} + hasBin: true + dependencies: + chalk: 1.1.3 + minimist: 1.2.8 + source-map-support: 0.3.3 + dev: false + + /rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rollup@3.26.2: + resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: false + + /rxjs@7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} + dependencies: + tslib: 2.6.1 + dev: true + + /safe-array-concat@1.0.0: + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /sass@1.64.2: + resolution: {integrity: sha512-TnDlfc+CRnUAgLO9D8cQLFu/GIjJIzJCGkE7o4ekIGQOH7T3GetiRR/PsTWJUHhkzcSPrARkPI+gNWn5alCzDg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + immutable: 4.3.0 + source-map-js: 1.0.2 + dev: true + + /screenfull@6.0.2: + resolution: {integrity: sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==} + engines: {node: ^14.13.1 || >=16.0.0} + dev: false + + /scule@1.0.0: + resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} + dev: true + + /seemly@0.3.6: + resolution: {integrity: sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==} + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.2: + resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /serialize-javascript@4.0.0: + resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + dev: true + + /sirv@2.0.3: + resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.21 + mrmime: 1.0.1 + totalist: 3.0.1 + dev: true + + /size-sensor@1.0.2: + resolution: {integrity: sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==} + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /sm-crypto@0.3.12: + resolution: {integrity: sha512-272PBzB4PYaBdeGa41TH9ZlMGLPVRmS36Gs4FjmHwXIdihQypAbhhFWZTaa/3de69q2KfMme1M5O2W5+spAdrg==} + dependencies: + jsbn: 1.1.0 + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /sortablejs@1.15.0: + resolution: {integrity: sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support@0.3.3: + resolution: {integrity: sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg==} + dependencies: + source-map: 0.1.32 + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.1.32: + resolution: {integrity: sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==} + engines: {node: '>=0.8.0'} + dependencies: + amdefine: 1.0.1 + dev: false + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + dependencies: + whatwg-url: 7.1.0 + dev: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + dependencies: + through: 2.3.8 + dev: true + + /stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /standard-version@9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chalk: 2.4.2 + conventional-changelog: 3.1.25 + conventional-changelog-config-spec: 2.1.0 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-recommended-bump: 6.1.0 + detect-indent: 6.1.0 + detect-newline: 3.1.0 + dotgitignore: 2.1.0 + figures: 3.2.0 + find-up: 5.0.0 + git-semver-tags: 4.1.1 + semver: 7.3.8 + stringify-package: 1.0.1 + yargs: 16.2.0 + dev: true + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /string-argv@0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + dev: true + + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringify-object@3.3.0: + resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} + engines: {node: '>=4'} + dependencies: + get-own-enumerable-property-symbols: 3.0.2 + is-obj: 1.0.1 + is-regexp: 1.0.0 + dev: true + + /stringify-package@1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-comments@2.0.1: + resolution: {integrity: sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==} + engines: {node: '>=10'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + + /style-search@0.1.0: + resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} + dev: true + + /stylelint-config-html@1.1.0(postcss-html@1.5.0)(stylelint@15.10.2): + resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: 1.5.0 + stylelint: 15.10.2 + dev: true + + /stylelint-config-recess-order@4.3.0(stylelint@15.10.2): + resolution: {integrity: sha512-EWVtxZ8oq4/meTrRNUDrS5TqMz6TX72JjKDwVQq0JJDXE+P/o7UuFw3wWV/0O9yvJfh/da6nJY71ZUn/wSfB4g==} + peerDependencies: + stylelint: '>=15' + dependencies: + stylelint: 15.10.2 + stylelint-order: 6.0.3(stylelint@15.10.2) + dev: true + + /stylelint-config-recommended-scss@12.0.0(postcss@8.4.27)(stylelint@15.10.2): + resolution: {integrity: sha512-5Bb2mlGy6WLa30oNeKpZvavv2lowJUsUJO25+OA68GFTemlwd1zbFsL7q0bReKipOSU3sG47hKneZ6Nd+ctrFA==} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^15.5.0 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + postcss: 8.4.27 + postcss-scss: 4.0.6(postcss@8.4.27) + stylelint: 15.10.2 + stylelint-config-recommended: 12.0.0(stylelint@15.10.2) + stylelint-scss: 5.0.0(stylelint@15.10.2) + dev: true + + /stylelint-config-recommended-vue@1.5.0(postcss-html@1.5.0)(stylelint@15.10.2): + resolution: {integrity: sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==} + engines: {node: ^12 || >=14} + peerDependencies: + postcss-html: ^1.0.0 + stylelint: '>=14.0.0' + dependencies: + postcss-html: 1.5.0 + semver: 7.5.4 + stylelint: 15.10.2 + stylelint-config-html: 1.1.0(postcss-html@1.5.0)(stylelint@15.10.2) + stylelint-config-recommended: 13.0.0(stylelint@15.10.2) + dev: true + + /stylelint-config-recommended@12.0.0(stylelint@15.10.2): + resolution: {integrity: sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==} + peerDependencies: + stylelint: ^15.5.0 + dependencies: + stylelint: 15.10.2 + dev: true + + /stylelint-config-recommended@13.0.0(stylelint@15.10.2): + resolution: {integrity: sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + stylelint: ^15.10.0 + dependencies: + stylelint: 15.10.2 + dev: true + + /stylelint-config-standard-scss@10.0.0(postcss@8.4.27)(stylelint@15.10.2): + resolution: {integrity: sha512-bChBEo1p3xUVWh/wenJI+josoMk21f2yuLDGzGjmKYcALfl2u3DFltY+n4UHswYiXghqXaA8mRh+bFy/q1hQlg==} + peerDependencies: + postcss: ^8.3.3 + stylelint: ^15.5.0 + peerDependenciesMeta: + postcss: + optional: true + dependencies: + postcss: 8.4.27 + stylelint: 15.10.2 + stylelint-config-recommended-scss: 12.0.0(postcss@8.4.27)(stylelint@15.10.2) + stylelint-config-standard: 33.0.0(stylelint@15.10.2) + dev: true + + /stylelint-config-standard@33.0.0(stylelint@15.10.2): + resolution: {integrity: sha512-eyxnLWoXImUn77+ODIuW9qXBDNM+ALN68L3wT1lN2oNspZ7D9NVGlNHb2QCUn4xDug6VZLsh0tF8NyoYzkgTzg==} + peerDependencies: + stylelint: ^15.5.0 + dependencies: + stylelint: 15.10.2 + stylelint-config-recommended: 12.0.0(stylelint@15.10.2) + dev: true + + /stylelint-config-standard@34.0.0(stylelint@15.10.2): + resolution: {integrity: sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + stylelint: ^15.10.0 + dependencies: + stylelint: 15.10.2 + stylelint-config-recommended: 13.0.0(stylelint@15.10.2) + dev: true + + /stylelint-order@6.0.3(stylelint@15.10.2): + resolution: {integrity: sha512-1j1lOb4EU/6w49qZeT2SQVJXm0Ht+Qnq9GMfUa3pMwoyojIWfuA+JUDmoR97Bht1RLn4ei0xtLGy87M7d29B1w==} + peerDependencies: + stylelint: ^14.0.0 || ^15.0.0 + dependencies: + postcss: 8.4.27 + postcss-sorting: 8.0.2(postcss@8.4.27) + stylelint: 15.10.2 + dev: true + + /stylelint-scss@5.0.0(stylelint@15.10.2): + resolution: {integrity: sha512-5Ee5kG3JIcP2jk2PMoFMiNmW/815V+wK5o37X5ke90ihWMpPXI9iyqeA6zEWipWSRXeQc0kqbd7hKqiR+wPKNA==} + peerDependencies: + stylelint: ^14.5.1 || ^15.0.0 + dependencies: + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + stylelint: 15.10.2 + dev: true + + /stylelint@15.10.2: + resolution: {integrity: sha512-UxqSb3hB74g4DTO45QhUHkJMjKKU//lNUAOWyvPBVPZbCknJ5HjOWWZo+UDuhHa9FLeVdHBZXxu43eXkjyIPWg==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + '@csstools/css-parser-algorithms': 2.3.0(@csstools/css-tokenizer@2.1.1) + '@csstools/css-tokenizer': 2.1.1 + '@csstools/media-query-list-parser': 2.1.2(@csstools/css-parser-algorithms@2.3.0)(@csstools/css-tokenizer@2.1.1) + '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 8.2.0 + css-functions-list: 3.2.0 + css-tree: 2.3.1 + debug: 4.3.4 + fast-glob: 3.3.0 + fastest-levenshtein: 1.0.16 + file-entry-cache: 6.0.1 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 5.2.4 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.27.0 + mathml-tag-names: 2.1.3 + meow: 10.1.5 + micromatch: 4.0.5 + normalize-path: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.27 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 6.0.0(postcss@8.4.27) + postcss-selector-parser: 6.0.13 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + supports-hyperlinks: 3.0.0 + svg-tags: 1.0.0 + table: 6.8.1 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks@3.0.0: + resolution: {integrity: sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==} + engines: {node: '>=14.18'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /svg-baker@1.7.0: + resolution: {integrity: sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==} + dependencies: + bluebird: 3.7.2 + clone: 2.1.2 + he: 1.2.0 + image-size: 0.5.5 + loader-utils: 1.4.2 + merge-options: 1.0.1 + micromatch: 3.1.0 + postcss: 5.2.18 + postcss-prefix-selector: 1.16.0(postcss@5.2.18) + posthtml-rename-id: 1.0.12 + posthtml-svg-mode: 1.0.3 + query-string: 4.3.4 + traverse: 0.6.7 + transitivePeerDependencies: + - supports-color + dev: true + + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true + + /svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.1 + dev: true + + /table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /tape@4.16.2: + resolution: {integrity: sha512-TUChV+q0GxBBCEbfCYkGLkv8hDJYjMdSWdE0/Lr331sB389dsvFUHNV9ph5iQqKzt8Ss9drzcda/YeexclBFqg==} + hasBin: true + dependencies: + call-bind: 1.0.2 + deep-equal: 1.1.1 + defined: 1.0.1 + dotignore: 0.1.2 + for-each: 0.3.3 + glob: 7.2.3 + has: 1.0.3 + inherits: 2.0.4 + is-regex: 1.1.4 + minimist: 1.2.8 + object-inspect: 1.12.3 + resolve: 1.22.4 + resumer: 0.0.0 + string.prototype.trim: 1.2.7 + through: 2.3.8 + dev: false + + /temp-dir@2.0.0: + resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} + engines: {node: '>=8'} + dev: true + + /tempy@0.6.0: + resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} + engines: {node: '>=10'} + dependencies: + is-stream: 2.0.1 + temp-dir: 2.0.0 + type-fest: 0.16.0 + unique-string: 2.0.0 + dev: true + + /terser@5.16.6: + resolution: {integrity: sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: true + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + dependencies: + punycode: 2.3.0 + dev: true + + /traverse@0.6.7: + resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} + dev: true + + /treemate@0.3.11: + resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==} + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + dev: true + + /ts-api-utils@1.0.1(typescript@5.1.6): + resolution: {integrity: sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.1.6 + dev: true + + /ts-node@10.9.1(@types/node@18.15.3)(typescript@5.1.6): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.15.3 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.1.6 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + + /tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + dev: false + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.16.0: + resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + /ufo@1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + dev: true + + /uglify-js@2.8.29: + resolution: {integrity: sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==} + engines: {node: '>=0.8.0'} + hasBin: true + dependencies: + source-map: 0.5.7 + yargs: 3.10.0 + optionalDependencies: + uglify-to-browserify: 1.0.2 + dev: false + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /uglify-to-browserify@1.0.2: + resolution: {integrity: sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==} + requiresBuild: true + dev: false + optional: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + /unconfig@0.3.10: + resolution: {integrity: sha512-tj317lhIq2iZF/NXrJnU1t2UaGUKKz1eL1sK2t63Oq66V9BxqvZV12m55fp/fpQJ+DDmVlLgo7cnLVOZkhlO/A==} + dependencies: + '@antfu/utils': 0.7.5 + defu: 6.1.2 + jiti: 1.19.1 + mlly: 1.4.0 + dev: true + + /unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + dev: true + + /unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + dev: true + + /unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + dev: true + + /unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + dev: true + + /unimport@3.1.3(rollup@2.79.1): + resolution: {integrity: sha512-up4TE2yA+nMyyErGTjbYGVw95MriGa2hVRXQ3/JRp7984cwwqULcnBjHaovVpsO8tZc2j0fvgGu9yiBKOyxvYw==} + dependencies: + '@rollup/pluginutils': 5.0.2(rollup@2.79.1) + escape-string-regexp: 5.0.0 + fast-glob: 3.3.1 + local-pkg: 0.4.3 + magic-string: 0.30.2 + mlly: 1.4.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + scule: 1.0.0 + strip-literal: 1.3.0 + unplugin: 1.4.0 + transitivePeerDependencies: + - rollup + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /unocss@0.54.3(postcss@8.4.27)(rollup@2.79.1)(vite@4.4.8): + resolution: {integrity: sha512-uaoCKFigRkqceLmBrtWhLqQR6D6NyBAtSFVUnM1m57BSqA0EwAFmBsgoynzAmZRTQQFsPrBzKQjEmaCUTyUd9Q==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.54.3 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + dependencies: + '@unocss/astro': 0.54.3(rollup@2.79.1)(vite@4.4.8) + '@unocss/cli': 0.54.3(rollup@2.79.1) + '@unocss/core': 0.54.3 + '@unocss/extractor-arbitrary-variants': 0.54.3 + '@unocss/postcss': 0.54.3(postcss@8.4.27) + '@unocss/preset-attributify': 0.54.3 + '@unocss/preset-icons': 0.54.3 + '@unocss/preset-mini': 0.54.3 + '@unocss/preset-tagify': 0.54.3 + '@unocss/preset-typography': 0.54.3 + '@unocss/preset-uno': 0.54.3 + '@unocss/preset-web-fonts': 0.54.3 + '@unocss/preset-wind': 0.54.3 + '@unocss/reset': 0.54.3 + '@unocss/transformer-attributify-jsx': 0.54.3 + '@unocss/transformer-attributify-jsx-babel': 0.54.3 + '@unocss/transformer-compile-class': 0.54.3 + '@unocss/transformer-directives': 0.54.3 + '@unocss/transformer-variant-group': 0.54.3 + '@unocss/vite': 0.54.3(rollup@2.79.1)(vite@4.4.8) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + - vite + dev: true + + /unplugin-auto-import@0.16.6(@vueuse/core@10.3.0)(rollup@2.79.1): + resolution: {integrity: sha512-M+YIITkx3C/Hg38hp8HmswP5mShUUyJOzpifv7RTlAbeFlO2Tyw0pwrogSSxnipHDPTtI8VHFBpkYkNKzYSuyA==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + dependencies: + '@antfu/utils': 0.7.5 + '@rollup/pluginutils': 5.0.2(rollup@2.79.1) + '@vueuse/core': 10.3.0(vue@3.3.4) + fast-glob: 3.3.0 + local-pkg: 0.4.3 + magic-string: 0.30.2 + minimatch: 9.0.3 + unimport: 3.1.3(rollup@2.79.1) + unplugin: 1.4.0 + transitivePeerDependencies: + - rollup + dev: true + + /unplugin-icons@0.16.5: + resolution: {integrity: sha512-laCCqMWfng1XZgB9yowGfjBdDhtmz8t8zVnhzRNEMhBNdy26QrVewVmdXk/zsiAQYnEWvIxTjvW1nQXrxdd2+w==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.5 + '@iconify/utils': 2.1.7 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.4.3 + unplugin: 1.4.0 + transitivePeerDependencies: + - supports-color + dev: true + + /unplugin-vue-components@0.25.1(rollup@2.79.1)(vue@3.3.4): + resolution: {integrity: sha512-kzS2ZHVMaGU2XEO2keYQcMjNZkanDSGDdY96uQT9EPe+wqSZwwgbFfKVJ5ti0+8rGAcKHColwKUvctBhq2LJ3A==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + dependencies: + '@antfu/utils': 0.7.5 + '@rollup/pluginutils': 5.0.2(rollup@2.79.1) + chokidar: 3.5.3 + debug: 4.3.4 + fast-glob: 3.3.1 + local-pkg: 0.4.3 + magic-string: 0.30.2 + minimatch: 9.0.3 + resolve: 1.22.4 + unplugin: 1.4.0 + vue: 3.3.4 + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /unplugin-vue-setup-extend-plus@1.0.0: + resolution: {integrity: sha512-Qb34atQ/elvkErQ12PNv6UWJPWIG4dEgjjizYKyycPeiRqQaMVNCKqRIqfxlhXntcU2l+o3VQuk1NNZN6QJ/xw==} + dependencies: + '@vue/compiler-sfc': 3.2.47 + magic-string: 0.26.7 + unplugin: 1.3.1 + dev: true + + /unplugin@1.3.1: + resolution: {integrity: sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==} + dependencies: + acorn: 8.10.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + dev: true + + /unplugin@1.4.0: + resolution: {integrity: sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==} + dependencies: + acorn: 8.10.0 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /upath@1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: true + + /update-browserslist-db@1.0.10(browserslist@4.21.5): + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + + /vdirs@0.1.8(vue@3.3.4): + resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==} + peerDependencies: + vue: ^3.0.11 + dependencies: + evtd: 0.2.4 + vue: 3.3.4 + dev: true + + /vite-plugin-compression@0.5.1(vite@4.4.8): + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + chalk: 4.1.2 + debug: 4.3.4 + fs-extra: 10.1.0 + vite: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-eslint@1.8.1(eslint@8.44.0)(vite@4.4.8): + resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} + peerDependencies: + eslint: '>=7' + vite: '>=2' + dependencies: + '@rollup/pluginutils': 4.2.1 + '@types/eslint': 8.21.2 + eslint: 8.44.0 + rollup: 2.79.1 + vite: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + dev: true + + /vite-plugin-html@3.2.0(vite@4.4.8): + resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + colorette: 2.0.19 + connect-history-api-fallback: 1.6.0 + consola: 2.15.3 + dotenv: 16.0.3 + dotenv-expand: 8.0.3 + ejs: 3.1.9 + fast-glob: 3.2.12 + fs-extra: 10.1.0 + html-minifier-terser: 6.1.0 + node-html-parser: 5.4.2 + pathe: 0.2.0 + vite: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + dev: true + + /vite-plugin-pwa@0.16.4(vite@4.4.8)(workbox-build@7.0.0)(workbox-window@7.0.0): + resolution: {integrity: sha512-lmwHFIs9zI2H9bXJld/zVTbCqCQHZ9WrpyDMqosICDV0FVnCJwniX1NMDB79HGTIZzOQkY4gSZaVTJTw6maz/Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + vite: ^3.1.0 || ^4.0.0 + workbox-build: ^7.0.0 + workbox-window: ^7.0.0 + dependencies: + debug: 4.3.4 + fast-glob: 3.2.12 + pretty-bytes: 6.1.0 + vite: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + workbox-build: 7.0.0 + workbox-window: 7.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /vite-plugin-svg-icons@2.0.1(vite@4.4.8): + resolution: {integrity: sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@types/svgo': 2.6.4 + cors: 2.8.5 + debug: 4.3.4 + etag: 1.8.1 + fs-extra: 10.1.0 + pathe: 0.2.0 + svg-baker: 1.7.0 + svgo: 2.8.0 + vite: 4.4.8(@types/node@18.15.3)(sass@1.64.2) + transitivePeerDependencies: + - supports-color + dev: true + + /vite@4.4.8(@types/node@18.15.3)(sass@1.64.2): + resolution: {integrity: sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.3 + esbuild: 0.18.11 + postcss: 8.4.27 + rollup: 3.26.2 + sass: 1.64.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vooks@0.2.12(vue@3.3.4): + resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==} + peerDependencies: + vue: ^3.0.0 + dependencies: + evtd: 0.2.4 + vue: 3.3.4 + dev: true + + /vue-demi@0.14.5(vue@3.3.4): + resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.3.4 + + /vue-eslint-parser@9.3.1(eslint@8.44.0): + resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.44.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.6.0 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-router@4.2.4(vue@3.3.4): + resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@vue/devtools-api': 6.5.0 + vue: 3.3.4 + dev: false + + /vue-template-compiler@2.7.14: + resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc@1.8.8(typescript@5.1.6): + resolution: {integrity: sha512-bSydNFQsF7AMvwWsRXD7cBIXaNs/KSjvzWLymq/UtKE36697sboX4EccSHFVxvgdBlI1frYPc/VMKJNB7DFeDQ==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@vue/language-core': 1.8.8(typescript@5.1.6) + '@vue/typescript': 1.8.8(typescript@5.1.6) + semver: 7.5.4 + typescript: 5.1.6 + dev: true + + /vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 + + /vueuc@0.4.51(vue@3.3.4): + resolution: {integrity: sha512-pLiMChM4f+W8czlIClGvGBYo656lc2Y0/mXFSCydcSmnCR1izlKPGMgiYBGjbY9FDkFG8a2HEVz7t0DNzBWbDw==} + peerDependencies: + vue: ^3.0.11 + dependencies: + '@css-render/vue3-ssr': 0.15.12(vue@3.3.4) + '@juggle/resize-observer': 3.4.0 + css-render: 0.15.12 + evtd: 0.2.4 + seemly: 0.3.6 + vdirs: 0.1.8(vue@3.3.4) + vooks: 0.2.12(vue@3.3.4) + vue: 3.3.4 + dev: true + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + dev: true + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /window-size@0.1.0: + resolution: {integrity: sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==} + engines: {node: '>= 0.8.0'} + dev: false + + /wordwrap@0.0.2: + resolution: {integrity: sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==} + engines: {node: '>=0.4.0'} + dev: false + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /workbox-background-sync@7.0.0: + resolution: {integrity: sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==} + dependencies: + idb: 7.1.1 + workbox-core: 7.0.0 + dev: true + + /workbox-broadcast-update@7.0.0: + resolution: {integrity: sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==} + dependencies: + workbox-core: 7.0.0 + dev: true + + /workbox-build@7.0.0: + resolution: {integrity: sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==} + engines: {node: '>=16.0.0'} + dependencies: + '@apideck/better-ajv-errors': 0.3.6(ajv@8.12.0) + '@babel/core': 7.22.11 + '@babel/preset-env': 7.22.10(@babel/core@7.22.11) + '@babel/runtime': 7.22.11 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.22.11)(rollup@2.79.1) + '@rollup/plugin-node-resolve': 11.2.1(rollup@2.79.1) + '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) + '@surma/rollup-plugin-off-main-thread': 2.2.3 + ajv: 8.12.0 + common-tags: 1.8.2 + fast-json-stable-stringify: 2.1.0 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.21 + pretty-bytes: 5.6.0 + rollup: 2.79.1 + rollup-plugin-terser: 7.0.2(rollup@2.79.1) + source-map: 0.8.0-beta.0 + stringify-object: 3.3.0 + strip-comments: 2.0.1 + tempy: 0.6.0 + upath: 1.2.0 + workbox-background-sync: 7.0.0 + workbox-broadcast-update: 7.0.0 + workbox-cacheable-response: 7.0.0 + workbox-core: 7.0.0 + workbox-expiration: 7.0.0 + workbox-google-analytics: 7.0.0 + workbox-navigation-preload: 7.0.0 + workbox-precaching: 7.0.0 + workbox-range-requests: 7.0.0 + workbox-recipes: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + workbox-streams: 7.0.0 + workbox-sw: 7.0.0 + workbox-window: 7.0.0 + transitivePeerDependencies: + - '@types/babel__core' + - supports-color + dev: true + + /workbox-cacheable-response@7.0.0: + resolution: {integrity: sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==} + dependencies: + workbox-core: 7.0.0 + dev: true + + /workbox-core@7.0.0: + resolution: {integrity: sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==} + dev: true + + /workbox-expiration@7.0.0: + resolution: {integrity: sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==} + dependencies: + idb: 7.1.1 + workbox-core: 7.0.0 + dev: true + + /workbox-google-analytics@7.0.0: + resolution: {integrity: sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==} + dependencies: + workbox-background-sync: 7.0.0 + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: true + + /workbox-navigation-preload@7.0.0: + resolution: {integrity: sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==} + dependencies: + workbox-core: 7.0.0 + dev: true + + /workbox-precaching@7.0.0: + resolution: {integrity: sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==} + dependencies: + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: true + + /workbox-range-requests@7.0.0: + resolution: {integrity: sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==} + dependencies: + workbox-core: 7.0.0 + dev: true + + /workbox-recipes@7.0.0: + resolution: {integrity: sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==} + dependencies: + workbox-cacheable-response: 7.0.0 + workbox-core: 7.0.0 + workbox-expiration: 7.0.0 + workbox-precaching: 7.0.0 + workbox-routing: 7.0.0 + workbox-strategies: 7.0.0 + dev: true + + /workbox-routing@7.0.0: + resolution: {integrity: sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==} + dependencies: + workbox-core: 7.0.0 + dev: true + + /workbox-strategies@7.0.0: + resolution: {integrity: sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==} + dependencies: + workbox-core: 7.0.0 + dev: true + + /workbox-streams@7.0.0: + resolution: {integrity: sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==} + dependencies: + workbox-core: 7.0.0 + workbox-routing: 7.0.0 + dev: true + + /workbox-sw@7.0.0: + resolution: {integrity: sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==} + dev: true + + /workbox-window@7.0.0: + resolution: {integrity: sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==} + dependencies: + '@types/trusted-types': 2.0.3 + workbox-core: 7.0.0 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.0.2 + dev: true + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml@2.3.0: + resolution: {integrity: sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw==} + engines: {node: '>= 14', npm: '>= 7'} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yargs@3.10.0: + resolution: {integrity: sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==} + dependencies: + camelcase: 1.2.1 + cliui: 2.1.0 + decamelize: 1.2.0 + window-size: 0.1.0 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zrender@5.4.4: + resolution: {integrity: sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==} + dependencies: + tslib: 2.3.0 + dev: false diff --git a/web/postcss.config.cjs b/web/postcss.config.cjs new file mode 100644 index 0000000..5bfb8f6 --- /dev/null +++ b/web/postcss.config.cjs @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +}; diff --git a/web/public/favicon.ico b/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0ba1cdeb6913308fe6fe4f904202c10c983813ac GIT binary patch literal 4286 zcmc&%33!ax8Xm#SWR}cKW-?o5GMVf%k;qOod&#P@5K@ZP(p$umq$q6_rK)xsLWq5- zP(qp@C6SFZG;3u+dtE%VLW|OBjQ4*3-$wP8KE1tto_q4VbN=U?|3B}yyx%z|98Nd- zb9Ce|znnc%4oAu1a6AY!#EBp<<7}h3|7^BOAlXKdCf#AKXAa9TDTy%L~t z>W9cNyU>41IXq&PKqi(#r?iJeXoKVzlF;;dBL*j>;Pt7Q$eKJ2<42E0M88m&T-*`f zF9c&=8jWcarywJJ8iuB%V&Cq)SiO7|)CwikautMpe#^+gk=*ZE*IP;LoH~{I-eBMw z_#(nb<{>uo6rmb1Q!3ycHWqQwu^2V{C2ZTY1?TFUvGn~9ppeR-kVql7kw8jzNd!XJ zSPLNLTSLSnaD@$7tnJQv(&dl$b~|LL6rh>HQ~00~)Dh#bEUy&}?~a`1&ftb~aC(ra~a z)H}f0fuMI}dndgf4jL`&qzdxA%N8DN_(I6Vw$LgxaMT)L&^bb*)Ie!#$L6p{_wEgS z{M@*V{|3+4&N$)>9km6fkXI=WKG3;Gz;EDO447O3tyd~~TJ?a8Vyz=CC&q>@ezL`h zVALDQ9s`Uz9SmA~=+#=N7%q_wY{)j1yD#KgBk4#60oNK-FObW`{l0C_wXzXQY86@& zj6O*SOj=AiKSA*)J+gVIg5K|CaJzFMb8vxMTpE-{4~Us{MU(@P7!t7tUAd5 zTQ?i5juh|UXw<6VwssEJJV|%YkIhHy)CzbeX2U5e2~jie!essd?w&vMo5&8o{`WAG ze45ePiJ5H=(P#KLsJ%krJ$VECXCHvqgly=72fC!v0z$qa-2x5vKu89i}Gc1b(>hMxEna-ee@n$3XOI->~(oCI#t8f{W3g!?qfy^ z@wa!f2%k6u!HbR~e7^rgj)A95|@@?#HIrD>g|id!-cr<%?(tPmm?@35YGO=uy^sm z&>^X)sHi|mNeRLuBN0D+2l^&ng+dt%qfsC7EPjJt+bg(FFxIZh#;3(4P{ z^swrVC5x7T&QI8gMa!P#Z*48*So3-N<6~ms>g>Yuf7SjaR7xd|l8+zn*@uFC2U&l2 zY~GHT=c6%=>_~bc5mzr?0h6y25k*J`n1@iJU&y#NQD9{IcWqJ+*brf)n`kJA;W zP>_ERvuDi0;KUSkQ2v>C*Von48SV>j{~%mwJC7iWxjpUM39<2TadO6-*>9t=v;y;Ny?>VegJT_@b@}QIyLybbi-Xe}=8On^9d>g@)QXE0|LCA zI&Pl*4L=hDgU-%DEEIjcc6BzYPgbFvbkF3wo_sDkScrVe-zgg3ws8wPu68kFXl@~< z)LbL(hsZd41F0K};FXYy6w1wp?Df#9H8^vsmR;}lX<1a$+>-0p>w4U3S^qnJ#s;~} zCQNQCzn8myBU^XO8lO|_+L~HeU6y=u6sOCpapX`Dq&8BxN5mt1(i{w4u?H#3cB6mR zBGRoIJGX3S_k`8USF(4f?Rnc^&^uTZ3fnNI{_i}4pRqw|BaW6yWp|e?UP?MXft)pK z*_Qb>b@*4CF^88w=8R6sVY!|rXnXw4IB9W>*agn(9Q|&U`LV+N6{MZpan6>{5Kl7f0+Mwk1V{BTtk*$MP%12vsEA1&Cu>Fk8>8w7OeXFJ63s%2O?#%8chI`4VkwYK* z`)BzX8&*%saSFpKWCAoA>ry zFgl|1Ed9X#EzDAn+keB~_0g2{aaM9$Sp=8c^MFubeTn*7Yd(JwpUeG-sj;F%pP;<7 z9L#;0(FN)Js79k?{vG;V`z!oii*$V5z`1y#l5_ofJv-#=Y!L9dyxmfX0}PTH_R{FIb9e*WH^C#RnJ{CD#|mE;cw8UEWX zInRvGAAI_^OfmeIj-33z^8YQ4{KZAcf9A{X&j4>Ohr=tQ`F|3ABs}~T-RPO~-7lcI fZVYIw+ar1h4CZopDC0=*9VZ+QIqv|M@U-@C7g%oY literal 0 HcmV?d00001 diff --git a/web/public/logo.png b/web/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1e33c88ff2db16b0e576aaa70542c281544faa GIT binary patch literal 898776 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
3vi+lWIipdFg&w) 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⪚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%0Agv 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�HR=l4xZ2;uPK)z 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μ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

GjLtVH`%5t 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 + + + + + + diff --git a/web/src/api/helper/axiosCancel.ts b/web/src/api/helper/axiosCancel.ts new file mode 100644 index 0000000..3bb2c94 --- /dev/null +++ b/web/src/api/helper/axiosCancel.ts @@ -0,0 +1,47 @@ +// ? 暂未使用,目前使用全局 Loading 来控制重复请求 +import { CustomAxiosRequestConfig } from "../request/instance"; +import qs from "qs"; + +// 声明一个 Map 用于存储每个请求的标识 和 取消函数 +let pendingMap = new Map(); + +// 序列化参数 +export const getPendingUrl = (config: CustomAxiosRequestConfig) => + [config.method, config.url, qs.stringify(config.data), qs.stringify(config.params)].join("&"); + +export class AxiosCanceler { + /** + * @description: 添加请求 + * @param {Object} config + * @return void + */ + addPending(config: CustomAxiosRequestConfig) { + // 在请求开始前,对之前的请求做检查取消操作 + this.removePending(config); + const url = getPendingUrl(config); + const controller = new AbortController(); + config.signal = controller.signal; + pendingMap.set(url, controller); + } + + /** + * @description: 移除请求 + * @param {Object} config + */ + removePending(config: CustomAxiosRequestConfig) { + const url = getPendingUrl(config); + // 如果在 pending 中存在当前请求标识,需要取消当前请求 + const controller = pendingMap.get(url); + controller && controller.abort(); + } + + /** + * @description: 清空所有pending + */ + removeAllPending() { + pendingMap.forEach(controller => { + controller && controller.abort(); + }); + pendingMap.clear(); + } +} diff --git a/web/src/api/helper/checkStatus.ts b/web/src/api/helper/checkStatus.ts new file mode 100644 index 0000000..ab2c685 --- /dev/null +++ b/web/src/api/helper/checkStatus.ts @@ -0,0 +1,43 @@ +import { ElMessage } from "element-plus"; + +/** + * @description: 校验网络请求状态码 + * @param {Number} status + * @return void + */ +export const checkStatus = (status: number) => { + switch (status) { + case 400: + ElMessage.error("请求失败!请您稍后重试"); + break; + case 401: + ElMessage.error("登录失效!请您重新登录"); + break; + case 403: + ElMessage.error("当前账号无权限访问!"); + break; + case 404: + ElMessage.error("你所访问的资源不存在!"); + break; + case 405: + ElMessage.error("请求方式错误!请您稍后重试"); + break; + case 408: + ElMessage.error("请求超时!请您稍后重试"); + break; + case 500: + ElMessage.error("服务异常!"); + break; + case 502: + ElMessage.error("网关错误!"); + break; + case 503: + ElMessage.error("服务不可用!"); + break; + case 504: + ElMessage.error("网关超时!"); + break; + default: + ElMessage.error("请求失败!"); + } +}; diff --git a/web/src/api/index.ts b/web/src/api/index.ts new file mode 100644 index 0000000..2dd68d9 --- /dev/null +++ b/web/src/api/index.ts @@ -0,0 +1,15 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./modules"; +export * from "./interface"; diff --git a/web/src/api/interface/auth/index.ts b/web/src/api/interface/auth/index.ts new file mode 100644 index 0000000..e04e30a --- /dev/null +++ b/web/src/api/interface/auth/index.ts @@ -0,0 +1,14 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./login"; diff --git a/web/src/api/interface/auth/login.ts b/web/src/api/interface/auth/login.ts new file mode 100644 index 0000000..78a30b5 --- /dev/null +++ b/web/src/api/interface/auth/login.ts @@ -0,0 +1,109 @@ +/** + * @description 登录模块接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export namespace Login { + //模块信息 + export type ModuleInfo = { + id: number | string; + title: string; + code: string; + icon: string; + description: string; + }; + + /** + * 验证码 + */ + interface ValidCode { + validCode: string; // 验证码 + validCodeReqNo: string; // 验证码请求号 + } + + /** + * 账号密码登录表单 + */ + export interface LoginForm extends ValidCode { + account: string; + password: string; + } + + /** + * 手机号登录表单 + */ + export interface PhoneLoginForm extends ValidCode { + phone: string; + code: string; + } + + /** + * 注销表单 + */ + export interface Logout { + token: string; + } + + // 登录返回 + export interface Login { + token: string; + defaultModule: string; + moduleList: ModuleInfo[]; + } + + /** + * 验证码返回 + */ + export interface ReqValidCode { + validCodeBase64: string; // 验证码 + validCodeReqNo: string; // 验证码请求号 + } + + /** 用户信息 */ + export interface LoginUserInfo { + /** 用户id */ + id: string | number; + /** 用户名 */ + account: string; + /** 用户姓名 */ + name: string; + /** 用户昵称 */ + nickName: string; + /** 用户头像 */ + avatar: string; + /** 用户性别 */ + gender: string; + /** 民族 */ + nation: string; + /** 出生日期 */ + birthday: string; + /** 家庭住址 */ + homeAddress: string; + /** 电话号码 */ + phone: string; + /** 邮箱 */ + email: string; + /** 默认模块 */ + defaultModule: number | string; + /** 模块列表 */ + moduleList: ModuleInfo[]; + /** 组织全程 */ + orgNames: string; + /** 职位名称 */ + positionName: string; + /** 按钮码集合 */ + buttonCodeList: string[]; + /** 权限码集合 */ + permissionCodeList: string[]; + /** 角色码集合 */ + roleCodeList: string[]; + } +} diff --git a/web/src/api/interface/index.ts b/web/src/api/interface/index.ts new file mode 100644 index 0000000..dbe9f9b --- /dev/null +++ b/web/src/api/interface/index.ts @@ -0,0 +1,100 @@ +/** + * @description 接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ + +// 请求响应参数(不包含data) +export interface Result { + code: string; + msg: string; +} + +// 请求响应参数(包含data) +export interface ResultData extends Result { + data: T; +} + +// 分页响应参数 +export interface ResPage { + list: T[]; + pageNum: number; + pageSize: number; + total: number; +} + +// 分页请求参数 +export interface ReqPage { + /** 页码 */ + pageNum: number; + /** 数量 */ + pageSize: number; + /** 排序字段 */ + sortField?: string; + /** 排序方式 */ + sortOrder?: string; + /** 关键字 */ + searchKey?: string; +} + +// 用户管理模块 +export namespace User { + export interface ReqUserParams extends ReqPage { + username: string; + gender: number; + idCard: string; + email: string; + address: string; + createTime: string[]; + status: number; + } + export interface ResUserList { + id: string; + username: string; + gender: number; + user: { detail: { age: number } }; + idCard: string; + email: string; + address: string; + createTime: string; + status: number; + avatar: string; + photo: any[]; + children?: ResUserList[]; + } + export interface ResStatus { + userLabel: string; + userValue: number; + } + export interface ResGender { + genderLabel: string; + genderValue: number; + } + export interface ResDepartment { + id: string; + name: string; + children?: ResDepartment[]; + } + export interface ResRole { + id: string; + name: string; + children?: ResDepartment[]; + } +} + +/** id请求参数 */ +export interface ReqId { + /** id */ + id: number | string; +} + +export * from "./auth"; +export * from "./sys"; diff --git a/web/src/api/interface/sys/index.ts b/web/src/api/interface/sys/index.ts new file mode 100644 index 0000000..fe00af8 --- /dev/null +++ b/web/src/api/interface/sys/index.ts @@ -0,0 +1,18 @@ +/** + * @description sys模块接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./upload"; +export * from "./userCenter"; +export * from "./limit"; +export * from "./ops"; +export * from "./log"; diff --git a/web/src/api/interface/sys/limit/button.ts b/web/src/api/interface/sys/limit/button.ts new file mode 100644 index 0000000..55f111e --- /dev/null +++ b/web/src/api/interface/sys/limit/button.ts @@ -0,0 +1,49 @@ +/** + * @description 权限按钮 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ + +import { ReqPage } from "@/api"; + +export namespace Button { + /**按钮分页查询 */ + export interface Page extends ReqPage { + /** 菜单Id */ + parentId: number | string; + } + + /** 按钮信息 */ + export interface ButtonInfo { + /** id */ + id: number | string; + /** 上级菜单 */ + parentId: number | string; + /** 按钮名称 */ + title: string; + /** 按钮码 */ + code: string; + /** 按钮排序*/ + sortCode: number; + /** 按钮描述 */ + description: string; + } + + /** 按钮信息 */ + export interface Batch { + /** 上级菜单 */ + parentId: number | string; + /** 按钮名称 */ + title: string; + /** 按钮码 */ + code: string; + } +} diff --git a/web/src/api/interface/sys/limit/index.ts b/web/src/api/interface/sys/limit/index.ts new file mode 100644 index 0000000..433b558 --- /dev/null +++ b/web/src/api/interface/sys/limit/index.ts @@ -0,0 +1,17 @@ +/** + * @description 资源管理接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./spa"; +export * from "./menu"; +export * from "./module"; +export * from "./button"; diff --git a/web/src/api/interface/sys/limit/menu.ts b/web/src/api/interface/sys/limit/menu.ts new file mode 100644 index 0000000..7f669dc --- /dev/null +++ b/web/src/api/interface/sys/limit/menu.ts @@ -0,0 +1,51 @@ +/** + * @description 菜单管理接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { Spa } from "@/api/interface"; +import { MenuTypeDictEnum } from "@/enums"; +export namespace Menu { + /** 菜单类型 */ + export type MenuType = MenuTypeDictEnum.MENU | MenuTypeDictEnum.CATALOG | MenuTypeDictEnum.LINK; + + /**菜单分页查询 */ + export interface Tree { + /** 菜单名称 */ + menuType?: MenuType; + /** 所属模块名称 */ + module: number | string; + } + + /** 菜单信息 */ + export interface MenuInfo extends Spa.SpaInfo { + /** 所属模块 */ + module: number | string; + /** 上级菜单 */ + parentId: number | string; + /** 子菜单 */ + children?: MenuInfo[]; + } + + /** 菜单树信息 */ + export interface MenuTreeInfo { + /** id */ + id: number | string; + /** 菜单名称 */ + title: string; + /** 上级菜单Id */ + parentId: number | string; + /** 菜单路由 */ + path?: string; + /** 子菜单 */ + children?: MenuTreeInfo[]; + } +} diff --git a/web/src/api/interface/sys/limit/module.ts b/web/src/api/interface/sys/limit/module.ts new file mode 100644 index 0000000..ec6ecab --- /dev/null +++ b/web/src/api/interface/sys/limit/module.ts @@ -0,0 +1,36 @@ +/** + * @description 模块管理接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { ReqPage } from "@/api/interface"; +export namespace Module { + /**模块分页查询 */ + export interface Page extends ReqPage { + title: string; + } + + /** 单页信息 */ + export interface ModuleInfo { + /** id */ + id: number | string; + /** 菜单名称 */ + title: string; + /** 菜单描述 */ + description: string; + /** 菜单图标 */ + icon: string; + /** 排序 */ + sortCode: number; + /** 创建时间 */ + createTime: string; + } +} diff --git a/web/src/api/interface/sys/limit/spa.ts b/web/src/api/interface/sys/limit/spa.ts new file mode 100644 index 0000000..55361f6 --- /dev/null +++ b/web/src/api/interface/sys/limit/spa.ts @@ -0,0 +1,58 @@ +/** + * @description 单页管理接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { ReqPage } from "@/api/interface"; +import { MenuTypeDictEnum } from "@/enums"; +export namespace Spa { + /** 单页类型 */ + export type SpaType = MenuTypeDictEnum.MENU | MenuTypeDictEnum.LINK; + + /**单页分页查询 */ + export interface Page extends ReqPage { + menuType: SpaType; + } + + /** 单页信息 */ + export interface SpaInfo { + /** id */ + id: number | string; + /** 菜单名称 */ + title: string; + /** 组件名称 */ + name: string; + /** 菜单描述 */ + description: string; + /** 菜单类型 */ + menuType: string; + /** 菜单图标 */ + icon: string; + /** 菜单路径 */ + path: string; + /** 菜单组件 */ + component: string; + /** 需要高亮的 path (通常用作详情页高亮父级菜单) */ + activeMenu: string; + /** 是否首页 */ + isHome: boolean; + /** 排序 */ + sortCode: number; + /** 是否隐藏 */ + isHide: boolean; + /** 是否缓存 */ + isKeepAlive: boolean; + /** 是否全屏 */ + isAffix: boolean; + /** 是否全屏 */ + isFull: boolean; + } +} diff --git a/web/src/api/interface/sys/ops/config.ts b/web/src/api/interface/sys/ops/config.ts new file mode 100644 index 0000000..36e241a --- /dev/null +++ b/web/src/api/interface/sys/ops/config.ts @@ -0,0 +1,22 @@ +/** + * @description 系统配置请求接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ + +export namespace Config { + //系统配置返回 + export interface ConfigSysBase { + category: string; + configKey: string; + configValue: string; + } +} diff --git a/web/src/api/interface/sys/ops/dict.ts b/web/src/api/interface/sys/ops/dict.ts new file mode 100644 index 0000000..7c60c4b --- /dev/null +++ b/web/src/api/interface/sys/ops/dict.ts @@ -0,0 +1,48 @@ +/** + * @description 字典接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ + +import { ReqPage } from "@/api"; +export namespace Dict { + /* 字典信息 */ + export interface DictTree { + /** 字典值 */ + dictValue: string; + /** 字典标签 */ + dictLabel: string; + /** 状态 */ + status: string; + /** 子集 */ + children: DictTree[]; + } + + /** 字典分页查询 */ + export interface Page extends ReqPage { + /** 所属模块名称 */ + parentId: number | string; + /** 字典分类 */ + category: string; + } + + /** 字典信息 */ + export interface DictInfo extends DictTree { + /** 字典id */ + id: number | string; + /** 父Id */ + parentId: number | string; + /** 字典分类 */ + category: string; + /** 字典排序 */ + sortCode: number; + } +} diff --git a/web/src/api/interface/sys/ops/index.ts b/web/src/api/interface/sys/ops/index.ts new file mode 100644 index 0000000..c2d838b --- /dev/null +++ b/web/src/api/interface/sys/ops/index.ts @@ -0,0 +1,15 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./config"; +export * from "./dict"; diff --git a/web/src/api/interface/sys/upload.ts b/web/src/api/interface/sys/upload.ts new file mode 100644 index 0000000..8b273c6 --- /dev/null +++ b/web/src/api/interface/sys/upload.ts @@ -0,0 +1,19 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export namespace Upload { + // 文件上传返回 + export interface ResFileUrl { + fileUrl: string; // 文件地址 + } +} diff --git a/web/src/api/interface/sys/userCenter.ts b/web/src/api/interface/sys/userCenter.ts new file mode 100644 index 0000000..ffb35af --- /dev/null +++ b/web/src/api/interface/sys/userCenter.ts @@ -0,0 +1,21 @@ +/** + * @description 用户个人中心接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { ReqId } from "@/api/interface"; +export namespace UserCenter { + /** 设置默认模块 */ + export interface ResModuleDefault extends ReqId { + /** 是否默认 */ + ifDefault: boolean; + } +} diff --git a/web/src/api/modules/auth/index.ts b/web/src/api/modules/auth/index.ts new file mode 100644 index 0000000..e04e30a --- /dev/null +++ b/web/src/api/modules/auth/index.ts @@ -0,0 +1,14 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./login"; diff --git a/web/src/api/modules/auth/login.ts b/web/src/api/modules/auth/login.ts new file mode 100644 index 0000000..05d0549 --- /dev/null +++ b/web/src/api/modules/auth/login.ts @@ -0,0 +1,37 @@ +/** + * @description 登录模块接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { Login } from "@/api/interface"; +import { moduleRequest } from "@/api/request"; + +const http = moduleRequest("/auth/b/"); + +// 用户登录 +export const loginApi = (params: Login.LoginForm) => { + return http.post("login", params, { noLoading: true }); // 正常 post json 请求 ==> application/json +}; + +//获取验证码 +export const picCaptchaApi = () => { + return http.get("getPicCaptcha", {}, { noLoading: true }); +}; + +// 用户退出登录 +export const logoutApi = (params: Login.Logout) => { + return http.post("logout", params); +}; + +//获取用户信息 +export function getLoginUserApi() { + return http.get("getLoginUser", {}, { noLoading: true }); +} diff --git a/web/src/api/modules/index.ts b/web/src/api/modules/index.ts new file mode 100644 index 0000000..5fbf066 --- /dev/null +++ b/web/src/api/modules/index.ts @@ -0,0 +1,15 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./auth"; +export * from "./sys"; diff --git a/web/src/api/modules/sys/index.ts b/web/src/api/modules/sys/index.ts new file mode 100644 index 0000000..25923b6 --- /dev/null +++ b/web/src/api/modules/sys/index.ts @@ -0,0 +1,19 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./upload"; +export * from "./user"; +export * from "./userCenter"; +export * from "./limit"; +export * from "./ops"; +export * from "./log"; diff --git a/web/src/api/modules/sys/limit/button.ts b/web/src/api/modules/sys/limit/button.ts new file mode 100644 index 0000000..a08ff02 --- /dev/null +++ b/web/src/api/modules/sys/limit/button.ts @@ -0,0 +1,42 @@ +/** + * @description 权限按钮 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ + +import { moduleRequest } from "@/api/request"; +import { ReqId, ResPage, Button } from "@/api/interface"; +const http = moduleRequest("/sys/limit/button/"); + +/** 获取单页分页 */ +export const buttonPageApi = (params: Button.Page) => { + return http.get>("page", params); +}; + +/** 获取单页详情 */ +export const buttonDetailApi = (params: ReqId) => { + return http.get("detail", params); +}; + +/** 提交表单 edit为true时为编辑,默认为新增 */ +export const buttonSubmitFormApi = (params: {}, edit: boolean = false) => { + return http.post(edit ? "edit" : "add", params); +}; + +/** 删除单页 */ +export const buttonDeleteApi = (params: ReqId[]) => { + return http.post("delete", params); +}; + +/** 删除单页 */ +export const buttonBatchApi = (params: Button.Batch) => { + return http.post("batch", params); +}; diff --git a/web/src/api/modules/sys/limit/index.ts b/web/src/api/modules/sys/limit/index.ts new file mode 100644 index 0000000..1c96307 --- /dev/null +++ b/web/src/api/modules/sys/limit/index.ts @@ -0,0 +1,17 @@ +/** + * @description 资源管理接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./spa"; +export * from "./module"; +export * from "./menu"; +export * from "./button"; diff --git a/web/src/api/modules/sys/limit/menu.ts b/web/src/api/modules/sys/limit/menu.ts new file mode 100644 index 0000000..593a18f --- /dev/null +++ b/web/src/api/modules/sys/limit/menu.ts @@ -0,0 +1,42 @@ +/** + * @description 菜单管理 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ + +import { moduleRequest } from "@/api/request"; +import { ReqId, Spa, Menu } from "@/api/interface"; +const http = moduleRequest("/sys/limit/menu/"); + +/** 获取菜单树 */ +export const menuTreeApi = (params: Menu.Tree) => { + return http.get("tree", params); +}; + +/** 获取菜单详情 */ +export const menuDetailApi = (params: ReqId) => { + return http.get("detail", params); +}; + +/** 提交表单 edit为true时为编辑,默认为新增 */ +export const menuSubmitFormApi = (params: {}, edit: boolean = false) => { + return http.post(edit ? "edit" : "add", params); +}; + +/** 删除菜单 */ +export const menuDeleteApi = (params: ReqId[]) => { + return http.post("delete", params); +}; + +/** 修改模块菜单 */ +export const menuChangeModuleApi = (params: { id: number | string; module: number | string }) => { + return http.post("changeModule", params); +}; diff --git a/web/src/api/modules/sys/limit/module.ts b/web/src/api/modules/sys/limit/module.ts new file mode 100644 index 0000000..7c7d0cf --- /dev/null +++ b/web/src/api/modules/sys/limit/module.ts @@ -0,0 +1,37 @@ +/** + * @description 应用模块 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ + +import { moduleRequest } from "@/api/request"; +import { ReqId, ResPage, Spa } from "@/api/interface"; +const http = moduleRequest("/sys/limit/module/"); + +/** 获取模块分页 */ +export const modulePageApi = (params: Spa.Page) => { + return http.get>("page", params); +}; + +/** 获取模块详情 */ +export const moduleDetailApi = (params: ReqId) => { + return http.get("detail", params); +}; + +/** 提交表单 edit为true时为编辑,默认为新增 */ +export const moduleSubmitFormApi = (params: {}, edit: boolean = false) => { + return http.post(edit ? "edit" : "add", params); +}; + +/** 删除模块 */ +export const moduleDeleteApi = (params: ReqId[]) => { + return http.post("delete", params); +}; diff --git a/web/src/api/modules/sys/limit/spa.ts b/web/src/api/modules/sys/limit/spa.ts new file mode 100644 index 0000000..7238ae3 --- /dev/null +++ b/web/src/api/modules/sys/limit/spa.ts @@ -0,0 +1,36 @@ +/** + * @description 单页管理接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { moduleRequest } from "@/api/request"; +import { ReqId, ResPage, Spa } from "@/api/interface"; +const http = moduleRequest("/sys/limit/spa/"); + +/** 获取单页分页 */ +export const spaPageApi = (params: Spa.Page) => { + return http.get>("page", params); +}; + +/** 获取单页详情 */ +export const spaDetailApi = (params: ReqId) => { + return http.get("detail", params); +}; + +/** 提交表单 edit为true时为编辑,默认为新增 */ +export const spaSubmitFormApi = (params: {}, edit: boolean = false) => { + return http.post(edit ? "edit" : "add", params); +}; + +/** 删除单页 */ +export const spaDeleteApi = (params: ReqId[]) => { + return http.post("delete", params); +}; diff --git a/web/src/api/modules/sys/ops/config.ts b/web/src/api/modules/sys/ops/config.ts new file mode 100644 index 0000000..54712ab --- /dev/null +++ b/web/src/api/modules/sys/ops/config.ts @@ -0,0 +1,23 @@ +/** + * @description 系统配置模块 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { Config } from "@/api/interface"; + +import { moduleRequest } from "@/api/request"; + +const http = moduleRequest("/sys/ops/config/"); + +/** 获取系统配置 */ +export const configSysBaseApi = () => { + return http.get("sysBaseList", {}, { noLoading: true }); +}; diff --git a/web/src/api/modules/sys/ops/dict.ts b/web/src/api/modules/sys/ops/dict.ts new file mode 100644 index 0000000..e63adaf --- /dev/null +++ b/web/src/api/modules/sys/ops/dict.ts @@ -0,0 +1,44 @@ +/** + * @description 字典接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ + +import { Dict, ReqId, ResPage } from "@/api/interface"; + +import { moduleRequest } from "@/api/request"; + +const http = moduleRequest("/sys/ops/dict/"); + +/** 获取字典树 */ +export const getDictTreeApi = () => { + return http.get("tree", {}, { noLoading: true }); +}; + +/** 获取字典分页 */ +export const dictPageApi = (params: Dict.Page) => { + return http.get>("page", params); +}; + +/** 获取单页详情 */ +export const dictDetailApi = (params: ReqId) => { + return http.get("detail", params); +}; + +/** 提交表单 edit为true时为编辑,默认为新增 */ +export const dictSubmitFormApi = (params: {}, edit: boolean = false) => { + return http.post(edit ? "edit" : "add", params); +}; + +/** 删除单页 */ +export const dictDeleteApi = (params: ReqId[]) => { + return http.post("delete", params); +}; diff --git a/web/src/api/modules/sys/ops/index.ts b/web/src/api/modules/sys/ops/index.ts new file mode 100644 index 0000000..c2d838b --- /dev/null +++ b/web/src/api/modules/sys/ops/index.ts @@ -0,0 +1,15 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +export * from "./config"; +export * from "./dict"; diff --git a/web/src/api/modules/sys/upload.ts b/web/src/api/modules/sys/upload.ts new file mode 100644 index 0000000..d8b4cd0 --- /dev/null +++ b/web/src/api/modules/sys/upload.ts @@ -0,0 +1,17 @@ +import { Upload } from "@/api/interface"; +import { moduleRequest } from "@/api/request"; + +const http = moduleRequest("/sys/file/"); + +/** + * @name 文件上传模块 + */ +// 图片上传 +export const uploadImg = (params: FormData) => { + return http.post("upload/img", params); +}; + +// 视频上传 +export const uploadVideo = (params: FormData) => { + return http.post("upload/video", params); +}; diff --git a/web/src/api/modules/sys/user.ts b/web/src/api/modules/sys/user.ts new file mode 100644 index 0000000..23dece2 --- /dev/null +++ b/web/src/api/modules/sys/user.ts @@ -0,0 +1,71 @@ +import { ResPage, User } from "@/api/interface/index"; +import { moduleRequest } from "@/api/request"; + +const http = moduleRequest("/sys/user/"); +/** + * @name 用户管理模块 + */ +// 获取用户列表 +export const getUserList = (params: User.ReqUserParams) => { + return http.post>("list", params); +}; + +// 获取树形用户列表 +export const getUserTreeList = (params: User.ReqUserParams) => { + return http.post>("tree/list", params); +}; + +// 新增用户 +export const addUser = (params: { id: string }) => { + return http.post(`/user/add`, params); +}; + +// 批量添加用户 +export const BatchAddUser = (params: FormData) => { + return http.post(`/user/import`, params); +}; + +// 编辑用户 +export const editUser = (params: { id: string }) => { + return http.post(`/user/edit`, params); +}; + +// 删除用户 +export const deleteUser = (params: { id: string[] }) => { + return http.post(`/user/delete`, params); +}; + +// 切换用户状态 +export const changeUserStatus = (params: { id: string; status: number }) => { + return http.post(`/user/change`, params); +}; + +// 重置用户密码 +export const resetUserPassWord = (params: { id: string }) => { + return http.post(`/user/rest_password`, params); +}; + +// 导出用户数据 +export const exportUserInfo = (params: User.ReqUserParams) => { + return http.download(`/user/export`, params); +}; + +// 获取用户状态字典 +export const getUserStatus = () => { + return http.get(`/user/status`); +}; + +// 获取用户性别字典 +export const getUserGender = () => { + return http.get(`/user/gender`); +}; + +// 获取用户部门列表 +export const getUserDepartment = () => { + return http.get(`/user/department`); +}; + +// 获取用户角色字典 +export const getUserRole = () => { + return http.get(`/user/role`); +}; diff --git a/web/src/api/modules/sys/userCenter.ts b/web/src/api/modules/sys/userCenter.ts new file mode 100644 index 0000000..15b1475 --- /dev/null +++ b/web/src/api/modules/sys/userCenter.ts @@ -0,0 +1,32 @@ +/** + * @description 用户个人中心接口 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { moduleRequest } from "@/api/request"; +import { ReqId, UserCenter } from "@/api/interface"; +const http = moduleRequest("/sys/userCenter/"); + +/** 获取用户菜单 */ +export const getAuthMenuListApi = (params: ReqId) => { + return http.get("loginMenu", params, { noLoading: true }); + // return authMenuList; +}; + +/** 设置默认模块 */ +export const setDefaultModuleApi = (params: UserCenter.ResModuleDefault) => { + http.post("setDefaultModule", params, { noLoading: true }); +}; + +/** 修改用户密码 */ +export const updatePasswordApi = () => { + return http.get("loginMenu", {}, { noLoading: true }); +}; diff --git a/web/src/api/request/index.ts b/web/src/api/request/index.ts new file mode 100644 index 0000000..8333ac2 --- /dev/null +++ b/web/src/api/request/index.ts @@ -0,0 +1,33 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import { ResultEnum } from "@/enums/httpEnum"; +import { createRequest } from "./request"; + +const isHttpProxy = import.meta.env.VITE_HTTP_PROXY === "true"; // 是否使用代理 +const url = import.meta.env.VITE_API_URL as string; // 请求地址 + +/** + * @description 模块内的请求, 会自动加上模块的前缀 + * @param moduleUrl 模块地址 + * @param prefix 前缀 + */ +export const moduleRequest = (moduleUrl: string, prefix: string = "/api") => + createRequest({ + //请求地址,可在 .env.** 文件中修改 + baseURL: isHttpProxy ? prefix + moduleUrl : url + prefix + moduleUrl, + // 设置超时时间 + timeout: ResultEnum.TIMEOUT as number, + // 跨域时候允许携带凭证 + withCredentials: true + }); diff --git a/web/src/api/request/instance.ts b/web/src/api/request/instance.ts new file mode 100644 index 0000000..049dd11 --- /dev/null +++ b/web/src/api/request/instance.ts @@ -0,0 +1,232 @@ +/** + * @description 封装 axios 请求类 + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, InternalAxiosRequestConfig, AxiosResponse } from "axios"; +import { showFullScreenLoading, tryHideFullScreenLoading } from "@/config/serviceLoading"; +import { LOGIN_URL } from "@/config"; +import { ElMessage } from "element-plus"; +import { ResultData } from "@/api/interface"; +import { ResultEnum, TokenEnum } from "@/enums"; +import { checkStatus } from "../helper/checkStatus"; +import { useUserStore } from "@/stores/modules/user"; +import router from "@/routers"; + +// 自定义 AxiosRequestConfig 接口,增加 noLoading 属性 +export interface CustomAxiosRequestConfig extends InternalAxiosRequestConfig { + noLoading?: boolean; +} + +export default class RequestHttp { + service: AxiosInstance; + /** + * @description 构造函数 + * @param config axios 配置 + */ + public constructor(config: AxiosRequestConfig) { + // axios 实例化 + this.service = axios.create(config); + // 设置请求拦截器 + this.setInterceptor(); + } + /** 指定方法提示 */ + apiNameArray = ["add", "edit", "grant", "batch"]; + /** 指定方法不提示 */ + noMessageApiNameArray: string[] = []; + /** + * @description 设置请求拦截器 + */ + setInterceptor() { + /** + * @description 请求拦截器 + * 客户端发送请求 -> [请求拦截器] -> 服务器 + * token校验(JWT) : 接受服务器返回的 token,存储到 vuex/pinia/本地储存当中 + */ + this.service.interceptors.request.use( + (config: CustomAxiosRequestConfig) => { + const userStore = useUserStore(); + // 当前请求不需要显示 loading,在 api 服务中通过指定的第三个参数: { noLoading: true } 来控制 + config.noLoading || showFullScreenLoading(); + + //检查 config.headers 对象是否存在以及是否具有 set 方法 + if (config.headers && typeof config.headers.set === "function") { + const { accessToken, refreshToken } = userStore; + if (accessToken) { + config.headers.set(TokenEnum.TOKEN_NAME, TokenEnum.TOKEN_PREFIX + accessToken); + // 判断 accessToken 是否过期 + const jwt = this.decryptJWT(accessToken); + const exp = this.getJWTDate(jwt.exp); + // token 已经过期 + if (new Date() >= exp) { + // 获取刷新 token + const refreshAccessToken = refreshToken; + // 携带刷新 token + if (refreshAccessToken) { + config.headers.set("X-" + TokenEnum.TOKEN_NAME, TokenEnum.TOKEN_PREFIX + refreshAccessToken); + } + } + } + } + return config; + }, + (error: AxiosError) => { + return Promise.reject(error); + } + ); + + /** + * @description 响应拦截器 + * 服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息 + */ + this.service.interceptors.response.use( + (response: AxiosResponse) => { + // 检查并存储授权信息 + this.checkAndStoreAuthentication(response); + const { data } = response; + const userStore = useUserStore(); + tryHideFullScreenLoading(); + // 登陆失效 + if (data.code == ResultEnum.OVERDUE) { + userStore.clearUserStore(); + router.replace(LOGIN_URL); + ElMessage.error(data.msg); + return Promise.reject(data); + } + // 全局错误信息拦截(防止下载文件的时候返回数据流,没有 code 直接报错) + if (data.code && data.code !== ResultEnum.SUCCESS) { + ElMessage.error(data.msg); + return Promise.reject(data); + } else { + // 统一成功提示 + const responseUrl: string = response.config.url || ""; //获取请求地址 + this.apiNameArray.forEach(apiName => { + let responseApiArray = responseUrl.split("/"); //分割 + let method = responseApiArray[responseApiArray.length - 1]; //取最后一个 + let result = this.noMessageApiNameArray.includes(method); //判断是否在不提示的数组中 + if (!result && responseUrl.includes(apiName)) { + //如果不在不提示的数组中并且请求地址包含指定的方法 + ElMessage.success(data.msg); + } + }); + } + // 成功请求(在页面上除非特殊情况,否则不用处理失败逻辑) + return data; + }, + async (error: AxiosError) => { + const { response } = error; + tryHideFullScreenLoading(); + // 请求超时 && 网络错误单独判断,没有 response + if (error.message.indexOf("timeout") !== -1) ElMessage.error("请求超时!请您稍后重试"); + if (error.message.indexOf("Network Error") !== -1) ElMessage.error("网络错误!请您稍后重试"); + // 根据服务器响应的错误状态码,做不同的处理 + if (response) checkStatus(response.status); + // 服务器结果都没有返回(可能服务器错误可能客户端断网),断网处理:可以跳转到断网页面 + if (!window.navigator.onLine) router.replace("/500"); + return Promise.reject(error); + } + ); + } + + /** + * @description get 请求 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise> + */ + get(url: string, params?: object, _object = {}): Promise> { + return this.service.get(url, { params, ..._object }); + } + + /** + * @description post 请求 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise> + */ + post(url: string, params?: object | string, _object = {}): Promise> { + return this.service.post(url, params, _object); + } + + /** + * @description put 请求 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise> + */ + put(url: string, params?: object, _object = {}): Promise> { + return this.service.put(url, params, _object); + } + + /** + * @description delete 请求 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise> + */ + delete(url: string, params?: any, _object = {}): Promise> { + return this.service.delete(url, { params, ..._object }); + } + + /** + * @description 下载文件 + * @param url 请求地址 + * @param params 请求参数 + * @param _object axios 配置 + * @returns Promise + */ + download(url: string, params?: object, _object = {}): Promise { + return this.service.post(url, params, { ..._object, responseType: "blob" }); + } + + /** + * @description 解密 JWT token 的信息 + * @param token jwt token 字符串 + * @returns object + */ + decryptJWT(token: string) { + token = token.replace(/_/g, "/").replace(/-/g, "+"); + const json = decodeURIComponent(escape(window.atob(token.split(".")[1]))); + return JSON.parse(json); + } + + /** + * @description 将 JWT 时间戳转换成 Date,主要针对 `exp`,`iat`,`nbf` + * @param timestamp 时间戳 + * @returns Date 对象 + */ + getJWTDate(timestamp: number) { + return new Date(timestamp * 1000); + } + + /** + * 检查并存储授权信息 + * @param res 响应对象 + */ + checkAndStoreAuthentication(res: AxiosResponse) { + // 读取响应报文头 token 信息 + let accessToken = res.headers[TokenEnum.ACCESS_TOKEN_KEY]; + let refreshAccessToken = res.headers[TokenEnum.REFRESH_TOKEN_KEY]; + const userStore = useUserStore(); + // 判断是否是无效 token + if (accessToken === "invalid_token") { + userStore.clearToken(); // 清除 token + } + // 判断是否存在刷新 token,如果存在则存储在本地 + else if (refreshAccessToken && accessToken && accessToken !== "invalid_token") { + userStore.setToken(accessToken, refreshAccessToken); + } + } +} diff --git a/web/src/api/request/request.ts b/web/src/api/request/request.ts new file mode 100644 index 0000000..3a36be1 --- /dev/null +++ b/web/src/api/request/request.ts @@ -0,0 +1,78 @@ +/** + * @description + * @license Apache License Version 2.0 + * @remarks + * SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: + * 1.请不要删除和修改根目录下的LICENSE文件。 + * 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 + * 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin + * 4.基于本软件的作品,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 + * 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 + * 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关 + * @see https://gitee.com/zxzyjs/SimpleAdmin + */ +import type { AxiosRequestConfig } from "axios"; +import RequestHttp from "./instance"; + +/** + * @description 创建请求实例 + * @param axiosConfig axios 配置 + */ +export function createRequest(axiosConfig: AxiosRequestConfig) { + const customInstance = new RequestHttp(axiosConfig); + + /** + * get请求 + * @param url - 请求地址 + * @param config - axios配置 + */ + async function get(url: string, params?: object, _object = {}) { + return customInstance.get(url, params, _object); + } + + /** + * post请求 + * @param url - 请求地址 + * @param data - 请求的body的data + * @param config - axios配置 + */ + async function post(url: string, params?: any, _object = {}) { + return customInstance.post(url, params, _object); + } + /** + * put请求 + * @param url - 请求地址 + * @param data - 请求的body的data + * @param config - axios配置 + */ + async function put(url: string, params?: any, _object = {}) { + return customInstance.put(url, params, _object); + } + + /** + * delete请求 + * @param url - 请求地址 + * @param config - axios配置 + */ + async function handleDelete(url: string, params?: any, _object = {}) { + return customInstance.delete(url, params, _object); + } + + /** + * + * 下载 + * @param url - 请求地址 + * @param config - axios配置 + */ + async function download(url: string, params?: object, _object = {}): Promise { + return customInstance.download(url, params, { ..._object, responseType: "blob" }); + } + + return { + get, + post, + put, + delete: handleDelete, + download + }; +} diff --git a/web/src/assets/fonts/DIN.otf b/web/src/assets/fonts/DIN.otf new file mode 100644 index 0000000000000000000000000000000000000000..3296d1ea7b33a481e682017496ac38c26d7df5a4 GIT binary patch literal 27828 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 literal 0 HcmV?d00001 diff --git a/web/src/assets/fonts/MetroDF.ttf b/web/src/assets/fonts/MetroDF.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9d31af4977002c65bad9cbc521764401d5035890 GIT binary patch literal 106934 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

8|u-mxD z<)pcsea@BP_)KG#G2579%r)jYSH5!<7z>R>#!{D4W-K>W7%Pp3T*6`3Nu9&>4mUX5 zXl!!IW@C%7-SHhRztiC^hkN{Mud&ZKWPOK?YHz7-Z>er?scvuE+}^giy={ZRlRQtU z^IF?r@EoZ2w#{}xZ`F(?tQpHTTHPd2rvl3xzzW!x$keI)hVS;Wo)C> zDUDj)Huw5%?)BT;>$kbrZ*#BT=3c+ey?&c}{WkY{X2x)bpOJFtnUuL5n;Z-3ysA7< zI?W~z*mgn>f|{#rN5UzfJYd`TEgEFE1eCvPJJKp|g7eDXwVj!X@@oCK9c!#yjH{qZ z-Hzl+pXP9$!}$&u7z>R>#tvhbQ9iEij4whxGqasF<4B%dm7jSB^?wGGKV%2mrGxS_ z??A_4P$T#b&qH=l=Q9b*&%6Vx`xYoa^A68Cc2LjyRkMyA)V9*d&&>0&Sic>fb?or0 zV~1xQJ3Q;yVL$T@`Is^N^kB z@(QR^`a99(*Pu>^`c?Xx^{r?Y>%knkcX>$(dGPk=Fu zO}mir7oa5EMT;5(YR7z+<=lmwR|w0-?xOyOz-4$Lc6lDSi&muc+A-f{`FGjU?m~X0 zOm#|)CcCgXDrYym?4m6x*IqnJyF63c#Y{QkIIHu9RYAoBuEK7H3 zGqyWTr++=-7fkjWt4v>U!IfI7Lc8@{f9@|f+0uUJqXv)#5%yJ6}%!aB3T4kwK7hAE|# ze{45QDW$B_ZkSR^oz~b*?~Dd_AEAEpeHp4r|9`H?s@fvBGz$G*~uLtEJL@`A9c(z$MiVd>$_{`WjCy;W(FJ{bowEeKWsedT&Ij@ zti@R@z#dq;1db#P&&<#Vc?OA*WsiFq^~lU&k4F<((gz7^R>{r*GVk%YzsL4%53KbP zvm9%`2P^mYphlKG?qz%6PPvktOSWzg+$p`r7rg;MCF?B89&CkBXHoWGD}*|WvIkos z)NbG&ESpd}fP1hN!n3r)G;}#9yMqNwLze+i{%W2AVt$o|F3*DUSEr$cp0k=oYfM9z zS3&u!)6n7>Q2y#Pv}ge3uTDdLrPpdP4K0*jb~}xBs9f?_r`cbfMmxMnSnZJa8lZ0) zE$}>;Zp?6Lne>#jAj>h?PM_oSYJq9AJ>9X`sJ54emAC+wxU^E=z06qdG!;&x-MTca z#Oq)+GsZO5Wh$rEzsg&l#@M0q^(;Ud?NH$cOVa4DcK6ae6HfC?I1NjpySEwJjh!y@ zh*51a4NIb2#~jmRsd^pmbGYB~3^-=cQVscD!$$ex(_mA0(vqAq$|s)&v%)j9mNfW% z5!A@F7nWZIN79n_+Rp5?o!JY^=ZP833U@CoUj%t#2Go;!dtv-RP_v-DaNPmQZ?hM! z2SE0zKs}?k7p|33c4ja9Dy953du?a-dPLX@zgLN&mwU{ z*I}dV%wE>%LOt)Z7w%r?>3Dgr_QBL^pgdRmJR95xM{@|vbF~kS7J%CS-RIfhKFxYM+Go$zK3k-HSR|#FM{b{Ix%)iJ-RD{EK70`>UvtHM%oUYVo~wQ6 zehEBFEv3_9FMuPdhji-UBq&c~IxY51P^Y%iJ(EfI$e8YtF`e2NOT51h2bs2O{@ z$Ha7xiRtL5G+M2vqmk0cyO{3LFr8LcPmYID@|vutz6~KrO`0mo}zRtlET$4xyETU z8m4<5o9=mRI;~VOYNhG+8l_`-boVx6yW=}uj#_CtGhU%a!*p7yq*5zQXAYxWeNNx+ zm;r|eUH%ZQF+CVIo@6GIPAe7aiI{YlI>-AOG>6H6sq>)bFd4Qj88CH$u;wrsp2K9A zsSGofVWu){TQXqkInrnjlR^7D1!@kHVZJiVSB7m%27D={<}ewyEg2p=GGI;j5^EW- zb_Lvr{28!z5zL?m@unPO7VRek))b#(%ynL|mH}%@S!_H&PsxBa=~dz~OKFW6uqM>0 zj|}E8x=W?8%DFU-WH65CF10RSwk5;1B?H#V(hjIM=irK z$MpE_Iz5sBYm%hj@dM7Q@ggG_@~^|jlh}|9SQF|bc7|EYG;5i#c7baK>pS*2tdTvF*``v8sZ5ws4GbGkVv90iN~m4tOqhC^x1nfFmjzQ7 zL9OYsVCn>@H68CwV@;Q3rn1ab7EC=zjMkpKJ&ba)umNY*_Or}a7JMna z)}&eRrSw|UWx+k9o4 zuWa*`ZN9S2SGM`eHecEBbp;u;2G4f?$~Irw@TC~7!L#A(8mKjRHhd{YGcMjG=6J2a zvl+|AfLeoR!`DSnYw&FN5{j>E_)C3F<&|6E6050n6Di3m1Dkg z%vX;2$}wL#<}1g1<(RJ=_|o0QSC0Ev4tzpbs>(#VzTkt^3DSFT5{T==>|ynH6P9=UQoa^-sD%Js;V>yazh zBUdg=DWyiPT#sD29=UQoa^-sD%Js;V>yaxLrY@0E^Nn1OT)7^(ay@eKc@NrWE=);6 z`Al*>a^-sD%7rQA)qEotrrreQGs%T1rPnMm*CSUhOerj%NiIw&mqxB!k6gJhrC;SU z$%QGU(a4p{Eb(1XK9gKn)2|xEay^RWdKAm`D3%Lr$|avkF04rgjbgbT#d2XyG4h$@ z(#v#r`Al+QO)>JB#CYA7FF z20-~tcv}kNbv`ZdSx`Qce6-N}Xyh}=N0(PY`AqWB;u%mrlYIM3^6fLpM}DQ3&mq`m`@A53d(1aPYV>vXOd3~d;`?nDW4Xo^zxbHy9MUc z_LN3GlYFK+taV|ndIAN zl5d|$KJ8FR$4hB`-SuTKONhp>J%yNNQE-=dlX1TyD z7ntP&SXRnYMzLIAmJ7^sfmtpv%Y|l{T^3j_G|Po%nYSIma-mt~^fNV6XqF4ja-mr+ zG|Po%xzH>Zn&m>XTxgaH&2phxE;P%9X1UNT7nG|PpsEUh&IFLYlnG|Ppse1@2_?2;Fn zZypnd>K?VCMs1nLQ({hm?mXGWo4b$)d}%<5M?2ejYw!2QhqRD#a)?C1U? zz+#@;(OXJmz=OQ0c|UUr#dkaAsAG;f%~>=pwzS1adx@~5Ew;49mbTc^7F*h4qUwzS2Tw%F1ZTiRlzRT`a{EJoTWa6g_~y(Ri{;6YLqBdy|( zIKJEQM;$L|4_Mj*uG<5a_JE~DTk7_Jr9FVOZxNQi=zwQ&2at9=Vb$#cOM3um^{ZxU z2as03s%{Th+5?vMfa~^v>-GRWcqG3{<^#ygzCM2&xDN7G+5_GbKVZoZAh~|+_OD0% ztKOP*(2^gt2QB$Qw~B+7{GcU2Xvq&+@`G*_2QB$QOMcLjAGGAE z!D#NKR&kJdW)!Hlagf=B!rIM0h%QPaT@IqlHn5mhaS*AW0uS<*-GgYPG~(hQ8YxY; ze?977k2$^GvsZ#%uY%gsDY0H9)~f`)&J&|Oof7oA2x?EK1ieOq+S4gPFU4z5rv%H^ z0%}jE1Ra%9dpafPsFd>Hm7t?iYEP%cnwDVAt`L?rD?w}J(w9lhYbKO6E3q{z!I~+T{H`TfFrh41i7i+O7EF@JJ5=Ivsssxr zspKs$!Ga0p9V)?s=`PySDPf#adRed%Td)$WmP*z-s02$T8RQ)*HEX4?_6p%B-uPE) z)=FVbzv}HJrLcAhR6i<(wOCMo*HW`q3TuOem$6@53Tr1oy}hKA@#s9L{#6Qt$|WCc zsTnMVLFGzyF1@{^)ZsplT0F!%=HOv|QqM5#xmQqM3;VNiMH zBPxYK$uA#lDGa^|YBf;`gDO)#Sl&f%)Yw!CgStzlvC8q)&Z`+nsb?UiF!&B(y^*XG z234|F5T!7vysggFW|Tj+)bq(w7*xt`%b-<5DGVw`{@7BFL8UOLaKBMAjZzp?njz;J zHtNaQQWzATVXayUgC}|WwEA6{87wn{WoEF<43?R}GBa3a2FuK#-q1FVTb1!6RNEQ3Lzd=X`4u*?jWnZYs`JWsslkY%1-@Xl@Os>}@XMFGdl7f}X-LNQoI zAAB8@FQNc6l-N>tqj&q5k3p@O$b;kH*4i)t=z1Yo3(PYR&LhH&04uxD>rN9 zX06<;m7BG4vsP}_%FSB2St~bdTUT)UPZ8^(f?JZ*D zn=Oa6OQ7cb<*+7{udf`|gz}}Ao3(P!3CnFc%RMJ7hqcT6D$7|8YYLaSv~q{#o8|54 zM$HM!VNK<0PFN0WDql1Fa#&MXC(_Gd?L4Rzdbwxy<*=r_n(vi+zE=)wx|ghFIjkw% zYwUAM&G*V-O(hQ+wL&k4HQ`C--sP|+Ji}Sma#(wTH@s^HyaJ|P1GNKQ;T`Y_IGRIP zJKz;?v;fo&cm=WJL7j)J@D6x|cfc#)?j>Th16~1lzXP=cUf~_^3b<2g+5xYCJC&v# z@CxsMS9k}!!aLvW({7V&#__3gNz$+N>g?c8Xf{|UQ z9qt1QyE3JE_ zb+5GUmDat|x>s8FO6y)}-7BqorFE~g?v>WP(z;h#_e$$tY27QWdnLNZBCT|6UgR2t1WtLU3bquu{1bkSEZ5_9t2`Q3c{HrDU9IwHSmn{MiXM8EG;KzW zhE=w!Rko{DwyRZMkyY8QR@tsrc{HrDU9GZRt)ho2uSUZv?5d<1HlB3+DWi5Lt6=I3 zUtbsjBYb^`^wltR9E|2p4O1@@zk<`Y)i9+r zn!QxpidNf-R>PFi=#*?VR`hL9d{vvTYWPwv&0eZK_Enp&YWR{=+V`(EU)AQT+I&@; zuWI;GUhVr=!?b%B;e5oAm`&XNVSRKwT1 zgyn~?hA;i9*-N$gsy1KM=BpZus$AMlu7)qA)a<3&d{x7jVzlpHZN94EOJRA#s?Aq5 zd?}6m@YV1o)cmvB^UrGctZMlBEnmt|&#EzBHSSq_#fzR*c>1SBVi{HRh`Z zzQz((&#H0Hs&UV%F<&+2s|LQ5Mm?*>J*&n&s|Kd75F_tajhU+PETsmft`Vb^LJdq^ z1T!t0W+^o=rFg9rYG6uv#Z(PUod@Lusevh_)GVdOvy>W`Qn<{eX}qiPN}&d(bT93g z)X=k(OS2Tdhvf1b9G0)626mLP728q+J3`G;YG6lskNCdbj*%Cu26iM#kHZ@8YG6kx zwM$atSxOD;sDvSxJZwDadz~_Bm!t-EUgGOaVyD*Z)S8`Ivr}t!YRyiq*{L-nCQ0Kl5Qx87_b?)mh_3$*PmF!`+-ovzB<&$zdd9O3? zb>_X!yw{ocI`dv<-s{YJoq4Y}@Ac-r-n`eF_j=bry?L)U@Ac-r-n`eF_j>bQZ{F+8 zd%bzDH}Cc4z23anoA-M2UT@y(&3nChuQ%`Y%sfZ%1t{@eZ{F+8d%bzDH}Cc4z23an zoA-LxM!jpJ-n`eF_j>bQPo2C?Y2v*e-Oqut%njDM0j)0(mbbP6t%pGQKO3xd16p4t ztQo1^Mjs1m)!%^D7eTf525a45tsBr(DK*<^KvSiZw~c2#ol-5l0V^F1%1SqQw$p%> zRxZs>8*HT;Y^57K+iCD@r@^zG23zR{thDmVSJU9xX#=(NI$`;0@TAg%8mJ}xs@Z9S zXQvIGoi=#3(_kyzfR&bZn(Z`TrC$Rz+i9?sZtx6;ZwC5aTIn}X&#IX=qh>gK8O(X* zpJ|}B6{GX04b-+`H`%dGS|FV}!&eihVtxdxcJ0_wb6 zBTStKwF}S)Q>Q?kmurNn%b?E7HJYhLGt~%F4-zB0)Cf~oK%JLsgs&k`=j9sV>oh37 z8sSUnWsw@;OX+o9u923hlsYfR*UzYdM)-OQ6km<-^$w`>a*gn%Uv>Vf5x!J{&R;dc zmr&=g8sSTMp!Is5O2Q>)QegK&|nc zyv}X%I=9K|+$OJco8apue$^Vk3BG;@YK`CIb#4>fsWh$eo8V5RX^r3Hb#9Z_xlLZ@ zHo>OK(Hg%AHYb5v<2MCb=QhEJ!dmAxd7azjb#9Z_xlLZ@HhG=f`Q9)mNt!*HG*bhk2+yKcn?0H|qi-K!%_5r7 zcL>zeH_aYRn$c0|HH&EWXwvM_q#5m$OS6b(k0#9?O`2(4l1HOSvqzI=k0#9?O`1KL z@Krt9Nwe)|v+ZZIN0Vl^jb@J~&9n`bpjkw-N0VlcCe0pAn$i7r;x&tC_Gr@L8fbA1 zw73RZTmvnxffm<5i)*08HPGT3XmJg+xCUBW11+wB7S}+FYoNt7(Bc|saSgP%23lML zEv|tU*FcMFpv5)N;u>gi4YarhT3iDyu7MWUK#Oaj#Wm348fbA1w73RZTmvnxffm<5 zi)*08HPGT3XmJg+xCUCOf!FzR;Ye&(D>X0#Mu+o2J)zu64d}auvD9iSH4p{P4le+; zYHmf}vmo!;0+SrCm2#^`jaIaKhwv^eaI4o}t=J!hbzZj>`*R7@nyVH2a}msTILGl? zbG5o=T5Wk+shKOp$nvyebCgSa&8;3ITCq8b(Oz>aHs@`y+IOj;@3&%ebVt1xv6WF+ zs5MusSH!K@ALY{QlyA%$b#kB;`=fZxR9mTGq3lnq?N2NAMaYWjyWrf6;iB(WK3cw3(4MGty>8+RR9s8EG>kZDyp+jI^1N zHZ#&@M%v6s8}037%G5aCW=7h~NShgHGb3$gq|J=9nUOX#(q=~57!fX!SB$iokv22Z zW=7h~NShgHGb3$gq|J=9nUOX#(q=~57zN&<95K>nM%v6sn;B^{BW-4+&5X2}kv4mM z+ssIt8EG>kZDyp+jI^1NHZ#&@M%v6s8zX}5C`Q^C5#9yGNShgHqmP^?EJoTG9fV?} zjs7AOBkeG99@LoL4kM>Pjp^+$av9W^-VP&ILCwC}J*KzA&UnHa)Af~xk)X!(c8}@p z9@E=Brnh@cZ-+Id*O=Z8Yf7mxz1?GayT|l)Sktc>)7w3!w|h))H-qgkD0y^>qa6l? z8q?chP$<8ByT|l)c$6;M@oa}jrBu&q_n6Kepv%#YXFF^vUSoQ@$MkmCRJ?XP+hJ2E zHrruPVfpRbJ*KzApi;IObq2m21{I^#aXSnuMt!Os1|^C7_U$mJm_CPf2EH8zl~TK$ z?J%hFbsDD~)|5*paN4nKl2Eq2!&aT=)fq`UY}MJ-W?bvARqwD>=RJ~)(H*wx9k%Kn zw(1?W>K(S~9k%McW0-NR!&be+R=vYky~9?$!&be+R=vYky~9?$1HLYkOMWMwN2CRI zz|=)hr>b}+$*3Kc4)?VVm{Q6dbnkFq>wu#RgyqfXfFq@puZf*-m!?xy9rQS9p;J{I zaHKS{fgNz9ygF6Y;dycg94TIFb5_Q_i%wN_(ED^p?YVToox-w*9UgHyJmPe~qhd5S z>u^uxtJ@B1|D^*Sl~?|#4tUfZb*icZ9u?N9st$UhQp&sA0gpoQ*kK+!JX&>lwCXUY z9p<#dBUgtp?L`3fjsVyD+c zoiIL@u+~JKaQz%84?rhep919p?(~|d6Rwp~Yobp0RZ6XiI&Dik;aBl`@~e~ns9bvT zs}q(lgL?9-6P8~CV)ODL7hP8gkSxtC%-!3SGjZop%YGpdh)9i zPL)O;;7&M|40`gb6HXN)4{#@(>hAIYcfzUS_2gG4oGPp*zdGSms3*TV;ZdkLXD8g9 zV{R(X6>pKCZ*t0nIcJyqCSP-8oa%Dl~i1i za^KW@H}!o@%{jZ=H@n<7yWBUs+&8=2H@o2O5@~dLq|1G?%i~}dtX&{RXW_bRMY~|_ zGGXnrbh&SK!J2ZZZ+5wFcDZkM!PiA%)Hl048g_X!?DA;X<~i1ia^LK7-|T`%<<&a33mzq{&cb!Uqhi!IyWml% zzS-qbvdg1nmq*DicvSh?8|{Ke{ItzD%z8MSZblDLYp8(FL{3CGv3aHcdN9d3G zRcGOjz^s1NS-2zaiAU&tN~7~mM_31q0Cg7b29V8N=qMU(BdpV9NBOH? zb-L^*dc8$RdL2WrOQ3A~G3#~AdL6S~e8-jca}2#61l4|yx&0ioUdOE0G4#@}YCp%^ zevVnMW7g}K^*V-LN~6<>$1MLb30s_MbA{XM8tRXtcXd>mM|^PoIG zJ!qj^^3?U9g>vas6>sozE}hBgv1RMQvMH=tVh{FB5^5j0$8(P!?AsfJb*icd`=;_` z-+HibLV4+MpC)B=V4_591s8dxvSUHuWQ&l~-ay?i%-9`J7Jyc6eW{Q#5 zuE*A_2WzIVPF3}IrqP2nQyQJB>cN@`bv~yD3ntX5sva0T8T6XLUNhKh27Aq5uNmw$ zgS}?3*9`WW!Co`iYX*DGAm2ZMi(WI>YXZUIE2mFATm7>U>Tw4C+_S9(!R>>9uz5g+aw@p5F_D$}0wYJx=w);03~(L-xYp zWl-mHdOgqYg+Z03{mNb#)LnEwr`O|DFAOS|#;INyRQZ}K_QIONI-k=EYtm8Yb9y~L z?DhPx*JDtx$Dm$VQ~8?b_rjXO+OO<|HQilfP_M_JURYE4I-k=EYeJpR>4i0+&gb;P z+6zISS?e=veP*rCto50-KC{+m*80qvzS-Uv({(U_zn-O^_jIkv({(U`plZ% zZmwMFcYS89&#d*CwLY`f2Wyx4RcGP)%vzu46@9RFl^E?~_PO8nx!?7{+67`X=kJ3x zq0YkfnYBLmyFT~3K3F?Xyk`D=o?Z00-}SlQ^}(9rwU5~cYeMzAKKHvmSkqm!kJ;zG z)(2|}%R}Dh8DO7hfPJv0lvLc0gEi$49D_7*5>sju=r2x_$L zhqcR~PS^Cq)HzVLQE#|c8jZRAaHKRkUDJ<^jsZ2_>$g?xH#_~XbB!2T#eQ4GezVhW zcKU4<`)w8bZ58`%75mLjzuD!i3Q&%Zdr)&Cc75mLpznSVcQ~jRf^_!`FGu3aa*l(u# z%~ZdwV!xT{hbif<(>47tbsp5|ntqs4jOKC!W@-SYUMDQ32F%oenHn%t12A=!c&)JX z73Ek^E35%CHDIO&%+vr(DUEv508A;3m>Mus17>Ofrmhg9Rr3H$DZSRtyzzy)9e^qQ zs?!<+Fm(Y`KN^53#cS<608`4VRn-7Yod>mo9)KyOR6pXRxy#gPjRBZaX|jHts`FiR zT4MmF6t7wOfcwz^OsRZ%4hLXIVV%|(fE`Jw(;5TrM+2~wb*0Cp6kJ;6cPc@q>ngRpZP)DHL{?7RWW zb2|t-*Fdo|Xm$o|{RVCQ24UxA;^oEFw?33c>RiI(N$t(>jvGM2H{9jY2`cU-ZbdmH0a(m=-xDFjt1dKX|(bkgd=IBmDC^{sWh#8 z2jNJlvucC3b%X9rgK(sHt$YXFn+DyR2I)=j5~H(EgYczaHOClqZyI!O8gy?ObZ;7j zFO{Q}?;w0h2CbL|;Y%@E`3|}_4Z@egI{P%}-ZThbN~5z+gYYHP*{4BzlTa()LHPP@ zFa%%c!I3aB1Yc*sXrB5Ug0FW#y^C@PrpAGK_v{c%O$GHf=^^}wvEV{hxI?gZ4%C~# zhZwWo1XqNQfqEOQzS^O@iO#zL>o>&il5*)yk3)=E%C+4o^=8^3n0gn?gxMh&QOtga zi;X(HFa!&4fn}Dw+|tU&K19t+ml}r~jGaz@#9^Ie7@`i9Qg2Hbq7J2LpL5AuK13Y~ z<(nO%-t_A!+f7!Vq+?&*WoZN`5j_Zhr_NzPQW>=Ivl1oD!uA(nAWJU>TuX~IP5wc zb{#TiI$m`+>^dBF9S*w=huHy?%&Nm-+Tm4Db$FaQeEt6+?akxjx~_cRV~KelCEKxM zJMNpl>F(r-Nr-fJ5(xnkLPAIgkYdLX2#^qxK$H+7c044WFdh>p4vj?)$oL z&+j&)XsDtn3aHDdS0mKGSV+2-C7pG@=U{i-x9>mi^9t6fQ+uzy_SwIE&fa^i->Eum zwfWZwhX2Y|n}3a9sHNXe%-P7evA|aI8I2(MAY1J>X^o5(VhwODEnGlOnO^PdRt6-TTGk@nx@tklin7S z-WHSI7L(olp1v7_sNs*6X?F^zC_lt9@sGgtJ=PYV+xcK30$DD<8h0qL*!DoEhN^*DO4# zYd)oKzs*QB!r88s)z+mW`dB@}Sgoc1P~ZMUxA0S4=RJL^t$arGv3i8DTC@50`f+OC z%^%U{))9TI9^o3%QvOA^(5-9s=tt74Th`X7BU~ezj<)g{(N{hrM7K1XCVe}iV{6v8 zW4axyzSZX35&GzVuw4XIv))r?y{F82Pnq?eGV48M)_cmV_mo-hDYM>FX1%A(dQX}4 zo-%VTeFnSs{sAQ@WoA~LW~=p-nORlaYCUDvdkTI`x2g4%nQ=_Z)mA}fy{F82Pnq?eGBcWK$FKDi zo`G&z>nXF|Q)a!V%z96m^`0{8J!NK;bD^X4l$kiBb|hL)nYo%YthAmo>pe9}Pnj79 zQ}HQA>8XEUtF4hn>8WY9_e&gG?V1{8eE2L|?O7+I`uH$PuQ}MyR|O;KV#G#Wt8{c?QivPEyNMQ^V~Z?8pf zuSIV!PlBPn7QMX|y}cH_y%xQ_7QMYZ8JJ_X=MC39i9BPpODm;4iDOKEBF`9OzNV=?k!OrG zz$0uQ)AfI=Z-1w6wI}k7ajt4x?TI{N`V)D^=r_#{{lHdxBF`A-?cZ`=j@AmR-U_SU z3aj1yfjKs--U_SU3aj1M%Zds+$7H|aI@8X{7Kq1!&ZyNOwukbC7rQil5ujDtrl;Y z0j2jS7em^Rz{3TM#V9*q;*?Kerk{EmI?S;muGDGtR(zs$1LzOQYgUsz8w zGVErn{d&BO9^s18&omo7@*w+P)KfGM(MDfrDF^iw%^$SU3)|Rgu}T}g;AN}bVQ8Z- zH2YeV(#AaHVXNJZV52XzeJx69W1iCVwfpvM%u`yfc5k7LzR+~E_@s?_O0%YUe>Qq# zj;;3lFgAKbv;UOdBJDl|zO|#5eMaBc;*&Ogp0epH3L8D5S^lYB*L!*?ZG^GuBdU#g zO0%HdlVGDqG)?V}bQ|-Ow$<)4w9zBlF=)T`V`HAujzqgB!A6g0TkW0%8}pQAQ@dl| zMvrJnn)L06Uawi-YQK|jqerx@cK@M`ez~SB(k~9S8q={zznIu++`%IK;$*8aWsCGn zfUPz|Eiz(1#8!Kz)gpbQmC~59MSVQjR=kS z__bwgNJvOTY~&{&!z03CBO=5393BxF6B!Y%mHFaUJv%%iVvC+1q31_N#*(~s%hu3H zy?Es2OIO{(D}v7v+9onwdxhxRts(J|;Su2>ykRUnEG#kvt@wD}L$_?DhRBeR@U2@z z6CxuhteM%g8WI}HL1+ebTOru^)GLhrEi^J@OGs3@*50jK!y{v&x6n4Ny&;ht;^s?3 zAS5zg|A4uz5s_hWkx>y*SdNT}i{hX{wuYo{{ZxK<9C=Y34f!N*-4YVEY3kG4t-K9M} zI-5py%Ua(=gm0yhAzMPDv%?fjg@i}N#cJ&h+ZwhtBq~g^f<$4O_9ke%S^_r1`4Abc zeTt5cj*7%gXm-f&^P@KNBenblN&soNp8M}MA0Oz)Y5K8mLL3sBM9Iid?M9b?YYy(a{`PROIGa5E7aa9T`n~Q!uTyHzpLll$3}V8niVsIy#27(B4$N^zY4t zhKF$wG1_s_(ojJ9RC77kIML|T&@G{{yTcVsg+#_A#M76dTt^|HG2wbqHt2+fMkiwj zTQM;qQPB~}F)>lG+Nap0*qErTp&?w>LI?^I&3QIl;rjVp6e#Ej~uaM5e^XM#mws zamjJ9(OP@+L;pj5jFz7g6C1;L5TO^1{rH6y&1^`>CkdF+UYrHILc_LGGCGX67&&doy8-ab#-8MN7lNK>AZJ&I`T0oV@V|A{0!8M#Uv3 za_)vjghYgd#c_z6FTK67+pvSJxVVs**vM_MaWV06aWS#+sqt|!3>4u9LiPNZSS>$F z&qpUNp1oMw8>tng@a9Y3(GT>KlsFySO^8Fo@1y*MwTwevP?Yk0!p&GtserzC9+qrIWD zH$LK%V+jdmhKakE_Ql8Z9}*iEwLLCAHX%MfHZEaX0tZEV4~LRZDtN@kMeF&o@v-p< z+exMSqqL$F-hAmh`hk9u63>yv#&Fj23Jt$MJ|>>_-XE{EH;Q(mcK`j+iL^H~h9=S8 z(9nnn^un5%O)H!2O-$5!IELcj{i&CB4Sn3+#AA^P16o*gLTYkISXekyQD|6vuH%4~>hDzArujAZbA2y@~O0v^U~d82LIL|CUb!6B6$wF^u-2P5F;s znr1u$Md-h!&?)r)<|#!>5@HjWxF1M}3yqD9icXB6+yf89Br)@b#>U4d(iVoS2NO6T z-OQ$0X2{U^_@pHIfmcKX=zr?Pbr2iMs2#pFBI)>Mdt(x}rE;w@&qaoYCotn-kQX|U z;qjkIOh`!7614W*pO6^G=lF!A`;rpkLc+r$j)(DCFAy4+5ToaFG>J*~Q-bzJCu-S= zAHOtB%re7%l0v8O;;iQt7V#j~<05zi+_>oIqzKeL``MV}2u59SP6`i?qrDF$azMJ7 zO)IoFEFmE|IUzyo;fM(OO@8)JdmV);-5~5`AlL`e3JGl`Tk@MiuQgZ?DzSJv3fp7la%xsN`x^TB_*+w^zn;b z?C|=x6gq|1<|!2x@laBHBI}!nk`m~!n3&{9%02W@Y)WJl=UrlAGN&6eL`Y;xmEPX)xa9k`Ywcy~4GT|-;$SeCl!Oj5 z?q`#=eg4A|5@R1sN=`_o2}vmrq;OE-VUbng{~6@VUdp{$0yO=N0I@T_NGKq?vY30QuX#GC8f}JOgE1vCvgm#nN72-fWnfJ zQd2oD&U02||9g9}tPRGIsi&jq->~qwl>6^x)k%A!!y=NSIT#EkC$oT!ib#4WMcdat zCMLyxHaR6Rg(f7YJebNsu~2tcGd% zwrw02Escx>?@ztB4iacDLtf;zbI}SDR(O2sXYOMO8yTauHzk^b;jmItXm506@*}C* zzVbO--d}>c=m3HM1P( zCn>3%;7N&G<-Ee9{vb6mB{7P(Bu>yc+KJj9{6YNoC?;hvOrCMy+l+T-~`X$I!&MQ3X^V^bAlcIP_<^+w4+a871=RcotZ*&aT8Tyft3|TS% zd0Q%lH8Y!5S@DIZrrvw6c19-xS8|GO?&A$(Nuu7~(5QPa$0*TsX~MS8eul9riltR} zZ%?RAhMc(su zr)&f4M^maY^$~~L% ztDpbz-#-!mXE*e8lK$rB|K(xc^miGTjO2Rs$yB!JCG>Kec9QGKUrDb2I9)5W`C8Fa zR>Ja?uY|l$lyHj@LH$u=7AWuXiKEpjKZS2!rTO=Ns_cz5ndDAM$n1gwxM~c6=H~&kerTGsZy>RLLsiubyAAGvDzR6HsW%$CD*gg9X?LK$v zLeo8p@Y+0#PjB^B-Sg**7W=8_iD%V zzbS_3ivPz%{WyPLIz}t~!3WR(`-(Qpzh6STKa-#|lyQU-W4c3c6t}Z~NKv+sR%!e6 zk$-A`%jUjbPEo?NPf~E_?~2>w^%h3}^Z%c}@IMLJ6WS0p61SW@ne^vdD?;B1b%%X3 zqA}$A5qm-!LvO~t5V14X8?p)09 z)_)ECC`1i^sJK1!@i;%_r{c~~zBH~h?#Yna7+dVksK45t5_ddqO)DQ;AJ-oHX#9VQ ze`C86`$62fSP4C{_2tmNhu9{1wrU*zl4|L9*h5q_7}Gnw-%wq ze>Hwb{1>#pxNpY%WlZJ&xAN%!yYg`*5g(r_+wb3zCTDh}OVy4HN!gJp5A4X23p=t^ z%Z?m*bw{pJzavj++L5n3y`xZG+EFS|JId65*ikNjyrV+Bvg3q2yQ2!7YIJJQsYAzr zPBS{K^74*B@`lJ8MqtNxnB=!R%<{pGQG_Q??C_Gtulw%sBLQTI{1x(6<%6^|c`hwo zUQ5f6KTgY(htsm;g|uw>T3U|0pO&k%q~$5kq~$B^X@&A?TB%g0RgqRrS`BG+q!~zS zQNEeR??$F^-$xqvEuUy(`U_iEDoNI-ceJxyLoPnVa|GbA%TQ{A7QC3Wf9 z5|W;)7}E2UC)4wlm(mO6Yw1PG@$^#p^Yk)xIlWvSPp=}sn*18_>&Q2d*GyiE@Wd7WwSu-G}&*fbwKUntUgNdNVTQiy4{nXhxR2l#wm>W#q^Q8M#VBMxJsx zBVTzfqfpv2O66cinS^GP%f*ZebvUDne4gExQA2(m`3CZv$!}2}%NSHHWDJovj2ID% zyqiH3HG|)H&F~?9B!H~RyP0WfQD(Zll9?f2$jp?_W@gEEGqcsGOrHIo$uVT+DJ_}# z%FCIB(w14Oekrp|ZObfIXEH0)zsx+Y{&nUFIgrV*WLBeBgI*na2K1WI<5)7Upwop6 zqBDffFk(b3>KmE!q!ZW8smpoDbIx9_W$jXq5S(#Fol`ZL6 zdz7ZET;;!IDp6{(N~J8TLJG4g(XB$a8eN_g zmsN{yz4B^S1A6>Qe3k*d7UjoTgXj#Q!#ylnM&z2(p0!AtmwmoTk>y7Mh^n;jOq0@` z>GJ%}4Ed9tnexa^@Y>0_vNK2C*qN)G+?l7;?#x$S*a==cOJGIeby=gQ6sb$n+P z`8=_4XASw_w9`O-Gx^}Ob5Qx_PM%x0a~Lrq7WvuEMbf-ubKSQu#)9g&fYV;d33I4SeQzX|r497ugol z*W~c7GhWyd4OnGQmmOQg7Tej`Wk#~3HD#v%_Dc{_cuY7k`p}erGRQB&G zldxUo(y*&S9o@zAQFm37UqgN!`3CZv$>&#ZcMXy^MBXrBL@e^sE}rVW%geqG@go6b zOPMJEFQ!WQ{ zD%7`fPRNgQs?e!MhvUfMy3aA7(~M3l0vc@NB9aFYi9YkMIPB-Dz@V zce=c>n`>})rhINU*Wm7Kb#^zu^}9P)`PS|{<+yW#>y!#M85>TGo!+EqPLoV&fl(T!X)f;>E zD26?`%HQqDQ~vuN&g(q|%1e6=pvQT==djYgr$lMkQ!0PBr%ZM4DVIZgD&(_!c;@e( zD$4ML%srgndul0Dk2Ij)h`s^+X7pQ>U+fuF{&o*{xb5K%tvyDBb9@iqOWosTpKr13 z;rl6j0tn}LF6Tuq=Xfq-Z!Y6fF6Ve|wrt4-liXaTCO1zxmz%G&`TcQ5nxmDy>lV3xA9r*_Go5^ocPUN=AuX6{VQ8JqUfH+wmbz06H} z%hbQy%iOfLLT%rBLf+V0g%0D=UixS+$Fi5XX>T(+t@6FSgXA$D?PWaL%XqXGW@#_u z&|b!&y^KS98He)HdCGY25mEYu<my-MpxhFsKPEmfAWaVe8efc@^?fm`n zYJTCJFXxx4ck;{B-{zOggZUMA=kia;`TR5F)sc6WcLVv&8=tiS%XCS4dk$)=2-5bde7Vn4=5QrMZCfq=0L;Ad7v*!UE2d0_M(w zJmp&jjD-bUy9Laf1)L`ZjD-ai>dOVpodwn8GZq$b-4-x+7I2;vv?yf-t@2g@^Jl>j z`P_k6U__Wd3%tDZ8>`PM$_-^UtZANB8Jjj)e3!amjr`&c9FV~wznHNrmD z2>YmiA8UkttP%FHM%c$1VIOtwV~wznHNrmD2>Vzg>|>3vk2S(R)(HDpBkW_1u#Yvu zKGq2PscS!V?WeB&)U}_w_EXn>>e^3T`>AU`b?v9F{nWLey7p7oe(Ks!UHhqPKXvV= zuKm=tpSt!_*M92SPhI<|Yd>}Er>?>@dA=}Ro-WLgFBNkA6*4XtW=n2ij{K%DS9!89 zPx($E=Y3(Jyir&xrwc3O>xEUMSCh`UURX!EfpmU#yl{~8A<~BtBeKY6FYi9Yj|7zO z9N3}O97wwxd4M_PK*rs%1DSVL4`j*L5A0Mg9LSbGKd?*v>jODz!GT=Wcpy)89mrQI z4-}|BK2WH}9w=4|50t2{A2_Q1*8`<;@<0_j)#&gn+XJ=e)S+_$oknz;&@rIHe0QK# zes!RY&+X)O@ZQP$plUiWMA>1)h*;E&16I<qWlmzhJKLz z4dgm<1G$NOsD7;|?atSWGUN}6GH+!SWyz(Y>^tulai>&KzVbIkT*E~NlqZUcl;)zt zN?lRu?e7$o-MO!*{O*^Fj^FvuMK$Pf9T)MOpdtf#&E#E{@}d^yrJ^h3cin!k$f7<` zG|xNFPApnu|1SF~`*QoegK2W?AZx6H%y9=fpF@7Cn{5r_^b&w~19Ax}D z$oO@T@#`St*P%42JH$DAh;#N3=j@>@dHztg`qm-l)XHM>H%mANON!;E zC7g#PrRp0cW$M>T%GLi`QX%I`j?3Ya8g%Q>y?_qqV~GKsW^^vgg%Zxkk}K%6%Nr$~ zNSA!I#3F}Etmuv-6UZcDL#E{CCDX`^{HkPDeq1t#%*(zK&fk(X$^_BbK&~S%9NAi@XkK`-A zJW@znk#hRTVdb$Sr4n+S7dfE3Oek6db$(yBV>gCdOIarz@iKUshKUa!xS(+_H zr8)9iY2lr|QhdtNV)=P#sWg;U$f?pg(k}4Xz-OKXQOa7Ol(j;sMa?a>@;;7CAd`p< znUWutu8|jHe*?LW+(2$3AIcApF_#=;E;+_ra*Vm;SeAV27<0)n=8|K~CC8Xcj)B23 z=8|K~CC8Xcjxm=UV=g&H+mA7q9Ahpy#$0lYx#Spg$uZ`VW6UMTm`jc^mmFg*ImTRa zjJc$2heVX6sX1lo>JQ2?)RSeIcYa)!C6#46RVkz1vR(2gWjX3>*>3e#S*~0x%adoz z^5u=P0`dy)%$60aD`h2;R(4eWyo}>1<9NzWqFaS-HM%wE)}mX7?gexk(QQJPV=Uts z%i7p)C%uFBPTspI+k^BXeMmntfLuieu{ngzVZ?}7)GwD=DKm~tAd`p~P+f|T7rt|K>)o5+XiwelU3Ri384Ql75%muILimuKG1 zD9@5}6FLTTc!EfI8~g2~cktfHdpBizkY1z@=|={TtH>a> zENWf36}@p}0+~c?$dtsD+tG0#PQ-<{5f8F}EK+ujvO#n=kn6||QqIkI#+Q_PFIx4u8MMbvEsO#tf-<~HRWn3S4+7%%3YvLBW0Q> zW1!3>$~05vvYe^_n~E!xYa_26y$;?xdG8`^Q0}W3!qzZiL@a7vg_XQ&Ok{Ci0=YcrruIp3IbQo+LJQa*uN6WUlfLC-ao< zllhA2WP#Fl@_=&rWRddP$-~NXCrgxzCrhRDWSML^SuU4OR-#{pel_|v=+~l;k9@KL z-9~f`=r*Im=V?I%!0%p~IbpC%x?Z5I+(?ROPu!{P#-y_e%WtO8oaq z{P#-y_e%WtO8oaq{P#-y_e%WtO8oaq{P#-y_e%WtO8oaq{P#-y_e%WtO8oaq{P#-y z_ezef692st|Gg6by%PVu692st|Gg6by%PVu692st|Gg6by%PVu692st|Gg6by%PVu zDotLjqR*-_B&{k_zEG7VZB^M4QI#XVu44UF#rmr%UwNadP`+1Hq?A>a%I>N%b)%|W zPF7W@e_zG=tBUnkRSi0I=orXvCZF|R6?0z|>#r)-UsbHXsx0bPtC;($Sa(&i?y6$l zRmHliYEAv>sSJ7IRHjs)%9eyvdzAC1a+SY1m8bmEseHw9in!gW1Im-9ij?o2qTf!H zD5p*l<2+TS-a1t-=T8x1I#o%TD#}z-riL=a?@kfFJ4N4}YDAxy=c#7&TSyy3ZwNiU zjdse2TvJ{+wMd$meILT_x10(fs`5fLetk9Tz-s*ZYW(_Y{Q7GA`fB|8YW(_Y{Q7Eq zf@=KwYW(_Y{Q7GA`fB|8YW(_Y{Q7GAfolBvYW(_Y{Q7GA`fBFtYUb){{Q7GA`fB|8 zYSx9-`1RHJ_0{ub{F<(hPPwkAW;YclUVS(7C- zHQDO*nq1{{O`g(N!bQjkTrnY;BpO*OtqBwH2zlmcFa4 zqD(bqYA91n8Tzia0sThw4d^$c-=cKX4x-2RE^GPTV673khRz~sUiN*6AK^DRYE|XM z(_nNuUEV$oMyE674^L;wtEaQ2;B>C?^yxhE^Od(w7s~ffgVE_yIeWT_^lH*;NUtN^ zKpM~9Iz6a7b9#vMVZ?~=JN~D=y!#M85>Q?|LtSU6>kM_Bp{_I3b%wgmP}dpiIzwG& zsOt=MouRHX)OCis&QRAG>N-PRXQ=B8b)BKEGt_m4y3SD78R|MiU1zB440Y8}R~@m~ zI_j#Ut~z3Fb<|ZyU3Jt|M_qN)RYzTQ)Kym@Pt;Lg9re{wUmf+;QC}VP)lpv^_0>^d z9re{wUmf+;QC}VP)luKsH2LP)bb0A)hCFySQ|>!U-1Tg>{OQ>o`Qh0-rTi>$o3n+| zbhcEUI9ttU;xuRL_-x=avAnZ(P3A?s|OgdVKDBeC~R#uX=p$di07T%PjmIWRrP7L|iDBD;Fx%f4#tbbfJne)s(5BOf7o#%J(ib@Xqsb zFBs5oM!!XQ^THr{L+J6%-U~+L8aj)l@w*Zi_&tmZek6dX%Bv0d-3^Sl4fx#+_}vZo z-3|EN4fx#+_}vZo-3|EN4fx#+_}vZo-3|EN4fx#+_}vZo-3|EN4fx#+_}vZo-3|EN z4fx#+jIRy&-3|EN4fx#+_}vYRtqu6y4fx#+_}z{8-HrI&jriS-_}z{8-HrI&jriS- z_}z{8-Hn`wjriS-oQsY4-HrI&jriS-_}z{8-HrI&jriS-_}z`1la2V@jriS-_}z`1 zla2V@jriS-_}z{8-HrI&jriS-_}z{8-HrI&jriS-_}z{8-HrI&jriS-_}z{8-Hn{X zjriS-_}z{8-HrI&jriS-_}z{8-HrI&jriS-_}z{8-HrI&jhyR^_}v%NB*ii^3*s~7W>?_bPU{^??YQg!iwQgg9LdFtX}rSW2^JaVy2oxE5sxfd(Z ztwOgN-5PXj(XB@s&@-Udj9!cK`o%$|{o)Wh!-x^F$S*GP?BR=xqeiVoYnwlJ=%-+1ivNKW`#_-;}3ZY2q4ef?H|g8f+p)+*GD6H4!6j zs!%7Ih~GC=qr-LB1jo`ujJTKDYrN+<*^mzz4s?*nWwz{SssQ zC2+WuB~M>sY`?_Veu=UD5*S=!9J&Msml)eGF}7b~Y`?_Veu=hUVhp;(*nWwz{SssQ zCC2tkjO~{g+b=P;Ut(;(#Mpj`vHcQbd-D!SXiigiH>ayVZq888G-uxVWixGV-YMbD z*>a$Hmt;2QsIKPSa!+%vv^M9-%gy=nPICcyg?C)d;L%*H-fS+BoaUp@7U0rcAyv&M z(XT?k8vPpdYtgSm{{p&==r*AXX3b#M+{S)8=^eax^4?9^9;6rPL;8^c$QrhSl-)qCBR7zn z$cO5}W!A};S#Mp=kR6wak6y;NxtuL|mviKom*Foi=P9k1Stnm6PIMmEv z_X+rkrWX zmRDNfvRiVMpSR>GziGi|Xem%GwZLV!;4`$~GqjW_kGGU7UvGiOZmB}A8a@1kmRj`c zmDgMF6Iyuwc}t7(LCc`>vz8(9hY=%!f6%f>nwNba;zt4q{=pUe$t(DiSMVpV;7?w` zpS*%Uc?Ey+3jX93{K+f$lUML3ui#H!!JoW>KY0az@(TXs75vF7_>))gC$Hd7UcsNd zfFyn;X33UA$-E-$oZ$Y)yN7+SNWyfs^PwdTl= zTJx0BR(RglLOz$uitCx2l;zt6=nq;@ZUACpm zyKNbAxGhui+Op&~ZQ1gK-+17xL0i9-acy?-AxBRNDM}FHjsC>K4B)@1I;j>wO*JhO;w~fnB z+9u@JZPU`#HX}c8o0VU-&GY#hHtgs*D95wM+LkD{%;y!#1u3^dx$EfNqTEN6yG^;f zd{&j(c6^m~=FWEJ&h|{XryXCVJzKrnj<3?5uhg{DU+t`=+VNG|@m1Q(<>7XGmG%?T z+FnCGeb>%9s-3=T$5&~`S7~pRZ?`k1wKJx*cge5Y@m1PQ^1XKE(sq26c6^m~i<;Vw zuhPCmI`e5ezDhg3O8Xk=BERkc=MHf00Ot;H?f~ZwaP9!-4sh-O=MHf00Ot;H?f~Zw zaP9!-4sh-O=MHf00Ot;H?f~ZwaP9!-4sh-O=MHf00Ot;H?f~ZwaP9!-4sh-O=MHf0 z0Ot;H?f~ZwaP9!-4sh-O=MHf00Ot;H?f~ZwaP9!-4sh-O=MHf00Ot;H?gZyfaP9=> zPH^r7=T30$1m{k0?gZyfaP9=>PH^r7=T30$1m{k0?gZyfaP9=>PH^r7=T30$1m{k0 z?gZyfaP9=>PH^r7=T30$1m{k0?gZyfaP9=>PH^r7=T30$N|TFS>GF-P40*UK^X~7u z;N`mDD|B2L}aD(`o-$#1(l5bE#hmgl>A z}0@4D>Rbzs+tt_xi^x*qH_F%EPw4s@+yGl*=Ee;wT$=-y-MiSO{oQGDshhd88}6(d?yMWXs5@J=b?3-C-NZ7wiDh)-7k3lG z?=F?3Zuo@ma!KzdhS5z7qZ?nioA`aVfjqc`ZsJkhZSrz=2ht_acX!MA?jC9E?v-b| z`{ecRetDyNK-#(om2=%DY3Lq7%<@b(oOt(`yxVP+i{0a5=$=4ll4Gz*NB1-~X0S1f zjX8OvIk6hz@!IEdcdTo ziag>2JvHQkNe`IxfJqOS^t5541L=|{d%ERpPmi4M>6LHw^vO#-{m1}$+)vYEl5;&H zQr}~i)}B#$u4hbs&|{SgJ>$~QGr_S<%9}klWJ-R~GmV`Y?95_k4jc1ws>e>6gES{; zF4EkH2ix46)3b!_Wo)ltdllR3*bZWQ1KZcJeFM8Ukq@zb3p*cS=QeikVB;>fMV{R;LZw>i%02d%NY8-X3|gw^v^6?URn)e$off=N`9S zlf2M7A}{rtrM(xQq<2hy-D{=HxO}g70-Z_uSubnG-f3*iU}F{=bCjQ#@AleBbCBjF z&4pbz=^n~(k6iB(c9*fcf?fQY-gWE-vAcoY>*(CTF6+(STiEyr8@I7>hw^u^EAo0D zxb%TbAGq{^OCPxOflD8_^nptsxb%TbAGq{^OCPxOflD8_^nptsxb%TbAGq{^OCPxO zflFVTyw}%(fJ7TTo1yG1Ho&ECUS8|7ljb1JNt%myaOv}47hL+5u)B=i73_jb z-#T`K*xkS`K2+Zg?1D?*E%H91>}_m-OW$4Wf=fTR^n*)3xb%ZdKe+UROFy{ugG)cS z^n*)3xb%ZdKe+UROFy{ugG)cS^n*)3xb%ZdKe+UROMjdEw7&!Cl2`h><%j(}($(K9 z9sPasZht?Y2jsneaOpS6%l+JU)6aa+&wS87Cco{sQa65MKR!l3xb)lPC;iiunZd>^ zd2{T~bDVbG9i%z2>%y*^&mQc8OaBsfxo@YR`J|uuq<KS?B1fx zN7%Sc-W~SuVprsq0mhgC#@zwNm;uI^0mhgC#+U)(Lj$?W*#XAgfqdoL1B@{Pj4=a@ zF$0V-16AZP?he$D#~3rf7&E{aGr$-#&?avVbRdko1KslMK##mQ&`TYC^2R_v=>yU} zKzwZ9!*qOx+WADJc zv<}!wbCBjF&4q0@=^n}vryf|s_A<6tu+7*zu#W8@wl}bS9i1E4X6zmK5Zkw~^AUD# zV~6o~;4Zcqf3K#=*RQfxxXN1LDr<$SS@OhH)(Tg1;VNr|tE?5S){)Oz;VNr|tE?5SvR1g-F2A_ii7;1RWvy_PwZhdA`N37r zjjN;b)>YODS6M4uWvy^^nRNR0>MH516|OQ@4yH-_AaSR`4B0uDDPJ1QVn17A2l2HB zxyNKMUwM15P<}L6q7in#10_G!5CY??BJVXVx=AZtQ!o5B5V#*j`3fD8Gt* zV)sMq*bicV1N+x0cLV!3$^VeD%;7`K;X}8ve+PSau`lx6FnA4v*D!bugV!*44TIM( zcnyQsFnA4v*D!bugV!*44TIM(cnyQsFnA4v*D!bugV!*44TINko4hj&Uc(){gV!+Q z&v3WAINT$z4zunX?vw8i_sjQ&2js0`@ESJBv%@3u-C?u5G(3t9cny!qd&5@h8OPp) zJTp9r4V$zLPf^#jJUu)k&kwWK8J;7Zd285?eFtS({|&pa@5a6d``|Uagx)ebE7)H} z2fT*Yu^+_#2KKLG{|0t$V*f+z-@^V!*k{c%e1~-AuVKa`BX}9X%LraZ@G^pz5xk7x zWdtuHcp1UV2wq0;GJ=;8yo}&w1TQ0a8Ntg4UPkaTf|n7zjBV0k1TSL;@8D(Zk{6BL z@|v+nerW8Kw~T%Awy~ej1M(vyco|LdjB!L>Fq-9M<0t}NM({GSUN*8`HnLtevR*dY z^^H*92=$Fn-$;)9Y=nEh4j@e4~$apD7?ui^^Q{SDD{p~??rk)Qtv4Bj#BR^5umh5Mr|+#hY>{%8yLH(9tp+QR+O z7VeL>Fy>o077O?GSl}5f+-GOu{%8yL*;%+h+QR+O7RG!F$7bO^9}9egh5PI*+#hY> z{%8xwXJOp8Fz#Cz_bnWcg>m1)xNl+Hw=nLHrAh5rx;#0?8exnz!Wj28j%BN_kL5_) z7~h2$-SYZakNjY)SKb`!=0UGYitf1^VqhN<{-_9Z5Quu(mmK-#P$-lm$A)Sdu$ck z>(~fldjs3ov3&#EH?jR8>9?@+5#?`V`wlklVq4@XEB8QJxu4dWA*t3(dC&^)V9i#? zti+tH+q1Bp0nC2-W4m=sx~x_)SjXj( zm35SLQaY?Q`3vhbHfBg?4P~99{JcD2wUg$+E^8>O3%hR8SwmUzU#&~nTt-+!SsBx< z>(~uaegnI#p{zHsdlS32u<;S;te>oRD1R5b_-Nx`GY&T6U^5Oj<6tumHsfG34mRUp zGY&T6U^5Oj<6tumHsfG34mRUpGY&T6U^5Oj<6tumHsfG3-X>3tcOYHTJl-uA#(U)A zc&|J&&N^Yd9~nRgY{pH}I6i`y<=f+<^1}F-{KdFcn#S?%$0x8kDQ}P4kSY1~_%wEA zurrIDIc&_!H^%LxIY@Jo#u{PVjd-vPKI2Q+T}D>0y^8I1YzMK8e?NX5+c&U#6ZsI^ zx3KdOc5Y+m4mR#$Tcmjcj3&Tn0*ofWXabBTz-R)DCctO{j3&Tn0*ofWXabBTz-R)D zCctO{j3&Tn0*ofWXabBTz-R)DCfcNZq61+qHPKBTF`@vqqtdhp{H4((_26nIW`3833y(Vs9<0EV^w@uu^?p^G%cACtP z%E?Tro6MHaPQr6e<|_XSw)#@%G6M%mNM|1lkl9Ajp!TDhv%Gx=bVJ+oaBC&Nn-kwM&+qVc+N?9&PlIw zagzI8CW-4$21tkJv~gTEj?2bz**Gp6$7SQVY#f)3}fByk#TKZ{xUZ9G9&b{TAg7+aP*FO0$jc7uw*zY{dI* zi==TMj?G6p-!Zhof7yulPo+uoRJvT4%8-YqxF35eOHNL4U+xsX+!XPmsXXPv6tVXy zzUMWCFE@oRH&refQx$6U)CqZJin!5KH9ExOr}(bd6h7S)KHXHSJUxZ4GR5z9PYo+& zQzrS@)QJ3c%8ZQ4uclaEPx;96lea|PGU+SGDtWApr|?;()8wgXj%_+aK0nQ|O=n5d zbhiB2H2(K=u2MHmENePnd1{*Te7aP=IZd2%x{7q-SkpD6b8b%?NauTJ)2;HWX?)CS ze9Y-C>6q@8`sp5Q_sY}Lee&uw>$vFw^oe6lo8Z70n^nv*mawpqhXdniX7YkCRW%h=}npI#-6 z>wh|k?G0>m{ZHS(_DyW#V@}_~&PUj}jh#E#VE&jE>6qcZ-I;VT%y8fC4EOEMaNq6> z_s`C7@A6Epa$zPP6!dmY=% z88gfoGsHY+z+~no0#7u~vtTj{CbM8N%egYk zc|6N^1!swS&VtD-n9PF7Ea&bl-w&K6<~a){vtTj{CbMnwp59Vy_Ps#gp)0CT$AI;5@Ph4hho@2I?=D@a-G#9psiO+ek z4IXn#*e1R?$M?+Uh|A2aV>^i62KKIFn>k_bCi@>^`xfOs!uDVLXcuKxFH6?Z>>?YR8%+6lGj z8sBfd#`jyV;Tv45L(hO-GkRCZZovaTdd-N;lg4*lukl^iYkb%B z8sBxj7C`QjF7it|F-1EuMLYh29e=@2OwmqE(GHhmhs&`OQ?$e7*zp(a%tLnOAv-Ze zJ6w*Pn4%pn$Bw^XXa2D>|Jd;t>~J}DxEwn%MLS%M9WKYt*k*^zv2*U)8QbivW$bV{ zcDNinT#lV{*AACshs&|E-m^2d+2L~RoV#}7L3ZLncE&Y3=dB$s#}1cchs&`uuG!&o z?3}lD#x*-@89Q8#9WKWXmt*I=wZrAu;d1P(_3VsmcDNin=dGPMkexV?oiWYMIctZ@ zu@g&lfQbVx#{nh|FmZs1156xnIS#I42lJnU>(~J%4lr?mi33a=T+0sTKnK^d156xX z;s6r|m^k2a9B?@f`~wGEjsq^o0hi-|%W=TvIN)*|%z+NL90y#E11`q_m*arTalqv` z;Bp*rIS#lS2V9N=F2@0v{C$V`av3aL~ zJYw@sV)IV894B0k6VAd3m*a%Xal+*|;c}dC7EZVvCvgEMT#l3R&WVrdgtKtM3juXzp376x9%W=ZxIN>au#KfF%IZn77CtQvbF2@OH;e^X^5?64-aua5+x694B0k6VAd(EX)aK;Q|*IxVXT@1uiad zae<2qTwLJd0v8v!xWL5)E-r9!fr|@VT;SpY7ZQT#gGa#|17fxEvQ;jtefw1()N3vv7fn3oge6m*axV zae<2qF2@CzY8*&f!}9>!e{T#g4W$3qOl1DE50%kdC{@WADG;Bq{0IUZsV9>!e{bEO9^ z#{-w+AqL@r%kePodRS+B;Bq{0IUeE=9>!h|T#g4W#{-w+Ar9ez%kjYFc!)!I;Bq{0 zIUcwi4{-<&W3Pv~(gT;{fy?m_hw#AVco=&(&X)tW-nZhw@+U4;*WUYa=c*XHOVFKh#0(Z zIbQq`FR^wnewx=R)!uQb@xtYJC$YhIh`dwsmX|ro%N*r}%kj>UJ}(VkJN6yehs*K0 zu#ZpTh0F1Ry>|)w%h-p@@#2$siM4z2)x1IMZ(tuT$9n@id=JU{A@-T4yv$QxxE${t z((huQbI1o?KJfB^mk+#r;N=4^A9(q|%LiUQ@bZC|54?Qf2Bc|np`|^R854?PEUp}}mA9(rTzI@>2 zgZuKqefi+NeBkAS`|`nk`S8tstaW^>b$sCEgZuKqefi+Nd~jbr@bVGY^1*%iz{>|- zKDaL*+?Nl$d~jbr@bbZZ`QW~Ma9=*~^1*%i;J$qL_deD_c zefh!55BKEm2`x(Cj;1vL` z0C)w!D*#>r@Ctxe0K5X=6#%aQcm=>K0A2y`3V>GtyaM1A0IvXe1;8r+UIFk55Ni*B zSAckX0K5WlUjewU0Nhsq?kfQI6(D93fcpx7R{-uS0QVIj9vFc83V>GtyaI4v0l2RK z+*bhZD**Qufcpx-eFfmY0>lLaa9;tquK?Uv0PZUQ_Z5Kq3J^C5zmf^mZ zsc)J3mf^mZ;l7sPzLu$PnfjKgZyD}u8SZNt?rRzDYZ>lq8SZNt?rRzDYZ>lq8SZO^ z`c_!ytWe(y^{r6f3iYkPL9MXPSz(>C0tdB1eJj+r!rEqqwap3~)C%>jP~Qsmt*~ZU zf%{s4e_Db2T7mmof%{rv&9MUawF2j~0{687_q77|wMxCKa9^v`yGp&Q)VoT(tJJ$n zy{pVitJJ$ny{pu_O1-PhL#x!gO1-PpyGp&Qa7(LjU#oCmtJJ*;_q7W5wF>vO3iq`N z*R%@vwF>vO3iq|jaje39t-^h+!hNm6eXYTLt-*b*!F{d4eXYTLt-*b*!F{bUN3L-! zYxuZpa9?Y1Uu$q*YsAOb;J()2zSfu{*EqH{{M$9SuQj-@HMp-exUV&iZ;g3!jd^m7 zd2)^8S!14DW1d`No?K&|T!;Hwhx=M*O|{ONY8~!t9qwx#?rRs*iPT#M^)U+ZvR>u_J|a9`_iU+ZvR z>u_J|a9`_iU+ZvR>-Z(>a9``h<=5f9*5SU^;l9@4zSiNs*5SU^;l9@4zSiNs*5SU^ ziCwP4eXYZNt;2n-!+ov8eXYZNt;2n-!+ov8eXZl0tiye+6PsU$`&x(lT8H~uhx=NG z`&x(lT8H~uhx=NG`&x(lS|@h74)+y=y9mNv1mP}%net!|?ji_x5rn%4!d(R6E`o3u zL1MZ=xQk$!`j0{SCJ1*Cgu4jBT?FASf^Zi>;=4h(i(oT4a2G+iuOQr45Z^XPEHg+f zGswC#2=^6)`wFt|4C3zxiDd@izJjbfgN*G#xUV3w%pkGMAnVQ`+*c6pD@YtO2=^6a z%^8II3eL+DLE@M};+R3!oI$v+Alz4wHD?fiKS&%i2=^6a%^74&55j!~iDL$dV+L7s z2I0Pfa9=@Um_fL&AnVN_+*j}}cJXO9z-9w%Ho#^BY&O7V18g?HW&>AiaN&|0#}?^Gb0B?y zIpkPvSGxaF+r=!qrSNV1V+BgsZ$U-D7@#l9r=C9yAweMz1ZB=#k-FG)5M`;ydo zCADvfeMz3FB=#k#g-B}O68n`P)_68npaNRg2u zBSl7vj1(CuGE!uu$VicqA|pjcii{K)DKb)Iq{v8-ks>2SMv9CS_NA~d#j}*cz7+PQ zurGyuDeOyOUy6(r_NA~d#aySbFU2*curGyuDeOy8>r~j6!oC#trI_Os_NA~dg?%aP zOJQFM`%>7K!oC#wDC|pNUy37KqRy$XFNJ+6>`O7XDeOyOUy5fZ zjWKDANn=bJW6~It#+Wq5q%kIqF=>oRV_zC$(ioG*zBI<9u`i7=X^cr@Od4a-7?Z}n zH1?%2CXF#^>`P-`8vD}Nm&U#{_NB2ejeTkCOJiRe`_kB##=Z>WGK|YGF2lGC<1&oP zFfPNm4C6A4%V1xIaT&&CurI^74EALhmtkCnaT&&C7?;7m4EALhmtkB6`!d*^r50+jFU#83QeU&!m&Lv;_GMZ7 zTGqZ6`?A=V#l9?cHj8~(?8{|n*q5X3 z=ddrwXWL<44*PQ0mt#%tSd%;I*ADw~*q6h;9M0o-j&s|n*q6h39M5nL`*PI%9QNg~FUR%o zs9`&50`?WK zuYi38>?^Q73fNb`z5?D8u&;o91?($eUx8=+fPDq*D_~y%`wG}sz`g?Z6|k>>eFf|* zU|#|I3fNa*T@{_yPM0*jK>50`?WKuYi38>?>ej0s9Kr zSHQj^SwymkWD&_Cl0_toNEVSSB3VSTh-4ATB9cWUi%1rcEFxJ%vWR36v9E}IMeHkL zUlIF?*jL29B7P9DuSgaV`-;?pBlZ=kV@2#MVqX#air80VK8R27Gxim+uZVp`>?=~o zir81gz9RM&v9E}IMGPTgUy(c__7$lIN9-$7$BNij#J(c-6|t|#oDdB^V_y;bir81g zz9Mz3hj9VP6URO4wJzz7qD8u&;!DCG0C?>hk3HwUeSHixM zV;}4*VPA=RN5Z}m_l}HxW$Y_sUzvMq=6;{CuZ(?V>?>nmnRP+NzB2Zev9FAMW$Y_s zUm5$#*jL8BGHZj3eP!$`V_zBj%Gg)NzB2Zev9FAMW$Y_sUm5$#*jL8BGWM0RuZ(?V z?5ohnRp{d?^l=sXxC(t-g+8wGqViCokE_tfRp{d?+~W&xT!lWaLLXP5kE<}(?Y#WeS6{j6mi3~U&)Sn}QNKo)*Wn%4Q71 zFW(_fR&84^9})F@S}o4rDeCj}pYPgRHtn>2_h{Ky)B3#XU-76|3@3ii)!Qc?j_}^y zu72O>{%KS9yyC_CFV9aF7uBTxz(M`Mq^+@#b%(Tuj^0kRg=}S{`Bag>Z@5_U7UU9D#(bhO#|yW-lg-S@<`VY}~-uWh$` zd~|KI-48AuEzf=^?i)`2BXK6?DUiI@ph-5isNCUCq~Dcoqr~d7cFn{lj8cY z-&5lHu;0(e*SGuqVsw48{V&D+!|#8!_p-CDpa1%R&+0j!#glgN8?jFMM*Uk+4V(OK zTx}2Wdr=Li{==x+9O{pI)jFI%?N;@l_b0c)d0O!Page`=dN{~m$MyCge;e_ZJ@?sq zMl{2Ae;53Zu6U=P9XH$U{xNDc+x_!Wy*&Gum=7oax9EnQr09m7)VSO3q(wJuWJcX) z=l_UlbEBEoR&+y1POOIgy;u$Vhw*B=e;lng`z3L6_7|EsxS?HKiPaULJvZJsF)u zPDt!K?BZgm_r<4R`?*P=qwS40J)z#0!a#d;5kAKbELS3Lf&=6=eGʗ?}-|5(*0~ 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�-NX_9KY-iw| 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

p^~%1 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
ueylZOjWyc3Vg-C@ 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%0DE>VcAEINjZ< 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 D7w9xt literal 0 HcmV?d00001 diff --git a/web/src/assets/fonts/font.scss b/web/src/assets/fonts/font.scss new file mode 100644 index 0000000..cc0ee58 --- /dev/null +++ b/web/src/assets/fonts/font.scss @@ -0,0 +1,14 @@ +@font-face { + font-family: YouSheBiaoTiHei; + src: url("./YouSheBiaoTiHei.ttf"); +} + +@font-face { + font-family: MetroDF; + src: url("./MetroDF.ttf"); +} + +@font-face { + font-family: DIN; + src: url("./DIN.Otf"); +} diff --git a/web/src/assets/iconfont/iconfont.scss b/web/src/assets/iconfont/iconfont.scss new file mode 100644 index 0000000..5de2a60 --- /dev/null +++ b/web/src/assets/iconfont/iconfont.scss @@ -0,0 +1,44 @@ +@font-face { + font-family: iconfont; /* Project id 2667653 */ + src: url("iconfont.ttf?t=1691032190261") format("truetype"); +} +.iconfont { + font-family: iconfont !important; + font-size: 20px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + cursor: pointer; +} +.icon-xiala::before { + content: "\e62b"; +} +.icon-tuichu::before { + content: "\e645"; +} +.icon-xiaoxi::before { + font-size: 21.2px; + content: "\e61f"; +} +.icon-zhuti::before { + font-size: 22.4px; + content: "\e638"; +} +.icon-sousuo::before { + content: "\e611"; +} +.icon-contentright::before { + content: "\e8c9"; +} +.icon-contentleft::before { + content: "\e8ca"; +} +.icon-fangda::before { + content: "\e826"; +} +.icon-suoxiao::before { + content: "\e641"; +} +.icon-zhongyingwen::before { + content: "\e8cb"; +} diff --git a/web/src/assets/iconfont/iconfont.ttf b/web/src/assets/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0c6bb6a3c63f62c78e8ae1529e2b7705320a8eb3 GIT binary patch literal 5088 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 RM>S1oLPy$Z*?!Xn{smN}-zWe8 literal 0 HcmV?d00001 diff --git a/web/src/assets/icons/xianxingdaoyu.svg b/web/src/assets/icons/xianxingdaoyu.svg new file mode 100644 index 0000000..edfac8d --- /dev/null +++ b/web/src/assets/icons/xianxingdaoyu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingdiqiu.svg b/web/src/assets/icons/xianxingdiqiu.svg new file mode 100644 index 0000000..e13cb00 --- /dev/null +++ b/web/src/assets/icons/xianxingdiqiu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingditu.svg b/web/src/assets/icons/xianxingditu.svg new file mode 100644 index 0000000..ef1bdda --- /dev/null +++ b/web/src/assets/icons/xianxingditu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingfanchuan.svg b/web/src/assets/icons/xianxingfanchuan.svg new file mode 100644 index 0000000..2c2da28 --- /dev/null +++ b/web/src/assets/icons/xianxingfanchuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingfeiji.svg b/web/src/assets/icons/xianxingfeiji.svg new file mode 100644 index 0000000..e4d9a87 --- /dev/null +++ b/web/src/assets/icons/xianxingfeiji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxinglvhangriji.svg b/web/src/assets/icons/xianxinglvhangriji.svg new file mode 100644 index 0000000..2e1e47d --- /dev/null +++ b/web/src/assets/icons/xianxinglvhangriji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingtianqiyubao.svg b/web/src/assets/icons/xianxingtianqiyubao.svg new file mode 100644 index 0000000..3283580 --- /dev/null +++ b/web/src/assets/icons/xianxingtianqiyubao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingxiangjipaizhao.svg b/web/src/assets/icons/xianxingxiangjipaizhao.svg new file mode 100644 index 0000000..93ff9f5 --- /dev/null +++ b/web/src/assets/icons/xianxingxiangjipaizhao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingxiarilengyin.svg b/web/src/assets/icons/xianxingxiarilengyin.svg new file mode 100644 index 0000000..87132d1 --- /dev/null +++ b/web/src/assets/icons/xianxingxiarilengyin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingyoulun.svg b/web/src/assets/icons/xianxingyoulun.svg new file mode 100644 index 0000000..487e1ee --- /dev/null +++ b/web/src/assets/icons/xianxingyoulun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/icons/xianxingzijiayou.svg b/web/src/assets/icons/xianxingzijiayou.svg new file mode 100644 index 0000000..449c610 --- /dev/null +++ b/web/src/assets/icons/xianxingzijiayou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/src/assets/images/403.png b/web/src/assets/images/403.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5ec7c7c6fc51e7118b2857d5c2322b0433ab81 GIT binary patch literal 12713 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 literal 0 HcmV?d00001 diff --git a/web/src/assets/images/404.png b/web/src/assets/images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..2333586e41590ab1684dfb8ff71927ad96f8d3a5 GIT binary patch literal 7788 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 literal 0 HcmV?d00001 diff --git a/web/src/assets/images/login_bg.svg b/web/src/assets/images/login_bg.svg new file mode 100644 index 0000000..0a9514b --- /dev/null +++ b/web/src/assets/images/login_bg.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/assets/images/login_left.png b/web/src/assets/images/login_left.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ebc1163e49e562efda757fe7c2509bec735b5f GIT binary patch literal 35966 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

- - - 测试分页查询参数 - - - - - 姓名 - - - - - 组织机构Id - - - - - 添加测试参数 - - - - - 姓名 - - - - - 性别 - - - - - 民族 - - - - - 年龄 - - - - - 生日 - - - - - 排序码 - - - - - 存款 - - - - - 修改测试参数 - - - - - Id - - - - - 测试导入 - - - - - 姓名 - - - - - 性别 - - - - - 民族 - - - - - 年龄 - - - - - 生日 - - - - - 排序码 - - - - - 存款 - - - - - 测试导出 - - - - - 姓名 - - - - - 性别 - - - - - 民族 - - - - - 年龄 - - - - - 生日 - - - - - 排序码 - - - - - 存款 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 检查输入参数 - - - - - - 获取Sqlsugar的ISugarQueryable - - - - - - - - - - 测试服务 - - - - - 测试分页查询 - - 查询参数 - 测试分页 - - - - 测试列表查询 - - 查询参数 - 测试列表 - - - - 测试详情 - - Id参数 - 详细信息 - - - - 添加测试 - - 添加参数 - - - - - 修改测试 - - 编辑参数 - - - - - 删除测试 - - 删除参数 - - - - - 测试导入模板下载 - - 模板 - - - - 测试导入预览 - - 预览参数 - 预览结果 - - - - 测试导入 - - - - - - - 测试导出 - - - - 机构服务 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index a1bf71f..25e5915 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -277,86 +277,6 @@ - - - 测试控制器 - - - - - 测试分页查询 - - - - - - - 测试列表查询 - - - - - - - 测试详情 - - - - - - - 获取组织树选择器 - - - - - - 测试导入预览 - - - - - - - 测试导入模板下载 - - - - - - 添加测试 - - - - - - - 修改测试 - - - - - - - 删除测试 - - - - - - - 测试导入 - - - - - - - 测试导出 - - - - B端登录控制器 -- Gitee From f2fd224c2e5720554760cf7d37d99838fa596bfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=91=E6=9E=97=E5=AF=BA=E9=A9=BB=E5=8C=97=E5=9B=BA?= =?UTF-8?q?=E5=B1=B1=E5=8A=9E=E4=BA=8B=E5=A4=84=E5=A4=A7=E7=A5=9E=E7=88=B6?= =?UTF-8?q?=E7=8E=8B=E5=96=87=E5=98=9B?= <531035580@qq.com> Date: Mon, 11 Sep 2023 23:38:46 +0800 Subject: [PATCH 17/70] =?UTF-8?q?docs(=E6=B5=8B=E8=AF=95):=20:art:=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/CHANGELOG.md | 2 ++ web/package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/web/CHANGELOG.md b/web/CHANGELOG.md index da2d5b2..43a8af1 100644 --- a/web/CHANGELOG.md +++ b/web/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +### [3.1.1](https://gitee.com/zxzyjs/SimpleAdmin/compare/v3.1.0...v3.1.1) (2023-09-11) + ## [3.1.0](https://gitee.com/zxzyjs/SimpleAdmin/compare/v1.1.0...v3.1.0) (2023-09-11) ### Features diff --git a/web/package.json b/web/package.json index 825a3a8..e7fe91e 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "simple-admin", "private": true, - "version": "3.1.0", + "version": "3.1.1", "type": "module", "description": "小而美的通用后台管理系统", "author": { -- Gitee From 5774f5c7a38ac9ddbb4a83be18b24c030060e5a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=91=E6=9E=97=E5=AF=BA=E9=A9=BB=E5=8C=97=E5=9B=BA?= =?UTF-8?q?=E5=B1=B1=E5=8A=9E=E4=BA=8B=E5=A4=84=E5=A4=A7=E7=A5=9E=E7=88=B6?= =?UTF-8?q?=E7=8E=8B=E5=96=87=E5=98=9B?= <531035580@qq.com> Date: Tue, 12 Sep 2023 20:14:57 +0800 Subject: [PATCH 18/70] =?UTF-8?q?refactor:=20=F0=9F=A6=84=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=94=99=E8=AF=AF=E5=91=BD=E5=90=8D=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/.config/dotnet-tools.json | 12 + api/.gitignore | 365 ++ api/.husky/task-runner.json | 13 + api/LICENSE | 201 ++ api/README.md | 92 + .../SimpleAdmin.Application/Entity/GenTest.cs | 55 - .../SimpleAdmin.Application/GlobalUsings.cs | 6 - .../Services/Org/OrgService.cs | 14 +- .../Services/Position/PositionService.cs | 4 +- .../Services/User/UserService.cs | 17 +- .../SimpleAdmin.Application.csproj | 4 + ...4\346\255\242\346\234\215\345\212\241.bat" | 9 - ...0\350\275\275\346\234\215\345\212\241.bat" | 10 - ...7\345\212\250\346\234\215\345\212\241.bat" | 9 - ...1\350\243\205\346\234\215\345\212\241.bat" | 12 - .../Background.Development.json | 10 - .../Background.Production.json | 10 - .../Dto/MqttConnected.cs | 25 - .../SimpleAdmin.Background/GlobalUsings.cs | 10 - .../SimpleAdmin.Background/MqttWorker.cs | 67 - .../SimpleAdmin.Background/Program.cs | 25 - .../Properties/launchSettings.json | 11 - .../SimpleAdmin.Background.csproj | 47 - .../SimpleAdmin.Background/TestWorker.cs | 27 - .../SimpleAdmin.Cache/Cache.Development.json | 2 +- .../Service/MemoryCacheHashService.cs | 10 +- .../Service/MemoryCacheService.cs | 5 +- .../Service/RedisCacheHashService.cs | 5 +- .../Service/RedisCacheService.cs | 2 +- .../Attributes/IgnoreInitTableAttribute.cs | 13 +- .../ValidationAttribute/IdNotNull.cs | 4 +- .../BaseInput/BasePageInput.cs | 5 +- .../Components/LoggingConsoleComponent.cs | 7 +- .../Components/LoggingFileComponent.cs | 12 +- ...eviceTypeEumu.cs => AuthDeviceTypeEnum.cs} | 4 +- .../SimpleAdmin.Core/Enum/ErrorCodeEnum.cs | 2 +- .../Extension/LinqExtension.cs | 8 +- .../Extension/ObjectExtension.cs | 69 +- .../SimpleAdmin.Core/SimpleAdmin.Core.csproj | 10 +- .../SimpleAdmin.Core/SimpleAdmin.Core.xml | 453 ++- .../UnifyResult/SimpleAdminResultProvider.cs | 17 +- .../Utils/Captcha/CaptchaType.cs | 2 +- .../Utils/Captcha/CaptchaUtil.cs | 14 +- .../Utils/Cryptogram/CryptogramUtil.cs | 12 +- .../Utils/Cryptogram/Sm/SM2CryptoUtil.cs | 2 +- .../Utils/Cryptogram/Sm/SM4CryptoUtil.cs | 174 +- .../Utils/Image/AvatarUtil.cs | 2 +- .../SimpleAdmin.Core/Utils/Image/ImageUtil.cs | 26 +- .../SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs | 4 +- .../SimpleAdmin.Core/Utils/Zip/ZipUtils.cs | 190 +- .../Aop/GlobalDispatchProxy.cs | 39 +- .../Enum/NoticeComponent.cs | 17 - .../SimpleAdmin.Plugin.Core/GlobalUsing.cs | 9 - .../Interface/INoticeService.cs | 42 - .../Options/PluginSettingsOptions.cs | 33 - .../SimpleAdmin.Plugin.Core.csproj | 15 - .../SimpleAdmin.Plugin.Core.xml | 66 - .../Const/MqttConst.cs | 60 - .../Controller/MqttController.cs | 49 - .../SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs | 21 - .../Mqtt.Development.json | 10 - .../Mqtt.Production.json | 10 - .../SimpleAdmin.Plugin.Mqtt/MqttComponent.cs | 40 - .../Service/Mqtt/Dto/MqttInput.cs | 35 - .../Service/Mqtt/Dto/MqttOutput.cs | 57 - .../Service/Mqtt/IMqttService.cs | 29 - .../Service/Mqtt/MqttService.cs | 89 - .../Service/Notice/MqttNoticeService.cs | 71 - .../SimpleAdmin.Plugin.Mqtt.csproj | 28 - .../SimpleAdmin.Plugin.Mqtt.xml | 211 -- .../SimpleAdmin.Plugin.SignalR/GlobalUsing.cs | 20 - .../Hub/ISimpleHub.cs | 29 - .../Hub/SimpleHub.cs | 104 - .../Provider/UserIdProvider.cs | 26 - .../Service/SignalrNoticeService.cs | 56 - .../SignalRComponent.cs | 29 - .../SimpleAdmin.Plugin.SignalR.csproj | 16 - .../SimpleAdmin.Plugin.SignalR.xml | 99 - .../Const/SqlsugarConst.cs | 4 +- .../SimpleAdmin.SqlSugar/Db/DbContext.cs | 14 +- .../SimpleAdmin.SqlSugar/Db/DbRepository.cs | 9 +- .../SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs | 4 +- .../SimpleAdmin.SqlSugar/Entity/BaseEntity.cs | 4 +- .../Extension/SqlSugarPageExtension.cs | 2 +- .../SimpleAdmin.SqlSugar.csproj | 2 +- .../SimpleAdmin.SqlSugar.xml | 234 +- .../SqlSugar.Development.json | 6 +- .../SqlSugar.Production.json | 2 +- .../SimpleAdmin.SqlSugar/Startup.cs | 2 +- .../Utils/CodeFirstUtils.cs | 13 +- .../Utils/Dto/SqlSugarTableInfo.cs | 6 +- .../Utils/Dto/SqlsugarColumnInfo.cs | 8 +- .../Utils/SeedDataUtil.cs | 36 +- .../Utils/SqlSugarUtils.cs | 43 +- .../Attributes/AntTableAttribute.cs | 4 +- .../Attributes/InDictAttribute.cs | 10 +- .../Const/SysConfigConst.cs | 2 +- .../SimpleAdmin.System/Entity/BatchEdit.cs | 2 +- .../Entity/BatchEditConfig.cs | 2 +- .../Entity/ClientRelation.cs | 2 +- .../SimpleAdmin.System/Entity/ClientUser.cs | 2 +- .../SimpleAdmin.System/Entity/SysConfig.cs | 2 +- .../SimpleAdmin.System/Entity/SysDict.cs | 2 +- .../SimpleAdmin.System/Entity/SysFile.cs | 2 +- .../Entity/SysLogOperate.cs | 2 +- .../SimpleAdmin.System/Entity/SysLogVisit.cs | 2 +- .../SimpleAdmin.System/Entity/SysMessage.cs | 2 +- .../Entity/SysMessageUser.cs | 2 +- .../SimpleAdmin.System/Entity/SysOrg.cs | 2 +- .../SimpleAdmin.System/Entity/SysPosition.cs | 2 +- .../SimpleAdmin.System/Entity/SysRelation.cs | 2 +- .../SimpleAdmin.System/Entity/SysResource.cs | 6 +- .../SimpleAdmin.System/Entity/SysRole.cs | 2 +- .../SimpleAdmin.System/Entity/SysUser.cs | 2 +- .../EventSubscriber/AuthEventSubscriber.cs | 35 +- .../EventSubscriber/Dto/LoginEvent.cs | 4 +- .../EventSubscriber/NoticeEventSubscriber.cs | 24 +- ...oleResuorce.cs => RelationRoleResource.cs} | 4 +- .../SimpleAdmin.System/GlobalUsings.cs | 1 - .../SimpleAdmin.System/Oss/MinioUtils.cs | 18 +- .../SeedData/Json/seed_sys_config.json | 2 +- .../Services/Auth/Auth/AuthService.cs | 43 +- .../Services/Auth/Auth/Dto/AuthInput.cs | 8 +- .../Services/Auth/Session/SessionService.cs | 22 +- .../Services/BatchEdit/BatchEditService.cs | 18 +- .../Services/BatchEdit/Dto/BatchEditInput.cs | 8 +- .../Services/BatchEdit/Dto/BatchEditOutput.cs | 2 +- .../Services/BatchEdit/IBatchEditService.cs | 4 +- .../Services/Dev/File/FileService.cs | 24 +- .../Services/Dev/Message/MessageService.cs | 9 +- .../ImportExport/Dto/ImportPreviewOutput.cs | 6 +- .../ImportExport/Dto/ImportTemplateInput.cs | 4 +- .../ImportExport/IImportExportService.cs | 6 +- .../ImportExport/ImportExportService.cs | 18 +- .../Services/Index/IndexService.cs | 6 +- .../Services/Limit/Button/ButtonService.cs | 20 +- .../Services/Limit/Menu/MenuService.cs | 10 +- .../Services/Limit/Module/ModuleService.cs | 8 +- .../Services/Limit/Role/Dto/RoleInput.cs | 4 +- .../Services/Limit/Role/Dto/RoleOutput.cs | 4 +- .../Services/Limit/Role/RoleService.cs | 34 +- .../Services/Limit/Spa/SpaService.cs | 10 +- .../OperateLog/Dto/OperateLogOutput.cs | 4 +- .../LogAudit/OperateLog/IOperateLogService.cs | 4 +- .../LogAudit/OperateLog/OperateLogService.cs | 10 +- .../LogAudit/VisitLog/VisitLogService.cs | 2 +- .../Services/Ops/Config/ConfigService.cs | 2 +- .../Services/Ops/Dict/DictService.cs | 61 +- .../Organization/Org/Dto/SysOrgOutput.cs | 2 +- .../Organization/Org/ISysOrgService.cs | 6 +- .../Organization/Org/SysOrgService.cs | 151 +- .../Position/Dto/PositionOutput.cs | 2 +- .../Position/SysPositionService.cs | 10 +- .../Organization/User/ISysUserService.cs | 4 +- .../Organization/User/SysUserService.cs | 76 +- .../System/Relation/Dto/RelationInput.cs | 2 +- .../System/Relation/RelationService.cs | 12 +- .../System/Resource/IResourceService.cs | 6 +- .../System/Resource/ResourceService.cs | 35 +- .../System/UserCenter/Dto/UserCenterInput.cs | 4 +- .../System/UserCenter/Dto/UserCenterOutput.cs | 4 +- .../System/UserCenter/IUserCenterService.cs | 4 +- .../System/UserCenter/UserCenterService.cs | 53 +- .../SimpleAdmin.System.csproj | 13 +- .../SimpleAdmin.System/SimpleAdmin.System.xml | 3190 ++++++++--------- .../Components/AuthComponent.cs | 2 +- .../Components/LoggingMonitorComponent.cs | 4 +- .../Components/PluginSettingComponent.cs | 45 - .../System/Auth/AuthBController.cs | 2 +- .../System/Limit/MenuController.cs | 1 - .../System/Organization/OrgController.cs | 3 +- .../System/System/UserCenterController.cs | 6 +- .../Filter/MyActionFilter.cs | 12 +- .../Filter/MyAuthorizationFilter.cs | 12 +- .../SimpleAdmin.Web.Core/GlobalUsing.cs | 1 - .../Handlers/JwtHandler.cs | 21 +- .../Handlers/LogExceptionHandler.cs | 5 +- .../Logging/DatabaseLoggingWriter.cs | 6 +- .../Logging/LoggingMonitorJson.cs | 4 +- .../SimpleAdmin.Web.Core.csproj | 2 - .../SimpleAdmin.Web.Core.xml | 12 - .../SimpleAdmin.Web.Core/Startup.cs | 31 +- .../SimpleAdmin.Web.Core/Web.Development.json | 6 - .../SimpleAdmin.Web.Core/Web.Production.json | 6 - .../SimpleAdmin.Web.Entry/Program.cs | 6 +- .../SimpleAdmin.Web.Entry.csproj | 3 + .../wwwroot/mobile/swiper/swiper1.jpeg | Bin 23801 -> 0 bytes .../wwwroot/mobile/swiper/swiper2.jpg | Bin 11387 -> 0 bytes api/SimpleAdmin/SimpleAdmin.sln | 28 - doc/Image/ikun.png | Bin 70295 -> 0 bytes doc/Image/redis1.png | Bin 27489 -> 0 bytes doc/Image/redis2.png | Bin 17050 -> 0 bytes doc/Image/wendang.png | Bin 156672 -> 0 bytes "doc/Image/\345\276\256\344\277\241.jpg" | Bin 34519 -> 0 bytes "doc/Image/\346\236\266\346\236\204.png" | Bin 24528 -> 0 bytes web/.vscode/settings.json | 2 +- web/CHANGELOG.md | 31 - web/README.md | 92 + web/commitlint.config.cjs | 14 +- web/index.html | 2 +- web/package.json | 2 +- web/src/styles/common.scss | 4 +- 202 files changed, 3567 insertions(+), 4673 deletions(-) create mode 100644 api/.config/dotnet-tools.json create mode 100644 api/.gitignore create mode 100644 api/.husky/task-runner.json create mode 100644 api/LICENSE create mode 100644 api/README.md delete mode 100644 api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs delete mode 100644 "api/SimpleAdmin/SimpleAdmin.Background/A\345\201\234\346\255\242\346\234\215\345\212\241.bat" delete mode 100644 "api/SimpleAdmin/SimpleAdmin.Background/A\345\215\270\350\275\275\346\234\215\345\212\241.bat" delete mode 100644 "api/SimpleAdmin/SimpleAdmin.Background/A\345\220\257\345\212\250\346\234\215\345\212\241.bat" delete mode 100644 "api/SimpleAdmin/SimpleAdmin.Background/A\345\256\211\350\243\205\346\234\215\345\212\241.bat" delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/Background.Development.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/Background.Production.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/MqttWorker.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/Program.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/Properties/launchSettings.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj delete mode 100644 api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs rename api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/{AuthDeviceTypeEumu.cs => AuthDeviceTypeEnum.cs} (97%) delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.csproj delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.xml delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Development.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Production.json delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.csproj delete mode 100644 api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.xml rename api/SimpleAdmin/SimpleAdmin.System/ExtJson/{RelationRoleResuorce.cs => RelationRoleResource.cs} (96%) delete mode 100644 api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs delete mode 100644 api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper1.jpeg delete mode 100644 api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper2.jpg delete mode 100644 doc/Image/ikun.png delete mode 100644 doc/Image/redis1.png delete mode 100644 doc/Image/redis2.png delete mode 100644 doc/Image/wendang.png delete mode 100644 "doc/Image/\345\276\256\344\277\241.jpg" delete mode 100644 "doc/Image/\346\236\266\346\236\204.png" delete mode 100644 web/CHANGELOG.md create mode 100644 web/README.md diff --git a/api/.config/dotnet-tools.json b/api/.config/dotnet-tools.json new file mode 100644 index 0000000..29ba7ff --- /dev/null +++ b/api/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "husky": { + "version": "0.6.1", + "commands": [ + "husky" + ] + } + } +} \ No newline at end of file diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000..6804c87 --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,365 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ +#idea +.idea/ +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd +#sqlite数据库不上传 +SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.db diff --git a/api/.husky/task-runner.json b/api/.husky/task-runner.json new file mode 100644 index 0000000..2a016c4 --- /dev/null +++ b/api/.husky/task-runner.json @@ -0,0 +1,13 @@ +{ + "tasks": [ + { + "name": "welcome-message-example", + "command": "bash", + "args": [ "-c", "echo Husky.Net is awesome!" ], + "windows": { + "command": "cmd", + "args": ["/c", "echo Husky.Net is awesome!" ] + } + } + ] +} diff --git a/api/LICENSE b/api/LICENSE new file mode 100644 index 0000000..5fb082b --- /dev/null +++ b/api/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2023 HuGuoDong + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/api/README.md b/api/README.md new file mode 100644 index 0000000..6955524 --- /dev/null +++ b/api/README.md @@ -0,0 +1,92 @@ +# SimpleAdmin.Net + + + +## Getting started + +To make it easy for you to get started with GitLab, here's a list of recommended next steps. + +Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! + +## Add your files + +- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files +- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: + +``` +cd existing_repo +git remote add origin https://jihulab.com/zxzyjs/simpleadmin.net.git +git branch -M master +git push -uf origin master +``` + +## Integrate with your tools + +- [ ] [Set up project integrations](https://jihulab.com/zxzyjs/simpleadmin.net/-/settings/integrations) + +## Collaborate with your team + +- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) +- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) +- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) +- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) +- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) + +## Test and Deploy + +Use the built-in continuous integration in GitLab. + +- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) +- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) +- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) +- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) +- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) + +*** + +# Editing this README + +When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. + +## Suggestions for a good README +Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +## Name +Choose a self-explaining name for your project. + +## Description +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +## Badges +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. + +## Visuals +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. + +## Installation +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. + +## Usage +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +## Support +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +## Roadmap +If you have ideas for releases in the future, it is a good idea to list them in the README. + +## Contributing +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +## Authors and acknowledgment +Show your appreciation to those who have contributed to the project. + +## License +For open source projects, say how it is licensed. + +## Project status +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs b/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs deleted file mode 100644 index 022df5c..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Application/Entity/GenTest.cs +++ /dev/null @@ -1,55 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.System; - -/// -/// 代码生成基础 -/// -[SugarTable("gen_test", TableDescription = "代码生成测试")] -[Tenant(SqlsugarConst.DB_DEFAULT)] -[CodeGen] -[BatchEdit] -public class GenTest : DataEntityBase -{ - /// - /// 姓名 - /// - public string Name { get; set; } - - /// - /// 性别 - /// - public string Sex { get; set; } - - /// - /// 民族 - /// - public string Nation { get; set; } - - /// - /// 年龄 - /// - - public int Age { get; set; } - - /// - /// 生日 - /// - public DateTime Bir { get; set; } - - /// - /// 存款 - /// - public decimal Money { get; set; } - - /// - /// 排序码 - /// - public int SortCode { get; set; } -} diff --git a/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs index 48ad053..537ad94 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/GlobalUsings.cs @@ -9,21 +9,15 @@ global using Furion; global using Furion.DependencyInjection; global using Furion.FriendlyException; -global using Magicodes.ExporterAndImporter.Core; -global using Magicodes.ExporterAndImporter.Excel; global using Mapster; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Hosting; global using Microsoft.AspNetCore.Mvc; -global using Microsoft.CodeAnalysis; global using Microsoft.Extensions.DependencyInjection; -global using OfficeOpenXml.Table; global using SimpleAdmin.Cache; global using SimpleAdmin.Core; global using SimpleAdmin.Core.Extension; global using SimpleAdmin.SqlSugar; global using SimpleAdmin.System; -global using SimpleTool; global using SqlSugar; -global using System.ComponentModel.DataAnnotations; global using System.Reflection; diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs index a11f26d..dfb7f8d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Org/OrgService.cs @@ -11,14 +11,12 @@ namespace SimpleAdmin.Application; /// public class OrgService : DbRepository, IOrgService { - private readonly ISimpleCacheService _simpleCacheService; private readonly ISysOrgService _sysOrgService; private readonly ISysUserService _sysUserService; - public OrgService(ISimpleCacheService simpleCacheService, ISysOrgService sysOrgService, + public OrgService(ISysOrgService sysOrgService, ISysUserService sysUserService) { - _simpleCacheService = simpleCacheService; _sysOrgService = sysOrgService; _sysUserService = sysUserService; } @@ -67,7 +65,7 @@ public class OrgService : DbRepository, IOrgService { if (dataScope is { Count: > 0 } && (!dataScope.ContainsAll(input.Ids) || !dataScope.Contains(input.TargetId)))//判断目标机构和需要复制的机构是否都在数据范围里面 - throw Oops.Bah($"您没有权限复制这些机构"); + throw Oops.Bah("您没有权限复制这些机构"); await _sysOrgService.Copy(input);//复制操作 } } @@ -82,16 +80,16 @@ public class OrgService : DbRepository, IOrgService if (dataScope is { Count: > 0 })//如果有机构 { if (!dataScope.ContainsAll(ids))//判断要删除的id列表是否都包含在数据范围内 - throw Oops.Bah($"您没有权限删除这些机构"); + throw Oops.Bah("您没有权限删除这些机构"); } else if (dataScope is { Count: 0 })//表示仅自己 { //获取要删除的机构列表 - var orgs = (await _sysOrgService.GetListAsync()).Where(it => ids.Contains(it.Id)) + var orgList = (await _sysOrgService.GetListAsync()).Where(it => ids.Contains(it.Id)) .ToList(); //如果机构列表里有任何不是自己创建的机构 - if (orgs.Any(it => it.CreateUserId != UserManager.UserId)) - throw Oops.Bah($"只能删除自己创建的机构"); + if (orgList.Any(it => it.CreateUserId != UserManager.UserId)) + throw Oops.Bah("只能删除自己创建的机构"); } await _sysOrgService.Delete(input, ApplicationConst.BIZ_ORG);//删除操作 } diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs index 4c2b24a..4381b32 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/Position/PositionService.cs @@ -53,7 +53,7 @@ public class PositionService : DbRepository, IPositionService var orgIds = (await _sysPositionService.GetListAsync()).Where(it => ids.Contains(it.Id)) .Select(it => it.OrgId).ToList(); if (!dataScope.ContainsAll(orgIds)) - throw Oops.Bah($"您没有权限删除这些岗位"); + throw Oops.Bah("您没有权限删除这些岗位"); } else if (dataScope is { Count: 0 })//表示仅自己 { @@ -62,7 +62,7 @@ public class PositionService : DbRepository, IPositionService .Where(it => ids.Contains(it.Id)).ToList(); //如果岗位列表里有任何不是自己创建的岗位 if (positions.Any(it => it.CreateUserId != UserManager.UserId)) - throw Oops.Bah($"只能删除自己创建的岗位"); + throw Oops.Bah("只能删除自己创建的岗位"); } await _sysPositionService.Delete(input, ApplicationConst.BIZ_ORG);//删除岗位 } diff --git a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs index e010c7f..607f69a 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Application/Services/User/UserService.cs @@ -15,19 +15,16 @@ public class UserService : DbRepository, IUserService { private readonly ISysUserService _sysUserService; private readonly IRoleService _roleService; - private readonly ISysOrgService _sysOrgService; private readonly IImportExportService _importExportService; public UserService( ISysUserService sysUserService, IRoleService roleService, - ISysOrgService sysOrgService, IImportExportService importExportService ) { _sysUserService = sysUserService; _roleService = roleService; - _sysOrgService = sysOrgService; _importExportService = importExportService; } @@ -81,7 +78,7 @@ public class UserService : DbRepository, IUserService /// public async Task> RoleSelector(RoleSelectorInput input) { - var sysRoles = new SqlSugarPagedList() + var sysRoles = new SqlSugarPagedList { Total = 1, Pages = 1, @@ -136,7 +133,6 @@ public class UserService : DbRepository, IUserService //获取数据范围 var dataScope = await _sysUserService.GetLoginUserApiDataScope(); var ids = input.Ids; - ;//获取用户id var sysUsers = await GetListAsync(it => ids.Contains(it.Id), it => new SysUser { OrgId = it.OrgId, CreateUserId = it.CreateUserId });//根据用户ID获取机构id、 sysUsers.ForEach(it => @@ -199,12 +195,12 @@ public class UserService : DbRepository, IUserService { var orgIds = users.Select(it => it.OrgId).ToList();//获取所有用户机构列表 if (!dataScope.ContainsAll(orgIds)) - throw Oops.Bah($"您没有权限删除这些人员"); + throw Oops.Bah("您没有权限删除这些人员"); await _sysUserService.Delete(input);//删除 } else { - throw Oops.Bah($"您没有权限删除这些人员"); + throw Oops.Bah("您没有权限删除这些人员"); } } @@ -233,8 +229,7 @@ public class UserService : DbRepository, IUserService importPreview.Data = await CheckImport(importPreview.Data, dataScope);//检查导入数据 return importPreview; } - else - throw Oops.Bah("您无权导入用户"); + throw Oops.Bah("您无权导入用户"); } /// @@ -262,7 +257,7 @@ public class UserService : DbRepository, IUserService await InsertOrBulkCopy(sysUsers);// 数据导入 return result; } - else throw Oops.Bah("您无权导入用户"); + throw Oops.Bah("您无权导入用户"); } #endregion 导入导出 @@ -336,7 +331,7 @@ public class UserService : DbRepository, IUserService public async Task> CheckImport(List data, List dataScope, bool clearError = false) { - var errorMessage = $"没有权限"; + var errorMessage = "没有权限"; //先经过系统用户检查 var bizUsers = await _sysUserService.CheckImport(data, clearError); bizUsers.ForEach(it => diff --git a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj index e999519..8406403 100644 --- a/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Application/SimpleAdmin.Application.csproj @@ -27,4 +27,8 @@ + + + + diff --git "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\201\234\346\255\242\346\234\215\345\212\241.bat" "b/api/SimpleAdmin/SimpleAdmin.Background/A\345\201\234\346\255\242\346\234\215\345\212\241.bat" deleted file mode 100644 index 75a8ec0..0000000 --- "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\201\234\346\255\242\346\234\215\345\212\241.bat" +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -color 0e -@echo ================================== -@echo ѣҼļùԱʽ򿪡 -@echo ================================== -@echo Start Stop SimpleAdmin.Background - -Net stop SimpleAdmin.Background -pause \ No newline at end of file diff --git "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\215\270\350\275\275\346\234\215\345\212\241.bat" "b/api/SimpleAdmin/SimpleAdmin.Background/A\345\215\270\350\275\275\346\234\215\345\212\241.bat" deleted file mode 100644 index 8a2989c..0000000 --- "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\215\270\350\275\275\346\234\215\345\212\241.bat" +++ /dev/null @@ -1,10 +0,0 @@ -@echo off -color 0e -@echo ================================== -@echo ѣҼļùԱʽ򿪡 -@echo ================================== -@echo Start Remove SimpleAdmin.Background - -Net stop SimpleAdmin.Background -sc delete SimpleAdmin.Background -pause \ No newline at end of file diff --git "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\220\257\345\212\250\346\234\215\345\212\241.bat" "b/api/SimpleAdmin/SimpleAdmin.Background/A\345\220\257\345\212\250\346\234\215\345\212\241.bat" deleted file mode 100644 index 55970d7..0000000 --- "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\220\257\345\212\250\346\234\215\345\212\241.bat" +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -color 0e -@echo ================================== -@echo ѣҼļùԱʽ򿪡 -@echo ================================== -@echo Start Start SimpleAdmin.Background - -Net Start SimpleAdmin.Background -pause \ No newline at end of file diff --git "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\256\211\350\243\205\346\234\215\345\212\241.bat" "b/api/SimpleAdmin/SimpleAdmin.Background/A\345\256\211\350\243\205\346\234\215\345\212\241.bat" deleted file mode 100644 index 065b14c..0000000 --- "a/api/SimpleAdmin/SimpleAdmin.Background/A\345\256\211\350\243\205\346\234\215\345\212\241.bat" +++ /dev/null @@ -1,12 +0,0 @@ -@echo off -color 0e -@echo ================================== -@echo ѣҼļùԱʽ򿪡 -@echo ================================== -@echo Start Install SimpleAdmin.Background - -cd .. -sc create SimpleAdmin.Background binPath=%~dp0SimpleAdmin.Background.exe start= auto -sc description SimpleAdmin.Background "SimpleAdmin̨" -Net Start SimpleAdmin.Background -pause \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Background.Development.json b/api/SimpleAdmin/SimpleAdmin.Background/Background.Development.json deleted file mode 100644 index fead2dc..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/Background.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - //mqtt设置 - "MqttSettings": { - "Host": "127.0.0.1", - "Port": 1883, - "UserName": "admin", - "SecretKey": "admin", - "ClientId": "SimpleAdminBackground" - }, -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Background.Production.json b/api/SimpleAdmin/SimpleAdmin.Background/Background.Production.json deleted file mode 100644 index fead2dc..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/Background.Production.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - //mqtt设置 - "MqttSettings": { - "Host": "127.0.0.1", - "Port": 1883, - "UserName": "admin", - "SecretKey": "admin", - "ClientId": "SimpleAdminBackground" - }, -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs b/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs deleted file mode 100644 index 7fb374e..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/Dto/MqttConnected.cs +++ /dev/null @@ -1,25 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Background; - -/// -/// Mqtt连接 -/// -public class MqttConnected -{ - /// - /// 用户名 - /// - public string UserName { get; set; } - - /// - /// 客户端ID - /// - public string Clientid { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs deleted file mode 100644 index 85cd16c..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/GlobalUsings.cs +++ /dev/null @@ -1,10 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -global using SimpleMQTT; -global using SimpleAdmin.Cache; diff --git a/api/SimpleAdmin/SimpleAdmin.Background/MqttWorker.cs b/api/SimpleAdmin/SimpleAdmin.Background/MqttWorker.cs deleted file mode 100644 index 1a50dc5..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/MqttWorker.cs +++ /dev/null @@ -1,67 +0,0 @@ -using Masuit.Tools; -using NewLife.MQTT; -using SimpleAdmin.Core; -using SimpleAdmin.Cache; - -namespace SimpleAdmin.Background; - -/// -/// mqtt̨ -/// -public class MqttWorker : BackgroundService -{ - private readonly ILogger _logger; - private readonly ISimpleCacheService _simpleCacheService; - private readonly MqttClient _mqtt; - - public MqttWorker(ILogger logger, ISimpleCacheService simpleCacheService, IMqttClientManager mqttClientManager) - { - _logger = logger; - this._simpleCacheService = simpleCacheService; - this._mqtt = mqttClientManager.GetClient(); - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - //豸 - await _mqtt.SubscribeAsync("$SYS/brokers/+/clients/+/+", (e) => - { - var topicList = e.Topic.Split("/");///ָ - var clientId = topicList[topicList.Length - 2];//ȡͻID - if (clientId.Contains("_"))//жϿͻIDǷ»»߱ʾwebû¼ - { - var userId = clientId.Split("_")[0]; - //ȡredisǰûtokenϢб - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.Cache_UserToken, userId); - if (tokenInfos != null) - { - var connectEvent = topicList.Last();//ȡ¼ж߻ - if (connectEvent == "connected")// - { - _logger.LogInformation($"豸{clientId}"); - var token = _simpleCacheService.Get(CacheConst.Cache_MqttClientUser + clientId);//ȡmqttͻIDӦûtoken - if (token == null) return;//ûtokenֱ˳ - //ȡredisеǰtoken - var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault(); - if (tokenInfo != null) - { - tokenInfo.ClientIds.Add(clientId);//ӵͻб - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//Redis - } - } - else // - { - _logger.LogInformation($"豸{clientId}"); - //ȡǰͻIDڵtokenϢ - var tokenInfo = tokenInfos.Where(it => it.ClientIds.Contains(clientId)).FirstOrDefault(); - if (tokenInfo != null) - { - tokenInfo.ClientIds.RemoveWhere(it => it == clientId);//ӿͻбɾ - _simpleCacheService.HashAdd(CacheConst.Cache_UserToken, userId, tokenInfos);//Redis - } - } - } - } - }); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Program.cs b/api/SimpleAdmin/SimpleAdmin.Background/Program.cs deleted file mode 100644 index 7ab9faa..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/Program.cs +++ /dev/null @@ -1,25 +0,0 @@ -// SimpleAdmin Apache License Version 2.0 Э鷢ҵĿ²: -// 1.벻Ҫɾ޸ĸĿ¼µLICENSEļ -// 2.벻Ҫɾ޸SimpleAdminԴͷİȨ -// 3.ַԴʱע https://gitee.com/zxzyjs/SimpleAdmin -// 4.ڱƷֻʹ SimpleAdmin Ϊ̨񣬳ҲηַԴ -// 5.벻ýӦΣҰȫΪκʽڷǷΪĿĵΪҪɾ޸ -// 6.κλڱһзɾ׺Σ˾޹ء - -try -{ - Console.Title = "SimpleAdmin̨"; -} -catch { }//עᱨҪcatch -Serve.Run(GenericRunOptions.Default - .ConfigureBuilder(hostBuilder => - { - hostBuilder.UseWindowsService();//֧עɷ - hostBuilder.ConfigureServices((hostContext, services) => - { - services.AddMqttClientManager();//mqtt - }); - return hostBuilder; - }) - -); \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/Properties/launchSettings.json b/api/SimpleAdmin/SimpleAdmin.Background/Properties/launchSettings.json deleted file mode 100644 index 7a61464..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/Properties/launchSettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "profiles": { - "SimpleAdmin.Background": { - "commandName": "Project", - "dotnetRunMessages": true, - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj b/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj deleted file mode 100644 index 76442b5..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/SimpleAdmin.Background.csproj +++ /dev/null @@ -1,47 +0,0 @@ - - - - net7.0;net6.0 - enable - enable - dotnet-SimpleAdmin.Background-97b50b23-4c51-4690-9027-da078c63136a - en-US - - - - - - - - - - - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs b/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs deleted file mode 100644 index 73b7d25..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Background/TestWorker.cs +++ /dev/null @@ -1,27 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -using NewLife.Caching; - -namespace SimpleAdmin.Background; - -public class TestWorker : BackgroundService -{ - private readonly ILogger _logger; - private readonly ISimpleCacheService _simpleCacheService; - - public TestWorker(ILogger logger, ISimpleCacheService simpleCacheService ) - { - _logger = logger; - _simpleCacheService = simpleCacheService; - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - } -} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Cache.Development.json b/api/SimpleAdmin/SimpleAdmin.Cache/Cache.Development.json index a136f90..6f867d5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Cache.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Cache.Development.json @@ -1,7 +1,7 @@ { //缓存设置 "CacheSettings": { - "UseRedis": false, //启用redis + "UseRedis": true, //启用redis "RedisSettings": { "Address": "127.0.0.1:6379", //地址 "Password": "123456", //Redis服务密码 diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs index ba84fab..cdd5531 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheHashService.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.Cache; /// /// 内存缓存 /// -public partial class MemoryCacheService : ISimpleCacheService +public partial class MemoryCacheService { /// public void HashAdd(string key, string hashKey, T value) @@ -62,14 +62,14 @@ public partial class MemoryCacheService : ISimpleCacheService /// public List HashGet(string key, params string[] fields) { - List list = new List(); + var list = new List(); //获取字典 var exist = _memoryCache.GetDictionary(key); foreach (var field in fields) { - if (exist.ContainsKey(field))//如果包含Key + if (exist.TryGetValue(field, out var value))//如果包含Key { - list.Add(exist[field]); + list.Add(value); } else { list.Add(default); } } @@ -93,4 +93,4 @@ public partial class MemoryCacheService : ISimpleCacheService var data = _memoryCache.GetDictionary(key); return data; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs index e1bd9a0..c8cf08e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/MemoryCacheService.cs @@ -91,7 +91,7 @@ public partial class MemoryCacheService : ISimpleCacheService public IDictionary GetAll(IEnumerable keys) { IDictionary? result = default;//定义集合 - IDictionary? data = _memoryCache.GetAll(keys);//获取数据 + var data = _memoryCache.GetAll(keys);//获取数据 data.ForEach(it => { result.Add(it.Key, it.Value.ToObject());//遍历数据,格式化并加到新的数据集合 @@ -171,8 +171,7 @@ public partial class MemoryCacheService : ISimpleCacheService /// public bool TryGetValue(string key, out T value) { - var result = string.Empty; - _ = _memoryCache.TryGetValue(key, out result); + _ = _memoryCache.TryGetValue(key, out var result); value = result.ToObject(); return value == null; } diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs index aa76808..7cb236c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheHashService.cs @@ -12,8 +12,7 @@ namespace SimpleAdmin.Cache; /// /// Redis缓存 /// - -public partial class RedisCacheService : ISimpleCacheService +public partial class RedisCacheService { /// public void HashAdd(string key, string hashKey, T value) @@ -50,4 +49,4 @@ public partial class RedisCacheService : ISimpleCacheService { return _simpleRedis.HashGetAll(key); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs index 50046bd..46986c9 100644 --- a/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs +++ b/api/SimpleAdmin/SimpleAdmin.Cache/Service/RedisCacheService.cs @@ -18,7 +18,7 @@ public partial class RedisCacheService : ISimpleCacheService public RedisCacheService(ISimpleRedis simpleRedis) { - this._simpleRedis = simpleRedis; + _simpleRedis = simpleRedis; } #region 普通操作 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs index 1da09bb..cc9a76c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/IgnoreInitTableAttribute.cs @@ -6,12 +6,11 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.Core +namespace SimpleAdmin.Core; + +/// +/// 忽略初始化表 +/// +public class IgnoreInitTableAttribute : Attribute { - /// - /// 忽略初始化表 - /// - public class IgnoreInitTableAttribute : Attribute - { - } } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs index 2b2d8a1..b2e299c 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Attributes/ValidationAttribute/IdNotNull.cs @@ -17,7 +17,7 @@ public class IdNotNull : ValidationAttribute { if (value.ToLong() > 0 || !string.IsNullOrEmpty(value.ToString())) return true; - else return false; + return false; } } @@ -32,4 +32,4 @@ public class IdsNotNull : ValidationAttribute return false; return true; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs index 9b501dd..7ada6c2 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/BaseInput/BasePageInput.cs @@ -58,12 +58,11 @@ public class BasePageInput : IValidatableObject var fields = SortField.Split(" "); if (fields.Length > 1) { - yield return new ValidationResult($"排序字段错误", new[] + yield return new ValidationResult("排序字段错误", new[] { nameof(SortField) }); } } - yield break; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs index 7960b95..43ed060 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingConsoleComponent.cs @@ -20,7 +20,7 @@ public sealed class LoggingConsoleComponent : IServiceComponent { services.AddConsoleFormatter(options => { - options.MessageFormat = (logMsg) => + options.MessageFormat = logMsg => { //如果不是LoggingMonitor日志或者开启了格式化才格式化 if (logMsg.LogName != _monitorName && _loggingSetting.MessageFormat) @@ -36,10 +36,7 @@ public sealed class LoggingConsoleComponent : IServiceComponent } return stringBuilder.ToString(); } - else - { - return logMsg.Message; - } + return logMsg.Message; }; options.WriteHandler = (logMsg, scopeProvider, writer, fmtMsg, opt) => diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs index bec7f12..d9c3df5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Components/LoggingFileComponent.cs @@ -23,7 +23,7 @@ public sealed class LoggingFileComponent : IServiceComponent //获取最大日志等级,默认Error var maxLevel = (LogLevel)Enum.Parse(typeof(LogLevel), _loggingSetting.LogLevel.MaxLevel); //获取程序根目录 - var rootPath = App.HostEnvironment.ContentRootPath; + // var rootPath = App.HostEnvironment.ContentRootPath; //遍历日志等级 foreach (LogLevel level in Enum.GetValues(typeof(LogLevel))) { @@ -33,7 +33,7 @@ public sealed class LoggingFileComponent : IServiceComponent //每天创建一个日志文件 services.AddLogging(builder => { - var fileName = "logs/" + level.ToString() + "/{0:yyyy}-{0:MM}-{0:dd}.log"; + var fileName = "logs/" + level + "/{0:yyyy}-{0:MM}-{0:dd}.log"; builder.AddFile(fileName, options => { SetLogOptions(options, level);//日志格式化 @@ -55,9 +55,9 @@ public sealed class LoggingFileComponent : IServiceComponent if (logLevel != null)//如果日志等级不为空 { //过滤日志等级 - options.WriteFilter = (logMsg) => + options.WriteFilter = logMsg => { - //如果配置不写入mongitor日志和日志名称为System.Logging.LoggingMonitor + //如果配置不写入monitor日志和日志名称为System.Logging.LoggingMonitor if (!_loggingSetting.Monitor.Write && logMsg.LogName == _monitorName) return false; return logMsg.LogLevel == logLevel; @@ -72,7 +72,7 @@ public sealed class LoggingFileComponent : IServiceComponent if (_loggingSetting.MessageFormat) { //日志内容格式化 - options.MessageFormat = (logMsg) => + options.MessageFormat = logMsg => { var stringBuilder = new StringBuilder(); stringBuilder.AppendLine("【日志级别】:" + logMsg.LogLevel); @@ -87,4 +87,4 @@ public sealed class LoggingFileComponent : IServiceComponent }; } } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEnum.cs similarity index 97% rename from api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs rename to api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEnum.cs index 4ad88d0..c69d3d0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEumu.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Enum/Auth/AuthDeviceTypeEnum.cs @@ -11,7 +11,7 @@ namespace SimpleAdmin.Core; /// /// 登录设备类型枚举 /// -public enum AuthDeviceTypeEumu +public enum AuthDeviceTypeEnum { /// /// PC端 @@ -30,4 +30,4 @@ public enum AuthDeviceTypeEumu /// [Description("小程序")] MINI -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs b/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs index f15c5f7..566c998 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Enum/ErrorCodeEnum.cs @@ -42,5 +42,5 @@ public enum ErrorCodeEnum /// 没有权限 ///
[ErrorCodeItemMetadata("没有权限")] - A0004, + A0004 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs b/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs index 0c3852c..31b95bc 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Extension/LinqExtension.cs @@ -19,10 +19,10 @@ public static class LinqExtension ///
/// /// 第一个列表 - /// 第二个列表 + /// 第二个列表 /// - public static bool ContainsAll(this List first, List secend) + public static bool ContainsAll(this List first, List second) { - return secend.All(s => first.Any(f => f.Equals(s))); + return second.All(s => first.Any(f => f.Equals(s))); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs b/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs index fa69fce..393b161 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Extension/ObjectExtension.cs @@ -6,47 +6,46 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.Core +namespace SimpleAdmin.Core; + +/// +/// object拓展 +/// +public static class ObjectExtension { /// - /// object拓展 + /// json字符串序列化 /// - public static class ObjectExtension + /// + /// + public static object ToObject(this string json) { - /// - /// json字符串序列化 - /// - /// - /// - public static object ToObject(this string json) - { - return string.IsNullOrEmpty(json) ? null : JsonConvert.DeserializeObject(json); - } + return string.IsNullOrEmpty(json) ? null : JsonConvert.DeserializeObject(json); + } - /// - /// json字符串序列化 - /// - /// - /// - /// - public static T ToObject(this string json) + /// + /// json字符串序列化 + /// + /// + /// + /// + public static T ToObject(this string json) + { + if (json != null) { - if (json != null) - { - json = json.Replace(" ", ""); - return JsonConvert.DeserializeObject(json); - } - else return default; + json = json.Replace(" ", ""); + return JsonConvert.DeserializeObject(json); } + return default; + } - /// - /// json字符串序列化 - /// - /// - /// - public static JObject ToJObject(this string json) - { - return json == null ? JObject.Parse("{}") : JObject.Parse(json.Replace(" ", "")); - } + /// + /// json字符串序列化 + /// + /// + /// + public static JObject ToJObject(this string json) + { + return json == null ? JObject.Parse("{}") : JObject.Parse(json.Replace(" ", "")); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj index 568c481..5987830 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.csproj @@ -10,17 +10,17 @@ - - - - + + + + - + diff --git a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml index ba0f94a..ffe8b84 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Core/SimpleAdmin.Core.xml @@ -6,345 +6,345 @@ - 代码生成 + 代码生成 - 忽略初始化表 + 忽略初始化表 - 种子数据忽略新增 + 种子数据忽略新增 - 种子数据忽略修改 + 种子数据忽略修改 - 需要角色授权权限 + 需要角色授权权限 - 忽略角色授权权限 + 忽略角色授权权限 - 管理员才能访问特性 + 管理员才能访问特性 - 忽略超级管理员才能访问特性 + 忽略超级管理员才能访问特性 - 验证Id不能为 空 + 验证Id不能为 空 - 验证Id列表不能为空 + 验证Id列表不能为空 - 文件上传输入参数 + 文件上传输入参数 - 文件 + 文件 - 主键Id输入参数 + 主键Id输入参数 - 主键Id + 主键Id - 主键Id列表 + 主键Id列表 - Id列表输入 + Id列表输入 - 全局分页查询输入参数 + 全局分页查询输入参数 - 当前页码 + 当前页码 - 每页条数 + 每页条数 - 排序字段 + 排序字段 - 排序方式,升序:ascend;降序:descend" + 排序方式,升序:ascend;降序:descend" - 关键字 + 关键字 - 基础选择器输出 + 基础选择器输出 - 值 + 值 - 显示文本 + 显示文本 - Gzip压缩组件 + Gzip压缩组件 - 日志写入文件的组件 + 日志写入文件的组件 - 日志写入文件的组件 + 日志写入文件的组件 - 日志格式化 + 日志格式化 - 授权用户常量 + 授权用户常量 - 用户Id + 用户Id - 账号 + 账号 - 名称 + 名称 - 账号类型 + 账号类型 - 组织机构Id + 组织机构Id - 0 + 0 - mqtt消息 + mqtt消息 - 消息分类 + 消息分类 - 消息内容 + 消息内容 - 时间 + 时间 - Token信息 + Token信息 - MQTT客户端ID列表 + MQTT客户端ID列表 - 设备 + 设备 - 登录端 + 登录端 - 过期时间 + 过期时间 - Token + Token - 超时时间 + 超时时间 - token剩余有效期 + token剩余有效期 - token剩余有效期百分比 + token剩余有效期百分比 - + - 登录设备类型枚举 + 登录设备类型枚举 - + - PC端 + PC端 - + - 移动端 + 移动端 - + - 小程序 + 小程序 - 登录端类型枚举 + 登录端类型枚举 - B端 + B端 - C端 + C端 - 通用错误码 + 通用错误码 - 系统异常 + 系统异常 - 数据不存在 + 数据不存在 - 删除失败 + 删除失败 - 操作失败 + 操作失败 - 没有权限 + 没有权限 - Linq扩展 + Linq扩展 - 是否都包含 + 是否都包含 第一个列表 - 第二个列表 + 第二个列表 - object拓展 + object拓展 - json字符串序列化 + json字符串序列化 - json字符串序列化 + json字符串序列化 @@ -352,120 +352,120 @@ - json字符串序列化 + json字符串序列化 - 默认业务配置 + 默认业务配置 - 初始化表 + 初始化表 - 初始化数据 + 初始化数据 - 日志配置 + 日志配置 - LoggingMonitor配置 + LoggingMonitor配置 - 是否日志消息格式化 + 是否日志消息格式化 - 日志等级 + 日志等级 - LoggingMonitor配置 + LoggingMonitor配置 - 写入文件 + 写入文件 - 写入控制台 + 写入控制台 - 日志等级 + 日志等级 - 默认日志等级 + 默认日志等级 - 最大日志等级 + 最大日志等级 - AppStartup启动类 + AppStartup启动类 - 全局返回结果 + 全局返回结果 - 状态码 + 状态码 - 错误信息 + 错误信息 - 数据 + 数据 - 附加数据 + 附加数据 - 时间 + 时间 - 规范化RESTful风格返回值 + 规范化RESTful风格返回值 - 异常返回 + 异常返回 @@ -473,7 +473,7 @@ - 成功返回 + 成功返回 @@ -481,7 +481,7 @@ - 验证失败返回 + 验证失败返回 @@ -489,7 +489,7 @@ - 状态码响应拦截 + 状态码响应拦截 @@ -498,7 +498,7 @@ - 返回 RESTful 风格结果集 + 返回 RESTful 风格结果集 状态码 是否成功 @@ -508,249 +508,249 @@ - 验证码信息 + 验证码信息 - 验证码 + 验证码 - 验证码数据流 + 验证码数据流 - base64 + base64 - 验证码类型 + 验证码类型 - 纯数字验证码 + 纯数字验证码 - 数字加字母验证码 + 数字加字母验证码 - 数字运算验证码 + 数字运算验证码 - 生成验证码功能 + 生成验证码功能 - 获取验证码 + 获取验证码 验证码数 长度 - 高度 + 高度 字体大小 类型 0:数字 1:字符 2:计算 - 获取数字验证码 + 获取数字验证码 验证码数 - 获取字符验证码 + 获取字符验证码 验证码数 - 获取运算符验证码 + 获取运算符验证码 - 公共功能 + 公共功能 - 获取唯一Id + 获取唯一Id - 加解密功能 + 加解密功能 - SM2解密 + SM2解密 密文 明文 - SM2加密 + SM2加密 明文 密文 - SM4解密 + SM4解密 密文 明文 - SM4加密 + SM4加密 明文 密文 - SM2加密解密 + SM2加密解密 - 公钥 + 公钥 - 私钥 + 私钥 - 公钥加密明文 + 公钥加密明文 明文 密文 - 私钥解密密文 + 私钥解密密文 密文 明文 - Sm4算法 - 对标国际DES算法 + Sm4算法 + 对标国际DES算法 - 数据 + 数据 - 秘钥 + 秘钥 - 向量 + 向量 - 明文是否是十六进制 + 明文是否是十六进制 - 加密模式(默认ECB) - 统一改为ECB模式 + 加密模式(默认ECB) + 统一改为ECB模式 - ECB加密 + ECB加密 - CBC加密 + CBC加密 - 解密 + 解密 - ECB解密 + ECB解密 - CBC解密 + CBC解密 - 加密类型 + 加密类型 - ECB(电码本模式) + ECB(电码本模式) - CBC(密码分组链接模式) + CBC(密码分组链接模式) - SM2工具类 + SM2工具类 - 获取公钥私钥 + 获取公钥私钥 - 加密 + 加密 公钥 需要加密的值 @@ -758,23 +758,23 @@ - 加密 + 加密 公钥 需要加密的值 - - - - - - + + + + + + - 解密 + 解密 @@ -782,22 +782,22 @@ - 公钥 + 公钥 - 私钥 + 私钥 - SM4工具类 + SM4工具类 - 加密 非线性τ函数B=τ(A) + 加密 非线性τ函数B=τ(A) @@ -805,7 +805,7 @@ - 解密 非线性τ函数B=τ(A) + 解密 非线性τ函数B=τ(A) @@ -813,7 +813,7 @@ - 循环移位,为32位的x循环左移n位 + 循环移位,为32位的x循环左移n位 @@ -821,43 +821,43 @@ - 将密钥逆序 + 将密钥逆序 - S盒 + S盒 - 系统参数FK + 系统参数FK - 固定参数CK + 固定参数CK - Sm4的S盒取值 + Sm4的S盒取值 - 线性变换 L + 线性变换 L - 轮函数 F + 轮函数 F @@ -868,21 +868,21 @@ - 轮密钥rk + 轮密钥rk - 加密密钥 + 加密密钥 - 解密函数 + 解密函数 轮密钥 输入分组的密文 @@ -890,7 +890,7 @@ - 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串 + 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串 1表示加密,0表示解密 @@ -898,21 +898,21 @@ - 设置加密的key + 设置加密的key - 设置解密的key + 设置解密的key - ECB + ECB @@ -920,7 +920,7 @@ - CBC + CBC @@ -929,39 +929,39 @@ - SM4处理中心 + SM4处理中心 - 1表示加密,0表示解密 + 1表示加密,0表示解密 - 密钥 + 密钥 - 是否补足16进制字符串 + 是否补足16进制字符串 - 头像功能 + 头像功能 - 获取姓名对应的颜色值 + 获取姓名对应的颜色值 - 获取姓名对应的图片 + 获取姓名对应的图片 @@ -970,7 +970,7 @@ - 获取图片base64格式 + 获取图片base64格式 名称 宽 @@ -979,49 +979,49 @@ - 用 正则表达式 判断字符是不是汉字 + 用 正则表达式 判断字符是不是汉字 待判断字符或字符串 真:是汉字;假:不是 - 图片转换成base64 + 图片转换成base64 - 图片转换成base64 + 图片转换成base64 - base64转bitmap + base64转bitmap - base64转bitmap + base64转bitmap - base64转image格式 + base64转image格式 - 重新修改尺寸 + 重新修改尺寸 图片 尺寸 @@ -1029,25 +1029,25 @@ - Resize图片 + Resize图片 - 原始Bitmap + 原始Bitmap 新的宽度 新的高度 处理以后的图片 - Resize图片 + Resize图片 - 原始Bitmap + 原始Bitmap 新的宽度 新的高度 处理以后的图片 - 获取缩略图 + 获取缩略图 宽 @@ -1056,7 +1056,7 @@ - 获取缩略图 + 获取缩略图 宽 @@ -1065,12 +1065,12 @@ - 密码相关通用类 + 密码相关通用类 - 密码相似度 + 密码相似度 @@ -1078,7 +1078,7 @@ - 计算莱文斯坦距离算法 + 计算莱文斯坦距离算法 @@ -1086,7 +1086,7 @@ - 压缩单个文件 + 压缩单个文件 要压缩的文件 压缩后的文件 @@ -1095,28 +1095,28 @@ - 压缩单个文件 + 压缩单个文件 要进行压缩的文件名 压缩后生成的压缩文件名 - 压缩多个文件到指定路径 + 压缩多个文件到指定路径 压缩到哪个路径 压缩文件名称 - 压缩多层目录 + 压缩多层目录 待压缩目录 压缩后生成的压缩文件名,绝对路径 - 压缩多层目录 + 压缩多层目录 待压缩目录 压缩后生成的压缩文件名,绝对路径 @@ -1124,7 +1124,7 @@ - 递归遍历目录 + 递归遍历目录 需遍历的目录 压缩输出流对象 @@ -1133,7 +1133,7 @@ - 解压缩一个 zip 文件。 + 解压缩一个 zip 文件。 压缩文件 解压目录 @@ -1142,7 +1142,7 @@ - 解压缩一个 zip 文件。 + 解压缩一个 zip 文件。 压缩文件 解压目录 @@ -1150,15 +1150,15 @@ - 解压缩一个 zip 文件。 - 覆盖已存在的文件。 + 解压缩一个 zip 文件。 + 覆盖已存在的文件。 压缩文件 解压目录 - 获取压缩文件中指定类型的文件 + 获取压缩文件中指定类型的文件 压缩文件 文件类型(.txt|.exe) @@ -1166,14 +1166,14 @@ - 获取压缩文件中的所有文件 + 获取压缩文件中的所有文件 压缩文件 文件名称列表(包含子目录) - 打包线上线下文件 + 打包线上线下文件 压缩文件名称 文件列表 @@ -1186,38 +1186,37 @@ 是否删除原文件夹 - - 获取所有文件 - - + + 获取所有文件 + + - - 获取一个文件夹下的所有文件夹里的文件 - - - + + 获取一个文件夹下的所有文件夹里的文件 + + - - 获取一个文件夹下的文件 - - 目录名称 - 文件列表HastTable + + 获取一个文件夹下的文件 + + 目录名称 + 文件列表HastTable - 文件对象 + 文件对象 - 文件名称 + 文件名称 - 文件路径 + 文件路径 diff --git a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs index c3eccc1..3c1cc6f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/UnifyResult/SimpleAdminResultProvider.cs @@ -11,7 +11,8 @@ namespace SimpleAdmin.Core; /// /// 规范化RESTful风格返回值 /// -[SuppressSniffer][UnifyModel(typeof(SimpleAdminResult<>))] +[SuppressSniffer] +[UnifyModel(typeof(SimpleAdminResult<>))] public class SimpleAdminResultProvider : IUnifyResultProvider { /// @@ -22,7 +23,7 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) { - return new JsonResult(RESTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors)); + return new JsonResult(ResTfulResult(metadata.StatusCode, data: metadata.Data, errors: metadata.Errors)); } /// @@ -33,7 +34,7 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// public IActionResult OnSucceeded(ActionExecutedContext context, object data) { - return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data)); + return new JsonResult(ResTfulResult(StatusCodes.Status200OK, true, data)); } /// @@ -44,7 +45,7 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) { - return new JsonResult(RESTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, + return new JsonResult(ResTfulResult(metadata.StatusCode ?? StatusCodes.Status400BadRequest, data: metadata.Data, errors: metadata.FirstErrorMessage ?? metadata.Message)); } @@ -65,17 +66,15 @@ public class SimpleAdminResultProvider : IUnifyResultProvider { // 处理 401 状态码 case StatusCodes.Status401Unauthorized: - await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "登录已过期,请重新登录"), + await context.Response.WriteAsJsonAsync(ResTfulResult(statusCode, errors: "登录已过期,请重新登录"), App.GetOptions()?.JsonSerializerOptions); break; // 处理 403 状态码 case StatusCodes.Status403Forbidden: await context.Response.WriteAsJsonAsync( - RESTfulResult(statusCode, errors: "禁止访问,没有权限", data: context.Request.Path), + ResTfulResult(statusCode, errors: "禁止访问,没有权限", data: context.Request.Path), App.GetOptions()?.JsonSerializerOptions); break; - - default: break; } } @@ -87,7 +86,7 @@ public class SimpleAdminResultProvider : IUnifyResultProvider /// 数据 /// 错误信息 /// - private static SimpleAdminResult RESTfulResult(int statusCode, bool succeeded = default, + private static SimpleAdminResult ResTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default) { return new SimpleAdminResult diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs index 2fb2cbc..efe55e2 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaType.cs @@ -29,5 +29,5 @@ public enum CaptchaType /// 数字运算验证码 /// [Description("数字运算验证码")] - ARITH = 2, + ARITH = 2 } \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs index 33ce408..0e08469 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Captcha/CaptchaUtil.cs @@ -18,12 +18,12 @@ public static class CaptchaUtil /// /// 验证码数 /// 长度 - /// 高度 + /// 高度 /// 字体大小 /// 类型 0:数字 1:字符 2:计算 /// public static CaptchaInfo CreateCaptcha(CaptchaType type = CaptchaType.CHAR, int length = 4, int width = 170, - int heigh = 50, int fontSize = 20) + int height = 50, int fontSize = 20) { //初始化验证码 string charCode; @@ -43,12 +43,12 @@ public static class CaptchaUtil break; } var imageGenerator = new DefaultCaptchaImageGenerator(); - var imageGeneratorOption = new CaptchaImageGeneratorOption() + var imageGeneratorOption = new CaptchaImageGeneratorOption { // 必须设置 ForegroundColors = DefaultColors.Instance.Colors, Width = width, - Height = heigh, + Height = height, FontSize = fontSize, TextBold = true, BubbleCount = 1, @@ -57,7 +57,7 @@ public static class CaptchaUtil var bytes = imageGenerator.Generate(charCode, imageGeneratorOption); - var captchaInfo = new CaptchaInfo() + var captchaInfo = new CaptchaInfo { Code = type.ToString() == "ARITH" ? resultCode : charCode, Image = bytes @@ -112,11 +112,11 @@ public static class CaptchaUtil /// public static string CreateArithCode(out string resultCode) { - var checkCode = ""; + string checkCode; var random = new Random(); var intFirst = random.Next(1, 10);//生成第一个数字 var intSec = random.Next(1, 10);//生成第二个数字 - var intTemp = 0; + int intTemp; switch (random.Next(1, 3).ToString()) { case "2": diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs index 603951e..8080bb3 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/CryptogramUtil.cs @@ -25,7 +25,7 @@ public class CryptogramUtil // 解密 if (!string.IsNullOrWhiteSpace(str)) return SM2Util.Decrypt(str); - else return ""; + return ""; } /// @@ -38,7 +38,7 @@ public class CryptogramUtil // 加密 if (!string.IsNullOrWhiteSpace(str)) return SM2Util.Encrypt(str); - else return ""; + return ""; } #endregion SM2 @@ -54,8 +54,7 @@ public class CryptogramUtil { if (!string.IsNullOrWhiteSpace(str))// 解密 return SM4Util.Decrypt(new SM4Util { Data = str }); - else - return ""; + return ""; } /// @@ -67,9 +66,8 @@ public class CryptogramUtil { if (!string.IsNullOrWhiteSpace(str))// 加密 return SM4Util.Encrypt(new SM4Util { Data = str }); - else - return ""; + return ""; } #endregion Sm4 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs index 5543a7b..f5113d5 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM2CryptoUtil.cs @@ -162,7 +162,7 @@ public class SM2CryptoUtil public static byte[] byteConvert32Bytes(BigInteger n) { - byte[] tmpd = null; + byte[] tmpd; if (n == null) { return null; diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs index de95850..b6d27ef 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Cryptogram/Sm/SM4CryptoUtil.cs @@ -21,9 +21,9 @@ public class SM4CryptoUtil /// private static long GetULongByBe(byte[] b, int i) { - long n = (long)(b[i] & 0xff) << 24 | - (long)((b[i + 1] & 0xff) << 16) | - (long)((b[i + 2] & 0xff) << 8) | + var n = (long)(b[i] & 0xff) << 24 | + (uint)((b[i + 1] & 0xff) << 16) | + (uint)((b[i + 2] & 0xff) << 8) | b[i + 3] & 0xff & 0xffffffffL; return n; } @@ -50,7 +50,7 @@ public class SM4CryptoUtil /// private static long Rotl(long x, int n) { - return ((x & 0xFFFFFFFF) << n) | x >> (32 - n); + return (x & 0xFFFFFFFF) << n | x >> 32 - n; } /// @@ -60,16 +60,17 @@ public class SM4CryptoUtil /// private static void Swap(long[] sk, int i) { - long t = sk[i]; - sk[i] = sk[(31 - i)]; - sk[(31 - i)] = t; + var t = sk[i]; + sk[i] = sk[31 - i]; + sk[31 - i] = t; } /// /// S盒 /// - public byte[] SboxTable = new byte[] { - // 0 1 2 3 4 5 6 7 8 9 a b c d e f + public byte[] SboxTable = new byte[] + { + // 0 1 2 3 4 5 6 7 8 9 a b c d e f 0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05, 0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99, 0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62, @@ -96,15 +97,16 @@ public class SM4CryptoUtil /// /// 固定参数CK /// - public uint[] CK = { - 0x00070e15,0x1c232a31,0x383f464d,0x545b6269, - 0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9, - 0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249, - 0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9, - 0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229, - 0x30373e45,0x4c535a61,0x686f767d,0x848b9299, - 0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209, - 0x10171e25,0x2c333a41,0x484f565d,0x646b7279 + public uint[] CK = + { + 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, + 0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9, + 0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249, + 0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9, + 0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229, + 0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299, + 0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209, + 0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 }; /// @@ -114,8 +116,8 @@ public class SM4CryptoUtil /// private byte Sm4Sbox(byte inch) { - int i = inch & 0xFF; - byte retVal = SboxTable[i]; + var i = inch & 0xFF; + var retVal = SboxTable[i]; return retVal; } @@ -126,15 +128,15 @@ public class SM4CryptoUtil /// private long Sm4Lt(long ka) { - byte[] a = new byte[4]; - byte[] b = new byte[4]; + var a = new byte[4]; + var b = new byte[4]; PutULongToBe(ka, a, 0); b[0] = Sm4Sbox(a[0]); b[1] = Sm4Sbox(a[1]); b[2] = Sm4Sbox(a[2]); b[3] = Sm4Sbox(a[3]); - long bb = GetULongByBe(b, 0); - long c = bb ^ Rotl(bb, 2) ^ Rotl(bb, 10) ^ Rotl(bb, 18) ^ Rotl(bb, 24); + var bb = GetULongByBe(b, 0); + var c = bb ^ Rotl(bb, 2) ^ Rotl(bb, 10) ^ Rotl(bb, 18) ^ Rotl(bb, 24); return c; } @@ -147,7 +149,8 @@ public class SM4CryptoUtil /// /// /// - private long Sm4F(long x0, long x1, long x2, long x3, long rk) + private long Sm4F(long x0, long x1, long x2, + long x3, long rk) { return x0 ^ Sm4Lt(x1 ^ x2 ^ x3 ^ rk); } @@ -159,15 +162,15 @@ public class SM4CryptoUtil /// private long Sm4CalciRk(long ka) { - byte[] a = new byte[4]; - byte[] b = new byte[4]; + var a = new byte[4]; + var b = new byte[4]; PutULongToBe(ka, a, 0); b[0] = Sm4Sbox(a[0]); b[1] = Sm4Sbox(a[1]); b[2] = Sm4Sbox(a[2]); b[3] = Sm4Sbox(a[3]); - long bb = GetULongByBe(b, 0); - long rk = bb ^ Rotl(bb, 13) ^ Rotl(bb, 23); + var bb = GetULongByBe(b, 0); + var rk = bb ^ Rotl(bb, 13) ^ Rotl(bb, 23); return rk; } @@ -179,13 +182,13 @@ public class SM4CryptoUtil private void SetKey(long[] SK, byte[] key) { //加密密钥长度为 128 比特 - long[] MK = new long[4]; - int i = 0; + var MK = new long[4]; + var i = 0; MK[0] = GetULongByBe(key, 0); MK[1] = GetULongByBe(key, 4); MK[2] = GetULongByBe(key, 8); MK[3] = GetULongByBe(key, 12); - long[] k = new long[36]; + var k = new long[36]; //轮密钥生成方法 k[0] = MK[0] ^ FK[0]; k[1] = MK[1] ^ FK[1]; @@ -193,8 +196,8 @@ public class SM4CryptoUtil k[3] = MK[3] ^ FK[3]; for (; i < 32; i++) { - k[(i + 4)] = (k[i] ^ Sm4CalciRk(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ CK[i])); - SK[i] = k[(i + 4)]; + k[i + 4] = k[i] ^ Sm4CalciRk(k[i + 1] ^ k[i + 2] ^ k[i + 3] ^ CK[i]); + SK[i] = k[i + 4]; } } @@ -206,15 +209,16 @@ public class SM4CryptoUtil /// 输出的对应的分组明文 private void Sm4OneRound(long[] sk, byte[] input, byte[] output) { - int i = 0; - long[] ulbuf = new long[36]; + var i = 0; + var ulbuf = new long[36]; ulbuf[0] = GetULongByBe(input, 0); ulbuf[1] = GetULongByBe(input, 4); ulbuf[2] = GetULongByBe(input, 8); ulbuf[3] = GetULongByBe(input, 12); - while (i < 32) //开始32轮解密 ,一次进行4轮,共计八次 + while (i < 32)//开始32轮解密 ,一次进行4轮,共计八次 { - ulbuf[(i + 4)] = Sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]); + ulbuf[i + 4] = Sm4F(ulbuf[i], ulbuf[i + 1], ulbuf[i + 2], ulbuf[i + 3], + sk[i]); i++; } PutULongToBe(ulbuf[35], output, 0); @@ -235,13 +239,14 @@ public class SM4CryptoUtil { return null; } - byte[] ret = null; + byte[] ret; if (mode == 1) { - int p = 16 - input.Length % 16; + var 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++) + Array.Copy(input, 0, ret, 0, + input.Length); + for (var i = 0; i < p; i++) { ret[input.Length + i] = (byte)p; } @@ -250,7 +255,8 @@ public class SM4CryptoUtil { int p = input[input.Length - 1]; ret = new byte[input.Length - p]; - Array.Copy(input, 0, ret, 0, input.Length - p); + Array.Copy(input, 0, ret, 0, + input.Length - p); } return ret; } @@ -290,21 +296,24 @@ public class SM4CryptoUtil /// public byte[] Sm4CryptEcb(Sm4Context ctx, byte[] input) { - if (ctx.IsPadding && (ctx.Mode == 1)) + if (ctx.IsPadding && ctx.Mode == 1) { input = Padding(input, 1); } - int length = input.Length; - byte[] bins = new byte[length]; - Array.Copy(input, 0, bins, 0, length); - byte[] bous = new byte[length]; - for (int i = 0; length > 0; length -= 16, i++) + var length = input.Length; + var bins = new byte[length]; + Array.Copy(input, 0, bins, 0, + length); + var bous = new byte[length]; + for (var i = 0; length > 0; length -= 16, i++) { - byte[] inBytes = new byte[16]; - byte[] outBytes = new byte[16]; - Array.Copy(bins, i * 16, inBytes, 0, length > 16 ? 16 : length); + var inBytes = new byte[16]; + var outBytes = new byte[16]; + Array.Copy(bins, i * 16, inBytes, 0, + length > 16 ? 16 : length); Sm4OneRound(ctx.Key, inBytes, outBytes); - Array.Copy(outBytes, 0, bous, i * 16, length > 16 ? 16 : length); + Array.Copy(outBytes, 0, bous, i * 16, + length > 16 ? 16 : length); } if (ctx.IsPadding && ctx.Mode == 0) { @@ -326,26 +335,29 @@ public class SM4CryptoUtil { input = Padding(input, 1); } - int length = input.Length; - byte[] bins = new byte[length]; - Array.Copy(input, 0, bins, 0, length); - List bousList = new List(); + var length = input.Length; + var bins = new byte[length]; + Array.Copy(input, 0, bins, 0, + length); + var bousList = new List(); int i; if (ctx.Mode == 1) { - for (int j = 0; length > 0; length -= 16, j++) + for (var j = 0; length > 0; length -= 16, j++) { - byte[] inBytes = new byte[16]; - byte[] outBytes = new byte[16]; - byte[] out1 = new byte[16]; - Array.Copy(bins, j * 16, inBytes, 0, length > 16 ? 16 : length); + var inBytes = new byte[16]; + var outBytes = new byte[16]; + var out1 = new byte[16]; + Array.Copy(bins, j * 16, inBytes, 0, + length > 16 ? 16 : length); for (i = 0; i < 16; i++) { - outBytes[i] = ((byte)(inBytes[i] ^ iv[i])); + outBytes[i] = (byte)(inBytes[i] ^ iv[i]); } Sm4OneRound(ctx.Key, outBytes, out1); - Array.Copy(out1, 0, iv, 0, 16); - for (int k = 0; k < 16; k++) + Array.Copy(out1, 0, iv, 0, + 16); + for (var k = 0; k < 16; k++) { bousList.Add(out1[k]); } @@ -353,21 +365,24 @@ public class SM4CryptoUtil } else { - byte[] temp = new byte[16]; - for (int j = 0; length > 0; length -= 16, j++) + var temp = new byte[16]; + for (var j = 0; length > 0; length -= 16, j++) { - byte[] inBytes = new byte[16]; - byte[] outBytes = new byte[16]; - byte[] out1 = new byte[16]; - Array.Copy(bins, j * 16, inBytes, 0, length > 16 ? 16 : length); - Array.Copy(inBytes, 0, temp, 0, 16); + var inBytes = new byte[16]; + var outBytes = new byte[16]; + var out1 = new byte[16]; + Array.Copy(bins, j * 16, inBytes, 0, + length > 16 ? 16 : length); + Array.Copy(inBytes, 0, temp, 0, + 16); Sm4OneRound(ctx.Key, inBytes, outBytes); for (i = 0; i < 16; i++) { - out1[i] = ((byte)(outBytes[i] ^ iv[i])); + out1[i] = (byte)(outBytes[i] ^ iv[i]); } - Array.Copy(temp, 0, iv, 0, 16); - for (int k = 0; k < 16; k++) + Array.Copy(temp, 0, iv, 0, + 16); + for (var k = 0; k < 16; k++) { bousList.Add(out1[k]); } @@ -375,13 +390,10 @@ public class SM4CryptoUtil } if (ctx.IsPadding && ctx.Mode == 0) { - byte[] bous = Padding(bousList.ToArray(), 0); + var bous = Padding(bousList.ToArray(), 0); return bous; } - else - { - return bousList.ToArray(); - } + return bousList.ToArray(); } } @@ -411,4 +423,4 @@ public class Sm4Context /// 是否补足16进制字符串 /// public bool IsPadding; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs index b783fae..2a4eab0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/AvatarUtil.cs @@ -98,7 +98,7 @@ public static class AvatarUtil { var img = GetNameImage(name, width, height); var imgByte = img.ImgToBase64String(); - return $"data:image/png;base64," + imgByte; + return "data:image/png;base64," + imgByte; } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs index 5ff89e2..0e3f1f8 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Image/ImageUtil.cs @@ -52,11 +52,11 @@ public static class ImageUtil /// /// base64转bitmap /// - /// + /// /// - public static Bitmap GetBitmapFromBase64(this string base64string) + public static Bitmap GetBitmapFromBase64(this string base64String) { - var b = Convert.FromBase64String(base64string); + var b = Convert.FromBase64String(base64String); var ms = new MemoryStream(b); var bitmap = new Bitmap(ms); ms.Close(); @@ -66,11 +66,11 @@ public static class ImageUtil /// /// base64转bitmap /// - /// + /// /// - public static SKBitmap GetSKBitmapFromBase64(this string base64string) + public static SKBitmap GetSkBitmapFromBase64(this string base64String) { - var b = Convert.FromBase64String(base64string); + var b = Convert.FromBase64String(base64String); var bitmap = SKBitmap.Decode(b); return bitmap; } @@ -78,11 +78,11 @@ public static class ImageUtil /// /// base64转image格式 /// - /// + /// /// - public static string ToImageBase64(this string base64string) + public static string ToImageBase64(this string base64String) { - return "data:image/png;base64," + base64string; + return "data:image/png;base64," + base64String; } /// @@ -98,13 +98,11 @@ public static class ImageUtil //获取图片高度 var sourceHeight = imgToResize.Height; - float nPercent = 0; - float nPercentW = 0; - float nPercentH = 0; + float nPercent; //计算宽度的缩放比例 - nPercentW = size.Width / (float)sourceWidth; + var nPercentW = size.Width / (float)sourceWidth; //计算高度的缩放比例 - nPercentH = size.Height / (float)sourceHeight; + var nPercentH = size.Height / (float)sourceHeight; if (nPercentH < nPercentW) nPercent = nPercentH; diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs index 9505e3b..e2d9565 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Pwd/PwdUtil.cs @@ -22,7 +22,7 @@ public class PwdUtil public static double Similarity(string oldPassword, string newPassword) { var editDistance = LevenshteinDistance(oldPassword, newPassword); - var similarity = 1.0 - (double)editDistance / (double)Math.Max(oldPassword.Length, newPassword.Length); + var similarity = 1.0 - editDistance / (double)Math.Max(oldPassword.Length, newPassword.Length); return similarity * 100; } @@ -59,4 +59,4 @@ public class PwdUtil } return distance[s1.Length, s2.Length]; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs index 882c1c1..31180ac 100644 --- a/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.Core/Utils/Zip/ZipUtils.cs @@ -17,54 +17,53 @@ public class ZipUtils /// 压缩后的文件 /// 压缩等级 /// 每次写入大小 - public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize) + public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, + int blockSize) { //如果文件没有找到,则报错 - if (!System.IO.File.Exists(fileToZip)) + if (!File.Exists(fileToZip)) { - throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); + throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); } - using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) + using (var zipFile = File.Create(zipedFile)) { - using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) + using (var zipStream = new ZipOutputStream(zipFile)) { - using (System.IO.FileStream StreamToZip = new System.IO.FileStream(fileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read)) + using (var streamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read)) { - string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); - - ZipEntry ZipEntry = new ZipEntry(fileName); + var fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\", StringComparison.Ordinal) + 1); - ZipStream.PutNextEntry(ZipEntry); + var zipEntry = new ZipEntry(fileName); - ZipStream.SetLevel(compressionLevel); + zipStream.PutNextEntry(zipEntry); - byte[] buffer = new byte[blockSize]; + zipStream.SetLevel(compressionLevel); - int sizeRead = 0; + var buffer = new byte[blockSize]; try { + var sizeRead = 0; do { - sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); - ZipStream.Write(buffer, 0, sizeRead); - } - while (sizeRead > 0); + sizeRead = streamToZip.Read(buffer, 0, buffer.Length); + zipStream.Write(buffer, 0, sizeRead); + } while (sizeRead > 0); } - catch (System.Exception ex) + catch (Exception ex) { throw ex; } - StreamToZip.Close(); + streamToZip.Close(); } - ZipStream.Finish(); - ZipStream.Close(); + zipStream.Finish(); + zipStream.Close(); } - ZipFile.Close(); + zipFile.Close(); } } @@ -78,27 +77,27 @@ public class ZipUtils //如果文件没有找到,则报错 if (!File.Exists(fileToZip)) { - throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); + throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!"); } - using (FileStream fs = File.OpenRead(fileToZip)) + using (var fs = File.OpenRead(fileToZip)) { - byte[] buffer = new byte[fs.Length]; + var buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); - using (FileStream ZipFile = File.Create(zipedFile)) + using (var zipFile = File.Create(zipedFile)) { - using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)) + using (var zipStream = new ZipOutputStream(zipFile)) { - string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); - ZipEntry ZipEntry = new ZipEntry(fileName); - ZipStream.PutNextEntry(ZipEntry); - ZipStream.SetLevel(5); - - ZipStream.Write(buffer, 0, buffer.Length); - ZipStream.Finish(); - ZipStream.Close(); + var fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1); + var zipEntry = new ZipEntry(fileName); + zipStream.PutNextEntry(zipEntry); + zipStream.SetLevel(5); + + zipStream.Write(buffer, 0, buffer.Length); + zipStream.Finish(); + zipStream.Close(); } } } @@ -112,25 +111,25 @@ public class ZipUtils public static void ZipFile(List sourceFileNames, string zipFileName) { //压缩文件打包 - using (ZipOutputStream s = new ZipOutputStream(File.Create(zipFileName))) + using (var s = new ZipOutputStream(File.Create(zipFileName))) { s.SetLevel(9); - byte[] buffer = new byte[4096]; - foreach (string file in sourceFileNames) + var buffer = new byte[4096]; + foreach (var file in sourceFileNames) { if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 { - string pPath = ""; + var pPath = ""; pPath += Path.GetFileName(file); pPath += "\\"; ZipSetp(file, s, pPath, sourceFileNames); } - else // 否则直接压缩文件 + else// 否则直接压缩文件 { - ZipEntry entry = new ZipEntry(Path.GetFileName(file)); + var entry = new ZipEntry(Path.GetFileName(file)); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); - using (FileStream fs = File.OpenRead(file)) + using (var fs = File.OpenRead(file)) { int sourceBytes; do @@ -153,9 +152,9 @@ public class ZipUtils /// 压缩后生成的压缩文件名,绝对路径 public static void ZipFileDirectory(string strDirectory, string zipedFile) { - using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) + using (var zipFile = File.Create(zipedFile)) { - using (ZipOutputStream s = new ZipOutputStream(ZipFile)) + using (var s = new ZipOutputStream(zipFile)) { s.SetLevel(9); ZipSetp(strDirectory, s, ""); @@ -171,9 +170,9 @@ public class ZipUtils /// 指定要压缩的文件列表(完全路径) public static void ZipFileDirectory(string strDirectory, string zipedFile, List files) { - using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile)) + using (var zipFile = File.Create(zipedFile)) { - using (ZipOutputStream s = new ZipOutputStream(ZipFile)) + using (var s = new ZipOutputStream(zipFile)) { s.SetLevel(9); ZipSetp(strDirectory, s, "", files); @@ -188,17 +187,18 @@ public class ZipUtils /// 压缩输出流对象 /// The parent path. /// 需要压缩的文件 - private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, List files = null) + private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, + List files = null) { if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar) { strDirectory += Path.DirectorySeparatorChar; } - string[] filenames = Directory.GetFileSystemEntries(strDirectory); + var filenames = Directory.GetFileSystemEntries(strDirectory); - byte[] buffer = new byte[4096]; - foreach (string file in filenames)// 遍历所有的文件和目录 + var buffer = new byte[4096]; + foreach (var file in filenames)// 遍历所有的文件和目录 { if (files != null && !files.Contains(file)) { @@ -206,21 +206,21 @@ public class ZipUtils } if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 { - string pPath = parentPath; + var pPath = parentPath; pPath += Path.GetFileName(file); pPath += "\\"; ZipSetp(file, s, pPath, files); } - else // 否则直接压缩文件 + else// 否则直接压缩文件 { //打开压缩文件 - string fileName = parentPath + Path.GetFileName(file); - ZipEntry entry = new ZipEntry(fileName); + var fileName = parentPath + Path.GetFileName(file); + var entry = new ZipEntry(fileName); entry.DateTime = DateTime.Now; s.PutNextEntry(entry); - using (FileStream fs = File.OpenRead(file)) + using (var fs = File.OpenRead(file)) { int sourceBytes; do @@ -240,14 +240,15 @@ public class ZipUtils /// 解压目录 /// zip 文件的密码。 /// 是否覆盖已存在的文件。 - public static void UnZip(string zipedFile, string strDirectory, bool overWrite, string password) + public static void UnZip(string zipedFile, string strDirectory, bool overWrite, + string password) { if (strDirectory == "") strDirectory = Directory.GetCurrentDirectory(); if (!strDirectory.EndsWith("\\")) strDirectory = strDirectory + "\\"; - using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile))) + using (var s = new ZipInputStream(File.OpenRead(zipedFile))) { if (password != null) { @@ -257,25 +258,25 @@ public class ZipUtils while ((theEntry = s.GetNextEntry()) != null) { - string directoryName = ""; - string pathToZip = ""; + var directoryName = ""; + var pathToZip = ""; pathToZip = theEntry.Name; if (pathToZip != "") directoryName = Path.GetDirectoryName(pathToZip) + "\\"; - string fileName = Path.GetFileName(pathToZip); + var fileName = Path.GetFileName(pathToZip); Directory.CreateDirectory(strDirectory + directoryName); if (fileName != "") { - if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName))) + if (File.Exists(strDirectory + directoryName + fileName) && overWrite || !File.Exists(strDirectory + directoryName + fileName)) { - using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName)) + using (var streamWriter = File.Create(strDirectory + directoryName + fileName)) { - int size = 2048; - byte[] data = new byte[2048]; + var size = 2048; + var data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); @@ -325,14 +326,14 @@ public class ZipUtils /// 文件名称列表(包含子目录) public static List GetFiles(string zipedFile, List fileExtension) { - List files = new List(); + var files = new List(); if (!File.Exists(zipedFile)) { //return files; throw new FileNotFoundException(zipedFile); } - using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile))) + using (var s = new ZipInputStream(File.OpenRead(zipedFile))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) @@ -376,16 +377,17 @@ public class ZipUtils /// 文件列表 /// 保存路径 /// 是否本地 - public static string ZipFiles(string zipName, List fileList, out string error, bool isLocal = true) + public static string ZipFiles(string zipName, List fileList, out string error, + bool isLocal = true) { error = string.Empty; - string path = string.Format("/ZipFiles/{0}/{1}/{2}/", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); + var path = string.Format("/ZipFiles/{0}/{1}/{2}/", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); //文件保存目录 - string directory = App.WebHostEnvironment.WebRootPath + path; + var directory = App.WebHostEnvironment.WebRootPath + path; - string url = App.Configuration["FileHostUrl"].TrimEnd('/') + path + zipName; - string savePath = directory + zipName; + var url = App.Configuration["FileHostUrl"].TrimEnd('/') + path + zipName; + var savePath = directory + zipName; try { if (!Directory.Exists(directory)) @@ -393,16 +395,16 @@ public class ZipUtils Directory.CreateDirectory(directory); } - using (ZipOutputStream zipStream = new ZipOutputStream(File.Create(savePath))) + using (var zipStream = new ZipOutputStream(File.Create(savePath))) { - zipStream.SetLevel(9); //压缩级别0-9 + zipStream.SetLevel(9);//压缩级别0-9 foreach (var item in fileList) { byte[] buffer = null; if (isLocal) { - FileStream stream = new FileInfo(item.FilePath).OpenRead(); + var stream = new FileInfo(item.FilePath).OpenRead(); buffer = new byte[stream.Length]; stream.Read(buffer, 0, Convert.ToInt32(stream.Length)); } @@ -410,7 +412,7 @@ public class ZipUtils { buffer = new WebClient().DownloadData(item.FilePath);//取消 } - ZipEntry entry = new ZipEntry(item.FileName); + var entry = new ZipEntry(item.FileName); entry.DateTime = DateTime.Now; entry.Size = buffer.Length; zipStream.PutNextEntry(entry); @@ -431,22 +433,22 @@ public class ZipUtils public static string CompressDirectory(string dirPath, bool deleteDir) { //压缩文件路径 - string pCompressPath = dirPath + ".zip"; + var pCompressPath = dirPath + ".zip"; if (File.Exists(pCompressPath)) File.Delete(pCompressPath); //创建压缩文件 - FileStream pCompressFile = new FileStream(pCompressPath, FileMode.Create); - using (ZipOutputStream zipoutputstream = new ZipOutputStream(pCompressFile)) + var pCompressFile = new FileStream(pCompressPath, FileMode.Create); + using (var zipoutputstream = new ZipOutputStream(pCompressFile)) { - Crc32 crc = new Crc32(); - Dictionary fileList = GetAllFies(dirPath); - foreach (KeyValuePair item in fileList) + var crc = new Crc32(); + var fileList = GetAllFies(dirPath); + foreach (var item in fileList) { - FileStream fs = new FileStream(item.Key.ToString(), FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var fs = new FileStream(item.Key, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); // FileStream fs = File.OpenRead(item.Key.ToString()); - byte[] buffer = new byte[fs.Length]; + var buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); - ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length)); + var entry = new ZipEntry(item.Key.Substring(dirPath.Length)); entry.DateTime = item.Value; entry.Size = fs.Length; fs.Close(); @@ -470,15 +472,15 @@ public class ZipUtils /// private static Dictionary GetAllFies(string dir) { - Dictionary FilesList = new Dictionary(); - DirectoryInfo fileDire = new DirectoryInfo(dir); + var filesList = new Dictionary(); + var fileDire = new DirectoryInfo(dir); if (!fileDire.Exists) { - throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!"); + throw new FileNotFoundException("目录:" + fileDire.FullName + "没有找到!"); } - GetAllDirFiles(fileDire, FilesList); - GetAllDirsFiles(fileDire.GetDirectories(), FilesList); - return FilesList; + GetAllDirFiles(fileDire, filesList); + GetAllDirsFiles(fileDire.GetDirectories(), filesList); + return filesList; } /// @@ -488,9 +490,9 @@ public class ZipUtils /// private static void GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary filesList) { - foreach (DirectoryInfo dir in dirs) + foreach (var dir in dirs) { - foreach (FileInfo file in dir.GetFiles(".")) + foreach (var file in dir.GetFiles(".")) { filesList.Add(file.FullName, file.LastWriteTime); } @@ -505,7 +507,7 @@ public class ZipUtils /// 文件列表HastTable private static void GetAllDirFiles(DirectoryInfo dir, Dictionary filesList) { - foreach (FileInfo file in dir.GetFiles()) + foreach (var file in dir.GetFiles()) { filesList.Add(file.FullName, file.LastWriteTime); } @@ -526,4 +528,4 @@ public class FileItem /// 文件路径 /// public string FilePath { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs index f1fec99..61a2099 100644 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs +++ b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Aop/Aop/GlobalDispatchProxy.cs @@ -39,13 +39,10 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy After(method, null, args); return method.Invoke(Target, args);//直接返回 } - else - { - var result = Before(method, args);//方法执行之前判断是否有缓存的数据 - if (result == null) result = method.Invoke(Target, args);//如果没有缓存就执行方法返回数据 - After(method, result, args);//方法执行之后干的事 - return result;//返回结果 - } + var result = Before(method, args);//方法执行之前判断是否有缓存的数据 + if (result == null) result = method.Invoke(Target, args);//如果没有缓存就执行方法返回数据 + After(method, result, args);//方法执行之后干的事 + return result;//返回结果 } /// @@ -118,11 +115,12 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy if (cacheAttribute != null) { var redisManager = Services.GetService();// 获取redis服务 - var cacheKey = cacheAttribute.CustomKeyValue ?? CustomCacheKey(cacheAttribute.KeyPrefix, method, args);//如果redisKey值,如果有自定义值就用自定义Key,否则以前缀+系统自动生成的Key - var cacheValue = string.Empty; + var cacheKey = cacheAttribute.CustomKeyValue + ?? CustomCacheKey(cacheAttribute.KeyPrefix, method, args);//如果redisKey值,如果有自定义值就用自定义Key,否则以前缀+系统自动生成的Key + string cacheValue; if (cacheAttribute.StoreType == CacheConst.CACHE_HASH)//如果存的是Hash值 { - cacheValue = redisManager.HashGet(cacheKey, new string[] { args[0].ToString() })[0];//从redis获取Hash数据取第一个,注意是 string 类型 + cacheValue = redisManager.HashGet(cacheKey, args[0].ToString())[0];//从redis获取Hash数据取第一个,注意是 string 类型 } else { @@ -158,10 +156,7 @@ public class GlobalDispatchProxy : AspectDispatchProxy, IDispatchProxy dynamic result = JsonConvert.DeserializeObject(cacheValue, returnType);//序列化数据 return result; } - else - { - return cacheValue; - } + return cacheValue; } } return null; @@ -256,7 +251,7 @@ internal static class GetCacheKey /// public static string GetArgumentValue(object arg) { - if (arg is DateTime || arg is DateTime?) + if (arg is DateTime || arg is DateTime) return ((DateTime)arg).ToString("yyyyMMddHHmmss"); if (arg is string || arg is ValueType || arg is Nullable) @@ -270,7 +265,7 @@ internal static class GetCacheKey var result = Resolve(obj); return MD5Encryption.Encrypt(result); } - else if (arg.GetType().IsClass) + if (arg.GetType().IsClass) { return MD5Encryption.Encrypt(JsonConvert.SerializeObject(arg)); } @@ -343,7 +338,7 @@ internal static class GetCacheKey var name = (left as MemberExpression).Member.Name; var value = (right as ConstantExpression).Value; var @operator = GetOperator(expressiontype); - return name + @operator + value ?? "null"; + return name + @operator + value; } private static string ResolveLinqToObject(Expression expression, object value, ExpressionType? expressiontype = null) @@ -353,9 +348,7 @@ internal static class GetCacheKey switch (methodName) { case "Contains": - if (methodCall.Object != null) - return Like(methodCall); - return In(methodCall, value); + return methodCall.Object != null ? Like(methodCall) : In(methodCall, value); case "Count": return Len(methodCall, value, expressiontype.Value); @@ -391,8 +384,8 @@ internal static class GetCacheKey var argument1 = (expression.Arguments[0] as MemberExpression).Expression as ConstantExpression; var argument2 = expression.Arguments[1] as MemberExpression; var fieldArray = argument1.Value.GetType().GetFields().First(); - object[] array = fieldArray.GetValue(argument1.Value) as object[]; - List setInPara = new List(); + var array = fieldArray.GetValue(argument1.Value) as object[]; + var setInPara = new List(); for (var i = 0; i < array.Length; i++) { var value = array[i].ToString(); @@ -423,7 +416,7 @@ internal static class GetCacheKey object name = (expression.Arguments[0] as MemberExpression).Member.Name; var @operator = GetOperator(expressiontype); var result = string.Format("len({0}){1}{2}", name, @operator, - value.ToString()); + value); return result; } } diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs deleted file mode 100644 index 2067dcb..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Enum/NoticeComponent.cs +++ /dev/null @@ -1,17 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.Core; - -/// -/// 通知组件类型 -/// -public enum NoticeComponent -{ - Signalr, Mqtt -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs deleted file mode 100644 index 85368b0..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/GlobalUsing.cs +++ /dev/null @@ -1,9 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -global using Furion.DependencyInjection; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs deleted file mode 100644 index 236bec1..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Interface/INoticeService.cs +++ /dev/null @@ -1,42 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.Core; - -/// -/// 通知服务 -/// -public interface INoticeService : ISingleton -{ - /// - /// 通知用户下线 - /// - /// 用户ID - /// clientId列表 - /// 通知内容 - /// - Task UserLoginOut(string userId, List clientIds, string message); - - /// - /// 通知用户修改密码 - /// - /// 用户ID - /// clientId列表 - /// 通知内容 - /// - Task UpdatePassWord(string userId, List clientIds, string message); - - /// - /// 收到新的消息 - /// - /// 用户Id列表 - /// clientId列表 - /// - /// - Task NewMesage(List userIds, List clientIds, string message); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs deleted file mode 100644 index 3325fd4..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/Options/PluginSettingsOptions.cs +++ /dev/null @@ -1,33 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -using Furion.ConfigurableOptions; - -namespace SimpleAdmin.Plugin.Core; - -/// -/// 插件配置选项 -/// -public class PluginSettingsOptions : IConfigurableOptions -{ - /// - /// 是否开启SignalR - /// - public bool UseSignalR { get; set; } = true; - - /// - /// 是否开启Mqtt - /// - public bool UseMqtt { get; set; } = false; - - /// - /// 默认通知类型 - /// SignalR/Mqtt - /// - public NoticeComponent NoticeComponent { get; set; } = NoticeComponent.Signalr; -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.csproj deleted file mode 100644 index 589e82d..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.Core.xml - enable - enable - - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.xml deleted file mode 100644 index 5fc9cbe..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Core/SimpleAdmin.Plugin.Core.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - SimpleAdmin.Plugin.Core - - - - - 通知组件类型 - - - - - 通知服务 - - - - - 通知用户下线 - - 用户ID - clientId列表 - 通知内容 - - - - - 通知用户修改密码 - - 用户ID - clientId列表 - 通知内容 - - - - - 收到新的消息 - - 用户Id列表 - clientId列表 - - - - - - 插件配置选项 - - - - - 是否开启SignalR - - - - - 是否开启Mqtt - - - - - 默认通知类型 - SignalR/Mqtt - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs deleted file mode 100644 index e3c77e8..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Const/MqttConst.cs +++ /dev/null @@ -1,60 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// mqtt常量 -/// -public class MqttConst -{ - /// - /// mqtt认证登录信息key - /// - public const string CACHE_MQTT_CLIENT_USER = CacheConst.CACHE_PREFIX_WEB + "MqttClientUser:"; - - /// - /// mqtt主题前缀 - /// - public const string MQTT_TOPIC_PREFIX = "SimpleAdmin/"; - - /// - /// 登出 - /// - public const string MQTT_MESSAGE_LOGIN_OUT = "LoginOut"; - - /// - /// 新消息 - /// - public const string MQTT_MESSAGE_NEW = "NewMessage"; - - /// - /// 修改密码 - /// - public const string MQTT_MESSAGE_UPDATE_PASSWORD = "UpdatePassword"; - - - #region MQTT - - /// - /// mqtt连接地址 - /// - public const string MQTT_PARAM_URL = "MQTT_PARAM_URL"; - - /// - /// mqtt连接用户名 - /// - public const string MQTT_PARAM_USERNAME = "MQTT_PARAM_USERNAME"; - - /// - /// mqtt连接密码 - /// - public const string MQTT_PARAM_PASSWORD = "MQTT_PARAM_PASSWORD"; - - #endregion MQTT -} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs deleted file mode 100644 index 7b3d7ae..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Controller/MqttController.cs +++ /dev/null @@ -1,49 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -using Furion.DynamicApiController; - -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// mqtt服务控制器 -/// -[ApiDescriptionSettings(Tag = "mqtt服务")] -[Route("mqtt")] -public class MqttController : IDynamicApiController -{ - private readonly IMqttService _mqttService; - - public MqttController(IMqttService mqttService) - { - _mqttService = mqttService; - } - - /// - /// 获取mqtt登录参数 - /// - /// - [HttpGet("getParameter")] - public async Task GetParameter() - { - return await _mqttService.GetWebLoginParameter(); - } - - /// - /// mqtt认证 - /// - /// - /// - [HttpPost("auth")] - [AllowAnonymous] - [NonUnify] - public async Task Auth([FromBody] MqttAuthInput input) - { - return await _mqttService.Auth(input); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs deleted file mode 100644 index df476cd..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/GlobalUsing.cs +++ /dev/null @@ -1,21 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -global using Furion; -global using Furion.DependencyInjection; -global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore.Hosting; -global using Microsoft.Extensions.DependencyInjection; -global using SimpleAdmin.Core; -global using SimpleAdmin.Cache; -global using SimpleAdmin.Plugin.Core; -global using SimpleAdmin.SqlSugar; -global using SimpleMQTT; -global using Microsoft.AspNetCore.Authorization; -global using Microsoft.AspNetCore.Mvc; -global using SimpleAdmin.System; \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Development.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Development.json deleted file mode 100644 index 34281ee..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - //mqtt设置 - "MqttSettings": { - "Host": "127.0.0.1", - "Port": 1883, - "UserName": "admin", - "SecretKey": "admin", - "ClientId": "SimpleAdminWeb" - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Production.json b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Production.json deleted file mode 100644 index 34281ee..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Mqtt.Production.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - //mqtt设置 - "MqttSettings": { - "Host": "127.0.0.1", - "Port": 1883, - "UserName": "admin", - "SecretKey": "admin", - "ClientId": "SimpleAdminWeb" - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs deleted file mode 100644 index 00d5ac9..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/MqttComponent.cs +++ /dev/null @@ -1,40 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// mqtt组件 -/// -public sealed class MqttComponent : IServiceComponent -{ - /// - /// ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - /// 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - /// 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - /// - /// - /// - public void Load(IServiceCollection services, ComponentContext componentContext) - { - Console.WriteLine("注册Mqtt插件"); - services.AddMqttClientManager(); - } -} - -/// -/// mqtt组件 -/// 模拟 Configure -/// -public sealed class MqttApplicationComponent : IApplicationComponent -{ - public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext) - { - App.GetService();//获取mqtt服务判断配置是否有问题 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs deleted file mode 100644 index ea862ef..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttInput.cs +++ /dev/null @@ -1,35 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// mqtt认证参数 -/// -public class MqttAuthInput -{ - /// - /// 用户ID - /// - public string UserId { get; set; } - - /// - /// 账号 - /// - public string Username { get; set; } - - /// - /// 密码 - /// - public string Password { get; set; } - - /// - /// 客户端ID - /// - public string ClientId { get; set; } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs deleted file mode 100644 index 2648979..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/Dto/MqttOutput.cs +++ /dev/null @@ -1,57 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// mqtt登录参数输出 -/// -public class MqttParameterOutput -{ - /// - /// 地址 - /// - public string Url { get; set; } - - /// - /// 用户名 - /// - public string UserName { get; set; } - - /// - /// 密码 - /// - - public string Password { get; set; } - - /// - /// 客户端ID - /// - public string ClientId { get; set; } - - /// - /// 主题列表 - /// - public List Topics { get; set; } -} - -/// -/// mqtt认证输出 -/// -public class MqttAuthOutput -{ - /// - /// 结果 "allow" | "deny" | "ignore", // Default `"ignore"` - /// - public string Result { get; set; } = "deny"; - - /// - /// 是否超级管理员 - /// - public bool IsSuperuser { get; set; } = false; -} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs deleted file mode 100644 index 86e713a..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/IMqttService.cs +++ /dev/null @@ -1,29 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.Mqtt; - -/// -///Mqtt服务 -/// -public interface IMqttService : ITransient -{ - /// - /// mqtt登录http认证 - /// - /// 认证参数 - /// 用户Id - /// 认证结果 - Task Auth(MqttAuthInput input); - - /// - /// 获取mqtt登录web端参数 - /// - /// 登录参数 - Task GetWebLoginParameter(); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs deleted file mode 100644 index b5ece4a..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Mqtt/MqttService.cs +++ /dev/null @@ -1,89 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -using Furion.DataEncryption; -using Microsoft.AspNetCore.Http; -using SimpleTool; - -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// -/// -public class MqttService : IMqttService -{ - private readonly ISimpleCacheService _simpleCacheService; - private readonly ISysUserService _sysUserService; - private readonly IConfigService _configService; - - public MqttService(ISimpleCacheService simpleCacheService, ISysUserService sysUserService, IConfigService configService) - { - _simpleCacheService = simpleCacheService; - _sysUserService = sysUserService; - _configService = configService; - } - - /// - public async Task GetWebLoginParameter() - { - var user = await _sysUserService.GetUserById(UserManager.UserId);//获取用户信息 - var token = JWTEncryption.GetJwtBearerToken((DefaultHttpContext)App.HttpContext);// 获取当前token - //获取mqtt配置 - var mqttconfig = await _configService.GetListByCategory(CateGoryConst.CONFIG_MQTT_BASE); - //地址 - var url = mqttconfig.Where(it => it.ConfigKey == MqttConst.MQTT_PARAM_URL).Select(it => it.ConfigValue).FirstOrDefault(); - //用户名 - var userName = mqttconfig.Where(it => it.ConfigKey == MqttConst.MQTT_PARAM_USERNAME).Select(it => it.ConfigValue).FirstOrDefault(); - //密码 - var password = mqttconfig.Where(it => it.ConfigKey == MqttConst.MQTT_PARAM_PASSWORD).Select(it => it.ConfigValue).FirstOrDefault(); - - #region 用户名特殊处理 - - if (userName.ToLower() == "$username") - userName = user.Account; - else if (userName.ToLower() == "$userid") - userName = user.Id.ToString(); - - #endregion 用户名特殊处理 - - #region 密码特殊处理 - - if (password.ToLower() == "$username") - password = token;// 当前token作为mqtt密码 - - #endregion 密码特殊处理 - - var clientId = $"{user.Id}_{RandomHelper.CreateLetterAndNumber(5)}";//客户端ID - _simpleCacheService.Set(MqttConst.CACHE_MQTT_CLIENT_USER + clientId, token, - TimeSpan.FromMinutes(1));//将该客户端ID对应的token插入redis后面可以根据这个判断是哪个token登录的 - return new MqttParameterOutput - { - ClientId = clientId, - Password = password, - Url = url, - UserName = userName, - Topics = new List { MqttConst.MQTT_TOPIC_PREFIX + user.Id }//默认监听自己 - }; - } - - /// - public async Task Auth(MqttAuthInput input) - { - var user = await _sysUserService.GetUserByAccount(input.Username); - var mqttAuthOutput = new MqttAuthOutput { IsSuperuser = false, Result = "deny" }; - - //获取用户token - var tokens = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, user.Id.ToString()); - if (tokens != null) - { - if (tokens.Any(it => it.Token == input.Password))//判断是否有token - mqttAuthOutput.Result = "allow";//允许登录 - } - return mqttAuthOutput; - } -} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs deleted file mode 100644 index a34cd83..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/Service/Notice/MqttNoticeService.cs +++ /dev/null @@ -1,71 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.Mqtt; - -/// -/// -/// -[Injection(Named = "mqtt")] -public class MqttNoticeService : INoticeService -{ - public MqttNoticeService() - { - } - - /// - public async Task UpdatePassWord(string userId, List clientIds, string message) - { - var mqttClientManager = GetMqttClientManager(); - //发送修改密码消息 - await mqttClientManager.GetClient().PublishAsync(MqttConst.MQTT_TOPIC_PREFIX + userId, new MqttMessage - { - Data = new { Message = message, ClientIds = clientIds }, - MsgType = MqttConst.MQTT_MESSAGE_UPDATE_PASSWORD - }); - } - - /// - public async Task NewMesage(List userIds, List clientIds, string message) - { - var mqttClientManager = GetMqttClientManager(); - //遍历用户Id - foreach (var userId in userIds) - { - //发送消息 - await mqttClientManager.GetClient().PublishAsync(MqttConst.MQTT_TOPIC_PREFIX + userId, new MqttMessage - { - Data = new { Message = message }, - MsgType = MqttConst.MQTT_MESSAGE_NEW - }); - } - } - - /// - public async Task UserLoginOut(string userId, List clientIds, string message) - { - var mqttClientManager = GetMqttClientManager(); - //发送通知下线消息 - await mqttClientManager.GetClient().PublishAsync(MqttConst.MQTT_TOPIC_PREFIX + userId, new MqttMessage - { - Data = new { Message = message, ClientIds = clientIds }, - MsgType = MqttConst.MQTT_MESSAGE_LOGIN_OUT - }); - } - - /// - /// 获取hubContext - /// - /// - private IMqttClientManager GetMqttClientManager() - { - //解析服务 - var service = App.GetService(); - return service; - } -} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj deleted file mode 100644 index 5766b68..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.csproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.Mqtt.xml - enable - enable - - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml deleted file mode 100644 index fbd09f3..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.Mqtt/SimpleAdmin.Plugin.Mqtt.xml +++ /dev/null @@ -1,211 +0,0 @@ - - - - SimpleAdmin.Plugin.Mqtt - - - - - mqtt常量 - - - - - mqtt认证登录信息key - - - - - mqtt主题前缀 - - - - - 登出 - - - - - 新消息 - - - - - 修改密码 - - - - - mqtt连接地址 - - - - - mqtt连接用户名 - - - - - mqtt连接密码 - - - - - mqtt服务控制器 - - - - - 获取mqtt登录参数 - - - - - - mqtt认证 - - - - - - - mqtt组件 - - - - - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - - - - - - - mqtt组件 - 模拟 Configure - - - - - mqtt认证参数 - - - - - 用户ID - - - - - 账号 - - - - - 密码 - - - - - 客户端ID - - - - - mqtt登录参数输出 - - - - - 地址 - - - - - 用户名 - - - - - 密码 - - - - - 客户端ID - - - - - 主题列表 - - - - - mqtt认证输出 - - - - - 结果 "allow" | "deny" | "ignore", // Default `"ignore"` - - - - - 是否超级管理员 - - - - - Mqtt服务 - - - - - mqtt登录http认证 - - 认证参数 - 用户Id - 认证结果 - - - - 获取mqtt登录web端参数 - - 登录参数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 获取hubContext - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs deleted file mode 100644 index 1adbb98..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/GlobalUsing.cs +++ /dev/null @@ -1,20 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -global using Furion; -global using Furion.DependencyInjection; -global using Microsoft.AspNetCore.SignalR; -global using Microsoft.Extensions.DependencyInjection; -global using SimpleAdmin.Cache; -global using SimpleAdmin.Core; -global using SimpleAdmin.Plugin.Core; -global using Furion.InstantMessaging; -global using Masuit.Tools; -global using Microsoft.AspNetCore.Authorization; -global using Furion.DataEncryption; -global using SimpleTool; diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs deleted file mode 100644 index 6030900..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/ISimpleHub.cs +++ /dev/null @@ -1,29 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// 即时通讯集线器 -/// -public interface ISimpleHub -{ - /// - /// 退出登录 - /// - /// - /// - Task LoginOut(object context); - - /// - /// 新消息 - /// - /// - /// - Task NewMessage(object context); -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs deleted file mode 100644 index 93d9644..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Hub/SimpleHub.cs +++ /dev/null @@ -1,104 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// -/// -//[Authorize] -[MapHub("/hubs/simple")] -[Authorize] -public class SimpleHub : Hub -{ - private readonly ISimpleCacheService _simpleCacheService; - - public SimpleHub(ISimpleCacheService simpleCacheService) - { - _simpleCacheService = simpleCacheService; - } - - /// - /// 连接 - /// - /// - public override async Task OnConnectedAsync() - { - var token = Context.GetHttpContext().Request.Query["access_token"];//获取token - if (!string.IsNullOrEmpty(token)) - { - var userIdentifier = Context.UserIdentifier;//自定义的Id - UpdateRedis(userIdentifier, token);//更新redis - } - } - - /// - /// 断开连接 - /// - /// - /// - public override async Task OnDisconnectedAsync(Exception? exception) - { - var userIdentifier = Context.UserIdentifier;//自定义的Id - UpdateRedis(userIdentifier, null, false);//更新redis - await base.OnDisconnectedAsync(exception); - } - - /// - /// 退出登录 - /// - /// - /// - public async Task LoginOut(string userId) - { - await Clients.User(userId).LoginOut("退出登录"); - } - - #region 方法 - - /// - /// 更新redis - /// - /// 用户id - /// token - /// 是否是上线 - private void UpdateRedis(string userIdentifier, string token, bool ifConnect = true) - { - var userId = userIdentifier.Split("_")[0];//分割取第一个 - if (!string.IsNullOrEmpty(userId)) - { - //获取redis当前用户的token信息列表 - var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId); - if (tokenInfos != null) - { - if (ifConnect) - { - //获取redis中当前token - var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault(); - if (tokenInfo != null) - { - tokenInfo.ClientIds.Add(userIdentifier);//添加到客户端列表 - _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//更新Redis - } - } - else - { - //获取当前客户端ID所在的token信息 - var tokenInfo = tokenInfos.Where(it => it.ClientIds.Contains(userIdentifier)).FirstOrDefault(); - if (tokenInfo != null) - { - tokenInfo.ClientIds.RemoveWhere(it => it == userIdentifier);//从客户端列表删除 - _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//更新Redis - } - } - } - } - } - - #endregion 方法 -} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs deleted file mode 100644 index ea9b5c9..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Provider/UserIdProvider.cs +++ /dev/null @@ -1,26 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// 用户ID提供器 -/// -public class UserIdProvider : IUserIdProvider -{ - public string GetUserId(HubConnectionContext connection) - { - var token = connection.GetHttpContext().Request.Query["access_token"];//获取token - var claims = JWTEncryption.ReadJwtToken(token)?.Claims;//解析token - var userId = claims.FirstOrDefault(u => u.Type == ClaimConst.USER_ID)?.Value;//获取用户ID - if (!string.IsNullOrEmpty(userId))//如果不为空 - return $"{userId}_{RandomHelper.CreateLetterAndNumber(5)}";//返回用户ID - else - return connection.ConnectionId; - } -} diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs deleted file mode 100644 index acee4e4..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/Service/SignalrNoticeService.cs +++ /dev/null @@ -1,56 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// -/// -[Injection(Named = "signalr")] -public class SignalrNoticeService : INoticeService -{ - public SignalrNoticeService() - { - } - - /// - public async Task UpdatePassWord(string userId, List clientIds, string message) - { - //发送消息给用户 - await GetHubContext().Clients.Users(clientIds).NewMessage(message); - } - - /// - public async Task NewMesage(List userIds, List clientIds, string message) - { - //发送消息给用户 - await GetHubContext().Clients.Users(clientIds).NewMessage(message); - } - - /// - public async Task UserLoginOut(string userId, List clientIds, string message) - { - //发送消息给用户 - await GetHubContext().Clients.Users(clientIds).LoginOut(message); - } - - #region MyRegion - - /// - /// 获取hubContext - /// - /// - private IHubContext GetHubContext() - { - //解析服务 - var service = App.GetService>(); - return service; - } - - #endregion MyRegion -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs deleted file mode 100644 index 0dd371d..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SignalRComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -namespace SimpleAdmin.Plugin.SignalR; - -/// -/// SignalR组件 -/// -public sealed class SignalRComponent : IServiceComponent -{ - /// - /// ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - /// 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - /// 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - /// - /// - /// - public void Load(IServiceCollection services, ComponentContext componentContext) - { - Console.WriteLine("注册SignalR插件"); - services.AddSignalR();//注册SignalR - services.AddSingleton();//用户ID提供器 - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.csproj b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.csproj deleted file mode 100644 index 305f8c2..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.csproj +++ /dev/null @@ -1,16 +0,0 @@ - - - - net7.0;net6.0 - 1701;1702;8616;1591;8618;8619;8629;8602;8603;8604;8625;8765 - SimpleAdmin.Plugin.SignalR.xml - enable - enable - - - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.xml b/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.xml deleted file mode 100644 index 6357d3a..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Plugin/SimpleAdmin.Plugin.SignalR/SimpleAdmin.Plugin.SignalR.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - SimpleAdmin.Plugin.SignalR - - - - - 即时通讯集线器 - - - - - 退出登录 - - - - - - - 新消息 - - - - - - - - - - - - 连接 - - - - - - 断开连接 - - - - - - - 退出登录 - - - - - - - 更新redis - - 用户id - token - 是否是上线 - - - - 用户ID提供器 - - - - - - - - - - - - - - - - - - - 获取hubContext - - - - - - SignalR组件 - - - - - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - - - - - - diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs index 618007a..f526a0c 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Const/SqlsugarConst.cs @@ -9,9 +9,9 @@ namespace SimpleAdmin.SqlSugar; /// -/// Sqlsugar系统常量类 +/// SqlSugar系统常量类 /// -public class SqlsugarConst +public class SqlSugarConst { /// /// 默认库ConfigId diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs index 45e9238..bd8e115 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbContext.cs @@ -16,7 +16,7 @@ namespace SimpleAdmin.SqlSugar; public static class DbContext { /// - /// 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 + /// 读取配置文件中的 ConnectionStrings:SqlSugar 配置节点 /// public static readonly List DB_CONFIGS = App.GetConfig>("SqlSugarSettings:ConnectionStrings"); @@ -55,13 +55,13 @@ public static class DbContext EntityService = (c, p) => { //如果是mysql并且是varchar(max) 已弃用 - //if (config.DbType == SqlSugar.DbType.MySql && (p.DataType == SqlsugarConst.NVarCharMax)) + //if (config.DbType == SqlSugar.DbType.MySql && (p.DataType == SqlSugarConst.NVarCharMax)) //{ - // p.DataType = SqlsugarConst.LongText;//转成mysql的longtext + // p.DataType = SqlSugarConst.LongText;//转成mysql的longtext //} - //else if (config.DbType == SqlSugar.DbType.Sqlite && (p.DataType == SqlsugarConst.NVarCharMax)) + //else if (config.DbType == SqlSugar.DbType.Sqlite && (p.DataType == SqlSugarConst.NVarCharMax)) //{ - // p.DataType = SqlsugarConst.Text;//转成sqlite的text + // p.DataType = SqlSugarConst.Text;//转成sqlite的text //} //默认不写IsNullable为非必填 //if (new NullabilityInfoContext().Create(c).WriteState is NullabilityState.Nullable) @@ -111,7 +111,7 @@ public static class DbContext } }; //异常 - db.Aop.OnError = (ex) => + db.Aop.OnError = ex => { //如果不是开发环境就打印日志 if (App.WebHostEnvironment.IsDevelopment()) @@ -146,7 +146,7 @@ public static class DbContext if (entityInfo.PropertyName == nameof(BaseEntity.CreateUserId)) entityInfo.SetValue(App.User.FindFirst(ClaimConst.USER_ID)?.Value); if (entityInfo.PropertyName == nameof(BaseEntity.CreateUser)) - entityInfo.SetValue(App.User?.FindFirst(ClaimConst.ACCOUNT)?.Value); + entityInfo.SetValue(App.User.FindFirst(ClaimConst.ACCOUNT)?.Value); if (entityInfo.PropertyName == nameof(DataEntityBase.CreateOrgId)) entityInfo.SetValue(App.User.FindFirst(ClaimConst.ORG_ID)?.Value); } diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs index 5c990c4..36af634 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/DbRepository.cs @@ -12,14 +12,14 @@ namespace SimpleAdmin.SqlSugar; /// 仓储模式对象 /// [SuppressSniffer] -public partial class DbRepository : SimpleClient where T : class, new() +public class DbRepository : SimpleClient where T : class, new() { - protected ITenant Itenant = null;//多租户事务、GetConnection、IsAnyConnection等功能 + protected ITenant Tenant;//多租户事务、GetConnection、IsAnyConnection等功能 public DbRepository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null { Context = DbContext.DB.GetConnectionScopeWithAttr();//ioc注入的对象 - Itenant = DbContext.DB; + Tenant = DbContext.DB; } #region 仓储方法拓展 @@ -36,8 +36,7 @@ public partial class DbRepository : SimpleClient where T : class, new() { if (data.Count > threshold) return await Context.Fastest().BulkCopyAsync(data);//大数据导入 - else - return await Context.Insertable(data).ExecuteCommandAsync();//普通导入 + return await Context.Insertable(data).ExecuteCommandAsync();//普通导入 } #endregion 插入 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs index f38a281..ed0fd99 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Db/SqlsugarConfig.cs @@ -9,7 +9,7 @@ namespace SimpleAdmin.SqlSugar; /// -/// sqlsugar数据库配置 +/// SqlSugar数据库配置 /// public sealed class SqlSugarConfig : ConnectionConfig { @@ -17,4 +17,4 @@ public sealed class SqlSugarConfig : ConnectionConfig /// 是否驼峰转下划线 /// public bool IsUnderLine { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs index 7458002..938dd0c 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Entity/BaseEntity.cs @@ -71,7 +71,7 @@ public class BaseEntity : PrimaryKeyEntity /// 软删除 /// [SugarColumn(ColumnDescription = "软删除", IsNullable = true)] - public virtual bool IsDelete { get; set; } = false; + public virtual bool IsDelete { get; set; } } /// @@ -84,4 +84,4 @@ public abstract class DataEntityBase : BaseEntity /// [SugarColumn(ColumnDescription = "创建者部门Id")] public virtual long CreateOrgId { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs index 368d898..a3ead86 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Extension/SqlSugarPageExtension.cs @@ -9,7 +9,7 @@ namespace SimpleAdmin.SqlSugar; /// -/// Sqlsugar分页拓展类 +/// SqlSugar分页拓展类 /// public static class SqlSugarPageExtension { diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj index a19e4ca..daef2b0 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.csproj @@ -8,7 +8,7 @@ enable - + diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml index 3cd0b95..6d3d8bf 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SimpleAdmin.SqlSugar.xml @@ -6,144 +6,144 @@ - 前端控件作用类型常量 + 前端控件作用类型常量 - 输入框 + 输入框 - 文本框 + 文本框 - 下拉框 + 下拉框 - 单选框 + 单选框 - 复选框 + 复选框 - 日期选择器 + 日期选择器 - 时间选择器 + 时间选择器 - 数字输入框 + 数字输入框 - 滑动数字条 + 滑动数字条 - 下拉框 + 下拉框 - + - Sqlsugar系统常量类 + SqlSugar系统常量类 - + - 默认库ConfigId + 默认库ConfigId - + - 默认表主键 + 默认表主键 - + - varchar(max) + varchar(max) - + - mysql的longtext + mysql的longtext - + - sqlite的text + sqlite的text - 数据库上下文对象 + 数据库上下文对象 - 读取配置文件中的 ConnectionStrings:Sqlsugar 配置节点 + 读取配置文件中的 ConnectionStrings:SqlSugar 配置节点 - SqlSugar 数据库实例 + SqlSugar 数据库实例 - 实体拓展配置,自定义类型多库兼容 + 实体拓展配置,自定义类型多库兼容 - Aop设置 + Aop设置 - 实体更多配置 + 实体更多配置 db 数据库类型 - 过滤器设置 + 过滤器设置 - 假删除过滤器 + 假删除过滤器 - 仓储模式对象 + 仓储模式对象 - 批量插入判断走普通导入还是大数据 + 批量插入判断走普通导入还是大数据 数据 阈值 @@ -151,7 +151,7 @@ - 获取列表指定多个字段 + 获取列表指定多个字段 查询条件 查询字段 @@ -159,7 +159,7 @@ - 获取列表指定单个字段 + 获取列表指定单个字段 查询条件 查询字段 @@ -167,7 +167,7 @@ - 获取列表指定单个字段 + 获取列表指定单个字段 查询条件 查询字段 @@ -175,7 +175,7 @@ - 获取指定表的单个字段 + 获取指定表的单个字段 查询条件 查询字段 @@ -183,7 +183,7 @@ - 获取指定表的单个字段 + 获取指定表的单个字段 查询条件 查询字段 @@ -191,7 +191,7 @@ - 根据条件查询获取自动分表的单个数据 + 根据条件查询获取自动分表的单个数据 条件表达式 开始时间 @@ -200,7 +200,7 @@ - 根据条件查询获取自动分表的单个数据 + 根据条件查询获取自动分表的单个数据 条件表达式 分表查询表达式 @@ -208,105 +208,105 @@ - sqlsugar数据库配置 + sqlsugar数据库配置 - 是否驼峰转下划线 + 是否驼峰转下划线 - Linq分页泛型集合 + Linq分页泛型集合 - 主键实体基类 + 主键实体基类 - 主键Id + 主键Id - 拓展信息 + 拓展信息 - 框架实体基类 + 框架实体基类 - 创建时间 + 创建时间 - 更新时间 + 更新时间 - 创建者Id + 创建者Id - 修改者Id + 修改者Id - 创建人 + 创建人 - 更新人 + 更新人 - 软删除 + 软删除 - 业务数据实体基类(数据权限) + 业务数据实体基类(数据权限) - 创建者部门Id + 创建者部门Id - 实体种子数据接口 + 实体种子数据接口 - 种子数据 + 种子数据 - Sqlsugar分页拓展类 + SqlSugar分页拓展类 - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -316,7 +316,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -326,7 +326,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -338,7 +338,7 @@ - SqlSugar分页扩展 + SqlSugar分页扩展 @@ -350,7 +350,7 @@ - 分页查询 + 分页查询 数据列表 @@ -360,65 +360,65 @@ - SqlSugar 分页泛型集合 + SqlSugar 分页泛型集合 - 页码 + 页码 - 数量 + 数量 - 总条数 + 总条数 - 总页数 + 总页数 - 当前页集合 + 当前页集合 - 是否有上一页 + 是否有上一页 - 是否有下一页 + 是否有下一页 - SqlSugar 事务和工作单元 + SqlSugar 事务和工作单元 - SqlSugar 对象 + SqlSugar 对象 - 构造函数 + 构造函数 - 开启工作单元处理 + 开启工作单元处理 @@ -426,7 +426,7 @@ - 提交工作单元处理 + 提交工作单元处理 @@ -434,7 +434,7 @@ - 回滚工作单元处理 + 回滚工作单元处理 @@ -442,7 +442,7 @@ - 执行完毕(无论成功失败) + 执行完毕(无论成功失败) @@ -450,50 +450,50 @@ - AppStartup启动类 + AppStartup启动类 - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 + ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 + 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! + 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - 检查是否有相同的ConfigId + 检查是否有相同的ConfigId - CodeFirst功能类 + CodeFirst功能类 - CodeFirst生成数据库表结构和种子数据 + CodeFirst生成数据库表结构和种子数据 codefirst选项 程序集名称 - 初始化数据库表结构 + 初始化数据库表结构 程序集名称 - 初始化种子数据 + 初始化种子数据 程序集名称 - 判断类型是否实现某个泛型 + 判断类型是否实现某个泛型 类型 泛型类型 @@ -501,7 +501,7 @@ - List转DataTable + List转DataTable @@ -509,97 +509,97 @@ - 排除SqlSugar忽略的列 + 排除SqlSugar忽略的列 - + - Sqlsugar字段信息 + SqlSugar字段信息 - + - 字段名称 + 字段名称 - + - 是否主键 + 是否主键 - + - 字段类型 + 字段类型 - + - 字段注释 + 字段注释 - Sqlsugar表信息 + SqlSugar表信息 - - 所属库 + + 所属库 - 表名称 + 表名称 - 实体名 + 实体名 - 表注释 + 表注释 - 表字段 + 表字段 - 种子数据工具类 + 种子数据工具类 - 种子数据格式实体类,遵循Navicat导出json格式 + 种子数据格式实体类,遵循Navicat导出json格式 - 数据 + 数据 - Sqlusgar通用功能 + Sqlusgar通用功能 - 根据特性获取所有表信息 + 根据特性获取所有表信息 - 获取字段信息 + 获取字段信息 @@ -607,21 +607,21 @@ - 数据库字段类型转.NET类型 + 数据库字段类型转.NET类型 字段类型 - 数据类型转显示类型 + 数据类型转显示类型 - 是否通用字段 + 是否通用字段 字段名 diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Development.json b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Development.json index dc22f7f..7a54e5d 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Development.json @@ -1,7 +1,7 @@ { - //sqlsugar设置 + //sqlSugar设置 "SqlSugarSettings": { - //Sqlsugar连接字符串配置 + //SqlSugar连接字符串配置 "ConnectionStrings": [ { "ConfigId": "SimpleAdmin", //租户ID @@ -20,7 +20,7 @@ // { // "ConfigId": "SimpleAdmin", //租户ID // "ConnectionString": "Server=192.168.1.16;Database=SimpleAdmin;User=sa;Password=123456;MultipleActiveResultSets=True;", //连接字符串 - // "DbType": "SqlServer", //数据库类型 + // "DbType": "SqlServer", //数据库类型 // "IsAutoCloseConnection": true, //是否自动释放 // "IsUnderLine": false //是否驼峰转下划线 // } diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Production.json b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Production.json index 41f46d9..6943b6a 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/SqlSugar.Production.json @@ -1,7 +1,7 @@ { //sqlsugar设置 "SqlSugarSettings": { - //Sqlsugar连接字符串配置 + //SqlSugar连接字符串配置 "ConnectionStrings": [ { "ConfigId": "SimpleAdmin", //租户ID diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs index c5eacfc..7f96911 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Startup.cs @@ -45,7 +45,7 @@ public class Startup : AppStartup var configIdGroup = DbContext.DB_CONFIGS.GroupBy(it => it.ConfigId).ToList(); foreach (var configId in configIdGroup) { - if (configId.ToList().Count > 1) throw Oops.Oh($"Sqlsugar连接配置ConfigId:{configId.Key}重复了"); + if (configId.ToList().Count > 1) throw Oops.Oh($"SqlSugar连接配置ConfigId:{configId.Key}重复了"); } } } diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs index 88d9bc2..157de20 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/CodeFirstUtils.cs @@ -40,11 +40,12 @@ public static class CodeFirstUtils private static void InitTable(string assemblyName) { // 获取所有实体表-初始化表结构 - var entityTypes = App.EffectiveTypes.Where(u => !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false) && u.Assembly.FullName == assemblyName); + var entityTypes = App.EffectiveTypes.Where(u => + !u.IsInterface && !u.IsAbstract && u.IsClass && u.IsDefined(typeof(SugarTable), false) && u.Assembly.FullName == assemblyName); if (!entityTypes.Any()) return;//没有就退出 foreach (var entityType in entityTypes) { - var tenantAtt = entityType.GetCustomAttribute();//获取Sqlsugar多租户特性 + var tenantAtt = entityType.GetCustomAttribute();//获取SqlSugar多租户特性 var ignoreInit = entityType.GetCustomAttribute();//获取忽略初始化特性 if (ignoreInit != null) continue;//如果有忽略初始化特性 if (tenantAtt == null) continue;//如果没有租户特性就下一个 @@ -77,7 +78,7 @@ public static class CodeFirstUtils var seedData = ((IEnumerable)hasDataMethod?.Invoke(instance, null))?.Cast(); if (seedData == null) continue;//没有种子数据就下一个 var entityType = seedType.GetInterfaces().First().GetGenericArguments().First();//获取实体类型 - var tenantAtt = entityType.GetCustomAttribute();//获取sqlsugar租户特性 + var tenantAtt = entityType.GetCustomAttribute();//获取SqlSugar租户特性 if (tenantAtt == null) continue;//如果没有租户特性就下一个 var db = DbContext.DB.GetConnectionScope(tenantAtt.configId.ToString());//获取数据库对象 var config = DbContext.DB_CONFIGS.FirstOrDefault(u => u.ConfigId == tenantAtt.configId.ToString());//获取数据库配置 @@ -167,7 +168,7 @@ public static class CodeFirstUtils obj = obj?.ToJson();//如果json字符串是空就传null tempList.Add(obj); } - object[] array = tempList.ToArray(); + var array = tempList.ToArray(); result.LoadDataRow(array, true); } } @@ -181,13 +182,13 @@ public static class CodeFirstUtils /// private static bool IsIgnoreColumn(PropertyInfo pi) { - var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsIgnore == true); + var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsIgnore); return sc != null; } private static bool IsJsonColumn(PropertyInfo pi) { - var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsJson == true); + var sc = pi.GetCustomAttributes(false).FirstOrDefault(u => u.IsJson); return sc != null; } } diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs index 420bc08..c2a7ec0 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlSugarTableInfo.cs @@ -9,7 +9,7 @@ namespace SimpleAdmin.SqlSugar; /// -/// Sqlsugar表信息 +/// SqlSugar表信息 /// public class SqlSugarTableInfo { @@ -36,5 +36,5 @@ public class SqlSugarTableInfo /// /// 表字段 /// - public List Columns { get; set; } -} \ No newline at end of file + public List Columns { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs index 3ed0f03..b3e5f1e 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/Dto/SqlsugarColumnInfo.cs @@ -9,9 +9,9 @@ namespace SimpleAdmin.SqlSugar; /// -/// Sqlsugar字段信息 +/// SqlSugar字段信息 /// -public class SqlsugarColumnInfo +public class SqlSugarColumnInfo { /// /// 字段名称 @@ -21,7 +21,7 @@ public class SqlsugarColumnInfo /// /// 是否主键 /// - public bool IsPrimarykey { get; set; } + public bool IsPrimaryKey { get; set; } /// /// 字段类型 @@ -32,4 +32,4 @@ public class SqlsugarColumnInfo /// 字段注释 /// public string ColumnDescription { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs index aeb822d..5f74f3a 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SeedDataUtil.cs @@ -23,7 +23,7 @@ public class SeedDataUtil { //字段没有数据的替换成null dataString = dataString.Replace("\"\"", "null"); - //将json字符串转为实体,这里extjson可以正常转换为字符串 + //将json字符串转为实体,这里ExtJson可以正常转换为字符串 var seedDataRecord1 = dataString.ToJsonEntity>(); #region 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}" @@ -34,7 +34,7 @@ public class SeedDataUtil dataString = dataString.Replace("\"{", "{"); //字符串是}"的替换成} dataString = dataString.Replace("}\"", "}"); - //将json字符串转为实体,这里extjson会转为null,替换字符串把extjson值变为实体类型而实体类是string类型 + //将json字符串转为实体,这里ExtJson会转为null,替换字符串把ExtJson值变为实体类型而实体类是string类型 var seedDataRecord2 = dataString.ToJsonEntity>(); #endregion 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}" @@ -44,19 +44,19 @@ public class SeedDataUtil { #region 处理ExtJosn - //获取extjson属性 - var propertyExtJosn = typeof(T).GetProperty(nameof(PrimaryKeyEntity.ExtJson)); - if (propertyExtJosn != null) + //获取ExtJson属性 + var propertyExtJson = typeof(T).GetProperty(nameof(PrimaryKeyEntity.ExtJson)); + if (propertyExtJson != null) { - //获取extjson的值 - var extJson = propertyExtJosn.GetValue(seedDataRecord2.Records[i])?.ToString(); - // 如果extjson不为空并且包含NullableDictionary表示序列化失败了 + //获取ExtJson的值 + var extJson = propertyExtJson.GetValue(seedDataRecord2.Records[i])?.ToString(); + // 如果ExtJson不为空并且包含NullableDictionary表示序列化失败了 if (!string.IsNullOrEmpty(extJson) && extJson.Contains("NullableDictionary")) { - //设置extjson为seedDataRecord1对应的值 - extJson = propertyExtJosn.GetValue(seedDataRecord1.Records[i])?.ToString(); - //seedDataRecord2赋值seedDataRecord1的extjson - propertyExtJosn.SetValue(seedDataRecord2.Records[i], extJson); + //设置ExtJson为seedDataRecord1对应的值 + extJson = propertyExtJson.GetValue(seedDataRecord1.Records[i])?.ToString(); + //seedDataRecord2赋值seedDataRecord1的ExtJson + propertyExtJson.SetValue(seedDataRecord2.Records[i], extJson); } } @@ -64,18 +64,18 @@ public class SeedDataUtil #region 处理ConfigValue - //获取extjson属性 + //获取ExtJson属性 var propertyConfigValue = typeof(T).GetProperty("ConfigValue"); if (propertyConfigValue != null) { - //获取extjson的值 + //获取ExtJson的值 var configValue = propertyConfigValue.GetValue(seedDataRecord2.Records[i])?.ToString(); - // 如果extjson不为空并且包含NullableDictionary表示序列化失败了 + // 如果ExtJson不为空并且包含NullableDictionary表示序列化失败了 if (!string.IsNullOrEmpty(configValue) && configValue.Contains("NullableDictionary")) { - //设置extjson为seedDataRecord1对应的值 + //设置ExtJson为seedDataRecord1对应的值 configValue = propertyConfigValue.GetValue(seedDataRecord1.Records[i])?.ToString(); - //seedDataRecord2赋值seedDataRecord1的extjson + //seedDataRecord2赋值seedDataRecord1的ExtJson propertyConfigValue.SetValue(seedDataRecord2.Records[i], configValue); } } @@ -100,4 +100,4 @@ public class SeedDataRecords /// 数据 /// public List Records { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs index 237381e..8ab4346 100644 --- a/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.SqlSugar/Utils/SqlSugarUtils.cs @@ -9,7 +9,7 @@ namespace SimpleAdmin.SqlSugar; /// -/// Sqlusgar通用功能 +/// SqlSugar通用功能 /// public static class SqlSugarUtils { @@ -20,7 +20,7 @@ public static class SqlSugarUtils /// public static List GetTablesByAttribute() { - List tables = new List();//结果集 + var tables = new List();//结果集 // 获取实体表 var entityTypes = App.EffectiveTypes @@ -29,24 +29,21 @@ public static class SqlSugarUtils foreach (var entityType in entityTypes) { - var teanant = entityType.GetCustomAttribute();//获取多租户特性 - var configId = teanant.configId.ToString();//获取租户Id - if (teanant != null) + var tenantAttr = entityType.GetCustomAttribute();//获取多租户特性 + var configId = tenantAttr.configId.ToString();//获取租户Id + var connection = DbContext.DB.GetConnection(tenantAttr.configId.ToString());//根据租户ID获取连接信息 + var entityInfo = connection.EntityMaintenance.GetEntityInfo(entityType);//获取实体信息 + if (entityInfo != null) { - var connection = DbContext.DB.GetConnection(teanant.configId.ToString());//根据租户ID获取连接信息 - var entityInfo = connection.EntityMaintenance.GetEntityInfo(entityType);//获取实体信息 - if (entityInfo != null) + var columns = GetTableColumns(configId, entityInfo.DbTableName);//获取字段信息 + tables.Add(new SqlSugarTableInfo { - var columns = GetTableColumns(configId, entityInfo.DbTableName);//获取字段信息 - tables.Add(new SqlSugarTableInfo - { - TableName = entityInfo.DbTableName, - EntityName = entityInfo.EntityName, - TableDescription = entityInfo.TableDescription, - ConfigId = configId, - Columns = columns - }); - } + TableName = entityInfo.DbTableName, + EntityName = entityInfo.EntityName, + TableDescription = entityInfo.TableDescription, + ConfigId = configId, + Columns = columns + }); } } return tables; @@ -58,9 +55,9 @@ public static class SqlSugarUtils /// /// /// - public static List GetTableColumns(string configId, string tableName) + public static List GetTableColumns(string configId, string tableName) { - var columns = new List();//结果集 + var columns = new List();//结果集 var connection = DbContext.DB.GetConnection(configId); var dbColumnInfos = connection.DbMaintenance.GetColumnInfosByTableName(tableName);//根据表名获取表信息 if (dbColumnInfos != null) @@ -82,10 +79,10 @@ public static class SqlSugarUtils { it.DbColumnName = StringHelper.FirstCharToUpper(it.DbColumnName);//首字母大写 } - columns.Add(new SqlsugarColumnInfo + columns.Add(new SqlSugarColumnInfo { ColumnName = it.DbColumnName, - IsPrimarykey = it.IsPrimarykey, + IsPrimaryKey = it.IsPrimarykey, ColumnDescription = it.ColumnDescription, DataType = it.DataType }); @@ -194,7 +191,7 @@ public static class SqlSugarUtils /// public static bool IsCommonColumn(string columnName) { - var columnList = new List() + var columnList = new List { nameof(BaseEntity.CreateTime), nameof(BaseEntity.UpdateTime), nameof(BaseEntity.CreateUserId), nameof(BaseEntity.CreateUser), diff --git a/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs b/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs index ab0c1a4..dfb9964 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Attributes/AntTableAttribute.cs @@ -16,7 +16,7 @@ public class AntTableAttribute : Attribute /// /// 是否是日期格式 /// - public bool IsDate { get; set; } = false; + public bool IsDate { get; set; } /// /// 是否自动省略 @@ -27,4 +27,4 @@ public class AntTableAttribute : Attribute /// 宽度 /// public int Width { get; set; } = 100; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs b/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs index d75f307..ab7d084 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Attributes/InDictAttribute.cs @@ -44,20 +44,20 @@ public class InDictAttribute : ValidationAttribute return $"字典中不存在{value}"; } } - else return ErrorMessage; + return ErrorMessage; } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { if (value != null) { - var dictSerivce = App.GetService(); - var values = dictSerivce.GetValuesByDictValue(DictValue).Result; + var dictService = App.GetService(); + var values = dictService.GetValuesByDictValue(DictValue).Result; if (!values.Contains(value)) { - return new ValidationResult(GetErrorMessage(value.ToString()), new string[] { validationContext.MemberName }); + return new ValidationResult(GetErrorMessage(value.ToString()), new[] { validationContext.MemberName }); } } return ValidationResult.Success; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs b/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs index cd9dad2..94d3bad 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Const/SysConfigConst.cs @@ -119,7 +119,7 @@ public class SysConfigConst public const string FILE_MINIO_ACCESS_KEY = "FILE_MINIO_ACCESS_KEY"; /// - /// MINIO文件SecetKey + /// MINIO文件SecretKey /// public const string FILE_MINIO_SECRET_KEY = "FILE_MINIO_SECRET_KEY"; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs index cdfee2c..0470007 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEdit.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 批量修改 /// [SugarTable("batch_edit", TableDescription = "批量修改")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] [CodeGen] public class BatchEdit : PrimaryKeyEntity { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs index 24c7f2a..1418a8f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/BatchEditConfig.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 批量修改配置表 /// [SugarTable("batch_edit_config", TableDescription = "批量修改配置表")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class BatchEditConfig : PrimaryKeyEntity { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs index 03dd4ad..e1fad8c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientRelation.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.Core.Entity.System; /// C端用户关系 /// [SugarTable("client_relation", TableDescription = "关系")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class ClientRelation : PrimaryKeyEntity { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs index 7fce3ac..62d7ec1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/ClientUser.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// C端用户 /// [SugarTable("client_user", TableDescription = "C端用户")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class ClientUser : DataEntityBase { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs index e76ddb0..96cdaba 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysConfig.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 配置 /// [SugarTable("sys_config", TableDescription = "配置")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysConfig : BaseEntity { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs index fa4c77f..fbceb44 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysDict.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 字典 /// [SugarTable("sys_dict", TableDescription = "字典表")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysDict : BaseEntity { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs index 825cf5e..d43af87 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysFile.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 文件表 /// [SugarTable("sys_file", TableDescription = "文件表")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysFile : DataEntityBase { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs index c19af8f..cccf8ef 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogOperate.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 操作日志表 /// [SugarTable("sys_log_operate_{year}{month}{day}", TableDescription = "操作日志表")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysLogOperate : SysLogVisit { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs index 9e34962..1cf0c85 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysLogVisit.cs @@ -13,7 +13,7 @@ namespace SimpleAdmin.System; /// [SugarTable("sys_log_visit_{year}{month}{day}", TableDescription = "访问日志表")] [SplitTable(SplitType.Year)]//按年分表 (自带分表支持 年、季、月、周、日) -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysLogVisit : BaseEntity { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs index 2d45208..750aa64 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessage.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 站内信 /// [SugarTable("sys_message", TableDescription = "站内信")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysMessage : BaseEntity { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs index 78873a3..3a547e1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysMessageUser.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 用户消息表 /// [SugarTable("sys_message_user", TableDescription = "用户消息表")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysMessageUser : BaseEntity { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs index dfe47eb..368e32e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysOrg.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 组织 /// [SugarTable("sys_org", TableDescription = "组织")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] [CodeGen] public class SysOrg : BaseEntity { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs index 7d0e247..aafdf0a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysPosition.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 职位表 /// [SugarTable("sys_position", TableDescription = "职位表")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] [CodeGen] public class SysPosition : DataEntityBase { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs index d234573..f93d0c2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRelation.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 系统关系表 /// [SugarTable("sys_relation", TableDescription = "系统关系表")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysRelation : PrimaryKeyEntity { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs index a2cf7bf..45216e7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysResource.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 资源 /// [SugarTable("sys_resource", TableDescription = "资源")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysResource : BaseEntity { /// @@ -128,7 +128,7 @@ public class SysResource : BaseEntity /// 是否为首页 /// [SugarColumn(ColumnName = "IsHome", ColumnDescription = " 是否为首页", IsNullable = true)] - public bool IsHome { get; set; } = false; + public bool IsHome { get; set; } /// /// 排序码 @@ -172,7 +172,7 @@ public class Meta /// /// 是否在菜单中隐藏 (通常列表详情页需要隐藏) /// - public bool IsHide { get; set; } = false; + public bool IsHide { get; set; } /// /// 路由外链时填写的访问地址 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs index 0d5bd0a..f9cba1c 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysRole.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 角色 /// [SugarTable("sys_role", TableDescription = "角色")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] public class SysRole : DataEntityBase { /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs index b6ec44e..5d33361 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Entity/SysUser.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// 用户信息表 /// [SugarTable("sys_user", TableDescription = "用户信息表")] -[Tenant(SqlsugarConst.DB_DEFAULT)] +[Tenant(SqlSugarConst.DB_DEFAULT)] [BatchEdit] [CodeGen] public class SysUser : BaseEntity diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs index e9b6d13..49288c4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/AuthEventSubscriber.cs @@ -7,7 +7,6 @@ // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 using IPTools.Core; -using SimpleAdmin.Plugin.Core; namespace SimpleAdmin.System; @@ -17,15 +16,14 @@ namespace SimpleAdmin.System; public class AuthEventSubscriber : IEventSubscriber, ISingleton { private readonly ISimpleCacheService _simpleCacheService; - private readonly INamedServiceProvider _namedServiceProvider; + public IServiceProvider Services { get; } private readonly SqlSugarScope _db; - public AuthEventSubscriber(ISimpleCacheService simpleCacheService, IServiceProvider services, INamedServiceProvider namedServiceProvider) + public AuthEventSubscriber(ISimpleCacheService simpleCacheService, IServiceProvider services) { _db = DbContext.DB; _simpleCacheService = simpleCacheService; - _namedServiceProvider = namedServiceProvider; Services = services; } @@ -66,12 +64,13 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton //如果密码初始化提醒为true if (pwdUpdateDefault) { - await messageService.Send(new MessageSendInput() + await messageService.Send(new MessageSendInput { Subject = subject, - Content = $"请及时修改初始密码", + Content = "请及时修改初始密码", Category = CateGoryConst.MESSAGE_INFORM, - ReceiverIdList = new List() { sysUser.Id } + ReceiverIdList = new List + { sysUser.Id } }); } sysUser.PwdRemindUpdateTime = DateTime.Now;//设置提醒时密码时间为当前时间 @@ -84,12 +83,13 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton var pwdRemindDay = loginPolicy.First(x => x.ConfigKey == SysConfigConst.PWD_REMIND_DAY).ConfigValue.ToInt();//获取密码提醒时间 if (DateTime.Now - pwdRemindUpdateTime > TimeSpan.FromDays(pwdRemindDay)) { - await messageService.Send(new MessageSendInput() + await messageService.Send(new MessageSendInput { Subject = subject, Content = $"已超过{pwdRemindDay}天未修改密码,请及时修改密码", Category = CateGoryConst.MESSAGE_INFORM, - ReceiverIdList = new List() { sysUser.Id } + ReceiverIdList = new List + { sysUser.Id } }); } sysUser.PwdRemindUpdateTime = DateTime.Now;//设置提醒时密码时间为当前时间,避免重复提醒 @@ -151,7 +151,8 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton try { var ipInfo = IpTool.Search(ip); - var loginAddressList = new List() { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator };//定义登录地址列表 + var loginAddressList = new List + { ipInfo.Country, ipInfo.Province, ipInfo.City, ipInfo.NetworkOperator };//定义登录地址列表 var loginAddress = string.Join("|", loginAddressList.Where(it => it != "0").ToList());//过滤掉0的信息并用|连接成字符串 return loginAddress; } @@ -160,18 +161,4 @@ public class AuthEventSubscriber : IEventSubscriber, ISingleton return "未知"; } } - - /// - /// 获取通知服务 - /// - /// - private INoticeService GetNoticeService() - { - // 获取插件选项 - var pluginsOptions = App.GetOptions(); - //根据通知类型获取对应的服务 - var noticeComponent = pluginsOptions.NoticeComponent.ToString().ToLower(); - var noticeService = _namedServiceProvider.GetService(noticeComponent);//获取服务 - return noticeService; - } } diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs index e2c126a..37d0555 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/Dto/LoginEvent.cs @@ -33,7 +33,7 @@ public class LoginEvent /// /// 登录设备 /// - public AuthDeviceTypeEumu Device { get; set; } + public AuthDeviceTypeEnum Device { get; set; } /// /// Tokens @@ -49,4 +49,4 @@ public class LoginEvent /// 时间 /// public DateTime DateTime = DateTime.Now; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs index c0b7b37..e64a4fd 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/EventSubscriber/NoticeEventSubscriber.cs @@ -6,8 +6,6 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -using SimpleAdmin.Plugin.Core; - namespace SimpleAdmin.System; /// @@ -16,18 +14,15 @@ namespace SimpleAdmin.System; public class NoticeEventSubscriber : IEventSubscriber, ISingleton { private readonly ISimpleCacheService _simpleCacheService; - private readonly INamedServiceProvider _namedServiceProvider; private readonly IServiceScopeFactory _scopeFactory; private readonly SqlSugarScope _db; - public NoticeEventSubscriber(ISimpleCacheService simpleCacheService, IServiceScopeFactory scopeFactory, - INamedServiceProvider namedServiceProvider) + public NoticeEventSubscriber(ISimpleCacheService simpleCacheService, IServiceScopeFactory scopeFactory) { _db = DbContext.DB; _simpleCacheService = simpleCacheService; _scopeFactory = scopeFactory; - _namedServiceProvider = namedServiceProvider; } /// @@ -46,7 +41,6 @@ public class NoticeEventSubscriber : IEventSubscriber, ISingleton { clientIds.AddRange(it.ClientIds); }); - await GetNoticeService().UserLoginOut(loginEvent.UserId, clientIds, loginEvent.Message);//发送消息 } /// @@ -74,8 +68,6 @@ public class NoticeEventSubscriber : IEventSubscriber, ISingleton }); } }); - - await GetNoticeService().NewMesage(newMessageEvent.UserIds, clientIds, newMessageEvent.Message);//发送消息 } /// @@ -89,18 +81,4 @@ public class NoticeEventSubscriber : IEventSubscriber, ISingleton using var scope = _scopeFactory.CreateScope(); return scope.ServiceProvider.GetRequiredService(); } - - /// - /// 获取通知服务 - /// - /// - private INoticeService GetNoticeService() - { - // 获取插件选项 - var pluginsOptions = App.GetOptions(); - //根据通知类型获取对应的服务 - var noticeComponent = pluginsOptions.NoticeComponent.ToString().ToLower(); - var noticeService = _namedServiceProvider.GetService(noticeComponent);//获取服务 - return noticeService; - } } diff --git a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResource.cs similarity index 96% rename from api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs rename to api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResource.cs index c7759da..fe606d4 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResuorce.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/ExtJson/RelationRoleResource.cs @@ -12,7 +12,7 @@ namespace SimpleAdmin.System; /// SYS_ROLE_HAS_RESOURCE /// 角色有哪些资源扩展 /// -public class RelationRoleResuorce +public class RelationRoleResource { /// /// 菜单ID @@ -23,4 +23,4 @@ public class RelationRoleResuorce /// 按钮信息 /// public List ButtonInfo { get; set; } = new List(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs b/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs index abfd9c3..232b28a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/GlobalUsings.cs @@ -18,7 +18,6 @@ global using Mapster; global using Masuit.Tools; global using Microsoft.AspNetCore.Http; global using Microsoft.AspNetCore.Mvc; -global using Microsoft.CodeAnalysis; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Logging; global using NewLife.Serialization; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs b/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs index aaf1ea3..fc09439 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Oss/MinioUtils.cs @@ -36,12 +36,12 @@ public class MinioUtils : ITransient { var configs = await _configService.GetListByCategory(CateGoryConst.CONFIG_FILE_MINIO);//获取minio配置 var accessKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_ACCESS_KEY).FirstOrDefault();//MINIO文件AccessKey - var secretKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_SECRET_KEY).FirstOrDefault();//MINIO文件SecetKey + var secretKey = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_SECRET_KEY).FirstOrDefault();//MINIO文件SecretKey var endPoint = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_END_POINT).FirstOrDefault();//MINIO文件EndPoint var bucketName = configs.Where(it => it.ConfigKey == SysConfigConst.FILE_MINIO_DEFAULT_BUCKET_NAME).FirstOrDefault();//MINIO文件默认存储桶 if (accessKey == null || secretKey == null || endPoint == null || bucketName == null) { - throw Oops.Oh($"MINIO客户端未正确配置"); + throw Oops.Oh("MINIO客户端未正确配置"); } try { @@ -54,7 +54,8 @@ public class MinioUtils : ITransient _defaultPrefix = $"{point[0]}//"; _defaultEndPoint = point[1]; } - MinioClient = new MinioClient().WithEndpoint(_defaultEndPoint).WithCredentials(accessKey.ConfigValue, secretKey.ConfigValue).Build();//初始化monio对象 + MinioClient = new MinioClient().WithEndpoint(_defaultEndPoint).WithCredentials(accessKey.ConfigValue, secretKey.ConfigValue) + .Build();//初始化minio对象 MinioClient.WithTimeout(5000);//超时时间 } catch (Exception ex) @@ -75,17 +76,18 @@ public class MinioUtils : ITransient try { using var fileStream = file.OpenReadStream();//获取文件流 - var putObjectArgs = new PutObjectArgs().WithBucket(_defaultBucketName).WithObject(objectName).WithStreamData(fileStream).WithObjectSize(file.Length).WithContentType(contentType); + var putObjectArgs = new PutObjectArgs().WithBucket(_defaultBucketName).WithObject(objectName).WithStreamData(fileStream) + .WithObjectSize(file.Length).WithContentType(contentType); await MinioClient.PutObjectAsync(putObjectArgs); return $"{_defaultPrefix}{_defaultEndPoint}/{_defaultBucketName}/{objectName}";//默认http } catch (MinioException e) { - throw Oops.Oh($"上传文件失败!", e); + throw Oops.Oh("上传文件失败!", e); } catch (Exception e) { - throw Oops.Oh($"上传文件失败!", e); + throw Oops.Oh("上传文件失败!", e); } } @@ -116,11 +118,11 @@ public class MinioUtils : ITransient } catch (MinioException e) { - throw Oops.Oh($"下载文件失败!", e); + throw Oops.Oh("下载文件失败!", e); } catch (Exception e) { - throw Oops.Oh($"下载文件失败!", e); + throw Oops.Oh("下载文件失败!", e); } } } diff --git a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json index 2cd6580..2402f7a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json +++ b/api/SimpleAdmin/SimpleAdmin.System/SeedData/Json/seed_sys_config.json @@ -3,7 +3,7 @@ { "Id": "252875263003710", "ConfigKey": "SYS_DEFAULT_DESCRRIPTION", - "ConfigValue": "🪶SimpleAdmin是一个小而美的通用业务型后台管理系统,专为解决开发过程中的痛点难点而生。前端基于小诺2.0版本二次开发,采用Vue3+Vite+Vuex+JS,并在此基础上增加更人性化功能,后端基于.NET6/7+Furion,ORM采用Sqlsugar+单例模式,插件式开发。采用RBAC+多机构的权限管理模式,实现全网最灵活的接口级别数据权限控制,集成国密加解密,导入导出、导入导出、批量修改等常用插件。后端代码注释覆盖率>90%,并配备超牛皮的代码生成器和超详细的手摸手教学文档,非常适合二次开发。将日常开发中的业务场景和框架紧密结合,并坚持以人为本,以业务为中心,做到开箱即用,代码简洁、易扩展,注释详细,文档齐全,让你的开发少走弯路。", + "ConfigValue": "🪶SimpleAdmin是一个小而美的通用业务型后台管理系统,专为解决开发过程中的痛点难点而生。前端基于小诺2.0版本二次开发,采用Vue3+Vite+Vuex+JS,并在此基础上增加更人性化功能,后端基于.NET6/7+Furion,ORM采用SqlSugar+单例模式,插件式开发。采用RBAC+多机构的权限管理模式,实现全网最灵活的接口级别数据权限控制,集成国密加解密,导入导出、导入导出、批量修改等常用插件。后端代码注释覆盖率>90%,并配备超牛皮的代码生成器和超详细的手摸手教学文档,非常适合二次开发。将日常开发中的业务场景和框架紧密结合,并坚持以人为本,以业务为中心,做到开箱即用,代码简洁、易扩展,注释详细,文档齐全,让你的开发少走弯路。", "Category": "SYS_BASE", "Remark": "系统描述", "SortCode": "1", diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs index ca543ed..5df7de0 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/AuthService.cs @@ -15,19 +15,16 @@ public class AuthService : IAuthService private readonly IEventPublisher _eventPublisher; private readonly IConfigService _configService; private readonly ISysUserService _userService; - private readonly IRoleService _roleService; public AuthService(ISimpleCacheService simpleCacheService, IEventPublisher eventPublisher, IConfigService configService, - ISysUserService userService, - IRoleService roleService) + ISysUserService userService) { _simpleCacheService = simpleCacheService; _eventPublisher = eventPublisher; _configService = configService; _userService = userService; - _roleService = roleService; } /// @@ -37,14 +34,14 @@ public class AuthService : IAuthService SysConfigConst.LOGIN_CAPTCHA_TYPE); var captchaType = (CaptchaType)Enum.Parse(typeof(CaptchaType), config.ConfigValue); //生成验证码 - var captchInfo = CaptchaUtil.CreateCaptcha(captchaType, 4, 100, + var captchaInfo = CaptchaUtil.CreateCaptcha(captchaType, 4, 100, 38); //生成请求号,并将验证码放入redis - var reqNo = AddValidCodeToRedis(captchInfo.Code); + var reqNo = AddValidCodeToRedis(captchaInfo.Code); //返回验证码和请求号 return new PicValidCodeOutPut { - ValidCodeBase64 = captchInfo.Base64Str, + ValidCodeBase64 = captchaInfo.Base64Str, ValidCodeReqNo = reqNo }; } @@ -54,8 +51,8 @@ public class AuthService : IAuthService LoginClientTypeEnum loginClientType) { await ValidPhoneValidCode(input, loginClientType);//校验手机号验证码 - string? phoneValidCode; - _ = RandomHelper.CreateNum(6);//生产随机数字 + var phoneValidCode = RandomHelper.CreateNum(6);//生产随机数字; + #region 发送短信和记录数据库等操作 @@ -104,11 +101,8 @@ public class AuthService : IAuthService var result = await ExecLoginB(userInfo, input.Device, loginClientType);// 执行B端登录 return result; } - else - { - //执行c端登录 - return null; - } + //执行c端登录 + return null; } /// @@ -126,11 +120,8 @@ public class AuthService : IAuthService RemoveValidCodeFromRedis(input.ValidCodeReqNo);//删除验证码 return result; } - else - { - //执行c端登录 - return null; - } + //执行c端登录 + return null; } /// @@ -277,7 +268,7 @@ public class AuthService : IAuthService /// 登录设备 /// 登录类型 /// - public async Task ExecLoginB(SysUser sysUser, AuthDeviceTypeEumu device, + public async Task ExecLoginB(SysUser sysUser, AuthDeviceTypeEnum device, LoginClientTypeEnum loginClientType) { if (sysUser.UserStatus == SysDictConst.COMMON_STATUS_DISABLED) @@ -310,7 +301,7 @@ public class AuthService : IAuthService // 设置响应报文头 App.HttpContext.SetTokensOfResponseHeaders(accessToken, refreshToken); //登录事件参数 - var logingEvent = new LoginEvent + var loginEvent = new LoginEvent { Ip = App.HttpContext.GetRemoteIpAddressToIPv4(), Device = device, @@ -318,8 +309,8 @@ public class AuthService : IAuthService SysUser = sysUser, Token = accessToken }; - await WriteTokenToRedis(logingEvent, loginClientType);//写入token到redis - await _eventPublisher.PublishAsync(EventSubscriberConst.LOGIN_B, logingEvent);//发布登录事件总线 + await WriteTokenToRedis(loginEvent, loginClientType);//写入token到redis + await _eventPublisher.PublishAsync(EventSubscriberConst.LOGIN_B, loginEvent);//发布登录事件总线 //返回结果 return new LoginOutPut { @@ -413,11 +404,7 @@ public class AuthService : IAuthService else { //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, - new string[] - { - loginEvent.SysUser.Id.ToString() - }); + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, loginEvent.SysUser.Id.ToString()); } } } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs index 2d0b78e..e752cf1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Auth/Dto/AuthInput.cs @@ -51,13 +51,13 @@ public class LoginInput : ValidCodeInput /// 设备类型,默认PC /// /// 0 - public AuthDeviceTypeEumu Device { get; set; } = AuthDeviceTypeEumu.PC; + public AuthDeviceTypeEnum Device { get; set; } = AuthDeviceTypeEnum.PC; } /// /// 登出输入参数 /// -public class LoginOutIput +public class LoginOutInput { /// /// token @@ -87,5 +87,5 @@ public class LoginByPhoneInput : GetPhoneValidCodeInput /// 设备类型,默认PC /// /// 0 - public AuthDeviceTypeEumu Device { get; set; } = AuthDeviceTypeEumu.PC; -} \ No newline at end of file + public AuthDeviceTypeEnum Device { get; set; } = AuthDeviceTypeEnum.PC; +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs index d46b66d..112ca97 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Auth/Session/SessionService.cs @@ -7,7 +7,6 @@ // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 using Masuit.Tools.DateTimeExt; -using Masuit.Tools.Models; namespace SimpleAdmin.System; @@ -61,14 +60,14 @@ public class SessionService : DbRepository, ISessionService /// public async Task> PageC(SessionPageInput input) { - return new SqlSugarPagedList() + return new SqlSugarPagedList { PageNum = 1, PageSize = 20, Total = 0, Pages = 1, HasNextPages = false }; } /// public SessionAnalysisOutPut Analysis() { - var tokenDic = GetTokenDicFromRedis();//redistoken会话字典信息 + var tokenDic = GetTokenDicFromRedis();//redisToken会话字典信息 var tokenInfosList = tokenDic.Values.ToList();//端token列表 var dicB = new Dictionary>(); var dicC = new Dictionary>(); @@ -90,11 +89,11 @@ public class SessionService : DbRepository, ISessionService var tokenC = dicC.Values.ToList();//c端token列表 int maxCountB = 0, maxCountC = 0; if (tokenB.Count > 0) - maxCountB = tokenB.OrderByDescending(it => it.Count).Take(1).First().Count();//b端最大会话数 + maxCountB = tokenB.OrderByDescending(it => it.Count).Take(1).First().Count;//b端最大会话数 if (tokenC.Count > 0) - maxCountC = tokenC.OrderByDescending(it => it.Count).Take(1).First().Count();//C端最大会话数 - return new SessionAnalysisOutPut() + maxCountC = tokenC.OrderByDescending(it => it.Count).Take(1).First().Count;//C端最大会话数 + return new SessionAnalysisOutPut { OnLineCount = onLineCount, CurrentSessionTotalCount = tokenB.Count + tokenC.Count, @@ -111,8 +110,7 @@ public class SessionService : DbRepository, ISessionService var tokenInfos = _simpleCacheService.HashGetOne>(CacheConst.CACHE_USER_TOKEN, userId); //从列表中删除 - _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, - new string[] { userId }); + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, userId); await NoticeUserLoginOut(userId, tokenInfos); } @@ -131,8 +129,7 @@ public class SessionService : DbRepository, ISessionService _simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//如果还有token则更新token else - _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, - new string[] { userId });//否则直接删除key + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, userId);//否则直接删除key await NoticeUserLoginOut(userId, deleteTokens); } @@ -176,10 +173,7 @@ public class SessionService : DbRepository, ISessionService } return bTokenDic; } - else - { - return new Dictionary>(); - } + return new Dictionary>(); } /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs index 8221224..cc4ad39 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/BatchEditService.cs @@ -26,10 +26,10 @@ public class BatchEditService : DbRepository, IBatchEditService var query = Context.Queryable() .WhereIF(!string.IsNullOrWhiteSpace(input.ConfigId), it => it.ConfigId.Contains(input.ConfigId.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Entityname), - it => it.EntityName.Contains(input.Entityname.Trim())) - .WhereIF(!string.IsNullOrWhiteSpace(input.Tablename), - it => it.TableName.Contains(input.Tablename.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.EntityName), + it => it.EntityName.Contains(input.EntityName.Trim())) + .WhereIF(!string.IsNullOrWhiteSpace(input.TableName), + it => it.TableName.Contains(input.TableName.Trim())) //.WhereIF(!string.IsNullOrEmpty(input.SearchKey), it => it.Name.Contains(input.SearchKey))//根据关键字查询 .OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}") @@ -50,7 +50,7 @@ public class BatchEditService : DbRepository, IBatchEditService tableColumns.ForEach(it => { //判断是否是主键或者通用字段 - var isPkOrCommon = it.IsPrimarykey || SqlSugarUtils.IsCommonColumn(it.ColumnName); + var isPkOrCommon = it.IsPrimaryKey || SqlSugarUtils.IsCommonColumn(it.ColumnName); if (!isPkOrCommon) { //添加到字段集合 @@ -58,7 +58,7 @@ public class BatchEditService : DbRepository, IBatchEditService } }); //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { entity = await InsertReturnEntityAsync(entity);//输入参数转实体并插入 batchEdiConfig.ForEach(it => { it.UId = entity.Id; });//遍历字段赋值基础Id @@ -94,7 +94,7 @@ public class BatchEditService : DbRepository, IBatchEditService if (ids.Count > 0) { //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除数据 await Context.Deleteable().Where(it => ids.Contains(it.UId)) @@ -124,7 +124,7 @@ public class BatchEditService : DbRepository, IBatchEditService foreach (var tableColumn in tableColumns) { //判断是否是主键或者通用字段 - var isPkOrCommon = tableColumn.IsPrimarykey + var isPkOrCommon = tableColumn.IsPrimaryKey || SqlSugarUtils.IsCommonColumn(tableColumn.ColumnName); if (!isPkOrCommon) { @@ -193,7 +193,7 @@ public class BatchEditService : DbRepository, IBatchEditService /// 获取配置 /// /// - private BatchEditConfig GetUpdateBatchConfig(SqlsugarColumnInfo columnInfo) + private BatchEditConfig GetUpdateBatchConfig(SqlSugarColumnInfo columnInfo) { var netType = SqlSugarUtils.ConvertDataType(columnInfo.DataType); return new BatchEditConfig diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs index 0a8e105..5e9677f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditInput.cs @@ -26,12 +26,12 @@ public class BatchEditPageInput : BasePageInput /// /// 实体名 /// - public string Entityname { get; set; } + public string EntityName { get; set; } /// /// 表名 /// - public string Tablename { get; set; } + public string TableName { get; set; } } /// @@ -66,7 +66,7 @@ public class BatchEditAddInput /// /// 表描述 /// - public string Tabledescription { get; set; } + public string TableDescription { get; set; } } /// @@ -136,4 +136,4 @@ public class BatchEditColumn [Required(ErrorMessage = "字段值必填")] public object ColumnValue { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs index 915e30a..6eb9fe1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/Dto/BatchEditOutput.cs @@ -6,4 +6,4 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.System; \ No newline at end of file + diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs index 8652e3c..16cb451 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/BatchEdit/IBatchEditService.cs @@ -66,7 +66,7 @@ public interface IBatchEditService : ITransient /// /// 唯一编码 /// 字段信息 - /// sqlsugar对应字典 + /// SqlSugar对应字典 Task> GetUpdateBatchConfigDict(string code, List columns); @@ -76,4 +76,4 @@ public interface IBatchEditService : ITransient /// id /// Task SyncColumns(BaseIdInput input); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs index 1b7c981..f3bacaf 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/File/FileService.cs @@ -100,15 +100,11 @@ public class FileService : DbRepository, IFileService { if (devFile.Engine == SysDictConst.FILE_ENGINE_LOCAL) return GetFileStreamResult(devFile.StoragePath, devFile.Name); - else if (devFile.Engine == SysDictConst.FILE_ENGINE_MINIO) + if (devFile.Engine == SysDictConst.FILE_ENGINE_MINIO) return await GetFileStreamResultFromMinio(devFile.ObjName, devFile.Name); - else - return null; - } - else - { return null; } + return null; } #region 方法 @@ -146,7 +142,7 @@ public class FileService : DbRepository, IFileService default: - throw Oops.Bah($"不支持的文件引擎"); + throw Oops.Bah("不支持的文件引擎"); } var fileSizeKb = (long)(file.Length / 1024.0);// 文件大小KB var fileSuffix = Path.GetExtension(file.FileName).ToLower();// 文件后缀 @@ -175,7 +171,7 @@ public class FileService : DbRepository, IFileService var bmp = SKBitmap.FromImage(image); var thubnail = bmp.GetPicThumbnail(100, 100);//压缩图片 var thubnailBase64 = ImageUtil.ImgToBase64String(thubnail);//转base64 - devFile.Thumbnail = $"data:image/png;base64," + thubnailBase64; + devFile.Thumbnail = "data:image/png;base64," + thubnailBase64; } await InsertAsync(devFile); return objectId; @@ -190,7 +186,7 @@ public class FileService : DbRepository, IFileService { string uploadFileFolder; var configKey = string.Empty; - //判断是windos还是linux + //判断是windows还是linux if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { configKey = SysConfigConst.FILE_LOCAL_FOLDER_FOR_UNIX;//Linux @@ -220,10 +216,7 @@ public class FileService : DbRepository, IFileService } return fileName; } - else - { - throw Oops.Oh($"文件存储路径未配置"); - } + throw Oops.Oh("文件存储路径未配置"); } /// @@ -277,14 +270,13 @@ public class FileService : DbRepository, IFileService private bool IsPic(string suffix) { //图片后缀名列表 - var pics = new string[] + var pics = new[] { ".png", ".bmp", ".gif", ".jpg", ".jpeg", ".psd" }; if (pics.Contains(suffix)) return true; - else - return false; + return false; } #endregion 方法 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs index bd63e90..1ca0594 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Dev/Message/MessageService.cs @@ -78,7 +78,7 @@ public class MessageService : DbRepository, IMessageService }); //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { message = await InsertReturnEntityAsync(message);//添加消息 messageUsers.ForEach(it => it.MessageId = message.Id);//添加关系 @@ -154,10 +154,7 @@ public class MessageService : DbRepository, IMessageService } return messageDetail; } - else - { - return null; - } + return null; } /// @@ -168,7 +165,7 @@ public class MessageService : DbRepository, IMessageService if (ids.Count > 0) { //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteAsync(it => ids.Contains(it.Id)); await Context.Deleteable().Where(it => ids.Contains(it.MessageId)) diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs index 8fbefd5..ddaea9e 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportPreviewOutput.cs @@ -52,10 +52,10 @@ public class TableColumns /// /// 超过宽度将自动省略 /// - public bool Ellipsis { get; set; } = false; + public bool Ellipsis { get; set; } /// /// 是否是日期格式 /// - public bool Date { get; set; } = false; -} \ No newline at end of file + public bool Date { get; set; } +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs index ba30d46..4c49404 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/Dto/ImportTemplateInput.cs @@ -24,11 +24,11 @@ public class ImportTemplateInput /// 是否有错误 /// [ImporterHeader(IsIgnore = true)] - public bool HasError { get; set; } = false; + public bool HasError { get; set; } /// /// 错误详情 /// [ImporterHeader(IsIgnore = true)] public IDictionary ErrorInfo { get; set; } = new Dictionary(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs index 01eee40..bf53e99 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/IImportExportService.cs @@ -59,9 +59,9 @@ public interface IImportExportService : ITransient /// 导入文件验证 /// /// 文件 - /// 文件最大体积(M) + /// 文件最大体积(M) /// 允许的格式 - void ImportVerification(IFormFile file, int maxSzie = 30, string[] allowTypes = null); + void ImportVerification(IFormFile file, int maxSize = 30, string[] allowTypes = null); /// /// 模板数据验证 @@ -70,4 +70,4 @@ public interface IImportExportService : ITransient /// 结果 /// 导入预览数据 ImportPreviewOutput TemplateDataVerification(ImportResult importResult) where T : ImportTemplateInput; -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs index d4ac1b5..6d277bc 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/ImportExport/ImportExportService.cs @@ -16,12 +16,12 @@ public class ImportExportService : IImportExportService #region 导入 /// - public void ImportVerification(IFormFile file, int maxSzie = 30, string[] allowTypes = null) + public void ImportVerification(IFormFile file, int maxSize = 30, string[] allowTypes = null) { if (file == null) throw Oops.Bah("文件不能为空"); - if (file.Length > maxSzie * 1024 * 1024) throw Oops.Bah($"文件大小不允许超过{maxSzie}M"); + if (file.Length > maxSize * 1024 * 1024) throw Oops.Bah($"文件大小不允许超过{maxSize}M"); var fileSuffix = Path.GetExtension(file.FileName).ToLower().Split(".")[1];// 文件后缀 - string[] allowTypeS = allowTypes == null ? new string[] { "xlsx" } : allowTypes;//允许上传的文件类型 + var allowTypeS = allowTypes == null ? new[] { "xlsx" } : allowTypes;//允许上传的文件类型 if (!allowTypeS.Contains(fileSuffix)) throw Oops.Bah(errorMessage: "文件格式错误"); } @@ -33,19 +33,21 @@ public class ImportExportService : IImportExportService importResult.TemplateErrors.ForEach(error => { if (error.Message.Contains("not found")) throw Oops.Bah($"列[{error.RequireColumnName}]未找到"); - else throw Oops.Bah($"列[{error.RequireColumnName}]:{error.Message}"); + throw Oops.Bah($"列[{error.RequireColumnName}]:{error.Message}"); }); if (importResult.Data == null) throw Oops.Bah("文件数据格式有误,请重新导入!"); //导入结果输出 - var importPreview = new ImportPreviewOutput() { HasError = importResult.HasError }; - Dictionary headerMap = new Dictionary(); + var importPreview = new ImportPreviewOutput + { HasError = importResult.HasError }; + var headerMap = new Dictionary(); //遍历导入的表头列表信息 importResult.ImporterHeaderInfos.ForEach(it => { headerMap.Add(it.Header.Name, it.PropertyName); - var tableColumns = new TableColumns { Title = it.Header.Name.Split("(")[0], DataIndex = it.PropertyName.FirstCharToLower() };//定义表头,部分表头有说明用(分组去掉说明 + var tableColumns = new TableColumns + { Title = it.Header.Name.Split("(")[0], DataIndex = it.PropertyName.FirstCharToLower() };//定义表头,部分表头有说明用(分组去掉说明 var antTableAttribute = it.PropertyInfo.GetCustomAttribute();//获取表格特性 if (antTableAttribute != null) { @@ -121,7 +123,7 @@ public class ImportExportService : IImportExportService if (importData.Count != data.Count) { result.Success = false; - result.Data = data.Where(it => it.HasError == true).ToList(); + result.Data = data.Where(it => it.HasError).ToList(); result.FailCount = data.Count - importData.Count; } result.ImportCount = importData.Count; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs index 4a4a741..ff03bdd 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Index/IndexService.cs @@ -27,11 +27,11 @@ public class IndexService : DbRepository, IIndexService it.Category == CateGoryConst.RELATION_SYS_USER_SCHEDULE_DATA && it.ObjectId == UserManager.UserId && it.TargetId == input.ScheduleDate, it => new SysRelation { ExtJson = it.ExtJson, Id = it.Id });//获取当前用户的日程列表 - List userSchedules = new List();//结果集 + var userSchedules = new List();//结果集 relations.ForEach(it => { - var extjson = it.ExtJson.ToJsonEntity();//转成实体 - var userSchedule = extjson.Adapt();//格式化 + var extJson = it.ExtJson.ToJsonEntity();//转成实体 + var userSchedule = extJson.Adapt();//格式化 userSchedule.Id = it.Id;//赋值ID userSchedules.Add(userSchedule);//添加到结果集 }); diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs index ee15a68..b855ad8 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Button/ButtonService.cs @@ -16,16 +16,13 @@ public class ButtonService : DbRepository, IButtonService private readonly ILogger _logger; private readonly IResourceService _resourceService; private readonly IRelationService _relationService; - private readonly IEventPublisher _eventPublisher; public ButtonService(ILogger logger, IResourceService resourceService, - IRelationService relationService, - IEventPublisher eventPublisher) + IRelationService relationService) { _logger = logger; _resourceService = resourceService; _relationService = relationService; - _eventPublisher = eventPublisher; } /// @@ -57,9 +54,9 @@ public class ButtonService : DbRepository, IButtonService public async Task> AddBatch(ButtonAddInput input) { var sysResources = new List();//按钮列表 - var codeList = new List() + var codeList = new List { "Add", "Edit", "Delete", "BatchDelete", "Import", "Export", "BatchEdit" };//code后缀 - var titleList = new List() + var titleList = new List { "新增", "编辑", "删除", "批量删除", "导入", "导出", "批量编辑" };//title前缀 var idList = new List();//Id列表 for (var i = 0; i < codeList.Count; i++) @@ -86,10 +83,7 @@ public class ButtonService : DbRepository, IButtonService await _resourceService.RefreshCache(CateGoryConst.RESOURCE_BUTTON);//刷新缓存 return sysResources.Select(it => it.Id).ToList(); } - else - { - return new List(); - } + return new List(); } /// @@ -98,7 +92,7 @@ public class ButtonService : DbRepository, IButtonService await CheckInput(input);//检查参数 var sysResource = input.Adapt();//实体转换 //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await UpdateAsync(sysResource);//更新按钮 }); @@ -140,7 +134,7 @@ public class ButtonService : DbRepository, IButtonService //遍历关系表 relationList.ForEach(it => { - var relationRoleResuorce = it.ExtJson.ToJsonEntity();//拓展信息转实体 + var relationRoleResuorce = it.ExtJson.ToJsonEntity();//拓展信息转实体 var buttonInfo = relationRoleResuorce.ButtonInfo;//获取按钮信息 if (buttonInfo.Count > 0) { @@ -154,7 +148,7 @@ public class ButtonService : DbRepository, IButtonService #endregion 处理关系表角色资源信息 //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 if (relationList.Count > 0) diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs index 1c6e817..19ad6e6 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Menu/MenuService.cs @@ -107,7 +107,7 @@ public class MenuService : DbRepository, IMenuService }); ids.AddRange(resourceIds);//添加到删除ID列表 //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除菜单和按钮 await Context.Deleteable()//关系表删除对应SYS_ROLE_HAS_RESOURCE @@ -149,13 +149,13 @@ public class MenuService : DbRepository, IMenuService if (sysResource.Module == input.Module)//如果模块ID没变直接返回 return; if (sysResource.ParentId != 0) - throw Oops.Bah($"非顶级菜单不可修改所属模块"); + throw Oops.Bah("非顶级菜单不可修改所属模块"); //获取所有菜单和模块 var resourceList = await _resourceService.GetListAsync(new List { CateGoryConst.RESOURCE_MENU, CateGoryConst.RESOURCE_MODULE }); if (!resourceList.Any(it => it.Category == CateGoryConst.RESOURCE_MODULE && it.Id == input.Module.Value)) - throw Oops.Bah($"不存在的模块"); + throw Oops.Bah("不存在的模块"); //获取所有菜单 var menuList = resourceList.Where(it => it.Category == CateGoryConst.RESOURCE_MENU) .ToList(); @@ -191,9 +191,9 @@ public class MenuService : DbRepository, IMenuService if (parent != null) { if (parent.Module != sysResource.Module)//如果父级的模块和当前模块不一样 - throw Oops.Bah($"模块与上级菜单不一致"); + throw Oops.Bah("模块与上级菜单不一致"); if (parent.Id == sysResource.Id) - throw Oops.Bah($"上级菜单不能选择自己"); + throw Oops.Bah("上级菜单不能选择自己"); } else { diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs index 1e24cac..a256a84 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Module/ModuleService.cs @@ -6,8 +6,6 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -using DnsClient.Internal; - namespace SimpleAdmin.System; /// @@ -16,16 +14,14 @@ namespace SimpleAdmin.System; public class ModuleService : DbRepository, IModuleService { private readonly ILogger _logger; - private readonly ISimpleCacheService _simpleCacheService; private readonly IResourceService _resourceService; private readonly IRelationService _relationService; - public ModuleService(ILogger logger, ISimpleCacheService simpleCacheService, + public ModuleService(ILogger logger, IResourceService resourceService, IRelationService relationService) { _logger = logger; - _simpleCacheService = simpleCacheService; _resourceService = resourceService; _relationService = relationService; } @@ -95,7 +91,7 @@ public class ModuleService : DbRepository, IModuleService }); ids.AddRange(resourceIds); //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除菜单和按钮 await Context.Deleteable()//关系表删除对应SYS_ROLE_HAS_RESOURCE diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs index c7fdf08..2652dd3 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleInput.cs @@ -60,7 +60,7 @@ public class GrantResourceInput : RoleOwnResourceOutput /// 授权资源信息 /// [Required(ErrorMessage = "GrantInfoList不能为空")] - public override List GrantInfoList { get; set; } + public override List GrantInfoList { get; set; } /// /// 是否代码生成 @@ -128,4 +128,4 @@ public class RoleSelectorInput : BasePageInput /// 角色分类 /// public string Category { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs index 645e93a..d78777b 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/Dto/RoleOutput.cs @@ -21,7 +21,7 @@ public class RoleOwnResourceOutput /// /// 已授权资源信息 /// - public virtual List GrantInfoList { get; set; } + public virtual List GrantInfoList { get; set; } } /// @@ -38,4 +38,4 @@ public class RoleOwnPermissionOutput /// 已授权资源信息 /// public virtual List GrantInfoList { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs index 33359c0..cf965fa 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Role/RoleService.cs @@ -101,7 +101,7 @@ public class RoleService : DbRepository, IRoleService { //判断是否超管 if (input.Code == SysRoleConst.SUPER_ADMIN) - throw Oops.Bah($"不可编辑超管角色"); + throw Oops.Bah("不可编辑超管角色"); await CheckInput(input);//检查参数 var role = await GetFirstAsync(it => it.Id == input.Id);//获取角色 if (role != null) @@ -134,7 +134,7 @@ public class RoleService : DbRepository, IRoleService } var sysRole = input.Adapt();//实体转换 //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await UpdateAsync(sysRole);//更新角色 if (permissions.Any())//如果有授权权限就更新 @@ -169,7 +169,7 @@ public class RoleService : DbRepository, IRoleService var hasSuperAdmin = sysRoles.Any(it => it.Code == SysRoleConst.SUPER_ADMIN && ids.Contains(it.Id));//判断是否有超级管理员 - if (hasSuperAdmin) throw Oops.Bah($"不可删除系统内置超管角色"); + if (hasSuperAdmin) throw Oops.Bah("不可删除系统内置超管角色"); //数据库是string所以这里转下 var targetIds = ids.Select(it => it.ToString()).ToList(); @@ -180,7 +180,7 @@ public class RoleService : DbRepository, IRoleService CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION }; //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { await DeleteByIdsAsync(ids.Cast().ToArray());//删除按钮 var relationRep = ChangeRepository>();//切换仓储 @@ -216,8 +216,9 @@ public class RoleService : DbRepository, IRoleService /// public async Task OwnResource(BaseIdInput input, string category) { - var roleOwnResource = new RoleOwnResourceOutput() { Id = input.Id };//定义结果集 - var grantInfoList = new List();//已授权信息集合 + var roleOwnResource = new RoleOwnResourceOutput + { Id = input.Id };//定义结果集 + var grantInfoList = new List();//已授权信息集合 //获取关系列表 var relations = await _relationService.GetRelationListByObjectIdAndCategory(input.Id, category); @@ -225,7 +226,7 @@ public class RoleService : DbRepository, IRoleService relations.ForEach(it => { //将扩展信息转为实体 - var relationRole = it.ExtJson.ToJsonEntity(); + var relationRole = it.ExtJson.ToJsonEntity(); grantInfoList.Add(relationRole);//添加到已授权信息 }); roleOwnResource.GrantInfoList = grantInfoList;//赋值已授权信息 @@ -314,17 +315,17 @@ public class RoleService : DbRepository, IRoleService #region 保存数据库 //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { - var relatioRep = ChangeRepository>();//切换仓储 + var relationRep = ChangeRepository>();//切换仓储 //如果不是代码生成,就删除老的 if (!input.IsCodeGen) - await relatioRep.DeleteAsync(it => + await relationRep.DeleteAsync(it => it.ObjectId == sysRole.Id && (it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION || it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE || it.Category == CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE)); - await relatioRep.InsertRangeAsync(relationRoles);//添加新的 + await relationRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 { @@ -371,7 +372,7 @@ public class RoleService : DbRepository, IRoleService var sysRole = (await GetListAsync()).Where(it => it.Id == input.Id).FirstOrDefault();//获取角色 if (sysRole != null) { - var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiurl列表 + var apiUrls = input.GrantInfoList.Select(it => it.ApiUrl).ToList();//apiUrl列表 var extJsons = input.GrantInfoList.Select(it => it.ToJson()).ToList();//拓展信息 await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION, input.Id, apiUrls, extJsons, @@ -407,7 +408,7 @@ public class RoleService : DbRepository, IRoleService }); //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { var relationRep = ChangeRepository>();//切换仓储 var targetId = input.Id.ToString();//目标ID转string @@ -505,8 +506,8 @@ public class RoleService : DbRepository, IRoleService throw Oops.Bah($"角色所属分类错误:{sysRole.Category}"); //如果是机构角色orgId不能为空 if (sysRole.Category == CateGoryConst.ROLE_ORG && sysRole.OrgId == null) - throw Oops.Bah($"orgId不能为空"); - else if (sysRole.Category == CateGoryConst.ROLE_GLOBAL)//如果是全局 + throw Oops.Bah("orgId不能为空"); + if (sysRole.Category == CateGoryConst.ROLE_GLOBAL)//如果是全局 sysRole.OrgId = null;//机构id设null var sysRoles = await GetListAsync();//获取所有 @@ -516,8 +517,7 @@ public class RoleService : DbRepository, IRoleService { if (sysRole.OrgId == null) throw Oops.Bah($"存在重复的全局角色:{sysRole.Name}"); - else - throw Oops.Bah($"同组织下存在重复的角色:{sysRole.Name}"); + throw Oops.Bah($"同组织下存在重复的角色:{sysRole.Name}"); } } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs index 63d5108..960236d 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Limit/Spa/SpaService.cs @@ -13,12 +13,10 @@ namespace SimpleAdmin.System; /// public class SpaService : DbRepository, ISpaService { - private readonly ISimpleCacheService _simpleCacheService; private readonly IResourceService _resourceService; - public SpaService(ISimpleCacheService simpleCacheService, IResourceService resourceService) + public SpaService(IResourceService resourceService) { - _simpleCacheService = simpleCacheService; _resourceService = resourceService; } @@ -92,11 +90,11 @@ public class SpaService : DbRepository, ISpaService { if (string.IsNullOrEmpty(sysResource.Name)) { - throw Oops.Bah($"单页名称不能为空"); + throw Oops.Bah("单页名称不能为空"); } if (string.IsNullOrEmpty(sysResource.Component)) { - throw Oops.Bah($"组件地址不能为空"); + throw Oops.Bah("组件地址不能为空"); } } else if (sysResource.MenuType == SysResourceConst.IFRAME @@ -115,7 +113,7 @@ public class SpaService : DbRepository, ISpaService var spas = await _resourceService.GetListByCategory(SysResourceConst.SPA);//获取所有单页 if (spas.Any(it => it.IsHome && it.Id != sysResource.Id))//如果有多个主页 { - throw Oops.Bah($"已存在首页,请取消其他主页后再试"); + throw Oops.Bah("已存在首页,请取消其他主页后再试"); } sysResource.IsHide = false;//如果是主页,则不隐藏 sysResource.IsAffix = true;//如果是主页,则固定 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs index cf4ad6f..3c5da8f 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/Dto/OperateLogOutput.cs @@ -32,6 +32,6 @@ public class OperateLogDayStatisticsOutput /// /// 操作日志统计 /// -public class OperateLogTotalCountOutpu : VisitLogTotalCountOutput +public class OperateLogTotalCountOutput : VisitLogTotalCountOutput { -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs index 297e9fc..d170dac 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/IOperateLogService.cs @@ -45,5 +45,5 @@ public interface IOperateLogService : ITransient /// 操作日志总览 /// /// 异常日志和操作日志的数量 - Task> TotalCount(); -} \ No newline at end of file + Task> TotalCount(); +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs index 62c2329..fd8e38a 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/OperateLog/OperateLogService.cs @@ -90,28 +90,28 @@ public class OperateLogService : DbRepository, IOperateLogService } /// - public async Task> TotalCount() + public async Task> TotalCount() { var data = await Context.Queryable() .SplitTable(tabs => tabs.Take(_maxTabs)) .GroupBy(it => it.Category)//根据分类分组 .Select(it => new { - Category = it.Category,//分类 + it.Category,//分类 Count = SqlFunc.AggregateCount(it.Category)//数量 }).ToListAsync(); //定义结果数组 - var operateLogTotalCounts = new List + var operateLogTotalCounts = new List { //添加操作日志数据 - new OperateLogTotalCountOutpu + new OperateLogTotalCountOutput { Type = _nameOperate, Value = data.Where(it => it.Category == CateGoryConst.LOG_OPERATE) .Select(it => it.Count).FirstOrDefault() }, //添加异常日志数据 - new OperateLogTotalCountOutpu + new OperateLogTotalCountOutput { Type = _nameException, Value = data.Where(it => it.Category == CateGoryConst.LOG_EXCEPTION) diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs index 31cb344..9eda704 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/LogAudit/VisitLog/VisitLogService.cs @@ -76,7 +76,7 @@ public class VisitLogService : DbRepository, IVisitLogService .GroupBy(it => it.Category)//根据分类分组 .Select(it => new { - Category = it.Category,//分类 + it.Category,//分类 Count = SqlFunc.AggregateCount(it.Category)//数量 }).ToListAsync(); //定义结果数组 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs index 2cdabc6..d3a0246 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Config/ConfigService.cs @@ -41,7 +41,7 @@ public class ConfigService : DbRepository, IConfigService { var configList = await GetListByCategory(category);//获取系统配置列表 var configValue = - configList.Where(it => it.ConfigKey == configKey).FirstOrDefault();//根据configkey获取对应值 + configList.Where(it => it.ConfigKey == configKey).FirstOrDefault();//根据configKey获取对应值 return configValue; } diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs index 8b27ebe..5d2ba65 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Ops/Dict/DictService.cs @@ -62,9 +62,9 @@ public class DictService : DbRepository, IDictService if (ids.Count > 0) { //获取所有字典 - var dicts = await GetListAsync(); + var dictList = await GetListAsync(); //判断是否有系统字典 - var frm = dicts.Any(it => + var frm = dictList.Any(it => ids.Contains(it.Id) && it.Category == CateGoryConst.DICT_FRM); //如果是系统字典提示不可删除 @@ -74,10 +74,10 @@ public class DictService : DbRepository, IDictService ids.ForEach(it => { //获取子节点 - var childens = GetDevDictChilden(dicts, it); + var children = GetDevDictChildren(dictList, it); //提取ID - var childenIds = childens.Select(c => c.Id).ToList(); - deleteIds.AddRange(childenIds); + var childrenIds = children.Select(c => c.Id).ToList(); + deleteIds.AddRange(childrenIds); }); //删除数据 if (await DeleteByIdsAsync(deleteIds.Cast().ToArray())) @@ -92,24 +92,24 @@ public class DictService : DbRepository, IDictService public override async Task> GetListAsync() { //先从redis拿 - var devDicts = _simpleCacheService.Get>(SystemConst.CACHE_DEV_DICT); - if (devDicts == null) + var sysDictList = _simpleCacheService.Get>(SystemConst.CACHE_DEV_DICT); + if (sysDictList == null) { - devDicts = await base.GetListAsync();//去数据库拿 - if (devDicts.Count > 0) + sysDictList = await base.GetListAsync();//去数据库拿 + if (sysDictList.Count > 0) { - _simpleCacheService.Set(SystemConst.CACHE_DEV_DICT, devDicts);//如果数据库有数,更新redis - return devDicts; + _simpleCacheService.Set(SystemConst.CACHE_DEV_DICT, sysDictList);//如果数据库有数,更新redis + return sysDictList; } } - return devDicts; + return sysDictList; } /// public async Task GetDict(string dictValue) { - var devDicts = await GetListAsync(); - var devDict = devDicts.Where(it => it.DictValue == dictValue).FirstOrDefault(); + var sysDictList = await GetListAsync(); + var devDict = sysDictList.Where(it => it.DictValue == dictValue).FirstOrDefault(); return devDict; } @@ -117,26 +117,25 @@ public class DictService : DbRepository, IDictService public async Task> GetValuesByDictValue(string dictValue, List devDictList = null) { - var devDicts = devDictList == null ? await GetListAsync() : devDictList;//获取全部 - var id = devDicts.Where(it => it.DictValue == dictValue).Select(it => it.Id) + var sysDictList = devDictList == null ? await GetListAsync() : devDictList;//获取全部 + var id = sysDictList.Where(it => it.DictValue == dictValue).Select(it => it.Id) .FirstOrDefault();//根据value找到父节点 if (id > 0) - return devDicts.Where(it => it.ParentId == id).Select(it => it.DictValue) + return sysDictList.Where(it => it.ParentId == id).Select(it => it.DictValue) .ToList();//拿到字典值 - else - return new List(); + return new List(); } /// public async Task>> GetValuesByDictValue(string[] dictValues) { var result = new Dictionary>(); - var devDicts = await GetListAsync();//获取全部 - var ids = devDicts.Where(it => dictValues.Contains(it.DictValue)).Select(it => it.Id) + var sysDictList = await GetListAsync();//获取全部 + var ids = sysDictList.Where(it => dictValues.Contains(it.DictValue)).Select(it => it.Id) .ToList();//根据value找到父节点 foreach (var dictValue in dictValues) { - var data = await GetValuesByDictValue(dictValue, devDicts); + var data = await GetValuesByDictValue(dictValue, sysDictList); result.Add(dictValue, data); } return result; @@ -145,8 +144,8 @@ public class DictService : DbRepository, IDictService /// public async Task> Tree(DictTreeInput input) { - var devDicts = await GetListAsync();//获取字典列表 - var devList = devDicts + var sysDictList = await GetListAsync();//获取字典列表 + var devList = sysDictList .WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category) .OrderBy(it => it.SortCode).ToList(); return ConstructResourceTrees(devList); @@ -188,17 +187,17 @@ public class DictService : DbRepository, IDictService /// private async Task CheckInput(SysDict sysDict) { - var dicts = await GetListAsync();//获取全部字典 + var dictList = await GetListAsync();//获取全部字典 //判断是否从存在重复字典名 - var hasSameLable = dicts.Any(it => + var hasSameLabel = dictList.Any(it => it.ParentId == sysDict.ParentId && it.Category == sysDict.Category && it.DictLabel == sysDict.DictLabel && it.Id != sysDict.Id); - if (hasSameLable) + if (hasSameLabel) { throw Oops.Bah($"存在重复的字典名称:{sysDict.DictLabel}"); } //判断是否存在重复字典值 - var hasSameValue = dicts.Any(it => + var hasSameValue = dictList.Any(it => it.ParentId == sysDict.ParentId && it.DictValue == sysDict.DictValue && it.Id != sysDict.Id); if (hasSameValue) @@ -213,7 +212,7 @@ public class DictService : DbRepository, IDictService /// 字典列表 /// 父ID /// - public List GetDevDictChilden(List dictList, long parentId) + public List GetDevDictChildren(List dictList, long parentId) { //找下级ID列表 var resources = dictList.Where(it => it.ParentId == parentId).ToList(); @@ -222,8 +221,8 @@ public class DictService : DbRepository, IDictService var data = new List(); foreach (var item in resources)//遍历机构 { - var orgs = GetDevDictChilden(dictList, item.Id); - data.AddRange(orgs);//添加子节点); + var devDictChildren = GetDevDictChildren(dictList, item.Id); + data.AddRange(devDictChildren);//添加子节点); data.Add(item);////添加到列表 } return data;//返回结果 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs index 915e30a..6eb9fe1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/Dto/SysOrgOutput.cs @@ -6,4 +6,4 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.System; \ No newline at end of file + diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs index 8f2d0d4..f9788bb 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/ISysOrgService.cs @@ -18,12 +18,12 @@ public interface ISysOrgService : ITransient /// /// 检查组织是否存在 /// - /// 组织列表 + /// 组织列表 /// 组织名称 /// 父Id /// 组织Id /// 是否存在,存在返回组织ID - bool IsExistOrgByName(List sysOrgs, string orgName, long parentId, + bool IsExistOrgByName(List sysOrgList, string orgName, long parentId, out long orgId); /// @@ -138,7 +138,7 @@ public interface ISysOrgService : ITransient /// 组织列表 /// 父ID /// 树型结构 - List ConstrucOrgTrees(List orgList, long parentId = 0); + List ConstructOrgTrees(List orgList, long parentId = 0); /// /// 刷新缓存 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs index f9cc32b..c98ada7 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Org/SysOrgService.cs @@ -12,33 +12,33 @@ namespace SimpleAdmin.System; public class SysOrgService : DbRepository, ISysOrgService { private readonly ISimpleCacheService _simpleCacheService; - private readonly IImportExportService _importExportService; - public SysOrgService(ISimpleCacheService simpleCacheService, - IImportExportService importExportService) + public SysOrgService(ISimpleCacheService simpleCacheService) { _simpleCacheService = simpleCacheService; - _importExportService = importExportService; } #region 查询 - /// + /// + /// 获取全部 + /// + /// public override async Task> GetListAsync() { //先从Redis拿 - var sysOrgs = _simpleCacheService.Get>(SystemConst.CACHE_SYS_ORG); - if (sysOrgs == null) + var sysOrgList = _simpleCacheService.Get>(SystemConst.CACHE_SYS_ORG); + if (sysOrgList == null) { //redis没有就去数据库拿 - sysOrgs = await base.GetListAsync(); - if (sysOrgs.Count > 0) + sysOrgList = await base.GetListAsync(); + if (sysOrgList.Count > 0) { //插入Redis - _simpleCacheService.Set(SystemConst.CACHE_SYS_ORG, sysOrgs); + _simpleCacheService.Set(SystemConst.CACHE_SYS_ORG, sysOrgList); } } - return sysOrgs; + return sysOrgList; } /// @@ -53,27 +53,27 @@ public class SysOrgService : DbRepository, ISysOrgService public async Task> GetChildListById(long orgId, bool isContainOneself = true) { //获取所有组织 - var sysOrgs = await GetListAsync(); + var sysOrgList = await GetListAsync(); //查找下级 - var childLsit = GetSysOrgChilden(sysOrgs, orgId); + var childList = GetSysOrgChildren(sysOrgList, orgId); if (isContainOneself)//如果包含自己 { //获取自己的组织信息 - var self = sysOrgs.Where(it => it.Id == orgId).FirstOrDefault(); - if (self != null) childLsit.Insert(0, self);//如果组织不为空就插到第一个 + var self = sysOrgList.Where(it => it.Id == orgId).FirstOrDefault(); + if (self != null) childList.Insert(0, self);//如果组织不为空就插到第一个 } - return childLsit; + return childList; } /// public async Task> GetOrgChildIds(long orgId, bool isContainOneself = true) { var orgIds = new List();//组织列表 - if (orgId > 0)//如果orgid有值 + if (orgId > 0)//如果orgId有值 { //获取所有子集 - var sysOrgs = await GetChildListById(orgId, isContainOneself); - orgIds = sysOrgs.Select(x => x.Id).ToList();//提取ID列表 + var sysOrgList = await GetChildListById(orgId, isContainOneself); + orgIds = sysOrgList.Select(x => x.Id).ToList();//提取ID列表 } return orgIds; } @@ -98,26 +98,26 @@ public class SysOrgService : DbRepository, ISysOrgService { long parentId = SimpleAdminConst.ZERO;//父级ID //获取所有组织 - var sysOrgs = await GetListAsync(); + var sysOrgList = await GetListAsync(); if (orgIds != null) - sysOrgs = GetParentListByIds(sysOrgs, orgIds);//如果组织ID不为空则获取组织ID列表的所有父节点 + sysOrgList = GetParentListByIds(sysOrgList, orgIds);//如果组织ID不为空则获取组织ID列表的所有父节点 //如果选择器ID不为空则表示是懒加载,只加载子节点 if (treeInput != null && treeInput.ParentId != null) { parentId = treeInput.ParentId.Value; - sysOrgs = GetSysOrgChildenLazy(sysOrgs, treeInput.ParentId.Value);//获取懒加载下级 + sysOrgList = GetSysOrgChildrenLazy(sysOrgList, treeInput.ParentId.Value);//获取懒加载下级 } - sysOrgs = sysOrgs.OrderBy(it => it.SortCode).ToList();//排序 + sysOrgList = sysOrgList.OrderBy(it => it.SortCode).ToList();//排序 //构建组织树 - var result = ConstrucOrgTrees(sysOrgs, parentId); + var result = ConstructOrgTrees(sysOrgList, parentId); return result; } /// public async Task Detail(BaseIdInput input) { - var sysOrgs = await GetListAsync(); - var orgDetail = sysOrgs.Where(it => it.Id == input.Id).FirstOrDefault(); + var sysOrgList = await GetListAsync(); + var orgDetail = sysOrgList.Where(it => it.Id == input.Id).FirstOrDefault(); return orgDetail; } @@ -125,40 +125,39 @@ public class SysOrgService : DbRepository, ISysOrgService public List GetOrgParents(List allOrgList, long orgId, bool includeSelf = true) { //找到组织 - var sysOrgs = allOrgList.Where(it => it.Id == orgId).FirstOrDefault(); - if (sysOrgs != null)//如果组织不为空 + var sysOrgList = allOrgList.Where(it => it.Id == orgId).FirstOrDefault(); + if (sysOrgList != null)//如果组织不为空 { var data = new List(); - var parents = GetOrgParents(allOrgList, sysOrgs.ParentId, includeSelf);//递归获取父节点 + var parents = GetOrgParents(allOrgList, sysOrgList.ParentId, includeSelf);//递归获取父节点 data.AddRange(parents);//添加父节点; if (includeSelf) - data.Add(sysOrgs);//添加到列表 + data.Add(sysOrgList);//添加到列表 return data;//返回结果 } return new List(); } /// - public bool IsExistOrgByName(List sysOrgs, string orgName, long parentId, + public bool IsExistOrgByName(List sysOrgList, string orgName, long parentId, out long orgId) { orgId = 0; - var sysOrg = sysOrgs.Where(it => it.ParentId == parentId && it.Name == orgName) + var sysOrg = sysOrgList.Where(it => it.ParentId == parentId && it.Name == orgName) .FirstOrDefault(); if (sysOrg != null) { orgId = sysOrg.Id; return true; } - else - return false; + return false; } /// public async Task> GetOrgListByIdList(IdListInput input) { - var sysOrgs = await GetListAsync(); - var orgList = sysOrgs.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的岗位列表 + var sysOrgList = await GetListAsync(); + var orgList = sysOrgList.Where(it => input.IdList.Contains(it.Id)).ToList();// 获取指定ID的岗位列表 return orgList; } @@ -185,7 +184,7 @@ public class SysOrgService : DbRepository, ISysOrgService var alreadyIds = new HashSet();//定义已经复制过得组织Id ids.AddRange(input.Ids);//加到集合 if (ids.Contains(input.TargetId)) - throw Oops.Bah($"不能包含自己"); + throw Oops.Bah("不能包含自己"); //获取目标组织 var target = orgList.Where(it => it.Id == input.TargetId).FirstOrDefault(); if (target != null || input.TargetId == SimpleAdminConst.ZERO) @@ -215,8 +214,8 @@ public class SysOrgService : DbRepository, ISysOrgService var childIds = await GetOrgChildIds(id, false);//获取下级id列表 alreadyIds.AddRange(childIds);//添加到已复制id var childList = orgList.Where(c => childIds.Contains(c.Id)).ToList();//获取下级 - var addOrgs = CopySysOrgChilden(childList, id, org.Id);//赋值下级组织 - addOrgList.AddRange(addOrgs); + var sysOrgChildren = CopySysOrgChildren(childList, id, org.Id);//赋值下级组织 + addOrgList.AddRange(sysOrgChildren); } } } @@ -257,12 +256,12 @@ public class SysOrgService : DbRepository, ISysOrgService var ids = input.Ids; if (ids.Count > 0) { - var sysOrgs = await GetListAsync();//获取所有组织 + var sysOrgList = await GetListAsync();//获取所有组织 var sysDeleteOrgList = new List();//需要删除的组织ID集合 ids.ForEach(it => { - var childen = GetSysOrgChilden(sysOrgs, it);//查找下级组织 - sysDeleteOrgList.AddRange(childen.Select(it => it.Id).ToList()); + var children = GetSysOrgChildren(sysOrgList, it);//查找下级组织 + sysDeleteOrgList.AddRange(children.Select(it => it.Id).ToList()); sysDeleteOrgList.Add(it); }); //如果组织下有用户则不能删除 @@ -317,16 +316,16 @@ public class SysOrgService : DbRepository, ISysOrgService } /// - public List ConstrucOrgTrees(List orgList, long parentId = 0) + public List ConstructOrgTrees(List orgList, long parentId = 0) { //找下级字典ID列表 - var orgs = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgInfos = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); + if (orgInfos.Count > 0)//如果数量大于0 { var data = new List(); - foreach (var item in orgs)//遍历字典 + foreach (var item in orgInfos)//遍历字典 { - item.Children = ConstrucOrgTrees(orgList, item.Id);//添加子节点 + item.Children = ConstructOrgTrees(orgList, item.Id);//添加子节点 data.Add(item);//添加到列表 } return data;//返回结果 @@ -350,8 +349,8 @@ public class SysOrgService : DbRepository, ISysOrgService && sysOrg.Category != CateGoryConst.ORG_DEPT) throw Oops.Bah($"{name}所属分类错误:{sysOrg.Category}"); - var sysOrgs = await GetListAsync();//获取全部 - if (sysOrgs.Any(it => + var sysOrgList = await GetListAsync();//获取全部 + if (sysOrgList.Any(it => it.ParentId == sysOrg.ParentId && it.Name == sysOrg.Name && it.Id != sysOrg.Id))//判断同级是否有名称重复的 throw Oops.Bah($"存在重复的同级{name}:{sysOrg.Name}"); @@ -359,7 +358,7 @@ public class SysOrgService : DbRepository, ISysOrgService if (sysOrg.ParentId != 0) { //获取父级,判断父级ID正不正确 - var parent = sysOrgs.Where(it => it.Id == sysOrg.ParentId).FirstOrDefault(); + var parent = sysOrgList.Where(it => it.Id == sysOrg.ParentId).FirstOrDefault(); if (parent != null) { if (parent.Id == sysOrg.Id) @@ -369,7 +368,7 @@ public class SysOrgService : DbRepository, ISysOrgService { throw Oops.Bah($"上级{name}不存在:{sysOrg.ParentId}"); } - sysOrg.Names = GetNames(sysOrgs, sysOrg.ParentId, sysOrg.Name); + sysOrg.Names = GetNames(sysOrgList, sysOrg.ParentId, sysOrg.Name); } } @@ -381,15 +380,15 @@ public class SysOrgService : DbRepository, ISysOrgService /// public List GetParentListByIds(List allOrgList, List orgIds) { - var sysOrgs = new HashSet();//结果列表 + var sysOrgList = new HashSet();//结果列表 //遍历组织ID orgIds.ForEach(it => { //获取该组织ID的所有父级 var parents = GetOrgParents(allOrgList, it); - sysOrgs.AddRange(parents);//添加到结果 + sysOrgList.AddRange(parents);//添加到结果 }); - return sysOrgs.ToList(); + return sysOrgList.ToList(); } /// @@ -398,17 +397,17 @@ public class SysOrgService : DbRepository, ISysOrgService /// /// /// - public List GetSysOrgChilden(List orgList, long parentId) + public List GetSysOrgChildren(List orgList, long parentId) { //找下级组织ID列表 - var orgs = orgList.Where(it => it.ParentId == parentId).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgInfos = orgList.Where(it => it.ParentId == parentId).ToList(); + if (orgInfos.Count > 0)//如果数量大于0 { var data = new List(); - foreach (var item in orgs)//遍历组织 + foreach (var item in orgInfos)//遍历组织 { - var childen = GetSysOrgChilden(orgList, item.Id);//获取子节点 - data.AddRange(childen);//添加子节点); + var children = GetSysOrgChildren(orgList, item.Id);//获取子节点 + data.AddRange(children);//添加子节点); data.Add(item);//添加到列表 } return data;//返回结果 @@ -422,23 +421,23 @@ public class SysOrgService : DbRepository, ISysOrgService /// /// /// - public List GetSysOrgChildenLazy(List orgList, long parentId) + public List GetSysOrgChildrenLazy(List orgList, long parentId) { //找下级组织ID列表 - var orgs = orgList.Where(it => it.ParentId == parentId).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgInfos = orgList.Where(it => it.ParentId == parentId).ToList(); + if (orgInfos.Count > 0)//如果数量大于0 { var data = new List(); - foreach (var item in orgs)//遍历组织 + foreach (var item in orgInfos)//遍历组织 { - var childen = orgList.Where(it => it.ParentId == item.Id).ToList();//获取子节点 + var children = orgList.Where(it => it.ParentId == item.Id).ToList();//获取子节点 //遍历子节点 - childen.ForEach(it => + children.ForEach(it => { if (!orgList.Any(org => org.ParentId == it.Id)) it.IsLeaf = true;//如果没有下级,则设置为叶子节点 }); - data.AddRange(childen);//添加子节点); + data.AddRange(children);//添加子节点); data.Add(item);//添加到列表 } return data;//返回结果 @@ -453,18 +452,18 @@ public class SysOrgService : DbRepository, ISysOrgService /// 父Id /// 新父Id /// - public List CopySysOrgChilden(List orgList, long parentId, long newParentId) + public List CopySysOrgChildren(List orgList, long parentId, long newParentId) { //找下级组织列表 - var orgs = orgList.Where(it => it.ParentId == parentId).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgInfos = orgList.Where(it => it.ParentId == parentId).ToList(); + if (orgInfos.Count > 0)//如果数量大于0 { var data = new List(); var newId = CommonUtils.GetSingleId(); - foreach (var item in orgs)//遍历组织 + foreach (var item in orgInfos)//遍历组织 { - var childen = CopySysOrgChilden(orgList, item.Id, newId);//获取子节点 - data.AddRange(childen);//添加子节点); + var children = CopySysOrgChildren(orgList, item.Id, newId);//获取子节点 + data.AddRange(children);//添加子节点); RedirectOrg(item);//实体重新赋值 item.ParentId = newParentId;//赋值父Id data.Add(item);//添加到列表 @@ -492,14 +491,14 @@ public class SysOrgService : DbRepository, ISysOrgService /// /// 获取全称 /// - /// 组织列表 + /// 组织列表 /// 父Id /// 组织名称 - public string GetNames(List sysOrgs, long parentId, string orgName) + public string GetNames(List sysOrgList, long parentId, string orgName) { var names = ""; //获取父级菜单 - var parents = GetOrgParents(sysOrgs, parentId, true); + var parents = GetOrgParents(sysOrgList, parentId); parents.ForEach(it => names += $"{it.Name}/");//循环加上名称 names = names + orgName;//赋值全称 return names; diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs index 915e30a..6eb9fe1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/Dto/PositionOutput.cs @@ -6,4 +6,4 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.System; \ No newline at end of file + diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs index c46caeb..6951c29 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/Position/SysPositionService.cs @@ -164,11 +164,11 @@ public class SysPositionService : DbRepository, ISysPositionService private async Task CheckInput(SysPosition sysPosition, string name) { //所有分类放一个列表 - var positionCategorys = new List() + var posCategoryList = new List { CateGoryConst.POSITION_HIGH, CateGoryConst.POSITION_LOW, CateGoryConst.POSITION_MIDDLE }; - if (!positionCategorys.Contains(sysPosition.Category)) + if (!posCategoryList.Contains(sysPosition.Category)) throw Oops.Bah($"{name}所属分类错误:{sysPosition.Category}"); var sysPositions = await GetListAsync();//获取全部 if (sysPositions.Any(it => @@ -177,11 +177,11 @@ public class SysPositionService : DbRepository, ISysPositionService throw Oops.Bah($"存在重复的{name}:{sysPosition.Name}"); if (sysPosition.Id > 0)//如果ID大于0表示编辑 { - var postion = + var position = sysPositions.Where(it => it.Id == sysPosition.Id).FirstOrDefault();//获取当前职位 - if (postion != null) + if (position != null) { - if (postion.OrgId != sysPosition.OrgId)//如果orgId不一样表示换机构了 + if (position.OrgId != sysPosition.OrgId)//如果orgId不一样表示换机构了 { if (await Context.Queryable().Where(it => it.PositionId == sysPosition.Id || SqlFunc.JsonLike(it.PositionJson, diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs index 55ea1e1..8109636 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/ISysUserService.cs @@ -11,7 +11,7 @@ namespace SimpleAdmin.System; /// /// 用户服务 /// -public partial interface ISysUserService : ITransient +public interface ISysUserService : ITransient { #region 查询 @@ -288,4 +288,4 @@ public partial interface ISysUserService : ITransient where T : SysUserImportInput; #endregion 导入导出 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs index 408f771..25dc188 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/Organization/User/SysUserService.cs @@ -59,13 +59,9 @@ public class SysUserService : DbRepository, ISysUserService var sysUser = await GetUserById(userId);//获取用户信息 if (sysUser.Account == account)//这里做了比较用来限制大小写 return sysUser; - else - return null; - } - else - { return null; } + return null; } /// @@ -76,10 +72,7 @@ public class SysUserService : DbRepository, ISysUserService { return await GetUserById(userId);//获取用户信息 } - else - { - return null; - } + return null; } /// @@ -176,7 +169,7 @@ public class SysUserService : DbRepository, ISysUserService resourceList.ForEach(it => { if (!string.IsNullOrEmpty(it.ExtJson)) - buttonIdList.AddRange(it.ExtJson.ToJsonEntity() + buttonIdList.AddRange(it.ExtJson.ToJsonEntity() .ButtonInfo);//如果有按钮权限,将按钮ID放到buttonIdList }); if (buttonIdList.Count > 0) @@ -431,7 +424,7 @@ public class SysUserService : DbRepository, ISysUserService { var isSuperAdmin = exist.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin && !UserManager.SuperAdmin) - throw Oops.Bah($"不可修改系统内置超管用户账号"); + throw Oops.Bah("不可修改系统内置超管用户账号"); var name = exist.Name;//姓名 var sysUser = input.Adapt();//实体转换 if (name != input.Name) @@ -454,8 +447,7 @@ public class SysUserService : DbRepository, ISysUserService { DeleteUserFromRedis(sysUser.Id);//删除用户缓存 //删除用户token缓存 - _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, - new string[] { sysUser.Id.ToString() }); + _simpleCacheService.HashDel>(CacheConst.CACHE_USER_TOKEN, sysUser.Id.ToString()); } } } @@ -480,7 +472,7 @@ public class SysUserService : DbRepository, ISysUserService { var isSuperAdmin = sysUser.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin) - throw Oops.Bah($"不可禁用系统内置超管用户账号"); + throw Oops.Bah("不可禁用系统内置超管用户账号"); CheckSelf(input.Id, SystemConst.DISABLE);//判断是不是自己 //设置状态为禁用 if (await UpdateAsync(it => new SysUser @@ -523,7 +515,7 @@ public class SysUserService : DbRepository, ISysUserService { var isSuperAdmin = sysUser.Account == SysRoleConst.SUPER_ADMIN;//判断是否有超管 if (isSuperAdmin) - throw Oops.Bah($"不能给超管分配角色"); + throw Oops.Bah("不能给超管分配角色"); CheckSelf(input.Id, SystemConst.GRANT_ROLE);//判断是不是自己 //给用户赋角色 await _relationService.SaveRelationBatch(CateGoryConst.RELATION_SYS_USER_HAS_ROLE, @@ -596,14 +588,14 @@ public class SysUserService : DbRepository, ISysUserService #region 保存数据库 //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { - var relatioRep = ChangeRepository>();//切换仓储 - await relatioRep.DeleteAsync(it => + var relationRep = ChangeRepository>();//切换仓储 + await relationRep.DeleteAsync(it => it.ObjectId == sysUser.Id && (it.Category == CateGoryConst.RELATION_SYS_USER_HAS_PERMISSION || it.Category == CateGoryConst.RELATION_SYS_USER_HAS_RESOURCE)); - await relatioRep.InsertRangeAsync(relationRoles);//添加新的 + await relationRep.InsertRangeAsync(relationRoles);//添加新的 }); if (result.IsSuccess)//如果成功了 { @@ -653,9 +645,9 @@ public class SysUserService : DbRepository, ISysUserService var containsSuperAdmin = await IsAnyAsync(it => it.Account == SysRoleConst.SUPER_ADMIN && ids.Contains(it.Id));//判断是否有超管 if (containsSuperAdmin) - throw Oops.Bah($"不可删除系统内置超管用户"); + throw Oops.Bah("不可删除系统内置超管用户"); if (ids.Contains(UserManager.UserId)) - throw Oops.Bah($"不可删除自己"); + throw Oops.Bah("不可删除自己"); //需要更新兼任信息的用户列表 var updatePositionJsonUser = new List(); @@ -696,7 +688,7 @@ public class SysUserService : DbRepository, ISysUserService CateGoryConst.RELATION_SYS_USER_HAS_ROLE }; //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { //清除该用户作为主管信息 await UpdateAsync(it => new SysUser @@ -833,9 +825,9 @@ public class SysUserService : DbRepository, ISysUserService .ToList();//数据库手机号列表 var dbEmails = sysUsers.Where(it => !string.IsNullOrEmpty(it.Email)).Select(it => it.Email) .ToList();//邮箱账号列表 - var sysOrgs = await _sysOrgService.GetListAsync(); + var sysOrgList = await _sysOrgService.GetListAsync(); var sysPositions = await _sysPositionService.GetListAsync(); - var dicts = await _dictService.GetListAsync(); + var dictList = await _dictService.GetListAsync(); #endregion 校验要用到的数据 @@ -852,7 +844,7 @@ public class SysUserService : DbRepository, ISysUserService if (dbAccounts.Contains(item.Account)) item.ErrorInfo.Add(nameof(item.Account), $"系统已存在账号{item.Account}"); if (accounts.Where(u => u == item.Account).Count() > 1) - item.ErrorInfo.Add(nameof(item.Account), $"账号重复"); + item.ErrorInfo.Add(nameof(item.Account), "账号重复"); #endregion 校验账号 @@ -863,7 +855,7 @@ public class SysUserService : DbRepository, ISysUserService if (dbPhones.Contains(item.Phone)) item.ErrorInfo.Add(nameof(item.Phone), $"系统已存在手机号{item.Phone}的用户"); if (phones.Where(u => u == item.Phone).Count() > 1) - item.ErrorInfo.Add(nameof(item.Phone), $"手机号重复"); + item.ErrorInfo.Add(nameof(item.Phone), "手机号重复"); } #endregion 校验手机号 @@ -875,7 +867,7 @@ public class SysUserService : DbRepository, ISysUserService if (dbEmails.Contains(item.Email)) item.ErrorInfo.Add(nameof(item.Email), $"系统已存在邮箱{item.Email}"); if (emails.Where(u => u == item.Email).Count() > 1) - item.ErrorInfo.Add(nameof(item.Email), $"邮箱重复"); + item.ErrorInfo.Add(nameof(item.Email), "邮箱重复"); } #endregion 校验邮箱 @@ -884,7 +876,7 @@ public class SysUserService : DbRepository, ISysUserService if (!string.IsNullOrEmpty(item.OrgName)) { - var org = sysOrgs.Where(u => u.Names == item.OrgName).FirstOrDefault(); + var org = sysOrgList.Where(u => u.Names == item.OrgName).FirstOrDefault(); if (org != null) item.OrgId = org.Id;//赋值组织Id else item.ErrorInfo.Add(nameof(item.OrgName), $"部门{org}不存在"); } @@ -892,7 +884,7 @@ public class SysUserService : DbRepository, ISysUserService if (!string.IsNullOrEmpty(item.PositionName)) { if (string.IsNullOrEmpty(item.OrgName)) - item.ErrorInfo.Add(nameof(item.PositionName), $"请填写部门"); + item.ErrorInfo.Add(nameof(item.PositionName), "请填写部门"); else { //根据部门ID和职位名判断是否有职位 @@ -907,28 +899,28 @@ public class SysUserService : DbRepository, ISysUserService #region 校验性别等字典 - var genders = await _dictService.GetValuesByDictValue(SysDictConst.GENDER, dicts); + var genders = await _dictService.GetValuesByDictValue(SysDictConst.GENDER, dictList); if (!genders.Contains(item.Gender)) - item.ErrorInfo.Add(nameof(item.Gender), $"性别只能是男和女"); + item.ErrorInfo.Add(nameof(item.Gender), "性别只能是男和女"); if (!string.IsNullOrEmpty(item.Nation)) { - var nations = await _dictService.GetValuesByDictValue(SysDictConst.NATION, dicts); + var nations = await _dictService.GetValuesByDictValue(SysDictConst.NATION, dictList); if (!nations.Contains(item.Nation)) - item.ErrorInfo.Add(nameof(item.Nation), $"不存在的民族"); + item.ErrorInfo.Add(nameof(item.Nation), "不存在的民族"); } if (!string.IsNullOrEmpty(item.IdCardType)) { var idCarTypes = - await _dictService.GetValuesByDictValue(SysDictConst.ID_CARD_TYPE, dicts); + await _dictService.GetValuesByDictValue(SysDictConst.ID_CARD_TYPE, dictList); if (!idCarTypes.Contains(item.IdCardType)) - item.ErrorInfo.Add(nameof(item.IdCardType), $"证件类型错误"); + item.ErrorInfo.Add(nameof(item.IdCardType), "证件类型错误"); } if (!string.IsNullOrEmpty(item.CultureLevel)) { - var cultrueLevels = - await _dictService.GetValuesByDictValue(SysDictConst.CULTURE_LEVEL, dicts); - if (!cultrueLevels.Contains(item.CultureLevel)) - item.ErrorInfo.Add(nameof(item.CultureLevel), $"文化程度有误"); + var cultureLevels = + await _dictService.GetValuesByDictValue(SysDictConst.CULTURE_LEVEL, dictList); + if (!cultureLevels.Contains(item.CultureLevel)) + item.ErrorInfo.Add(nameof(item.CultureLevel), "文化程度有误"); } #endregion 校验性别等字典 @@ -993,8 +985,8 @@ public class SysUserService : DbRepository, ISysUserService //如果邮箱不是空 if (!string.IsNullOrEmpty(sysUser.Email)) { - var (ismatch, match) = sysUser.Email.MatchEmail();//验证邮箱格式 - if (!ismatch) + var (isMatch, match) = sysUser.Email.MatchEmail();//验证邮箱格式 + if (!isMatch) throw Oops.Bah($"邮箱:{sysUser.Email} 格式错误"); if (await IsAnyAsync(it => it.Email == sysUser.Email && it.Id != sysUser.Id)) throw Oops.Bah($"存在重复的邮箱:{sysUser.Email}"); @@ -1031,7 +1023,7 @@ public class SysUserService : DbRepository, ISysUserService } /// - /// 获取Sqlsugar的ISugarQueryable + /// 获取SqlSugar的ISugarQueryable /// /// /// diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs index 915e30a..6eb9fe1 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/Dto/RelationInput.cs @@ -6,4 +6,4 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -namespace SimpleAdmin.System; \ No newline at end of file + diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs index cd926af..2728771 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Relation/RelationService.cs @@ -9,17 +9,15 @@ namespace SimpleAdmin.System; /// -public class Relationservice : DbRepository, IRelationService +public class RelationService : DbRepository, IRelationService { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly ISimpleCacheService _simpleCacheService; - private readonly IResourceService _resourceService; - public Relationservice(ILogger logger, ISimpleCacheService simpleCacheService, IResourceService resourceService) + public RelationService(ILogger logger, ISimpleCacheService simpleCacheService) { _logger = logger; _simpleCacheService = simpleCacheService; - _resourceService = resourceService; } /// @@ -105,7 +103,7 @@ public class Relationservice : DbRepository, IRelationService }); } //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { if (clear) await DeleteAsync(it => it.ObjectId == objectId && it.Category == category);//删除老的 @@ -135,7 +133,7 @@ public class Relationservice : DbRepository, IRelationService ExtJson = extJson }; //事务 - var result = await Itenant.UseTranAsync(async () => + var result = await Tenant.UseTranAsync(async () => { if (clear) await DeleteAsync(it => it.ObjectId == objectId && it.Category == category);//删除老的 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs index 2a9ae2b..e1723c2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/IResourceService.cs @@ -54,9 +54,9 @@ public interface IResourceService : ITransient /// /// 获取资源列表 /// - /// 资源分类列表 + /// 资源分类列表 /// - Task> GetListAsync(List? categorys = null); + Task> GetListAsync(List? categoryList = null); /// /// 根据分类获取资源列表 @@ -92,4 +92,4 @@ public interface IResourceService : ITransient /// /// Task> ResourceTreeSelector(); -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs index 3451ccd..8515b48 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/Resource/ResourceService.cs @@ -113,14 +113,14 @@ public class ResourceService : DbRepository, IResourceService //获取所有机构 var sysResources = await GetListAsync(); //查找下级 - var childLsit = GetResourceChilden(sysResources, resId); + var childList = GetResourceChildren(sysResources, resId); if (isContainOneself)//如果包含自己 { //获取自己的机构信息 var self = sysResources.Where(it => it.Id == resId).FirstOrDefault(); - if (self != null) childLsit.Insert(0, self);//如果机构不为空就插到第一个 + if (self != null) childList.Insert(0, self);//如果机构不为空就插到第一个 } - return childLsit; + return childList; } /// @@ -128,14 +128,14 @@ public class ResourceService : DbRepository, IResourceService bool isContainOneself = true) { //查找下级 - var childLsit = GetResourceChilden(sysResources, resId); + var childList = GetResourceChildren(sysResources, resId); if (isContainOneself)//如果包含自己 { //获取自己的机构信息 var self = sysResources.Where(it => it.Id == resId).FirstOrDefault(); - if (self != null) childLsit.Insert(0, self);//如果机构不为空就插到第一个 + if (self != null) childList.Insert(0, self);//如果机构不为空就插到第一个 } - return childLsit; + return childList; } /// @@ -195,29 +195,29 @@ public class ResourceService : DbRepository, IResourceService if (routes.Contains(routeName)) { //获取所有方法 - var menthods = controller.GetMethods(); + var methods = controller.GetMethods(); //遍历方法 - foreach (var menthod in menthods) + foreach (var method in methods) { //获取忽略数据权限特性 var ignoreRolePermission = - menthod.GetCustomAttribute(); + method.GetCustomAttribute(); if (ignoreRolePermission == null)//如果是空的代表需要数据权限 { //获取接口描述 - var displayName = menthod.GetCustomAttribute(); + var displayName = method.GetCustomAttribute(); if (displayName != null) { //默认路由名称 - var apiRoute = StringHelper.FirstCharToLower(menthod.Name); + var apiRoute = StringHelper.FirstCharToLower(method.Name); //获取get特性 - var requestGet = menthod.GetCustomAttribute(); + var requestGet = method.GetCustomAttribute(); if (requestGet != null)//如果是get方法 apiRoute = requestGet.Template; else { //获取post特性 - var requestPost = menthod.GetCustomAttribute(); + var requestPost = method.GetCustomAttribute(); if (requestPost != null)//如果是post方法 apiRoute = requestPost.Template; } @@ -278,7 +278,7 @@ public class ResourceService : DbRepository, IResourceService /// 资源列表 /// 父ID /// - public List GetResourceChilden(List resourceList, long parentId) + public List GetResourceChildren(List resourceList, long parentId) { //找下级资源ID列表 var resources = resourceList.Where(it => it.ParentId == parentId).ToList(); @@ -287,7 +287,7 @@ public class ResourceService : DbRepository, IResourceService var data = new List(); foreach (var item in resources)//遍历资源 { - var res = GetResourceChilden(resourceList, item.Id); + var res = GetResourceChildren(resourceList, item.Id); data.AddRange(res);//添加子节点; data.Add(item);//添加到列表 } @@ -433,10 +433,7 @@ public class ResourceService : DbRepository, IResourceService var title = string.Join("- ", titles) + $"-{menu.Title}";//根据-分割,转换成字符串并在最后加上菜单的title return title; } - else - { - return menu.Title;//原路返回 - } + return menu.Title;//原路返回 } #endregion 方法 diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs index 0b244aa..33c8a03 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterInput.cs @@ -62,7 +62,7 @@ public class UpdatePasswordInput /// /// 设置默认模块输入 /// -public class SetDeafultModuleInput +public class SetDefaultModuleInput { /// /// 模块Id @@ -75,4 +75,4 @@ public class SetDeafultModuleInput /// [Required(ErrorMessage = "IfDefault不能为空")] public bool IfDefault { get; set; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs index 9ebedc1..c97cfb2 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/Dto/UserCenterOutput.cs @@ -36,7 +36,7 @@ public class LoginOrgTreeOutput /// /// 样式 /// - public MyStyle Style { get; set; } + public MyStyle? Style { get; set; } /// /// 我的机构样式 @@ -53,4 +53,4 @@ public class LoginOrgTreeOutput /// public string Color { get; set; } = "#FFF"; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs index c9abe71..25dd8fa 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/IUserCenterService.cs @@ -105,7 +105,7 @@ public interface IUserCenterService : ITransient /// /// 默认模块输入参数 /// - Task SetDeafultModule(SetDeafultModuleInput input); + Task SetDefaultModule(SetDefaultModuleInput input); #endregion 编辑 -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs index a973689..3a1c988 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs +++ b/api/SimpleAdmin/SimpleAdmin.System/Services/System/UserCenter/UserCenterService.cs @@ -109,33 +109,27 @@ public class UserCenterService : DbRepository, IUserCenterService //如果有数据直接返回个人工作台 return sysRelation.ExtJson.ToLower(); } - else + //如果没数据去系统配置里取默认的工作台 + var devConfig = await _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, + SysConfigConst.SYS_DEFAULT_WORKBENCH_DATA); + if (devConfig != null) { - //如果没数据去系统配置里取默认的工作台 - var devConfig = await _configService.GetByConfigKey(CateGoryConst.CONFIG_SYS_BASE, - SysConfigConst.SYS_DEFAULT_WORKBENCH_DATA); - if (devConfig != null) - { - return devConfig.ConfigValue.ToLower();//返回工作台信息 - } - else - { - return ""; - } + return devConfig.ConfigValue.ToLower();//返回工作台信息 } + return ""; } /// public async Task> LoginOrgTree() { var orgList = await _sysOrgService.GetListAsync();//获取全部机构 - var parentOrgs = _sysOrgService.GetOrgParents(orgList, UserManager.OrgId);//获取父节点列表 - var topOrg = parentOrgs.Where(it => it.ParentId == SimpleAdminConst.ZERO) + var parentOrgList = _sysOrgService.GetOrgParents(orgList, UserManager.OrgId);//获取父节点列表 + var topOrg = parentOrgList.Where(it => it.ParentId == SimpleAdminConst.ZERO) .FirstOrDefault();//获取顶级节点 if (topOrg != null) { - var orgs = await _sysOrgService.GetChildListById(topOrg.Id);//获取下级 - var orgTree = ConstrucOrgTrees(orgs, 0, UserManager.OrgId);//获取组织架构 + var orgChildList = await _sysOrgService.GetChildListById(topOrg.Id);//获取下级 + var orgTree = ConstrucOrgTrees(orgChildList, 0, UserManager.OrgId);//获取组织架构 return orgTree; } return new List(); @@ -171,18 +165,18 @@ public class UserCenterService : DbRepository, IUserCenterService if (!string.IsNullOrEmpty(input.Phone)) { if (!input.Phone.MatchPhoneNumber())//判断是否是手机号格式 - throw Oops.Bah($"手机号码格式错误"); + throw Oops.Bah("手机号码格式错误"); input.Phone = CryptogramUtil.Sm4Encrypt(input.Phone); var any = await IsAnyAsync(it => it.Phone == input.Phone && it.Id != UserManager.UserId);//判断是否有重复的 if (any) - throw Oops.Bah($"系统已存在该手机号"); + throw Oops.Bah("系统已存在该手机号"); } if (!string.IsNullOrEmpty(input.Email)) { var match = input.Email.MatchEmail(); if (!match.isMatch) - throw Oops.Bah($"邮箱格式错误"); + throw Oops.Bah("邮箱格式错误"); } //更新指定字段 @@ -202,10 +196,9 @@ public class UserCenterService : DbRepository, IUserCenterService /// public async Task UpdateSignature(UpdateSignatureInput input) { - var user = await _userService.GetUserById(UserManager.UserId);//获取信息 var signatureArray = input.Signature.Split(",");//分割 var base64String = signatureArray[1];//根据逗号分割取到base64字符串 - var image = base64String.GetSKBitmapFromBase64();//转成图片 + var image = base64String.GetSkBitmapFromBase64();//转成图片 var resizeImage = image.ResizeImage(100, 50);//重新裁剪 var newBase64String = resizeImage.ImgToBase64String();//重新转为base64 var newSignature = signatureArray[0] + "," + newBase64String;//赋值新的签名 @@ -258,13 +251,13 @@ public class UserCenterService : DbRepository, IUserCenterService if (minLength > newPassword.Length) throw Oops.Bah($"密码长度不能小于{minLength}"); if (containNumber && !Regex.IsMatch(newPassword, "[0-9]")) - throw Oops.Bah($"密码必须包含数字"); + throw Oops.Bah("密码必须包含数字"); if (containLower && !Regex.IsMatch(newPassword, "[a-z]")) - throw Oops.Bah($"密码必须包含小写字母"); + throw Oops.Bah("密码必须包含小写字母"); if (containUpper && !Regex.IsMatch(newPassword, "[A-Z]")) - throw Oops.Bah($"密码必须包含大写字母"); + throw Oops.Bah("密码必须包含大写字母"); if (containChar && !Regex.IsMatch(newPassword, "[~!@#$%^&*()_+`\\-={}|\\[\\]:\";'<>?,./]")) - throw Oops.Bah($"密码必须包含特殊字符"); + throw Oops.Bah("密码必须包含特殊字符"); // var similarity = PwdUtil.Similarity(password, newPassword); // if (similarity > 80) // throw Oops.Bah($"新密码请勿与旧密码过于相似"); @@ -295,7 +288,7 @@ public class UserCenterService : DbRepository, IUserCenterService } /// - public async Task SetDeafultModule(SetDeafultModuleInput input) + public async Task SetDefaultModule(SetDefaultModuleInput input) { //获取用户信息 var userInfo = await _userService.GetUserById(UserManager.UserId); @@ -371,11 +364,11 @@ public class UserCenterService : DbRepository, IUserCenterService long orgId) { //找下级字典ID列表 - var orgs = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); - if (orgs.Count > 0)//如果数量大于0 + var orgParents = orgList.Where(it => it.ParentId == parentId).OrderBy(it => it.SortCode).ToList(); + if (orgParents.Count > 0)//如果数量大于0 { var data = new List(); - foreach (var item in orgs)//遍历字典 + foreach (var item in orgParents)//遍历字典 { var loginOrg = new LoginOrgTreeOutput { @@ -383,7 +376,7 @@ public class UserCenterService : DbRepository, IUserCenterService Id = item.Id, Label = item.Name, Pid = item.ParentId, - Style = orgId != item.Id ? null : new LoginOrgTreeOutput.MyStyle { } + Style = orgId != item.Id ? null : new LoginOrgTreeOutput.MyStyle() }; data.Add(loginOrg);//添加到列表 } diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj index 0fd38c7..50e3a46 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.csproj @@ -18,15 +18,14 @@ - - - + + + - - - + + @@ -73,7 +72,7 @@ - + diff --git a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml index aa2aaa5..42c5271 100644 --- a/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml +++ b/api/SimpleAdmin/SimpleAdmin.System/SimpleAdmin.System.xml @@ -6,2147 +6,2135 @@ - 前端表格特性 + 前端表格特性 - 是否是日期格式 + 是否是日期格式 - 是否自动省略 + 是否自动省略 - 宽度 + 宽度 - 批量更新 + 批量更新 - 验证值是否在字典中,大数据慎用 + 验证值是否在字典中,大数据慎用 - 字典值 + 字典值 - 获取错误信息 + 获取错误信息 - 分类常量 + 分类常量 - 系统基础 + 系统基础 - 登录策略 + 登录策略 - 密码策略 + 密码策略 - 业务定义 + 业务定义 - 文件-本地 + 文件-本地 - 文件-MINIO + 文件-MINIO - MQTT配置 + MQTT配置 - 用户有哪些角色 + 用户有哪些角色 - 角色有哪些资源 + 角色有哪些资源 - 角色有哪些模块 + 角色有哪些模块 - - 用户有哪些资源 - + + 用户有哪些资源 + - 角色有哪些权限 + 角色有哪些权限 - 角色有哪些权限 + 角色有哪些权限 - 用户工作台数据 + 用户工作台数据 - 用户日程数据 + 用户日程数据 - 站内信与接收用户 + 站内信与接收用户 - 本人 + 本人 - 所有 + 所有 - 仅所属组织 + 仅所属组织 - 所属组织及以下 + 所属组织及以下 - 自定义 + 自定义 - 模块 + 模块 - 菜单 + 菜单 - 单页 + 单页 - 按钮 + 按钮 - 登录 + 登录 - 登出 + 登出 - 操作 + 操作 - 异常 + 异常 - 框架 + 框架 - 业务 + 业务 - 部门 + 部门 - 公司 + 公司 - 高层 + 高层 - 中层 + 中层 - 基层 + 基层 - 全局 + 全局 - 机构 + 机构 - 通知 + 通知 - 公告 + 公告 - 系统配置常量 + 系统配置常量 - 系统默认工作台 + 系统默认工作台 - 登录验证码开关 + 登录验证码开关 - 登录验证码开关 + 登录验证码开关 - 单用户登录开关 + 单用户登录开关 - 登录错误锁定时长 + 登录错误锁定时长 - 登录错误锁定时长 + 登录错误锁定时长 - 登录错误次数 + 登录错误次数 - 默认用户密码 + 默认用户密码 - 密码定期提醒更新 + 密码定期提醒更新 - 密码定期提醒更新时间 + 密码定期提醒更新时间 - 修改初始密码提醒 + 修改初始密码提醒 - 密码最小长度 + 密码最小长度 - 包含数字 + 包含数字 - 包含小写字母 + 包含小写字母 - 包含大写字母 + 包含大写字母 - 包含特殊字符 + 包含特殊字符 - windows系统本地目录 + windows系统本地目录 - Unix系统本地目录 + Unix系统本地目录 - MINIO文件AccessKey + MINIO文件AccessKey - MINIO文件SecetKey + MINIO文件SecetKey - MINIO文件EndPoint + MINIO文件EndPoint - MINIO文件默认存储桶 + MINIO文件默认存储桶 - 字典常量 + 字典常量 - 性别 + 性别 - 名族 + 名族 - 用户证件类型 + 用户证件类型 - 通用文化程度 + 通用文化程度 - 启用 + 启用 - 停用 + 停用 - 在线 + 在线 - 离线 + 离线 - 本地 + 本地 - MINIO + MINIO - 系统 + 系统 - 业务 + 业务 - 日志常量 + 日志常量 - 成功 + 成功 - 成功 + 成功 - 资源表常量 + 资源表常量 - 目录 + 目录 - 菜单 + 菜单 - 内链 + 内链 - 子页 + 子页 - 外链 + 外链 - 单页 + 单页 - 系统内置单页面编码 + 系统内置单页面编码 - 角色常量 + 角色常量 - 超级管理员 + 超级管理员 - 业务管理员 + 业务管理员 - 系统层常量 + 系统层常量 - 系统配置表缓存Key + 系统配置表缓存Key - 登录验证码缓存Key + 登录验证码缓存Key - 用户表缓存Key + 用户表缓存Key - 用户手机号关系缓存Key + 用户手机号关系缓存Key - 用户手机号关系缓存Key + 用户手机号关系缓存Key - 资源表缓存Key + 资源表缓存Key - 字典表缓存Key + 字典表缓存Key - 关系表缓存Key + 关系表缓存Key - 机构表缓存Key + 机构表缓存Key - 角色表缓存Key + 角色表缓存Key - 职位表缓存Key + 职位表缓存Key - 登录错误次数缓存Key + 登录错误次数缓存Key - 添加操作 + 添加操作 - 编辑操作 + 编辑操作 - 启用操作 + 启用操作 - 禁用操作 + 禁用操作 - 重置密码操作 + 重置密码操作 - 用户授权操作 + 用户授权操作 - 组织 + 组织 - 职位 + 职位 - - 批量修改 + + 批量修改 - - 唯一编码 + + 唯一编码 - - 所属库 + + 所属库 - - 实体名 + + 实体名 - - 表名 + + 表名 - - 表描述 + + 表描述 - - 批量修改配置表 + + 批量修改配置表 - - 批量配置Id + + 批量配置Id - - 字段名 + + 字段名 - - 字段描述 + + 字段描述 - - 作用类型 + + 作用类型 - - 字典值 + + 字典值 - - 数据库类型 + + 数据库类型 - 接口名称 + 接口名称 - 接口类型 + 接口类型 - 接口结果标签 + 接口结果标签 - 接口结果值 + 接口结果值 - 启用状态 + 启用状态 - - C端用户 + + C端用户 - - 头像 + + 头像 - - 签名 + + 签名 - - 账号 + + 账号 - - 密码 + + 密码 - - 姓名 + + 姓名 - - 昵称 + + 昵称 - - 性别 + + 性别 - - 年龄 + + 年龄 - - 出生日期 + + 出生日期 - - 民族 + + 民族 - - 籍贯 + + 籍贯 - - 家庭住址 + + 家庭住址 - - 通信地址 + + 通信地址 - - 证件类型 + + 证件类型 - - 证件号码 + + 证件号码 - - 文化程度 + + 文化程度 - - 政治面貌 + + 政治面貌 - - 毕业院校 + + 毕业院校 - - 学历 + + 学历 - - 学制 + + 学制 - - 学位 + + 学位 - - 手机 + + 手机 - - 邮箱 + + 邮箱 - - 家庭电话 + + 家庭电话 - - 办公电话 + + 办公电话 - - 紧急联系人 + + 紧急联系人 - - 紧急联系人电话 + + 紧急联系人电话 - - 紧急联系人地址 + + 紧急联系人地址 - - 员工编号 + + 员工编号 - - 入职日期 + + 入职日期 - - 机构id + + 机构id - - 职位id + + 职位id - - 职级 + + 职级 - - 主管id + + 主管id - - 兼任信息 + + 兼任信息 - - 上次登录ip + + 上次登录ip - - 上次登录地点 + + 上次登录地点 - - 上次登录时间 + + 上次登录时间 - - 上次登录设备 + + 上次登录设备 - - 最新登录ip + + 最新登录ip - - 最新登录地点 + + 最新登录地点 - - 最新登录时间 + + 最新登录时间 - - 最新登录设备 + + 最新登录设备 - - 用户状态 + + 用户状态 - - 排序码 + + 排序码 - - 配置 + + 配置 - - 配置键 + + 配置键 - - 配置值 + + 配置值 - - 分类 + + 分类 - - 备注 + + 备注 - - 排序码 + + 排序码 - - 字典 + + 字典 - - 父id + + 父id - - 字典文字 + + 字典文字 - - 字典值 + + 字典值 - - 分类 + + 分类 - - 排序码 + + 排序码 - - 状态 + + 状态 - 子节点 + 子节点 - - 文件表 + + 文件表 - - 存储引擎 + + 存储引擎 - - 存储桶 + + 存储桶 - - 文件名称 + + 文件名称 - - 文件后缀 + + 文件后缀 - - 文件大小kb + + 文件大小kb - - 文件大小(格式化后) + + 文件大小(格式化后) - - 文件的对象名(唯一名称) + + 文件的对象名(唯一名称) - - 文件存储路径 + + 文件存储路径 - - 文件下载路径 + + 文件下载路径 - - 图片缩略图 + + 图片缩略图 - - 操作日志表 + + 操作日志表 - - 具体消息 + + 具体消息 - - 类名称 + + 类名称 - - 方法名称 + + 方法名称 - - 请求方式 + + 请求方式 - - 请求地址 + + 请求地址 - - 请求参数 + + 请求参数 - - 返回结果 + + 返回结果 - - 访问日志表 + + 访问日志表 - - 日志分类 + + 日志分类 - - 日志名称 + + 日志名称 - - 执行状态 + + 执行状态 - - 操作ip + + 操作ip - - 操作地址 + + 操作地址 - - 操作浏览器 + + 操作浏览器 - - 操作系统 + + 操作系统 - - 操作时间 + + 操作时间 - - 操作人姓名 + + 操作人姓名 - - 操作人姓名 + + 操作人姓名 - - 站内信 + + 站内信 - - 分类 + + 分类 - - 主题 + + 主题 - - 正文 + + 正文 - 是否已读 + 是否已读 - - 用户消息表 + + 用户消息表 - - 消息Id + + 消息Id - - 用户Id + + 用户Id - - 已读未读 + + 已读未读 - - 组织 + + 组织 - - 父id + + 父id - - 主管ID + + 主管ID - - 名称 + + 名称 - - 全称 + + 全称 - - 编码 + + 编码 - - 分类 + + 分类 - - 排序码 + + 排序码 - 子节点 + 子节点 - 设置为叶子节点(设置了loadData时有效) + 设置为叶子节点(设置了loadData时有效) - - 职位表 + + 职位表 - - 组织id + + 组织id - - 名称 + + 名称 - - 编码 + + 编码 - - 分类 + + 分类 - - 排序码 + + 排序码 - - 系统关系表 + + 系统关系表 - - 对象ID + + 对象ID - - 目标ID + + 目标ID - - 分类 + + 分类 - - 资源 + + 资源 - - 父id + + 父id - - 标题 + + 标题 - - 别名 + + 别名 - - 描述 + + 描述 - - 编码 + + 编码 - - 分类 + + 分类 - - 模块 + + 模块 - - 菜单类型 + + 菜单类型 - - 路径 + + 路径 - - 组件 + + 组件 - - 图标 + + 图标 - - 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + + 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) - - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - - 菜单是否固定在标签页中 (首页通常是固定项) + + 菜单是否固定在标签页中 (首页通常是固定项) - - 菜单是否固定在标签页中 (首页通常是固定项) + + 菜单是否固定在标签页中 (首页通常是固定项) - - 是否为首页 + + 是否为首页 - - 排序码 + + 排序码 - 菜单元标签 + 菜单元标签 - 子节点 + 子节点 - 菜单元标签 + 菜单元标签 - 图标 + 图标 - 标题 + 标题 - - 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) + + 是否在菜单中隐藏, 需要高亮的 path (通常用作详情页高亮父级菜单) - - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - 路由外链时填写的访问地址 + 路由外链时填写的访问地址 - - 是否在菜单中隐藏 (通常列表详情页需要隐藏) + + 是否在菜单中隐藏 (通常列表详情页需要隐藏) - - 菜单是否固定在标签页中 (首页通常是固定项) + + 菜单是否固定在标签页中 (首页通常是固定项) - - 菜单是否固定在标签页中 (首页通常是固定项) + + 菜单是否固定在标签页中 (首页通常是固定项) - - 角色 + + 角色 - - 组织id + + 组织id - - 名称 + + 名称 - - 编码 + + 编码 - - 分类 + + 分类 - - 默认数据范围 + + 默认数据范围 - - 排序码 + + 排序码 - 默认数据范围 + 默认数据范围 - 数据范围等级 + 数据范围等级 - 数据范围 + 数据范围 - 自定义机构范围列表 + 自定义机构范围列表 - - 用户信息表 + + 用户信息表 - - 头像 + + 头像 - - 签名 + + 签名 - - 账号 + + 账号 - - 密码 + + 密码 - - 姓名 + + 姓名 - - 昵称 + + 昵称 - - 性别 + + 性别 - - 出生日期 + + 出生日期 - - 民族 + + 民族 - - 籍贯 + + 籍贯 - - 家庭住址 + + 家庭住址 - - 通信地址 + + 通信地址 - - 证件类型 + + 证件类型 - - 证件号码 + + 证件号码 - - 文化程度 + + 文化程度 - - 政治面貌 + + 政治面貌 - - 毕业院校 + + 毕业院校 - - 学历 + + 学历 - - 学制 + + 学制 - - 学位 + + 学位 - - 手机 - 这里使用了SM4自动加密解密 + + 手机 + 这里使用了SM4自动加密解密 - - 邮箱 + + 邮箱 - - 家庭电话 + + 家庭电话 - - 办公电话 + + 办公电话 - - 紧急联系人 + + 紧急联系人 - - 紧急联系人电话 + + 紧急联系人电话 - - 紧急联系人地址 + + 紧急联系人地址 - - 员工编号 + + 员工编号 - - 入职日期 + + 入职日期 - - 机构id + + 机构id - - 职位id + + 职位id - - 职级 + + 职级 - - 主管id + + 主管id - - 兼任信息 + + 兼任信息 - - 上次修改密码时间 + + 上次修改密码时间 - - 上次登录ip + + 上次登录ip - - 上次登录地点 + + 上次登录地点 - - 上次登录时间 + + 上次登录时间 - - 上次登录设备 + + 上次登录设备 - - 最新登录ip + + 最新登录ip - - 最新登录地点 + + 最新登录地点 - - 最新登录时间 + + 最新登录时间 - - 最新登录设备 + + 最新登录设备 - - 用户状态 + + 用户状态 - - 排序码 + + 排序码 - - 默认模块 + + 默认模块 - 机构信息 + 机构信息 - 机构信息全称 + 机构信息全称 - 职位信息 + 职位信息 - 按钮码集合 + 按钮码集合 - 权限码集合 + 权限码集合 - 角色码集合 + 角色码集合 - 角色ID集合 + 角色ID集合 - 数据范围集合 + 数据范围集合 - 默认数据范围 + 默认数据范围 - 机构及以下机构ID集合 + 机构及以下机构ID集合 - 机构及以下机构ID集合 + 机构及以下机构ID集合 - 数据范围类 + 数据范围类 - API接口 + API接口 - 数据范围分类 + 数据范围分类 - 数据范围的机构ID列表 + 数据范围的机构ID列表 - 兼任信息 + 兼任信息 - 组织ID + 组织ID - 机构ID + 机构ID - 主管ID + 主管ID - 认证模块事件总线 + 认证模块事件总线 - 登录事件 + 登录事件 - 登出事件 + 登出事件 - 解析IP地址 + 解析IP地址 ip地址 - - - 获取通知服务 - - - - 事件总线常量 + 事件总线常量 - B端登录 + B端登录 - B端登录 + B端登录 - 清除用户缓存 + 清除用户缓存 - 通知用户下线 + 通知用户下线 - 新消息 + 新消息 - 登录事件参数 + 登录事件参数 - 请求上下文 + 请求上下文 - 用户信息 + 用户信息 - Ip地址 + Ip地址 - 登录设备 + 登录设备 - Tokens + Tokens - 过期时间 + 过期时间 - 时间 + 时间 - 用户登出事件 + 用户登出事件 - 用户Id + 用户Id - token信息 + token信息 - 内容 + 内容 - 新消息事件 + 新消息事件 - 用户Id + 用户Id - 内容 + 内容 - 通知事件总线 + 通知事件总线 - 通知用户下线事件 + 通知用户下线事件 - 有新的消息 + 有新的消息 - 获取服务 + 获取服务 - - - 获取通知服务 - - - - 用户模块事件总线 + 用户模块事件总线 - 根据角色ID列表清除用户缓存 + 根据角色ID列表清除用户缓存 - 站内信与接收用户拓展 - MSG_TO_USER + 站内信与接收用户拓展 + MSG_TO_USER - 是否已读 + 是否已读 - SYS_ROLE_HAS_PERMISSION - 角色权限关系扩展 + SYS_ROLE_HAS_PERMISSION + 角色权限关系扩展 - 数据范围 + 数据范围 - 自定义机构范围列表 + 自定义机构范围列表 - 接口Url + 接口Url - + - SYS_ROLE_HAS_RESOURCE - 角色有哪些资源扩展 + SYS_ROLE_HAS_RESOURCE + 角色有哪些资源扩展 - + - 菜单ID + 菜单ID - + - 按钮信息 + 按钮信息 - SYS_USER_SCHEDULE_DATA - 用户日程扩展 + SYS_USER_SCHEDULE_DATA + 用户日程扩展 - 日程日期 + 日程日期 - 日程时间 + 日程时间 - 日程内容 + 日程内容 - 用户id + 用户id - 用户姓名 + 用户姓名 - SYS_USER_WORKBENCH_DATA - 用户工作台扩展 + SYS_USER_WORKBENCH_DATA + 用户工作台扩展 - 快捷方式列表 + 快捷方式列表 - 工作台快捷方式信息 + 工作台快捷方式信息 - id + id - 标题 + 标题 - 图标 + 图标 - 路由地址 + 路由地址 - 对象映射 + 对象映射 - 系统配置 + 系统配置 - Minio功能类 + Minio功能类 - 初始化操作 + 初始化操作 - 上传文件 - 返回Minio文件完整Url + 上传文件 - 返回Minio文件完整Url 存储桶里的对象名称,例:/mnt/photos/island.jpg 文件 @@ -2155,59 +2143,59 @@ - 下载文件 + 下载文件 - 批量修改字段种子数据 + 批量修改字段种子数据 - 批量修改配置种子数据 + 批量修改配置种子数据 - 系统配置种子数据 + 系统配置种子数据 - 字典表种子数据 + 字典表种子数据 - 机构种子数据 + 机构种子数据 - 职位表种子数据 + 职位表种子数据 - 关系表种子数据 + 关系表种子数据 - 资源表种子数据 + 资源表种子数据 - 角色种子数据 + 角色种子数据 - 用户表种子数据 + 用户表种子数据 @@ -2233,21 +2221,21 @@ - 登录之前执行的方法 + 登录之前执行的方法 - 登录错误操作 + 登录错误操作 - 校验验证码方法 + 校验验证码方法 验证码 请求号 @@ -2255,13 +2243,13 @@ - 从Redis中删除验证码 + 从Redis中删除验证码 - 校验手机验证码 + 校验手机验证码 输入参数 登录端类型 @@ -2270,15 +2258,15 @@ - 添加验证码到redis + 添加验证码到redis 验证码 过期时间 验证码请求号 - + - 执行B端登录 + 执行B端登录 用户信息 登录设备 @@ -2287,256 +2275,258 @@ - 写入用户token到redis + 写入用户token到redis 登录事件参数 登录类型 - redis删除用户token + redis删除用户token 登录事件参数 登录类型 - 获取用户token列表 + 获取用户token列表 用户ID token列表 - 单用户登录通知用户下线 + 单用户登录通知用户下线 用户ID Token列表 - 权限认证输入 + 权限认证输入 - 验证码 + 验证码 - 请求号 + 请求号 - 登录输入参数 + 登录输入参数 - - 账号 + + 账号 - superAdmin + superAdmin - - 密码 + + 密码 - 04fc514b346f14b23d7cf5e6f64663b030512aa380a9e7d311288ed1e8be7b863ae5ee0bb570df2405fc9daff2b2d1ac627a0fbbd49ef2c6b8fac4fd5e4b9a1b7120999bdc0a8e425aa37abab3aec6f9f3570775ff901f2845e957b0c2d0542e21fbf1bbb65c04 + + 04fc514b346f14b23d7cf5e6f64663b030512aa380a9e7d311288ed1e8be7b863ae5ee0bb570df2405fc9daff2b2d1ac627a0fbbd49ef2c6b8fac4fd5e4b9a1b7120999bdc0a8e425aa37abab3aec6f9f3570775ff901f2845e957b0c2d0542e21fbf1bbb65c04 + - 设备类型,默认PC + 设备类型,默认PC 0 - + - 登出输入参数 + 登出输入参数 - + - token + token - 获取短信验证码输入 + 获取短信验证码输入 - 手机号 + 手机号 - 手机号登录输入 + 手机号登录输入 - 设备类型,默认PC + 设备类型,默认PC 0 - 验证码返回 + 验证码返回 - 验证码图片,Base64 + 验证码图片,Base64 - 验证码请求号 + 验证码请求号 - 登录返回参数 + 登录返回参数 - 令牌Token + 令牌Token - 账号 + 账号 - 姓名 + 姓名 - 默认模块 + 默认模块 - 模块列表 + 模块列表 - 登录用互信息 + 登录用互信息 - - 头像 + + 头像 - - 签名 + + 签名 - - 账号 + + 账号 - - 姓名 + + 姓名 - - 昵称 + + 昵称 - 手机号 + 手机号 - 生日 + 生日 - 邮箱 + 邮箱 - - 性别 + + 性别 - - 家庭住址 + + 家庭住址 - 机构信息 + 机构信息 - 机构信息全称 + 机构信息全称 - 职位信息 + 职位信息 - 角色码集合 + 角色码集合 - 按钮码集合 + 按钮码集合 - 机构及以下机构ID集合 + 机构及以下机构ID集合 - - 默认模块 + + 默认模块 - 权限校验服务 + 权限校验服务 - 获取图形验证码 + 获取图形验证码 - 获取登录用户信息 + 获取登录用户信息 - 获取手机短信验证码 + 获取手机短信验证码 验证码参数 登录类型 @@ -2544,7 +2534,7 @@ - 登录 + 登录 登录参数 登录类型 @@ -2552,7 +2542,7 @@ - 手机号登录 + 手机号登录 登录参数 登录端类型 @@ -2560,7 +2550,7 @@ - 退出登录 + 退出登录 token 登出类型 @@ -2568,154 +2558,154 @@ - 会话分页查询 + 会话分页查询 - - 账号 + + 账号 - - 姓名 + + 姓名 - - 最新登录ip + + 最新登录ip - Token退出参数 + Token退出参数 - token + token - 会话输出 + 会话输出 - 主键Id + 主键Id - - 头像 + + 头像 - - 账号 + + 账号 - - 姓名 + + 姓名 - 在线状态 + 在线状态 - - 最新登录ip + + 最新登录ip - - 最新登录地点 + + 最新登录地点 - - 最新登录时间 + + 最新登录时间 - 令牌数量 + 令牌数量 - 令牌信息集合 + 令牌信息集合 - 会话统计结果 + 会话统计结果 - 当前会话总数量 + 当前会话总数量 - 最大签发令牌数 + 最大签发令牌数 - 在线用户数 + 在线用户数 - BC端会话比例 + BC端会话比例 - 会话管理服务 + 会话管理服务 - 会话统计 + 会话统计 统计结果 - 强退会话 + 强退会话 用户ID - 强退token + 强退token token列表 - B端会话分页查询 + B端会话分页查询 查询参数 B端会话列表 - C端会话分页查询 + C端会话分页查询 查询参数 C端会话列表 - + @@ -2735,45 +2725,45 @@ - 获取redis中token信息列表 + 获取redis中token信息列表 - 获取token剩余时间信息 + 获取token剩余时间信息 token列表 登录类型 - 通知用户下线 + 通知用户下线 - + - + - + - + - + - + @@ -2784,164 +2774,164 @@ - + - 获取配置 + 获取配置 - 检查输入参数 + 检查输入参数 - 批量分页查询参数 + 批量分页查询参数 - 唯一编码 + 唯一编码 - 所属库 + 所属库 - + - 实体名 + 实体名 - + - 表名 + 表名 - 添加批量参数 + 添加批量参数 - 唯一编码 + 唯一编码 - 所属库 + 所属库 - 实体名 + 实体名 - 表名 + 表名 - + - 表描述 + 表描述 - 修改批量参数 + 修改批量参数 - Id + Id - 批量修改输入 + 批量修改输入 - 批量编辑Code + 批量编辑Code - Id列表 + Id列表 - 字段列表 + 字段列表 - 批量修改DTO + 批量修改DTO - 批量服务 + 批量服务 - 批量分页查询 + 批量分页查询 查询参数 分页结果 - 添加批量 + 添加批量 添加参数 - 删除批量 + 删除批量 删除参数 - 获取需要批量修改的表 + 获取需要批量修改的表 - 获取批量修改配置 + 获取批量修改配置 - 配置字段 + 配置字段 字段信息 - 批量配置字段列表 + 批量配置字段列表 唯一编码 列表 - 获取字典配置 + 获取字典配置 唯一编码 字段信息 @@ -2949,24 +2939,24 @@ - 同步字段 + 同步字段 id - 文件分页输出 + 文件分页输出 - 文件引擎 + 文件引擎 - + @@ -2989,21 +2979,21 @@ - 存储文件 + 存储文件 - 存储本地文件 + 存储本地文件 - 存储到minio + 存储到minio @@ -3011,40 +3001,40 @@ - 获取文件大小 + 获取文件大小 - 判断是否是图片 + 判断是否是图片 后缀名 - 文件管理服务 + 文件管理服务 - 删除文件 + 删除文件 ID列表 - 文件下载 + 文件下载 文件iD 文件流 - 获取FileStreamResult文件流 + 获取FileStreamResult文件流 路径 文件名 @@ -3053,7 +3043,7 @@ - 获取FileStreamResult文件流 + 获取FileStreamResult文件流 文件数组 文件名 @@ -3061,14 +3051,14 @@ - 文件分页查询 + 文件分页查询 查询参数 文件列表 - 上传文件到本地返回下载url + 上传文件到本地返回下载url 文件引擎 文件 @@ -3076,69 +3066,69 @@ - 站内信分类 + 站内信分类 - 发送参数 + 发送参数 - 主题 + 主题 - 分类 + 分类 - 接收人Id + 接收人Id - 消息详情 + 消息详情 - 接收信息类 + 接收信息类 - 接收人ID + 接收人ID - 接收人姓名 + 接收人姓名 - 是否已读 + 是否已读 - 站内信服务 + 站内信服务 - 删除消息 + 删除消息 id列表 - 删除我的消息 + 删除我的消息 @@ -3146,7 +3136,7 @@ - 获取消息详情 + 获取消息详情 消息ID 是否是自己 @@ -3154,7 +3144,7 @@ - 我的消息列表 + 我的消息列表 @@ -3162,175 +3152,175 @@ - 分页查询 + 分页查询 查询参数 - 发送站内信 + 发送站内信 站内信信息 - 获取未读消息数 + 获取未读消息数 - + - + - + - + - + - + - + - + - 导入预览输入 + 导入预览输入 - 文件导入通用输出 + 文件导入通用输出 - 是否有错误 + 是否有错误 - 动态表头 + 动态表头 - 数据 + 数据 - 动态表头 + 动态表头 - 标题 + 标题 - 数据源 + 数据源 - 宽度 + 宽度 - 超过宽度将自动省略 + 超过宽度将自动省略 - 是否是日期格式 + 是否是日期格式 - 批量导入结果输入 + 批量导入结果输入 - 数据 + 数据 - 导入结果输出 + 导入结果输出 - 是否成功 + 是否成功 - 总数 + 总数 - 导入数量 + 导入数量 - 错误数 + 错误数 - 数据 + 数据 - 导入基础输入 + 导入基础输入 - Id + Id - 是否有错误 + 是否有错误 - 错误详情 + 错误详情 - 导入服务 + 导入服务 - 导出数据 + 导出数据 数据 @@ -3339,7 +3329,7 @@ - 获取本地模板 + 获取本地模板 文件名 模板文件夹路径:默认wwwroot下的Template @@ -3347,7 +3337,7 @@ - 生成模板 + 生成模板 实体类 文件名 @@ -3355,7 +3345,7 @@ - 获取导入预览 + 获取导入预览 文件 @@ -3363,7 +3353,7 @@ - 获取预计导入结果 + 获取预计导入结果 数据 @@ -3372,15 +3362,15 @@ - 导入文件验证 + 导入文件验证 文件 - 文件最大体积(M) + 文件最大体积(M) 允许的格式 - 模板数据验证 + 模板数据验证 模板类实体 结果 @@ -3388,7 +3378,7 @@ - + @@ -3411,7 +3401,7 @@ - 获取文件流 + 获取文件流 @@ -3420,7 +3410,7 @@ - 获取文件流 + 获取文件流 @@ -3428,76 +3418,76 @@ - 获取文件名 + 获取文件名 - 获取本地模板路径 + 获取本地模板路径 - 日程列表查询参数 + 日程列表查询参数 - 日程日期 + 日程日期 - 日程日期 + 日程日期 - 日程内容 + 日程内容 - 日程时间 + 日程时间 - ID + ID - 首页服务 + 首页服务 - 添加日程 + 添加日程 日程参数 - 删除日程 + 删除日程 id列表 - 获取日程列表 + 获取日程列表 查询参数 日程列表 - + @@ -3511,153 +3501,153 @@ - + - + - + - + - + - 检查输入参数 + 检查输入参数 - 父ID + 父ID - 添加按钮参数 + 添加按钮参数 - 父ID + 父ID - 标题 + 标题 - 编码 + 编码 - ID + ID - 权限按钮服务 + 权限按钮服务 - 添加按钮 + 添加按钮 添加参数 - 批量添加 + 批量添加 - 删除按钮 + 删除按钮 删除参数 - 编辑按钮 + 编辑按钮 编辑参数 - 按钮分页查询 + 按钮分页查询 查询条件 按钮分页列表 - 菜单树查询参数 + 菜单树查询参数 - 模块 + 模块 - 关键字 + 关键字 - 添加菜单参数 + 添加菜单参数 - 父ID + 父ID - 标题 + 标题 - 菜单类型 + 菜单类型 - 模块 + 模块 - 路径 + 路径 - 图标 + 图标 - 特殊验证 + 特殊验证 @@ -3665,46 +3655,46 @@ - 编辑菜单输入参数 + 编辑菜单输入参数 - ID + ID - 改变模块输入参数 + 改变模块输入参数 - 模块ID + 模块ID - 菜单服务 + 菜单服务 - 添加菜单 + 添加菜单 添加参数 - 详情 + 详情 id 详细信息 - 构建菜单树形结构 + 构建菜单树形结构 菜单列表 父ID @@ -3712,345 +3702,345 @@ - 获取菜单树 + 获取菜单树 菜单树查询参数 菜单树列表 - 编辑菜单 + 编辑菜单 菜单编辑参数 - 删除菜单 + 删除菜单 删除菜单参数 - 改变菜单模块 + 改变菜单模块 改变菜单模块参数 - + - + - + - + - + - + - + - 检查输入参数 + 检查输入参数 - 模块分页输入 + 模块分页输入 - 添加模块输入 + 添加模块输入 - 编辑模块输入 + 编辑模块输入 - ID + ID - 模块管理服务 + 模块管理服务 - 添加模块 + 添加模块 添加参数 - 删除模块 + 删除模块 删除参数 - 编辑模块 + 编辑模块 编辑参数 - 分页查询 + 分页查询 分页参数 - + - + - + - + - 检查输入参数 + 检查输入参数 - 角色查询参数 + 角色查询参数 - 角色添加参数 + 角色添加参数 - 名称 + 名称 - 分类 + 分类 - 角色编辑参数 + 角色编辑参数 - Id + Id - 角色授权资源参数 + 角色授权资源参数 - 角色Id + 角色Id - 授权资源信息 + 授权资源信息 - 是否代码生成 + 是否代码生成 - 角色授权资源参数 + 角色授权资源参数 - 角色Id + 角色Id - 授权权限信息 + 授权权限信息 - 角色授权用户参数 + 角色授权用户参数 - Id + Id - 授权权限信息 + 授权权限信息 - 角色选择器参数 + 角色选择器参数 - 组织ID + 组织ID - 机构ID列表 + 机构ID列表 - 关键字 + 关键字 - 角色分类 + 角色分类 - 角色拥有的资源输出 + 角色拥有的资源输出 - Id + Id - 已授权资源信息 + 已授权资源信息 - 角色拥有权限输出 + 角色拥有权限输出 - 角色Id + 角色Id - 已授权资源信息 + 已授权资源信息 - 角色服务 + 角色服务 - 获取所有角色 + 获取所有角色 - 添加角色 + 添加角色 添加参数 - 删除角色 + 删除角色 删除参数 - 编辑角色 + 编辑角色 编辑参数 - 根据用户ID获取用户角色集合 + 根据用户ID获取用户角色集合 用户ID - 给角色授权权限 + 给角色授权权限 授权信息 - 给角色授权 + 给角色授权 授权参数 - 给角色授权用户 + 给角色授权用户 授权信息 - 获取角色拥有权限 + 获取角色拥有权限 角色ID - 角色拥有资源 + 角色拥有资源 角色id 资源类型 @@ -4058,41 +4048,41 @@ - 获取角色下的用户 + 获取角色下的用户 角色ID - 分页查询角色 + 分页查询角色 查询参数 - 刷新缓存 + 刷新缓存 - 获取角色授权权限选择器 + 获取角色授权权限选择器 角色ID - 角色选择器 + 角色选择器 - 根据id集合获取角色集合 + 根据id集合获取角色集合 @@ -4102,7 +4092,7 @@ - 获取所有 + 获取所有 @@ -4113,373 +4103,373 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - 检查输入参数 + 检查输入参数 - 单页输入参数 + 单页输入参数 - 菜单类型 + 菜单类型 - 单页输入参数 + 单页输入参数 - 标题 + 标题 - 菜单类型 + 菜单类型 - 路径 + 路径 - 图标 + 图标 - 单页修改参数 + 单页修改参数 - ID + ID - 单页服务 + 单页服务 - 添加单页 + 添加单页 添加参数 - 删除单页 + 删除单页 删除参数 - 编辑单页 + 编辑单页 编辑参数 - 分页查询 + 分页查询 - + - + - + - + - 检查输入参数 + 检查输入参数 - 操作日志分页输入 + 操作日志分页输入 - 操作日志日志删除输入 + 操作日志日志删除输入 - 操作日志周统计输出 + 操作日志周统计输出 - 日期 + 日期 - 名称 + 名称 - 数量 + 数量 - + - 操作日志统计 + 操作日志统计 - 操作日志服务 + 操作日志服务 - 根据分类删除操作日志 + 根据分类删除操作日志 分类名称 - 日志详情 + 日志详情 id 日志详情 - 操作日志分页查询 + 操作日志分页查询 查询参数 分页列表 - 操作日志周统计 + 操作日志周统计 天数 统计结果 - 操作日志总览 + 操作日志总览 异常日志和操作日志的数量 - + - 操作日志中文名称 + 操作日志中文名称 - 异常日志中文名称 + 异常日志中文名称 - 分表最多查近多少年的数据 + 分表最多查近多少年的数据 - + - + - + - + - + - 访问日志分页输入 + 访问日志分页输入 - 分类 + 分类 - 账号 + 账号 - 访问日志删除输入 + 访问日志删除输入 - 分类 + 分类 - 周统计输出 + 周统计输出 - 日期 + 日期 - 登录次数 + 登录次数 - 登出次数 + 登出次数 - 访问日志总数输出 + 访问日志总数输出 - 类型 + 类型 - 数量 + 数量 - 访问日志服务 + 访问日志服务 - 根据分类删除 + 根据分类删除 分类名称 - 访问日志分页查询 + 访问日志分页查询 查询参数 日志列表 - 根统计N天来登录和登出数量 + 根统计N天来登录和登出数量 天使 统计信息 - 统计登录登出总览 + 统计登录登出总览 登录和登出的数量 - + - 分表最多查近多少年的数据 + 分表最多查近多少年的数据 - + - + - + - + @@ -4507,98 +4497,98 @@ - 刷新缓存 + 刷新缓存 分类 - 检查输入参数 + 检查输入参数 - 配置分页参数 + 配置分页参数 - 添加配置参数 + 添加配置参数 - 配置键 + 配置键 - 配置值 + 配置值 - 编辑配置参数 + 编辑配置参数 - ID + ID - 删除配置参数 + 删除配置参数 - 批量修改输入参数 + 批量修改输入参数 - 分类 + 分类 - 系统配置服务 + 系统配置服务 - 新增配置 + 新增配置 新增参数 - 删除配置 + 删除配置 删除 - 修改配置 + 修改配置 修改参数 - 批量编辑 + 批量编辑 配置列表 - 根据分类和配置键获配置 + 根据分类和配置键获配置 分类 配置键 @@ -4606,70 +4596,70 @@ - 根据分类获取配置列表 + 根据分类获取配置列表 分类名称 配置列表 - 分页查询其他配置 + 分页查询其他配置 查询参数 其他配置列表 - + - + - + - + - + - 获取全部 + 获取全部 - + - + - + - + - + - 刷新缓存 + 刷新缓存 - 检查输入参数 + 检查输入参数 - + - 获取字典所有下级 + 获取字典所有下级 字典列表 父ID @@ -4677,89 +4667,89 @@ - 字典查询参数 + 字典查询参数 - 字典树参数 + 字典树参数 - 字典分类 + 字典分类 - 字典查询参数 + 字典查询参数 - - 父id + + 父id - - 分类 + + 分类 - 添加字典参数 + 添加字典参数 - 父ID + 父ID - 字典名称 + 字典名称 - 字典值 + 字典值 - 状态 + 状态 - 编辑字典参数 + 编辑字典参数 - ID + ID - 删除字典参数 + 删除字典参数 - 字典服务 + 字典服务 - 添加字典 + 添加字典 输入参数 - 构建字典树形结构 + 构建字典树形结构 字典列表 父ID @@ -4767,34 +4757,34 @@ - 删除字典 + 删除字典 删除参数 - 编辑字典 + 编辑字典 输入参数 - 获取字典 + 获取字典 字典 - 获取所有 + 获取所有 字典列表 - 根据字典DictValue获取字典值列表 + 根据字典DictValue获取字典值列表 字典值 字典列表 @@ -4802,126 +4792,126 @@ - 根据字典DictValue列表获取对应字典值列表 + 根据字典DictValue列表获取对应字典值列表 字典值列表 - 字典分页查询 + 字典分页查询 查询参数 字典分页列表 - 获取字典树形结构 + 获取字典树形结构 查询参数 字典树形结构 - 组织分页查询参数 + 组织分页查询参数 - 父ID + 父ID - 机构列表 + 机构列表 - 组织添加参数 + 组织添加参数 - 组织修改参数 + 组织修改参数 - Id + Id - 组织复制参数 + 组织复制参数 - 目标ID + 目标ID - 组织Id列表 + 组织Id列表 - 是否包含下级 + 是否包含下级 - 组织导入 + 组织导入 - - 名称 + + 名称 - - 上级组织 + + 上级组织 - - 分类 + + 分类 - - 排序码 + + 排序码 - - 主管账号 + + 主管账号 - 组织树查询参数 - 懒加载用 + 组织树查询参数 + 懒加载用 - 父Id + 父Id - 组织架构服务 + 组织架构服务 - 检查组织是否存在 + 检查组织是否存在 - 组织列表 + 组织列表 组织名称 父Id 组织Id @@ -4929,14 +4919,14 @@ - 组织详情 + 组织详情 id参数 组织信息 - 根据组织ID获取 下级 + 根据组织ID获取 下级 组织ID 是否包含自己 @@ -4944,13 +4934,13 @@ - 获取所有组织 + 获取所有组织 组织列表 - 获取机构及下级ID列表 + 获取机构及下级ID列表 @@ -4958,7 +4948,7 @@ - 根据组织Id递归获取上级 + 根据组织Id递归获取上级 组织列表 组织Id @@ -4967,28 +4957,28 @@ - 获取组织信息 + 获取组织信息 组织id 组织信息 - 组织分页查询 + 组织分页查询 查询参数 分页信息 - 根据ID列表获取组织列表 + 根据ID列表获取组织列表 - 添加组织 + 添加组织 添加参数 名称 @@ -4996,14 +4986,14 @@ - 复制组织 + 复制组织 机构复制参数 - 编辑组织 + 编辑组织 编辑参数 名称 @@ -5011,15 +5001,15 @@ - 删除组织 + 删除组织 删除参数 名称 - + - 构建组织树形结构 + 构建组织树形结构 组织列表 父ID @@ -5027,13 +5017,13 @@ - 刷新缓存 + 刷新缓存 - 获取组织树型结构 + 获取组织树型结构 机构ID列表 组织选择器(懒加载用) @@ -5043,87 +5033,87 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - 检查输入参数 + 检查输入参数 - 根据组织Id列表获取所有父级组织 + 根据组织Id列表获取所有父级组织 - + - 获取组织所有下级 + 获取组织所有下级 - + - 获取组织下级(懒加载) + 获取组织下级(懒加载) - + - 赋值组织的所有下级 + 赋值组织的所有下级 组织列表 父Id @@ -5132,81 +5122,81 @@ - 重新生成组织实体 + 重新生成组织实体 - 获取全称 + 获取全称 - 组织列表 + 组织列表 父Id 组织名称 - 职位分页查询 + 职位分页查询 - 组织ID + 组织ID - 职位列表 + 职位列表 - 分类 + 分类 - 职位新增参数 + 职位新增参数 - 组织ID + 组织ID - 名称 + 名称 - 分类 + 分类 - 机构编辑参数 + 机构编辑参数 - Id + Id - 机构选择器参数 + 机构选择器参数 - 职位服务 + 职位服务 - 添加职位 + 添加职位 添加参数 名称 @@ -5214,7 +5204,7 @@ - 删除职位 + 删除职位 id列表 名称 @@ -5222,7 +5212,7 @@ - 编辑职位 + 编辑职位 编辑参数 名称 @@ -5230,560 +5220,560 @@ - 获取职位列表 + 获取职位列表 职位列表 - 获取职位信息 + 获取职位信息 职位ID 职位信息 - 职位分页查询 + 职位分页查询 查询参数 分页列表 - 职位选择器 + 职位选择器 查询参数 - 刷新缓存 + 刷新缓存 - 根据id集合获取职位集合 + 根据id集合获取职位集合 - + - 获取全部 + 获取全部 - + - + - + - + - + - + - 检查输入参数 + 检查输入参数 名称 - 用户选择器参数 + 用户选择器参数 - 组织ID + 组织ID - 机构ID列表 + 机构ID列表 - 关键字 + 关键字 - 用户分页查询参数 + 用户分页查询参数 - 所属组织 + 所属组织 - 动态查询条件 + 动态查询条件 - 用户状态 + 用户状态 - 添加用户参数 + 添加用户参数 - 账号 + 账号 - 姓名 + 姓名 - 组织id + 组织id - 职位id + 职位id - 编辑用户参数 + 编辑用户参数 - Id + Id - 用户授权角色参数 + 用户授权角色参数 - Id + Id - 授权权限信息 + 授权权限信息 - 默认数据权限 + 默认数据权限 - 用户导入 + 用户导入 - 账号 + 账号 - - 姓名 + + 姓名 - - 性别 + + 性别 - - 昵称 + + 昵称 - - 手机 - 这里使用了SM4自动加密解密 + + 手机 + 这里使用了SM4自动加密解密 - - 邮箱 + + 邮箱 - 所属机构 + 所属机构 - 职位 + 职位 - - 出生日期 + + 出生日期 - - 民族 + + 民族 - - 籍贯 + + 籍贯 - - 家庭住址 + + 家庭住址 - - 通信地址 + + 通信地址 - - 证件类型 + + 证件类型 - - 证件号码 + + 证件号码 - - 文化程度 + + 文化程度 - - 政治面貌 + + 政治面貌 - - 毕业院校 + + 毕业院校 - - 学历 + + 学历 - - 学制 + + 学制 - - 学位 + + 学位 - - 家庭电话 + + 家庭电话 - - 办公电话 + + 办公电话 - - 紧急联系人 + + 紧急联系人 - - 紧急联系人电话 + + 紧急联系人电话 - - 紧急联系人地址 + + 紧急联系人地址 - - 员工编号 + + 员工编号 - - 入职日期 + + 入职日期 - 部门Id + 部门Id - 职位Id + 职位Id - 选择用户输出参数 + 选择用户输出参数 - Id + Id - 组织ID + 组织ID - 账号 + 账号 - 姓名 + 姓名 - - 性别 + + 性别 - 组织名称 + 组织名称 - 职位名称 + 职位名称 - 头像 + 头像 - 用户信息输出 + 用户信息输出 - 用户信息 + 用户信息 - - 账号 + + 账号 - - 姓名 + + 姓名 - - 昵称 + + 昵称 - - 性别 + + 性别 - - 手机 - 这里使用了SM4自动加密解密 + + 手机 + 这里使用了SM4自动加密解密 - - 邮箱 + + 邮箱 - 所属机构 + 所属机构 - 职位 + 职位 - - 出生日期 + + 出生日期 - - 民族 + + 民族 - - 籍贯 + + 籍贯 - - 家庭住址 + + 家庭住址 - - 通信地址 + + 通信地址 - - 证件类型 + + 证件类型 - - 证件号码 + + 证件号码 - - 文化程度 + + 文化程度 - - 政治面貌 + + 政治面貌 - - 毕业院校 + + 毕业院校 - - 学历 + + 学历 - - 学制 + + 学制 - - 学位 + + 学位 - - 家庭电话 + + 家庭电话 - - 办公电话 + + 办公电话 - - 紧急联系人 + + 紧急联系人 - - 紧急联系人电话 + + 紧急联系人电话 - - 紧急联系人地址 + + 紧急联系人地址 - - 员工编号 + + 员工编号 - - 入职日期 + + 入职日期 - - 职级 + + 职级 - 用户服务 + 用户服务 - 根据用户ID获取按钮ID集合 + 根据用户ID获取按钮ID集合 - 根据账号获取用户信息 + 根据账号获取用户信息 用户名 用户信息 - 根据用户ID和机构ID获取角色权限 + 根据用户ID和机构ID获取角色权限 @@ -5791,231 +5781,231 @@ - 根据手机号获取用户账号 + 根据手机号获取用户账号 手机号 用户账号名称 - 用户选择器 + 用户选择器 查询参数 - 用户分页查询 + 用户分页查询 查询参数 用户分页列表 - 用户列表 + 用户列表 查询 - 根据用户Id获取用户信息 + 根据用户Id获取用户信息 用户ID 用户信息 - 根据用户Id获取用户信息 + 根据用户Id获取用户信息 用户ID 转换的实体 - - 根据用户账号获取用户ID - - 用户账号 - + + 根据用户账号获取用户ID + + 用户账号 + - 根据用户手机获取用户信息 + 根据用户手机获取用户信息 手机号 用户信息 - 获取用户拥有角色 + 获取用户拥有角色 用户ID - - 获取当前API用户的数据范围 - null:代表拥有全部数据权限 - [xx,xx]:代表拥有部分机构的权限 - []:代表仅自己权限 - - 机构列表 + + 获取当前API用户的数据范围 + null:代表拥有全部数据权限 + [xx,xx]:代表拥有部分机构的权限 + []:代表仅自己权限 + + 机构列表 - 获取用户拥有的资源 + 获取用户拥有的资源 用户id 资源列表 - 获取用户拥有的权限 + 获取用户拥有的权限 用户id 权限列表 - 用户权限树选择 + 用户权限树选择 用户id 权限列表 - 根据id集合获取用户集合 + 根据id集合获取用户集合 Id集合 - 用户详情 + 用户详情 - 添加用户 + 添加用户 添加参数 - 编辑 + 编辑 编辑参数 - 启用用户 + 启用用户 用户Id - 禁用用户 + 禁用用户 用户Id - 重置密码 + 重置密码 用户Id - 给用户授权角色 + 给用户授权角色 授权参数 - 给用户授权资源 + 给用户授权资源 授权参数 - 给用户授权权限 + 给用户授权权限 - 设置用户默认值 + 设置用户默认值 - 批量编辑 + 批量编辑 批量编辑信息 - 删除用户 + 删除用户 Id列表 - 从redis中删除用户信息 + 从redis中删除用户信息 用户ID列表 - 从redis中删除用户信息 + 从redis中删除用户信息 用户ID - 导出用户 + 导出用户 - 导入模板下载 + 导入模板下载 模板 - 导入预览 + 导入预览 预览参数 预览结果 - 用户导入 + 用户导入 - 检查导入数据 + 检查导入数据 数据 是否初始化错误 @@ -6023,7 +6013,7 @@ - + @@ -6066,19 +6056,19 @@ - + - + - + - + - + @@ -6099,22 +6089,22 @@ - + - + - + - + - + @@ -6136,59 +6126,59 @@ - 获取默认密码 + 获取默认密码 - 检查输入参数 + 检查输入参数 - 检查是否为自己 + 检查是否为自己 操作名称 - 根据日期计算年龄 + 根据日期计算年龄 - 获取Sqlsugar的ISugarQueryable + 获取SqlSugar的ISugarQueryable - 数据库获取用户信息 + 数据库获取用户信息 用户ID - 关系服务 + 关系服务 - 根据分类获取关系表信息 + 根据分类获取关系表信息 分类名称 关系表 - 通过对象ID和分类获取关系列表 + 通过对象ID和分类获取关系列表 对象ID 分类 @@ -6196,7 +6186,7 @@ - 通过对象ID列表和分类获取关系列表 + 通过对象ID列表和分类获取关系列表 对象ID 分类 @@ -6204,7 +6194,7 @@ - 通过目标ID和分类获取关系列表 + 通过目标ID和分类获取关系列表 目标ID 分类 @@ -6212,7 +6202,7 @@ - 通过目标ID列表和分类获取关系列表 + 通过目标ID列表和分类获取关系列表 @@ -6220,21 +6210,21 @@ - 获取关系表用户工作台 + 获取关系表用户工作台 用户ID 关系表数据 - 更新缓存 + 更新缓存 分类 - 保存关系 + 保存关系 分类 对象ID @@ -6246,7 +6236,7 @@ - 批量保存关系 + 批量保存关系 分类 对象ID @@ -6257,150 +6247,150 @@ - 根据角色ID获取模块ID列表 + 根据角色ID获取模块ID列表 角色ID列表 模块ID列表 - + - + - + - + - + - + - + - + - + - + - + - 角色授权资源树输出 + 角色授权资源树输出 - 模块id + 模块id - 模块名称 + 模块名称 - 模块图标 + 模块图标 - 模块下菜单集合 + 模块下菜单集合 - 授权菜单类 + 授权菜单类 - 菜单id + 菜单id - 父id + 父id - 父名称 + 父名称 - 模块名称 + 模块名称 - 模块id + 模块id - 菜单下按钮集合 + 菜单下按钮集合 - 按钮id + 按钮id - 标题 + 标题 - 接口描述 + 接口描述 - 路由名称 + 路由名称 - 权限名称 + 权限名称 - 资源服务 + 资源服务 - 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 + 获取所有的菜单和模块以及单页面列表,并按分类和排序码排序 所有的菜单和模块以及单页面列表 - 根据模块ID获取菜单和单页面列表 + 根据模块ID获取菜单和单页面列表 - 根据资源ID获取所有下级资源 + 根据资源ID获取所有下级资源 资源ID 是否包含自己 @@ -6408,7 +6398,7 @@ - 根据资源ID获取所有下级资源 + 根据资源ID获取所有下级资源 资源列表 资源ID @@ -6417,7 +6407,7 @@ - 获取ID获取Code列表 + 获取ID获取Code列表 id列表 分类 @@ -6425,21 +6415,21 @@ - 获取资源列表 + 获取资源列表 - 资源分类列表 + 资源分类列表 - 根据分类获取资源列表 + 根据分类获取资源列表 分类名称 资源列表 - 根据菜单ID获取菜单 + 根据菜单ID获取菜单 id列表 分类 @@ -6447,21 +6437,21 @@ - 获取权限授权树 + 获取权限授权树 路由列表 - 刷新缓存 + 刷新缓存 分类名称 - 角色授权资源树 + 角色授权资源树 @@ -6469,7 +6459,7 @@ - + @@ -6484,34 +6474,34 @@ - + - + - + - + - + - + - 获取路由地址名称 + 获取路由地址名称 控制器地址 路由名称 - + - 获取资源所有下级 + 获取资源所有下级 资源列表 父ID @@ -6519,7 +6509,7 @@ - 获取上级 + 获取上级 @@ -6527,14 +6517,14 @@ - 获取授权菜单 + 获取授权菜单 模块ID - 获取授权菜单类菜单名称 + 获取授权菜单类菜单名称 菜单列表 当前菜单 @@ -6542,193 +6532,193 @@ - 编辑个人信息参数 + 编辑个人信息参数 - 姓名 + 姓名 - 签名图片 + 签名图片 - 更新个人工作台 + 更新个人工作台 - 工作台数据 + 工作台数据 - 更新个人密码 + 更新个人密码 - 密码 + 密码 - 新密码 + 新密码 - + - 设置默认模块输入 + 设置默认模块输入 - + - 模块Id + 模块Id - + - 是否默认 + 是否默认 - 我的机构数样式 + 我的机构数样式 - Id + Id - 名称 + 名称 - 父ID + 父ID - 子节点 + 子节点 - 样式 + 样式 - 我的机构样式 + 我的机构样式 - 背景色 + 背景色 - 字体颜色 + 字体颜色 - 个人信息中心服务 + 个人信息中心服务 - 获取登录用户菜单 + 获取登录用户菜单 - 获取个人工作台 + 获取个人工作台 - 获取组织架构 + 获取组织架构 组织架构 - 获取登录用户的站内信分页 + 获取登录用户的站内信分页 查询参数 站内信列表 - 读取登录用户站内信详情 + 读取登录用户站内信详情 消息ID 消息详情 - 获取未读消息数量 + 获取未读消息数量 未读消息数量 - 更新个人信息 + 更新个人信息 信息参数 - 更新签名 + 更新签名 签名图片 - 编辑个人工作台 + 编辑个人工作台 工作台字符串 - 删除我的消息 + 删除我的消息 消息Id - 修改个人密码 + 修改个人密码 密码信息 - 修改头像 + 修改头像 头像文件 - + - 修改默认模块 + 修改默认模块 默认模块输入参数 @@ -6737,47 +6727,47 @@ - + - + - + - + - + - + - + - + - + - + - + - + - - + + - 获取父菜单集合 + 获取父菜单集合 所有菜单列表 我的菜单列表 @@ -6785,13 +6775,13 @@ - 构建Meta + 构建Meta 我的菜单集合 - + - 构建机构树 + 构建机构树 机构列表 父ID @@ -6800,65 +6790,65 @@ - AppStartup启动类 + AppStartup启动类 - ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 - 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! - 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 + ConfigureServices中不能解析服务,比如App.GetService(),尤其是不能在ConfigureServices中获取诸如缓存等数据进行初始化,应该在Configure中进行 + 服务都还没初始化完成,会导致内存中存在多份 IOC 容器!! + 正确应该在 Configure 中,这个时候服务(IServiceCollection 已经完成 BuildServiceProvider() 操作了 - 当前登录用户信息 + 当前登录用户信息 - 当前用户Id + 当前用户Id - 当前用户账号 + 当前用户账号 - 当前用户昵称 + 当前用户昵称 - 是否超级管理员 + 是否超级管理员 - 机构ID + 机构ID - C端用户关系 + C端用户关系 - - 对象ID + + 对象ID - - 目标ID + + 目标ID - - 分类 + + 分类 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs index 8bbcdf1..6a64a09 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/AuthComponent.cs @@ -30,7 +30,7 @@ public sealed class AuthComponent : IServiceComponent // If the request is for our hub... var path = context.HttpContext.Request.Path; if (!string.IsNullOrEmpty(accessToken) && - (path.StartsWithSegments("/hubs"))) + path.StartsWithSegments("/hubs")) { // Read the token out of the query string context.Token = accessToken; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs index bc3551d..ef49a7e 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/LoggingMonitorComponent.cs @@ -31,7 +31,7 @@ public sealed class LoggingMonitorComponent : IServiceComponent //获取客户端信息 var client = Parser.GetDefault().Parse(userAgent); // 获取控制器/操作描述器 - var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; + // var controllerActionDescriptor = context.ActionDescriptor as ControllerActionDescriptor; //操作名称默认是控制器名加方法名,自定义操作名称要在action上加Description特性 //var option = $"{controllerActionDescriptor.ControllerName}/{controllerActionDescriptor.ActionName}"; ////获取特性 @@ -47,7 +47,7 @@ public sealed class LoggingMonitorComponent : IServiceComponent //日志写入数据库配置 services.AddDatabaseLogging(options => { - options.WriteFilter = (logMsg) => + options.WriteFilter = logMsg => { return logMsg.LogName == "System.Logging.LoggingMonitor";//只写入LoggingMonitor日志 }; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs deleted file mode 100644 index 595b897..0000000 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Components/PluginSettingComponent.cs +++ /dev/null @@ -1,45 +0,0 @@ -// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: -// 1.请不要删除和修改根目录下的LICENSE文件。 -// 2.请不要删除和修改SimpleAdmin源码头部的版权声明。 -// 3.分发源码时候,请注明软件出处 https://gitee.com/zxzyjs/SimpleAdmin -// 4.基于本软件的作品。,只能使用 SimpleAdmin 作为后台服务,除外情况不可商用且不允许二次分发或开源。 -// 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 -// 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 - -using SimpleAdmin.Plugin.Mqtt; -using SimpleAdmin.Plugin.SignalR; - -namespace SimpleAdmin.Web.Core; - -/// -/// 插件设置组件 -/// 模拟 ConfigureService -/// -public sealed class PluginSettingComponent : IServiceComponent -{ - public void Load(IServiceCollection services, ComponentContext componentContext) - { - //插件设置配置转实体 - services.AddConfigurableOptions(); - //获取插件配置 - var pluginSettings = App.GetConfig("PluginSettings"); - if (pluginSettings.UseSignalR)//如果使用signalr则启用signalr插件 - services.AddComponent(); - if (pluginSettings.UseMqtt)//如果使用mqtt则启用mqtt插件 - services.AddComponent(); - } -} - -/// -/// 插件设置组件 -/// 模拟 Configure -/// -public sealed class PluginSettingsApplicationComponent : IApplicationComponent -{ - public void Load(IApplicationBuilder app, IWebHostEnvironment env, ComponentContext componentContext) - { - //通过 App.GetOptions 获取选项 - var pluginSettings = App.GetOptions(); - if (pluginSettings.UseMqtt) app.UseComponent(env); - } -} \ No newline at end of file diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs index 80be955..f95ab8d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Auth/AuthBController.cs @@ -76,7 +76,7 @@ public class AuthBController : IDynamicApiController /// [HttpPost("logout")] [DisplayName(EventSubscriberConst.LOGIN_OUT_B)] - public async Task LoginOut([FromBody] LoginOutIput input) + public async Task LoginOut([FromBody] LoginOutInput input) { await _authService.LoginOut(input.Token, LoginClientTypeEnum.B); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs index 4f9ed6f..7e71ddb 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Limit/MenuController.cs @@ -42,7 +42,6 @@ public class MenuController : BaseController public async Task Tree([FromQuery] MenuTreeInput input) { return await _menuService.Tree(input); - ; } /// diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs index 40524d0..533f7e0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/Organization/OrgController.cs @@ -76,7 +76,6 @@ public class OrgController : BaseController public async Task Detail([FromQuery] BaseIdInput input) { return await _sysOrgService.Detail(input); - ; } #endregion Get @@ -132,4 +131,4 @@ public class OrgController : BaseController } #endregion Post -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs index 2b1f801..ed94c3d 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Controllers/System/System/UserCenterController.cs @@ -211,8 +211,8 @@ public class UserCenterController : IDynamicApiController /// /// [HttpPost("setDefaultModule")] - public async Task SetDeafultModule([FromBody] SetDeafultModuleInput input) + public async Task SetDefaultModule([FromBody] SetDefaultModuleInput input) { - await _userCenterService.SetDeafultModule(input); + await _userCenterService.SetDefaultModule(input); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs index ddd24de..2f12b9f 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyActionFilter.cs @@ -30,15 +30,15 @@ public class MyActionFilter : IAsyncActionFilter var httpContext = context.HttpContext; var httpRequest = httpContext.Request; //拦截白名单 - var whiteAction = new string[] { "loginOut", "auth", "preview" }; + var whiteAction = new[] { "loginOut", "auth", "preview" }; //只拦截post方法并且不是 if (httpRequest.Method == "POST" && !whiteAction.Contains(actionDescriptor.ActionName)) { // 是否匿名访问 - var allowAnonymouse = context.Filters.Any(u => u is IAllowAnonymousFilter) - || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true) - || method.IsDefined(typeof(AllowAnonymousAttribute), true); - if (!allowAnonymouse) + var allowAnonymous = context.Filters.Any(u => u is IAllowAnonymousFilter) + || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true) + || method.IsDefined(typeof(AllowAnonymousAttribute), true); + if (!allowAnonymous) { //如果不是匿名访问,抛出 throw Oops.Bah("演示环境,禁止操作"); @@ -46,4 +46,4 @@ public class MyActionFilter : IAsyncActionFilter } await next(); } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs index 3d7e70c..c4b50d0 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Filter/MyAuthorizationFilter.cs @@ -24,12 +24,12 @@ public class MyAuthorizationFilter : IAsyncAuthorizationFilter // 获取 Action 类型 var methodType = actionDescriptor.MethodInfo; // 是否匿名访问 - var allowAnonymouse = context.Filters.Any(u => u is IAllowAnonymousFilter) - || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true) - || methodType.IsDefined(typeof(AllowAnonymousAttribute), true); + var allowAnonymous = context.Filters.Any(u => u is IAllowAnonymousFilter) + || controllerType.IsDefined(typeof(AllowAnonymousAttribute), true) + || methodType.IsDefined(typeof(AllowAnonymousAttribute), true); // 不是匿名才处理权限检查 - if (!allowAnonymouse) + if (!allowAnonymous) { // 获取 HttpContext 和 HttpRequest 对象 var httpContext = context.HttpContext; @@ -39,6 +39,6 @@ public class MyAuthorizationFilter : IAsyncAuthorizationFilter context.Result = new UnauthorizedResult(); } } - else await Task.CompletedTask; // 否则直接跳过处理 + else await Task.CompletedTask;// 否则直接跳过处理 } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs index 6a12568..72383ec 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/GlobalUsing.cs @@ -21,7 +21,6 @@ global using Microsoft.Extensions.DependencyInjection; global using SimpleAdmin.Application; global using SimpleAdmin.Cache; global using SimpleAdmin.Core; -global using SimpleAdmin.Plugin.Core; global using SimpleAdmin.SqlSugar; global using SimpleAdmin.System; global using System; diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs index f07247d..22a54ee 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/JwtHandler.cs @@ -75,7 +75,7 @@ public class JwtHandler : AppAuthorizeHandler "返回新的刷新token".LogDebug(); tokenInfo.Token = accessToken;//新的token tokenInfo.TokenTimeout = DateTime.Now.AddMinutes(expire);//新的过期时间 - simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//更新tokne信息到redis + simpleCacheService.HashAdd(CacheConst.CACHE_USER_TOKEN, userId, tokenInfos);//更新token信息到redis } } else @@ -110,12 +110,12 @@ public class JwtHandler : AppAuthorizeHandler //超级管理员都能访问 if (UserManager.SuperAdmin) return true; // 获取超级管理员特性 - var isSpuerAdmin = httpContext.GetMetadata(); - if (isSpuerAdmin != null)//如果是超级管理员才能访问的接口 + var isSuperAdmin = httpContext.GetMetadata(); + if (isSuperAdmin != null)//如果是超级管理员才能访问的接口 { //获取忽略超级管理员特性 - var ignoreSpuerAdmin = httpContext.GetMetadata(); - if (ignoreSpuerAdmin == null && !UserManager.SuperAdmin)//如果只能超级管理员访问并且用户不是超级管理员 + var ignoreSuperAdmin = httpContext.GetMetadata(); + if (ignoreSuperAdmin == null && !UserManager.SuperAdmin)//如果只能超级管理员访问并且用户不是超级管理员 return false;//直接没权限 } @@ -131,15 +131,8 @@ public class JwtHandler : AppAuthorizeHandler var routeName = httpContext.Request.Path.Value; //获取用户信息 var userInfo = await App.GetService().GetUserById(UserManager.UserId); - if (userInfo != null) - { - if (!userInfo.PermissionCodeList.Contains(routeName))//如果当前路由信息不包含在角色授权路由列表中则认证失败 - return false; - } - else - { - return false;//没有用户信息则返回认证失败 - } + if (!userInfo.PermissionCodeList.Contains(routeName))//如果当前路由信息不包含在角色授权路由列表中则认证失败 + return false; } } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs index 1082572..67f1e07 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Handlers/LogExceptionHandler.cs @@ -6,7 +6,6 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -using DnsClient.Internal; using Furion.DependencyInjection; using Furion.FriendlyException; using Microsoft.Extensions.Logging; @@ -22,7 +21,7 @@ public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton public LogExceptionHandler(ILogger logger) { - this._logger = logger; + _logger = logger; } public async Task OnExceptionAsync(ExceptionContext context) @@ -37,4 +36,4 @@ public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton } await Task.CompletedTask; } -} \ No newline at end of file +} diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs index b2f8e8a..e03f513 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/DatabaseLoggingWriter.cs @@ -85,8 +85,8 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter private async Task CreateVisitLog(string operation, LoggingMonitorJson loggingMonitor, ClientInfo clientInfo) { - var name = "";//用户姓名 - var opAccount = "";//用户账号 + string name;//用户姓名 + string opAccount;//用户账号 if (operation == EventSubscriberConst.LOGIN_B) { //如果是登录,用户信息就从返回值里拿 @@ -202,7 +202,7 @@ public class DatabaseLoggingWriter : IDatabaseLoggingWriter try { var ipInfo = IpTool.Search(ip);//解析IP信息 - var loginAddressList = new List() + var loginAddressList = new List { ipInfo.Country, ipInfo.Province, diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs index bdd4699..f400a2b 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Logging/LoggingMonitorJson.cs @@ -149,9 +149,9 @@ public class ReturnInformation /// /// 返回值 /// - public RetrunValue Value { get; set; } + public ReturnValue Value { get; set; } - public class RetrunValue + public class ReturnValue { /// /// 返回码 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj index 0ca7dc8..1f15de7 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.csproj @@ -13,8 +13,6 @@ - - diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index 25e5915..6c27741 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -14,18 +14,6 @@ LoggingMonitor操作日志写入数据库插件 - - - 插件设置组件 - 模拟 ConfigureService - - - - - 插件设置组件 - 模拟 Configure - - Web设置组件 diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs b/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs index 3b705da..54b1dee 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Startup.cs @@ -23,8 +23,6 @@ public class Startup : AppStartup services.AddComponent(); //启动Web设置ConfigureServices组件 services.AddComponent(); - //启动插件设置ConfigureServices组件 - services.AddComponent(); //gip压缩 services.AddComponent(); //定时任务 @@ -52,9 +50,7 @@ public class Startup : AppStartup public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //启动Web设置Configure组件 - //app.UseComponent(env); - //启动插件设置Configure组件 - app.UseComponent(env); + app.UseComponent(env); if (env.IsDevelopment()) { @@ -71,25 +67,22 @@ public class Startup : AppStartup // 添加状态码拦截中间件 app.UseUnifyResultStatusCodes(); - app.UseStaticFiles(new StaticFileOptions() + //静态文件访问配置 + app.UseStaticFiles(new StaticFileOptions { ServeUnknownFileTypes = true, FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "wwwroot")),//wwwroot相当于真实目录 - OnPrepareResponse = (c) => + OnPrepareResponse = c => { c.Context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); - c.Context.Response.Headers.Append("Cache-Control", $"public, max-age=604800"); + c.Context.Response.Headers.Append("Cache-Control", "public, max-age=604800"); }, RequestPath = new PathString("/images")//src相当于别名,为了安全 }); app.UseRouting(); - //跨域设置 - // app.UseCorsAccessor(builder => - // builder.SetIsOriginAllowed(_ => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials() - //); app.UseCorsAccessor(); app.UseAuthentication(); @@ -97,23 +90,9 @@ public class Startup : AppStartup app.UseInject(string.Empty); - ////定时任务Dashboard - //app.UseScheduleUI(options => - //{ - // options.DisableOnProduction = true;//配置生产环境关闭 - //}); app.UseForwardedHeaders();//Nginx代理的话获取真实IP app.UseEndpoints(endpoints => { - // 获取插件选项 - var pluginsOptions = App.GetOptions(); - //如果通知类型是Signalr - if (pluginsOptions.UseSignalR) - { - // 注册集线器 - endpoints.MapHubs(); - } - endpoints.MapControllers(); }); } diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Development.json b/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Development.json index c69d804..3948bcf 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Development.json +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Development.json @@ -3,12 +3,6 @@ "WebSettings": { "EnvPoc": false, //是否演示环境 }, - //插件设置 - "PluginSettings": { - "UseSignalR": true, // 是否开启Signalr - "UseMqtt": false, // 是否开启mqtt - "NoticeComponent": "SignalR" //默认通知组件类型SignalR/Mqtt - }, //jwt设置 "JWTSettings": { "ValidateIssuerSigningKey": true, // 是否验证密钥,bool 类型,默认true diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Production.json b/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Production.json index 4484a69..3948bcf 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Production.json +++ b/api/SimpleAdmin/SimpleAdmin.Web.Core/Web.Production.json @@ -3,12 +3,6 @@ "WebSettings": { "EnvPoc": false, //是否演示环境 }, - //插件设置 - "PluginSettings": { - "UseSignalR": true, // 是否开启Signalr - "UseMqtt": false, // 是否开启mqtt - "NoticeComponent": "SignalR" //默认通知类型SignalR/Mqtt - }, //jwt设置 "JWTSettings": { "ValidateIssuerSigningKey": true, // 是否验证密钥,bool 类型,默认true diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs b/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs index 2044f75..cbea2ed 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/Program.cs @@ -6,9 +6,9 @@ // 5.请不得将本软件应用于危害国家安全、荣誉和利益的行为,不能以任何形式用于非法为目的的行为不要删除和修改作者声明。 // 6.任何基于本软件而产生的一切法律纠纷和责任,均于我司无关。 -Console.WriteLine(@"源码地址: https://gitee.com/zxzyjs/SimpleAdmin"); -Console.WriteLine(@"演示地址: http://153.101.199.83:12802/login"); -Console.WriteLine(@"QQ:531035580"); +Console.WriteLine("源码地址: https://gitee.com/zxzyjs/SimpleAdmin"); +Console.WriteLine("演示地址: http://153.101.199.83:12802/login"); +Console.WriteLine("QQ:531035580"); Console.WriteLine("拒绝屎山,只玩真实,让.NET 开发更简单!"); Serve.Run(RunOptions.Default.ConfigureBuilder(builder => { diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj index a0bdaca..fbbe0af 100644 --- a/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj +++ b/api/SimpleAdmin/SimpleAdmin.Web.Entry/SimpleAdmin.Web.Entry.csproj @@ -15,6 +15,9 @@ + + + diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper1.jpeg b/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper1.jpeg deleted file mode 100644 index 402d337e6a6d4f52c6cb38d984f5e15024ba9ab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23801 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 NmpP_)rzdIv|Jn3HW={YB diff --git a/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper2.jpg b/api/SimpleAdmin/SimpleAdmin.Web.Entry/wwwroot/mobile/swiper/swiper2.jpg deleted file mode 100644 index 0b59e5ccf0de4de887032a49e51dae80735201d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11387 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

M+fmV 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 diff --git a/doc/Image/redis1.png b/doc/Image/redis1.png deleted file mode 100644 index 286ef46ba0a9841580f810074d272f6508d29329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27489 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 B!b|`F diff --git a/doc/Image/redis2.png b/doc/Image/redis2.png deleted file mode 100644 index 6827ef7049a02ea03d5eab6d7bd638926137849c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17050 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 diff --git a/doc/Image/wendang.png b/doc/Image/wendang.png deleted file mode 100644 index c564620e6b2d387755616d3fb90ab8e7a6a094c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156672 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

Yn2h* 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

6iwuu>>A0oHbCkrmNUZ8R=9S*}eMUV5_L~ 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 E0L(3dK>z>% diff --git "a/doc/Image/\345\276\256\344\277\241.jpg" "b/doc/Image/\345\276\256\344\277\241.jpg" deleted file mode 100644 index 1a328643388274e9dbd76ae9d668e4508df27a48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34519 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 + + diff --git a/web/src/views/login/components/phone-login/index.vue b/web/src/views/login/components/phone-login/index.vue index 59f8cc6..61feb2d 100644 --- a/web/src/views/login/components/phone-login/index.vue +++ b/web/src/views/login/components/phone-login/index.vue @@ -1,6 +1,6 @@