mh_custom/wtmProject/Areas/_Admin/Controllers/AccountController.cs
2024-05-17 13:43:36 +08:00

341 lines
12 KiB
C#

// WTM默认页面 Wtm buidin page
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using WalkingTec.Mvvm.Core;
using WalkingTec.Mvvm.Core.Extensions;
using WalkingTec.Mvvm.Core.Support.Json;
using WalkingTec.Mvvm.Mvc;
using WalkingTec.Mvvm.Mvc.Admin.ViewModels.FrameworkUserVms;
namespace WalkingTec.Mvvm.Admin.Api
{
[AuthorizeJwtWithCookie]
[ApiController]
[Route("api/_[controller]")]
[ActionDescription("_Admin.LoginApi")]
[AllRights]
public class AccountController : BaseApiController
{
[AllowAnonymous]
[HttpPost("[action]")]
[AllRights]
public async Task<IActionResult> Login([FromForm] string account, [FromForm] string password, [FromForm] string tenant = null, [FromForm] bool rememberLogin = false)
{
var user = Wtm.DoLogin(account, password, tenant);
if (user == null)
{
return BadRequest(Localizer["Sys.LoginFailed"].Value);
}
//其他属性可以通过user.Attributes["aaa"] = "bbb"方式赋值
Wtm.LoginUserInfo = user;
AuthenticationProperties properties = null;
if (rememberLogin)
{
properties = new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTimeOffset.UtcNow.Add(TimeSpan.FromDays(30))
};
}
var principal = Wtm.LoginUserInfo.CreatePrincipal();
await Wtm.HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, properties);
return checkuserinfo();
}
[AllowAnonymous]
[HttpPost("[action]")]
public async Task<IActionResult> loginjwt(SimpleLogin loginInfo)
{
var user = Wtm.DoLogin(loginInfo.Account, loginInfo.Password, loginInfo.Tenant);
if (user == null)
{
ModelState.AddModelError(" ", Localizer["Sys.LoginFailed"]);
return BadRequest(ModelState.GetErrorJson());
}
//其他属性可以通过user.Attributes["aaa"] = "bbb"方式赋值
Wtm.LoginUserInfo = user;
var authService = HttpContext.RequestServices.GetService(typeof(ITokenService)) as ITokenService;
var token = await authService.IssueTokenAsync(Wtm.LoginUserInfo);
return Content(JsonSerializer.Serialize(token), "application/json");
}
[Public]
[HttpGet("[action]")]
public async Task<IActionResult> LoginRemote([FromQuery] string _remotetoken)
{
if (Wtm?.LoginUserInfo != null)
{
var principal = Wtm.LoginUserInfo.CreatePrincipal();
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, null);
}
return checkuserinfo();
}
[AllRights]
[HttpGet("[action]")]
public IActionResult SetTenant([FromQuery] string tenant)
{
bool rv = Wtm.SetCurrentTenant(tenant == "" ? null : tenant);
return Ok(rv);
}
[AllowAnonymous]
[HttpPost("[action]")]
public IActionResult Reg(SimpleReg regInfo)
{
var exist = DC.Set<FrameworkUser>().Any(x => x.ITCode.ToLower() == regInfo.ITCode.ToLower());
if (exist == true)
{
ModelState.AddModelError("ITCode", Localizer["Login.ItcodeDuplicate"]);
return BadRequest(ModelState.GetErrorJson());
}
var hasuserrole = DC.Set<FrameworkRole>().Where(x => x.RoleCode == "002").FirstOrDefault();
FrameworkUser user = new FrameworkUser
{
ITCode = regInfo.ITCode,
Name = regInfo.Name,
Password = Utils.GetMD5String(regInfo.Password),
IsValid = true,
PhotoId = regInfo.PhotoId,
};
if (hasuserrole != null)
{
var userrole = new FrameworkUserRole
{
UserCode = user.ITCode,
RoleCode = "002"
};
DC.Set<FrameworkUserRole>().Add(userrole);
}
DC.Set<FrameworkUser>().Add(user);
DC.SaveChanges();
return Ok();
}
[HttpPost("[action]")]
[AllRights]
[ProducesResponseType(typeof(Token), StatusCodes.Status200OK)]
public IActionResult RefreshToken(string refreshToken)
{
var rv = Wtm.RefreshToken();
if (rv == null)
{
return BadRequest();
}
else
{
return Ok(rv);
}
}
[AllRights]
[HttpGet("[action]")]
public IActionResult checkuserinfo(bool IsApi = true)
{
if (Wtm.LoginUserInfo == null)
{
return BadRequest();
}
else
{
var forapi = Wtm.LoginUserInfo;
if (IsApi)
{
forapi.SetAttributesForApi(Wtm);
}
forapi.DataPrivileges = null;
forapi.FunctionPrivileges = null;
if (forapi.Attributes == null)
{
forapi.Attributes = new Dictionary<string, object>();
}
if (forapi.Attributes.ContainsKey("IsMainHost"))
{
forapi.Attributes.Remove("IsMainHost");
}
if (ConfigInfo.HasMainHost && string.IsNullOrEmpty(Wtm.LoginUserInfo.TenantCode) == true)
{
forapi.Attributes.Add("IsMainHost", true);
}
else
{
forapi.Attributes.Add("IsMainHost", false);
}
return Ok(forapi);
}
}
[AllRights]
[HttpPost("[action]")]
public IActionResult ChangePassword(ChangePasswordVM vm)
{
if (ConfigInfo.HasMainHost && Wtm.LoginUserInfo?.CurrentTenant == null)
{
return Request.RedirectCall(Wtm).Result;
}
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorJson());
}
else
{
vm.DoChange();
if (!ModelState.IsValid)
{
return BadRequest(ModelState.GetErrorJson());
}
else
{
return Ok();
}
}
}
[Public]
[HttpGet("[action]")]
public async Task<IActionResult> Logout()
{
if (ConfigInfo.HasMainHost && Wtm.LoginUserInfo?.CurrentTenant == null)
{
await Wtm.CallAPI<string>("mainhost", "/api/_account/logout", HttpMethodEnum.GET, new { }, 10);
return Ok(ConfigInfo.MainHost);
}
else
{
HttpContext.Session.Clear();
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
return Ok("/");
}
}
[HttpGet("GetFrameworkRoles")]
[ActionDescription("GetRoles")]
[AllRights]
public IActionResult GetFrameworkRoles()
{
if (ConfigInfo.HasMainHost && Wtm.LoginUserInfo?.CurrentTenant == null)
{
return Request.RedirectCall(Wtm, "/api/_account/GetFrameworkRoles").Result;
}
return Ok(DC.Set<FrameworkRole>().GetSelectListItems(Wtm, x => x.RoleName, x => x.RoleCode));
}
[HttpGet("GetFrameworkGroups")]
[ActionDescription("GetGroups")]
[AllRights]
public IActionResult GetFrameworkGroups()
{
if (ConfigInfo.HasMainHost && Wtm.LoginUserInfo?.CurrentTenant == null)
{
return Request.RedirectCall(Wtm, "/api/_account/GetFrameworkGroups").Result;
}
return Ok(DC.Set<FrameworkGroup>().GetSelectListItems(Wtm, x => x.GroupName, x => x.GroupCode));
}
[HttpGet("GetFrameworkGroupsTree")]
[ActionDescription("GetGroupsTree")]
[AllRights]
public IActionResult GetFrameworkGroupsTree()
{
if (ConfigInfo.HasMainHost && Wtm.LoginUserInfo?.CurrentTenant == null)
{
return Request.RedirectCall(Wtm, "/api/_account/GetFrameworkGroupsTree").Result;
}
return Ok(DC.Set<FrameworkGroup>().GetTreeSelectListItems(Wtm, x => x.GroupName, x => x.GroupCode));
}
[HttpGet("GetUserById")]
[AllRights]
public IActionResult GetUserById(string keywords)
{
if (ConfigInfo.HasMainHost && Wtm.LoginUserInfo?.CurrentTenant == null)
{
return Request.RedirectCall(Wtm, "/api/_account/GetUserById").Result;
}
var users = DC.Set<FrameworkUser>().Where(x => x.ITCode.ToLower().StartsWith(keywords.ToLower())).GetSelectListItems(Wtm, x => x.Name + "(" + x.ITCode + ")", x => x.ITCode);
return Ok(users);
}
[HttpGet("GetUserByGroup")]
[AllRights]
public IActionResult GetUserByGroup(string keywords)
{
if (ConfigInfo.HasMainHost && Wtm.LoginUserInfo?.CurrentTenant == null)
{
return Request.RedirectCall(Wtm, "/api/_account/GetUserByGroup").Result;
}
var users = DC.Set<FrameworkUserGroup>().Where(x => x.GroupCode == keywords).Select(x => x.UserCode).ToList();
return Ok(users);
}
[HttpGet("GetUserByRole")]
[AllRights]
public IActionResult GetUserByRole(string keywords)
{
if (ConfigInfo.HasMainHost && Wtm.LoginUserInfo?.CurrentTenant == null)
{
return Request.RedirectCall(Wtm, "/api/_account/GetUserByRole").Result;
}
var users = DC.Set<FrameworkUserRole>().Where(x => x.RoleCode == keywords).Select(x => x.UserCode).ToList();
return Ok(users);
}
}
public class SimpleLogin
{
public string Account { get; set; }
public string Password { get; set; }
public string Tenant { get; set; }
public string RemoteToken { get; set; }
}
public class SimpleReg
{
[Display(Name = "_Admin.Account")]
[Required(ErrorMessage = "Validate.{0}required")]
[StringLength(50, ErrorMessage = "Validate.{0}stringmax{1}")]
public string ITCode { get; set; }
[Display(Name = "_Admin.Name")]
[Required(ErrorMessage = "Validate.{0}required")]
[StringLength(50, ErrorMessage = "Validate.{0}stringmax{1}")]
public string Name { get; set; }
[Display(Name = "Login.Password")]
[Required(AllowEmptyStrings = false)]
[StringLength(50, ErrorMessage = "Validate.{0}stringmax{1}")]
public string Password { get; set; }
[Display(Name = "_Admin.Photo")]
public Guid? PhotoId { get; set; }
}
}