diff --git a/ZR.Admin.WebApi/Controllers/CommonController.cs b/ZR.Admin.WebApi/Controllers/CommonController.cs index 1acd8d2..678b629 100644 --- a/ZR.Admin.WebApi/Controllers/CommonController.cs +++ b/ZR.Admin.WebApi/Controllers/CommonController.cs @@ -97,7 +97,7 @@ namespace ZR.Admin.WebApi.Controllers /// /// /// 存储目录 - /// 文件名 + /// 自定义文件名 /// 上传类型 1、发送邮件 /// [HttpPost()] @@ -152,16 +152,17 @@ namespace ZR.Admin.WebApi.Controllers /// 存储文件到阿里云 /// /// + /// 自定义文件名 /// 上传文件夹路径 /// [HttpPost] [Verify] [ActionPermissionFilter(Permission = "common")] - public IActionResult UploadFileAliyun([FromForm(Name = "file")] IFormFile formFile, string fileDir = "") + public IActionResult UploadFileAliyun([FromForm(Name = "file")] IFormFile formFile, string fileName = "", string fileDir = "") { if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空"); string fileExt = Path.GetExtension(formFile.FileName); - string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".jpeg", ".webp", ".svga", ".xls", ".doc", ".zip", ".json", ".txt" }; + string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".jpeg", ".webp", ".svga", ".xls", ".doc", ".zip", ".json", ".txt", ".bundle" }; int MaxContentLength = 1024 * 1024 * 15; double fileSize = formFile.Length / 1024; if (!AllowedFileExtensions.Contains(fileExt)) @@ -174,7 +175,7 @@ namespace ZR.Admin.WebApi.Controllers return ToResponse(ResultCode.CUSTOM_ERROR, "上传文件过大,不能超过 " + (MaxContentLength / 1024).ToString() + " MB"); } - (bool, string, string) result = SysFileService.SaveFile(fileDir, formFile); + (bool, string, string) result = SysFileService.SaveFile(fileDir, formFile, fileName); long fileId = SysFileService.InsertFile(new SysFile() { AccessUrl = result.Item2, diff --git a/ZR.Admin.WebApi/Controllers/System/SysFileController.cs b/ZR.Admin.WebApi/Controllers/System/SysFileController.cs index 18597c6..2044973 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysFileController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysFileController.cs @@ -43,6 +43,7 @@ namespace ZR.Admin.WebApi.Controllers predicate = predicate.AndIF(parm.BeginCreate_time != null, it => it.Create_time >= parm.BeginCreate_time); predicate = predicate.AndIF(parm.EndCreate_time != null, it => it.Create_time <= parm.EndCreate_time); predicate = predicate.AndIF(parm.StoreType != null, m => m.StoreType == parm.StoreType); + predicate = predicate.AndIF(parm.FileId != null, m => m.Id == parm.FileId); //搜索条件查询语法参考Sqlsugar var response = _SysFileService.GetPages(predicate.ToExpression(), parm); @@ -59,7 +60,7 @@ namespace ZR.Admin.WebApi.Controllers public IActionResult GetSysFile(int Id) { var response = _SysFileService.GetFirst(x => x.Id == Id); - + return SUCCESS(response); } diff --git a/ZR.Admin.WebApi/Controllers/System/SysMenuController.cs b/ZR.Admin.WebApi/Controllers/System/SysMenuController.cs index 60666c6..10e2f16 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysMenuController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysMenuController.cs @@ -8,6 +8,7 @@ using ZR.Admin.WebApi.Filters; using ZR.Model.System.Dto; using ZR.Model.System; using ZR.Service.System.IService; +using ZR.Model; namespace ZR.Admin.WebApi.Controllers.System { @@ -32,10 +33,10 @@ namespace ZR.Admin.WebApi.Controllers.System /// [ActionPermissionFilter(Permission = "system:menu:list")] [HttpGet("list")] - public IActionResult MenuList([FromQuery] SysMenu menu) + public IActionResult TreeMenuList([FromQuery] SysMenu menu) { long userId = HttpContext.GetUId(); - return SUCCESS(sysMenuService.SelectMenuList(menu, userId), "yyyy-MM-dd HH:mm:ss"); + return SUCCESS(sysMenuService.SelectTreeMenuList(menu, userId), "yyyy-MM-dd HH:mm:ss"); } /// @@ -74,7 +75,7 @@ namespace ZR.Admin.WebApi.Controllers.System public IActionResult RoleMenuTreeselect(int roleId) { long userId = HttpContext.GetUId(); - var menus = sysMenuService.SelectMenuList(userId); + var menus = sysMenuService.SelectMenuList(new SysMenu(), userId); var checkedKeys = sysRoleService.SelectUserRoleMenus(roleId); return SUCCESS(new { diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt index 38b8efa..205fb50 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt @@ -45,8 +45,7 @@ $if(column.CsharpType == "string") predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.${column.CsharpField}), ${codeTool.QueryExp(column.CsharpField, column.QueryType)}; $elseif(column.CsharpType == "DateTime") predicate = predicate.AndIF(parm.Begin${column.CsharpField} == null, it => it.${column.CsharpField} >= DateTime.Now.AddDays(-1)); - predicate = predicate.AndIF(parm.Begin${column.CsharpField} != null, it => it.${column.CsharpField} >= parm.Begin${column.CsharpField}); - predicate = predicate.AndIF(parm.End${column.CsharpField} != null, it => it.${column.CsharpField} <= parm.End${column.CsharpField}); + predicate = predicate.AndIF(parm.Begin${column.CsharpField} != null, it => it.${column.CsharpField} >= parm.Begin${column.CsharpField} && it.${column.CsharpField} <= parm.End${column.CsharpField}); $elseif(column.CsharpType == "int" || column.CsharpType == "long") predicate = predicate.AndIF(parm.${column.CsharpField} != null, ${codeTool.QueryExp(column.CsharpField, column.QueryType)}; $end @@ -54,7 +53,7 @@ $end $end $if(genTable.SortField != "" && genTable.SortField != null) var response = _${replaceDto.ModelTypeName}repository - .GetPages(predicate.ToExpression(), parm, x => x.${genTable.SortField}, "${genTable.SortType}"); + .GetPages(predicate.ToExpression(), parm, it => it.${genTable.SortField}, "${genTable.SortType}"); $else var response = _${replaceDto.ModelTypeName}repository .Queryable() diff --git a/ZR.Model/System/Dto/SysFileQueryDto.cs b/ZR.Model/System/Dto/SysFileQueryDto.cs index 4cfa45d..c86b135 100644 --- a/ZR.Model/System/Dto/SysFileQueryDto.cs +++ b/ZR.Model/System/Dto/SysFileQueryDto.cs @@ -25,5 +25,6 @@ namespace ZR.Model.System.Dto public DateTime? BeginCreate_time { get; set; } public DateTime? EndCreate_time { get; set; } public int? StoreType { get; set; } + public int? FileId { get; set; } } } diff --git a/ZR.Model/System/SysMenu.cs b/ZR.Model/System/SysMenu.cs index ca0c3f9..d82e380 100644 --- a/ZR.Model/System/SysMenu.cs +++ b/ZR.Model/System/SysMenu.cs @@ -8,7 +8,7 @@ namespace ZR.Model.System /// [SugarTable("sys_menu")] [Tenant("0")] - public class SysMenu: SysBase + public class SysMenu : SysBase { /// /// 菜单ID @@ -84,6 +84,7 @@ namespace ZR.Model.System /// /// 子菜单 /// - public List children = new List(); + [SugarColumn(IsIgnore = true)] + public List children { get; set; } = new List(); } } diff --git a/ZR.Repository/System/SysMenuRepository.cs b/ZR.Repository/System/SysMenuRepository.cs index 8086698..cb03a0f 100644 --- a/ZR.Repository/System/SysMenuRepository.cs +++ b/ZR.Repository/System/SysMenuRepository.cs @@ -18,6 +18,41 @@ namespace ZR.Repository.System /// 获取所有菜单(菜单管理) /// /// + public List SelectTreeMenuList(SysMenu menu) + { + return Context.Queryable() + .WhereIF(!string.IsNullOrEmpty(menu.menuName), it => it.menuName.Contains(menu.menuName)) + .WhereIF(!string.IsNullOrEmpty(menu.visible), it => it.visible == menu.visible) + .WhereIF(!string.IsNullOrEmpty(menu.status), it => it.status == menu.status) + .OrderBy(it => new { it.parentId, it.orderNum }) + .ToTree(it => it.children, it => it.parentId, 0); + } + + /// + /// 根据用户查询系统菜单列表(菜单管理) + /// + /// + /// 用户角色集合 + /// + public List SelectTreeMenuListByUserId(SysMenu sysMenu, List roles) + { + var roleMenus = Context.Queryable() + .Where(r => roles.Contains(r.Role_id)); + + return Context.Queryable() + .InnerJoin(roleMenus, (c, j) => c.menuId == j.Menu_id) + .WhereIF(!string.IsNullOrEmpty(sysMenu.menuName), (c, j) => c.menuName.Contains(sysMenu.menuName)) + .WhereIF(!string.IsNullOrEmpty(sysMenu.visible), (c, j) => c.visible == sysMenu.visible) + .WhereIF(!string.IsNullOrEmpty(sysMenu.status), (c, j) => c.status == sysMenu.status) + .OrderBy((c, j) => new { c.parentId, c.orderNum }) + .Select(c => c) + .ToTree(it => it.children, it => it.parentId, 0); + } + + /// + /// 获取所有菜单 + /// + /// public List SelectMenuList(SysMenu menu) { return Context.Queryable() @@ -32,22 +67,21 @@ namespace ZR.Repository.System /// 根据用户查询系统菜单列表 /// /// - /// 用户id + /// 用户角色集合 /// - public List SelectMenuListByUserId(SysMenu sysMenu, long userId) + public List SelectMenuListByRoles(SysMenu sysMenu, List roles) { - return Context.Queryable((menu, roleMenu, userRole, role) => new JoinQueryInfos( - JoinType.Left, menu.menuId == roleMenu.Menu_id, - JoinType.Left, roleMenu.Role_id == userRole.RoleId, - JoinType.Left, userRole.RoleId == role.RoleId - )) - .Where((menu, roleMenu, userRole, role) => userRole.UserId == userId) - .WhereIF(!string.IsNullOrEmpty(sysMenu.menuName), (menu, roleMenu, userRole, role) => menu.menuName.Contains(sysMenu.menuName)) - .WhereIF(!string.IsNullOrEmpty(sysMenu.visible), (menu, roleMenu, userRole, role) => menu.visible == sysMenu.visible) - .WhereIF(!string.IsNullOrEmpty(sysMenu.status), (menu, roleMenu, userRole, role) => menu.status == sysMenu.status) - .OrderBy((menu, roleMenu, userRole, role) => new { menu.parentId, menu.orderNum }) - //.Distinct() - .Select((menu, roleMenu, userRole, role) => menu).ToList(); + var roleMenus = Context.Queryable() + .Where(r => roles.Contains(r.Role_id)); + + return Context.Queryable() + .InnerJoin(roleMenus, (c, j) => c.menuId == j.Menu_id) + .Where((c, j) => c.status == "0") + .WhereIF(!string.IsNullOrEmpty(sysMenu.menuName), (c, j) => c.menuName.Contains(sysMenu.menuName)) + .WhereIF(!string.IsNullOrEmpty(sysMenu.visible), (c, j) => c.visible == sysMenu.visible) + .OrderBy((c, j) => new { c.parentId, c.orderNum }) + .Select(c => c) + .ToList(); } #region 左侧菜单树 @@ -68,11 +102,11 @@ namespace ZR.Repository.System /// /// 根据用户角色获取左侧菜单树 /// - /// + /// /// public List SelectMenuTreeByRoleIds(List roleIds) { - var menuTypes = new string[] { "M", "C"}; + var menuTypes = new string[] { "M", "C" }; return Context.Queryable((menu, roleMenu) => new JoinQueryInfos( JoinType.Left, menu.menuId == roleMenu.Menu_id )) diff --git a/ZR.Repository/System/SysRoleRepository.cs b/ZR.Repository/System/SysRoleRepository.cs index 7afb00c..861d340 100644 --- a/ZR.Repository/System/SysRoleRepository.cs +++ b/ZR.Repository/System/SysRoleRepository.cs @@ -2,6 +2,7 @@ using Infrastructure.Model; using SqlSugar; using System.Collections.Generic; +using System.Linq; using ZR.Model; using ZR.Model.System; @@ -110,6 +111,16 @@ namespace ZR.Repository.System return Context.Queryable().Where(it => it.Role_id == roleId).ToList(); } + /// + /// 根据用户所有角色获取菜单 + /// + /// + /// + public List SelectRoleMenuByRoleIds(long[] roleIds) + { + return Context.Queryable().Where(it => roleIds.Contains(it.Role_id)).ToList(); + } + /// /// 批量插入用户菜单 /// diff --git a/ZR.Service/System/IService/ISysFileService.cs b/ZR.Service/System/IService/ISysFileService.cs index e3971a3..6b8c319 100644 --- a/ZR.Service/System/IService/ISysFileService.cs +++ b/ZR.Service/System/IService/ISysFileService.cs @@ -16,7 +16,7 @@ namespace ZR.Service.System.IService /// /// 结果、地址、文件名 (bool, string, string) SaveFile(string picdir, IFormFile formFile); - + (bool, string, string) SaveFile(string picdir, IFormFile formFile, string customFileName); /// /// 按时间来创建文件夹 /// diff --git a/ZR.Service/System/IService/ISysMenuService.cs b/ZR.Service/System/IService/ISysMenuService.cs index 90aea34..a8bd620 100644 --- a/ZR.Service/System/IService/ISysMenuService.cs +++ b/ZR.Service/System/IService/ISysMenuService.cs @@ -8,34 +8,34 @@ namespace ZR.Service.System.IService { public interface ISysMenuService { - public List SelectMenuList(long userId); + //List SelectMenuList(long userId); - public List SelectMenuList(SysMenu menu, long userId); + List SelectMenuList(SysMenu menu, long userId); + List SelectTreeMenuList(SysMenu menu, long userId); - public SysMenu GetMenuByMenuId(int menuId); + SysMenu GetMenuByMenuId(int menuId); + int AddMenu(SysMenu menu); - public int AddMenu(SysMenu menu); + int EditMenu(SysMenu menu); - public int EditMenu(SysMenu menu); + int DeleteMenuById(int menuId); - public int DeleteMenuById(int menuId); + string CheckMenuNameUnique(SysMenu menu); - public string CheckMenuNameUnique(SysMenu menu); + int ChangeSortMenu(MenuDto menuDto); - public int ChangeSortMenu(MenuDto menuDto); + bool HasChildByMenuId(long menuId); - public bool HasChildByMenuId(long menuId); + List SelectMenuTreeByUserId(long userId); - public List SelectMenuTreeByUserId(long userId); + List SelectMenuPermsListByUserId(long userId); - public List SelectMenuPermsListByUserId(long userId); + List SelectMenuPermsByUserId(long userId); - public List SelectMenuPermsByUserId(long userId); + bool CheckMenuExistRole(long menuId); - public bool CheckMenuExistRole(long menuId); + List BuildMenus(List menus); - public List BuildMenus(List menus); - - public List BuildMenuTreeSelect(List menus); + List BuildMenuTreeSelect(List menus); } } diff --git a/ZR.Service/System/IService/ISysRoleService.cs b/ZR.Service/System/IService/ISysRoleService.cs index e2517b8..a0dd959 100644 --- a/ZR.Service/System/IService/ISysRoleService.cs +++ b/ZR.Service/System/IService/ISysRoleService.cs @@ -105,7 +105,7 @@ namespace ZR.Service.System.IService /// /// public List SelectUserRoleMenus(long roleId); - + List SelectRoleMenuByRoleIds(long[] roleIds); /// /// 获取用户角色列表 /// diff --git a/ZR.Service/System/SysFileService.cs b/ZR.Service/System/SysFileService.cs index e189b0f..dce4638 100644 --- a/ZR.Service/System/SysFileService.cs +++ b/ZR.Service/System/SysFileService.cs @@ -10,6 +10,7 @@ using System.Security.Cryptography; using System.Net; using ZR.Model.System; using ZR.Repository.System; +using Infrastructure.Extensions; namespace ZR.Service.System { @@ -35,9 +36,13 @@ namespace ZR.Service.System /// public (bool, string, string) SaveFile(string picdir, IFormFile formFile) { - // eg: idcard/2020/08/18 + return SaveFile(picdir, formFile, ""); + } + public (bool, string, string) SaveFile(string picdir, IFormFile formFile, string customFileName) + { + // eg: uploads/2020/08/18 string dir = GetdirPath(picdir.ToString()); - string tempName = HashFileName(); + string tempName = customFileName.IsEmpty() ? HashFileName() : customFileName; string fileExt = Path.GetExtension(formFile.FileName); string fileName = $"{tempName}{fileExt}"; string webUrl = $"{domainUrl}/{dir}/{fileName}"; @@ -46,7 +51,6 @@ namespace ZR.Service.System return (statusCode == HttpStatusCode.OK, webUrl, fileName); } - public string GetdirPath(string path = "") { DateTime date = DateTime.Now; diff --git a/ZR.Service/System/SysMenuService.cs b/ZR.Service/System/SysMenuService.cs index e2ec077..5225e66 100644 --- a/ZR.Service/System/SysMenuService.cs +++ b/ZR.Service/System/SysMenuService.cs @@ -4,7 +4,6 @@ using System.Linq; using ZR.Model.System.Dto; using ZR.Model.System; using ZR.Model.System.Vo; -using ZR.Model.Vo; using ZR.Model.Vo.System; using ZR.Repository.System; using ZR.Service.System.IService; @@ -30,31 +29,39 @@ namespace ZR.Service } /// - /// 根据用户查询系统菜单列表 + /// 获取所有菜单数(菜单管理) /// - /// - /// /// - public List SelectMenuList(long userId) + public List SelectTreeMenuList(SysMenu menu, long userId) { - return SelectMenuList(new SysMenu(), userId); + List menuList; + if (SysRoleService.IsAdmin(userId)) + { + menuList = MenuRepository.SelectTreeMenuList(menu); + } + else + { + var userRoles = SysRoleService.SelectUserRoles(userId); + menuList = MenuRepository.SelectTreeMenuListByUserId(menu, userRoles); + } + return menuList; } /// - /// 获取所有菜单(菜单管理) + /// 获取所有菜单列表 /// /// public List SelectMenuList(SysMenu menu, long userId) { List menuList; - //if (SysUser.IsAdmin(userId)) if (SysRoleService.IsAdmin(userId)) { menuList = MenuRepository.SelectMenuList(menu); } else { - menuList = MenuRepository.SelectMenuListByUserId(menu, userId); + var userRoles = SysRoleService.SelectUserRoles(userId); + menuList = MenuRepository.SelectMenuListByRoles(menu, userRoles); } return menuList; } diff --git a/ZR.Service/System/SysRoleService.cs b/ZR.Service/System/SysRoleService.cs index 02ce07c..cabc102 100644 --- a/ZR.Service/System/SysRoleService.cs +++ b/ZR.Service/System/SysRoleService.cs @@ -216,7 +216,7 @@ namespace ZR.Service /// /// 判断是否是管理员 /// - /// + /// /// public bool IsRoleAdmin(long roleid) { @@ -228,13 +228,25 @@ namespace ZR.Service /// /// 获取角色菜单id集合 /// - /// + /// /// public List SelectUserRoleMenus(long roleId) { var list = SysRoleRepository.SelectRoleMenuByRoleId(roleId); - return list.Select(x => x.Menu_id).ToList(); + return list.Select(x => x.Menu_id).Distinct().ToList(); + } + + /// + /// 根据用户所有角色获取菜单 + /// + /// + /// + public List SelectRoleMenuByRoleIds(long[] roleIds) + { + return SysRoleRepository.SelectRoleMenuByRoleIds(roleIds) + .Select(x => x.Menu_id) + .Distinct().ToList(); } /// @@ -270,6 +282,11 @@ namespace ZR.Service return list.Select(x => x.RoleKey).ToList(); } + /// + /// 获取用户所有角色名 + /// + /// + /// public List SelectUserRoleNames(long userId) { var list = SelectUserRoleListByUserId(userId); diff --git a/ZR.Vue/src/api/common.js b/ZR.Vue/src/api/common.js index a13d608..c57228f 100644 --- a/ZR.Vue/src/api/common.js +++ b/ZR.Vue/src/api/common.js @@ -2,7 +2,7 @@ import request from '@/utils/request' export function upload(data) { return request({ - url: '/upload/saveFile', + url: '/common/UploadFile', method: 'POST', data: data, headers: { "Content-Type": "multipart/form-data" }, diff --git a/ZR.Vue/src/components/FileUpload/index.vue b/ZR.Vue/src/components/FileUpload/index.vue index 0bba384..80129f2 100644 --- a/ZR.Vue/src/components/FileUpload/index.vue +++ b/ZR.Vue/src/components/FileUpload/index.vue @@ -58,7 +58,7 @@ export default { // 上传地址 uploadUrl: { type: String, - default: process.env.VUE_APP_UPLOAD_URL ?? "/Common/UploadFile", + default: process.env.VUE_APP_UPLOAD_URL, }, // form 列名 column: [String], @@ -100,6 +100,12 @@ export default { deep: true, immediate: true, }, + uploadUrl: { + handler(val){ + this.uploadFileUrl = process.env.VUE_APP_BASE_API + val; + }, + immediate: true + } }, computed: { // 是否显示提示 @@ -156,7 +162,7 @@ export default { } this.msgSuccess("上传成功"); this.fileList.push({ name: res.data.fileName, url: res.data.url, path: res.data.path }); - this.$emit("input", this.column, this.listToString(this.fileList)); + this.$emit("input", this.column, this.listToString(this.fileList), res.data); }, // 上传进度 uploadProcess(event, file, fileList) { diff --git a/ZR.Vue/src/components/IconSelect/index.vue b/ZR.Vue/src/components/IconSelect/index.vue index b0ec9fa..af98224 100644 --- a/ZR.Vue/src/components/IconSelect/index.vue +++ b/ZR.Vue/src/components/IconSelect/index.vue @@ -4,6 +4,7 @@ + 清空
diff --git a/ZR.Vue/src/views/system/article/publish.vue b/ZR.Vue/src/views/system/article/publish.vue index ee0f860..ac9a245 100644 --- a/ZR.Vue/src/views/system/article/publish.vue +++ b/ZR.Vue/src/views/system/article/publish.vue @@ -128,10 +128,9 @@ export default { $imgAdd(pos, $file) { var formdata = new FormData(); formdata.append("file", $file); - // 这里没有服务器供大家尝试,可将下面上传接口替换为你自己的服务器接口 upload(formdata).then((res) => { console.log(JSON.stringify(res)); - this.$refs.md.$img2Url(pos, res.data); + this.$refs.md.$img2Url(pos, res.data.url); }); }, change(value, render) { diff --git a/ZR.Vue/src/views/system/menu/index.vue b/ZR.Vue/src/views/system/menu/index.vue index a097dce..45fd1b2 100644 --- a/ZR.Vue/src/views/system/menu/index.vue +++ b/ZR.Vue/src/views/system/menu/index.vue @@ -52,10 +52,10 @@ -