init commit

This commit is contained in:
路 范
2022-03-30 17:54:33 +08:00
parent df01841625
commit 904bdd16cd
500 changed files with 217251 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
namespace Ewide.Core.Service
{
/// <summary>
/// AuthToken参数
/// </summary>
public class AuthToken
{
public string AccessToken { get; set; }
public int ExpireIn { get; set; }
public string RefreshToken { get; set; }
public string Uid { get; set; }
public string OpenId { get; set; }
public string AccessCode { get; set; }
public string UnionId { get; set; }
public string Scope { get; set; }
public string TokenType { get; set; }
public string IdToken { get; set; }
public string MacAlgorithm { get; set; }
public string MacKey { get; set; }
public string Code { get; set; }
public string OauthToken { get; set; }
public string OauthTokenSecret { get; set; }
public string UserId { get; set; }
public string ScreenName { get; set; }
public bool OauthCallbackConfirmed { get; set; }
}
}

View File

@@ -0,0 +1,22 @@
namespace Ewide.Core.Service
{
/// <summary>
/// OAuth用户参数
/// </summary>
public class AuthUserInput
{
public string Uuid { get; set; }
public string Username { get; set; }
public string Nickname { get; set; }
public string Avatar { get; set; }
public string Blog { get; set; }
public string Company { get; set; }
public string Location { get; set; }
public string Email { get; set; }
public string Eemark { get; set; }
public Gender Gender { get; set; }
public string Source { get; set; }
public AuthToken Token { get; set; }
public string RawUserInfo { get; set; }
}
}

View File

@@ -0,0 +1,6 @@
namespace Ewide.Core.Service
{
public class OrgUserInput
{
}
}

View File

@@ -0,0 +1,24 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.User.Dto
{
public class OrgUserTreeNode : ITreeNode
{
public string Id { get; set; }
public string ParentId { get; set; }
public string Name { get; set; }
public int Type { get; set; }
public List<OrgUserTreeNode> Children { get; set; }
public string GetId() => Id;
public string GetPid() => ParentId;
public void SetChildren(IList children)
{
Children = (List<OrgUserTreeNode>)children;
}
}
}

View File

@@ -0,0 +1,139 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Ewide.Core.Service
{
/// <summary>
/// 用户参数
/// </summary>
public class UserInput : InputBase
{
/// <summary>
/// 账号
/// </summary>
public virtual string Account { get; set; }
/// <summary>
/// 密码
/// </summary>
public virtual string Password { get; set; }
/// <summary>
/// 昵称
/// </summary>
public virtual string NickName { get; set; }
/// <summary>
/// 姓名
/// </summary>
public virtual string Name { get; set; }
/// <summary>
/// 头像
/// </summary>
public virtual string Avatar { get; set; }
/// <summary>
/// 生日
/// </summary>
public virtual DateTime? Birthday { get; set; }
/// <summary>
/// 性别-男_1、女_2
/// </summary>
public virtual int Sex { get; set; }
/// <summary>
/// 邮箱
/// </summary>
[RegularExpression(@"^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$", ErrorMessage = "")]
public virtual string Email { get; set; }
/// <summary>
/// 手机
/// </summary>
[RegularExpression(@"^((13[0-9])|(14[5,7])|(15[^4,\\D])|(17[0,1,3,6-8])|(18[0-9])|(19[8,9])|(166))[0-9]{8}$", ErrorMessage = "")]
public virtual string Phone { get; set; }
/// <summary>
/// 电话
/// </summary>
public virtual string Tel { get; set; }
/// <summary>
/// 状态-正常_0、停用_1、删除_2
/// </summary>
public virtual CommonStatus Status { get; set; }
/// <summary>
/// 员工信息
/// </summary>
public EmpOutput2 SysEmpParam { get; set; } = new EmpOutput2();
/// <summary>
/// 搜索状态(字典 0正常 1停用 2删除
/// </summary>
public CommonStatus? SearchStatus { get; set; }
}
public class AddUserInput : UserInput
{
/// <summary>
/// 账号
/// </summary>
[Required(ErrorMessage = "账号名称不能为空")]
public override string Account { get; set; }
//[Required(ErrorMessage = "密码不能为空")]
//public override string Password { get; set; }
//[Required(ErrorMessage = "确认密码不能为空"), Compare(nameof(Password), ErrorMessage = "两次密码不一致")]
//public string Confirm { get; set; }
}
public class DeleteUserInput : UserInput
{
/// <summary>
/// 用户Id
/// </summary>
[Required(ErrorMessage = "用户Id不能为空")]
public string Id { get; set; }
}
public class UpdateUserInput : UserInput
{
/// <summary>
/// 用户Id
/// </summary>
[Required(ErrorMessage = "用户Id不能为空")]
public string Id { get; set; }
}
public class QueryUserInput : DeleteUserInput
{
}
public class ChangePasswordUserInput
{
/// <summary>
/// 密码
/// </summary>
[Required(ErrorMessage = "旧密码不能为空")]
public string Password { get; set; }
/// <summary>
/// 新密码
/// </summary>
[Required(ErrorMessage = "新密码不能为空")]
public string NewPassword { get; set; }
/// <summary>
/// 确认密码
/// </summary>
[Required(ErrorMessage = "确认密码不能为空"), Compare(nameof(NewPassword), ErrorMessage = "两次密码不一致")]
public string Confirm { get; set; }
}
}

View File

@@ -0,0 +1,85 @@
using System;
namespace Ewide.Core.Service
{
/// <summary>
/// 用户参数
/// </summary>
public class UserOutput
{
/// <summary>
/// Id
/// </summary>
public virtual string Id { get; set; }
/// <summary>
/// 账号
/// </summary>
public virtual string Account { get; set; }
/// <summary>
/// 昵称
/// </summary>
public virtual string NickName { get; set; }
/// <summary>
/// 姓名
/// </summary>
public virtual string Name { get; set; }
/// <summary>
/// 头像
/// </summary>
public virtual string Avatar { get; set; }
/// <summary>
/// 生日
/// </summary>
public virtual DateTime? Birthday { get; set; }
/// <summary>
/// 性别-男_1、女_2
/// </summary>
public virtual int Sex { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public virtual string Email { get; set; }
/// <summary>
/// 手机
/// </summary>
public virtual string Phone { get; set; }
/// <summary>
/// 电话
/// </summary>
public virtual string Tel { get; set; }
/// <summary>
/// 状态-正常_0、停用_1、删除_2
/// </summary>
public virtual int Status { get; set; }
/// <summary>
/// 所在机构名称
/// </summary>
public virtual string OrgName { get; set; }
/// <summary>
/// 角色编号
/// </summary>
public virtual string RoleCode { get; set; }
/// <summary>
/// 角色名称
/// </summary>
public virtual string RoleName { get; set; }
/// <summary>
/// 员工信息
/// </summary>
public EmpOutput SysEmpInfo { get; set; }
}
}

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service
{
public class Usermailphone
{
/// <summary>
/// 绑定的值
/// </summary>
public string Target { get; set; }
/// <summary>
/// 发送验证码类型,1为发送给原邮箱2为发送给原手机号
/// </summary>
public int? Type { get; set; }
///<summary>
/// 第一次验证码
/// </summary>
public int? Orgcode { get; set; }
///<summary>
/// 第二次验证码
/// </summary>
public int? Code { get; set; }
}
}

View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.Role
{
public interface ISysUserAreaService
{
Task DeleteUserAreaListByAreaCodeList(List<string> areaCodeList);
Task DeleteUserAreaListByUserId(string userId);
Task<List<string>> GetUserAreaIdList(string userId);
Task GrantData(UpdateUserInput input);
}
}

View File

@@ -0,0 +1,12 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Ewide.Core.Service
{
public interface ISysUserDataScopeService
{
Task DeleteUserDataScopeListByOrgIdList(List<string> orgIdList);
Task DeleteUserDataScopeListByUserId(string userId);
Task GrantData(UpdateUserInput input);
}
}

View File

@@ -0,0 +1,13 @@
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Ewide.Core.Service
{
public interface ISysUserRoleService
{
Task DeleteUserRoleListByRoleId(string roleId);
Task DeleteUserRoleListByUserId(string userId);
Task<List<string>> GetUserRoleIdList(string userId);
Task GrantRole(UpdateUserInput input);
}
}

View File

@@ -0,0 +1,35 @@
using Ewide.Core.Service.User.Dto;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Ewide.Core.Service
{
public interface ISysUserService
{
Task<dynamic> AddUser(AddUserInput input);
Task ChangeUserStatus(UpdateUserInput input);
Task DeleteUser(DeleteUserInput input);
Task ExportUser([FromQuery] UserInput input);
Task<dynamic> GetUser([FromQuery] QueryUserInput input);
Task<dynamic> GetUserById(string userId);
Task<dynamic> GetUserOwnData([FromQuery] QueryUserInput input);
Task<dynamic> GetUserOwnArea([FromQuery] QueryUserInput input);
Task<dynamic> GetUserOwnRole([FromQuery] QueryUserInput input);
Task<dynamic> GetUserSelector([FromQuery] UserInput input);
Task GrantUserData(UpdateUserInput input);
Task GrantUserRole(UpdateUserInput input);
Task<dynamic> QueryUserPageList([FromQuery] UserInput input);
Task ResetUserPwd(QueryUserInput input);
Task SaveAuthUserToUser(AuthUserInput authUser, UserInput sysUser);
Task UpdateAvatar(UserInput input);
Task UpdateUser(UpdateUserInput input);
Task UpdateUserInfo(UserInput input);
Task UpdateUserPwd(ChangePasswordUserInput input);
Task<dynamic> SendCode(Usermailphone input);
Task<dynamic> CheckBindcode(Usermailphone input);
Task<dynamic> GetPwdRule();
Task<dynamic> GetOrgUserTree(OrgUserInput input);
}
}

View File

@@ -0,0 +1,61 @@
using Ewide.Core.Service.Role;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Ewide.Core.Service.User
{
public class SysUserAreaService : ISysUserAreaService,ITransient
{
public readonly IRepository<SysUserArea> _sysUserAreaRep;
public SysUserAreaService(IRepository<SysUserArea> sysUserAreaRep)
{
_sysUserAreaRep = sysUserAreaRep;
}
public async Task DeleteUserAreaListByAreaCodeList(List<string> areaCodeList)
{
var areaList = await _sysUserAreaRep.DetachedEntities.Where(ua => areaCodeList.Contains(ua.AreaCode)).ToListAsync();
foreach (var area in areaList)
{
area.Delete();
}
}
public async Task DeleteUserAreaListByUserId(string userId)
{
var areaList = await _sysUserAreaRep.DetachedEntities.Where(ua => ua.SysUserId == userId).ToListAsync();
foreach (var area in areaList)
{
area.Delete();
}
}
public async Task<List<string>> GetUserAreaIdList(string userId)
{
return await _sysUserAreaRep.DetachedEntities.Where(ua => ua.SysUserId == userId).Select(ua => ua.AreaCode).ToListAsync();
}
public async Task GrantData(UpdateUserInput input)
{
var dataScopes = await _sysUserAreaRep.Where(u => u.SysUserId == input.Id).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
var dbset = _sysUserAreaRep.Entities;
await _sysUserAreaRep.InsertAsync(input.GrantAreaCodeList.Select(u => new SysUserArea
{
SysUserId = input.Id,
AreaCode = u
}));
}
}
}

View File

@@ -0,0 +1,94 @@
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Ewide.Core.Service
{
/// <summary>
/// 用户数据范围服务
/// </summary>
public class SysUserDataScopeService : ISysUserDataScopeService, ITransient
{
private readonly IRepository<SysUserDataScope> _sysUserDataScopeRep; // 用户数据范围表仓储
private readonly IRepository<SysUserArea> _sysUserAreaRep;
private readonly IRepository<SysOrg> _sysOrgRep;
public SysUserDataScopeService(IRepository<SysUserDataScope> sysUserDataScopeRep, IRepository<SysUserArea> sysUserAreaRep, IRepository<SysOrg> sysOrgRep)
{
_sysUserDataScopeRep = sysUserDataScopeRep;
_sysUserAreaRep = sysUserAreaRep;
_sysOrgRep = sysOrgRep;
}
/// <summary>
/// 授权用户数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
public async Task GrantData(UpdateUserInput input)
{
var dataScopes = await _sysUserDataScopeRep.Where(u => u.SysUserId == input.Id).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
input.GrantOrgIdList.ForEach(u =>
{
new SysUserDataScope
{
SysUserId = input.Id,
SysOrgId = u
}.Insert();
});
var areas = await _sysUserAreaRep.Where(u => u.SysUserId == input.Id).ToListAsync();
areas.ForEach(u =>
{
u.Delete();
});
input.GrantAreaCodeList.ForEach(u =>
{
new SysUserArea
{
SysUserId = input.Id,
AreaCode = u
}.Insert();
});
}
/// <summary>
/// 根据机构Id集合删除对应的用户-数据范围关联信息
/// </summary>
/// <param name="orgIdList"></param>
/// <returns></returns>
public async Task DeleteUserDataScopeListByOrgIdList(List<string> orgIdList)
{
var dataScopes = await _sysUserDataScopeRep.Where(u => orgIdList.Contains(u.SysOrgId)).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
}
/// <summary>
/// 根据用户Id删除对应的用户-数据范围关联信息
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task DeleteUserDataScopeListByUserId(string userId)
{
var dataScopes = await _sysUserDataScopeRep.Where(u => u.SysUserId == userId).ToListAsync();
dataScopes.ForEach(u =>
{
u.Delete();
});
}
}
}

View File

@@ -0,0 +1,88 @@
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DependencyInjection;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Ewide.Core.Service
{
/// <summary>
/// 用户角色服务
/// </summary>
public class SysUserRoleService : ISysUserRoleService, ITransient
{
private readonly IRepository<SysUserRole> _sysUserRoleRep; // 用户权限表仓储
private readonly ISysRoleService _sysRoleService;
public SysUserRoleService(IRepository<SysUserRole> sysUserRoleRep, ISysRoleService sysRoleService)
{
_sysUserRoleRep = sysUserRoleRep;
_sysRoleService = sysRoleService;
}
/// <summary>
/// 获取用户的角色Id集合
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<List<string>> GetUserRoleIdList(string userId)
{
return await _sysUserRoleRep.DetachedEntities.Where(u => u.SysUserId == userId).Select(u => u.SysRoleId).ToListAsync();
}
/// <summary>
/// 授权用户角色
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
public async Task GrantRole(UpdateUserInput input)
{
var userRoles = await _sysUserRoleRep.Where(u => u.SysUserId == input.Id).ToListAsync();
userRoles.ForEach(u =>
{
u.Delete();
});
input.GrantRoleIdList.ForEach(u =>
{
new SysUserRole
{
SysUserId = input.Id,
SysRoleId = u
}.Insert();
});
}
/// <summary>
/// 根据角色Id删除对应的用户-角色表关联信息
/// </summary>
/// <param name="roleId"></param>
/// <returns></returns>
public async Task DeleteUserRoleListByRoleId(string roleId)
{
var userRoles = await _sysUserRoleRep.Where(u => u.SysRoleId == roleId).ToListAsync();
userRoles.ForEach(u =>
{
u.Delete();
});
}
/// <summary>
/// 根据用户Id删除对应的用户-角色表关联信息
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task DeleteUserRoleListByUserId(string userId)
{
var userRoles = await _sysUserRoleRep.Where(u => u.SysUserId == userId).ToListAsync();
userRoles.ForEach(u =>
{
u.Delete();
});
}
}
}

View File

@@ -0,0 +1,704 @@
using Ewide.Core.Service.Role;
using Ewide.Core.Service.User.Dto;
using Ewide.Core.Util;
using Furion;
using Furion.DatabaseAccessor;
using Furion.DatabaseAccessor.Extensions;
using Furion.DataEncryption;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Furion.FriendlyException;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Ewide.Core.Service
{
/// <summary>
/// 用户服务
/// </summary>
[ApiDescriptionSettings(Name = "User", Order = 150)]
public class SysUserService : ISysUserService, IDynamicApiController, ITransient
{
private readonly IRepository<SysUser> _sysUserRep; // 用户表仓储
private readonly IRepository<SysOrg> _sysOrgRep;
private readonly IRepository<SysEmp> _sysEmpRep;
private readonly IUserManager _userManager;
private readonly ISysCacheService _sysCacheService;
private readonly ISysEmpService _sysEmpService;
private readonly IMemoryCache _iMemoryCache;
private readonly ISysUserDataScopeService _sysUserDataScopeService;
private readonly ISysUserRoleService _sysUserRoleService;
private readonly ISysUserAreaService _sysUserAreaService;
public SysUserService(IRepository<SysUser> sysUserRep,
IRepository<SysOrg> sysOrgRep,
IRepository<SysEmp> sysEmpRep,
IUserManager userManager,
IMemoryCache memoryCache,
ISysCacheService sysCacheService,
ISysEmpService sysEmpService,
ISysUserDataScopeService sysUserDataScopeService,
ISysUserRoleService sysUserRoleService,
ISysUserAreaService sysUserAreaService)
{
_sysUserRep = sysUserRep;
_sysOrgRep = sysOrgRep;
_sysEmpRep = sysEmpRep;
_userManager = userManager;
_iMemoryCache = memoryCache;
_sysCacheService = sysCacheService;
_sysEmpService = sysEmpService;
_sysUserDataScopeService = sysUserDataScopeService;
_sysUserRoleService = sysUserRoleService;
_sysUserAreaService = sysUserAreaService;
}
/// <summary>
/// 分页查询用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/page")]
public async Task<dynamic> QueryUserPageList([FromBody] UserInput input)
{
var superAdmin = _userManager.SuperAdmin;
var searchValue = input.SearchValue;
var pid = input.SysEmpParam.OrgId;
var sysEmpRep = Db.GetRepository<SysEmp>();
var dataScopes = await _userManager.GetUserAllDataScopeList();
var users = await _sysUserRep.DetachedEntities
.Join(sysEmpRep.DetachedEntities, u => u.Id, e => e.Id, (u, e) => new { u, e })
.Join(_sysOrgRep.DetachedEntities, n => n.e.OrgId, o => o.Id, (n, o) => new { n, o })
.Where(!string.IsNullOrEmpty(searchValue), x => (x.n.u.Account.Contains(input.SearchValue) ||
x.n.u.Name.Contains(input.SearchValue) ||
x.n.u.Phone.Contains(input.SearchValue)))
.Where(!string.IsNullOrEmpty(pid), x => input.TreeNodeDataScope.GetValueOrDefault(1) == 2 ? (x.n.e.OrgId == pid ||
x.o.Pids.Contains($"[{pid.Trim()}]")) : x.n.e.OrgId == pid )
.Where(input.SearchStatus >= 0, x => x.n.u.Status == input.SearchStatus)
.Where(!superAdmin, x => x.n.u.AdminType != AdminType.SuperAdmin)
.Where(!superAdmin && dataScopes.Count > 0, x => dataScopes.Contains(x.n.e.OrgId))
.Select(u => u.n.u.Adapt<UserOutput>()).ToPagedListAsync(input.PageIndex, input.PageSize);
//var emps = new List<Task<EmpOutput>>();
//users.Items.ToList().ForEach(u =>
//{
// emps.Add(_sysEmpService.GetEmpInfo(long.Parse(u.Id)));
//});
//await Task.WhenAll(emps);
//foreach (var user in users.Items)
//{
// user.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id);
//}
return PageDataResult<UserOutput>.PageResult(users);
}
/// <summary>
/// 增加用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/add")]
[UnitOfWork]
public async Task<dynamic> AddUser(AddUserInput input)
{
// 数据范围检查
await CheckDataScope(input);
var email = input.Email?.ToLower();
var isExist = await _sysUserRep.AnyAsync(u =>
input.Account.Equals(u.Account) ||
input.Account.Equals(u.Phone) ||
input.Account.Equals(u.Email) ||
(!string.IsNullOrWhiteSpace(input.Phone) && (
input.Phone.Equals(u.Account) ||
input.Phone.Equals(u.Phone)
)) ||
(!string.IsNullOrWhiteSpace(email) && (
email.Equals(u.Account) ||
email.Equals(u.Email)
))
, false);
if (isExist) throw Oops.Oh(ErrorCode.D1003);
input.Password = CommonConst.DEFAULT_PASSWORD;
var user = input.Adapt<SysUser>();
user.Password = MD5Encryption.Encrypt(input.Password);
if (string.IsNullOrEmpty(user.Name))
user.Name = user.Account;
if (string.IsNullOrEmpty(user.NickName))
user.NickName = user.Name;
var id = Guid.NewGuid().ToString();
user.Id = id;
await _sysUserRep.InsertAsync(user);
input.SysEmpParam.Id = id;
// 增加员工信息
await _sysEmpService.AddOrUpdate(input.SysEmpParam);
return id;
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/delete")]
[UnitOfWork]
public async Task DeleteUser(DeleteUserInput input)
{
var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id);
if (user.AdminType == AdminType.SuperAdmin)
throw Oops.Oh(ErrorCode.D1014);
// 数据范围检查
await CheckDataScope(input);
// 直接删除用户
await user.DeleteAsync();
// 删除员工及附属机构职位信息
await _sysEmpService.DeleteEmpInfoByUserId(user.Id);
//删除该用户对应的用户-角色表关联信息
await _sysUserRoleService.DeleteUserRoleListByUserId(user.Id);
//删除该用户对应的用户-数据范围表关联信息
await _sysUserDataScopeService.DeleteUserDataScopeListByUserId(user.Id);
}
/// <summary>
/// 更新用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/edit")]
[UnitOfWork]
public async Task UpdateUser(UpdateUserInput input)
{
// 数据范围检查
await CheckDataScope(input);
var email = input.Email?.ToLower();
// 排除自己并且判断与其他是否相同
var isExist = await _sysUserRep.AnyAsync(u =>
(input.Account.Equals(u.Account) && !input.Id.Equals(u.Id)) ||
input.Account.Equals(u.Phone) ||
input.Account.Equals(u.Email) ||
(!string.IsNullOrWhiteSpace(input.Phone) && (
input.Phone.Equals(u.Account) ||
(input.Phone.Equals(u.Phone) && !input.Id.Equals(u.Id))
)) ||
(!string.IsNullOrWhiteSpace(email) && (
email.Equals(u.Account) ||
(email.Equals(u.Email) && !input.Id.Equals(u.Id))
))
, false);
if (isExist) throw Oops.Oh(ErrorCode.D1003);
var user = input.Adapt<SysUser>();
await user.UpdateIncludeAsync(new[] {
nameof(SysUser.Account),
nameof(SysUser.NickName),
nameof(SysUser.Name),
nameof(SysUser.Birthday),
nameof(SysUser.Sex),
nameof(SysUser.Email),
nameof(SysUser.Phone),
nameof(SysUser.Tel),
}, true);
// user.UpdateIncludeNow(new[] { nameof(SysUser.Birthday) });
input.SysEmpParam.Id = user.Id.ToString();
// 更新员工及附属机构职位信息
await _sysEmpService.AddOrUpdate(input.SysEmpParam);
}
/// <summary>
/// 查看用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysUser/detail")]
public async Task<dynamic> GetUser([FromQuery] QueryUserInput input)
{
var user = await _sysUserRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id);
var userDto = user.Adapt<UserOutput>();
if (userDto != null)
{
userDto.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id);
}
return userDto;
}
/// <summary>
/// 修改用户状态
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/changeStatus")]
public async Task ChangeUserStatus(UpdateUserInput input)
{
var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id);
if (user.AdminType == AdminType.SuperAdmin)
throw Oops.Oh(ErrorCode.D1015);
if (!Enum.IsDefined(typeof(CommonStatus), input.Status))
throw Oops.Oh(ErrorCode.D3005);
user.Status = input.Status;
}
/// <summary>
/// 授权用户角色
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/grantRole")]
public async Task GrantUserRole(UpdateUserInput input)
{
// 数据范围检查
await CheckDataScope(input);
await _sysUserRoleService.GrantRole(input);
}
/// <summary>
/// 授权用户数据范围
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/grantData")]
public async Task GrantUserData(UpdateUserInput input)
{
// 数据范围检查
await CheckDataScope(input);
await _sysUserDataScopeService.GrantData(input);
}
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/updateInfo")]
public async Task UpdateUserInfo(UserInput input)
{
var user = input.Adapt<SysUser>();
user.Id = _userManager.UserId;
await user.UpdateExcludeAsync(new string[] {
nameof(SysUser.Account),
nameof(SysUser.SecurityLevel),
nameof(SysUser.Name),
nameof(SysUser.Password),
nameof(SysUser.AdminType),
nameof(SysUser.Status),
// 邮箱和手机号作为安全验证的方式,不能在此处直接进行修改
nameof(SysUser.Phone),
nameof(SysUser.Email)
}, true);
}
/// <summary>
/// 修改用户密码
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/updatePwd")]
public async Task UpdateUserPwd(ChangePasswordUserInput input)
{
var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == _userManager.UserId);
var Password = RSAHandler.RSADecrypt(input.Password);
Password = MD5Encryption.Encrypt(Password);
if (Password != user.Password)
{
throw Oops.Oh("旧密码不正确");
}
var newPassword = RSAHandler.RSADecrypt(input.NewPassword);
// 验证新密码强度
var pattern = App.Configuration.GetSection("SimplePassword:Pattern").Value;
if (!Regex.Match(newPassword, pattern).Success)
{
throw Oops.Oh("新密码强度不符合规则");
}
newPassword = MD5Encryption.Encrypt(newPassword);
if (newPassword.Equals(user.Password))
throw Oops.Oh(ErrorCode.D10041);
user.Password = newPassword;
}
/// <summary>
/// 获取用户拥有角色
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysUser/ownRole")]
public async Task<dynamic> GetUserOwnRole([FromQuery] QueryUserInput input)
{
return await _sysUserRoleService.GetUserRoleIdList(input.Id);
}
/// <summary>
/// 获取用户拥有数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysUser/ownData")]
public async Task<dynamic> GetUserOwnData([FromQuery] QueryUserInput input)
{
return await _userManager.GetUserExtraDataScopeList(input.Id);
}
/// <summary>
/// 获取用户拥有区域
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysUser/ownArea")]
public async Task<dynamic> GetUserOwnArea([FromQuery] QueryUserInput input)
{
return await _userManager.GetUserExtraAreaScopeList(input.Id);
}
/// <summary>
/// 重置用户密码
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/resetPwd")]
public async Task ResetUserPwd(QueryUserInput input)
{
var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id);
user.Password = MD5Encryption.Encrypt(CommonConst.DEFAULT_PASSWORD);
}
/// <summary>
/// 修改用户头像(未实现)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/updateAvatar")]
public async Task UpdateAvatar(UserInput input)
{
var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == _userManager.UserId);
// 调用文件上传
//sysFileInfoService.assertFile(input.Avatar);
user.Avatar = input.Avatar;
}
/// <summary>
/// 获取用户选择器
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysUser/selector")]
public async Task<dynamic> GetUserSelector([FromQuery] UserInput input)
{
var name = !string.IsNullOrEmpty(input.Name?.Trim());
return await _sysUserRep.DetachedEntities
.Where(name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%"))
.Where(u => u.Status != CommonStatus.DELETED)
.Where(u => u.AdminType != AdminType.SuperAdmin)
.Select(u => new
{
u.Id,
u.Name
}).ToListAsync();
}
/// <summary>
/// 用户导出(未实现)
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpGet("/sysUser/export")]
public async Task ExportUser([FromQuery] UserInput input)
{
await Task.CompletedTask;
}
/// <summary>
/// 根据用户Id获取用户
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
[NonAction]
public async Task<dynamic> GetUserById(string userId)
{
return await _sysUserRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == userId);
}
/// <summary>
/// 将OAuth账号转换成账号
/// </summary>
/// <param name="authUser"></param>
/// <param name="sysUser"></param>
/// <returns></returns>
[NonAction]
public async Task SaveAuthUserToUser(AuthUserInput authUser, UserInput sysUser)
{
var user = sysUser.Adapt<SysUser>();
user.AdminType = AdminType.None; // 非管理员
// oauth账号与系统账号判断
var isExist = await _sysUserRep.DetachedEntities.AnyAsync(u => u.Account == authUser.Username);
user.Account = isExist ? authUser.Username + DateTime.Now.Ticks : authUser.Username;
user.Name = user.NickName = authUser.Nickname;
user.Email = authUser.Email;
user.Sex = (int)authUser.Gender;
await user.InsertAsync();
}
/// <summary>
/// 检查普通用户数据范围
/// </summary>
/// <param name="userParam"></param>
/// <returns></returns>
private async Task CheckDataScope(UserInput userParam)
{
// 如果当前用户不是超级管理员,则进行数据范围校验
if (!_userManager.SuperAdmin)
{
var dataScopes = await _userManager.GetUserAllDataScopeList();
if (dataScopes == null || (userParam.SysEmpParam.OrgId != null && !dataScopes.Contains(userParam.SysEmpParam.OrgId)))
throw Oops.Oh(ErrorCode.D1013);
}
}
///<summary>
///发送验证码
/// </summary>
[HttpPost("/sysUser/sendCode")]
public async Task<dynamic> SendCode(Usermailphone input)
{
var Orgcode_Key = "ewide_Orgcode";
var Smscode_Key = "ewide_smscode";
var Mailcode_Key = "ewide_mailcode";
var Regex_phone = @"^((13[0-9])|(14[5,7])|(15[^4,\\D])|(17[0,1,3,6-8])|(18[0-9])|(19[8,9])|(166))[0-9]{8}$";
var Regex_Email = @"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$";
CodeHelper ch = new CodeHelper(_iMemoryCache, _sysUserRep, _userManager);
//Type为1时给原手机号发送验证码
if (input.Type == 1)
{
try
{
return ch.SendSmscode(_userManager.User.Phone, Orgcode_Key);
}
catch (Exception e)
{
throw Oops.Oh(ErrorCode.D1018);
}
}
//Type为2时给原邮箱发送验证码
else if (input.Type == 2)
{
if (new Regex(Regex_Email).IsMatch(_userManager.User.Email))
{
try
{
return ch.SendMail(_userManager.User.Email, Orgcode_Key);
}
catch (Exception e)
{
throw Oops.Oh(ErrorCode.D1018);
}
}
throw Oops.Oh("原邮箱错误");
}
//Type为null时则发验证码
else
{
await ch.CheckRepeat(input.Target);
//通过正则判断绑定类型
if (new Regex(Regex_phone).IsMatch(input.Target))
{
try
{
ch.SendSmscode(input.Target, Smscode_Key);
return true;
}
catch (Exception e)
{
throw Oops.Oh(ErrorCode.D1018);
}
}
if (new Regex(Regex_Email).IsMatch(input.Target))
{
try
{
ch.SendMail(input.Target, Mailcode_Key);
return true;
}
catch (Exception e)
{
throw Oops.Oh(ErrorCode.D1018);
}
}
throw Oops.Oh("格式错误");
}
}
///<summary>
///检验验证码并且绑定
/// </summary>
[HttpPost("/sysUser/checkBindcode")]
public async Task<dynamic> CheckBindcode(Usermailphone input)
{
var Orgcode_Key = "ewide_Orgcode";
var Smscode_Key = "ewide_smscode";
var Mailcode_Key = "ewide_mailcode";
var Regex_phone = @"^((13[0-9])|(14[5,7])|(15[^4,\\D])|(17[0,1,3,6-8])|(18[0-9])|(19[8,9])|(166))[0-9]{8}$";
var Regex_Email = @"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$";
var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == _userManager.UserId);
CodeHelper ch = new CodeHelper(_iMemoryCache, _sysUserRep,_userManager);
if (input.Type == 1)
{
if (ch.Checkcode(_userManager.User.Phone, input.Orgcode, Orgcode_Key))
{
return true;
};
throw Oops.Oh("验证错误");
}
else if (input.Type == 2)
{
if (ch.Checkcode(_userManager.User.Email, input.Orgcode, Orgcode_Key))
{
return true;
}
throw Oops.Oh("验证错误");
}
else
{
//为第一次绑定
if (string.IsNullOrEmpty(_userManager.User.Phone) && string.IsNullOrEmpty(_userManager.User.Email))
{
if (new Regex(Regex_phone).IsMatch(input.Target))
{
if (ch.Checkcode(input.Target, input.Code, Smscode_Key))
{
try
{
user.Phone = input.Target;
await user.UpdateIncludeNowAsync(new string[] {
nameof(SysUser.Phone)
}, true);
return "手机绑定成功";
}
catch
{
throw Oops.Oh("手机绑定错误");
}
}
throw Oops.Oh("验证码失效");
}
if (new Regex(Regex_Email).IsMatch(input.Target))
{
if (ch.Checkcode(input.Target, input.Code, Mailcode_Key))
{
try
{
user.Email = input.Target;
await user.UpdateIncludeNowAsync(new string[] {
nameof(SysUser.Email)
}, true);
return "邮箱绑定成功";
}
catch
{
throw Oops.Oh("邮箱绑定错误");
}
}
throw Oops.Oh("验证码失效");
}
throw Oops.Oh("号码格式不对");
}
else
{
bool CheckOrgPhone = ch.Checkcode(_userManager.User.Phone, input.Orgcode, Orgcode_Key);
bool CheckOrgEmail = ch.Checkcode(_userManager.User.Email, input.Orgcode, Orgcode_Key);
if (CheckOrgPhone || CheckOrgEmail)
{
if (new Regex(Regex_phone).IsMatch(input.Target))
{
if (ch.Checkcode(input.Target, input.Code, Smscode_Key))
{
try
{
user.Phone = input.Target;
await user.UpdateIncludeNowAsync(new string[] {
nameof(SysUser.Phone)
}, true);
return "手机改绑成功";
}
catch
{
throw Oops.Oh("手机绑定错误");
}
}
throw Oops.Oh("验证码失效");
}
if (new Regex(Regex_Email).IsMatch(input.Target))
{
if (ch.Checkcode(input.Target, input.Code, Mailcode_Key))
{
try
{
user.Email = input.Target;
await user.UpdateIncludeNowAsync(new string[] {
nameof(SysUser.Email)
}, true);
return "邮箱改绑成功";
}
catch
{
throw Oops.Oh("邮箱绑定错误");
}
}
throw Oops.Oh("验证码失效");
}
throw Oops.Oh("号码格式不对");
}
throw Oops.Oh("验证码失效");
}
}
}
/// <summary>
/// 获取密码强度配置
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("/sysUser/getPwdRule")]
public async Task<dynamic> GetPwdRule()
{
return new LoginOutput
{
Pattern = App.Configuration.GetSection("SimplePassword:Pattern").Value,
Descriptions = App.Configuration.GetSection("SimplePassword:Descriptions").Value
};
}
[HttpPost("/sysUser/GetOrgUserTree")]
public async Task<dynamic> GetOrgUserTree(OrgUserInput input)
{
var list = await (from u in _sysUserRep.DetachedEntities
join e in _sysEmpRep.DetachedEntities on u.Id equals e.Id
select new OrgUserTreeNode { Id = u.Id, ParentId = e.OrgId, Type = 1, Name = u.Name }).Union(
from o in _sysOrgRep.DetachedEntities
select new OrgUserTreeNode { Id = o.Id, ParentId = o.Pid, Type = 0, Name = o.Name }).ToListAsync();
return new TreeBuildUtil<OrgUserTreeNode>(new TreeBuildSetting { AddEmptyChildren = false }).DoTreeBuild(list);
}
}
}