This commit is contained in:
Putoo
2026-05-15 17:08:04 +08:00
parent 52ad7e79ec
commit 78759387f7
13 changed files with 511 additions and 632 deletions

View File

@@ -0,0 +1,75 @@
using SqlSugar;
using System;
namespace Application.Domain.Entity
{
[Tenant("Kg.SeaTime.Game")]
public class game_account
{
/// <summary>
/// accId
/// </summary>
[SugarColumn(IsPrimaryKey = true, Length = 50)]
public string accId { get; set; }
/// <summary>
/// userName
/// </summary>
[SugarColumn(Length = 20, IsNullable = true)]
public string? userName { get; set; }
/// <summary>
/// nick
/// </summary>
[SugarColumn(Length = 30, IsNullable = true)]
public string? nick { get; set; }
/// <summary>
/// pwd
/// </summary>
[SugarColumn(Length = 255, IsNullable = true)]
public string? pwd { get; set; }
/// <summary>
/// npwd
/// </summary>
[SugarColumn(Length = 255, IsNullable = true)]
public string? npwd { get; set; }
/// <summary>
/// status
/// </summary>
[SugarColumn(IsNullable = true)]
public int? status { get; set; }
/// <summary>
/// remCode
/// </summary>
[SugarColumn(Length = 255, IsNullable = true)]
public string? remCode { get; set; }
/// <summary>
/// remAccId
/// </summary>
[SugarColumn(Length = 50, IsNullable = true)]
public string? remAccId { get; set; }
/// <summary>
/// token
/// </summary>
[SugarColumn(Length = 50, IsNullable = true)]
public string? token { get; set; }
/// <summary>
/// addTime
/// </summary>
[SugarColumn(IsNullable = true)]
public DateTime? addTime { get; set; }
/// <summary>
/// openId
/// </summary>
[SugarColumn(Length = 50, IsNullable = true)]
public string? openId { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
namespace Application.Domain;
public class UserCache
{
public static string BaseCacheKey = "BaseUserCache:{0}";
public static string BaseCacheKeys = "BaseUserCache:{0}:{1}";
}

View File

@@ -0,0 +1,33 @@
namespace Application.Domain;
public interface IGameAccountService
{
/// <summary>
/// 根据OpenId获取账号信息
/// </summary>
/// <param name="openId"></param>
/// <returns></returns>
Task<game_account> GetAccInfoByOpenId(string openId);
/// <summary>
/// 根据AccId获取账号信息
/// </summary>
/// <param name="accId"></param>
/// <returns></returns>
Task<game_account> GetAccInfoByAccId(string accId);
Task<game_account> GetAccInfoByToken(string token);
/// <summary>
/// 注册账号
/// </summary>
/// <param name="userName"></param>
/// <param name="nick"></param>
/// <param name="pwd"></param>
/// <param name="remAccId"></param>
/// <param name="openId"></param>
/// <returns></returns>
Task<game_account> Regist(string userName, string nick, string pwd, string remAccId = "",
string openId = "");
Task<bool> UpdateAccountToken(string accId);
}

View File

@@ -0,0 +1,160 @@
using Photon.Core.Assist;
namespace Application.Domain;
public class GameAccountService : IGameAccountService, ITransient
{
private readonly ISqlSugarClient _dbClient;
private readonly IRedisCache _redisClient;
public GameAccountService(ISqlSugarClient dbClient, IRedisCache redisClient)
{
_dbClient = dbClient;
_redisClient = redisClient;
}
public async Task<game_account> GetAccInfoByOpenId(string openId)
{
string key = string.Format(UserCache.BaseCacheKeys, "UserAccountData", "OpenId");
if (await _redisClient.HExistsHashAsync(key, openId))
{
return await _redisClient.GetHashAsync<game_account>(key, openId);
}
else
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
var data = await db.Queryable<game_account>().Where(it => it.openId == openId).FirstAsync();
await _redisClient.AddHashAsync(key, openId, data);
return data;
}
}
public async Task<game_account> GetAccInfoByAccId(string accId)
{
string key = string.Format(UserCache.BaseCacheKeys, "UserAccountData", "AccId");
if (await _redisClient.HExistsHashAsync(key, accId))
{
return await _redisClient.GetHashAsync<game_account>(key, accId);
}
else
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
var data = await db.Queryable<game_account>().Where(it => it.accId == accId).FirstAsync();
await _redisClient.AddHashAsync(key, accId, data);
return data;
}
}
public async Task<game_account> GetAccInfoByToken(string token)
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
var data = await db.Queryable<game_account>().Where(it => it.token == token).FirstAsync();
return data;
}
private async Task ClearCache(string clearId)
{
string openId = string.Empty;
string accId = string.Empty;
var accInfo = await GetAccInfoByAccId(clearId);
if (accInfo != null)
{
accId = accInfo.accId;
openId = accInfo.openId;
}
else
{
accInfo = await GetAccInfoByOpenId(clearId);
if (accInfo != null)
{
accId = accInfo.accId;
openId = accInfo.openId;
}
}
if (!string.IsNullOrEmpty(openId))
{
string key = string.Format(UserCache.BaseCacheKeys, "UserAccountData", "OpenId");
await _redisClient.DelHashAsync(key, openId);
}
if (!string.IsNullOrEmpty(accId))
{
string key = string.Format(UserCache.BaseCacheKeys, "UserAccountData", "AccId");
await _redisClient.DelHashAsync(key, accId);
}
}
public async Task<game_account> Regist(string userName, string nick, string pwd, string remAccId = "",
string openId = "")
{
game_account result = new game_account();
try
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
await _dbClient.AsTenant().BeginTranAsync();
string accId = StringAssist.NewGuid;
result.accId = accId;
result.userName = userName;
result.nick = nick;
string sid = await CreateToken();
result.token = sid;
result.npwd = pwd;
result.remAccId = remAccId;
result.remCode = StringAssist.RandomString(6);
result.pwd = EncryptAssist.Md5Encryption(pwd);
result.status = 1;
result.addTime = DateTime.Now;
result.openId = openId;
bool isok = await db.Insertable(result).ExecuteCommandAsync() > 0;
if (isok)
{
await ClearCache(openId);
}
else
{
result = null;
}
await _dbClient.AsTenant().CommitTranAsync();
}
catch
{
result = null;
await _dbClient.AsTenant().RollbackTranAsync();
}
return result;
}
private async Task<string> CreateToken()
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
string token = string.Empty;
bool ok = true;
while (ok)
{
token = string.Format("{0}", StringAssist.RandomString(32));
if (await db.Queryable<game_account>().Where(it => it.token == token).AnyAsync() == false)
{
ok = false;
}
}
return token;
}
public async Task<bool> UpdateAccountToken(string accId)
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_account>();
string token = await CreateToken();
bool result = await db.Updateable<game_account>().SetColumns(it => it.token == token)
.Where(it => it.accId == accId).ExecuteCommandAsync() > 0;
if (result)
{
await ClearCache(accId);
}
return result;
}
}

View File

@@ -0,0 +1,22 @@
using Newtonsoft.Json;
namespace Application.Web;
public class AutoLogin
{
public async Task<TwResult> TwLogin(string code)
{
using HttpClient client = new HttpClient();
// 发送 GET 请求
string url = $"https://m.twbar.cn/api/AppAuto/GetOpenInfo?code={code}";
string responseText = await client.GetStringAsync(url);
return JsonConvert.DeserializeObject<TwResult>(responseText);
}
}
public class TwResult
{
public string msg { get; set; } = "";
public int code { get; set; }
public object data { get; set; }
}

View File

@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using Newtonsoft.Json;
namespace Application.Web.Controllers.Login namespace Application.Web.Controllers.Login
{ {
@@ -9,39 +10,107 @@ namespace Application.Web.Controllers.Login
/// </summary> /// </summary>
[ApiExplorerSettings(GroupName = "Login")] [ApiExplorerSettings(GroupName = "Login")]
[Route("[controller]/[action]")] [Route("[controller]/[action]")]
[ApiController] [ApiController]
public class LoginController : ControllerBase public class LoginController : ControllerBase
{ {
private readonly IHubContext<ChatHub> _hubContext; private readonly IGameAccountService _accountService;
public LoginController(IHubContext<ChatHub> hubContext) public LoginController(IGameAccountService accountService)
{ {
_hubContext = hubContext; _accountService = accountService;
} }
/// <summary>
/// 登录接口 /// <summary>
/// </summary> /// 登录接口
/// <param name="parms"></param> /// </summary>
/// <returns></returns> /// <param name="parms"></param>
/// <returns></returns>
[HttpPost] [HttpPost]
public async Task<IPoAction> Login([FromBody] LoginParms parms) public async Task<IPoAction> Login([FromBody] LoginParms parms)
{ {
return PoAction.Ok(parms.code); return PoAction.Ok(parms.code);
} }
/// <summary> /// <summary>
/// 测试接口 /// 探玩自动登录
/// </summary> /// </summary>
/// <param name="name">测试名</param> /// <param name="code"></param>
/// <param name="ttt">测试2</param>
/// <returns></returns> /// <returns></returns>
[HttpGet] [HttpGet]
public async Task<IPoAction> Test(string name,string ttt) public async Task<IPoAction> TwLogin( string code)
{ {
await _hubContext.Clients.All.SendAsync("ReceiveMessage", "系统"); if (string.IsNullOrEmpty(code))
{
return PoAction.Ok(name); 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("退出失败,请稍后尝试!");
}
}
} }
} }

View File

@@ -15,13 +15,12 @@ const { on, emit } = useEventBus()
//连接signlar //连接signlar
const ConnectSignlar = (clientId: string) => { const ConnectSignlar = (clientId: string) => {
console.log(`客户端:${clientId}`); console.log(`客户端:${clientId}`);
} }
// 初始化应用配置 // 初始化应用配置
onMounted(() => { onMounted(() => {
userStore.setToken("5555","111","222");
// 初始化屏幕尺寸 // 初始化屏幕尺寸
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
appStore.updateScreenSize(window.innerWidth, window.innerHeight) appStore.updateScreenSize(window.innerWidth, window.innerHeight)

View File

@@ -1,4 +1,13 @@
body, div, p, a, table, textarea, form, img, ul, li { body,
div,
p,
a,
table,
textarea,
form,
img,
ul,
li {
margin: 0; margin: 0;
padding: 0; padding: 0;
border: 0; border: 0;
@@ -10,87 +19,61 @@ body {
font-size: 18px; font-size: 18px;
} }
.game_nav { .main {}
background: #302828;
color: white;
font-size: 15px;
padding: 2px 0px 2px 3px;
color: white;
font-style: italic;
padding-left: 10px;
}
.main {
}
div { div {
margin: 5px 2px; margin: 5px 2px;
} }
div img { div img {
margin-right: 2px; margin-right: 2px;
vertical-align: middle; vertical-align: middle;
} }
div img { div img {
max-width: 100%; max-width: 100%;
width: exPRession(document.body.clientWidth>250?"250px":"auto"); }
overflow: hidden;
}
.logo { .logo {
max-height: 120px; max-height: 120px;
} }
.step-logo { .head {}
max-height: 120px;
}
.head { .title {}
}
.title { .content {}
}
.content { .item {}
}
.item {
}
.border { .border {
border-bottom: 1px dashed #9f8d8d; border-bottom: 1px dashed #9f8d8d;
} }
.tips {
}
.menu {
}
.clear { .clear {
height: 5px; height: 5px;
} }
.foot { .foot {}
}
body a { a {
color: #1e5494; color: #1e5494;
margin: 0 5px; margin: 0 5px;
text-decoration: underline; text-decoration: underline;
} }
a:link { a:link {
color: #1e5494; color: #1e5494;
/*display: inline-block;*/ /*display: inline-block;*/
margin: 3px 4px 3px 4px; margin: 3px 4px 3px 4px;
} }
a:hover, a:active, a:focus { a:hover,
color: #FFFFFF; a:active,
background: #1e5494; a:focus {
} color: #FFFFFF;
background: #1e5494;
}
.a-nomargin { .a-nomargin {
margin: 0; margin: 0;
@@ -104,530 +87,13 @@ body a {
color: red; color: red;
} }
.text-red a { .text-red a {
color: red;
}
.page-msg {
color: red; color: red;
} }
.common { .common {}
}
.common img { .common img {
margin-right: 2px;
vertical-align: middle;
}
.PageTips {
font-size: 15px;
font-weight: bold;
}
.algin-center {
text-align: center
}
.input {
line-height: 30px;
}
.ipt {
width: 60%;
display: block;
padding: 6px 12px;
font-size: 14px;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgb(0 0 0 / 8%);
transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
}
.btn {
display: inline-block;
margin-bottom: 0;
font-size: 14px;
font-weight: 400;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-image: none;
border: 1px solid transparent;
border-radius: 4px;
}
.btn-danger {
color: #fff;
background-color: #d9534f;
border-color: #d43f3a;
}
.btn-waring {
color: #fff;
background-color: #FE5E08;
border-color: #FE5E08;
}
.btn-ret {
border-color: #d2d2d2;
background: 0 0;
color: #666;
}
.chat {
word-wrap: break-word;
}
.chat img {
margin-right: 2px;
vertical-align: middle;
}
.em {
height: 22px;
width: 22px;
}
.ftbtn {
margin-top: 15px;
}
.equImg-min {
width: 18px;
height: 18px;
}
.user-head {
max-height: 25px;
max-width: 25px;
}
/******装备样式******/
.equImg {
max-width: 130px;
max-height: 230px;
}
.tq {
background-image: url('/images/site/equ/tq.png');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.ty {
background-image: url('/images/site/equ/ty.png');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.ms {
background-image: url('/images/site/equ/ms.png');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.zx {
background-image: url('/images/site/equ/zx.png');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.sy {
background-image: url('/images/site/equ/sy.png');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.gw {
background-image: url('/images/site/equ/gw.png');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.ly {
background-image: url('/images/site/equ/ly.gif');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.hm {
background-image: url('/images/site/equ/hm.gif');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.j_r {
background-image: url('/images/site/equ/r.gif');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
.j_l {
background-image: url('/images/site/equ/l.gif');
background-repeat: no-repeat;
display: inline-block;
width: 15px;
height: 15px;
background-size: 15px; /*设置图片大小*/
}
/**********End*******/
/***副本***/
.dup {
background-image: url('/images/site/dup/dup.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
}
/***任务***/
.task-ret {
background-image: url('/images/site/tr.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
}
.task-get {
background-image: url('/images/site/tg.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
}
/*九宫图片*/
.gray {
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
filter: grayscale(100%);
filter: gray;
}
/*九宫样式*/
.wrapper {
display: grid;
grid-template-columns: 51px 51px 51px;
grid-template-rows: 51px 51px 51px;
margin-left: 10px;
}
.list {
background: #eee;
margin-right: 1px;
margin-bottom: 1px;
}
.list img {
width: 50px;
height: 50px;
}
/********其他*******/
.mounthImg {
width: 120px;
height: 120px;
}
/***广播***/
.broad {
font-size: 15px;
}
.broad-gift {
background-image: url('/images/site/broad/gift.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
margin-right: 2px; margin-right: 2px;
vertical-align: middle; vertical-align: middle;
border: 0;
}
.broad-system {
background-image: url('/images/site/broad/system.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
margin-right: 2px;
vertical-align: middle;
}
.broad-award {
background-image: url('/images/site/broad/award.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
margin-right: 2px;
vertical-align: middle;
}
.broad-remind {
background-image: url('/images/site/broad/remind.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
margin-right: 2px;
vertical-align: middle;
}
.broad-promote {
background-image: url('/images/site/broad/promote.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
margin-right: 2px;
vertical-align: middle;
}
.broad-hot1 {
background-image: url('/images/site/broad/hot1.gif');
background-repeat: no-repeat;
display: inline-block;
width: 18px;
height: 18px;
background-size: 18px; /*设置图片大小*/
margin-right: 2px;
vertical-align: middle;
}
/****礼物***/
.gift {
width: 20px;
height: 20px;
}
.attire {
height: 200px;
width: 125px;
}
/****限时活动****/
.act_item {
margin-bottom: 10px;
border: 1px solid #9f8d8d;
border-radius: 16px;
padding: 5px;
}
.act_menu a {
font-size: 14px;
font-weight: bold;
}
.act_content {
font-size: 14px;
}
.act_header {
text-align: center;
}
.m_act_head {
text-align: center;
}
.m_act_head {
text-align: center;
}
.m_act_item {
border-bottom: 1px dashed #9f8d8d;
}
.m_act_title {
font-weight: bold;
font-size: 16px;
}
.m_act_con {
font-size: 15px;
padding: 3px;
text-indent: 2em;
}
.m_act_con a {
font-size: 15px;
}
.badge {
max-height: 25px;
max-width: 25px;
}
.maxname {
max-height: 150px;
max-width: 250px;
}
/* ========== 自定义通知队列 ========== */
#custom-notify-container {
position: fixed;
top: 10px;
left: 50%;
transform: translateX(-50%);
z-index: 9999;
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
pointer-events: none;
}
.custom-notify-item {
box-sizing: border-box;
max-width: 90%;
padding: 8px 16px;
margin-bottom: 8px;
border-radius: 8px;
color: #fff;
font-size: 12px;
line-height: 1.5;
text-align: center;
word-wrap: break-word;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
pointer-events: auto;
cursor: pointer;
opacity: 0;
transform: translateY(-20px);
animation: notify-slide-in 300ms ease-out forwards;
}
.custom-notify-item.leaving {
animation: notify-fade-out 200ms ease-in forwards;
}
@keyframes notify-slide-in {
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes notify-fade-out {
to {
opacity: 0;
transform: translateY(-10px);
}
}
/* ========== 顶部通告栏 ========== */
.custom-notice-bar {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 40px;
display: flex;
align-items: center;
padding: 0 16px;
box-sizing: border-box;
z-index: 9998;
font-size: 14px;
line-height: 24px;
}
.custom-notice-bar .notice-icon {
flex-shrink: 0;
margin-right: 8px;
font-size: 16px;
position: relative;
z-index: 1;
}
.custom-notice-bar .notice-wrap {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
display: flex;
align-items: center;
padding: 0 40px;
box-sizing: border-box;
}
.custom-notice-bar .notice-text {
display: inline-block;
white-space: nowrap;
padding-right: 50px;
flex-shrink: 0;
}
.custom-notice-bar .notice-wrap.scrolling {
animation: notice-scroll var(--scroll-duration, 10s) linear infinite;
}
@keyframes notice-scroll {
0% {
transform: translateX(0);
}
100% {
transform: translateX(-50%);
}
}
.custom-notice-bar .notice-close {
flex-shrink: 0;
margin-left: 8px;
font-size: 18px;
cursor: pointer;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
line-height: 1;
position: relative;
z-index: 1;
} }

View File

@@ -64,25 +64,37 @@ export class ApiService {
} }
const result = response.data; const result = response.data;
if (result.code === 401) { if (result.code === 401) {
//401刷新token
console.log(result.data); console.log(result.data);
} else if (result.code === 40101) { } else if (result.code === 40101) {
this.redirectToLogin(); this.redirectToLogin();
throw { throw {
handled: true, handled: true,
redirectTo: "/login/login", redirectTo: "/",//跳转回首页
message: result.msg || "登录已失效" message: result.msg || "登录已失效"
} satisfies HandledRedirectError; } satisfies HandledRedirectError;
} else if (result.code === 500) { } else if (result.code === 500) {
// 跳转错误页面 // 跳转错误页面
throw {
handled: true,
redirectTo: "/",//跳转回首页
message: result.msg || "登录已失效"
} satisfies HandledRedirectError;
} else if (result.code === 404) { } else if (result.code === 404) {
// 跳转不存在页面 // 跳转不存在页面
throw {
handled: true,
redirectTo: "/",//跳转回首页
message: result.msg || "登录已失效"
} satisfies HandledRedirectError;
} }
return response; return response;
}, },
onRejected: (error) => { onRejected: (error) => {
if (error && typeof error === "object" && "status" in error) { if (error && typeof error === "object" && "status" in error) {
// console.log("接口错误:", error); // console.log("接口错误:", error);
} }
return error; return error;

View File

@@ -25,5 +25,12 @@ export class StateHelper {
{ {
this.userStore.offOnline(); this.userStore.offOnline();
} }
static get IsAccLogin(){
return this.userStore.isLoginAccount;
}
static get IsLogin(){
return this.userStore.isLogin;
}
} }

View File

@@ -4,42 +4,21 @@
<Abar href="/">首页</Abar>&gt;客服 <Abar href="/">首页</Abar>&gt;客服
</div> </div>
<div class="content"> <div class="content">
微信客服<a href="https://work.weixin.qq.com/kfid/kfc86bc348120aea3e7" 微信客服<a href="https://work.weixin.qq.com/kfid/kfc86bc348120aea3e7" target="_blank">点击咨询</a><br />
target="_blank">点击咨询</a><br />客服QQ531493955<br />官方QQ群238938639<br />客服邮箱531493955@qq.com<br /> 客服QQ290555931<br />
官方QQ群931835791<br />
客服邮箱tanwan@kexunkeji.cn<br />
</div> </div>
<Abar href="/">返回游戏首页</Abar> <Abar href="/">返回游戏首页</Abar>
<!-- 分页组件示例 -->
<div class="content" style="margin-top: 10px;">
<Pagination :currentPage="currentPage" :totalPages="totalPages" @pageChange="data" />
</div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
let a = 1
definePageMeta({ definePageMeta({
layout: layout.empty, layout: layout.empty,
middleware: 'page-loading' middleware: middleware.loading
}) })
const currentPage = ref<number>(1);
const totalPages = ref<number>(95);
const handlePageChange = (page: number): void => {
currentPage.value = page;
console.log('跳转到第', page, '页');
};
const data = (data: any) => {
console.log('子组件传的值', data);
}
onMounted(() => { onMounted(() => {
PageLoading.Close(); PageLoading.Close();
}) })

View File

@@ -56,7 +56,7 @@
<div class="item" v-for="(item, index) in noticeData" :key="index"> <div class="item" v-for="(item, index) in noticeData" :key="index">
{{ index + 1 }}.<Abar :href='"/login/register?id=" + item.noticeId'>{{ item.title }}</Abar> {{ index + 1 }}.<Abar :href='"/login/register?id=" + item.noticeId'>{{ item.title }}</Abar>
</div> </div>
<span v-if="noticeData.length == 0">暂无公告.</span> <span v-if="noticeData.length == 0">暂无公告.</span>
</div> </div>
</div> </div>
<div class="title"> <div class="title">
@@ -75,6 +75,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
definePageMeta({ definePageMeta({
layout: layout.empty, layout: layout.empty,
middleware: middleware.loading middleware: middleware.loading
@@ -100,23 +101,43 @@ const Initialize = async (): Promise<void> => {
}; };
//退出登录 //退出登录
const offOnline = () => { const offOnline = async () => {
MessageExtend.ShowConfirmDialog("退出游戏", "您确定要退出游戏吗?", () => { MessageExtend.ShowConfirmDialog("退出游戏", "您确定要退出游戏吗?", async () => {
StateHelper.OffOnline(); var result = await PubService.GetMain(StateHelper.Sid);
isOnline.value = false; if (result.code == 0) {
MessageExtend.ShowToast("退出成功!", "success"); StateHelper.OffOnline();
isOnline.value = false;
MessageExtend.ShowToast("退出成功!", "success");
}
else {
MessageExtend.ShowToast(result.msg, "fail");
}
}); });
} }
onMounted(async () => { const login = async (code: string): Promise<void> => {
//默认设置身份,正式环境删除 var result = await LoginService.TwLogin(code);
StateHelper.SetSid("kUVjj2cBUemcdokUEIBEKh0qhKkkSkui0x"); console.log(result);
//StateHelper.SetSid(''); if (result.code == 0) {
try { StateHelper.SetSid(result.data.token);
await Initialize(); await Initialize();
}
else {
MessageExtend.ShowToast(result.msg, "default");
}
}
onMounted(async () => {
try {
const code = PageExtend.QueryString("code");
if (code != '' && StateHelper.IsAccLogin == false) {
//执行登录
await login(code);
}
else {
await Initialize();
}
} }
finally { finally {
PageLoading.Close(); PageLoading.Close();

View File

@@ -0,0 +1,29 @@
export class LoginService {
/**
* 登录接口
* POST /Login/Login
* 请求体: 登录请求参数
* @param name 登录名/手机号
* @param pwd 密码
* @param code 验证码
*/
static async Login(name: string, pwd: string, code: string) {
return await ApiService.Request("post", "/Login/Login", { name, pwd, code });
}
/**
* 探玩自动登录
* GET /Login/TwLogin
*/
static async TwLogin(code: string) {
return await ApiService.Request("get", "/Login/TwLogin", { code });
}
/**
* 退出登录
* GET /Login/LoginOut
*/
static async LoginOut(sid: string) {
return await ApiService.Request("get", "/Login/LoginOut", { sid });
}
}