dev
This commit is contained in:
@@ -3,16 +3,21 @@ import hmac
|
|||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
from core.character.adventure import get_adv_info
|
||||||
from core.basic.character import Character
|
from core.basic.character import Character
|
||||||
from fastapi import Header, Request
|
from fastapi import Header, Request
|
||||||
from api.core.exception import ResponseException
|
from api.core.exception import ResponseException
|
||||||
|
|
||||||
|
|
||||||
class AlterState:
|
class AlterState:
|
||||||
def __init__(self, alter: str, token: str, charcater: Character, equVersion: str,time: int):
|
def __init__(self, value: str, token: str, charcater: Character, equVersion: str,time: int):
|
||||||
self.alter = alter
|
self.value = value
|
||||||
|
try:
|
||||||
|
self.alter = get_adv_info(value)["class"]
|
||||||
|
except Exception:
|
||||||
|
raise ResponseException('无效的职业')
|
||||||
self.token = token
|
self.token = token
|
||||||
self.origin = alter.split('.')[-1]
|
self.origin = self.alter.split('.')[-1]
|
||||||
self.character = charcater
|
self.character = charcater
|
||||||
self.equVersion = equVersion
|
self.equVersion = equVersion
|
||||||
self.time = time
|
self.time = time
|
||||||
@@ -35,15 +40,15 @@ def dict2obj(dictObj):
|
|||||||
return d
|
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_str = str(time.time() + expire)
|
||||||
ts_byte = ts_str.encode('utf-8')
|
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 = sha1_tshex_str
|
||||||
token = base64.urlsafe_b64encode(token.encode('utf-8')).decode('utf-8')
|
token = base64.urlsafe_b64encode(token.encode('utf-8')).decode('utf-8')
|
||||||
# character = createCharacter(alter)
|
# character = createCharacter(alter)
|
||||||
character = {}
|
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
|
return token
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ def alterToken(alter_token: Optional[str] = Header(None)):
|
|||||||
decoded_bytes = base64.b64decode(alter_token)
|
decoded_bytes = base64.b64decode(alter_token)
|
||||||
decoded_str = decoded_bytes.decode('utf-8')
|
decoded_str = decoded_bytes.decode('utf-8')
|
||||||
alter = json.loads(decoded_str)
|
alter = json.loads(decoded_str)
|
||||||
# 时间判断 后面再加
|
# 6小时过期
|
||||||
if (int(time.time() * 1000) - alter['time']) / (60 * 60 * 1000) > 6:
|
if (int(time.time() * 1000) - alter['time']) / (60 * 60 * 1000) > 6:
|
||||||
raise ResponseException('登录过期或无效Token,请刷新后重试')
|
raise ResponseException('登录过期或无效Token,请刷新后重试')
|
||||||
return AlterState(alter['alter'], alter_token, {}, alter['equVersion'], alter['time'])
|
return AlterState(alter['alter'], alter_token, {}, alter['equVersion'], alter['time'])
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from fastapi import APIRouter,Request
|
|||||||
from api.core.Response import Return, response
|
from api.core.Response import Return, response
|
||||||
from api.core.Redis import get_redis_info
|
from api.core.Redis import get_redis_info
|
||||||
from api.dp import RedisDep,AltersDep
|
from api.dp import RedisDep,AltersDep
|
||||||
|
from core.character.adventure import get_adv_list
|
||||||
from core.basic.character import createCharacter
|
from core.basic.character import createCharacter
|
||||||
|
|
||||||
router = APIRouter()
|
router = APIRouter()
|
||||||
@@ -14,10 +15,7 @@ register_gzip_request(router)
|
|||||||
|
|
||||||
@router.get('/adventure')
|
@router.get('/adventure')
|
||||||
async def get_adventure_info(request: Request,redis:RedisDep):
|
async def get_adventure_info(request: Request,redis:RedisDep):
|
||||||
def get_adventure():
|
adventure_info = get_redis_info(redis, 'dcalc:adventure', get_adv_list)
|
||||||
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)
|
|
||||||
|
|
||||||
return response(data=adventure_info)
|
return response(data=adventure_info)
|
||||||
|
|
||||||
|
|||||||
@@ -201,6 +201,7 @@ class Character:
|
|||||||
self.ElementIncrease = 1.0
|
self.ElementIncrease = 1.0
|
||||||
self.equs = {}
|
self.equs = {}
|
||||||
self.JadeInfo = Jade()
|
self.JadeInfo = Jade()
|
||||||
|
self.equ_effect = []
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# region 角色属性设置
|
# region 角色属性设置
|
||||||
|
|||||||
@@ -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"))
|
||||||
@@ -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": "" }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import type { IConfig } from '@/stores'
|
import type { IConfig } from '@/stores'
|
||||||
import { defineRequest } from '../common'
|
import { defineRequest } from '../common'
|
||||||
|
import type { IResult } from './type'
|
||||||
export default defineRequest((request) => {
|
export default defineRequest((request) => {
|
||||||
return {
|
return {
|
||||||
async calc(config: IConfig) {
|
async calc(config: IConfig) {
|
||||||
const res = await request.post('/calc', config)
|
const res = await request.post<IResult>('/calc', config)
|
||||||
return res.data
|
return res.data
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -3,6 +3,7 @@ import axios from 'axios'
|
|||||||
import { h } from 'vue'
|
import { h } from 'vue'
|
||||||
import { gzip, ungzip } from 'pako'
|
import { gzip, ungzip } from 'pako'
|
||||||
import { useInfoStore } from '@/stores'
|
import { useInfoStore } from '@/stores'
|
||||||
|
import { useDialog } from '@/components/hooks/dialog'
|
||||||
// import { useAppStore, useConfigStore } from '@/store'
|
// import { useAppStore, useConfigStore } from '@/store'
|
||||||
// import { useDialog } from '@/components/hooks/dialog'
|
// import { useDialog } from '@/components/hooks/dialog'
|
||||||
|
|
||||||
@@ -80,19 +81,19 @@ export function defineRequest<T>(fn: (ax: AxiosInstance) => T) {
|
|||||||
instance.interceptors.response.use(
|
instance.interceptors.response.use(
|
||||||
async (response: AxiosResponse<HttpResponse>) => {
|
async (response: AxiosResponse<HttpResponse>) => {
|
||||||
if (response.data.code === 500) {
|
if (response.data.code === 500) {
|
||||||
// const { alert } = useDialog()
|
const { alert } = useDialog()
|
||||||
// await alert({
|
await alert({
|
||||||
// content: () => {
|
content: () => {
|
||||||
// return h(
|
return h(
|
||||||
// 'div',
|
'div',
|
||||||
// {
|
{
|
||||||
// class: 'justify-center text-hex-d4d6b6 text-center',
|
class: 'justify-center text-hex-d4d6b6 text-center',
|
||||||
// style: 'white-space:pre-wrap;width:250px;margin:10px',
|
style: 'white-space:pre-wrap;width:250px;margin:10px',
|
||||||
// },
|
},
|
||||||
// `出现错误,可加群反馈:183439472\n${response.data.message}`,
|
`出现错误,可加群反馈:183439472\n${response.data.message}`,
|
||||||
// )
|
)
|
||||||
// },
|
},
|
||||||
// })
|
})
|
||||||
}
|
}
|
||||||
// 解密数据
|
// 解密数据
|
||||||
if (typeof response.data.data == 'string') {
|
if (typeof response.data.data == 'string') {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export interface IAdventureInfo {
|
|||||||
export interface IAlterOption {
|
export interface IAlterOption {
|
||||||
name: string
|
name: string
|
||||||
title: string
|
title: string
|
||||||
class?: string
|
value?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IAlterInfo {
|
export interface IAlterInfo {
|
||||||
@@ -17,7 +17,7 @@ export interface IAlterInfo {
|
|||||||
options?: IAlterOption[]
|
options?: IAlterOption[]
|
||||||
open?: boolean
|
open?: boolean
|
||||||
comment?: string
|
comment?: string
|
||||||
class?: string
|
value?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ICharacterInfo {
|
export interface ICharacterInfo {
|
||||||
|
|||||||
@@ -1,39 +1,37 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="w-300px">
|
||||||
<calc-collapse class="w-40%" title="装备打造(点击人物部位切换)">
|
<calc-collapse class="w-100%" title="装备打造(点击人物部位切换)">
|
||||||
<equipment />
|
<equipment />
|
||||||
</calc-collapse>
|
</calc-collapse>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import equipment from './components/equipment.vue'
|
import equipment from './components/equipment.vue'
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.equ-profile{
|
.equ-profile {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
.equ-profile-item {
|
.equ-profile-item {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
.row-name {
|
.row-name {
|
||||||
flex: 0 0 50px;
|
flex: 0 0 50px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
|
||||||
|
|
||||||
:not(:last-child) {
|
|
||||||
margin-right: 10px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.i-select-label {
|
|
||||||
margin-right: 0px !important;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
:not(:last-child) {
|
||||||
|
margin-right: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.i-select-label {
|
||||||
|
margin-right: 0px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -8,7 +8,13 @@
|
|||||||
</calc-tabs>
|
</calc-tabs>
|
||||||
</div>
|
</div>
|
||||||
<div class="content flex">
|
<div class="content flex">
|
||||||
<RouterView></RouterView>
|
<div class="flex flex-1">
|
||||||
|
<RouterView></RouterView>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="w-40%">
|
||||||
|
<Result></Result>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -16,26 +22,19 @@
|
|||||||
<script lang="ts" setup name="Index">
|
<script lang="ts" setup name="Index">
|
||||||
import { useInfoStore } from '@/stores/info'
|
import { useInfoStore } from '@/stores/info'
|
||||||
import { useConfigStore } from '@/stores'
|
import { useConfigStore } from '@/stores'
|
||||||
|
import Result from './Result/Index.vue'
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
alter: string
|
alter: string
|
||||||
}>()
|
}>()
|
||||||
const infoStore = useInfoStore()
|
const infoStore = useInfoStore()
|
||||||
const configStore = useConfigStore()
|
const configStore = useConfigStore()
|
||||||
|
|
||||||
const result = useAsyncState(
|
|
||||||
() => {
|
|
||||||
return configStore.calc()
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
{ resetOnExecute: false },
|
|
||||||
)
|
|
||||||
|
|
||||||
const stopWatch = watch<any>(
|
const stopWatch = watch<any>(
|
||||||
() => {
|
() => {
|
||||||
return JSON.stringify(configStore.config)
|
return JSON.stringify(configStore.config)
|
||||||
},
|
},
|
||||||
useDebounceFn(async () => {
|
useDebounceFn(async () => {
|
||||||
await result.execute()
|
;(await configStore.result).execute()
|
||||||
}, 800),
|
}, 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>
|
||||||
@@ -36,7 +36,7 @@ export default defineComponent(async () => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
return window.open("/character/" + (child.class || child.name),"_blank")
|
return window.open("/character/" + (child.value || child.name),"_blank")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,12 @@
|
|||||||
<Suspense>
|
<Suspense>
|
||||||
<RouterView></RouterView>
|
<RouterView></RouterView>
|
||||||
</Suspense>
|
</Suspense>
|
||||||
|
<render/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" name="index" setup></script>
|
<script lang="ts" name="index" setup>
|
||||||
|
import { useDialog } from '@/components/hooks/dialog';
|
||||||
|
|
||||||
|
const { render } = useDialog()
|
||||||
|
</script>
|
||||||
|
|||||||
@@ -102,10 +102,23 @@ export const useConfigStore = defineStore('configStore', () => {
|
|||||||
return await api.calc(config.value)
|
return await api.calc(config.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const result = useAsyncState(
|
||||||
|
() => {
|
||||||
|
return calc()
|
||||||
|
},
|
||||||
|
{
|
||||||
|
skills:[]
|
||||||
|
},
|
||||||
|
{ resetOnExecute: false },
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
config,
|
config,
|
||||||
loadConfig,
|
loadConfig,
|
||||||
saveConfig,
|
saveConfig,
|
||||||
calc,
|
calc,
|
||||||
|
result
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user