This commit is contained in:
Putoo
2026-06-18 18:54:22 +08:00
parent 4297019836
commit ad49fbb1b1
42 changed files with 1694 additions and 62 deletions

View File

@@ -0,0 +1,105 @@
<template>
<div class="content">
打造装备<Abutton @click="showPaper = true">选择</Abutton> <br>
</div>
<div class="content">
<div v-if="useGoods.goodsId != undefined">
<div class="common">
当前选择:{{ useGoods.goodsName }}
</div>
<div class="common">
<strong>打造所需</strong><br>
<GamePropVerify :data="verifyData.needs"></GamePropVerify>
</div>
<div class="common" v-if="verifyData.result == true">
[<Abutton @click="MakeEqu">立即打造</Abutton>]
</div>
</div>
<div v-else>
暂未选择打造图.
</div>
</div>
<div class="clear"></div>
<div class="content" style="font-size: 15px;">
说明:<br>
1.使用打造图后随机获得一件装备装备等级按照打造图纸中的说明<br>
2.打造出的装备无需鉴定<br>
3.打造方式先选择打造图纸然后收集足够的材料即可完成打造
</div>
<GamePopup v-model:show="showPaper" title="【选择图纸】" style="width: 60%;max-height: 30%;">
<!-- 自定义内容 -->
<div class="content" style="margin-top: 15px;">
<div v-if="goods.length == 0">
暂无图纸.
</div>
<div class="item" v-for="(item, index) in goods" :key="index">
{{ index + 1 }}.<Abutton @click="ChoosePaper(item.goods)">{{ item.goods.goodsName }}</Abutton>({{
item.count }})
</div>
</div>
</GamePopup>
</template>
<script setup lang="ts">
definePageMeta({
layout: layout.default,
middleware: 'page-loading'
})
const goods = ref<Array<any>>([]);
const useGoods = ref<any>({});
const verifyData = ref<any>({});
const needs = ref<Array<any>>([]);
onMounted(async () => {
try {
await BindData();
}
finally {
PageLoading.Close();
}
})
const BindData = async (): Promise<void> => {
let result = await BusinessService.GetEquPaper();
if (result.code == 0) {
goods.value = result.data;
}
else {
MessageExtend.ShowDialog("装备打造", result.msg);
}
};
const showPaper = ref(false);
const ChoosePaper = async (data: any) => {
useGoods.value = data;
MessageExtend.LoadingToast("操作中...");
let result = await BagService.CheckUserProp(0, 1, data.content);
MessageExtend.LoadingClose();
if (result.code == 0) {
verifyData.value = result.data;
needs.value = verifyData.value.needs;
showPaper.value = false;
}
else {
MessageExtend.ShowDialog("选择图纸", result.msg);
}
}
const MakeEqu = async () => {
MessageExtend.LoadingToast("打造中...");
let npcId = LocalStorageHelper.GetOnNpc();
let result = await BusinessService.HandleEquPaper(Number(npcId), useGoods.value.goodsId);
MessageExtend.LoadingClose();
if (result.code == 0) {
return PageExtend.Redirect("/prop/equ?ue=" + result.data);
}
else {
MessageExtend.ShowDialog("打造装备", result.msg);
}
}
</script>

View File

@@ -0,0 +1,71 @@
<template>
<div class="content">
修复装备
</div>
<div class="content">
请选择:
<div v-if="equData.length > 0">
<span v-if="allCopper > 0">
<Abutton @click="retEqu('')">全部修复({{ allCopper }})</Abutton>
</span>
<div class="item" v-for="(item, index) in equData" :key="index">
{{ index + 1 }}.<GameEqu :equ-data="item" :show-lev="1" :show-url="true"></GameEqu>
<span>({{ item.durability }}/{{ item.maxdurability }})</span>
<span v-if="item.durability < item.maxdurability">
[<Abutton @click="retEqu(item.ueId)">修复({{ item.maxdurability - item.durability }})</Abutton>]
</span>
</div>
</div>
<div v-else>
暂无穿戴中的装备.
</div>
</div>
<div class="clear"></div>
<div class="content" style="font-size: 16px;">
说明:<br>
1.装备仅可修复当前穿戴中的装备<br>
2.每修复1点耐久消耗1铜贝
</div>
</template>
<script setup lang="ts">
definePageMeta({
layout: layout.default,
middleware: 'page-loading'
})
const equData = ref<Array<any>>([]);
const allCopper = ref(0);
onMounted(async () => {
try {
await BindData();
}
finally {
PageLoading.Close();
}
})
const BindData = async (): Promise<void> => {
let npcId = LocalStorageHelper.GetOnNpc();
let result = await RecoverService.GetUserRecoverEqu(Number(npcId));
if (result.code == 0) {
equData.value = result.data.data;
allCopper.value = result.data.need;
}
else {
MessageExtend.ShowDialog("强化装备", result.msg);
}
};
const retEqu = async (ueId: string) => {
let npcId = LocalStorageHelper.GetOnNpc();
MessageExtend.LoadingToast("修复中...");
let result = await RecoverService.RecoverEqu(Number(npcId), ueId);
MessageExtend.LoadingClose();
if (result.code == 0) {
MessageExtend.Notify(result.msg, "success");
await BindData();
}
else {
MessageExtend.ShowDialog("提示", result.msg);
}
}
</script>

View File

@@ -1,8 +1,5 @@
<template>
<GameBroadcast :data="broadcast"></GameBroadcast>
<div class="item" style="font-size:15px;">
<span>[在线奖励]:3分钟后可领取.</span>
</div>
<GameBroadcast :data="broadcast"></GameBroadcast>
<div class="content">
{{ cityInfo.cityName }}·{{ mapInfo.mapName }}
<Abutton @click="Refresh">刷新</Abutton>

View File

@@ -49,15 +49,13 @@
</div>
</div>
<div class="common" v-if="ueId != ''">
名称:{{ equData.equName }}<br>
名称:<span v-html="EquTool.ConvertEquName(equData, 0)"></span> <br>
<span v-if="equData.equName != equData.unitEquName">
装备名称:{{ equData.unitEquName }}<br>
</span>
部位:{{ EquTool.GetEquPlaceName(equData.code) }}<br>
等级:{{ equData.lev }}<br>
<span v-if="equData.quality > 0">
品质:<Abar href="">equData.qualityName</Abar><br>
</span>
品质:{{ equData.qualityName }}<br>
交易:{{ equData.isDeal == 1 ? "可交易" : "不可交易" }}<br>
赠送:{{ equData.isGive == 1 ? "可赠送" : "不可赠送" }}<br>
获取途径:{{ equInfo.source }}<br>
@@ -127,7 +125,10 @@
<Abutton @click="btnOpenAwaken">觉醒</Abutton><br>
</span>
<span v-if="equData.isAppr == 1">
<Abutton>洗练</Abutton><br>
<Abar :href='"/user/equ/quality?ue=" + equData.ueId'>洗练</Abar><br>
</span>
<span v-if="equData.isAppr == 0">
<Abutton @click="ApprEqu">鉴定</Abutton><br>
</span>
<span>
<Abutton @click="LockEqu">{{ equData.isLock == 0 ? "绑定" : "解绑" }}</Abutton><br>
@@ -275,4 +276,20 @@ const btnEquAwaken = async (type: number) => {
}
}
/**鉴定 */
const ApprEqu = async () => {
MessageExtend.ShowConfirmDialogAsyc("鉴定装备", `鉴定装备需要消耗1张【装备鉴定符】,是否要鉴定?`, async () => {
let result = await EquService.ApprEqu(ueId);
if (result.code == 0) {
await BindData();
MessageExtend.Notify(result.msg, "success");
}
else {
MessageExtend.Notify(result.msg, "danger");
}
return true;
});
}
</script>

View File

@@ -11,9 +11,12 @@
<div class="content">
<div class="common">
<Acheak @click="ChangeBag('0')" :on-value="type" on-cheak="0">装备</Acheak>|<Acheak @click="ChangeBag('1')"
:on-value="type" on-cheak="1">药品</Acheak>|<Acheak @click="ChangeBag('2')" :on-value="type" on-cheak="2">
物品</Acheak>|<Acheak @click="ChangeBag('3')" :on-value="type" on-cheak="3">坐骑</Acheak>
<Acheak @click="ChangeBag('0')" :on-value="type" on-cheak="0">装备</Acheak>|
<Acheak @click="ChangeBag('1')" :on-value="type" on-cheak="1">药品</Acheak>|
<Acheak @click="ChangeBag('2')" :on-value="type" on-cheak="2">物品</Acheak>|
<Acheak @click="ChangeBag('3')" :on-value="type" on-cheak="3">坐骑</Acheak>|
<Acheak @click="ChangeBag('4')" :on-value="type" on-cheak="4">九宫</Acheak>|
<Acheak @click="ChangeBag('5')" :on-value="type" on-cheak="5">十方</Acheak>
</div>
<div class="common">
@@ -49,7 +52,7 @@
<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='"/prop/equ?ue=" + item.ueId'>{{ item.equName }}({{ item.lev }})</Abar>
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>
<span v-if="item.isOn == 1">()</span>
<span v-if="item.isAppr == 0">(未鉴定)</span>
<span v-if="item.useEndTime < onTime" style="color: red;">(过期)</span>
@@ -131,7 +134,7 @@ 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;
total.value = result.data.total;
//存储请求参数
let addLocalData: bagStorage = { type: type.value, type_ch: type_ch.value, page: currentPage.value, serch: serch.value };
@@ -146,14 +149,14 @@ const BindData = async (): Promise<void> => {
const ChangeBag = async (_type: string): Promise<void> => {
currentPage.value = 1;
type.value = _type;
type_ch.value = '0';
serch.value='';
type_ch.value = '0';
serch.value = '';
await BindData();
}
const ChangeChildBag = async (ch: string): Promise<void> => {
currentPage.value = 1;
type_ch.value = ch;
type_ch.value = ch;
await BindData();
}
@@ -163,14 +166,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

@@ -2,69 +2,69 @@
<div class="content">
手持: <Abutton @click="chooseEqu(1, Hold)">[+]</Abutton>
<div class="item" v-for="item in Hold">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton @click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton @click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
副手: <Abutton @click="chooseEqu(2, Vice)">[+]</Abutton>
<div class="item" v-for="item in Vice">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
头戴: <Abutton @click="chooseEqu(3, Head)">[+]</Abutton>
<div class="item" v-for="item in Head">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
身穿: <Abutton @click="chooseEqu(4, Wear)">[+]</Abutton>
<div class="item" v-for="item in Wear">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
腰带: <Abutton @click="chooseEqu(5, Waist)">[+]</Abutton>
<div class="item" v-for="item in Waist">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
脚穿: <Abutton @click="chooseEqu(6, Foot)">[+]</Abutton>
<div class="item" v-for="item in Foot">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
佩戴: <Abutton @click="chooseEqu(7, Ornaments)">[+]</Abutton>
<div class="item" v-for="item in Ornaments">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
时装: <Abutton @click="chooseEqu(8, Fashion)">[+]</Abutton>
<div class="item" v-for="item in Fashion">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
羽翼: <Abutton @click="chooseEqu(9, Wing)">[+]</Abutton>
<div class="item" v-for="item in Wing">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>
<div class="content">
装饰: <Abutton @click="chooseEqu(10, Decorate)">[+]</Abutton>
<div class="item" v-for="item in Decorate">
<GameEqu :equ-data="item" :show-url="true"></GameEqu>[<Abutton
<GameEqu :equ-data="item" :show-url="true" :show-lev="1"></GameEqu>[<Abutton
@click="DownAndOnEqu(item.ueId, '')">卸下</Abutton>]
</div>
</div>

View File

@@ -0,0 +1,147 @@
<template>
<div class="content">
装备洗练<br>
名称: <GameEqu :equ-data="equData" :show-url="false"></GameEqu><br>
<span v-if="equData.equName != equData.unitEquName">
装备名称:{{ equData.unitEquName }}<br>
</span>
部位:{{ EquTool.GetEquPlaceName(equData.code) }}<br>
等级:{{ equData.lev }}<br>
</div>
<div class="content">
当前品质:{{ equData.qualityName }}<br>
品质等级:{{ equData.quality }}<br>
当前特性:<br>
<div :class='"equip equip-lv" + (index + 1)' v-for="(item, index) in equAttr" :key="index">
{{ index + 1 }}.{{ item.tip }}
</div>
</div>
<div class="content">
洗练所需:<br>
<GamePropVerify :data="verifyData.needs"></GamePropVerify>
</div>
<div class="content" v-if="verifyData.result">
[<Abutton @click="btnHandleEquUp">立即洗练</Abutton>]
</div>
<div class="clear"></div>
<div class="content" style="font-size: 16px;;">
洗练说明:<br>
1.洗练会随机重置装备词条,且不可恢复<br>
2.装备词条数即为装备品质分别为<br>>>>>绿>>>><br>
3.洗练最多可以获得7个特性词条,只有特殊装备会有8个特性词条<br>
</div>
</template>
<script setup lang="ts">
definePageMeta({
layout: layout.default,
middleware: 'page-loading'
})
const equData = ref<any>({});
const equAttr = ref<Array<any>>([]);
const verifyData = ref<any>({});
const needs = ref<Array<any>>([]);
let ueId = PageExtend.QueryString("ue");
onMounted(async () => {
try {
await BindData();
}
finally {
PageLoading.Close();
}
})
const BindData = async (): Promise<void> => {
let result = await EquService.GetEquQualityInfo(ueId);
if (result.code == 0) {
equData.value = result.data.equData;
equAttr.value = equData.value.equAttr;
verifyData.value = result.data.result;
needs.value = verifyData.value.needs;
}
else {
MessageExtend.ShowDialog("装备洗练", result.msg);
}
};
/**洗练装备 */
const btnHandleEquUp = async () => {
MessageExtend.LoadingToast("洗练中...");
let result = await EquService.HandleEquQuality(ueId);
MessageExtend.LoadingClose();
if (result.code == 0) {
await BindData();
MessageExtend.Notify(result.msg, "success");
}
else {
MessageExtend.Notify(result.msg, "danger");
}
}
</script>
<style>
/* 装备等级基础通用样式 */
.equip {
width: 220px;
padding: 5px;
margin: 8px 0;
border-radius: 8px;
font-size: 15px;
}
/* 1级 普通 · 浅灰银 */
.equip-lv1 {
color: #868b94; /* 文字色 */
background-color: #f2f3f5; /* 背景底色 */
border: 1px solid #d0d3d9; /* 边框描边 */
}
/* 2级 优秀 · 浅青灰 */
.equip-lv2 {
color: #589999;
background-color: #f0f8f8;
border: 1px solid #b2d8d8;
}
/* 3级 精良 · 柔和绿 */
.equip-lv3 {
color: #4a9966;
background-color: #f2faf5;
border: 1px solid #a6d9bb;
}
/* 4级 稀有 · 暖黄琥珀(低饱和不刺眼) */
.equip-lv4 {
color: #b38628;
background-color: #fff9eb;
border: 1px solid #f0d090;
}
/* 5级 史诗 · 淡紫柔紫 */
.equip-lv5 {
color: #805cb3;
background-color: #f7f2ff;
border: 1px solid #ccb8e6;
}
/* 6级 传说 · 浅天蓝 */
.equip-lv6 {
color: #3b7cb8;
background-color: #f0f7ff;
border: 1px solid #a3c6e8;
}
/* 7级 神话 · 柔暗红(复古酒红) */
.equip-lv7 {
color: #a84f4f;
background-color: #fdf2f2;
border: 1px solid #e8b3b3;
}
/* 8级 不朽 · 鎏金暗金(高级质感,不荧光) */
.equip-lv8 {
color: #b88c36;
background-color: #fffbf0;
border: 1px solid #e6c280;
/* 顶级增加微弱渐变质感 */
background-image: linear-gradient(135deg, #fffbf0, #fff6e0);
}
</style>

View File

@@ -74,7 +74,7 @@ onMounted(async () => {
}
})
const BindData = async (): Promise<void> => {
let result = await EquService.GetEquUpInfo(ueId);
let result = await EquService.GetEquUpInfo(ueId);
if (result.code == 0) {
equData.value = result.data.equData;
isMax.value = result.data.isMax;
@@ -104,10 +104,12 @@ const ChangePropOk = async (data: any) => {
it.code = data.code;
it.parameter = data.parameter;
it.count = data.count;
it.isOp = data.isOp;
it.retCount = data.retCount;
}
});
let _needs = JSON.stringify(needs.value);
let result = await BagService.CheckUserProp(_needs);
let result = await BagService.CheckUserProp(1, 1, _needs);
MessageExtend.LoadingClose();
if (result.code == 0) {
verifyData.value = result.data;