using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using iMES.Core.Configuration; using iMES.Core.Enums; using iMES.Core.Extensions; using iMES.Core.ManageUser; using iMES.Core.Services; using iMES.Core.Utilities; using iMES.Entity.DomainModels; using Microsoft.AspNetCore.Http; using iMES.System.IRepositories; using Microsoft.Extensions.DependencyInjection; using iMES.Custom.IRepositories; using HttpContext = iMES.Core.Utilities.HttpContext; using iMES.Custom.Services; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using iMES.Custom.IServices; using iMES.Core.Infrastructure; using iMES.Core.BaseProvider; namespace iMES.System.Services { public partial class Sys_UserService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly ISys_UserRepository _repository;//访问数据库 private readonly ISys_Table_ExtendRepository _sysTableExtendRepository;//扩展字段访问数据库 private readonly ISys_User_ExtendDataRepository _sysUserExtendDataRepository;//扩展字段访问数据库 private readonly ISys_User_ExtendDataService _userExtendDataService;//访问业务代码 [ActivatorUtilitiesConstructor] public Sys_UserService( ISys_UserRepository dbRepository, ISys_Table_ExtendRepository sysTableExtendRepository, ISys_User_ExtendDataRepository sysUserExtendDataRepository, IHttpContextAccessor httpContextAccessor, ISys_User_ExtendDataService userExtendDataService ) : base(dbRepository) { _httpContextAccessor = httpContextAccessor; _repository = dbRepository; _sysTableExtendRepository = sysTableExtendRepository; _sysUserExtendDataRepository = sysUserExtendDataRepository; _userExtendDataService = userExtendDataService; //多租户会用到这init代码,其他情况可以不用 //base.Init(dbRepository); } //Sys_UserService,在类中重写Init方法,设置IsMultiTenancy=true开启多租户功能 protected override void Init(IRepository repository) { //开启多租户功能,开启后会对查询、导出、删除、编辑功能同时生效 //如果只需要对某个功能生效,如编辑,则在重写编辑方法中设置 IsMultiTenancy = true; IsMultiTenancy = true; } /// /// WebApi登陆 /// /// /// /// public async Task Login(LoginInfo loginInfo, bool verificationCode = true) { string msg = string.Empty; WebResponseContent responseContent = new WebResponseContent(); // 2020.06.12增加验证码 IMemoryCache memoryCache = HttpContext.Current.GetService(); string cacheCode = (memoryCache.Get(loginInfo.UUID) ?? "").ToString(); if (string.IsNullOrEmpty(cacheCode)) { return responseContent.Error("验证码已失效"); } if (cacheCode.ToLower() != loginInfo.VerificationCode.ToLower()) { memoryCache.Remove(loginInfo.UUID); return responseContent.Error("验证码不正确"); } try { Sys_User user = await repository.FindAsIQueryable(x => x.UserName == loginInfo.UserName) .FirstOrDefaultAsync(); if (user == null || loginInfo.Password.Trim().EncryptDES(AppSetting.Secret.User) != (user.UserPwd ?? "")) return responseContent.Error(ResponseType.LoginError); string token = JwtHelper.IssueJwt(new UserInfo() { User_Id = user.User_Id, UserName = user.UserName, Role_Id = user.Role_Id }); user.Token = token; responseContent.Data = new { token, userName = user.UserTrueName, img = user.HeadImageUrl ,userTrueName= user.UserName,roleName=user.RoleName }; repository.Update(user, x => x.Token, true); UserContext.Current.LogOut(user.User_Id); loginInfo.Password = string.Empty; return responseContent.OK(ResponseType.LoginSuccess); } catch (Exception ex) { msg = ex.Message + ex.StackTrace; return responseContent.Error(ResponseType.ServerError); } finally { memoryCache.Remove(loginInfo.UUID); Logger.Info(LoggerType.Login, loginInfo.Serialize(), responseContent.Message, msg); } } /// ///当token将要过期时,提前置换一个新的token /// /// public async Task ReplaceToken() { WebResponseContent responseContent = new WebResponseContent(); string error = ""; UserInfo userInfo = null; try { string requestToken = HttpContext.Current.Request.Headers[AppSetting.TokenHeaderName]; requestToken = requestToken?.Replace("Bearer ", ""); if (UserContext.Current.Token != requestToken) return responseContent.Error("Token已失效!"); if (JwtHelper.IsExp(requestToken)) return responseContent.Error("Token已过期!"); int userId = UserContext.Current.UserId; userInfo = await repository.FindFirstAsync(x => x.User_Id == userId, s => new UserInfo() { User_Id = userId, UserName = s.UserName, UserTrueName = s.UserTrueName, Role_Id = s.Role_Id, RoleName = s.RoleName }); if (userInfo == null) return responseContent.Error("未查到用户信息!"); string token = JwtHelper.IssueJwt(userInfo); //移除当前缓存 base.CacheContext.Remove(userId.GetUserIdKey()); //只更新的token字段 repository.Update(new Sys_User() { User_Id = userId, Token = token }, x => x.Token, true); responseContent.OK(null, token); } catch (Exception ex) { error = ex.Message + ex.StackTrace + ex.Source; responseContent.Error("token替换出错了.."); } finally { Logger.Info(LoggerType.ReplaceToeken, ($"用户Id:{userInfo?.User_Id},用户{userInfo?.UserTrueName}") + (responseContent.Status ? "token替换成功" : "token替换失败"), null, error); } return responseContent; } /// /// 修改密码 /// /// /// public async Task ModifyPwd(string oldPwd, string newPwd) { oldPwd = oldPwd?.Trim(); newPwd = newPwd?.Trim(); string message = ""; WebResponseContent webResponse = new WebResponseContent(); try { if (string.IsNullOrEmpty(oldPwd)) return webResponse.Error("旧密码不能为空"); if (string.IsNullOrEmpty(newPwd)) return webResponse.Error("新密码不能为空"); if (newPwd.Length < 6) return webResponse.Error("密码不能少于6位"); int userId = UserContext.Current.UserId; string userCurrentPwd = await base.repository.FindFirstAsync(x => x.User_Id == userId, s => s.UserPwd); string _oldPwd = oldPwd.EncryptDES(AppSetting.Secret.User); if (_oldPwd != userCurrentPwd) return webResponse.Error("旧密码不正确"); string _newPwd = newPwd.EncryptDES(AppSetting.Secret.User); if (userCurrentPwd == _newPwd) return webResponse.Error("新密码不能与旧密码相同"); repository.Update(new Sys_User { User_Id = userId, UserPwd = _newPwd, LastModifyPwdDate = DateTime.Now }, x => new { x.UserPwd, x.LastModifyPwdDate }, true); webResponse.OK("密码修改成功"); } catch (Exception ex) { message = ex.Message; webResponse.Error("服务器了点问题,请稍后再试"); } finally { if (message == "") { Logger.OK(LoggerType.ApiModifyPwd, "密码修改成功"); } else { Logger.Error(LoggerType.ApiModifyPwd, message); } } return webResponse; } /// /// 个人中心获取当前用户信息 /// /// public async Task GetCurrentUserInfo() { var data = await base.repository .FindAsIQueryable(x => x.User_Id == UserContext.Current.UserId) .Select(s => new { s.UserName, s.UserTrueName, s.Address, s.PhoneNo, s.Email, s.Remark, s.Gender, s.RoleName, s.HeadImageUrl, s.CreateDate }) .FirstOrDefaultAsync(); return new WebResponseContent().OK(null, data); } /// /// 设置固定排序方式及显示用户过滤 /// /// /// public override PageGridData GetPageData(PageDataOptions pageData) { int roleId = -1; //树形菜单传查询角色下所有用户 if (pageData.Value != null) { roleId = pageData.Value.ToString().GetInt(); } QueryRelativeExpression = (IQueryable queryable) => { if (roleId <= 0) { if (UserContext.Current.IsSuperAdmin) return queryable; roleId = UserContext.Current.RoleId; } //查看用户时,只能看下自己角色下的所有用户 List roleIds = Sys_RoleService .Instance .GetAllChildrenRoleId(roleId); roleIds.Add(roleId); //判断查询的角色是否越权 if (roleId != UserContext.Current.RoleId && !roleIds.Contains(roleId)) { roleId = -999; } return queryable.Where(x => roleIds.Contains(x.Role_Id)); }; base.OrderByExpression = x => new Dictionary() { { x.CreateDate, Core.Enums.QueryOrderBy.Desc }, { x.User_Id,Core.Enums.QueryOrderBy.Desc} }; return base.GetPageData(pageData); } /// /// 新建用户,根据实际情况自行处理 /// /// /// public override WebResponseContent Add(SaveModel saveModel) { WebResponseContent responseData = new WebResponseContent(); base.AddOnExecute = (SaveModel userModel) => { int roleId = userModel?.MainData?["Role_Id"].GetInt() ?? 0; if (roleId > 0) { string roleName = GetChildrenName(roleId); if ((!UserContext.Current.IsSuperAdmin && roleId == 1) || string.IsNullOrEmpty(roleName)) return responseData.Error("不能选择此角色"); //选择新建的角色ID,手动添加角色ID的名称 userModel.MainData["RoleName"] = roleName; } return responseData.OK(); }; ///生成6位数随机密码 string pwd = 6.GenerateRandomNumber(); //在AddOnExecuting之前已经对提交的数据做过验证是否为空 base.AddOnExecuting = (Sys_User user, object obj) => { user.UserName = user.UserName.Trim(); user.DeptName = DictionaryManager.GetDictionaryList("dept", user.Dept_Id.ToString()); if (repository.Exists(x => x.UserName == user.UserName)) return responseData.Error("用户名已经被注册"); user.UserPwd = pwd.EncryptDES(AppSetting.Secret.User); //设置默认头像 return responseData.OK(); }; //扩展字段开始 start base.AddOnExecuted = (Sys_User user, object list) => { var extra = saveModel.Extra.ToString(); JObject jo = (JObject)JsonConvert.DeserializeObject(extra); int user_Id = user.User_Id.GetInt(); var userExtend = _sysTableExtendRepository.Find(x => x.TableName == "Sys_User", a => new { TableEx_Id = a.TableEx_Id, FieldName = a.FieldName, FieldCode = a.FieldCode, FieldType = a.FieldType }).ToList(); List listData = new List(); for (int i = 0; i < userExtend.Count; i++) { Sys_User_ExtendData extendData = new Sys_User_ExtendData(); extendData.User_Id = user_Id; extendData.TableEx_Id = userExtend[i].TableEx_Id; extendData.FieldValue = jo[userExtend[i].FieldCode].ToString(); extendData.FieldName = userExtend[i].FieldName; extendData.FieldCode = userExtend[i].FieldCode; extendData.CreateDate = user.CreateDate; extendData.CreateID = user.CreateID; extendData.Creator = user.Creator; listData.Add(extendData); } _sysUserExtendDataRepository.AddRange(listData, true); //扩展字段开始 end int roleId = saveModel.MainData["Role_Id"].GetInt(); return responseData.OK($"用户新建成功.帐号{user.UserName}密码{pwd}"); }; return base.Add(saveModel); ; } /// /// 删除用户拦截过滤 /// 用户被删除后同时清空对应缓存 /// /// /// /// public override WebResponseContent Del(object[] keys, bool delList = false) { base.DelOnExecuting = (object[] ids) => { int[] userIds = ids.Select(x => Convert.ToInt32(x)).ToArray(); //校验只能删除当前角色下能看到的用户 var xxx = repository.Find(x => userIds.Contains(x.User_Id)); var delUserIds = repository.Find(x => userIds.Contains(x.User_Id), s => new { s.User_Id, s.Role_Id, s.UserTrueName }); List roleIds = Sys_RoleService .Instance .GetAllChildrenRoleId(UserContext.Current.RoleId); string[] userNames = delUserIds.Where(x => !roleIds.Contains(x.Role_Id)) .Select(s => s.UserTrueName) .ToArray(); if (userNames.Count() > 0) { return new WebResponseContent().Error($"没有权限删除用户:{string.Join(',', userNames)}"); } return new WebResponseContent().OK(); }; base.DelOnExecuted = (object[] userIds) => { var objKeys = userIds.Select(x => x.GetInt().GetUserIdKey()); base.CacheContext.RemoveAll(objKeys); for (int i = 0; i < userIds.Length; i++) { var userExtend = _sysUserExtendDataRepository.Find(x => x.User_Id == userIds[i].GetInt(), a => new { UserExData_Id = a.UserExData_Id, User_Id = a.User_Id, TableEx_Id = a.TableEx_Id }).ToList(); if (userExtend.Count > 0) { object[] keys = new object[userExtend.Count]; for (int j = 0; j < userExtend.Count; j++) { keys[j] = userExtend[j].UserExData_Id.GetInt(); } _sysUserExtendDataRepository.DeleteWithKeys(keys, false); } }; return new WebResponseContent() { Status = true }; }; return base.Del(keys, delList); } private string GetChildrenName(int roleId) { //只能修改当前角色能看到的用户 string roleName = Sys_RoleService .Instance .GetAllChildren(UserContext.Current.UserInfo.Role_Id).Where(x => x.Id == roleId) .Select(s => s.RoleName).FirstOrDefault(); return roleName; } /// /// 修改用户拦截过滤 /// /// /// /// public override WebResponseContent Update(SaveModel saveModel) { WebResponseContent responseContent = new WebResponseContent(); UserInfo userInfo = UserContext.Current.UserInfo; //禁止修改用户名 base.UpdateOnExecute = (SaveModel saveInfo) => { int roleId = saveModel.MainData["Role_Id"].GetInt(); string roleName = GetChildrenName(roleId); saveInfo.MainData.TryAdd("RoleName", roleName); if (UserContext.IsRoleIdSuperAdmin(userInfo.Role_Id)) { if (userInfo.Role_Id == roleId) { saveInfo.MainData["RoleName"] = userInfo.RoleName; } return responseContent.OK(); } if (string.IsNullOrEmpty(roleName)) return responseContent.Error("不能选择此角色"); return responseContent.OK(); }; base.UpdateOnExecuting = (Sys_User user, object obj1, object obj2, List list) => { if (user.User_Id == userInfo.User_Id && user.Role_Id != userInfo.Role_Id) return responseContent.Error("不能修改自己的角色"); var _user = repository.Find(x => x.User_Id == user.User_Id, s => new { s.UserName, s.UserPwd }) .FirstOrDefault(); user.UserName = _user.UserName; user.DeptName = DictionaryManager.GetDictionaryList("dept", user.Dept_Id.ToString()); //Sys_User实体的UserPwd用户密码字段的属性不是编辑,此处不会修改密码。但防止代码生成器将密码字段的修改成了可编辑造成密码被修改 user.UserPwd = _user.UserPwd; return responseContent.OK(); }; //用户信息被修改后,将用户的缓存信息清除 base.UpdateOnExecuted = (Sys_User user, object obj1, object obj2, List List) => { var extra = saveModel.Extra.ToString(); JObject jo = (JObject)JsonConvert.DeserializeObject(extra); int user_Id = user.User_Id.GetInt(); var userExtend = _sysTableExtendRepository.Find(x => x.TableName == "Sys_User", a => new { TableEx_Id = a.TableEx_Id, FieldName = a.FieldName, FieldCode = a.FieldCode, FieldType = a.FieldType }).ToList(); for (int i = 0; i < userExtend.Count; i++) { Sys_User_ExtendData userExtendData = _sysUserExtendDataRepository.FindAsIQueryable(x => x.User_Id == user_Id && x.TableEx_Id == userExtend[i].TableEx_Id) .FirstOrDefault(); if (userExtendData == null) { Sys_User_ExtendData extendData = new Sys_User_ExtendData(); extendData.User_Id = user_Id; extendData.TableEx_Id = userExtend[i].TableEx_Id; extendData.FieldValue = jo[userExtend[i].FieldCode].ToString(); extendData.FieldName = userExtend[i].FieldName; extendData.FieldCode = userExtend[i].FieldCode; extendData.CreateDate = user.ModifyDate; extendData.CreateID = user.ModifyID; extendData.Creator = user.Modifier; _sysUserExtendDataRepository.Add(extendData, true); } else { userExtendData.ModifyDate = user.ModifyDate; userExtendData.ModifyID = user.ModifyID; userExtendData.Modifier = user.Modifier; userExtendData.FieldValue = jo[userExtend[i].FieldCode].ToString(); _sysUserExtendDataRepository.Update(userExtendData, true); }; } base.CacheContext.Remove(user.User_Id.GetUserIdKey()); return new WebResponseContent(true); }; return base.Update(saveModel); } /// /// 导出处理 /// /// /// public override WebResponseContent Export(PageDataOptions pageData) { //限定只能导出当前角色能看到的所有用户 QueryRelativeExpression = (IQueryable queryable) => { if (UserContext.Current.IsSuperAdmin) return queryable; List roleIds = Sys_RoleService .Instance .GetAllChildrenRoleId(UserContext.Current.RoleId); return queryable.Where(x => roleIds.Contains(x.Role_Id) || x.User_Id == UserContext.Current.UserId); }; string path = null; string fileName = null; WebResponseContent webResponse = new WebResponseContent(); base.ExportOnExecuting = (List list, List ignoreColumn) => { if (!ignoreColumn.Contains("Role_Id")) { ignoreColumn.Add("Role_Id"); } if (!ignoreColumn.Contains("RoleName")) { ignoreColumn.Remove("RoleName"); } try { List> listDic = new List>(); foreach (var item in list) { var extendDataList = _sysUserExtendDataRepository.Find(x => x.User_Id == item.User_Id, a => new { UserExData_Id = a.UserExData_Id, User_Id = a.User_Id, TableEx_Id = a.TableEx_Id, FieldCode = a.FieldCode, FieldName = a.FieldName, FieldValue = a.FieldValue }).ToList(); Dictionary dic = new Dictionary(); dic.Add("账号", item.UserName); dic.Add("性别", DictionaryManager.GetDictionaryList("gender",item.Gender.ToString())); dic.Add("真实姓名", item.UserTrueName); dic.Add("创建时间", item.CreateDate==null ? "":item.CreateDate.ToString("yyyy-MM-dd HH:mm:sss")); dic.Add("创建人", item.Creator); dic.Add("是否可用", DictionaryManager.GetDictionaryList("enable", item.Enable.ToString())); dic.Add("修改时间", item.ModifyDate == null ? "" : item.ModifyDate.ToString("yyyy-MM-dd HH:mm:sss")); for (int i = 0; i < extendDataList.Count; i++) { var tableExtend = _sysTableExtendRepository.Find(x => x.TableName == "Sys_User" && x.FieldCode == extendDataList[i].FieldCode.ToString(), a => new { TableEx_Id = a.TableEx_Id, FieldCode = a.FieldCode, FieldName = a.FieldName, FieldType = a.FieldType, DataDic = a.DataDic, }).OrderByDescending(a => a.TableEx_Id) .ThenByDescending(q => q.TableEx_Id).ToList(); if (tableExtend.Count > 0) { if (!string.IsNullOrEmpty(tableExtend[0].DataDic) && !string.IsNullOrEmpty(extendDataList[i].FieldValue.ToString())) { if (extendDataList[i].FieldValue.ToString().Contains(',')) { string[] str = extendDataList[i].FieldValue.ToString().Split(','); string changeStrResult = string.Empty; for (int j = 0; j < str.Length; j++) { changeStrResult += (DictionaryManager.GetDictionaryList(tableExtend[0].DataDic, str[j]) + ","); } changeStrResult = changeStrResult.Substring(0, changeStrResult.Length-1); dic.Add(extendDataList[i].FieldName.ToString(), changeStrResult); } else { dic.Add(extendDataList[i].FieldName.ToString(), DictionaryManager.GetDictionaryList(tableExtend[0].DataDic, extendDataList[i].FieldValue.ToString())); } } else { dic.Add(extendDataList[i].FieldName.ToString(), extendDataList[i].FieldValue.ToString()); } } } listDic.Add(dic); } fileName = DateTime.Now .ToString("yyyyMMddHHmmsss") + ".xlsx"; path = EPPlusHelper.ExportGeneralExcel(listDic, fileName); } catch (Exception ex) { Logger.Error($"解析表单出错:{fileName},错误信息{ex.Message}。"); return webResponse.Error("导出用户信息出错"); } webResponse.Code = "-1"; return webResponse.OK(null, path); }; return base.Export(pageData); } } }