Merge branch 'master' of http://118.178.224.202:3000/ewide/ewide_core
This commit is contained in:
@@ -82,7 +82,9 @@ WHERE 1=1";
|
||||
|
||||
if (!string.IsNullOrEmpty(input.SysEmpParam.OrgId))
|
||||
{
|
||||
sql += " AND (SO.Id = @OrgId OR SO.Pids Like CONCAT('%[', @OrgId, ']%'))";
|
||||
var filter = " AND (SO.Id = @OrgId {0}) ";
|
||||
filter = String.Format(filter, input.TreeNodeDataScope.GetValueOrDefault(1) == 2 ? " OR SO.Pids Like CONCAT('%[', @OrgId, ']%') " : "");
|
||||
sql += filter;
|
||||
param.Add("OrgId", input.SysEmpParam.OrgId);
|
||||
}
|
||||
|
||||
|
||||
@@ -59,13 +59,13 @@ namespace Ewide.Core
|
||||
/// 发布时间
|
||||
/// </summary>
|
||||
[Comment("发布时间")]
|
||||
public DateTime PublicTime { get; set; }
|
||||
public DateTime? PublicTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 撤回时间
|
||||
/// </summary>
|
||||
[Comment("撤回时间")]
|
||||
public DateTime CancelTime { get; set; }
|
||||
public DateTime? CancelTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 状态(字典 0草稿 1发布 2撤回 3删除)
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace Ewide.Core
|
||||
/// </summary>
|
||||
[Table("sys_notice_user")]
|
||||
[Comment("通知公告用户表")]
|
||||
public class SysNoticeUser : IEntity, IEntityTypeBuilder<SysNoticeUser>
|
||||
public class SysNoticeUser : DEntityBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 通知公告Id
|
||||
@@ -31,7 +31,7 @@ namespace Ewide.Core
|
||||
/// 阅读时间
|
||||
/// </summary>
|
||||
[Comment("阅读时间")]
|
||||
public DateTime ReadTime { get; set; }
|
||||
public DateTime? ReadTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 状态(字典 0未读 1已读)
|
||||
|
||||
@@ -2674,6 +2674,11 @@
|
||||
查询条件
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.PageInputBase.TreeNodeDataScope">
|
||||
<summary>
|
||||
树节点数据范围 (1"只看本级" 2"查看本级及以下")
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Ewide.Core.PageDataResult`1">
|
||||
<summary>
|
||||
小诺分页列表结果
|
||||
@@ -3223,122 +3228,132 @@
|
||||
</summary>
|
||||
<example>123456</example>
|
||||
</member>
|
||||
<member name="T:Ewide.Core.Service.LoginOutput">
|
||||
<member name="P:Ewide.Core.Service.LoginPassInput.NewPassword">
|
||||
<summary>
|
||||
新密码
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginPassInput.Confirm">
|
||||
<summary>
|
||||
确认密码
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Ewide.Core.Service.LoginUserOutput">
|
||||
<summary>
|
||||
用户登录输出参数
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Id">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Id">
|
||||
<summary>
|
||||
主键
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Account">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Account">
|
||||
<summary>
|
||||
账号
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.SecurityLevel">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.SecurityLevel">
|
||||
<summary>
|
||||
密码安全级别
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.NickName">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.NickName">
|
||||
<summary>
|
||||
昵称
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Name">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Name">
|
||||
<summary>
|
||||
姓名
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Avatar">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Avatar">
|
||||
<summary>
|
||||
头像
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Birthday">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Birthday">
|
||||
<summary>
|
||||
生日
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Sex">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Sex">
|
||||
<summary>
|
||||
性别(字典 1男 2女)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Email">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Email">
|
||||
<summary>
|
||||
邮箱
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Phone">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Phone">
|
||||
<summary>
|
||||
手机
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Tel">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Tel">
|
||||
<summary>
|
||||
电话
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.AdminType">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.AdminType">
|
||||
<summary>
|
||||
管理员类型(0超级管理员 1非管理员)
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.LastLoginIp">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.LastLoginIp">
|
||||
<summary>
|
||||
最后登陆IP
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.LastLoginTime">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.LastLoginTime">
|
||||
<summary>
|
||||
最后登陆时间
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.LastLoginAddress">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.LastLoginAddress">
|
||||
<summary>
|
||||
最后登陆地址
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.LastLoginBrowser">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.LastLoginBrowser">
|
||||
<summary>
|
||||
最后登陆所用浏览器
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.LastLoginOs">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.LastLoginOs">
|
||||
<summary>
|
||||
最后登陆所用系统
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.LoginEmpInfo">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.LoginEmpInfo">
|
||||
<summary>
|
||||
员工信息
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Apps">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Apps">
|
||||
<summary>
|
||||
具备应用信息
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Roles">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Roles">
|
||||
<summary>
|
||||
角色信息
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Permissions">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Permissions">
|
||||
<summary>
|
||||
权限信息
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.Menus">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.Menus">
|
||||
<summary>
|
||||
登录菜单信息---AntDesign版本菜单
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.LoginOutput.DataScopes">
|
||||
<member name="P:Ewide.Core.Service.LoginUserOutput.DataScopes">
|
||||
<summary>
|
||||
数据范围(机构)信息
|
||||
</summary>
|
||||
@@ -5536,6 +5551,12 @@
|
||||
<param name="input"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Ewide.Core.Service.Notice.SysNoticeService.GetUnreadCount">
|
||||
<summary>
|
||||
获取接收到的通知公告总数
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Ewide.Core.Service.Notice.SysNoticeService.UpdatePublicInfo(Ewide.Core.SysNotice)">
|
||||
<summary>
|
||||
更新发布信息
|
||||
@@ -6798,16 +6819,6 @@
|
||||
账号
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.AddUserInput.Password">
|
||||
<summary>
|
||||
密码
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.AddUserInput.Confirm">
|
||||
<summary>
|
||||
确认密码
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:Ewide.Core.Service.DeleteUserInput.Id">
|
||||
<summary>
|
||||
用户Id
|
||||
|
||||
@@ -76,6 +76,11 @@ namespace Ewide.Core
|
||||
/// 查询条件
|
||||
/// </summary>
|
||||
public virtual SearchInfo[] SearchInfo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 树节点数据范围 (1"只看本级" 2"查看本级及以下")
|
||||
/// </summary>
|
||||
public virtual int? TreeNodeDataScope { get; set; }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -202,7 +202,7 @@ namespace Ewide.Core
|
||||
.Select(u => u.Permission).ToListAsync();
|
||||
#if DEBUG
|
||||
#else
|
||||
await _sysCacheService.SetPermission(userId, permissions); // 缓存结果
|
||||
await _sysCacheService.SetPermission(UserId, permissions); // 缓存结果
|
||||
#endif
|
||||
}
|
||||
return permissions;
|
||||
|
||||
@@ -14,6 +14,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using UAParser;
|
||||
|
||||
@@ -68,20 +69,85 @@ namespace Ewide.Core.Service
|
||||
/// <returns></returns>
|
||||
[HttpPost("/login")]
|
||||
[AllowAnonymous]
|
||||
public async Task<string> LoginAsync([Required] LoginInput input)
|
||||
public async Task<LoginOutput> LoginAsync([Required] LoginInput input)
|
||||
{
|
||||
string pwd = RSAHandler.RSADecrypt(input.Password);
|
||||
// 获取加密后的密码
|
||||
var encryptPasswod = MD5Encryption.Encrypt(pwd);
|
||||
var password = RSAHandler.RSADecrypt(input.Password);
|
||||
|
||||
var user = await GetUser(input);
|
||||
|
||||
#if !DEBUG
|
||||
// 验证密码强度
|
||||
var pattern = App.Configuration.GetSection("SimplePassword:Pattern").Value;
|
||||
if (!Regex.Match(password, pattern).Success)
|
||||
{
|
||||
return new LoginOutput
|
||||
{
|
||||
Passed = false,
|
||||
Pattern = pattern,
|
||||
Descriptions = App.Configuration.GetSection("SimplePassword:Descriptions").Value
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
||||
return new LoginOutput
|
||||
{
|
||||
Passed = true,
|
||||
Token = await HandlerLoginAsync(user)
|
||||
};
|
||||
}
|
||||
|
||||
[HttpPost("/loginPass")]
|
||||
[AllowAnonymous]
|
||||
public async Task<LoginOutput> LoginPassAsync([Required] LoginPassInput input)
|
||||
{
|
||||
var user = await GetUser(input);
|
||||
|
||||
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;
|
||||
|
||||
return new LoginOutput
|
||||
{
|
||||
Passed = true,
|
||||
Token = await HandlerLoginAsync(user)
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
private async Task<SysUser> GetUser(LoginInput input)
|
||||
{
|
||||
var password = RSAHandler.RSADecrypt(input.Password);
|
||||
// 获取加密后的密码
|
||||
var encryptPasswod = MD5Encryption.Encrypt(password);
|
||||
|
||||
#if DEBUG
|
||||
var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Account.Equals(input.Account) || u.Phone.Equals(input.Account) || u.Email.Equals(input.Account));
|
||||
#else
|
||||
// 判断用户名和密码是否正确
|
||||
var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Account.Equals(input.Account) && u.Password.Equals(encryptPasswod));
|
||||
var user = await _sysUserRep.FirstOrDefaultAsync(u => (u.Account.Equals(input.Account) || u.Phone.Equals(input.Account) || u.Email.Equals(input.Account)) && u.Password.Equals(encryptPasswod));
|
||||
_ = user ?? throw Oops.Oh(ErrorCode.D1000);
|
||||
#endif
|
||||
|
||||
// 验证账号是否被冻结
|
||||
if (user.Status == CommonStatus.DISABLE)
|
||||
throw Oops.Oh(ErrorCode.D1017);
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
|
||||
private async Task<string> HandlerLoginAsync(SysUser user)
|
||||
{
|
||||
// 生成Token令牌
|
||||
//var accessToken = await _jwtBearerManager.CreateTokenAdmin(user);
|
||||
var accessToken = JWTEncryption.Encrypt(new Dictionary<string, object>
|
||||
@@ -102,38 +168,40 @@ namespace Ewide.Core.Service
|
||||
_httpContextAccessor.HttpContext.Response.Headers["x-access-token"] = refreshToken;
|
||||
|
||||
// 增加登录日志
|
||||
var loginOutput = user.Adapt<LoginOutput>();
|
||||
var loginUserOutput = user.Adapt<LoginUserOutput>();
|
||||
var clent = Parser.GetDefault().Parse(App.GetService<IHttpContextAccessor>().HttpContext.Request.Headers["User-Agent"]);
|
||||
loginOutput.LastLoginBrowser = clent.UA.Family + clent.UA.Major;
|
||||
loginOutput.LastLoginOs = clent.OS.Family + clent.OS.Major;
|
||||
loginUserOutput.LastLoginBrowser = clent.UA.Family + clent.UA.Major;
|
||||
loginUserOutput.LastLoginOs = clent.OS.Family + clent.OS.Major;
|
||||
await new SysLogVis
|
||||
{
|
||||
Name = "登录",
|
||||
Success = true,
|
||||
Message = "登录成功",
|
||||
Ip = loginOutput.LastLoginIp,
|
||||
Browser = loginOutput.LastLoginBrowser,
|
||||
Os = loginOutput.LastLoginOs,
|
||||
Ip = loginUserOutput.LastLoginIp,
|
||||
Browser = loginUserOutput.LastLoginBrowser,
|
||||
Os = loginUserOutput.LastLoginOs,
|
||||
VisType = 1,
|
||||
VisTime = loginOutput.LastLoginTime,
|
||||
Account = loginOutput.Account
|
||||
VisTime = loginUserOutput.LastLoginTime,
|
||||
Account = loginUserOutput.Account
|
||||
}.InsertAsync();
|
||||
|
||||
return accessToken;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前登录用户信息
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("/getLoginUser")]
|
||||
public async Task<LoginOutput> GetLoginUserAsync()
|
||||
public async Task<LoginUserOutput> GetLoginUserAsync()
|
||||
{
|
||||
var user = _userManager.User;
|
||||
var userId = user.Id;
|
||||
|
||||
var httpContext = App.GetService<IHttpContextAccessor>().HttpContext;
|
||||
var loginOutput = user.Adapt<LoginOutput>();
|
||||
var loginOutput = user.Adapt<LoginUserOutput>();
|
||||
|
||||
// 隐藏手机号/邮箱中间几位
|
||||
loginOutput.Phone = String.IsNullOrEmpty(loginOutput.Phone) ? loginOutput.Phone
|
||||
@@ -197,7 +265,7 @@ namespace Ewide.Core.Service
|
||||
var userId = user.Id;
|
||||
|
||||
var httpContext = App.GetService<IHttpContextAccessor>().HttpContext;
|
||||
var loginOutput = user.Adapt<LoginOutput>();
|
||||
var loginOutput = user.Adapt<LoginUserOutput>();
|
||||
|
||||
|
||||
var ip = httpContext.Request.Headers["X-Real-IP"];
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Furion.DependencyInjection;
|
||||
using Furion;
|
||||
using Furion.DependencyInjection;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Ewide.Core.Service
|
||||
@@ -14,13 +15,29 @@ namespace Ewide.Core.Service
|
||||
/// </summary>
|
||||
/// <example>superAdmin</example>
|
||||
[Required(ErrorMessage = "用户名不能为空"), MinLength(3, ErrorMessage = "用户名不能少于3位字符")]
|
||||
public string Account { get; set; }
|
||||
public virtual string Account { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 密码
|
||||
/// </summary>
|
||||
/// <example>123456</example>
|
||||
[Required(ErrorMessage = "密码不能为空"), MinLength(5, ErrorMessage = "密码不能少于5位字符")]
|
||||
public string Password { get; set; }
|
||||
public virtual string Password { get; set; }
|
||||
}
|
||||
|
||||
[SkipScan]
|
||||
public class LoginPassInput : LoginInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 新密码
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "新密码不能为空")]
|
||||
public string NewPassword { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 确认密码
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "确认密码不能为空"), Compare(nameof(NewPassword), ErrorMessage = "两次密码不一致")]
|
||||
public string Confirm { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,20 @@ using System.Collections.Generic;
|
||||
|
||||
namespace Ewide.Core.Service
|
||||
{
|
||||
[SkipScan]
|
||||
public class LoginOutput
|
||||
{
|
||||
public bool Passed { get; set; }
|
||||
public string Pattern { get; set; }
|
||||
public string Descriptions { get; set; }
|
||||
public string Token { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用户登录输出参数
|
||||
/// </summary>
|
||||
[SkipScan]
|
||||
public class LoginOutput
|
||||
public class LoginUserOutput
|
||||
{
|
||||
/// <summary>
|
||||
/// 主键
|
||||
|
||||
@@ -7,8 +7,8 @@ namespace Ewide.Core.Service
|
||||
{
|
||||
Task<dynamic> GetCaptcha();
|
||||
Task<bool> GetCaptchaOpen();
|
||||
Task<LoginOutput> GetLoginUserAsync();
|
||||
Task<string> LoginAsync([Required] LoginInput input);
|
||||
Task<LoginUserOutput> GetLoginUserAsync();
|
||||
Task<LoginOutput> LoginAsync([Required] LoginInput input);
|
||||
Task LogoutAsync();
|
||||
Task<dynamic> VerificationCode(ClickWordCaptchaInput input);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace Ewide.Core.Service
|
||||
/// <summary>
|
||||
/// 发布人Id
|
||||
/// </summary>
|
||||
public long PublicUserId { get; set; }
|
||||
public string PublicUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发布人姓名
|
||||
@@ -35,7 +35,7 @@ namespace Ewide.Core.Service
|
||||
/// <summary>
|
||||
/// 发布机构Id
|
||||
/// </summary>
|
||||
public long PublicOrgId { get; set; }
|
||||
public string PublicOrgId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发布机构名称
|
||||
|
||||
@@ -39,6 +39,6 @@ namespace Ewide.Core.Service
|
||||
/// <summary>
|
||||
/// 阅读时间
|
||||
/// </summary>
|
||||
public DateTime ReadTime { get; set; }
|
||||
public DateTime? ReadTime { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using Furion.DatabaseAccessor;
|
||||
using Dapper;
|
||||
using Ewide.Core.Extension;
|
||||
using Furion.DatabaseAccessor;
|
||||
using Furion.DatabaseAccessor.Extensions;
|
||||
using Furion.DependencyInjection;
|
||||
using Furion.DynamicApiController;
|
||||
@@ -9,6 +11,7 @@ using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ewide.Core.Service.Notice
|
||||
@@ -26,15 +29,20 @@ namespace Ewide.Core.Service.Notice
|
||||
|
||||
private readonly ISysNoticeUserService _sysNoticeUserService;
|
||||
|
||||
private readonly IDapperRepository _dapperRepository;
|
||||
|
||||
|
||||
public SysNoticeService(IRepository<SysNotice> sysNoticeRep,
|
||||
IRepository<SysNoticeUser> sysNoticeUserRep,
|
||||
IUserManager userManager,
|
||||
ISysNoticeUserService sysNoticeUserService)
|
||||
ISysNoticeUserService sysNoticeUserService, IDapperRepository dapperRepository)
|
||||
{
|
||||
_sysNoticeRep = sysNoticeRep;
|
||||
_sysNoticeUserRep = sysNoticeUserRep;
|
||||
_userManager = userManager;
|
||||
_sysNoticeUserService = sysNoticeUserService;
|
||||
|
||||
_dapperRepository = dapperRepository;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -61,22 +69,26 @@ namespace Ewide.Core.Service.Notice
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("/sysNotice/add")]
|
||||
[UnitOfWork]
|
||||
public async Task AddNotice(AddNoticeInput input)
|
||||
{
|
||||
_sysNoticeRep.EnsureTransaction();
|
||||
if (input.Status != (int)NoticeStatus.DRAFT && input.Status != (int)NoticeStatus.PUBLIC)
|
||||
throw Oops.Oh(ErrorCode.D7000);
|
||||
|
||||
var notice = input.Adapt<SysNotice>();
|
||||
var id = System.Guid.NewGuid().ToString().ToLower();
|
||||
notice.Id = id;
|
||||
await UpdatePublicInfo(notice);
|
||||
// 如果是发布,则设置发布时间
|
||||
if (input.Status == (int)NoticeStatus.PUBLIC)
|
||||
notice.PublicTime = DateTime.Now;
|
||||
var newItem = await notice.InsertNowAsync();
|
||||
var newItem = await notice.InsertAsync();
|
||||
|
||||
// 通知到的人
|
||||
var noticeUserIdList = input.NoticeUserIdList;
|
||||
var noticeUserStatus = (int)NoticeUserStatus.UNREAD;
|
||||
await _sysNoticeUserService.Add(newItem.Entity.Id, noticeUserIdList, noticeUserStatus);
|
||||
await _sysNoticeUserService.Add(id, noticeUserIdList, noticeUserStatus);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -146,7 +158,6 @@ namespace Ewide.Core.Service.Notice
|
||||
var noticeUserRead = new NoticeUserRead
|
||||
{
|
||||
UserId = u.UserId,
|
||||
UserName = _userManager.Name,
|
||||
ReadStatus = u.ReadStatus,
|
||||
ReadTime = u.ReadTime
|
||||
};
|
||||
@@ -154,8 +165,11 @@ namespace Ewide.Core.Service.Notice
|
||||
});
|
||||
}
|
||||
var noticeResult = notice.Adapt<NoticeDetailOutput>();
|
||||
noticeResult.NoticeUserIdList = noticeUserIdList;
|
||||
noticeResult.NoticeUserReadInfoList = noticeUserReadInfoList;
|
||||
if (_userManager.SuperAdmin)
|
||||
{
|
||||
noticeResult.NoticeUserIdList = noticeUserIdList;
|
||||
noticeResult.NoticeUserReadInfoList = noticeUserReadInfoList;
|
||||
}
|
||||
// 如果该条通知公告为已发布,则将当前用户的该条通知公告设置为已读
|
||||
if (notice.Status == (int)NoticeStatus.PUBLIC)
|
||||
await _sysNoticeUserService.Read(notice.Id, _userManager.UserId, (int)NoticeUserStatus.READ);
|
||||
@@ -193,18 +207,45 @@ namespace Ewide.Core.Service.Notice
|
||||
/// </summary>
|
||||
/// <param name="input"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("/sysNotice/received")]
|
||||
public async Task<dynamic> ReceivedNoticePageList([FromQuery] NoticeInput input)
|
||||
[HttpPost("/sysNotice/received")]
|
||||
public async Task<dynamic> ReceivedNoticePageList([FromBody] NoticeInput input)
|
||||
{
|
||||
var searchValue = !string.IsNullOrEmpty(input.SearchValue?.Trim());
|
||||
var notices = await _sysNoticeRep.DetachedEntities.Join(_sysNoticeUserRep.DetachedEntities, u => u.Id, e => e.NoticeId, (u, e) => new { u, e })
|
||||
.Where(u => u.e.UserId == _userManager.UserId)
|
||||
.Where(searchValue, u => EF.Functions.Like(u.u.Title, $"%{input.SearchValue.Trim()}%") || EF.Functions.Like(u.u.Content, $"%{input.SearchValue.Trim()}%"))
|
||||
.Where(input.Type > 0, u => u.u.Type == input.Type)
|
||||
.Where(u => u.u.Status != (int)NoticeStatus.DELETED)
|
||||
.Select(u => u.u.Adapt<NoticeReceiveOutput>())
|
||||
.ToPagedListAsync(input.PageIndex, input.PageSize);
|
||||
return PageDataResult<NoticeReceiveOutput>.PageResult(notices);
|
||||
var sql = @"SELECT
|
||||
SN.*,
|
||||
SU.Avatar
|
||||
FROM sys_notice SN
|
||||
LEFT JOIN sys_notice_user SNU ON SN.Id = SNU.NoticeId
|
||||
LEFT JOIN sys_user SU ON SN.PublicUserId = SU.Id
|
||||
WHERE SNU.UserId = @UserId AND SN.Status <> @Status";
|
||||
|
||||
var data = await _dapperRepository.QueryPageDataDynamic(
|
||||
sql,
|
||||
input,
|
||||
new
|
||||
{
|
||||
_userManager.UserId,
|
||||
Status = (int)NoticeStatus.DELETED
|
||||
}
|
||||
);
|
||||
|
||||
data.Items = data.Items.Select(p => {
|
||||
var r = p.Adapt<dynamic>();
|
||||
r.Content = Regex.Replace(r.Content, @"<\/?.+?\/?>", "").Replace("\r\n", "");
|
||||
return r;
|
||||
});
|
||||
|
||||
return data;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取接收到的通知公告总数
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("/sysNotice/unread")]
|
||||
public async Task<int> GetUnreadCount()
|
||||
{
|
||||
return await _sysNoticeUserRep.Where(u => u.UserId == _userManager.UserId && u.ReadStatus == (int)NoticeUserStatus.UNREAD).CountAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
using Furion.DatabaseAccessor;
|
||||
using Furion.DatabaseAccessor.Extensions;
|
||||
using Furion.DependencyInjection;
|
||||
using Furion.DynamicApiController;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Ewide.Core.Service.Notice
|
||||
@@ -11,13 +14,17 @@ namespace Ewide.Core.Service.Notice
|
||||
/// <summary>
|
||||
/// 通知公告用户
|
||||
/// </summary>
|
||||
public class SysNoticeUserService : ISysNoticeUserService, ITransient
|
||||
[ApiDescriptionSettings(Name = "NoticeUser", Order = 100)]
|
||||
public class SysNoticeUserService : ISysNoticeUserService, IDynamicApiController, ITransient
|
||||
{
|
||||
private readonly IRepository<SysNoticeUser> _sysNoticeUserRep; // 通知公告用户表仓储
|
||||
|
||||
public SysNoticeUserService(IRepository<SysNoticeUser> sysNoticeUserRep)
|
||||
private readonly IUserManager _userManager;
|
||||
private readonly IRepository<SysNotice> _sysNoticeRep;
|
||||
public SysNoticeUserService(IRepository<SysNoticeUser> sysNoticeUserRep, IUserManager userManager, IRepository<SysNotice> sysNoticeRep)
|
||||
{
|
||||
_sysNoticeUserRep = sysNoticeUserRep;
|
||||
_userManager = userManager;
|
||||
_sysNoticeRep = sysNoticeRep;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -27,18 +34,19 @@ namespace Ewide.Core.Service.Notice
|
||||
/// <param name="noticeUserIdList"></param>
|
||||
/// <param name="noticeUserStatus"></param>
|
||||
/// <returns></returns>
|
||||
public Task Add(string noticeId, List<string> noticeUserIdList, int noticeUserStatus)
|
||||
|
||||
public async Task Add(string noticeId, List<string> noticeUserIdList, int noticeUserStatus)
|
||||
{
|
||||
noticeUserIdList.ForEach(u =>
|
||||
foreach (var u in noticeUserIdList)
|
||||
{
|
||||
new SysNoticeUser
|
||||
await new SysNoticeUser
|
||||
{
|
||||
Id = Guid.NewGuid().ToString(),
|
||||
NoticeId = noticeId,
|
||||
UserId = u,
|
||||
ReadStatus = noticeUserStatus
|
||||
}.InsertAsync();
|
||||
});
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -59,8 +59,8 @@ namespace Ewide.Core.Service
|
||||
var orgs = await _sysOrgRep.DetachedEntities
|
||||
.Where((name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%")), // 根据机构名称模糊查询
|
||||
(id, u => u.Id == input.Id.Trim()), // 根据机构id查询
|
||||
(pId, u => EF.Functions.Like(u.Pids, $"%[{input.Pid.Trim()}]%")
|
||||
|| u.Id == input.Pid.Trim())) // 根据父机构id查询
|
||||
(pId, u => input.TreeNodeDataScope.GetValueOrDefault(1) == 2 ? (EF.Functions.Like(u.Pids, $"%[{input.Pid.Trim()}]%")
|
||||
|| u.Id == input.Pid.Trim()) : u.Id == input.Pid.Trim() )) // 根据父机构id查询
|
||||
.Where(dataScopeList.Count > 0, u => dataScopeList.Contains(u.Id)) // 非管理员范围限制
|
||||
.Where(u => u.Status != CommonStatus.DELETED).OrderBy(u => u.Sort)
|
||||
.ToPageData<SysOrg,OrgOutput>(input);
|
||||
|
||||
@@ -84,17 +84,13 @@ namespace Ewide.Core.Service
|
||||
[Required(ErrorMessage = "账号名称不能为空")]
|
||||
public override string Account { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 密码
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "密码不能为空")]
|
||||
public override string Password { get; set; }
|
||||
|
||||
//[Required(ErrorMessage = "密码不能为空")]
|
||||
//public override string Password { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 确认密码
|
||||
/// </summary>
|
||||
[Required(ErrorMessage = "确认密码不能为空"), Compare(nameof(Password), ErrorMessage = "两次密码不一致")]
|
||||
public string Confirm { get; set; }
|
||||
|
||||
//[Required(ErrorMessage = "确认密码不能为空"), Compare(nameof(Password), ErrorMessage = "两次密码不一致")]
|
||||
//public string Confirm { get; set; }
|
||||
}
|
||||
|
||||
public class DeleteUserInput : UserInput
|
||||
|
||||
@@ -79,8 +79,8 @@ namespace Ewide.Core.Service
|
||||
.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 => (x.n.e.OrgId == pid ||
|
||||
x.o.Pids.Contains($"[{pid.Trim()}]")))
|
||||
.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))
|
||||
@@ -111,9 +111,23 @@ namespace Ewide.Core.Service
|
||||
// 数据范围检查
|
||||
await CheckDataScope(input);
|
||||
|
||||
var isExist = await _sysUserRep.AnyAsync(u => u.Account == input.Account, false);
|
||||
if (isExist) throw Oops.Oh(ErrorCode.D1003);
|
||||
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))
|
||||
@@ -171,8 +185,22 @@ namespace Ewide.Core.Service
|
||||
// 数据范围检查
|
||||
await CheckDataScope(input);
|
||||
|
||||
var email = input.Email?.ToLower();
|
||||
|
||||
// 排除自己并且判断与其他是否相同
|
||||
var isExist = await _sysUserRep.AnyAsync(u => u.Account == input.Account && u.Id != input.Id, false);
|
||||
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>();
|
||||
|
||||
@@ -97,7 +97,15 @@
|
||||
"sysFileInfo:preview",
|
||||
"sysUser:updateInfo",
|
||||
"sysUser:updatePwd",
|
||||
"sysUser:updateAvatar"
|
||||
"sysUser:updateAvatar",
|
||||
"sysNotice:received",
|
||||
"sysNotice:unread",
|
||||
"sysNotice:detail"
|
||||
]
|
||||
},
|
||||
|
||||
"SimplePassword": {
|
||||
"Pattern": "(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*[^a-zA-Z0-9]){8,}",
|
||||
"Descriptions": "密码中必须包含大小字母、数字、特称字符,至少8个字符"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user