222 lines
8.3 KiB
C#
222 lines
8.3 KiB
C#
using Common;
|
|
using Common.Utils;
|
|
using Common.WX;
|
|
using Common.WX.Response;
|
|
using CommonInfrastructure;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using UserService;
|
|
using UserService.Param;
|
|
using UserService.Response;
|
|
using UserService.User;
|
|
|
|
namespace UserApi.Login
|
|
{
|
|
[ApiController, Route("api/[controller]")]
|
|
|
|
public class LoginController : BaseController
|
|
{
|
|
private readonly IUserService _userService;
|
|
private readonly WXBaseHelper _weiXinPayHelper;
|
|
|
|
public LoginController(IUserService userService, WXBaseHelper weiXinPayHelper)
|
|
{
|
|
_userService = userService;
|
|
_weiXinPayHelper = weiXinPayHelper;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取 access_token - 获取微信小程序的接口调用凭证
|
|
/// </summary>
|
|
[HttpGet("GetAccessToken")]
|
|
public async Task<BaseResponse<string>> GetAccessToken()
|
|
{
|
|
var result = await _weiXinPayHelper.GetAccessToken();
|
|
|
|
if (!result.isok)
|
|
return this.ToFailResult<string>("登陆失败" + result.msg);
|
|
else
|
|
{
|
|
return this.ToResult(result.accessToken);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 登录凭证校验 - 用微信登录 code(js_code) 换取用户的会话信息
|
|
/// </summary>
|
|
[HttpGet("GetSessionToken")]
|
|
public async Task<BaseResponse<AccessTokenResponse>> GetSessionToken(string js_code)
|
|
{
|
|
var result = await _weiXinPayHelper.GetAccessTokenByCode(js_code);
|
|
if (!result.isok)
|
|
return this.ToFailResult<AccessTokenResponse>("登陆失败" + result.msg);
|
|
else
|
|
{
|
|
return this.ToResult(result.response);
|
|
}
|
|
}
|
|
|
|
private string GetClientIp()
|
|
{
|
|
var forwarded = HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault();
|
|
if (!string.IsNullOrWhiteSpace(forwarded))
|
|
return forwarded.Split(',')[0].Trim();
|
|
return HttpContext.Connection.RemoteIpAddress?.ToString() ?? "";
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注册用户通过微信账号
|
|
/// </summary>
|
|
[HttpPost("registerWX")]
|
|
|
|
public async Task<BaseResponse<UserToken>> RegisterWX(RegisterUserWeiXinParam param)
|
|
{
|
|
var ip = GetClientIp();
|
|
var result = await _userService.RegisterWeiXin(param, ip);
|
|
return this.ToResult(result);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注册用户通过短信和验证码
|
|
/// </summary>
|
|
[HttpPost("register")]
|
|
|
|
public async Task<BaseResponse<UserToken>> Register(RegisterUserParam param)
|
|
{
|
|
var ip = GetClientIp();
|
|
var result = await _userService.Register(param, ip);
|
|
if (result.isok)
|
|
return this.ToResult(result.user);
|
|
else
|
|
return this.ToFailResult<UserToken>(result.msg);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 发送短信验证码
|
|
/// </summary>
|
|
[HttpGet("SendMobileCode")]
|
|
|
|
public async Task<BaseResponse<string>> SendMobileCode(string mobile)
|
|
{
|
|
var result = await _userService.SendMobileCode(mobile);
|
|
if (result.isok)
|
|
return this.ToResult(result.msg);
|
|
else
|
|
return this.ToFailResult<string>(result.msg);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 微信用户登陆
|
|
/// </summary>
|
|
[HttpGet("LoginWx")]
|
|
public async Task<BaseResponse<UserToken>> LoginWx(string openId)
|
|
{
|
|
var ip = GetClientIp();
|
|
var result = await _userService.LoginWx(openId, ip);
|
|
return this.ToResult(result);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 用户登陆 - 手机号 + 验证码登录
|
|
/// </summary>
|
|
[HttpGet("Login")]
|
|
public async Task<BaseResponse<UserToken>> Login(string mobile, string code)
|
|
{
|
|
if (string.IsNullOrEmpty(mobile))
|
|
return this.ToFailResult<UserToken>("请输入手机号");
|
|
if (string.IsNullOrEmpty(code))
|
|
return this.ToFailResult<UserToken>("请输入验证码或密码");
|
|
if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$"))
|
|
return this.ToFailResult<UserToken>("手机号格式错误");
|
|
|
|
var ip = GetClientIp();
|
|
var result = await _userService.Login(mobile, code, ip);
|
|
if (result.isok)
|
|
return this.ToResult(result.user);
|
|
else
|
|
return this.ToFailResult<UserToken>(result.msg);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 密码登录 - 手机号 + 密码登录
|
|
/// </summary>
|
|
[HttpGet("LoginByPassword")]
|
|
public async Task<BaseResponse<UserToken>> LoginByPassword(string mobile, string password)
|
|
{
|
|
if (string.IsNullOrEmpty(mobile))
|
|
return this.ToFailResult<UserToken>("请输入手机号");
|
|
if (string.IsNullOrEmpty(password))
|
|
return this.ToFailResult<UserToken>("请输入密码");
|
|
if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$"))
|
|
return this.ToFailResult<UserToken>("手机号格式错误");
|
|
|
|
var ip = GetClientIp();
|
|
var result = await _userService.LoginByPassword(mobile, password, ip);
|
|
if (result.isok)
|
|
return this.ToResult(result.user);
|
|
return this.ToFailResult<UserToken>(result.msg);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取服务器时间 - 返回服务器本地时间与 UTC 时间,用于客户端校准
|
|
/// </summary>
|
|
[HttpGet("GetDateTime")]
|
|
public async Task<BaseResponse<DateTimeResponse>> GetDateTime()
|
|
{
|
|
var now = DateTime.Now;
|
|
var nowOffset = new DateTimeOffset(now);
|
|
var utcNow = DateTimeOffset.UtcNow;
|
|
var nowTimestamp = nowOffset.ToUnixTimeMilliseconds();
|
|
var utcNowTimestamp = utcNow.ToUnixTimeMilliseconds();
|
|
var localNow = now;
|
|
return this.ToResult(new DateTimeResponse
|
|
{
|
|
Year = localNow.Year,
|
|
Month = localNow.Month,
|
|
Day = localNow.Day,
|
|
Hour = localNow.Hour,
|
|
Minute = localNow.Minute,
|
|
Seconds = localNow.Second,
|
|
MilliSeconds = localNow.Millisecond,
|
|
DateTime = localNow.ToString("yyyy-MM-dd HH:mm:ss"),
|
|
Date = localNow.ToString("yyyy-MM-dd"),
|
|
Time = localNow.ToString("HH:mm:ss"),
|
|
TimeZone = TimeZoneInfo.Local.DisplayName,
|
|
DayOfWeek = localNow.DayOfWeek.ToString(),
|
|
DstActive = TimeZoneInfo.Local.IsDaylightSavingTime(localNow),
|
|
Timestamp = utcNowTimestamp,
|
|
Service = "UserApi",
|
|
DateTimeNow = now.ToString("yyyy-MM-dd HH:mm:ss.fff"),
|
|
DateTimeNowKind = now.Kind.ToString(),
|
|
DateTimeNowTimestamp = nowTimestamp,
|
|
DateTimeOffsetUtcNow = utcNow.ToString("yyyy-MM-dd HH:mm:ss.fff zzz"),
|
|
DateTimeOffsetUtcNowTimestamp = utcNowTimestamp,
|
|
DifferenceMs = utcNowTimestamp - nowTimestamp,
|
|
Container = Environment.MachineName
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 修改密码 - 通过短信验证码重置密码
|
|
/// </summary>
|
|
[HttpGet("ResetPassword")]
|
|
public async Task<BaseResponse<string>> ResetPassword(string mobile, string password, string code)
|
|
{
|
|
if (string.IsNullOrEmpty(mobile))
|
|
return this.ToFailResult<string>("请输入手机号");
|
|
if (string.IsNullOrEmpty(code))
|
|
return this.ToFailResult<string>("请输入验证码");
|
|
if (string.IsNullOrEmpty(password))
|
|
return this.ToFailResult<string>("请输入新密码");
|
|
if (!System.Text.RegularExpressions.Regex.IsMatch(mobile, @"^1[3-9]\d{9}$"))
|
|
return this.ToFailResult<string>("手机号格式错误");
|
|
|
|
var result = await _userService.UpdatePassword(mobile, password, code);
|
|
if (result.isok)
|
|
return this.ToResult(result.msg);
|
|
else
|
|
return this.ToFailResult<string>(result.msg);
|
|
}
|
|
}
|
|
}
|