using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Concurrent; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using WIDESEA_Core.CacheManager; using WIDESEA_Core.Configuration; using WIDESEA_Core.Controllers.Basic; using WIDESEA_Core.DBManager; using WIDESEA_Core.EFDbContext; using WIDESEA_Core.Enums; using WIDESEA_Core.Extensions; using WIDESEA_Core.Filters; using WIDESEA_Core.Infrastructure; using WIDESEA_Core.ManageUser; using WIDESEA_Core.ObjectActionValidator; using WIDESEA_Core.Services; using WIDESEA_Core.Utilities; using WIDESEA_Entity.AttributeManager; using WIDESEA_Entity.DomainModels; using WIDESEA_System.IRepositories; using WIDESEA_System.IServices; using WIDESEA_System.Repositories; namespace WIDESEA_System.Controllers { [Route("api/User")] public partial class Sys_UserController { private ISys_UserRepository _userRepository; private ICacheService _cache; [ActivatorUtilitiesConstructor] public Sys_UserController( ISys_UserService userService, ISys_UserRepository userRepository, ICacheService cahce ) : base(userService) { _userRepository = userRepository; _cache = cahce; } [HttpPost, HttpGet, Route("login"), AllowAnonymous] [ObjectModelValidatorFilter(ValidatorModel.Login)] public async Task<IActionResult> Login([FromBody] LoginInfo loginInfo) { return Json(await Service.Login(loginInfo)); } private readonly ConcurrentDictionary<int, object> _lockCurrent = new ConcurrentDictionary<int, object>(); [HttpPost, Route("replaceToken")] public IActionResult ReplaceToken() { WebResponseContent responseContent = new WebResponseContent(); string error = ""; string key = $"rp:Token:{UserContext.Current.UserId}"; UserInfo userInfo = null; try { //如果5秒内替æ¢è¿‡token,直接使用最新的token(防æ¢ä¸€ä¸ªé¡µé¢å¤šä¸ªå¹¶å‘è¯·æ±‚åŒæ—¶æ›¿æ¢token导致tokené”™ä½) if (_cache.Exists(key)) { return Json(responseContent.OK(null, _cache.Get(key))); } var _obj = _lockCurrent.GetOrAdd(UserContext.Current.UserId, new object() { }); lock (_obj) { if (_cache.Exists(key)) { return Json(responseContent.OK(null, _cache.Get(key))); } string requestToken = HttpContext.Request.Headers[AppSetting.TokenHeaderName]; requestToken = requestToken?.Replace("Bearer ", ""); if (JwtHelper.IsExp(requestToken)) return Json(responseContent.Error("Token已过期!")); int userId = UserContext.Current.UserId; userInfo = _userRepository.FindAsIQueryable(x => x.User_Id == userId).Select( s => new UserInfo() { User_Id = userId, UserName = s.UserName, UserTrueName = s.UserTrueName, Role_Id = s.Role_Id, RoleName = s.RoleName }).FirstOrDefault(); if (userInfo == null) return Json(responseContent.Error("未查到用户信æ¯!")); string token = JwtHelper.IssueJwt(userInfo); //移除当å‰ç¼“å˜ _cache.Remove(userId.GetUserIdKey()); //åªæ›´æ–°çš„tokenå—æ®µ _userRepository.Update(new Sys_User() { User_Id = userId, Token = token }, x => x.Token, true); //æ·»åŠ ä¸€ä¸ª5ç§’ç¼“å˜ _cache.Add(key, token, 5); responseContent.OK(null, token); } } catch (Exception ex) { error = ex.Message + ex.StackTrace; responseContent.Error("token替æ¢å¼‚常"); } finally { _lockCurrent.TryRemove(UserContext.Current.UserId, out object val); string _message = $"用户{userInfo?.User_Id}_{userInfo?.UserTrueName},({(responseContent.Status ? "tokenæ›¿æ¢æˆåŠŸ" : "token替æ¢å¤±è´¥")})"; Logger.Info(LoggerType.ReplaceToeken, _message, null, error); } return Json(responseContent); } [HttpPost, Route("modifyPwd")] [ApiActionPermission] //通过ObjectGeneralValidatorFilteræ ¡éªŒå‚æ•°ï¼Œä¸å†éœ€è¦if esle判æ–OldPwd与NewPwd傿•° [ObjectGeneralValidatorFilter(ValidatorGeneral.OldPwd, ValidatorGeneral.NewPwd)] public async Task<IActionResult> ModifyPwd(string oldPwd, string newPwd) { return Json(await Service.ModifyPwd(oldPwd, newPwd)); } [HttpPost, Route("getCurrentUserInfo")] public async Task<IActionResult> GetCurrentUserInfo() { return Json(await Service.GetCurrentUserInfo()); } //åªèƒ½è¶…级管ç†å‘˜æ‰èƒ½ä¿®æ”¹å¯†ç //2020.08.01å¢žåŠ ä¿®æ”¹å¯†ç 功能 [HttpPost, Route("modifyUserPwd"), ApiActionPermission(ActionRolePermission.SuperAdmin)] public IActionResult ModifyUserPwd(string password, string userName) { WebResponseContent webResponse = new WebResponseContent(); if (string.IsNullOrEmpty(password) || string.IsNullOrEmpty(userName)) { return Json(webResponse.Error("傿•°ä¸å®Œæ•´")); } if (password.Length < 6) return Json(webResponse.Error("密ç 长度ä¸èƒ½å°‘于6ä½")); ISys_UserRepository repository = Sys_UserRepository.Instance; Sys_User user = repository.FindFirst(x => x.UserName == userName && x.systemType == 0/*wms*/); if (user == null) { return Json(webResponse.Error("用户ä¸å˜åœ¨")); } user.UserPwd = password.EncryptDES(AppSetting.Secret.User); repository.Update(user, x => new { x.UserPwd }, true); //如果用户在线,强制下线 UserContext.Current.LogOut(user.User_Id); return Json(webResponse.OK("密ç 修改æˆåŠŸ")); } /// <summary> /// 2020.06.15å¢žåŠ ç™»é™†éªŒè¯ç /// </summary> /// <returns></returns> [HttpGet, Route("getVierificationCode"), AllowAnonymous] public IActionResult GetVierificationCode() { string code = "1234" /*VierificationCode.RandomText()*/; var data = new { img = VierificationCode.CreateBase64Imgage(code), uuid = Guid.NewGuid() }; HttpContext.GetService<IMemoryCache>().Set(data.uuid.ToString(), code, new TimeSpan(0, 5, 0)); return Json(data); } } }