This commit is contained in:
2025-03-31 10:33:16 +08:00
parent f036fa047c
commit 700243601f
18 changed files with 396 additions and 276 deletions
+11 -6
View File
@@ -3,16 +3,21 @@ import hmac
import json
import time
from typing import Optional
from core.character.adventure import get_adv_info
from core.basic.character import Character
from fastapi import Header, Request
from api.core.exception import ResponseException
class AlterState:
def __init__(self, alter: str, token: str, charcater: Character, equVersion: str,time: int):
self.alter = alter
def __init__(self, value: str, token: str, charcater: Character, equVersion: str,time: int):
self.value = value
try:
self.alter = get_adv_info(value)["class"]
except Exception:
raise ResponseException('无效的职业')
self.token = token
self.origin = alter.split('.')[-1]
self.origin = self.alter.split('.')[-1]
self.character = charcater
self.equVersion = equVersion
self.time = time
@@ -35,15 +40,15 @@ def dict2obj(dictObj):
return d
def createToken(alter: str, equVersion: str, redis = None, expire=86400 / 24 * 2)->str:
def createToken(value: str, equVersion: str, redis = None, expire=86400 / 24 * 2)->str:
ts_str = str(time.time() + expire)
ts_byte = ts_str.encode('utf-8')
sha1_tshex_str = hmac.new(alter.encode('utf-8'), ts_byte, 'sha1').hexdigest()
sha1_tshex_str = hmac.new(value.encode('utf-8'), ts_byte, 'sha1').hexdigest()
token = sha1_tshex_str
token = base64.urlsafe_b64encode(token.encode('utf-8')).decode('utf-8')
# character = createCharacter(alter)
character = {}
redis.set(f'token:{token}', json.dumps(AlterState(alter, token, character, equVersion).to_dict()), int(expire))
redis.set(f'token:{token}', json.dumps(AlterState(value, token, character, equVersion).to_dict()), int(expire))
return token
+1 -1
View File
@@ -20,7 +20,7 @@ def alterToken(alter_token: Optional[str] = Header(None)):
decoded_bytes = base64.b64decode(alter_token)
decoded_str = decoded_bytes.decode('utf-8')
alter = json.loads(decoded_str)
# 时间判断 后面再加
# 6小时过期
if (int(time.time() * 1000) - alter['time']) / (60 * 60 * 1000) > 6:
raise ResponseException('登录过期或无效Token,请刷新后重试')
return AlterState(alter['alter'], alter_token, {}, alter['equVersion'], alter['time'])
+2 -4
View File
@@ -5,6 +5,7 @@ from fastapi import APIRouter,Request
from api.core.Response import Return, response
from api.core.Redis import get_redis_info
from api.dp import RedisDep,AltersDep
from core.character.adventure import get_adv_list
from core.basic.character import createCharacter
router = APIRouter()
@@ -14,10 +15,7 @@ register_gzip_request(router)
@router.get('/adventure')
async def get_adventure_info(request: Request,redis:RedisDep):
def get_adventure():
with open('./dataFiles/adventure-info.json', encoding='utf-8') as fp:
return json.load(fp)
adventure_info = get_redis_info(redis, 'dcalc:adventure', get_adventure)
adventure_info = get_redis_info(redis, 'dcalc:adventure', get_adv_list)
return response(data=adventure_info)
+1
View File
@@ -201,6 +201,7 @@ class Character:
self.ElementIncrease = 1.0
self.equs = {}
self.JadeInfo = Jade()
self.equ_effect = []
pass
# region 角色属性设置
+245
View File
@@ -0,0 +1,245 @@
import base64
adv = [
{
'id': 0,
'name': 'swordman_male',
'title': '鬼剑士(男)',
'children': [
{'id': 0, 'name': 'weapon_master', 'title': '极诣·剑魂', 'open': False},
{'id': 1, 'name': 'soul_bender', 'title': '极诣·鬼泣', 'open': False},
{'id': 2, 'name': 'berserker', 'title': '极诣·狂战士', 'open': False},
{'id': 3, 'name': 'asura', 'title': '极诣·阿修罗', 'open': False},
{'id': 4, 'name': 'ghostblade', 'title': '极诣·剑影', 'open': False},
],
},
{
'id': 1,
'name': 'swordman_female',
'title': '鬼剑士(女)',
'children': [
{'id': 0, 'name': 'sword_master', 'title': '极诣·驭剑士', 'open': False},
{'id': 1, 'name': 'dark_templar', 'title': '极诣·暗殿骑士', 'open': False},
{'id': 2, 'name': 'demon_slayer', 'title': '极诣·契魔者', 'open': False},
{'id': 3, 'name': 'vegabond', 'title': '极诣·流浪武士', 'open': False},
{'id': 4, 'name': 'spectre', 'title': '极诣·刃影', 'open': False},
],
},
{
'id': 2,
'name': 'fighter_male',
'title': '格斗家(男)',
'children': [
{'id': 0, 'name': 'nenmaster_male', 'title': '归元·气功师', 'open': False},
{'id': 1, 'name': 'striker_male', 'title': '归元·散打', 'open': False},
{'id': 2, 'name': 'brawler_male', 'title': '归元·街霸', 'open': False},
{'id': 3, 'name': 'grappler_male', 'title': '归元·柔道家', 'open': False},
{'name': 'empty', 'title': '', 'comment': '首页'},
],
},
{
'id': 3,
'name': 'fighter_female',
'title': '格斗家(女)',
'children': [
{'id': 0, 'name': 'nenmaster_female', 'title': '归元·气功师', 'open': False},
{'id': 1, 'name': 'striker_female', 'title': '归元·散打', 'open': False},
{'id': 2, 'name': 'brawler_female', 'title': '归元·街霸', 'open': False},
{'id': 3, 'name': 'grappler_female', 'title': '归元·柔道家', 'open': False},
{'name': 'empty', 'title': '', 'comment': '设置'},
],
},
{
'id': 4,
'name': 'gunner_male',
'title': '神枪手(男)',
'children': [
{'id': 0, 'name': 'ranger_male', 'title': '重霄·漫游枪手', 'open': False},
{'id': 1, 'name': 'launcher_male', 'title': '重霄·枪炮师', 'open': False},
{'id': 2, 'name': 'mechanic_male', 'title': '重霄·机械师', 'open': False},
{'id': 3, 'name': 'spitfire_male', 'title': '重霄·弹药专家', 'open': False},
{'id': 4, 'name': 'assault', 'title': '重霄·合金战士', 'open': False},
],
},
{
'id': 5,
'name': 'gunner_female',
'title': '神枪手(女)',
'children': [
{'id': 0, 'name': 'ranger_female', 'title': '重霄·漫游枪手', 'open': False},
{'id': 1, 'name': 'launcher_female', 'title': '重霄·枪炮师', 'open': False},
{'id': 2, 'name': 'mechanic_female', 'title': '重霄·机械师', 'open': False},
{'id': 3, 'name': 'spitfire_female', 'title': '重霄·弹药专家', 'open': True, 'class': 'GF.gunner_female.spitfire_female'},
{'name': 'sponsor', 'url': 'https://bbs.colg.cn', 'title': ''},
],
},
{
'id': 6,
'name': 'mage_male',
'title': '魔法师(男)',
'children': [
{'id': 0, 'name': 'elemental_bomber', 'title': '知源·元素爆破师', 'open': False},
{'id': 1, 'name': 'glacial_master', 'title': '知源·冰结师', 'open': False},
{'id': 2, 'name': 'blood_mage', 'title': '知源·血法师', 'open': False},
{'id': 3, 'name': 'swift_master', 'title': '知源·逐风者', 'open': False},
{'id': 4, 'name': 'dimension_walker', 'title': '知源·次元行者', 'open': False},
],
},
{
'id': 7,
'name': 'mage_female',
'title': '魔法师(女)',
'children': [
{'id': 0, 'name': 'elementalist', 'title': '知源·元素师', 'open': False},
{'id': 1, 'name': 'summoner', 'title': '知源·召唤师', 'open': False},
{'id': 2, 'name': 'battle_mage', 'title': '知源·战斗法师', 'open': False},
{'id': 3, 'name': 'witch', 'title': '知源·魔道学者', 'open': False},
{
'id': 4,
'name': 'enchantress',
'title': '知源·小魔女',
'open': False,
'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'enchantress'}, {'id': 1, 'name': 'default', 'title': '输出', 'class': 'enchantress_carry'}],
},
],
},
{
'id': 8,
'name': 'priest_male',
'title': '圣职者(男)',
'children': [
{
'id': 0,
'name': 'crusader_male',
'title': '神启·圣骑士',
'open': False,
'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'crusader_male'}, {'id': 1, 'name': 'default', 'title': '审判', 'class': 'crusader_male_carry'}],
},
{'id': 1, 'name': 'infighter', 'title': '神启·蓝拳圣使', 'open': False},
{'id': 2, 'name': 'exorcist', 'title': '神启·驱魔师', 'open': False},
{'id': 3, 'name': 'avenger', 'title': '神启·复仇者', 'open': False},
{'id': 4, 'name': 'empty', 'title': ''},
],
},
{
'id': 9,
'name': 'priest_female',
'title': '圣职者(女)',
'children': [
{
'id': 0,
'name': 'crusader_female',
'title': '神启·圣骑士',
'open': False,
'options': [{'id': 0, 'name': 'default', 'title': '奶', 'class': 'crusader_female'}, {'id': 1, 'name': 'default', 'title': '输出', 'class': 'crusader_female_carry'}],
},
{'id': 1, 'name': 'inquistor', 'title': '神启·异端审判者', 'open': False},
{'id': 2, 'name': 'sorceress', 'title': '神启·巫女', 'open': False},
{'id': 3, 'name': 'mistress', 'title': '神启·诱魔者', 'open': False},
{'id': 4, 'name': 'empty', 'title': ''},
],
},
{
'id': 10,
'name': 'thief',
'title': '暗夜使者',
'children': [
{'id': 0, 'name': 'rogue', 'title': '隐夜·刺客', 'open': False},
{'id': 1, 'name': 'necro', 'title': '隐夜·死灵术士', 'open': False},
{'id': 2, 'name': 'kunoichi', 'title': '隐夜·忍者', 'open': False},
{'id': 3, 'name': 'shadow_dancer', 'title': '隐夜·影舞者', 'open': False},
{'id': 4, 'name': 'empty', 'title': ''},
],
},
{
'id': 11,
'name': 'knight',
'title': '守护者',
'children': [
{'id': 0, 'name': 'elven_knight', 'title': '皓曦·精灵骑士', 'open': False},
{'id': 1, 'name': 'chaos', 'title': '皓曦·混沌魔灵', 'open': False},
{'id': 2, 'name': 'paladin', 'title': '皓曦·帕拉丁', 'open': False},
{'id': 3, 'name': 'dragon_knight', 'title': '皓曦·龙骑士', 'open': False},
{'id': 4, 'name': 'empty', 'title': ''},
],
},
{
'id': 12,
'name': 'demonic_lancer',
'title': '魔枪士',
'children': [
{'id': 0, 'name': 'vanguard', 'title': '千魂·征战者', 'open': False},
{'id': 1, 'name': 'skirmisher', 'title': '千魂·决战者', 'open': False},
{'id': 2, 'name': 'dragoon', 'title': '千魂·狩猎者', 'open': False},
{'id': 3, 'name': 'impaler', 'title': '千魂·暗枪士', 'open': False},
{'id': 4, 'name': 'empty', 'title': ''},
],
},
{
'id': 13,
'name': 'gunblader',
'title': '枪剑士',
'children': [
{'id': 0, 'name': 'hitman', 'title': '苍暮·暗刃', 'open': False},
{'id': 1, 'name': 'agent', 'title': '苍暮·特工', 'open': False},
{'id': 2, 'name': 'trouble_shooter', 'title': '苍暮·战线佣兵', 'open': False},
{'id': 3, 'name': 'specialist', 'title': '苍暮·源能专家', 'open': False},
{'id': 4, 'name': 'empty', 'title': ''},
],
},
{
'id': 14,
'name': 'archer',
'title': '弓箭手',
'children': [
{'id': 0, 'name': 'muse', 'title': '聆风·缪斯', 'open': False},
{'id': 1, 'name': 'traveler', 'title': '聆风·旅人', 'open': False},
{'id': 2, 'name': 'hunter', 'title': '聆风·猎人', 'open': False},
{'id': 3, 'name': 'vigilante', 'title': '聆风·妖护使', 'open': False},
{'id': 4, 'name': 'empty', 'title': ''},
],
},
{
'id': 15,
'name': 'extra',
'title': '外传',
'children': [
{'id': 0, 'name': 'creator', 'title': '知源·缔造者', 'open': False},
{'id': 1, 'name': 'dark_knight', 'title': '极诣·黑暗武士', 'open': False},
{'id': 2, 'name': 'empty', 'title': ''},
{'id': 3, 'name': 'empty', 'title': ''},
{'id': 4, 'name': 'empty', 'title': ''},
],
},
]
def get_adv_list():
for parent in adv:
parent_id = f'{parent["id"]:02}'
for child in parent['children']:
child_id = f'{child.get("id", 0):02}'
if 'options' in child:
for idx, option in enumerate(child['options']):
option['value'] = base64.b64encode(f'{parent_id}{child_id}{idx:02}'.encode()).decode()
option.pop('class', None)
else:
child['value'] = base64.b64encode(f'{parent_id}{child_id}00'.encode()).decode()
child.pop('class', None)
return adv
def get_adv_info(value):
value = base64.b64decode(value).decode()
parent_id, child_id, option_id = map(int, (value[:2], value[2:4], value[4:6]))
parent = next((p for p in adv if p['id'] == parent_id), None)
if not parent:
return None
child = next((c for c in parent['children'] if c.get('id', 0) == child_id), None)
if not child:
return None
if 'options' in child:
return next((o for o in child['options'] if o.get('id', 0) == option_id), None)
else:
return child if option_id == 0 else None
print(get_adv_info("MDUwMzAz"))
-211
View File
@@ -1,211 +0,0 @@
[
{
"name": "swordman_male",
"title": "鬼剑士(男)",
"children": [
{ "title": "极诣·剑魂", "name": "weapon_master", "open": false },
{ "name": "soul_bender", "title": "极诣·鬼泣", "open": false },
{ "name": "berserker", "title": "极诣·狂战士", "open": false },
{ "name": "asura", "title": "极诣·阿修罗", "open": false },
{ "name": "ghostblade", "title": "极诣·剑影", "open": false }
]
},
{
"name": "swordman_female",
"title": "鬼剑士(女)",
"children": [
{ "name": "sword_master", "title": "极诣·驭剑士", "open": false },
{ "name": "dark_templar", "title": "极诣·暗殿骑士", "open": false },
{ "name": "demon_slayer", "title": "极诣·契魔者", "open": false },
{ "name": "vegabond", "title": "极诣·流浪武士", "open": false },
{ "name": "spectre", "title": "极诣·刃影", "open": false }
]
},
{
"name": "fighter_male",
"title": "格斗家(男)",
"children": [
{ "name": "nenmaster_male", "title": "归元·气功师", "open": false },
{ "name": "striker_male", "title": "归元·散打", "open": false },
{ "name": "brawler_male", "title": "归元·街霸", "open": false },
{ "name": "grappler_male", "title": "归元·柔道家", "open": false },
{ "name": "empty", "title": "", "comment": "首页" }
]
},
{
"name": "fighter_female",
"title": "格斗家(女)",
"children": [
{ "name": "nenmaster_female", "title": "归元·气功师", "open": false },
{ "name": "striker_female", "title": "归元·散打", "open": false },
{ "name": "brawler_female", "title": "归元·街霸", "open": false },
{ "name": "grappler_female", "title": "归元·柔道家", "open": false },
{ "name": "empty", "title": "", "comment": "设置" }
]
},
{
"name": "gunner_male",
"title": "神枪手(男)",
"children": [
{ "name": "ranger_male", "title": "重霄·漫游枪手", "open": false },
{ "name": "launcher_male", "title": "重霄·枪炮师", "open": false },
{ "name": "mechanic_male", "title": "重霄·机械师", "open": false },
{ "name": "spitfire_male", "title": "重霄·弹药专家", "open": false },
{ "name": "assault", "title": "重霄·合金战士", "open": false }
]
},
{
"name": "gunner_female",
"title": "神枪手(女)",
"children": [
{ "name": "ranger_female", "title": "重霄·漫游枪手", "open": false },
{ "name": "launcher_female", "title": "重霄·枪炮师", "open": false },
{ "name": "mechanic_female", "title": "重霄·机械师", "open": false },
{ "name": "spitfire_female", "title": "重霄·弹药专家", "open": true, "class": "GF.gunner_female.spitfire_female" },
{
"name": "sponsor",
"url": "https://bbs.colg.cn",
"title": "",
"open": false
}
]
},
{
"name": "mage_male",
"title": "魔法师(男)",
"children": [
{ "name": "elemental_bomber", "title": "知源·元素爆破师", "open": false },
{ "name": "glacial_master", "title": "知源·冰结师", "open": false },
{ "name": "blood_mage", "title": "知源·血法师", "open": false },
{ "name": "swift_master", "title": "知源·逐风者", "open": false },
{ "name": "dimension_walker", "title": "知源·次元行者", "open": false }
]
},
{
"name": "mage_female",
"title": "魔法师(女)",
"children": [
{ "name": "elementalist", "title": "知源·元素师", "open": false },
{ "name": "summoner", "title": "知源·召唤师", "open": false },
{ "name": "battle_mage", "title": "知源·战斗法师", "open": false },
{ "name": "witch", "title": "知源·魔道学者", "open": false },
{
"name": "enchantress",
"title": "知源·小魔女",
"open": false,
"options": [
{ "name": "default", "title": "奶", "class": "enchantress" },
{ "name": "default", "title": "输出", "class": "enchantress_carry" }
]
}
]
},
{
"name": "priest_male",
"title": "圣职者(男)",
"children": [
{
"name": "crusader_male",
"title": "神启·圣骑士",
"open": false,
"options": [
{ "name": "default", "title": "奶", "class": "crusader_male" },
{ "name": "default", "title": "审判", "class": "crusader_male_carry" }
]
},
{ "name": "infighter", "title": "神启·蓝拳圣使", "open": false },
{ "name": "exorcist", "title": "神启·驱魔师", "open": false },
{ "name": "avenger", "title": "神启·复仇者", "open": false },
{ "name": "empty", "title": "" }
]
},
{
"name": "priest_female",
"title": "圣职者(女)",
"children": [
{
"name": "crusader_female",
"title": "神启·圣骑士",
"open": false,
"options": [
{ "name": "default", "title": "奶", "class": "crusader_female" },
{
"name": "default",
"title": "输出",
"class": "crusader_female_carry"
}
]
},
{ "name": "inquistor", "title": "神启·异端审判者", "open": false },
{ "name": "sorceress", "title": "神启·巫女", "open": false },
{ "name": "mistress", "title": "神启·诱魔者", "open": false },
{ "name": "empty", "title": "" }
]
},
{
"name": "thief",
"title": "暗夜使者",
"children": [
{ "name": "rogue", "title": "隐夜·刺客", "open": false },
{ "name": "necro", "title": "隐夜·死灵术士", "open": false },
{ "name": "kunoichi", "title": "隐夜·忍者", "open": false },
{ "name": "shadow_dancer", "title": "隐夜·影舞者", "open": false },
{ "name": "empty", "title": "" }
]
},
{
"name": "knight",
"title": "守护者",
"children": [
{ "name": "elven_knight", "title": "皓曦·精灵骑士", "open": false },
{ "name": "chaos", "title": "皓曦·混沌魔灵", "open": false },
{ "name": "paladin", "title": "皓曦·帕拉丁", "open": false },
{ "name": "dragon_knight", "title": "皓曦·龙骑士", "open": false },
{ "name": "empty", "title": "" }
]
},
{
"name": "demonic_lancer",
"title": "魔枪士",
"children": [
{ "name": "vanguard", "title": "千魂·征战者", "open": false },
{ "name": "skirmisher", "title": "千魂·决战者", "open": false },
{ "name": "dragoon", "title": "千魂·狩猎者", "open": false },
{ "name": "impaler", "title": "千魂·暗枪士", "open": false },
{ "name": "empty", "title": "" }
]
},
{
"name": "gunblader",
"title": "枪剑士",
"children": [
{ "name": "hitman", "title": "苍暮·暗刃", "open": false },
{ "name": "agent", "title": "苍暮·特工", "open": false },
{ "name": "trouble_shooter", "title": "苍暮·战线佣兵", "open": false },
{ "name": "specialist", "title": "苍暮·源能专家", "open": false },
{ "name": "empty", "title": "" }
]
},
{
"name": "archer",
"title": "弓箭手",
"children": [
{ "name": "muse", "title": "聆风·缪斯", "open": false },
{ "name": "traveler", "title": "聆风·旅人", "open": false },
{ "name": "hunter", "title": "聆风·猎人", "open": false },
{ "name": "vigilante", "title": "聆风·妖护使", "open": false },
{ "name": "empty", "title": "" }
]
},
{
"name": "extra",
"title": "外传",
"children": [
{ "name": "creator", "title": "知源·缔造者", "open": false },
{ "name": "dark_knight", "title": "极诣·黑暗武士", "open": false },
{ "name": "empty", "title": "" },
{ "name": "empty", "title": "" },
{ "name": "empty", "title": "" }
]
}
]
+2 -1
View File
@@ -1,9 +1,10 @@
import type { IConfig } from '@/stores'
import { defineRequest } from '../common'
import type { IResult } from './type'
export default defineRequest((request) => {
return {
async calc(config: IConfig) {
const res = await request.post('/calc', config)
const res = await request.post<IResult>('/calc', config)
return res.data
}
}
+13
View File
@@ -0,0 +1,13 @@
export interface IResult {
skills: IResultSkill[]
}
export interface IResultSkill {
name: string
icon: string
lv: number
data: number
ratio: number
cd: number
damage: number
}
+14 -13
View File
@@ -3,6 +3,7 @@ import axios from 'axios'
import { h } from 'vue'
import { gzip, ungzip } from 'pako'
import { useInfoStore } from '@/stores'
import { useDialog } from '@/components/hooks/dialog'
// import { useAppStore, useConfigStore } from '@/store'
// import { useDialog } from '@/components/hooks/dialog'
@@ -80,19 +81,19 @@ export function defineRequest<T>(fn: (ax: AxiosInstance) => T) {
instance.interceptors.response.use(
async (response: AxiosResponse<HttpResponse>) => {
if (response.data.code === 500) {
// const { alert } = useDialog()
// await alert({
// content: () => {
// return h(
// 'div',
// {
// class: 'justify-center text-hex-d4d6b6 text-center',
// style: 'white-space:pre-wrap;width:250px;margin:10px',
// },
// `出现错误,可加群反馈:183439472\n${response.data.message}`,
// )
// },
// })
const { alert } = useDialog()
await alert({
content: () => {
return h(
'div',
{
class: 'justify-center text-hex-d4d6b6 text-center',
style: 'white-space:pre-wrap;width:250px;margin:10px',
},
`出现错误,可加群反馈:183439472\n${response.data.message}`,
)
},
})
}
// 解密数据
if (typeof response.data.data == 'string') {
+2 -2
View File
@@ -6,7 +6,7 @@ export interface IAdventureInfo {
export interface IAlterOption {
name: string
title: string
class?: string
value?: string
}
export interface IAlterInfo {
@@ -17,7 +17,7 @@ export interface IAlterInfo {
options?: IAlterOption[]
open?: boolean
comment?: string
class?: string
value?: string
}
export interface ICharacterInfo {
+24 -26
View File
@@ -1,39 +1,37 @@
<template>
<div>
<calc-collapse class="w-40%" title="装备打造(点击人物部位切换)">
<equipment />
</calc-collapse>
</div>
<div class="w-300px">
<calc-collapse class="w-100%" title="装备打造(点击人物部位切换)">
<equipment />
</calc-collapse>
</div>
</template>
<script setup lang="ts">
import equipment from './components/equipment.vue'
</script>
<style lang="scss">
.equ-profile{
.equ-profile {
width: 100%;
.equ-profile-item {
width: 100%;
height: 20px;
display: flex;
margin-top: 5px;
margin-bottom: 5px;
align-items: center;
width: 100%;
height: 20px;
display: flex;
margin-top: 5px;
margin-bottom: 5px;
align-items: center;
.row-name {
flex: 0 0 50px;
text-align: center;
}
:not(:last-child) {
margin-right: 10px !important;
}
.i-select-label {
margin-right: 0px !important;
}
.row-name {
flex: 0 0 50px;
text-align: center;
}
}
:not(:last-child) {
margin-right: 10px !important;
}
.i-select-label {
margin-right: 0px !important;
}
}
}
</style>
+9 -10
View File
@@ -8,7 +8,13 @@
</calc-tabs>
</div>
<div class="content flex">
<RouterView></RouterView>
<div class="flex flex-1">
<RouterView></RouterView>
</div>
<div class="w-40%">
<Result></Result>
</div>
</div>
</div>
</template>
@@ -16,26 +22,19 @@
<script lang="ts" setup name="Index">
import { useInfoStore } from '@/stores/info'
import { useConfigStore } from '@/stores'
import Result from './Result/Index.vue'
const props = defineProps<{
alter: string
}>()
const infoStore = useInfoStore()
const configStore = useConfigStore()
const result = useAsyncState(
() => {
return configStore.calc()
},
{},
{ resetOnExecute: false },
)
const stopWatch = watch<any>(
() => {
return JSON.stringify(configStore.config)
},
useDebounceFn(async () => {
await result.execute()
;(await configStore.result).execute()
}, 800),
)
@@ -0,0 +1,18 @@
<template>
<div class="flex" v-if="configStore.result.state">
<Info></Info>
<Skill :data="configStore.result.state.skills"></Skill>
</div>
</template>
<script setup lang="ts">
import { useConfigStore } from '@/stores';
import Info from './components/Info.vue';
import Skill from './components/Skill.vue';
const configStore = useConfigStore();
</script>
<style scoped lang="scss">
</style>
@@ -0,0 +1,8 @@
<template></template>
<script setup lang="ts" name="Info">
</script>
<style scoped lang="scss">
</style>
@@ -0,0 +1,26 @@
<template>
<div class="flex flex-col" v-if="data && data.length > 0">
<div class="flex gap-2 text-white items-center" v-for="skill in data" :key="skill.name">
<div>
<img :src="getImageURL(skill.icon)" alt="" class="w-8 h-8" />
</div>
<div>{{ skill.name }}</div>
<div>{{ skill.lv }}</div>
<div>{{ skill.damage.toFixed(0) }}</div>
</div>
</div>
</template>
<script setup lang="ts" name="Skill">
import type { IResultSkill } from '@/api/calc/type'
import { getImageURL } from '@/utils/images'
const props = defineProps<{
data: IResultSkill[]
}>()
const data = computed(() => {
return props.data.sort((a,b)=>b.damage - a.damage)
})
</script>
<style scoped lang="scss"></style>
+1 -1
View File
@@ -36,7 +36,7 @@ export default defineComponent(async () => {
return
}
else{
return window.open("/character/" + (child.class || child.name),"_blank")
return window.open("/character/" + (child.value || child.name),"_blank")
}
}
}
+6 -1
View File
@@ -3,7 +3,12 @@
<Suspense>
<RouterView></RouterView>
</Suspense>
<render/>
</div>
</template>
<script lang="ts" name="index" setup></script>
<script lang="ts" name="index" setup>
import { useDialog } from '@/components/hooks/dialog';
const { render } = useDialog()
</script>
+13
View File
@@ -102,10 +102,23 @@ export const useConfigStore = defineStore('configStore', () => {
return await api.calc(config.value)
}
const result = useAsyncState(
() => {
return calc()
},
{
skills:[]
},
{ resetOnExecute: false },
)
return {
config,
loadConfig,
saveConfig,
calc,
result
}
})