第一節:剖析DB設計和業務接口的編寫


一. 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




    }
View Code

(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

    }
View Code

(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
    }
View Code

(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


    }
View Code

(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
    }
View Code

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鵬飛)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 聲     明1 : 如有錯誤,歡迎討論,請勿謾罵^_^。
  • 聲     明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM