Files
Kg.SeaTime/Service/Application.Web/Controllers/Login/LoginController.cs
2026-07-10 16:39:52 +08:00

411 lines
14 KiB
C#

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using Newtonsoft.Json;
using Photon.Core.Redis;
namespace Application.Web.Controllers.Login
{
/// <summary>
/// 登录接口
/// </summary>
[ApiExplorerSettings(GroupName = "Login")]
[Route("[controller]/[action]")]
[ApiController]
public class LoginController : ControllerBase
{
private readonly IGameAccountService _accountService;
private readonly IAreaService _areaService;
private readonly IUnitUserService _userService;
private readonly IUnitUserAttrService _attrService;
public LoginController(IGameAccountService accountService, IAreaService areaService,
IUnitUserService userService, IUnitUserAttrService attrService)
{
_accountService = accountService;
_areaService = areaService;
_userService = userService;
_attrService = attrService;
}
[HttpGet]
public string GetExp()
{
string html = string.Empty;
decimal sum = 0M;
decimal addsum = 0;
for (int i = 1; i < 121; i++)
{
Decimal exp = GameTool.GetUserUpExp(i);
if (i > 160 && i < 221)
{
addsum += exp;
}
sum += exp;
html += string.Format("当前等级:{0},升级经验:{1};总经验:{2}\n\r", i, exp, sum);
}
html += String.Format("总经验:{0}", sum);
html += String.Format("升级经验:{0}", addsum);
return html;
}
/// <summary>
/// 登录接口
/// </summary>
/// <param name="parms"></param>
/// <returns></returns>
// [HttpPost]
// public async Task<IPoAction> Login([FromBody] LoginParms parms)
// {
// return PoAction.Ok(parms.code);
// }
/// <summary>
/// 探玩自动登录
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
[HttpGet]
public async Task<IPoAction> TwLogin(string code)
{
if (string.IsNullOrEmpty(code))
{
return PoAction.Message("code值错误!");
}
AutoLogin login = new AutoLogin();
var loginInfo = await login.TwLogin(code);
if (loginInfo.code == 0)
{
dynamic twInfo = JsonConvert.DeserializeObject<dynamic>(loginInfo.data.ToString());
string openId = twInfo.openid;
string nick = "探玩玩家";
var accInfo = await _accountService.GetAccInfoByOpenId(openId);
if (accInfo == null)
{
var userData = await _accountService.Regist("", nick, "", "", openId);
if (userData == null)
{
return PoAction.Message("登录失败,请联系客服!");
}
else
{
object ret = new { token = userData.token };
return PoAction.Ok(ret);
}
}
else
{
if (accInfo.status != 1)
{
return PoAction.Message("账号被冻结!");
}
else
{
object ret = new { token = accInfo.token };
return PoAction.Ok(ret);
}
}
}
else
{
return PoAction.Message(loginInfo.msg);
}
}
/// <summary>
/// 退出登录
/// </summary>
/// <param name="sid"></param>
/// <returns></returns>
[HttpGet]
public async Task<IPoAction> LoginOut(string? sid)
{
if (string.IsNullOrEmpty(sid))
{
return PoAction.Message("身份信息不存在!");
}
var accInfo = await _accountService.GetAccInfoByToken(sid);
if (accInfo == null)
{
return PoAction.Message("身份信息不存在!");
}
if (await _accountService.UpdateAccountToken(accInfo.accId))
{
return PoAction.Ok(true);
}
else
{
return PoAction.Message("退出失败,请稍后尝试!");
}
}
/// <summary>
/// 注册基础账号信息
/// </summary>
/// <param name="sid"></param>
/// <param name="area"></param>
/// <returns></returns>
[HttpGet]
public async Task<IPoAction> Register(string sid, int area)
{
if (string.IsNullOrEmpty(sid))
{
return PoAction.Message("未登录账号!");
}
var accInfo = await _accountService.GetAccInfoByToken(sid);
if (accInfo == null)
{
return PoAction.Message("未登录账号!");
}
if (accInfo.status != 1)
{
return PoAction.Message("账号已冻结!");
}
var areaInfo = await _areaService.GetAreaInfo(area);
if (areaInfo == null)
{
return PoAction.Message("区服不存在!");
}
if (areaInfo.status != 1)
{
return PoAction.Message("当前区繁忙,无法进入!");
}
if (areaInfo.opTime > DateTime.Now)
{
return PoAction.Message("暂未开放本区服!");
}
//判断是否已经注册
var userData = await _userService.GetUserDataByAccId(accInfo.accId);
if (userData.Any(it => it.areaId == area))
{
return PoAction.Message("该区已存在角色!");
}
var userInfo = await _userService.Register(areaInfo.areaId, accInfo.accId);
if (userInfo == null)
{
return PoAction.Message("注册失败,请稍后尝试!");
}
Dictionary<string, object> loadData = new Dictionary<string, object>();
loadData.Add("userId", userInfo.userId);
loadData.Add("accId", userInfo.accId);
loadData.Add("areaId", userInfo.areaId);
string Key = App.Configuration["JwtTokenOptions:SecurityKey"].ToString();
string Issuer = App.Configuration["JwtTokenOptions:Issuer"].ToString();
string Audience = App.Configuration["JwtTokenOptions:Audience"].ToString();
string token = JwtHelper.CreateToken(Key, Issuer, Audience, loadData, TokenConfig.TokenTime);
return PoAction.Ok(new { token = token, refToken = userInfo.token, userId = userInfo.userId });
}
/// <summary>
/// 登录到游戏
/// </summary>
/// <param name="sid"></param>
/// <param name="user"></param>
/// <returns></returns>
[HttpGet]
public async Task<IPoAction> LoginGame(string sid, string user)
{
if (string.IsNullOrEmpty(sid))
{
return PoAction.Message("未登录账号!");
}
var accInfo = await _accountService.GetAccInfoByToken(sid);
if (accInfo == null)
{
return PoAction.Message("未登录账号!");
}
if (accInfo.status != 1)
{
return PoAction.Message("账号已冻结!");
}
var userInfo = await _userService.GetUserInfoByUserId(user);
if (userInfo == null)
{
return PoAction.Message("角色不存在!");
}
if (userInfo.accId != accInfo.accId)
{
return PoAction.Message("角色不存在!");
}
if (userInfo.status == 0)
{
return PoAction.Message("角色已封禁!");
}
Dictionary<string, object> loadData = new Dictionary<string, object>();
loadData.Add("userId", userInfo.userId);
loadData.Add("accId", userInfo.accId);
loadData.Add("areaId", userInfo.areaId);
string Key = App.Configuration["JwtTokenOptions:SecurityKey"].ToString();
string Issuer = App.Configuration["JwtTokenOptions:Issuer"].ToString();
string Audience = App.Configuration["JwtTokenOptions:Audience"].ToString();
string token = JwtHelper.CreateToken(Key, Issuer, Audience, loadData, TokenConfig.TokenTime);
return PoAction.Ok(new
{ regOk = userInfo.regOk, token = token, refToken = userInfo.token, userId = userInfo.userId });
}
[HttpPost]
public async Task<IPoAction> RefreshToken([FromBody] RefreshTokenParms parms)
{
if (string.IsNullOrEmpty(parms.token) || string.IsNullOrEmpty(parms.refToken))
{
return PoAction.Message("刷新失败");
}
string Key = App.Configuration["JwtTokenOptions:SecurityKey"].ToString();
string Issuer = App.Configuration["JwtTokenOptions:Issuer"].ToString();
string Audience = App.Configuration["JwtTokenOptions:Audience"].ToString();
string accId = string.Empty;
var tokenData = await JwtTool.GetJwtData(parms.token, Key, "accId");
if (tokenData != null)
{
accId = tokenData.ToString();
}
var userInfo = await _userService.GetUserInfoByToken(parms.refToken);
if (userInfo == null)
{
return PoAction.Message("刷新失败,用户不存在!");
}
if (userInfo.accId != accId)
{
return PoAction.Message("刷新失败,数据信息不合法!");
}
Dictionary<string, object> loadData = new Dictionary<string, object>();
loadData.Add("userId", userInfo.userId);
loadData.Add("accId", userInfo.accId);
loadData.Add("areaId", userInfo.areaId);
string token = JwtHelper.CreateToken(Key, Issuer, Audience, loadData, TokenConfig.TokenTime);
//记录在线时间
await _attrService.UpdateOnLineTime(userInfo.userId, "Default", TokenConfig.TokenTime);
return PoAction.Ok(new
{ token = token, refToken = userInfo.token, userId = userInfo.userId });
}
[HttpPost]
public async Task<IPoAction> RefreshTokenByBook([FromBody] RefreshTokenParms parms)
{
if (string.IsNullOrEmpty(parms.refToken))
{
return PoAction.Message("刷新失败");
}
string Key = App.Configuration["JwtTokenOptions:SecurityKey"].ToString();
string Issuer = App.Configuration["JwtTokenOptions:Issuer"].ToString();
string Audience = App.Configuration["JwtTokenOptions:Audience"].ToString();
var userInfo = await _userService.GetUserInfoByToken(parms.refToken);
if (userInfo == null)
{
return PoAction.Message("刷新失败,用户不存在!");
}
Dictionary<string, object> loadData = new Dictionary<string, object>();
loadData.Add("userId", userInfo.userId);
loadData.Add("accId", userInfo.accId);
loadData.Add("areaId", userInfo.areaId);
string token = JwtHelper.CreateToken(Key, Issuer, Audience, loadData, TokenConfig.TokenTime);
return PoAction.Ok(new
{ token = token, refToken = userInfo.token, userId = userInfo.userId });
}
/// <summary>
/// 注册角色信息
/// </summary>
/// <param name="parms"></param>
/// <returns></returns>
[HttpPost]
[Authorize]
public async Task<IPoAction> RegisterInfo([FromBody] RegisterInfoParms parms)
{
if (string.IsNullOrEmpty(parms.nick))
{
return PoAction.Message("昵称不能为空!");
}
if (!RegExpAssist.RegStringLeght(parms.nick, 1, 12))
{
return PoAction.Message("昵称需要1-12字符之间哦!");
}
string sex = parms.sex == 0 ? "女" : "男";
string userId = StateHelper.userId;
var userInfo = await _userService.GetUserInfoByUserId(userId);
if (userInfo == null)
{
return PoAction.Message("角色不存在!");
}
if (userInfo.regOk == 1)
{
return PoAction.Ok(true);
}
var areaInfo = await _areaService.GetAreaInfo((int)userInfo.areaId);
if (areaInfo.isNeedCode == 1) //需要激活码
{
if (string.IsNullOrEmpty(parms.code))
{
return PoAction.Message("请输入激活码!");
}
var ackInfo = await _areaService.GetAckInfo(parms.code);
if (ackInfo == null)
{
return PoAction.Message("激活码过期!");
}
if (ackInfo.status != 0)
{
return PoAction.Message("激活码过期!");
}
if (ackInfo.areaId != 0 && ackInfo.areaId != areaInfo.areaId)
{
return PoAction.Message($"当前激活码可用于{ackInfo.areaId}区激活!");
}
}
if (await _userService.CheckUserNickIsAt(parms.nick))
{
return PoAction.Message("昵称已存在!");
}
if (await _userService.RegisterUserInfo(userId, parms.nick, sex))
{
if (areaInfo.isNeedCode == 1)
{
await _areaService.UseAck(parms.code, userId);
}
return PoAction.Ok(true);
}
else
{
return PoAction.Message("注册失败,请稍后尝试!");
}
}
}
}