init commit
This commit is contained in:
27
20220330_Vote/Ewide.Core/Service/User/Dto/AuthToken.cs
Normal file
27
20220330_Vote/Ewide.Core/Service/User/Dto/AuthToken.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
22
20220330_Vote/Ewide.Core/Service/User/Dto/AuthUserInput.cs
Normal file
22
20220330_Vote/Ewide.Core/Service/User/Dto/AuthUserInput.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace Ewide.Core.Service
|
||||
{
|
||||
public class OrgUserInput
|
||||
{
|
||||
}
|
||||
}
|
||||
24
20220330_Vote/Ewide.Core/Service/User/Dto/OrgUserTreeNode.cs
Normal file
24
20220330_Vote/Ewide.Core/Service/User/Dto/OrgUserTreeNode.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
139
20220330_Vote/Ewide.Core/Service/User/Dto/UserInput.cs
Normal file
139
20220330_Vote/Ewide.Core/Service/User/Dto/UserInput.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
85
20220330_Vote/Ewide.Core/Service/User/Dto/UserOutput.cs
Normal file
85
20220330_Vote/Ewide.Core/Service/User/Dto/UserOutput.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
31
20220330_Vote/Ewide.Core/Service/User/Dto/Userphone.cs
Normal file
31
20220330_Vote/Ewide.Core/Service/User/Dto/Userphone.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
16
20220330_Vote/Ewide.Core/Service/User/ISysUserAreaService.cs
Normal file
16
20220330_Vote/Ewide.Core/Service/User/ISysUserAreaService.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
13
20220330_Vote/Ewide.Core/Service/User/ISysUserRoleService.cs
Normal file
13
20220330_Vote/Ewide.Core/Service/User/ISysUserRoleService.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
35
20220330_Vote/Ewide.Core/Service/User/ISysUserService.cs
Normal file
35
20220330_Vote/Ewide.Core/Service/User/ISysUserService.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
61
20220330_Vote/Ewide.Core/Service/User/SysUserAreaService.cs
Normal file
61
20220330_Vote/Ewide.Core/Service/User/SysUserAreaService.cs
Normal 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
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
88
20220330_Vote/Ewide.Core/Service/User/SysUserRoleService.cs
Normal file
88
20220330_Vote/Ewide.Core/Service/User/SysUserRoleService.cs
Normal 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();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
704
20220330_Vote/Ewide.Core/Service/User/SysUserService.cs
Normal file
704
20220330_Vote/Ewide.Core/Service/User/SysUserService.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user