Files
iMES_Net/iMES.System/Services/System/Partial/Sys_UserService.cs
2026-02-06 18:34:35 +08:00

625 lines
28 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<Sys_User> repository)
{
//开启多租户功能,开启后会对查询、导出、删除、编辑功能同时生效
//如果只需要对某个功能生效,如编辑,则在重写编辑方法中设置 IsMultiTenancy = true;
IsMultiTenancy = true;
}
/// <summary>
/// WebApi登陆
/// </summary>
/// <param name="loginInfo"></param>
/// <param name="verificationCode"></param>
/// <returns></returns>
public async Task<WebResponseContent> Login(LoginInfo loginInfo, bool verificationCode = true)
{
string msg = string.Empty;
WebResponseContent responseContent = new WebResponseContent();
// 2020.06.12增加验证码
IMemoryCache memoryCache = HttpContext.Current.GetService<IMemoryCache>();
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);
}
}
/// <summary>
///当token将要过期时提前置换一个新的token
/// </summary>
/// <returns></returns>
public async Task<WebResponseContent> 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;
}
/// <summary>
/// 修改密码
/// </summary>
/// <param name="parameters"></param>
/// <returns></returns>
public async Task<WebResponseContent> 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;
}
/// <summary>
/// 个人中心获取当前用户信息
/// </summary>
/// <returns></returns>
public async Task<WebResponseContent> 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);
}
/// <summary>
/// 设置固定排序方式及显示用户过滤
/// </summary>
/// <param name="pageData"></param>
/// <returns></returns>
public override PageGridData<Sys_User> GetPageData(PageDataOptions pageData)
{
int roleId = -1;
//树形菜单传查询角色下所有用户
if (pageData.Value != null)
{
roleId = pageData.Value.ToString().GetInt();
}
QueryRelativeExpression = (IQueryable<Sys_User> queryable) =>
{
if (roleId <= 0)
{
if (UserContext.Current.IsSuperAdmin) return queryable;
roleId = UserContext.Current.RoleId;
}
//查看用户时,只能看下自己角色下的所有用户
List<int> 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<object, Core.Enums.QueryOrderBy>() {
{ x.CreateDate, Core.Enums.QueryOrderBy.Desc },
{ x.User_Id,Core.Enums.QueryOrderBy.Desc}
};
return base.GetPageData(pageData);
}
/// <summary>
/// 新建用户,根据实际情况自行处理
/// </summary>
/// <param name="saveModel"></param>
/// <returns></returns>
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<Sys_User_ExtendData> listData = new List<Sys_User_ExtendData>();
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); ;
}
/// <summary>
/// 删除用户拦截过滤
/// 用户被删除后同时清空对应缓存
/// </summary>
/// <param name="keys"></param>
/// <param name="delList"></param>
/// <returns></returns>
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<int> 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;
}
/// <summary>
/// 修改用户拦截过滤
///
/// </summary>
/// <param name="saveModel"></param>
/// <returns></returns>
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<object> 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<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();
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);
}
/// <summary>
/// 导出处理
/// </summary>
/// <param name="pageData"></param>
/// <returns></returns>
public override WebResponseContent Export(PageDataOptions pageData)
{
//限定只能导出当前角色能看到的所有用户
QueryRelativeExpression = (IQueryable<Sys_User> queryable) =>
{
if (UserContext.Current.IsSuperAdmin) return queryable;
List<int> 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<Sys_User> list, List<string> ignoreColumn) =>
{
if (!ignoreColumn.Contains("Role_Id"))
{
ignoreColumn.Add("Role_Id");
}
if (!ignoreColumn.Contains("RoleName"))
{
ignoreColumn.Remove("RoleName");
}
try
{
List<Dictionary<string, object>> listDic = new List<Dictionary<string, object>>();
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<string, object> dic = new Dictionary<string, object>();
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);
}
}
}