一. DB設計
1. 說明
框架的基礎功能包括:用戶管理、角色管理、登錄日志、操作日志模塊,1個角色可以配置多個權限,1個用戶可以配置多個角色,相關表設計如下,大致思路:登錄→根據userId拿到所有角色Id→獲取所有角色Id對應的權限信息→對這些權限信息去重。
2.詳細結構分享
(1). 用戶表
(2). 角色表
(3). 菜單權限表
(4). 用戶-角色關聯表
(5). 角色-菜單權限關聯表
(6). 操作日志表
(7). 登錄日志表
二. 業務接口編寫
1. 說明
控制器按區域存放,路由匹配規則為:[Route("Api/[area]/[controller]/[action]")],相關接口設計詳見下面代碼,在后續章節將結合EasyUI框架中的各種組件來分析接口業務。
2. 詳細接口分享
(1). 主控制器- SysMainApiController

[Area("AdminApi_Areas")] [Route("Api/[area]/[controller]/[action]")] [SkipLogin] public class SysMainApiController : Controller { public IBaseService _baseService; public IConfiguration _configuration; public SysMainApiController(IBaseService baseService, IConfiguration configuration) { this._baseService = baseService; this._configuration = configuration; } #region 01-校驗登錄 /// <summary> /// 校驗登錄 /// </summary> /// <param name="userAccount">賬號</param> /// <param name="passWord">密碼</param> /// <returns></returns> [SkipAll] public IActionResult CheckLogin(string userAccount, string passWord) { try { //1.校驗賬號是否存在 var userInfor = _baseService.Entities<T_SysUser>().Where(u => u.userAccount == userAccount).FirstOrDefault(); if (userInfor != null) { //2. 賬號和密碼是否匹配 var passWord1 = SecurityHelp.SHA(passWord); if (passWord1.Equals(userInfor.userPwd, StringComparison.InvariantCultureIgnoreCase)) { //3. 產生token進行返回 //過期時間(可以不設置,下面表示簽名后 12個小時過期) double exp = (DateTime.UtcNow.AddHours(12) - new DateTime(1970, 1, 1)).TotalSeconds; //進行組裝 var payload = new Dictionary<string, object> { {"userId", userInfor.id }, {"userAccount", userInfor.userAccount }, {"exp",exp } }; var token = JWTHelp.JWTJiaM(payload, _configuration["JWTSecret"]); //4.記錄登錄日志 T_SysLoginLog sysLoginLog = new T_SysLoginLog() { id = Guid.NewGuid().ToString("N"), userId = userInfor.id, userAccount = userInfor.userAccount, loginTime = DateTime.Now, delFlag = 0, loginIp = HttpContext.Connection.RemoteIpAddress.ToString() }; _baseService.Add(sysLoginLog); return Json(new { status = "ok", msg = "登錄成功", data = token }); } else { //密碼不正確 return Json(new { status = "error", msg = "密碼不正確", data = "" }); } } else { return Json(new { status = "error", msg = "賬號不存在", data = "" }); }; } catch (Exception ex) { LogUtils.Error(ex); ; return Json(new { status = "error", msg = "登錄失敗", data = "" }); } } #endregion #region 02-獲取左側菜單權限結構(EasyUI版本)【已修改】 /// <summary> /// 獲取權限信息 /// </summary> /// <returns></returns> [HttpPost] public async Task<string> GetEasyLeftMenu() { try { var jwtData = JsonHelp.ToObject<JwtData>(ControllerContext.RouteData.Values["auth"].ToString()); var userId = jwtData.userId; //根據用戶Id,查出來所有的角色,然后把所有角色對應的權限id查出來並去重 var data1 = _baseService.Entities<T_SysUserRole>(); var data2 = _baseService.Entities<T_SysRolePer>(); var data = await (from a in data1 join b in data2 on a.roleId equals b.roleId where a.userId == userId select b).Select(p => p.perId).Distinct().ToListAsync(); //根據權限Id組裝固定格式的權限信息進行反饋 var perList = await _baseService.GetListByAsync<T_SysPermisson>(u => u.delFlag == 0 && data.Contains(u.id)); List<EasyUiMenuInfor> menuList = GetOwnAllPer(perList, "1"); return JsonHelp.ToJsonString(menuList); } catch (Exception ex) { LogUtils.Error(ex); return ""; } } /// <summary> /// 獲取所有自己的菜單信息 /// </summary> /// <param name="perList">所有的自己的菜單權限</param> /// <param name="parentId">父菜單id</param> /// <returns></returns> public List<EasyUiMenuInfor> GetOwnAllPer(List<T_SysPermisson> perList, string parentId) { var perListMain = perList.Where(p => p.parentId == parentId).OrderBy(u => u.sortFlag).ToList(); if (perListMain.Count() > 0) { //最新的組裝形式 List<EasyUiMenuInfor> menuList = new List<EasyUiMenuInfor>(); foreach (var item in perListMain) { EasyUiMenuInfor menuItem = new EasyUiMenuInfor(); menuItem.id = item.id; menuItem.text = item.menuName; var myUrl = item.frontUrl; menuItem.attributes = myUrl; menuItem.iconCls = item.iconClassName; menuItem.children = GetChildPer(perList, item.id); menuItem.state = menuItem.children.Count() == 0 ? "open" : "closed"; menuList.Add(menuItem); } return menuList; } else { return new List<EasyUiMenuInfor>(); //返回空集合 } } /// <summary> /// 獲取所有的子菜單權限 /// </summary> /// <param name="perList"></param> /// <param name="childId"></param> /// <returns></returns> public List<EasyUiMenuInfor> GetChildPer(List<T_SysPermisson> perList, string childId) { var perListMain = perList.Where(p => p.parentId == childId).OrderBy(u => u.sortFlag).ToList(); if (perListMain.Count() > 0) { return GetOwnAllPer(perList, childId); } else { return new List<EasyUiMenuInfor>(); //返回空集合 } } #endregion }
(2). 用戶相關控制器-SysUserApiController

[Area("AdminApi_Areas")] [Route("Api/[area]/[controller]/[action]")] [SkipLogin] public class SysUserApiController : Controller { public IBaseService _baseService; public SysUserApiController(IBaseService baseService) { this._baseService = baseService; } #region 01-條件查詢用戶信息【已修改】 /// <summary> /// 條件查詢用戶信息 /// </summary> /// <param name="userAccount">賬號</param> /// <param name="userRealName">姓名</param> /// <param name="userPhone">電話</param> /// <param name="userSex">性別</param> /// <param name="pc">頁面分頁查詢 封裝實體</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> GetUserInforByCondition(string userAccount, string userRealName, string userPhone, int? userSex, PagingClass pc) { try { //1. 數據源 var data = _baseService.EntitiesNoTrack<T_SysUser>().Where(u => u.delFlag == 0); #region 2. 條件搜索 //2. 條件搜索 //2.1 賬號 if (!string.IsNullOrEmpty(userAccount)) { data = data.Where(u => u.userAccount.Contains(userAccount)); } //2.2 姓名 if (!string.IsNullOrEmpty(userRealName)) { data = data.Where(u => u.userRealName.Contains(userRealName)); } //2.3 電話 if (!string.IsNullOrEmpty(userPhone)) { data = data.Where(u => u.userPhone.Contains(userPhone)); } //2.4 性別 if (userSex != null && userSex != -1) { data = data.Where(u => u.userSex == userSex); } #endregion //3. 總條數 int totalCount = await data.CountAsync(); if (totalCount == 0) { return Json(new { total = 0, rows = "" }); } //4. 列排序 //此處默認是根據addTime降序排列,如需修改,在此處修改 pc.order = string.IsNullOrEmpty(pc.order) ? "Desc" : pc.order; pc.sort = string.IsNullOrEmpty(pc.sort) ? "addTime" : pc.sort; data = data.DataSorting(pc.sort, pc.order); //5. 分頁 data = data.Skip((pc.page - 1) * pc.rows).Take(pc.rows); //6. 按需查詢 var pageData = await (from a in data select new { a.id, a.userAccount, a.userRealName, a.userSex, a.userPhone, a.userRemark, a.addTime }).ToListAsync(); //7. 返回數據 //7.判斷是否有數據 if (pageData.Count() == 0) { return Json(new { total = 0, rows = "" }); } else { return Json(new { total = totalCount, rows = pageData }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { total = 0, rows = "" }); } } #endregion #region 02-新增用戶【已修改】 /// <summary> /// 新增用戶 /// </summary> /// <param name="tSysUser">用戶實體</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> AddUser(T_SysUser tSysUser) { try { var Num = await _baseService.EntitiesNoTrack<T_SysUser>().Where(u => u.userAccount == tSysUser.userAccount).CountAsync(); if (Num > 0) { return Json(new { status = "error", msg = "賬號重復", data = "" }); } tSysUser.id = Guid.NewGuid().ToString("N"); tSysUser.userPwd = SecurityHelp.SHA(tSysUser.userPwd); tSysUser.addTime = DateTime.Now; tSysUser.delFlag = 0; var saveCount = await _baseService.AddAsync(tSysUser); if (saveCount > 0) { return Json(new { status = "ok", msg = "增加成功", data = "" }); } } catch (Exception ex) { LogUtils.Error(ex); } return Json(new { status = "error", msg = "增加失敗", data = "" }); } #endregion #region 03-修改用戶【已修改】 /// <summary> /// 修改用戶 /// </summary> /// <param name="tSysUser">用戶實體</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> EditUser(T_SysUser tSysUser) { try { //判斷賬號是否重復 var count = await _baseService.EntitiesNoTrack<T_SysUser>().Where(u => u.id != tSysUser.id && u.userAccount == tSysUser.userAccount).CountAsync(); if (count > 0) { return Json(new { status = "error", msg = "賬號重復", data = "" }); } else { var user1 = await _baseService.Entities<T_SysUser>().Where(u => u.id == tSysUser.id).FirstOrDefaultAsync(); user1.userAccount = tSysUser.userAccount; //判斷是否修改過密碼 user1.userPwd = tSysUser.userPwd.Equals("******") ? user1.userPwd : SecurityHelp.SHA(tSysUser.userPwd); user1.userRealName = tSysUser.userRealName; user1.userSex = tSysUser.userSex; user1.userPhone = tSysUser.userPhone; user1.userRemark = tSysUser.userRemark; var saveCount = await _baseService.ModifyAsync(user1); //修改的位置不需要判斷是否大於0,可能是原值修改 return Json(new { status = "ok", msg = "修改成功", data = "" }); } } catch (Exception ex) { LogUtils.Error(ex); } return Json(new { status = "error", msg = "修改失敗", data = "" }); } #endregion #region 04-刪除用戶【已修改】 /// <summary> /// 刪除用戶 /// </summary> /// <param name="delIds">刪除用的用戶編號ID數組</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> DelUser(string[] delIds) { try { //1. 刪除用戶 await _baseService.DelByNoAsync<T_SysUser>(u => delIds.Contains(u.id)); //2. 刪除用戶和角色之間的關聯 await _baseService.DelByNoAsync<T_SysUserRole>(u => delIds.Contains(u.userId)); int count = await _baseService.SaveChangeAsync(); if (count >= 0) { return Json(new { status = "ok", msg = "刪除成功", data = "" }); } } catch (Exception ex) { LogUtils.Error(ex); } return Json(new { status = "error", msg = "刪除失敗", data = "" }); } #endregion #region 05-設置用戶角色信息【已修改】 /// <summary> /// 設置用戶角色信息 /// </summary> /// <param name="userId">用戶編號ID</param> /// <param name="roleIds">角色編號ID數組</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> SetUserRoles(string userId, string[] roleIds) { try { //1. 先把該用戶對應的角色信息都刪掉 await _baseService.DelByNoAsync<T_SysUserRole>(u => u.userId == userId); //2. 綁定新的角色信息 var nowTime = DateTime.Now; for (int i = 0; i < roleIds.Length; i++) { T_SysUserRole sysUserRole = new T_SysUserRole() { id = Guid.NewGuid().ToString("N"), userId = userId, roleId = roleIds[i], addTime = nowTime }; await _baseService.AddNoAsync(sysUserRole); } int saveCount = await _baseService.SaveChangeAsync(); if (saveCount >= 0) { return Json(new { status = "ok", msg = "設置成功", data = "" }); } } catch (Exception ex) { LogUtils.Error(ex); } return Json(new { status = "error", msg = "設置失敗", data = "" }); } #endregion #region 06-導出Excel表格【已修改】 /// <summary> /// 導出Excel表格 /// </summary> /// <param name="userAccount">賬號</param> /// <param name="userRealName">姓名</param> /// <param name="userPhone">電話</param> /// <param name="userSex">性別</param> /// <param name="pc">頁面分頁查詢 封裝實體</param> /// <param name="_hostingEnvironment">注入的IWebHostEnvironment對象</param> /// <returns></returns> public async Task<FileResult> DownLoadFileExcel(string userAccount, string userRealName, string userPhone, int? userSex, PagingClass pc, [FromServices] IWebHostEnvironment _hostingEnvironment) { try { List<T_SysUser> exportData = new List<T_SysUser>(); //獲取需要導出的數據 { //1. 數據源 var data = _baseService.EntitiesNoTrack<T_SysUser>().Where(u => u.delFlag == 0); #region 2. 條件搜索 //2. 條件搜索 //2.1 賬號 if (!string.IsNullOrEmpty(userAccount)) { data = data.Where(u => u.userAccount.Contains(userAccount)); } //2.2 姓名 if (!string.IsNullOrEmpty(userRealName)) { data = data.Where(u => u.userRealName.Contains(userRealName)); } //2.3 電話 if (!string.IsNullOrEmpty(userPhone)) { data = data.Where(u => u.userPhone.Contains(userPhone)); } //2.4 性別 if (userSex != null && userSex != -1) { data = data.Where(u => u.userSex == userSex); } #endregion //3. 列排序 //此處默認是根據addTime降序排列,如需修改,在此處修改 pc.order = string.IsNullOrEmpty(pc.order) ? "Desc" : pc.order; pc.sort = string.IsNullOrEmpty(pc.sort) ? "addTime" : pc.sort; data = data.DataSorting(pc.sort, pc.order); exportData = await data.ToListAsync(); } //4. 創建Excel相關的信息 //4.1 目錄相關 var myPath = _hostingEnvironment.ContentRootPath + @"\DownLoad\Excel\"; if (!Directory.Exists(myPath)) { Directory.CreateDirectory(myPath); } string pathFileName = myPath + $"{DateTime.Now.ToString("yyyyMMddHHmmssffffff")}.xlsx"; FileInfo newFile = new FileInfo(pathFileName); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(pathFileName); } //4.2 創建Excel ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; using (ExcelPackage package = new ExcelPackage(newFile)) { //sheet名稱 ExcelWorksheet workSheet = package.Workbook.Worksheets.Add("用戶信息"); //設置標題 string[] titleArry = { "賬號", "姓名", "性別", "電話", "說明", "添加時間" }; for (int i = 0; i < titleArry.Length; i++) { workSheet.Cells[1, i + 1].Value = titleArry[i]; } //設置列寬 int[] columnWidthArry = { 30, 15, 5, 30, 40, 30 }; for (int i = 0; i < columnWidthArry.Length; i++) { workSheet.Column(i + 1).Width = columnWidthArry[i]; } //單元格內容賦值 int row = 2; foreach (var item in exportData) { workSheet.Cells[row, 1].Value = item.userAccount; workSheet.Cells[row, 2].Value = item.userRealName; workSheet.Cells[row, 3].Value = item.userSex == 0 ? "女" : "男"; workSheet.Cells[row, 4].Value = item.userPhone; workSheet.Cells[row, 5].Value = item.userRemark; workSheet.Cells[row, 6].Value = item.addTime; workSheet.Cells[row, 6].Style.Numberformat.Format = "yyyy-MM-dd HH:mm:ss"; row++; } workSheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; //水平居中 await package.SaveAsync(); } //5. 返回下載內容 string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".xlsx"; //展現給用戶看的文件名 return PhysicalFile(pathFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName); } catch (Exception ex) { LogUtils.Error(ex); return PhysicalFile("", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ""); } } #endregion #region 07-得到可用的所有角色信息【已修改】 /// <summary> /// 得到可用的所有角色信息 /// </summary> /// <returns>角色信息Json字符串</returns> [HttpPost] public async Task<IActionResult> GetAllRoleList() { try { var rolesList = await _baseService.EntitiesNoTrack<T_SysRole>().Where(a => a.delFlag == 0).Select(a => new { roleId = a.id, roleName = a.roleName }).ToListAsync(); return Json(rolesList); } catch (Exception ex) { LogUtils.Error(ex); return Content(""); //沒實際作用 } } #endregion #region 08-根據用戶編號得到角色ID信息【已修改】 /// <summary> /// 根據用戶編號得到角色ID信息 /// <param name="userId">用戶編號ID</param> /// </summary> /// <returns></returns> [HttpPost] public async Task<IActionResult> GetRoleIdByUserId(string userId) { try { //1.查詢該用戶對應的角色id的信息 List<string> listRoleIds = await _baseService.EntitiesNoTrack<T_SysUserRole>() .Where(ur => ur.userId == userId) .Select(ur => ur.roleId) .ToListAsync(); return Json(listRoleIds); } catch (Exception ex) { LogUtils.Error(ex); return Content(""); //沒實際作用 } } #endregion }
(3). 角色相關控制器-SysRoleApiController

[Area("AdminApi_Areas")] [Route("Api/[area]/[controller]/[action]")] [SkipLogin] public class SysRoleApiController : Controller { public IBaseService _baseService; public SysRoleApiController(IBaseService baseService) { this._baseService = baseService; } /*****************************接口調用**************************************/ #region 01-角色管理首頁列表【已修改】 /// <summary> /// 角色管理首頁列表 /// </summary> /// <param name="pc">頁面分頁查詢 封裝實體</param> /// <param name="tSysRole">角色實體</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> GetRoleTableList(PagingClass pc, T_SysRole tSysRole) { try { //獲取數據 var data = _baseService.EntitiesNoTrack<T_SysRole>().AsQueryable(); //2.篩選條件 //角色名稱 if (!string.IsNullOrEmpty(tSysRole.roleName)) { data = data.Where(u => u.roleName.Contains(tSysRole.roleName)); } //添加日期 if (!string.IsNullOrEmpty(pc.operDateStart)) { var startTime = Convert.ToDateTime(pc.operDateStart); data = data.Where(u => u.addTime >= startTime); } if (!string.IsNullOrEmpty(pc.operDateEnd)) { var endTime = Convert.ToDateTime(pc.operDateEnd); data = data.Where(u => u.addTime <= endTime); } //3. 總條數 int totalCount = await data.CountAsync(); if (totalCount == 0) { return Json(new { total = 0, rows = "" }); } //4.列排序 //此處默認是根據addTime降序排列,如需修改,在此處修改 pc.order = string.IsNullOrEmpty(pc.order) ? "Desc" : pc.order; pc.sort = string.IsNullOrEmpty(pc.sort) ? "addTime" : pc.sort; data = data.DataSorting(pc.sort, pc.order); //5.分頁 data = data.Skip((pc.page - 1) * pc.rows).Take(pc.rows); //6. 按需查詢 var pageData = await (from a in data select new { a.id, a.roleName, a.roleRemark, a.addTime }).ToListAsync(); //7.判斷是否有數據 if (pageData.Count() == 0) { return Json(new { total = 0, rows = "" }); } else { return Json(new { total = totalCount, rows = pageData }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { total = 0, rows = "" }); } } #endregion #region 02-添加角色【已修改】 /// <summary> /// 添加角色 /// </summary> /// <param name="sysRoleInfor">角色實體</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> AddRole(T_SysRole sysRoleInfor) { try { var Num =await _baseService.EntitiesNoTrack<T_SysRole>().Where(u => u.roleName == sysRoleInfor.roleName).CountAsync(); if (Num > 0) { return Json(new { status = "error", msg = "角色名重復", data = "" }); } sysRoleInfor.id = Guid.NewGuid().ToString("N"); sysRoleInfor.addTime = DateTime.Now; sysRoleInfor.delFlag = 0; _baseService.AddNo(sysRoleInfor); int flag = await _baseService.SaveChangeAsync(); if (flag > 0) { return Json(new { status = "ok", msg = "新增成功", data = "" }); } else { return Json(new { status = "error", msg = "新增失敗", data = "" }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { status = "error", msg = "新增失敗" }); } } #endregion #region 03-修改角色【已修改】 /// <summary> /// 修改角色 /// </summary> /// <param name="tSysRole">數據庫角色實體</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> EditRole(T_SysRole tSysRole) { try { //1. 判斷角色名是否重復 var count = await _baseService.EntitiesNoTrack<T_SysRole>().Where(u => u.roleName == tSysRole.roleName && u.id != tSysRole.id).CountAsync(); if (count > 0) { return Json(new { status = "error", msg = "角色名重復", data = "" }); } //2. 修改角色信息 var role =await _baseService.Entities<T_SysRole>().Where(u => u.id == tSysRole.id).FirstOrDefaultAsync(); role.roleName = tSysRole.roleName; role.roleRemark = tSysRole.roleRemark; int flag =await _baseService.SaveChangeAsync(); //修改的位置不需要判斷是否大於0,可能是原值修改 return Json(new { status = "ok", msg = "修改成功", data = "" }); } catch (Exception ex) { LogUtils.Error(ex); return Json(new { status = "error", msg = "修改失敗" }); } } #endregion #region 04-刪除角色【已修改】 /// <summary> /// 刪除角色 /// </summary> /// <param name="delIds">刪除角色編號集合</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> DelRole(List<string> delIds) { try { //刪除角色 var listDel =await _baseService.EntitiesNoTrack<T_SysRole>().Where(u => delIds.Contains(u.id)).ToListAsync(); listDel.ForEach(item => { _baseService.DelNo(item); }); //刪除用戶關聯 var listuserDel = await _baseService.EntitiesNoTrack<T_SysUserRole>().Where(u => delIds.Contains(u.roleId)).ToListAsync(); listuserDel.ForEach(item => { _baseService.DelNo(item); }); //刪除角色權限之間的關聯 var listPerDel = await _baseService.EntitiesNoTrack<T_SysRolePer>().Where(u => delIds.Contains(u.roleId)).ToListAsync(); listPerDel.ForEach(item => { _baseService.DelNo(item); }); int flag =await _baseService.SaveChangeAsync(); if (flag > 0) { return Json(new { status = "ok", msg = "刪除成功" }); } else { return Json(new { code = "error", msg = "刪除失敗" }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { status = "error", msg = "刪除失敗" }); } } #endregion #region 05-獲取權限列表【已修改】 /// <summary> /// 獲取權限列表 /// </summary> /// <param name="roleId">角色編號id</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> GetAllPersForTree(string roleId) { try { List<T_SysPermisson> listPers =await _baseService.EntitiesNoTrack<T_SysPermisson>().Where(u => u.delFlag == 0).OrderBy(a => a.sortFlag).ToListAsync(); //一級權限 var onePerList = listPers.Where(u => u.parentId == "1").OrderBy(u => u.sortFlag).ToList(); //2. 獲取該角色自身的權限id var ownPerIds =await _baseService.EntitiesNoTrack<T_SysRolePer>().Where(u => u.roleId == roleId).Select(u => u.perId).ToListAsync(); //遞歸調用 TreeInfor[] treeArry = GetAllTreeList(listPers, "1", ownPerIds); return Json(treeArry); } catch (Exception ex) { LogUtils.Error(ex); return Json(""); } } #endregion #region 06-設置權限【已修改】 /// <summary> /// 設置權限 /// </summary> /// <param name="roleId">角色編號id</param> /// <param name="perIds">權限編號id集合</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> SetPer(string roleId, string[] perIds) { try { //1. 先把該角色對應的所有權限信息刪掉 var delList =await _baseService.EntitiesNoTrack<T_SysRolePer>().Where<T_SysRolePer>(u => u.roleId == roleId).ToListAsync(); delList.ForEach(item => { _baseService.DelNo(item); }); //2. 綁定新的權限信息 var nowTime = DateTime.Now; for (int i = 0; i < perIds.Length; i++) { T_SysRolePer sysRolePer = new T_SysRolePer() { id = Guid.NewGuid().ToString("N"), roleId = roleId, perId = perIds[i], addTime = nowTime }; await _baseService.AddNoAsync(sysRolePer); } int count =await _baseService.SaveChangeAsync(); if (count > 0) { return Json(new { status = "ok", msg = "設置成功", data = "" }); } else { return Json(new { status = "error", msg = "設置失敗", data = "" }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { status = "error", msg = "設置失敗", data = "" }); } } #endregion #region 07-導出Excel表格【已修改】 /// <summary> /// 導出Excel表格 /// </summary> /// <param name="modelParam">角色參數幫助類</param> /// <param name="_hostingEnvironment">注入本地環境變量</param> /// <returns></returns> public async Task<FileResult> DownLoadFileExcel(PagingClass pc, T_SysRole tSysRole, [FromServices] IWebHostEnvironment _hostingEnvironment) { try { List<T_SysRole> exportData = new List<T_SysRole>(); //1. 獲取需要導出的數據 { //1.1獲取數據 var data = _baseService.EntitiesNoTrack<T_SysRole>().AsQueryable(); //1.2 篩選條件 //角色名稱 if (!string.IsNullOrEmpty(tSysRole.roleName)) { data = data.Where(u => u.roleName.Contains(tSysRole.roleName)); } //添加日期 if (!string.IsNullOrEmpty(pc.operDateStart)) { var startTime = Convert.ToDateTime(pc.operDateStart); data = data.Where(u => u.addTime >= startTime); } if (!string.IsNullOrEmpty(pc.operDateEnd)) { var endTime = Convert.ToDateTime(pc.operDateEnd); data = data.Where(u => u.addTime <= endTime); } //1.3.列排序 //此處默認是根據addTime降序排列,如需修改,在此處修改 pc.order = string.IsNullOrEmpty(pc.order) ? "Desc" : pc.order; pc.sort = string.IsNullOrEmpty(pc.sort) ? "addTime" : pc.sort; data = data.DataSorting(pc.sort, pc.order); exportData = await data.ToListAsync(); } //2. 創建Excel相關的信息 //2.1 目錄相關 var myPath = _hostingEnvironment.ContentRootPath + @"\DownLoad\Excel\"; if (!Directory.Exists(myPath)) { Directory.CreateDirectory(myPath); } string pathFileName = myPath + $"{DateTime.Now.ToString("yyyyMMddHHmmssffffff")}.xlsx"; FileInfo newFile = new FileInfo(pathFileName); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(pathFileName); } //2.2 創建Excel using (ExcelPackage package = new ExcelPackage(newFile)) { //sheet名稱 ExcelWorksheet workSheet = package.Workbook.Worksheets.Add("角色信息"); //設置標題 string[] titleArry = { "角色名稱", "角色備注", "添加時間" }; for (int i = 0; i < titleArry.Length; i++) { workSheet.Cells[1, i + 1].Value = titleArry[i]; } //設置列寬 int[] columnWidthArry = { 30, 45, 20 }; for (int i = 0; i < columnWidthArry.Length; i++) { workSheet.Column(i + 1).Width = columnWidthArry[i]; } //單元格內容賦值 int row = 2; foreach (var item in exportData) { workSheet.Cells[row, 1].Value = item.roleName; workSheet.Cells[row, 2].Value = item.roleRemark; workSheet.Cells[row, 3].Value = item.addTime; workSheet.Cells[row, 3].Style.Numberformat.Format = "yyyy-MM-dd HH:mm:ss"; row++; } workSheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; //水平居中 await package.SaveAsync(); } //3. 返回下載內容 string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".xlsx"; //展現給用戶看的文件名 return PhysicalFile(pathFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName); } catch (Exception ex) { LogUtils.Error(ex); return PhysicalFile("", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ""); } } #endregion #region 08-獲取角色下用戶【已修改】 /// <summary> /// 獲取角色下用戶 /// </summary> /// <param name="pc">頁面分頁查詢 封裝實體</param> /// <param name="tSysRole">角色實體</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> GetRoleUser(PagingClass pc, T_SysRole tSysRole) { try { //1.獲取角色下用戶 var userRoleData = _baseService.EntitiesNoTrack<T_SysUserRole>().Where(u => u.roleId == tSysRole.id); var userData = _baseService.EntitiesNoTrack<T_SysUser>(); var data = from user in userData join roleu in userRoleData on user.id equals roleu.userId select new { id = roleu.id, userAccount = user.userAccount, userRealName = user.userRealName, userSex = user.userSex, userPhone = user.userPhone, userRemark = user.userRemark, addTime = user.addTime }; //2. 總條數 int totalCount =await data.CountAsync(); if (totalCount == 0) { return Json(new { total = 0, rows = "" }); } //3.分頁 var pageData = await data.OrderBy(b => b.addTime).Skip((pc.page - 1) * pc.rows).Take(pc.rows).ToListAsync(); //4.判斷是否有數據 if (pageData.Count() == 0) { return Json(new { total = 0, rows = "" }); } else { return Json(new { total = totalCount, rows = pageData }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { total = 0, rows = "" }); } } #endregion #region 09-刪除角色下用戶【已修改】 /// <summary> /// 刪除角色下用戶 /// </summary> /// <param name="delIds">角色用戶關聯編號集合</param> /// <returns></returns> [HttpPost] public async Task<IActionResult> DelRoleUser(List<string> delIds) { try { //根據角色用戶關聯編號id進行刪除關聯數據 var data =await _baseService.EntitiesNoTrack<T_SysUserRole>().Where(u => delIds.Contains(u.id)).ToListAsync(); data.ForEach(item => { _baseService.DelNo(item); }); int flag =await _baseService.SaveChangeAsync(); if (flag > 0) { return Json(new { status = "ok", msg = "刪除成功" }); } else { return Json(new { status = "error", msg = "刪除失敗" }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { status = "error", msg = "刪除失敗" }); } } #endregion /**************************************方法封裝******************************************/ #region 01-獲取所有的樹形菜單 /// <summary> /// 獲取所有的樹形菜單 /// </summary> /// <param name="pAllList">所有的權限信息</param> /// <param name="parentId">所需最高級的父級id</param> /// <param name="ownPerIds">當前角色的權限ID</param> /// <returns></returns> private TreeInfor[] GetAllTreeList(List<T_SysPermisson> pAllList, string parentId, List<string> ownPerIds) { var data = pAllList.Where(u => u.parentId == parentId).OrderBy(u => u.sortFlag).ToList(); List<TreeInfor> myNeedList = new List<TreeInfor>(); if (data.Count() > 0) { foreach (var item in data) { TreeInfor treeChild = new TreeInfor(); treeChild.id = item.id; treeChild.title = item.menuName; treeChild.children = GetChildList(pAllList, item.id, ownPerIds); if (treeChild.children.Length == 0) { treeChild.@checked = ownPerIds.Contains(item.id) ? true : false; //只要該節點下還有子菜單,就不能設置它,要根據子菜單下的選中狀態來決定 } myNeedList.Add(treeChild); } return myNeedList.ToArray(); } else { return new TreeInfor[] { }; //返回空數組 } } #endregion #region 02-獲取子菜單 /// <summary> /// 獲取子菜單 /// </summary> /// <param name="pAllList">所有的權限信息</param> /// <param name="childPerId">子菜單權限Id</param> /// <param name="ownPerIds">當前角色的權限ID</param> /// <returns></returns> private TreeInfor[] GetChildList(List<T_SysPermisson> pAllList, string childPerId, List<string> ownPerIds) { var data = pAllList.Where(u => u.parentId == childPerId).OrderBy(u => u.sortFlag).ToList(); if (data.Count() > 0) { return GetAllTreeList(pAllList, childPerId, ownPerIds); } else { return new TreeInfor[] { }; //返回空數組 } } #endregion }
(4). 登錄日志相關控制器-SysLoginLogApiController

[Area("AdminApi_Areas")] [Route("Api/[area]/[controller]/[action]")] [SkipLogin] /// <summary> /// 登錄日志接口 /// </summary> public class SysLoginLogApiController : Controller { public IBaseService _baseService; public SysLoginLogApiController(IBaseService baseService) { this._baseService = baseService; } #region 01-獲取登錄日志信息(已修改) /// <summary> /// 獲取登錄日志信息 /// </summary> /// <param name="pc">表格信息</param> /// <param name="tSysLoginLog">日志實體,接收查詢參數</param> /// <returns></returns> public async Task<JsonResult> GetLoginLogInfor(PagingClass pc, T_SysLoginLog tSysLoginLog) { try { //1. 數據源 var data = _baseService.EntitiesNoTrack<T_SysLoginLog>().Where(u => u.delFlag == 0); //2. 條件搜索 //2.1 登錄賬號 if (!string.IsNullOrEmpty(tSysLoginLog.userAccount)) { data = data.Where(u => u.userAccount.Contains(tSysLoginLog.userAccount)); } //2.2 登錄ip if (!string.IsNullOrEmpty(tSysLoginLog.loginIp)) { data = data.Where(u => u.loginIp.Contains(tSysLoginLog.loginIp)); } //2.3 登錄時間 if (!string.IsNullOrEmpty(pc.operDateStart)) { var startTime = Convert.ToDateTime(pc.operDateStart); data = data.Where(u => u.loginTime >= startTime); } if (!string.IsNullOrEmpty(pc.operDateEnd)) { var endTime = Convert.ToDateTime(pc.operDateEnd); data = data.Where(u => u.loginTime <= endTime); } //3. 總條數 int totalCount = await data.CountAsync(); if (totalCount == 0) { return Json(new { total = 0, rows = "" }); } //4.列排序 //此處默認是根據時間降序排列,如需修改,在此處修改 pc.order = string.IsNullOrEmpty(pc.order) ? "Desc" : pc.order; pc.sort = string.IsNullOrEmpty(pc.sort) ? "loginTime" : pc.sort; data = data.DataSorting(pc.sort, pc.order); //5.分頁 data = data.Skip((pc.page - 1) * pc.rows).Take(pc.rows); //6. 按需查詢 var pageData = await (from a in data select new { a.id, a.userAccount, a.loginIp, a.loginTime }).ToListAsync(); //7.判斷是否有數據 if (pageData.Count() == 0) { return Json(new { total = 0, rows = "" }); } else { return Json(new { total = totalCount, rows = pageData }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { total = 0, rows = "" }); } } #endregion #region 02-刪除日志(已修改) /// <summary> /// 刪除日志 /// </summary> /// <param name="delIds">刪除用的id數組</param> /// <returns></returns> public async Task<JsonResult> DelLoginLog(string[] delIds) { try { int count = await _baseService.DelByAsync<T_SysLoginLog>(u => delIds.Contains(u.id)); if (count > 0) { return Json(new { status = "ok", msg = "刪除成功", data = "" }); } return Json(new { status = "error", msg = "刪除失敗", data = "" }); } catch (Exception ex) { LogUtils.Error(ex); return Json(new { status = "error", msg = "刪除失敗", data = "" }); } } #endregion #region 03-導出Excel表格(已修改) /// <summary> /// 導出Excel表格 /// </summary> /// <param name="pc">表格必備參數</param> /// <param name="tSysLoginLog">日志實體,接收查詢條件</param> /// <returns></returns> public async Task<FileResult> DownLoadFileExcel(PagingClass pc, T_SysLoginLog tSysLoginLog, [FromServices] IWebHostEnvironment _hostingEnvironment) { try { List<T_SysLoginLog> exportData = new List<T_SysLoginLog>(); //1. 獲取需要導出的數據 { //1. 數據源 var data = _baseService.EntitiesNoTrack<T_SysLoginLog>().Where(u => u.delFlag == 0); //2. 條件搜索 //2.1 登錄賬號 if (!string.IsNullOrEmpty(tSysLoginLog.userAccount)) { data = data.Where(u => u.userAccount.Contains(tSysLoginLog.userAccount)); } //2.2 登錄ip if (!string.IsNullOrEmpty(tSysLoginLog.loginIp)) { data = data.Where(u => u.loginIp.Contains(tSysLoginLog.loginIp)); } //2.3 登錄時間 if (!string.IsNullOrEmpty(pc.operDateStart)) { var startTime = Convert.ToDateTime(pc.operDateStart); data = data.Where(u => u.loginTime >= startTime); } if (!string.IsNullOrEmpty(pc.operDateEnd)) { var endTime = Convert.ToDateTime(pc.operDateEnd); data = data.Where(u => u.loginTime <= endTime); } //4.列排序 //此處默認是根據addTime降序排列,如需修改,在此處修改 pc.order = string.IsNullOrEmpty(pc.order) ? "Desc" : pc.order; pc.sort = string.IsNullOrEmpty(pc.sort) ? "loginTime" : pc.sort; data = data.DataSorting(pc.sort, pc.order); exportData = await data.ToListAsync(); } //2. 創建Excel相關的信息 //2.1 目錄相關 var myPath = _hostingEnvironment.ContentRootPath + @"\DownLoad\Excel\"; if (!Directory.Exists(myPath)) { Directory.CreateDirectory(myPath); } string pathFileName = myPath + $"{DateTime.Now.ToString("yyyyMMddHHmmssffffff")}.xlsx"; FileInfo newFile = new FileInfo(pathFileName); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(pathFileName); } //2.2 創建Excel using (ExcelPackage package = new ExcelPackage(newFile)) { //sheet名稱 ExcelWorksheet workSheet = package.Workbook.Worksheets.Add("登錄日志"); //設置標題 string[] titleArry = { "登錄名稱", "登錄ip", "登錄時間" }; for (int i = 0; i < titleArry.Length; i++) { workSheet.Cells[1, i + 1].Value = titleArry[i]; } //設置列寬 int[] columnWidthArry = { 30, 45, 20 }; for (int i = 0; i < columnWidthArry.Length; i++) { workSheet.Column(i + 1).Width = columnWidthArry[i]; } //單元格內容賦值 int row = 2; foreach (var item in exportData) { workSheet.Cells[row, 1].Value = item.userAccount; workSheet.Cells[row, 2].Value = item.loginIp; workSheet.Cells[row, 3].Value = item.loginTime; workSheet.Cells[row, 3].Style.Numberformat.Format = "yyyy-MM-dd HH:mm:ss"; row++; } workSheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; //水平居中 await package.SaveAsync(); } //3. 返回下載內容 string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".xlsx"; //展現給用戶看的文件名 return PhysicalFile(pathFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName); } catch (Exception ex) { LogUtils.Error(ex); return PhysicalFile("", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ""); } } #endregion }
(5). 操作日志相關控制器 -SysOperateLogApiController

[Area("AdminApi_Areas")] [Route("Api/[area]/[controller]/[action]")] [SkipLogin] /// <summary> /// 操作日志接口 /// </summary> public class SysOperateLogApiController : Controller { public IBaseService _baseService; public SysOperateLogApiController(IBaseService baseService) { this._baseService = baseService; } #region 01-獲取操作日志信息(已修改) /// <summary> /// 獲取操作日志信息 /// </summary> /// <param name="pc">表格基礎信息</param> /// <param name="tSysOperLog">日志實體,接收查詢參數</param> /// <returns></returns> public async Task<JsonResult> GetOperLogInfor(PagingClass pc, T_SysOperLog tSysOperLog) { try { //1. 數據源 var data = _baseService.EntitiesNoTrack<T_SysOperLog>().Where(u => u.delFlag == 0); //2. 條件搜索 //2.1 操作人賬號 if (!string.IsNullOrEmpty(tSysOperLog.userAccount)) { data = data.Where(u => u.userAccount.Contains(tSysOperLog.userAccount)); } //2.2 操作信息 if (!string.IsNullOrEmpty(tSysOperLog.operMessage)) { data = data.Where(u => u.operMessage.Contains(tSysOperLog.operMessage)); } //2.3 操作時間 if (!string.IsNullOrEmpty(pc.operDateStart)) { var startTime = Convert.ToDateTime(pc.operDateStart); data = data.Where(u => u.operTime >= startTime); } if (!string.IsNullOrEmpty(pc.operDateEnd)) { var endTime = Convert.ToDateTime(pc.operDateEnd); data = data.Where(u => u.operTime <= endTime); } //3. 總條數 int totalCount = await data.CountAsync(); if (totalCount == 0) { return Json(new { total = 0, rows = "" }); } //4.列排序 //此處默認是根據事件降序排列,如需修改,在此處修改 pc.sort = string.IsNullOrEmpty(pc.sort) ? "operTime" : pc.sort; pc.order = string.IsNullOrEmpty(pc.order) ? "Desc" : pc.order; data = data.DataSorting(pc.sort, pc.order); //5.分頁 data = data.Skip((pc.page - 1) * pc.rows).Take(pc.rows); //6. 按需查詢 var pageData = await (from a in data select new { a.id, a.userAccount, a.operMessage, a.operTime }).ToListAsync(); //7.判斷是否有數據 if (pageData.Count() == 0) { return Json(new { total = 0, rows = "" }); } else { return Json(new { total = totalCount, rows = pageData }); } } catch (Exception ex) { LogUtils.Error(ex); return Json(new { total = 0, rows = "" }); } } #endregion #region 02-刪除日志(已修改) /// <summary> /// 刪除日志 /// </summary> /// <param name="delIds">刪除用的id數組</param> /// <returns></returns> public async Task<JsonResult> DelOperateLog(string[] delIds) { try { int count = await _baseService.DelByAsync<T_SysOperLog>(u => delIds.Contains(u.id)); if (count > 0) { return Json(new { status = "ok", msg = "刪除成功", data = "" }); } return Json(new { status = "error", msg = "刪除失敗", data = "" }); } catch (Exception ex) { LogUtils.Error(ex); return Json(new { status = "error", msg = "刪除失敗", data = "" }); } } #endregion #region 03-導出Excel表格(已修改) /// <summary> /// 導出Excel表格 /// </summary> /// <param name="pc">表格必備參數</param> /// <param name="tSysOperLog">日志實體,接收查詢條件</param> /// <returns></returns> public async Task<FileResult> DownLoadFileExcel(PagingClass pc, T_SysOperLog tSysOperLog, [FromServices] IWebHostEnvironment _hostingEnvironment) { try { List<T_SysOperLog> exportData = new List<T_SysOperLog>(); //1. 獲取需要導出的數據 { //1. 數據源 var data = _baseService.EntitiesNoTrack<T_SysOperLog>().Where(u => u.delFlag == 0); //2. 條件搜索 //2.1 操作人賬號 if (!string.IsNullOrEmpty(tSysOperLog.userAccount)) { data = data.Where(u => u.userAccount.Contains(tSysOperLog.userAccount)); } //2.2 操作信息 if (!string.IsNullOrEmpty(tSysOperLog.operMessage)) { data = data.Where(u => u.operMessage.Contains(tSysOperLog.operMessage)); } //2.3 操作時間 if (!string.IsNullOrEmpty(pc.operDateStart)) { var startTime = Convert.ToDateTime(pc.operDateStart + " 00:00:00"); data = data.Where(u => u.operTime >= startTime); } if (!string.IsNullOrEmpty(pc.operDateEnd)) { var endTime = Convert.ToDateTime(pc.operDateEnd + " 23:59:59"); data = data.Where(u => u.operTime <= endTime); } //4.列排序 //此處默認是根據addTime降序排列,如需修改,在此處修改 pc.sort = string.IsNullOrEmpty(pc.sort) ? "operTime" : pc.sort; pc.order = string.IsNullOrEmpty(pc.order) ? "Desc" : pc.order; data = data.DataSorting(pc.sort, pc.order); exportData =await data.ToListAsync(); } //2. 創建Excel相關的信息 //2.1 目錄相關 var myPath = _hostingEnvironment.ContentRootPath + @"\DownLoad\Excel\"; if (!Directory.Exists(myPath)) { Directory.CreateDirectory(myPath); } string pathFileName = myPath + $"{DateTime.Now.ToString("yyyyMMddHHmmssffffff")}.xlsx"; FileInfo newFile = new FileInfo(pathFileName); if (newFile.Exists) { newFile.Delete(); newFile = new FileInfo(pathFileName); } //2.2 創建Excel using (ExcelPackage package = new ExcelPackage(newFile)) { //sheet名稱 ExcelWorksheet workSheet = package.Workbook.Worksheets.Add("操作日志"); //設置標題 string[] titleArry = { "操作人賬號", "操作內容", "操作時間" }; for (int i = 0; i < titleArry.Length; i++) { workSheet.Cells[1, i + 1].Value = titleArry[i]; } //設置列寬 int[] columnWidthArry = { 30, 45, 20 }; for (int i = 0; i < columnWidthArry.Length; i++) { workSheet.Column(i + 1).Width = columnWidthArry[i]; } //單元格內容賦值 int row = 2; foreach (var item in exportData) { workSheet.Cells[row, 1].Value = item.userAccount; workSheet.Cells[row, 2].Value = item.operMessage; workSheet.Cells[row, 3].Value = item.operTime; workSheet.Cells[row, 3].Style.Numberformat.Format = "yyyy-MM-dd HH:mm:ss"; row++; } workSheet.Cells.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center; //水平居中 await package.SaveAsync(); } //3. 返回下載內容 string fileName = DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".xlsx"; //展現給用戶看的文件名 return PhysicalFile(pathFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName); } catch (Exception ex) { LogUtils.Error(ex); return PhysicalFile("", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ""); } } #endregion }
!
- 作 者 : Yaopengfei(姚鵬飛)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 聲 明1 : 如有錯誤,歡迎討論,請勿謾罵^_^。
- 聲 明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。