This commit is contained in:
Putoo
2026-04-27 14:17:52 +08:00
parent 4463f9e810
commit c55a104573
16 changed files with 168 additions and 88 deletions

View File

@@ -1,7 +0,0 @@
namespace Application.Domain.Entity
{
public class Class1
{
}
}

View File

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

View File

@@ -1,7 +0,0 @@
namespace Application.Domain
{
public class Class1
{
}
}

View File

@@ -0,0 +1,4 @@
global using Photon.Core;
global using SqlSugar;
global using Application.Domain.Entity;
global using Photon.Core.Redis;

View File

@@ -0,0 +1,16 @@
namespace Application.Domain;
public interface IAreaService
{
/// <summary>
/// 获取所有区服
/// </summary>
/// <returns></returns>
Task<List<game_area>> GetAreaData();
/// <summary>
/// 获取区服信息
/// </summary>
/// <param name="areaId"></param>
/// <returns></returns>
Task<game_area> GetAreaInfo(int areaId);
}

View File

@@ -0,0 +1,60 @@
namespace Application.Domain;
public class AreaService : IAreaService, ITransient
{
private readonly ISqlSugarClient _dbClient;
private readonly IRedisCache _redisClient;
public AreaService(ISqlSugarClient dbClient, IRedisCache redisClient)
{
_dbClient = dbClient;
_redisClient = redisClient;
}
/// <summary>
/// 获取所有区服
/// </summary>
/// <returns></returns>
public async Task<List<game_area>> GetAreaData()
{
string key = string.Format(BaseCache.BaseCacheKey, "AreaData");
if (await _redisClient.ExistsAsync(key))
{
return await _redisClient.GetAsync<List<game_area>>(key);
}
else
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_area>();
var data = await db.Queryable<game_area>().ToListAsync();
await _redisClient.SetAsync(key, data);
return data;
}
}
public async Task<game_area> GetAreaInfo(int areaId)
{
string key = string.Format(BaseCache.BaseCacheKeys, "AreaData", areaId);
if (await _redisClient.ExistsAsync(key))
{
return await _redisClient.GetAsync<game_area>(key);
}
else
{
var db = _dbClient.AsTenant().GetConnectionWithAttr<game_area>();
var data = await db.Queryable<game_area>().Where(it => it.areaId == areaId).SingleAsync();
await _redisClient.SetAsync(key, data);
return data;
}
}
private async Task ClearAreaCache(int areaId = 0)
{
string key = string.Format(BaseCache.BaseCacheKey, "AreaData");
await _redisClient.DelAsync(key);
if (areaId != 0)
{
key = string.Format(BaseCache.BaseCacheKeys, "AreaData", areaId);
await _redisClient.DelAsync(key);
}
}
}

View File

@@ -15,4 +15,10 @@
<Folder Include="wwwroot\" /> <Folder Include="wwwroot\" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Update="applicationsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project> </Project>

View File

@@ -2,6 +2,15 @@
{ {
public class StateHelper public class StateHelper
{ {
public static bool isOnline
{
get
{
var token = App.HttpContext.GetTokenInfo();
return token != null;
}
}
public static string userId public static string userId
{ {
get { get {
@@ -14,7 +23,7 @@
get get
{ {
var token = App.HttpContext.GetTokenInfo(); var token = App.HttpContext.GetTokenInfo();
return token.Claims["sid"]; return token.Claims["token"];
} }
} }
} }

View File

@@ -1,5 +1,6 @@
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
using Photon.Core.Redis;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -9,7 +10,7 @@ builder.Services.Inject(new List<string> {
});//框架初始化 });//框架初始化
builder.Configuration.RegisterConfig();//注入配置 builder.Configuration.RegisterConfig();//注入配置
builder.Services.InjectMemory(); builder.Services.InjectRedis(builder.Configuration);
builder.Services.InjectSql(builder.Configuration); builder.Services.InjectSql(builder.Configuration);
#region JWT与接口配置 #region JWT与接口配置

View File

@@ -1,19 +1,29 @@
{ {
"AutoProgram": 0, "AutoProgram": 0,
"Redis": { "Redis": {
"connection": "127.0.0.1,password=,defaultdatabase=1" "connection": "127.0.0.1:6379,password=,defaultdatabase=5"
}, },
"SqlData": [ "SqlData": [
{ {
"type": 0, "type": 0,
"name": "KgDb", "name": "Kg.SeaTime.Game",
"connect": "data source=kx.iyba.cn;database=kx.petera;user id=root;password=1f5ozxRGE3Y;pooling=true;port=23306;sslmode=Required;charset=utf8mb4;" "connect": "data source=192.168.0.88;database=kg.seatime.game;user id=root;password=1f5ozxRGE3Y;pooling=true;port=3306;sslmode=Required;charset=utf8mb4;"
},
{
"type": 0,
"name": "Kg.SeaTime.Resource",
"connect": "data source=192.168.0.88;database=kg.seatime.resource;user id=root;password=1f5ozxRGE3Y;pooling=true;port=3306;sslmode=Required;charset=utf8mb4;"
},
{
"type": 0,
"name": "Kg.SeaTime.Log",
"connect": "data source=192.168.0.88;database=kg.seatime.log;user id=root;password=1f5ozxRGE3Y;pooling=true;port=3306;sslmode=Required;charset=utf8mb4;"
} }
], ],
"JwtTokenOptions": { "JwtTokenOptions": {
"Issuer": "kx.petera", "Issuer": "kx.seatime",
"Audience": "kx.petera", "Audience": "kx.seatime",
"SecurityKey": "DAbdA9fF9MYXDCFBEb75WKWWDAbDBWQi" "SecurityKey": "46055HR0n7FeNHhDKAYD2i9ZsdsYn4jn"
}, },
"ResUrl": { "ResUrl": {
"local": "http://192.168.0.142:5298", "local": "http://192.168.0.142:5298",

View File

@@ -75,7 +75,7 @@ div {
.foot { .foot {
} }
a { body a {
color: #1e5494; color: #1e5494;
margin: 0 5px; margin: 0 5px;
text-decoration: underline; text-decoration: underline;

View File

@@ -92,7 +92,7 @@ export class ApiService {
this.initialized = true; this.initialized = true;
} }
public static async Request<T = unknown>( public static async Request<T = any>(
method: HttpMethod, method: HttpMethod,
url: string, url: string,
params: RequestParams = {} params: RequestParams = {}

View File

@@ -1,5 +1,5 @@
export interface IResultData<T = unknown> { export interface IResultData<T = any> {
code: number code: number
msg: string msg: string
data?: T data?: T

View File

@@ -87,22 +87,40 @@
小G报时(18:33) 小G报时(18:33)
</div> </div>
</div> </div>
<div v-for="(item, index) in areaData" :key="index">
{{ index }} - {{ item.name }}
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
//MessageExtend.ShowToast('success', '更新成功!')
//MessageExtend.ShowToast('success', '更新成功!')
//MessageExtend.NotifyList("success", ['获取装备',"获取物品"]) //MessageExtend.NotifyList("success", ['获取装备',"获取物品"])
definePageMeta({ definePageMeta({
layout: layout.empty layout: layout.empty
}) })
const areaData = ref<any>([]);
const Initialize = async (): Promise<void> => {
var result = await PubService.GetMain();
if (result.code == 0) {
areaData.value = result.data?.area;
}
else {
MessageExtend.ShowToast("fail", result.msg);
}
};
// await navigateTo('/auth/login', { replace: true }) // await navigateTo('/auth/login', { replace: true })
onMounted(async () => { onMounted(async () => {
const test = await LoginService.Test("dddd","dddd2"); await Initialize();
console.log(test);
//alert(1); //alert(1);
}) })

View File

@@ -1,23 +0,0 @@
export class LoginService {
/**
* 登录接口
* POST /Login/Login
* 请求体: 登录请求参数
* @param name 登录名/手机号
* @param pwd 密码
* @param code 验证码
*/
static async Login(name: string, pwd: string, code: string) {
return ApiService.Request("post", "/Login/Login", { name, pwd, code });
}
/**
* 测试接口
* GET /Login/Test
* @param name 测试名
* @param ttt 测试2
*/
static async Test(name: string, ttt: string) {
return ApiService.Request("get", "/Login/Test", { name, ttt });
}
}

View File

@@ -3,72 +3,58 @@
* 管理用户登录信息、Token等核心状态 * 管理用户登录信息、Token等核心状态
*/ */
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import type { IUserInfo } from '~/types/user'
// 仓库命名规范use+业务域+Store // 仓库命名规范use+业务域+Store
export const useUserStore = defineStore('user', { export const useUserStore = defineStore('user', {
// 1. 原始状态:仅存基础数据,不做任何计算、判断 // 1. 原始状态:仅存基础数据,不做任何计算、判断
state: () => ({ state: () => ({
userInfo: null as IUserInfo | null,
token: '', token: '',
isLoading: false as boolean refToken:"",
sid:""
}), }),
// 2. 只读计算属性:封装派生逻辑,全局只读 // 2. 只读计算属性:封装派生逻辑,全局只读
getters: { getters: {
//判断是否登录主页
isLoginAccount: (state) => !!state.sid,
// 判断是否登录 // 判断是否登录
isLogin: (state) => !!state.token, isLogin: (state) => !!state.token,
// 获取用户ID //token
userId: (state) => state.userInfo?.id ?? 0, getToken:(state)=>state.token??"",
// 格式化用户昵称 // 刷新token
userNickname: (state) => state.userInfo?.nickname || state.userInfo?.username || '未知用户', getRefToken: (state) => state.refToken??"",
// 获取用户头像 // 账号
userAvatar: (state) => state.userInfo?.avatar || '', getSid: (state) => state.sid?? '',
// 获取用户角色
userRole: (state) => state.userInfo?.role || 'user'
}, },
// 3. 唯一状态修改入口所有状态变更必须走actions // 3. 唯一状态修改入口所有状态变更必须走actions
actions: { actions: {
// 设置用户信息与Token // 设置用户信息与Token
setUserInfo(data: IUserInfo, token: string) { setToken( token: string,refToken :string) {
this.userInfo = data this.token = token,
this.token = token this.refToken = refToken
this.isLoading = false
}, },
// 仅更新Token // 仅更新Token
setToken(token: string) { setSid(sid: string) {
this.token = token this.sid = sid
}, },
// 退出登录:清空用户状态 // 退出登录:清空用户状态
clearUserInfo() { clearUserInfo() {
this.userInfo = null this.token = '',
this.token = '' this.refToken='',
this.isLoading = false this.sid=''
},
// 设置登录加载态
setLoginLoading(loading: boolean) {
this.isLoading = loading
},
// 更新用户信息(部分更新)
updateUserInfo(partialData: Partial<IUserInfo>) {
if (this.userInfo) {
this.userInfo = { ...this.userInfo, ...partialData }
}
} }
}, },
// 4. 持久化配置仅缓存核心状态token + userInfo // 4. 持久化配置仅缓存核心状态token + userInfo
persist: { persist: {
storage: piniaPluginPersistedstate.localStorage(), storage: piniaPluginPersistedstate.localStorage(),
pick: ['token', 'userInfo'] pick: ['token','refToken', 'sid']
} }
}) })