This commit is contained in:
Putoo
2026-05-26 18:38:55 +08:00
parent 61cf882b66
commit 6b7193b4c0
33 changed files with 1021 additions and 42 deletions

View File

@@ -23,7 +23,7 @@ export default defineNuxtConfig({
// 自动导入配置 - 使用完整路径
imports: {
dirs: ['stores', 'composables', 'extends', 'services/**', 'model/**'],
dirs: ['stores', 'composables', 'extends','utility', 'services/**', 'model/**'],
},
pinia: {
@@ -48,6 +48,13 @@ export default defineNuxtConfig({
'航海时代是2022年推出的一款以航海为背景的wap文字游戏让玩家穿越到15世纪的大航海时代了解各地不同的风土人情淋漓尽致的演绎航海时代的血雨腥风。',
},
],
link: [
{
rel: 'icon',
href: '/images/favicon.ico',
type: 'image/x-icon'
}
]
},
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

View File

@@ -1,5 +1,5 @@
<template>
<Abar href="">{{data.nick}}</Abar>
<template>
<Abar :href='"/user/user?no=" +data.userNo' >{{ data.nick }}</Abar>
</template>
<script lang="ts" setup>
const props = defineProps({

View File

@@ -4,7 +4,7 @@
<div class="common">
<Abar href="/">首页</Abar>-
<Abar href="/">挂机</Abar>-
<Abar href="/treasure">聚宝盆</Abar>-
<!-- <Abar href="/treasure">聚宝盆</Abar>- -->
<a target="_blank" href="https://work.weixin.qq.com/kfid/kfc86bc348120aea3e7">反馈</a>
</div>

View File

@@ -1,17 +1,17 @@
<template>
<div class="common">
<Abar href="/">状态</Abar>.
<Abar href="/user">状态</Abar>.
<Abar href="/bag">物品</Abar>.
<Abar href="/chat">聊天</Abar>
</div>
<div class="common">
<Abar href="/">好友</Abar>.
<Abar href="/">宠物</Abar>.
<Abar href="/">队伍</Abar>
<Abar href="/friend">好友</Abar>.
<Abar href="/pet">宠物</Abar>.
<Abar href="/team">队伍</Abar>
</div>
<div class="common">
<Abar href="/">商城</Abar>.
<Abar href="/">活动</Abar>.
<Abar href="/">排行</Abar>
<Abar href="/mall">商城</Abar>.
<Abar href="/activity">活动</Abar>.
<Abar href="/rank">排行</Abar>
</div>
</template>

View File

@@ -0,0 +1,46 @@
export class LocalStorageExtend {
/**
* 设置本地存储
* @param key 键名
* @param value 值(支持任意类型:对象/数组/字符串/数字)
*/
public static Set<T>(key: string, value: T): void {
try {
const data = JSON.stringify(value);
window.localStorage.setItem(key, data);
} catch (error) {
console.error('localStorage 设置失败:', error);
}
}
/**
* 获取本地存储
* @param key 键名
* @param defaultValue 默认值(取不到时返回)
* @returns 解析后的值
*/
public static Get<T>(key: string, defaultValue?: T): T | null {
try {
const data = window.localStorage.getItem(key);
if (!data) return defaultValue ?? null;
return JSON.parse(data) as T;
} catch (error) {
console.error('localStorage 获取失败:', error);
return defaultValue ?? null;
}
}
/**
* 删除指定存储
*/
public static Remove(key: string): void {
window.localStorage.removeItem(key);
}
/**
* 清空所有存储
*/
public static Clear(): void {
window.localStorage.clear();
}
}

View File

@@ -0,0 +1,3 @@
<template>
</template>

View File

@@ -4,7 +4,7 @@
金元:{{ bagInfo.gold }}<br />
金贝:{{ bagInfo.cowry }} <br />
负重:{{ bagInfo.onWeight }}/{{ bagInfo.maxWeight }} <br />
{{ bagInfo.copper }}<br />
{{ GameTool.FormatCopper(bagInfo.copper) }}<br />
<Abar href="/">交易记录</Abar><br>
<Abar href="/">赠送记录</Abar>
</div>
@@ -48,31 +48,30 @@
<div class="content">
<div class="common" v-if="type == '0'">
<div class="item" v-for="(item, index) in data" :key="index">
{{ PageExtend.GetPageIndex(currentPage, 10, index + 1) }}.
<Abar href="">{{ item.equName }}({{item.lev}})</Abar>
{{ PageExtend.GetPageIndex(currentPage, 10, index + 1) }}.
<Abar :href='"/prop/goods?ue=" + item.ueId'>{{ item.equName }}({{ item.lev }})</Abar>
<span v-if="item.isOn == 1">(穿)</span>
<span v-if="item.isAppr == 0">(未鉴定)</span>
<span v-if="item.useEndTime < onTime" style="color: red;">(过期)</span>
<span v-if="item.durability < 1" style="color: red;">(损坏)</span>
<span v-if="item.durability < 1" style="color: red;">(损坏)</span>
<span v-if="item.isLock == 1" style="color: green;">()</span>
</div>
</div>
<div class="common" v-if="type == '1'">
<div class="item" v-for="(item, index) in data" :key="index">
{{ PageExtend.GetPageIndex(currentPage, 10, index + 1) }}.
<Abar href="">{{ item.goodsName }}</Abar>({{ item.count }})
<Abar :href='"/prop/goods?id=" + item.goodsId'>{{ item.goodsName }}</Abar>({{ item.count }})
</div>
</div>
<div class="common" v-if="type == '2'">
<div class="item" v-for="(item, index) in data" :key="index">
{{ PageExtend.GetPageIndex(currentPage, 10, index + 1) }}.
<span v-if="item.code == 'Card'">
<Abar href="">{{ item.goodsName }}</Abar>({{ item.count }})
<Abar :href='"/prop/goods?id=" + item.goodsId'>{{ item.goodsName }}</Abar>({{ item.count }})
</span>
<span v-else>
<Abar href="">{{ item.goodsName }}</Abar>({{ item.count }})
<Abar :href='"/prop/goods?id=" + item.goodsId'>{{ item.goodsName }}</Abar>({{ item.count }})
</span>
</div>
</div>
@@ -84,6 +83,13 @@
</template>
<script setup lang="ts">
interface bagStorage {
type: string
type_ch: string
page: number
serch: string
}
definePageMeta({
layout: layout.default,
middleware: 'page-loading'
@@ -101,7 +107,15 @@ const onTime = ref(0);
onMounted(async () => {
try {
onTime.value = TimeExtend.GetSecondStamp();
onTime.value = TimeExtend.GetSecondStamp();
let localData = LocalStorageExtend.Get<bagStorage>("BagPageCache");
if (localData != null) {
type.value = localData.type;
type_ch.value = localData.type_ch;
currentPage.value = localData.page;
serch.value = localData.serch;
}
let result = await BagService.GetUserBagData();
if (result.code == 0) {
bagInfo.value = result.data;
@@ -117,8 +131,11 @@ const BindData = async (): Promise<void> => {
let result = await BagService.GetUserBagProp(Number(type.value), Number(type_ch.value), serch.value, currentPage.value)
if (result.code == 0) {
data.value = result.data.data;
total.value = result.data.total;
console.log(data.value);
total.value = result.data.total;
//存储请求参数
let addLocalData: bagStorage = { type: type.value, type_ch: type_ch.value, page: currentPage.value, serch: serch.value };
LocalStorageExtend.Set("BagPageCache", addLocalData);
}
else {
MessageExtend.ShowDialog("提示", result.msg);
@@ -128,12 +145,13 @@ const BindData = async (): Promise<void> => {
/**切换背包 */
const ChangeBag = async (_type: string): Promise<void> => {
type.value = _type;
type_ch.value = '0';
type_ch.value = '0';
serch.value='';
await BindData();
}
const ChangeChildBag = async (ch: string): Promise<void> => {
type_ch.value = ch;
type_ch.value = ch;
await BindData();
}
@@ -143,14 +161,14 @@ const Refresh = async (): Promise<void> => {
onTime.value = TimeExtend.GetSecondStamp();
MessageExtend.LoadingToast("刷新中...");
currentPage.value = 1;
await BindData();
await BindData();
MessageExtend.LoadingClose();
PageExtend.ScrollToTop();
}
/**翻页 */
const handlePageChange = async (page: number): Promise<void> => {
currentPage.value = page;
currentPage.value = page;
await BindData();
};

View File

@@ -0,0 +1 @@
<template></template>

View File

@@ -0,0 +1,3 @@
<template>
</template>

View File

@@ -0,0 +1,3 @@
<template>
暂未开放.
</template>

View File

@@ -0,0 +1 @@
<template></template>

View File

@@ -0,0 +1 @@
<template></template>

View File

@@ -0,0 +1 @@
<template></template>

View File

@@ -0,0 +1 @@
<template></template>

View File

@@ -0,0 +1,88 @@
<template>
<div class="content">
<Abar href="">更换称号</Abar><br>
ID:{{ userData.userNo }}&nbsp;[<Abar href="">升靓号</Abar>]<br>
昵称:<Abar href="">{{ userData.nick }}</Abar><br>
性别:<Abar href="">{{ userData.sex }}</Abar><br>
<Abar>特权</Abar>:<br>
徽章:<Abar>显示</Abar><br>
社交:<Abar>未收到礼物</Abar><br>
婚姻:单身<br>
个性签名:{{ userData.sign }}.<Abar>修改</Abar><br>
宠物:暂无<br>
坐骑:<br>
成就:<Abar>展示成就</Abar><br>
等级:{{ attrData.lev }}<br>
综合战力:{{attrData.score}}<br>
经验:{{ expData.exp }}/{{ expData.upExp }}<br>
体力:{{attrData.blood}}/{{attrData.upBlood}} {{attrData.bloodTips}}<br>
攻击:{{attrData.minAtk}}-{{attrData.maxAtk}} {{attrData.atkTips}}<br>
防御:{{attrData.defense}} {{attrData.defTips}}<br>
敏捷:{{attrData.agility}} {{attrData.agilityTips}}<br>
士气:{{attrData.morale}}/{{attrData.upMorale}} {{attrData.moraleTips}}<br>
师德:{{accData.teach}}<br>
声望:{{accData.renown}}<br>
活力:{{ vitality }}<br>
罪恶值:0<br>
帮派:<br>
<!-- ---药品状态---<br>
体力宝+24370<br>
耐久包+0<br> -->
</div>
<div class="content">
<div class="item">
<Abar>装备</Abar>.
<Abar>技能</Abar>.
<Abar>特性</Abar>
</div>
<div class="item">
<Abar>帮派</Abar>.
<Abar>船队</Abar>.
<Abar>房产</Abar>
</div>
<div class="item">
<Abar>山寨</Abar>.
<Abar>交易</Abar>.
<Abar>设置</Abar>
</div>
</div>
</template>
<script setup lang="ts">
definePageMeta({
layout: layout.default,
middleware: 'page-loading'
})
const userData = ref<any>({});
const vitality = ref(0);
const expData = ref<any>({});
const attrData = ref<any>({});
const accData = ref<any>({});
onMounted(async () => {
try {
await BindData();
}
finally {
PageLoading.Close();
}
})
const BindData = async (): Promise<void> => {
let result = await UserService.GetUserInfo();
if (result.code == 0) {
userData.value = result.data.user;
vitality.value = result.data.vitality;
expData.value = result.data.exp;
attrData.value = result.data.attr;
accData.value = result.data.acc;
console.log(result);
}
else {
MessageExtend.ShowDialog("提示", result.msg);
}
};
</script>

View File

@@ -0,0 +1,90 @@
<template>
<div class="content">
<Abar>私聊</Abar>. <Abar>送礼物</Abar>. <Abar>逗一下</Abar><br />
<Abar>拜师</Abar>. <Abar>山寨</Abar>. <Abar>送道具</Abar><br>
<Abar>加好友</Abar>. <Abar>加仇人</Abar>
</div>
<div class="content"></div>
<div class="content">
ID:{{ userData.userNo }}({{ online == 1 ? '在线' : '离线' }})<br>
昵称:{{ userData.nick }}<br>
特权:<br>
徽章:<br>
社交: 暂无<br>
婚姻:<br>
结拜:暂无<br>
宠物:暂无<br>
坐骑:<br>
成就:<br>
个性签名:{{ userData.sign }}<br>
罪恶值:0<br>
师德:{{ accData.teach }}<br>
</div>
<div class="content">
{{ attrData.lev }}{{ userData.sex }}({{ onMap }})
</div>
<div class="content">
手持: <br>
副手:<br>
头戴:<br>
身穿: <br>
腰带: <br>
脚穿: <br>
佩戴: <br>
时装:<br>
羽翼: <br>
装饰: <br>
套装: <br>
帮会: <br>
队伍:<br>
</div>
<div class="content"></div>
</template>
<script setup lang="ts">
definePageMeta({
layout: layout.default,
middleware: 'page-loading'
})
const userData = ref<any>({});
const attrData = ref<any>({});
const accData = ref<any>({});
const online = ref(0);
const onMap = ref('');
onMounted(async () => {
try {
await BindData();
}
finally {
PageLoading.Close();
}
})
const BindData = async (): Promise<void> => {
let no = PageExtend.QueryString("no");
let result = await UserService.GetHomeInfo(no);
if (result.code == 0) {
userData.value = result.data.user;
attrData.value = result.data.attr;
accData.value = result.data.acc;
online.value = result.data.isOnline;
onMap.value = result.data.onMapName;
console.log(result);
}
else if (result.code == 101) {
return PageExtend.Redirect("/user");
}
else if (result.code == 102) {
MessageExtend.ShowDialogEvent("提示", "玩家不存在!", () => {
return PageExtend.Redirect("/user");
}, "确认");
}
else {
MessageExtend.ShowDialog("提示", result.msg);
}
};
</script>

View File

@@ -0,0 +1,17 @@
export class UserService {
/**
* 获取个人资料信息
* GET /User/User/GetUserInfo
*/
static async GetUserInfo() {
return await ApiService.Request("get", "/User/User/GetUserInfo");
}
/**
* 获取用户资料
* GET /User/User/GetHomeInfo
*/
static async GetHomeInfo(no: string) {
return await ApiService.Request("get", "/User/User/GetHomeInfo", { no });
}
}

View File

@@ -0,0 +1,38 @@
export class GameTool {
/**
* 静态方法:将总铜数转换为 金/银/铜 字符串
* @param totalCopper 总铜数量
* @returns 格式化字符串1金 234银 567铜
*/
public static FormatCopper(totalCopper: number | string): string {
// 安全转为数字并取整(货币无小数)
let copper = Math.floor(Number(totalCopper) || 0);
// 处理负数
const isNegative = copper < 0;
copper = Math.abs(copper);
// 单位换算
const copperUnit = copper % 1000;
const totalSilver = Math.floor(copper / 1000);
const silverUnit = totalSilver % 1000;
const goldUnit = Math.floor(totalSilver / 1000);
// 拼接非0单位
const parts: string[] = [];
if (goldUnit > 0) parts.push(`${goldUnit}`);
if (silverUnit > 0) parts.push(`${silverUnit}`);
if (copperUnit > 0) parts.push(`${copperUnit}`);
// 空值显示 0铜
let result = parts.length > 0 ? parts.join(' ') : '0铜';
// 恢复负号
if (isNegative) {
result = `-${result}`;
}
return result;
}
}