diff --git a/Blog.Core.Api/Blog.Core.Model.xml b/Blog.Core.Api/Blog.Core.Model.xml index 8de49a7b..16896249 100644 --- a/Blog.Core.Api/Blog.Core.Model.xml +++ b/Blog.Core.Api/Blog.Core.Model.xml @@ -386,6 +386,86 @@ Nullable:True </summary> </member> + <member name="T:Blog.Core.Model.Models.DicData"> + <summary> + 字典数据表(多数据) + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicData.pCode"> + <summary> + 父级字典code + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicData.code"> + <summary> + 字典code + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicData.name"> + <summary> + 字典名称 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicData.content"> + <summary> + 字典内容 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicData.content2"> + <summary> + 字典内容2 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicData.content3"> + <summary> + 字典内容3 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicData.description"> + <summary> + 字典描述 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicData.codeOrder"> + <summary> + 排序 + </summary> + </member> + <member name="T:Blog.Core.Model.Models.DicType"> + <summary> + 字典类型表(单数据) + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicType.code"> + <summary> + 字典code + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicType.name"> + <summary> + 字典名称 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicType.content"> + <summary> + 字典内容 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicType.content2"> + <summary> + 字典内容2 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicType.content3"> + <summary> + 字典内容3 + </summary> + </member> + <member name="P:Blog.Core.Model.Models.DicType.description"> + <summary> + 字典描述 + </summary> + </member> <member name="T:Blog.Core.Model.Models.GblLogAudit"> <summary> 用户团队表 @@ -1922,22 +2002,27 @@ 时间:2020-4-3 20:31:26 </summary> </member> - <member name="P:Blog.Core.Model.PaginationModel.PageIndex"> + <member name="P:Blog.Core.Model.PaginationModel.page"> <summary> 当前页 </summary> </member> - <member name="P:Blog.Core.Model.PaginationModel.PageSize"> + <member name="P:Blog.Core.Model.PaginationModel.size"> <summary> 每页大小 </summary> </member> - <member name="P:Blog.Core.Model.PaginationModel.OrderByFileds"> + <member name="P:Blog.Core.Model.PaginationModel.key"> + <summary> + 搜索关键词 + </summary> + </member> + <member name="P:Blog.Core.Model.PaginationModel.orderByFileds"> <summary> 排序字段(例如:id desc,time asc) </summary> </member> - <member name="P:Blog.Core.Model.PaginationModel.Conditions"> + <member name="P:Blog.Core.Model.PaginationModel.conditions"> <summary> 查询条件( 例如:id = 1 and name = 小明) </summary> diff --git a/Blog.Core.Api/Blog.Core.xml b/Blog.Core.Api/Blog.Core.xml index dfe9950a..1e379c49 100644 --- a/Blog.Core.Api/Blog.Core.xml +++ b/Blog.Core.Api/Blog.Core.xml @@ -385,7 +385,7 @@ <param name="pageSize"></param> <returns></returns> </member> - <member name="M:Blog.Core.Controllers.PermissionController.GetTreeTable(System.Int64,System.String)"> + <member name="M:Blog.Core.Controllers.PermissionController.GetTreeTable"> <summary> 查询树形 Table </summary> @@ -468,11 +468,12 @@ 角色管理 </summary> </member> - <member name="M:Blog.Core.Controllers.RoleController.Get(System.Int32,System.String)"> + <member name="M:Blog.Core.Controllers.RoleController.Get(System.Int32,System.Int32,System.String)"> <summary> 获取全部角色 </summary> <param name="page"></param> + <param name="size"></param> <param name="key"></param> <returns></returns> </member> @@ -666,18 +667,14 @@ 用户管理 </summary> </member> - <member name="M:Blog.Core.Controllers.UserController.#ctor(Blog.Core.Repository.UnitOfWorks.IUnitOfWorkManage,Blog.Core.IServices.ISysUserInfoServices,Blog.Core.IServices.IUserRoleServices,Blog.Core.IServices.IRoleServices,Blog.Core.IServices.IDepartmentServices,Blog.Core.Common.HttpContextUser.IUser,AutoMapper.IMapper,Microsoft.Extensions.Logging.ILogger{Blog.Core.Controllers.UserController})"> + <!-- Badly formed XML comment ignored for member "M:Blog.Core.Controllers.UserController.#ctor(Blog.Core.Repository.UnitOfWorks.IUnitOfWorkManage,Blog.Core.IServices.ISysUserInfoServices,Blog.Core.IServices.IUserRoleServices,Blog.Core.IServices.IRoleServices,Blog.Core.IServices.IDepartmentServices,Blog.Core.Common.HttpContextUser.IUser,AutoMapper.IMapper,Microsoft.Extensions.Logging.ILogger{Blog.Core.Controllers.UserController},Microsoft.AspNetCore.Http.IHttpContextAccessor)" --> + <member name="M:Blog.Core.Controllers.UserController.Get_V3(System.Int32,System.String)"> <summary> - 构造函数 + 获取全部用户 </summary> - <param name="unitOfWorkManage"></param> - <param name="sysUserInfoServices"></param> - <param name="userRoleServices"></param> - <param name="roleServices"></param> - <param name="departmentServices"></param> - <param name="user"></param> - <param name="mapper"></param> - <param name="logger"></param> + <param name="page"></param> + <param name="key"></param> + <returns></returns> </member> <member name="M:Blog.Core.Controllers.UserController.Get(System.Int32,System.String)"> <summary> @@ -687,6 +684,14 @@ <param name="key"></param> <returns></returns> </member> + <member name="M:Blog.Core.Controllers.UserController.GetInfoByToken_V3(System.String)"> + <summary> + 获取用户详情根据token + 【无权限】 + </summary> + <param name="token">令牌</param> + <returns></returns> + </member> <member name="M:Blog.Core.Controllers.UserController.GetInfoByToken(System.String)"> <summary> 获取用户详情根据token @@ -695,6 +700,13 @@ <param name="token">令牌</param> <returns></returns> </member> + <member name="M:Blog.Core.Controllers.UserController.Post_V3(Blog.Core.Model.Models.SysUserInfo)"> + <summary> + 添加一个用户 + </summary> + <param name="sysUserInfo"></param> + <returns></returns> + </member> <member name="M:Blog.Core.Controllers.UserController.Post(Blog.Core.Model.ViewModels.SysUserInfoDto)"> <summary> 添加一个用户 @@ -702,6 +714,13 @@ <param name="sysUserInfo"></param> <returns></returns> </member> + <member name="M:Blog.Core.Controllers.UserController.Put_V3(Blog.Core.Model.Models.SysUserInfo)"> + <summary> + 更新用户与角色 + </summary> + <param name="sysUserInfo"></param> + <returns></returns> + </member> <member name="M:Blog.Core.Controllers.UserController.Put(Blog.Core.Model.ViewModels.SysUserInfoDto)"> <summary> 更新用户与角色 @@ -716,6 +735,34 @@ <param name="id"></param> <returns></returns> </member> + <member name="M:Blog.Core.Controllers.UserController.ResetPass(Blog.Core.Model.Models.SysUserInfo)"> + <summary> + 重置密码 + </summary> + <param name="sysUserInfo"></param> + <returns></returns> + </member> + <member name="M:Blog.Core.Controllers.UserController.RefreshMyLogo(Blog.Core.Model.Models.SysUserInfo)"> + <summary> + 更新头像 + </summary> + <param name="sysUserInfo"></param> + <returns></returns> + </member> + <member name="M:Blog.Core.Controllers.UserController.ResetMyPass(Blog.Core.Model.Models.SysUserInfo)"> + <summary> + 重置我的密码 + </summary> + <param name="sysUserInfo"></param> + <returns></returns> + </member> + <member name="M:Blog.Core.Controllers.UserController.PutMyInfo(Blog.Core.Model.Models.SysUserInfo)"> + <summary> + 更新我的资料 + </summary> + <param name="sysUserInfo"></param> + <returns></returns> + </member> <member name="T:Blog.Core.Controllers.UserRoleController"> <summary> 用户角色关系 @@ -1520,6 +1567,47 @@ </summary> <returns></returns> </member> + <member name="T:Blog.Core.Filter.GlobalRouteAuthorizeConvention"> + <summary> + Summary:全局路由权限公约 + Remarks:目的是针对不同的路由,采用不同的授权过滤器 + 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略 + 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")] + </summary> + </member> + <member name="T:Blog.Core.Filter.GlobalAuthorizeFilter"> + <summary> + 全局权限过滤器【无效】 + </summary> + </member> + <member name="T:Blog.Core.Filter.GlobalExceptionsFilter"> + <summary> + 全局异常错误日志 + </summary> + </member> + <member name="M:Blog.Core.Filter.GlobalExceptionsFilter.WriteLog(System.String,System.Exception)"> + <summary> + 自定义返回格式 + </summary> + <param name="throwMsg"></param> + <param name="ex"></param> + <returns></returns> + </member> + <member name="P:Blog.Core.Filter.JsonErrorResponse.Message"> + <summary> + 生产环境的消息 + </summary> + </member> + <member name="P:Blog.Core.Filter.JsonErrorResponse.DevelopmentMessage"> + <summary> + 开发环境的消息 + </summary> + </member> + <member name="T:Blog.Core.Filter.GlobalRoutePrefixFilter"> + <summary> + 全局路由前缀公约 + </summary> + </member> <member name="T:Blog.Core.SwaggerHelper.CustomRouteAttribute"> <summary> 自定义路由 /api/{version}/[controler]/[action] @@ -1543,46 +1631,99 @@ <param name="actionName"></param> <param name="version"></param> </member> - <member name="T:Blog.Core.Filter.GlobalRouteAuthorizeConvention"> + <member name="T:MyDotnet.Controllers.System.DicController"> <summary> - Summary:全局路由权限公约 - Remarks:目的是针对不同的路由,采用不同的授权过滤器 - 如果 controller 上不加 [Authorize] 特性,默认都是 Permission 策略 - 否则,如果想特例其他授权机制的话,需要在 controller 上带上 [Authorize],然后再action上自定义授权即可,比如 [Authorize(Roles = "Admin")] + 字典管理 </summary> </member> - <member name="T:Blog.Core.Filter.GlobalAuthorizeFilter"> + <member name="M:MyDotnet.Controllers.System.DicController.GetDic(System.String)"> <summary> - 全局权限过滤器【无效】 + 获取字典类型 </summary> + <param name="code"></param> + <returns></returns> </member> - <member name="T:Blog.Core.Filter.GlobalExceptionsFilter"> + <member name="M:MyDotnet.Controllers.System.DicController.GetDicData(System.String)"> <summary> - 全局异常错误日志 + 获取字典类型列表 </summary> + <param name="code"></param> + <returns></returns> </member> - <member name="M:Blog.Core.Filter.GlobalExceptionsFilter.WriteLog(System.String,System.Exception)"> + <member name="M:MyDotnet.Controllers.System.DicController.Get(System.Int32,System.Int32,System.String)"> <summary> - 自定义返回格式 + 获取列表 </summary> - <param name="throwMsg"></param> - <param name="ex"></param> + <param name="page"></param> + <param name="size"></param> + <param name="key"></param> <returns></returns> </member> - <member name="P:Blog.Core.Filter.JsonErrorResponse.Message"> + <member name="M:MyDotnet.Controllers.System.DicController.Post(Blog.Core.Model.Models.DicType)"> <summary> - 生产环境的消息 + 添加 </summary> + <param name="data"></param> + <returns></returns> </member> - <member name="P:Blog.Core.Filter.JsonErrorResponse.DevelopmentMessage"> + <member name="M:MyDotnet.Controllers.System.DicController.Put(Blog.Core.Model.Models.DicType)"> <summary> - 开发环境的消息 + 更新 </summary> + <param name="data"></param> + <returns></returns> </member> - <member name="T:Blog.Core.Filter.GlobalRoutePrefixFilter"> + <member name="M:MyDotnet.Controllers.System.DicController.Delete(System.Int64)"> <summary> - 全局路由前缀公约 + 删除 + </summary> + <param name="id"></param> + <returns></returns> + </member> + <member name="M:MyDotnet.Controllers.System.DicController.Deletes(System.Object[])"> + <summary> + 批量删除 + </summary> + <param name="ids"></param> + <returns></returns> + </member> + <member name="M:MyDotnet.Controllers.System.DicController.DicDataGet(System.String,System.Int32,System.Int32,System.String)"> + <summary> + 获取列表 + </summary> + <param name="page"></param> + <param name="size"></param> + <param name="key"></param> + <param name="code"></param> + <returns></returns> + </member> + <member name="M:MyDotnet.Controllers.System.DicController.DicDataPost(Blog.Core.Model.Models.DicData)"> + <summary> + 添加 + </summary> + <param name="data"></param> + <returns></returns> + </member> + <member name="M:MyDotnet.Controllers.System.DicController.DicDataPut(Blog.Core.Model.Models.DicData)"> + <summary> + 更新 </summary> + <param name="data"></param> + <returns></returns> + </member> + <member name="M:MyDotnet.Controllers.System.DicController.DicDataDelete(System.Int64)"> + <summary> + 删除 + </summary> + <param name="id"></param> + <returns></returns> + </member> + <member name="M:MyDotnet.Controllers.System.DicController.DicDataDeletes(System.Object[])"> + <summary> + 批量删除 + </summary> + <param name="ids"></param> + <returns></returns> </member> </members> </doc> diff --git a/Blog.Core.Api/Controllers/DbFirst/MigrateController.cs b/Blog.Core.Api/Controllers/DbFirst/MigrateController.cs index 7865cc69..71d6671a 100644 --- a/Blog.Core.Api/Controllers/DbFirst/MigrateController.cs +++ b/Blog.Core.Api/Controllers/DbFirst/MigrateController.cs @@ -276,9 +276,9 @@ private void InitPermissionTree(List<Permission> permissionsTree, List<Permissio { foreach (var item in permissionsTree) { - item.Children = all.Where(d => d.Pid == item.Id).ToList(); + item.children = all.Where(d => d.Pid == item.Id).ToList(); item.Module = apis.FirstOrDefault(d => d.Id == item.Mid); - InitPermissionTree(item.Children, all, apis); + InitPermissionTree(item.children, all, apis); } } @@ -342,7 +342,7 @@ private async Task SavePermissionTreeAsync(List<Permission> permissionsTree, Lis } pms.Add(pm); - await SavePermissionTreeAsync(item.Children, pms, permissionId); + await SavePermissionTreeAsync(item.children, pms, permissionId); } } diff --git a/Blog.Core.Api/Controllers/DicController.cs b/Blog.Core.Api/Controllers/DicController.cs new file mode 100644 index 00000000..89235dac --- /dev/null +++ b/Blog.Core.Api/Controllers/DicController.cs @@ -0,0 +1,274 @@ +using Blog.Core; +using Blog.Core.Common.Caches; +using Blog.Core.Common.Extensions; +using Blog.Core.Common.Helper; +using Blog.Core.Controllers; +using Blog.Core.IServices; +using Blog.Core.IServices.BASE; +using Blog.Core.Model; +using Blog.Core.Model.Models; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace MyDotnet.Controllers.System +{ + /// <summary> + /// 字典管理 + /// </summary> + [Route("api/[controller]/[action]")] + [ApiController] + [Authorize] + public class DicController : BaseApiController + { + IDicService _dicService; + IBaseServices<DicType> _dicType; + IBaseServices<DicData> _dicData; + ICaching _caching; + + public DicController(IDicService dicService, IBaseServices<DicType> dicType, IBaseServices<DicData> dicData, ICaching caching) + { + _dicService = dicService; + _dicType = dicType; + _dicData = dicData; + _caching = caching; + } + /// <summary> + /// 获取字典类型 + /// </summary> + /// <param name="code"></param> + /// <returns></returns> + [HttpGet] + public async Task<MessageModel<DicType>> GetDic(string code) + { + var data = await _dicService.GetDic(code); + return Success(data); + } + /// <summary> + /// 获取字典类型列表 + /// </summary> + /// <param name="code"></param> + /// <returns></returns> + [HttpGet] + public async Task<MessageModel<List<DicData>>> GetDicData(string code) + { + var data = await _dicService.GetDicData(code); + return Success(data); + } + + + + + + + + + + + + /// <summary> + /// 获取列表 + /// </summary> + /// <param name="page"></param> + /// <param name="size"></param> + /// <param name="key"></param> + /// <returns></returns> + [HttpGet] + [Authorize(Permissions.Name)] + public async Task<MessageModel<PageModel<DicType>>> Get(int page = 1, int size = 10, string key = "") + { + var whereFind = LinqHelper.True<DicType>(); + + if (!string.IsNullOrEmpty(key)) + { + whereFind = whereFind.And(t => t.code.Contains(key) + || t.name.Contains(key) + || t.content.Contains(key) + || t.content2.Contains(key) + || t.content3.Contains(key) + || t.description.Contains(key)); + } + var data = await _dicType.QueryPage(whereFind, page, size, " Id desc "); + return Success(data, "获取成功"); + } + + /// <summary> + /// 添加 + /// </summary> + /// <param name="data"></param> + /// <returns></returns> + [HttpPost] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> Post([FromBody] DicType data) + { + var id = await _dicType.Add(data); + await _caching.RemoveAsync(data.code); + return id > 0 ? Success(id.ObjToString(), "添加成功") : Failed(); + + } + + /// <summary> + /// 更新 + /// </summary> + /// <param name="data"></param> + /// <returns></returns> + [HttpPut] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> Put([FromBody] DicType data) + { + if (data == null || data.Id <= 0) + return Failed("缺少参数"); + await _caching.RemoveAsync(data.code); + return await _dicType.Update(data) ? Success(data.Id.ObjToString(), "更新成功") : Failed(); + } + + /// <summary> + /// 删除 + /// </summary> + /// <param name="id"></param> + /// <returns></returns> + [HttpDelete] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> Delete(long id) + { + if (id <= 0) + return Failed("缺少参数"); + var data = await _dicType.QueryById(id); + if(data == null) + return Failed("数据不存在"); + var isOk = await _dicType.DeleteById(id); + await _caching.RemoveAsync(data.code); + if (isOk) + return Success("","删除成功"); + return Failed(); + } + + /// <summary> + /// 批量删除 + /// </summary> + /// <param name="ids"></param> + /// <returns></returns> + [HttpPost] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> Deletes([FromBody] object[] ids) + { + + var ls = await _dicType.QueryByIDs(ids); + var isOk = await _dicType.DeleteByIds(ids); + if (isOk) + return Success("", "删除成功"); + foreach (var data in ls) + { + await _caching.RemoveAsync(data.code); + } + return Failed(); + } + + + + + + + /// <summary> + /// 获取列表 + /// </summary> + /// <param name="page"></param> + /// <param name="size"></param> + /// <param name="key"></param> + /// <param name="code"></param> + /// <returns></returns> + [HttpGet] + [Authorize(Permissions.Name)] + public async Task<MessageModel<PageModel<DicData>>> DicDataGet(string code,int page = 1, int size = 10, string key = "") + { + var whereFind = LinqHelper.True<DicData>(); + if (string.IsNullOrEmpty(code)) + { + return MessageModel<PageModel<DicData>>.Fail("请选择一个要查询的字典"); + } + else + { + whereFind = whereFind.And(t => t.pCode.Equals(code)); + } + + if (!string.IsNullOrEmpty(key)) + { + whereFind = whereFind.And(t => t.name.Contains(key) + || t.content.Contains(key) + || t.content2.Contains(key) + || t.content3.Contains(key) + || t.description.Contains(key)); + } + var data = await _dicData.QueryPage(whereFind, page, size, "codeOrder asc"); + return Success(data, "获取成功"); + } + + /// <summary> + /// 添加 + /// </summary> + /// <param name="data"></param> + /// <returns></returns> + [HttpPost] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> DicDataPost([FromBody] DicData data) + { + var id = await _dicData.Add(data); + await _caching.RemoveAsync($"{data.pCode}_list"); + return id > 0 ? Success(id.ObjToString(), "添加成功") : Failed(); + + } + + /// <summary> + /// 更新 + /// </summary> + /// <param name="data"></param> + /// <returns></returns> + [HttpPut] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> DicDataPut([FromBody] DicData data) + { + if (data == null || data.Id <= 0) + return Failed("缺少参数"); + await _caching.RemoveAsync($"{data.pCode}_list"); + return await _dicData.Update(data) ? Success(data.Id.ObjToString(), "更新成功") : Failed(); + } + + /// <summary> + /// 删除 + /// </summary> + /// <param name="id"></param> + /// <returns></returns> + [HttpDelete] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> DicDataDelete(long id) + { + if (id <= 0) + return Failed("缺少参数"); + var data = await _dicData.QueryById(id); + await _caching.RemoveAsync($"{data.pCode}_list"); + var isOk = await _dicData.DeleteById(id); + if (isOk) + return Success("", "删除成功"); + return Failed(); + } + + /// <summary> + /// 批量删除 + /// </summary> + /// <param name="ids"></param> + /// <returns></returns> + [HttpPost] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> DicDataDeletes([FromBody] object[] ids) + { + var isOk = await _dicData.DeleteByIds(ids); + var data = await _dicData.QueryById(ids[0]); + await _caching.RemoveAsync($"{data.pCode}_list"); + if (isOk) + return Success("", "删除成功"); + return Failed(); + } + + + + } +} diff --git a/Blog.Core.Api/Controllers/PermissionController.cs b/Blog.Core.Api/Controllers/PermissionController.cs index 13f8125a..540640a7 100644 --- a/Blog.Core.Api/Controllers/PermissionController.cs +++ b/Blog.Core.Api/Controllers/PermissionController.cs @@ -147,54 +147,30 @@ public async Task<MessageModel<PageModel<Permission>>> Get(int page = 1, string /// <returns></returns> [HttpGet] [AllowAnonymous] - public async Task<MessageModel<List<Permission>>> GetTreeTable(long f = 0, string key = "") + public async Task<MessageModel<List<Permission>>> GetTreeTable() { List<Permission> permissions = new List<Permission>(); var apiList = await _moduleServices.Query(d => d.IsDeleted == false); + + var permissionsList = await _permissionServices.Query(d => d.IsDeleted == false); - if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) - { - key = ""; - } - if (key != "") - { - permissions = permissionsList.Where(a => a.Name.Contains(key)).OrderBy(a => a.OrderSort).ToList(); - } - else - { - permissions = permissionsList.Where(a => a.Pid == f).OrderBy(a => a.OrderSort).ToList(); - } - foreach (var item in permissions) - { - List<long> pidarr = new() { }; - var parent = permissionsList.FirstOrDefault(d => d.Id == item.Pid); - while (parent != null) - { - pidarr.Add(parent.Id); - parent = permissionsList.FirstOrDefault(d => d.Id == parent.Pid); - } + Permission rootRoot = new Permission + { + Id = 0, + Pid = 0, + Name = "根节点" + }; - //item.PidArr = pidarr.OrderBy(d => d).Distinct().ToList(); + permissionsList = permissionsList.OrderBy(d => d.OrderSort).ToList(); - pidarr.Reverse(); - pidarr.Insert(0, 0); - item.PidArr = pidarr; - item.MName = apiList.FirstOrDefault(d => d.Id == item.Mid)?.LinkUrl; - item.hasChildren = permissionsList.Where(d => d.Pid == item.Id).Any(); - } + RecursionHelper.LoopToAppendChildren(permissionsList, rootRoot, 0, apiList); - //return new MessageModel<List<Permission>>() - //{ - // msg = "获取成功", - // success = true, - // response = permissions - //}; - return Success(permissions, "获取成功"); + return Success(rootRoot.children, "获取成功"); } /// <summary> diff --git a/Blog.Core.Api/Controllers/RoleController.cs b/Blog.Core.Api/Controllers/RoleController.cs index 0b93e943..2e614ef0 100644 --- a/Blog.Core.Api/Controllers/RoleController.cs +++ b/Blog.Core.Api/Controllers/RoleController.cs @@ -29,20 +29,19 @@ public RoleController(IRoleServices roleServices, IUser user) /// 获取全部角色 /// </summary> /// <param name="page"></param> + /// <param name="size"></param> /// <param name="key"></param> /// <returns></returns> // GET: api/User [HttpGet] - public async Task<MessageModel<PageModel<Role>>> Get(int page = 1, string key = "") + public async Task<MessageModel<PageModel<Role>>> Get(int page = 1, int size = 10, string key = "") { if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) { key = ""; } - - int intPageSize = 50; - - var data = await _roleServices.QueryPage(a => a.IsDeleted != true && (a.Name != null && a.Name.Contains(key)), page, intPageSize, " Id desc "); + + var data = await _roleServices.QueryPage(a => a.IsDeleted != true && (a.Name != null && a.Name.Contains(key)), page, size, " Id desc "); //return new MessageModel<PageModel<Role>>() //{ diff --git a/Blog.Core.Api/Controllers/UserController.cs b/Blog.Core.Api/Controllers/UserController.cs index 95137c8e..4df5ce2a 100644 --- a/Blog.Core.Api/Controllers/UserController.cs +++ b/Blog.Core.Api/Controllers/UserController.cs @@ -9,6 +9,7 @@ using Blog.Core.Repository.UnitOfWorks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using System.IdentityModel.Tokens.Jwt; namespace Blog.Core.Controllers { @@ -28,6 +29,7 @@ public class UserController : BaseApiController private readonly IUser _user; private readonly IMapper _mapper; private readonly ILogger<UserController> _logger; + public IHttpContextAccessor _httpContext; /// <summary> /// 构造函数 @@ -39,12 +41,14 @@ public class UserController : BaseApiController /// <param name="departmentServices"></param> /// <param name="user"></param> /// <param name="mapper"></param> - /// <param name="logger"></param> + /// <param name="logger"></param + /// <param name="httpContext"></param> public UserController(IUnitOfWorkManage unitOfWorkManage, ISysUserInfoServices sysUserInfoServices, IUserRoleServices userRoleServices, IRoleServices roleServices, IDepartmentServices departmentServices, - IUser user, IMapper mapper, ILogger<UserController> logger) + IUser user, IMapper mapper, ILogger<UserController> logger + ,IHttpContextAccessor httpContext) { _unitOfWorkManage = unitOfWorkManage; _sysUserInfoServices = sysUserInfoServices; @@ -54,8 +58,56 @@ public UserController(IUnitOfWorkManage unitOfWorkManage, ISysUserInfoServices s _user = user; _mapper = mapper; _logger = logger; + _httpContext = httpContext; + } + /// <summary> + /// 获取全部用户 + /// </summary> + /// <param name="page"></param> + /// <param name="key"></param> + /// <returns></returns> + // GET: api/User + [HttpGet] + public async Task<MessageModel<PageModel<SysUserInfo>>> Get_V3(int page = 1, string key = "") + { + if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key)) + { + key = ""; + } + + int intPageSize = 50; + + + var data = await _sysUserInfoServices.QueryPage(a => a.IsDeleted != true && a.Status >= 0 && ((a.LoginName != null && a.LoginName.Contains(key)) || (a.RealName != null && a.RealName.Contains(key))), page, intPageSize, " Id desc "); + + + #region MyRegion + + // 这里可以封装到多表查询,此处简单处理 + var allUserRoles = await _userRoleServices.Query(d => d.IsDeleted == false); + var allRoles = await _roleServices.Query(d => d.IsDeleted == false); + var allDepartments = await _departmentServices.Query(d => d.IsDeleted == false); + + var sysUserInfos = data.data; + foreach (var item in sysUserInfos) + { + var currentUserRoles = allUserRoles.Where(d => d.UserId == item.Id).Select(d => d.RoleId).ToList(); + item.RIDs = currentUserRoles; + item.RoleNames = allRoles.Where(d => currentUserRoles.Contains(d.Id)).Select(d => d.Name).ToList(); + var departmentNameAndIds = GetFullDepartmentName(allDepartments, item.DepartmentId); + item.DepartmentName = departmentNameAndIds.Item1; + item.Dids = departmentNameAndIds.Item2; + } + + data.data = sysUserInfos; + + #endregion + + + return Success(data.ConvertTo<SysUserInfo>(_mapper)); + } /// <summary> /// 获取全部用户 /// </summary> @@ -103,6 +155,7 @@ public async Task<MessageModel<PageModel<SysUserInfoDto>>> Get(int page = 1, str return Success(data.ConvertTo<SysUserInfoDto>(_mapper)); } + private (string, List<long>) GetFullDepartmentName(List<Department> departments, long departmentId) { var departmentModel = departments.FirstOrDefault(d => d.Id == departmentId); @@ -128,6 +181,35 @@ public string Get(string id) return "value"; } + // GET: api/User/5 + /// <summary> + /// 获取用户详情根据token + /// 【无权限】 + /// </summary> + /// <param name="token">令牌</param> + /// <returns></returns> + [HttpGet] + [AllowAnonymous] + public async Task<MessageModel<SysUserInfo>> GetInfoByToken_V3(string token) + { + var data = new MessageModel<SysUserInfo>(); + if (!string.IsNullOrEmpty(token)) + { + var tokenModel = JwtHelper.SerializeJwt(token); + if (tokenModel != null && tokenModel.Uid > 0) + { + var userinfo = await _sysUserInfoServices.QueryById(tokenModel.Uid); + if (userinfo != null) + { + data.response = userinfo; + data.success = true; + data.msg = "获取成功"; + } + } + } + + return data; + } // GET: api/User/5 /// <summary> /// 获取用户详情根据token @@ -158,6 +240,30 @@ public async Task<MessageModel<SysUserInfoDto>> GetInfoByToken(string token) return data; } + /// <summary> + /// 添加一个用户 + /// </summary> + /// <param name="sysUserInfo"></param> + /// <returns></returns> + // POST: api/User + [HttpPost] + public async Task<MessageModel<string>> Post_V3([FromBody] SysUserInfo sysUserInfo) + { + var data = new MessageModel<string>(); + + sysUserInfo.LoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.LoginPWD); + sysUserInfo.Remark = _user.Name; + + var id = await _sysUserInfoServices.Add(sysUserInfo); + data.success = id > 0; + if (data.success) + { + data.response = id.ObjToString(); + data.msg = "添加成功"; + } + + return data; + } /// <summary> /// 添加一个用户 /// </summary> @@ -183,6 +289,80 @@ public async Task<MessageModel<string>> Post([FromBody] SysUserInfoDto sysUserIn return data; } + /// <summary> + /// 更新用户与角色 + /// </summary> + /// <param name="sysUserInfo"></param> + /// <returns></returns> + // PUT: api/User/5 + [HttpPut] + public async Task<MessageModel<string>> Put_V3([FromBody] SysUserInfo sysUserInfo) + { + // 这里使用事务处理 + var data = new MessageModel<string>(); + + var oldUser = await _sysUserInfoServices.QueryById(sysUserInfo.Id); + if (oldUser is not { Id: > 0 }) + { + return Failed<string>("用户不存在或已被删除"); + } + + try + { + if (sysUserInfo.LoginPWD != oldUser.LoginPWD) + { + oldUser.CriticalModifyTime = DateTime.Now; + } + + _mapper.Map(sysUserInfo, oldUser); + + _unitOfWorkManage.BeginTran(); + // 无论 Update Or Add , 先删除当前用户的全部 U_R 关系 + var usreroles = (await _userRoleServices.Query(d => d.UserId == oldUser.Id)); + if (usreroles.Any()) + { + var ids = usreroles.Select(d => d.Id.ToString()).ToArray(); + var isAllDeleted = await _userRoleServices.DeleteByIds(ids); + if (!isAllDeleted) + { + return Failed("服务器更新异常"); + } + } + + // 然后再执行添加操作 + if (sysUserInfo.RIDs.Count > 0) + { + var userRolsAdd = new List<UserRole>(); + sysUserInfo.RIDs.ForEach(rid => { userRolsAdd.Add(new UserRole(oldUser.Id, rid)); }); + + var oldRole = usreroles.Select(s => s.RoleId).OrderBy(i => i).ToArray(); + var newRole = userRolsAdd.Select(s => s.RoleId).OrderBy(i => i).ToArray(); + if (!oldRole.SequenceEqual(newRole)) + { + oldUser.CriticalModifyTime = DateTime.Now; + } + + await _userRoleServices.Add(userRolsAdd); + } + + data.success = await _sysUserInfoServices.Update(oldUser); + + _unitOfWorkManage.CommitTran(); + + if (data.success) + { + data.msg = "更新成功"; + data.response = oldUser.Id.ObjToString(); + } + } + catch (Exception e) + { + _unitOfWorkManage.RollbackTran(); + _logger.LogError(e, e.Message); + } + + return data; + } /// <summary> /// 更新用户与角色 /// </summary> @@ -282,5 +462,108 @@ public async Task<MessageModel<string>> Delete(long id) return data; } + + + /// <summary> + /// 重置密码 + /// </summary> + /// <param name="sysUserInfo"></param> + /// <returns></returns> + [HttpPut] + [Authorize(Permissions.Name)] + public async Task<MessageModel<string>> ResetPass([FromBody] SysUserInfo sysUserInfo) + { + //重置密码 + + var oldUser = await _sysUserInfoServices.QueryById(sysUserInfo.Id); + if (oldUser == null || oldUser.IsDeleted) + { + return Failed<string>("用户不存在或已被删除"); + } + oldUser.LoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.LoginPWD); + await _sysUserInfoServices.Update(oldUser); + return Success<string>("重置成功"); + } + + /// <summary> + /// 更新头像 + /// </summary> + /// <param name="sysUserInfo"></param> + /// <returns></returns> + [HttpPut] + [Authorize] + public async Task<MessageModel<string>> RefreshMyLogo([FromBody] SysUserInfo sysUserInfo) + { + //重置密码 登录既可修改 + var uid = _user.ID; + var oldUser = await _sysUserInfoServices.QueryById(uid); + if (oldUser == null || oldUser.IsDeleted) + { + return Failed<string>("用户不存在或已被删除"); + } + oldUser.logo = sysUserInfo.logo; + await _sysUserInfoServices.Update(oldUser); + return Success<string>("更新成功"); + } + + /// <summary> + /// 重置我的密码 + /// </summary> + /// <param name="sysUserInfo"></param> + /// <returns></returns> + [HttpPut] + [Authorize] + public async Task<MessageModel<string>> ResetMyPass([FromBody] SysUserInfo sysUserInfo) + { + //重置密码 登录既可修改 + + var uid = _user.ID; + var oldUser = await _sysUserInfoServices.QueryById(uid); + if (oldUser == null || oldUser.IsDeleted) + { + return Failed<string>("用户不存在或已被删除"); + } + oldUser.LoginPWD = MD5Helper.MD5Encrypt32(sysUserInfo.LoginPWD); + await _sysUserInfoServices.Update(oldUser); + return Success<string>("重置成功"); + } + /// <summary> + /// 更新我的资料 + /// </summary> + /// <param name="sysUserInfo"></param> + /// <returns></returns> + [HttpPut] + [Authorize] + public async Task<MessageModel<string>> PutMyInfo([FromBody] SysUserInfo sysUserInfo) + { + + var uid = _user.ID; + + var data = new MessageModel<string>(); + + //登录账号判断 + var hasUser = await _sysUserInfoServices.Query(t => t.LoginName == sysUserInfo.LoginName && t.IsDeleted == false && t.Id != uid); + if (hasUser.Count > 0) + { + return Failed<string>($"登录名:{sysUserInfo.LoginName}已存在,请重新填写!"); + } + + var oldUser = await _sysUserInfoServices.QueryById(uid); + if (oldUser == null || oldUser.IsDeleted) + { + return Failed<string>("用户不存在或已被删除"); + } + + oldUser.RealName = sysUserInfo.RealName; + oldUser.LoginName = sysUserInfo.LoginName; + oldUser.Sex = sysUserInfo.Sex; + oldUser.Age = sysUserInfo.Age; + oldUser.Birth = sysUserInfo.Birth; + oldUser.Address = sysUserInfo.Address; + oldUser.Remark = sysUserInfo.Remark; + await _sysUserInfoServices.Update(oldUser); + + return Success<string>("更新成功"); + } } } \ No newline at end of file diff --git a/Blog.Core.Common/Helper/RecursionHelper.cs b/Blog.Core.Common/Helper/RecursionHelper.cs index f223cd71..d46623fe 100644 --- a/Blog.Core.Common/Helper/RecursionHelper.cs +++ b/Blog.Core.Common/Helper/RecursionHelper.cs @@ -1,4 +1,5 @@ -using System; +using Blog.Core.Model.Models; +using System; using System.Collections.Generic; using System.Linq; @@ -78,6 +79,42 @@ public static void LoopToAppendChildren(List<DepartmentTree> all, DepartmentTree LoopToAppendChildren(all, subItem, pid); } } + /// <summary> + /// 菜单列表 + /// </summary> + /// <param name="all"></param> + /// <param name="curItem"></param> + /// <param name="pid"></param> + /// <param name="allApi"></param> + public static void LoopToAppendChildren(List<Permission> all, Permission curItem, long pid, List<Modules> allApi) + { + var subItems = all.Where(ee => ee.Pid == curItem.Id).ToList(); + curItem.MName = allApi.FirstOrDefault(d => d.Id == curItem.Mid)?.LinkUrl; + if (subItems.Count > 0) + { + + foreach (var subItem in subItems) + { + subItem.MName = allApi.FirstOrDefault(d => d.Id == subItem.Mid)?.LinkUrl; + } + + curItem.children = subItems; + } + else + { + curItem.children = new List<Permission>(); + } + + foreach (var subItem in subItems) + { + if (subItem.Id == pid && pid > 0) + { + //subItem.disabled = true;//禁用当前节点 + } + + LoopToAppendChildren(all, subItem, pid, allApi); + } + } public static void LoopNaviBarAppendChildren(List<NavigationBar> all, NavigationBar curItem) diff --git a/Blog.Core.IServices/IDicService.cs b/Blog.Core.IServices/IDicService.cs new file mode 100644 index 00000000..ce341ccd --- /dev/null +++ b/Blog.Core.IServices/IDicService.cs @@ -0,0 +1,12 @@ +using Blog.Core.IServices.BASE; +using Blog.Core.Model.Models; + + +namespace Blog.Core.IServices +{ + public interface IDicService : IBaseServices<DicType> + { + public Task<DicType> GetDic(string code); + public Task<List<DicData>> GetDicData(string code); + } +} diff --git a/Blog.Core.Model/Models/DicData.cs b/Blog.Core.Model/Models/DicData.cs new file mode 100644 index 00000000..eb046d35 --- /dev/null +++ b/Blog.Core.Model/Models/DicData.cs @@ -0,0 +1,44 @@ + + +namespace Blog.Core.Model.Models +{ + /// <summary> + /// 字典数据表(多数据) + /// </summary> + public class DicData: RootEntityTkey<long> + { + /// <summary> + /// 父级字典code + /// </summary> + public string pCode { set; get; } + /// <summary> + /// 字典code + /// </summary> + public string code { set; get; } + /// <summary> + /// 字典名称 + /// </summary> + public string name { set; get; } + /// <summary> + /// 字典内容 + /// </summary> + public string content { set; get; } + /// <summary> + /// 字典内容2 + /// </summary> + public string content2 { set; get; } + /// <summary> + /// 字典内容3 + /// </summary> + public string content3 { set; get; } + /// <summary> + /// 字典描述 + /// </summary> + public string description { set; get; } + + /// <summary> + /// 排序 + /// </summary> + public int codeOrder { get; set; } + } +} diff --git a/Blog.Core.Model/Models/DicType.cs b/Blog.Core.Model/Models/DicType.cs new file mode 100644 index 00000000..1f3a82cb --- /dev/null +++ b/Blog.Core.Model/Models/DicType.cs @@ -0,0 +1,34 @@ + +namespace Blog.Core.Model.Models +{ + /// <summary> + /// 字典类型表(单数据) + /// </summary> + public class DicType: RootEntityTkey<long> + { + /// <summary> + /// 字典code + /// </summary> + public string code { set; get; } + /// <summary> + /// 字典名称 + /// </summary> + public string name { set; get; } + /// <summary> + /// 字典内容 + /// </summary> + public string content { set; get; } + /// <summary> + /// 字典内容2 + /// </summary> + public string content2 { set; get; } + /// <summary> + /// 字典内容3 + /// </summary> + public string content3 { set; get; } + /// <summary> + /// 字典描述 + /// </summary> + public string description { set; get; } + } +} diff --git a/Blog.Core.Model/Models/Permission.cs b/Blog.Core.Model/Models/Permission.cs index 9dd6238d..41ba9b28 100644 --- a/Blog.Core.Model/Models/Permission.cs +++ b/Blog.Core.Model/Models/Permission.cs @@ -114,7 +114,7 @@ public Permission() public bool hasChildren { get; set; } = true; [SugarColumn(IsIgnore = true)] - public List<Permission> Children { get; set; } = new List<Permission>(); + public List<Permission> children { get; set; } = new List<Permission>(); [SugarColumn(IsIgnore = true)] public Modules Module { get; set; } diff --git a/Blog.Core.Model/Models/sysUserInfo.cs b/Blog.Core.Model/Models/sysUserInfo.cs index 1137d91c..5031d738 100644 --- a/Blog.Core.Model/Models/sysUserInfo.cs +++ b/Blog.Core.Model/Models/sysUserInfo.cs @@ -116,8 +116,11 @@ public SysUserInfo(string loginName, string loginPWD) // 地址 [SugarColumn(Length = 200, IsNullable = true)] public string Address { get; set; } + // 头像 + [SugarColumn(IsNullable = true)] + public string logo { get; set; } - [SugarColumn(DefaultValue = "1")] + [SugarColumn(DefaultValue = "1")] public bool Enable { get; set; } = true; [SugarColumn(IsNullable = true)] diff --git a/Blog.Core.Model/PaginationModel.cs b/Blog.Core.Model/PaginationModel.cs index f79b3316..692cf8c0 100644 --- a/Blog.Core.Model/PaginationModel.cs +++ b/Blog.Core.Model/PaginationModel.cs @@ -10,18 +10,22 @@ public class PaginationModel /// <summary> /// 当前页 /// </summary> - public int PageIndex { get; set; } = 1; + public int page { get; set; } = 1; /// <summary> /// 每页大小 /// </summary> - public int PageSize { get; set; } = 10; + public int size { get; set; } = 10; + /// <summary> + /// 搜索关键词 + /// </summary> + public string key { get; set; } /// <summary> /// 排序字段(例如:id desc,time asc) /// </summary> - public string OrderByFileds { get; set; } + public string orderByFileds { get; set; } /// <summary> /// 查询条件( 例如:id = 1 and name = 小明) /// </summary> - public string Conditions { get; set; } + public string conditions { get; set; } } } diff --git a/Blog.Core.Services/BASE/BaseServices.cs b/Blog.Core.Services/BASE/BaseServices.cs index 44042382..daacd654 100644 --- a/Blog.Core.Services/BASE/BaseServices.cs +++ b/Blog.Core.Services/BASE/BaseServices.cs @@ -338,8 +338,8 @@ public async Task<PageModel<TEntity>> QueryPage(Expression<Func<TEntity, bool>> public async Task<PageModel<TEntity>> QueryPage(PaginationModel pagination) { - var express = DynamicLinqFactory.CreateLambda<TEntity>(pagination.Conditions); - return await QueryPage(express, pagination.PageIndex, pagination.PageSize, pagination.OrderByFileds); + var express = DynamicLinqFactory.CreateLambda<TEntity>(pagination.conditions); + return await QueryPage(express, pagination.page, pagination.size, pagination.orderByFileds); } #region 分表 diff --git a/Blog.Core.Services/DicService.cs b/Blog.Core.Services/DicService.cs new file mode 100644 index 00000000..8c496dc8 --- /dev/null +++ b/Blog.Core.Services/DicService.cs @@ -0,0 +1,80 @@ + + +using Blog.Core.Common.Caches; +using Blog.Core.IServices; +using Blog.Core.Model.Models; +using Blog.Core.Repository.Base; +using Blog.Core.Services.BASE; + +namespace MyDotnet.Services.System +{ + /// <summary> + /// 字典服务类 + /// </summary> + public class DicService: BaseServices<DicType>, IDicService + { + private BaseRepository<DicType> _dicType; + private BaseRepository<DicData> _dicData; + private ICaching _caching; + /// <summary> + /// 构造函数 + /// </summary> + /// <param name="baseRepository"></param> + /// <param name="dicBaseRepository"></param> + /// <param name="caching"></param> + public DicService(BaseRepository<DicType> baseRepository + , BaseRepository<DicData> dicBaseRepository + , ICaching caching) : base(baseRepository) + { + _dicType = baseRepository; + _dicData = dicBaseRepository; + _caching = caching; + } + /// <summary> + /// 获取一个字典类型值 + /// </summary> + /// <param name="code"></param> + /// <returns></returns> + public async Task<DicType> GetDic(string code) + { + var data = await _caching.GetAsync<DicType>(code); + if(data == null) + { + //缓存穿透 + var ls = await _dicType.Query(t => t.code == code); + if (ls == null || ls.Count == 0) + { + throw new Exception($"字典[{code}]不存在"); + } + data = ls.FirstOrDefault(); + //设置缓存 + _caching.Set(code, data); + } + return data; + } + + /// <summary> + /// 获取一个字典类型列表值 + /// </summary> + /// <param name="code"></param> + /// <returns></returns> + public async Task<List<DicData>> GetDicData(string code) + { + + var data = await _caching.GetAsync<List<DicData>>(code); + if(data == null) + { + data = await _dicData.Query(t => t.pCode == code, "codeOrder asc"); + if (data == null || data.Count == 0) + { + throw new Exception($"字典[{code}]不存在"); + } + //设置缓存 + _caching.Set($"{code}_list", data); + } + return data; + } + + + } +}