Files
SecMPS/api_sqlsugar/VolPro.Sys/Services/System/Partial/Sys_UserService.cs
2026-05-15 23:22:48 +08:00

570 lines
20 KiB
C#
Raw 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.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using VolPro.Core;
using VolPro.Core.Configuration;
using VolPro.Core.DbSqlSugar;
using VolPro.Core.Enums;
using VolPro.Core.Extensions;
using VolPro.Core.ManageUser;
using VolPro.Core.Services;
using VolPro.Core.UserManager;
using VolPro.Core.Utilities;
using VolPro.Entity.DomainModels;
using VolPro.Sys.IRepositories;
namespace VolPro.Sys.Services
{
public partial class Sys_UserService
{
private Microsoft.AspNetCore.Http.HttpContext _context;
private ISys_UserRepository _repository;
[ActivatorUtilitiesConstructor]
public Sys_UserService(IHttpContextAccessor httpContextAccessor, ISys_UserRepository repository)
: base(repository)
{
_context = httpContextAccessor.HttpContext;
_repository = repository;
}
WebResponseContent webResponse = new WebResponseContent();
public int GetUserNumber()
{
return _repository.Find(x => 1 == 1).Count;
}
public List<Sys_User> GetUserList()
{
return _repository.Find(x => 1 == 1).ToList<Sys_User>();
}
/// <summary>
/// WebApi登陆
/// </summary>
/// <param name="loginInfo"></param>
/// <param name="verificationCode"></param>
/// <returns></returns>
public async Task<WebResponseContent> Login(LoginInfo loginInfo, bool verificationCode = true)
{
WebResponseContent responseContent = new WebResponseContent();
string msg = string.Empty;
// 2020.06.12增加验证码
IMemoryCache memoryCache = _context.GetService<IMemoryCache>();
string cacheCode = (memoryCache.Get(loginInfo.UUID) ?? "").ToString();
if (string.IsNullOrEmpty(cacheCode))
{
return responseContent.Error("验证码已失效".Translator());
}
if (cacheCode.ToLower() != loginInfo.VerificationCode.ToLower())
{
memoryCache.Remove(loginInfo.UUID);
return responseContent.Error("验证码不正确".Translator());
}
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 webResponse.Error(ResponseType.LoginError);
int expir = UserContext.MenuType == 1 ? 43200 : AppSetting.ExpMinutes;
string token = JwtHelper.IssueJwt(new UserInfo()
{
User_Id = user.User_Id,
UserName = user.UserName,
Role_Id = user.Role_Id ?? 0
}, expir);
user.Token = token;
string accessToken = null;
if (AppSetting.FileAuth)
{
expir = expir + 30;
string dt = DateTime.Now.AddMinutes(expir).ToString("yyyy-MM-dd HH:mm");
accessToken = $"{user.User_Id}_{dt}".EncryptDES(AppSetting.Secret.User);
_context.GetService<Core.CacheManager.ICacheService>().Add(accessToken, dt, expir);
}
webResponse.Data = new { token, userName = user.UserTrueName, img = user.HeadImageUrl, accessToken };
repository.Update(user, x => x.Token, true);
UserContext.Current.LogOut(user.User_Id);
loginInfo.Password = string.Empty;
return webResponse.OK(ResponseType.LoginSuccess);
}
catch (Exception ex)
{
msg = ex.Message + ex.StackTrace;
if (_context.GetService<Microsoft.AspNetCore.Hosting.IWebHostEnvironment>().IsDevelopment())
{
throw new Exception(ex.Message + ex.StackTrace);
}
return webResponse.Error(ResponseType.ServerError);
}
finally
{
memoryCache.Remove(loginInfo.UUID);
Logger.Info(LoggerType.Login, loginInfo.Serialize(), webResponse.Message, msg);
}
}
/// <summary>
///当token将要过期时提前置换一个新的token
/// </summary>
/// <returns></returns>
public async Task<WebResponseContent> ReplaceToken()
{
await Task.CompletedTask;
return new WebResponseContent() { };
}
/// <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("旧密码不能为空".Translator());
if (string.IsNullOrEmpty(newPwd)) return webResponse.Error("新密码不能为空".Translator());
if (newPwd.Length < 6) return webResponse.Error("密码不能少于6位".Translator());
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("旧密码不正确".Translator());
string _newPwd = newPwd.EncryptDES(AppSetting.Secret.User);
if (userCurrentPwd == _newPwd) return webResponse.Error("新密码不能与旧密码相同".Translator());
repository.Update(new Sys_User
{
User_Id = userId,
UserPwd = _newPwd,
LastModifyPwdDate = DateTime.Now
}, x => new { x.UserPwd, x.LastModifyPwdDate }, true);
webResponse.OK("密码修改成功".Translator());
}
catch (Exception ex)
{
message = ex.Message;
webResponse.Error("服务器处理出现异常".Translator());
}
finally
{
if (message == "")
{
Logger.OK(LoggerType.ApiModifyPwd, "密码修改成功".Translator());
}
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 webResponse.OK(null, data);
}
/// <summary>
/// 设置固定排序方式及显示用户过滤
/// </summary>
/// <param name="pageData"></param>
/// <returns></returns>
public override PageGridData<Sys_User> GetPageData(PageDataOptions pageData)
{
////var roleId = new int[] {};
//////树形菜单传查询角色下所有用户
////if (pageData.Value != null)
////{
//// roleId = new int[] { pageData.Value.ToString().GetInt() };
////}
//QueryRelativeExpression = (ISugarQueryable<Sys_User> queryable) =>
//{
// //显示角色与子角色下的数据
// var serviceId = UserContext.CurrentServiceId;
// var roleIds = RoleContext.GetAllChildrenIds(UserContext.Current.RoleIds);
// var roleQuery = repository.DbContext.Set<Sys_UserRole>().Where(x => x.Enable == 1 && roleIds.Contains(x.RoleId));
// if (UserContext.Current.IsSuperAdmin)
// {
// return queryable;
// // return queryable.Where(x => x.User_Id == UserContext.Current.UserId || roleQuery.Any(c => c.RoleId == x.Role_Id));
// }
// return queryable.Where(x => roleQuery.Any(c => c.UserId == x.User_Id));
//};
//显示同一个数据库的用户
var data = base.GetPageData(pageData);
foreach (var item in data.rows)
{
item.Token = null;
}
return data;
}
/// <summary>
/// 新建用户,根据实际情况自行处理
/// </summary>
/// <param name="saveModel"></param>
/// <returns></returns>
public override WebResponseContent Add(SaveModel saveModel)
{
WebResponseContent responseData = new WebResponseContent();
base.AddOnExecute = (SaveModel userModel) =>
{
return responseData.OK();
};
///生成6位数随机密码
string pwd = 6.GenerateRandomNumber();
//在AddOnExecuting之前已经对提交的数据做过验证是否为空
base.AddOnExecuting = (Sys_User user, object obj) =>
{
user.UserName = user.UserName.Trim();
if (repository.Exists(x => x.UserName == user.UserName))
return responseData.Error("用户名已经被注册".Translator());
user.UserPwd = pwd.EncryptDES(AppSetting.Secret.User);
//设置默认头像
return responseData.OK();
};
base.AddOnExecuted = (Sys_User user, object list) =>
{
var roleIds = user.RoleIds?.Split(",").Select(s => s.GetInt()).Where(x => x > 1).ToArray();
SaveRole(roleIds, user.User_Id);
var deptIds = user.DeptIds?.Split(",").Select(s => s.GetGuid()).Where(x => x != null).Select(s => (Guid)s).ToArray();
SaveDepartment(deptIds, user.User_Id);
var postIds = user.PostId?.Split(",").Select(s => s.GetGuid()).Where(x => x != null).Select(s => (Guid)s).ToArray();
SavePost(postIds, user.User_Id);
return responseData.OK("用户新建成功.帐号{$ts}密码{$ts}".TranslatorFormat(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();
return new WebResponseContent().OK();
};
base.DelOnExecuted = (object[] userIds) =>
{
var objKeys = userIds.Select(x => x.GetInt().GetUserIdKey());
base.CacheContext.RemoveAll(objKeys);
return new WebResponseContent() { Status = true };
};
return base.Del(keys, delList);
}
/// <summary>
/// 保存角色
/// </summary>
/// <param name="roleIds"></param>
/// <param name="userId"></param>
public void SaveRole(int[] roleIds, int userId)
{
if (userId <= 0)
{
return;
}
if (roleIds == null)
{
roleIds = new int[] { };
}
//如果需要判断当前角色是否越权,再调用一下获取当前角色下的所有子角色判断即可
var roles = repository.DbContext.Set<Sys_UserRole>().Where(x => x.UserId == userId)
.Select(s => new { s.RoleId, s.Enable, s.Id })
.ToList();
////没有设置角色
//if (roleIds.Length == 0 && roles.Exists(x => x.Enable == 1))
//{
// return;
//}
UserInfo user = UserContext.Current.UserInfo;
//新设置的角色
var add = roleIds.Where(x => !roles.Exists(r => r.RoleId == x)).Select(s => new Sys_UserRole()
{
Id = Guid.NewGuid(),
RoleId = s,
UserId = userId,
Enable = 1,
CreateDate = DateTime.Now,
Creator = user.UserTrueName,
CreateID = user.User_Id
}).ToList();
//删除的角色
var update = roles.Where(x => !roleIds.Contains(x.RoleId) && x.Enable == 1).Select(s => new Sys_UserRole()
{
Id = s.Id,
Enable = 0,
ModifyDate = DateTime.Now,
Modifier = user.UserTrueName,
ModifyID = user.User_Id
}).ToList();
//之前设置过的角色重新分配
update.AddRange(roles.Where(x => roleIds.Contains(x.RoleId) && x.Enable != 1).Select(s => new Sys_UserRole()
{
Id = s.Id,
Enable = 1,
ModifyDate = DateTime.Now,
Modifier = user.UserTrueName,
ModifyID = user.User_Id
}).ToList());
repository.AddRange(add);
repository.UpdateRange(update, x => new { x.Enable, x.ModifyDate, x.Modifier, x.ModifyID });
repository.SaveChanges();
}
/// <summary>
/// 保存部门
/// </summary>
/// <param name="deptIds"></param>
/// <param name="userId"></param>
public void SaveDepartment(Guid[] deptIds, int userId)
{
if (userId <= 0)
{
return;
}
if (deptIds == null)
{
deptIds = new Guid[] { };
}
//如果需要判断当前角色是否越权,再调用一下获取当前部门下的所有子角色判断即可
var roles = repository.DbContext.Set<Sys_UserDepartment>().Where(x => x.UserId == userId)
.Select(s => new { s.DepartmentId, s.Enable, s.Id })
.ToList();
//没有设置部门
if (deptIds.Length == 0 && !roles.Exists(x => x.Enable == 1))
{
return;
}
UserInfo user = UserContext.Current.UserInfo;
//新设置的部门
var add = deptIds.Where(x => !roles.Exists(r => r.DepartmentId == x)).Select(s => new Sys_UserDepartment()
{
Id = Guid.NewGuid(),
DepartmentId = s,
UserId = userId,
Enable = 1,
CreateDate = DateTime.Now,
Creator = user.UserTrueName,
CreateID = user.User_Id
}).ToList();
//删除的部门
var update = roles.Where(x => !deptIds.Contains(x.DepartmentId) && x.Enable == 1).Select(s => new Sys_UserDepartment()
{
Id = s.Id,
Enable = 0,
ModifyDate = DateTime.Now,
Modifier = user.UserTrueName,
ModifyID = user.User_Id
}).ToList();
//之前设置过的部门重新分配
update.AddRange(roles.Where(x => deptIds.Contains(x.DepartmentId) && x.Enable != 1).Select(s => new Sys_UserDepartment()
{
Id = s.Id,
Enable = 1,
ModifyDate = DateTime.Now,
Modifier = user.UserTrueName,
ModifyID = user.User_Id
}).ToList());
repository.AddRange(add);
repository.UpdateRange(update, x => new { x.Enable, x.ModifyDate, x.Modifier, x.ModifyID });
repository.SaveChanges();
}
/// <summary>
/// 保存岗位
/// </summary>
/// <param name="postIds"></param>
/// <param name="userId"></param>
public void SavePost(Guid[] postIds, int userId)
{
if (userId <= 0)
{
return;
}
if (postIds == null)
{
postIds = new Guid[] { };
}
var roles = repository.DbContext.Set<Sys_UserPost>().Where(x => x.UserId == userId)
.Select(s => new { s.PostId, s.Enable, s.Id })
.ToList();
//没有设置部门
if (postIds.Length == 0 && !roles.Exists(x => x.Enable == 1))
{
return;
}
UserInfo user = UserContext.Current.UserInfo;
//新设置的部门
var add = postIds.Where(x => !roles.Exists(r => r.PostId == x)).Select(s => new Sys_UserPost()
{
Id = Guid.NewGuid(),
PostId = s,
UserId = userId,
Enable = 1,
CreateDate = DateTime.Now,
Creator = user.UserTrueName,
CreateID = user.User_Id
}).ToList();
//删除的部门
var update = roles.Where(x => !postIds.Contains(x.PostId) && x.Enable == 1).Select(s => new Sys_UserPost()
{
Id = s.Id,
Enable = 0,
ModifyDate = DateTime.Now,
Modifier = user.UserTrueName,
ModifyID = user.User_Id
}).ToList();
//之前设置过的部门重新分配
update.AddRange(roles.Where(x => postIds.Contains(x.PostId) && x.Enable != 1).Select(s => new Sys_UserPost()
{
Id = s.Id,
Enable = 1,
ModifyDate = DateTime.Now,
Modifier = user.UserTrueName,
ModifyID = user.User_Id
}).ToList());
repository.AddRange(add);
repository.UpdateRange(update, x => new { x.Enable, x.ModifyDate, x.Modifier, x.ModifyID });
repository.SaveChanges();
}
/// <summary>
/// 修改用户拦截过滤
///
/// </summary>
/// <param name="saveModel"></param>
/// <returns></returns>
public override WebResponseContent Update(SaveModel saveModel)
{
UserInfo userInfo = UserContext.Current.UserInfo;
base.UpdateOnExecuting = (Sys_User user, object obj1, object obj2, List<object> list) =>
{
var _user = repository.Find(x => x.User_Id == user.User_Id,
s => new { s.UserName, s.UserPwd })
.FirstOrDefault();
user.UserName = _user.UserName;
//Sys_User实体的UserPwd用户密码字段的属性不是编辑此处不会修改密码。但防止代码生成器将密码字段的修改成了可编辑造成密码被修改
user.UserPwd = _user.UserPwd;
return webResponse.OK();
};
//用户信息被修改后,将用户的缓存信息清除
base.UpdateOnExecuted = (Sys_User user, object obj1, object obj2, List<object> List) =>
{
base.CacheContext.Remove(user.User_Id.GetUserIdKey());
var roleIds = user.RoleIds?.Split(",").Select(s => s.GetInt()).Where(x => x > 1).ToArray();
SaveRole(roleIds, user.User_Id);
var deptIds = user.DeptIds?.Split(",").Select(s => s.GetGuid()).Where(x => x != null).Select(s => (Guid)s).ToArray();
SaveDepartment(deptIds, user.User_Id);
var postIds = user.PostId?.Split(",").Select(s => s.GetGuid()).Where(x => x != null).Select(s => (Guid)s).ToArray();
SavePost(postIds, user.User_Id);
return new WebResponseContent(true);
};
return base.Update(saveModel);
}
/// <summary>
/// 导出处理
/// </summary>
/// <param name="pageData"></param>
/// <returns></returns>
public override WebResponseContent Export(PageDataOptions pageData)
{
//限定只能导出当前角色能看到的所有用户
QueryRelativeExpression = (ISugarQueryable<Sys_User> queryable) =>
{
if (UserContext.Current.IsSuperAdmin) return queryable;
List<int> roleIds = Sys_RoleService
.Instance
.GetAllChildrenRoleId(UserContext.Current.RoleIds);
return queryable.Where(x => roleIds.Contains(x.Role_Id ?? 0) || x.User_Id == UserContext.Current.UserId);
};
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");
}
WebResponseContent responseData = new WebResponseContent(true);
return responseData;
};
return base.Export(pageData);
}
}
}