diff --git a/backend/api/routes/info.py b/backend/api/routes/info.py index 2a23f3e5..9a7d83f5 100644 --- a/backend/api/routes/info.py +++ b/backend/api/routes/info.py @@ -2,11 +2,11 @@ import re from api.core.Auth import createToken from api.core.Gzip import register_gzip_request import json -from fastapi import APIRouter,Request, Depends, Body +from fastapi import APIRouter, Request, Depends, Body from typing import Annotated from api.core.Response import Return, response 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.open.helper import get_user_info_by_id @@ -17,6 +17,7 @@ router = APIRouter() register_gzip_request(router) + def replace_placeholders(template): # 匹配 、、、 等 pattern = re.compile(r'<(int|float\d*)>') @@ -30,44 +31,43 @@ def replace_placeholders(template): return pattern.sub(repl, template) - @router.get('/adventure') -async def get_adventure_info(request: Request,redis:RedisDep): +async def get_adventure_info(request: Request, redis: RedisDep): adventure_info = get_redis_info(redis, 'dcalc:adventure', get_adv_list) return response(data=adventure_info) -@router.get("/token/get/{alter}") -async def getToken(redis:RedisDep, - alter: str, request: Request, version: str = None, equVersion: str = "0" -): + +@router.get('/token/get/{alter}') +async def getToken(redis: RedisDep, alter: str, request: Request, version: str = None, equVersion: str = '0'): token = createToken(alter, equVersion, redis) return response(data=token) -@router.get("/character") -async def get_character_info( - request: Request, state: AltersDep ,redis:RedisDep -): + +@router.get('/character') +async def get_character_info(request: Request, state: AltersDep, redis: RedisDep): character = createCharacter(state.alter, state.equVersion) + def get_character(): return character.getInfo() - info = get_redis_info(redis, f"dcalc:character:{state.alter}:{state.equVersion}", get_character) + + info = get_redis_info(redis, f'dcalc:character:{state.alter}:{state.equVersion}', get_character) # info = character.getInfo() return response(data=info) -@router.get("/skill/{skillId}/{level}") -async def get_skill_info( - state: AltersDep, skillId: str, level: int, redis: RedisDep -): + +@router.get('/skill/{skillId}/{level}') +async def get_skill_info(state: AltersDep, skillId: str, level: int, redis: RedisDep): """ 获取技能信息 """ alter = state.alter - jobId = alter.split(".")[1] - jobGrowId = alter.split(".")[2] + jobId = alter.split('.')[1] + jobGrowId = alter.split('.')[2] skill_info = {} key = f'openapi:{jobId}:{jobGrowId}:{skillId}' try: + def get_skill_info(): # This function should retrieve the skill info based on job and jobGrow # For now, we return a placeholder dictionary @@ -97,25 +97,27 @@ async def get_skill_info( return response(data=skill_info) -@router.get("/dnfhelper/{uid}/") +@router.get('/dnfhelper/{uid}/') async def get_info_by_dnfhelper(uid: str, state: AltersDep, redis: RedisDep): try: - result = await get_user_info_by_id(uid,state) + result = await get_user_info_by_id(uid, state) return response(data=result) except Exception as e: if isinstance(e, ResponseException): return response(code=500, message=str(e), data=None) - return response(code=500, message="Failed to fetch DNFHelper info", data=None) + print(e) + return response(code=500, message='Failed to fetch DNFHelper info', data=None) -@router.post("/skillTree/") -async def get_skill_by_code(state: AltersDep, code = Body(None)): + +@router.post('/skillTree/') +async def get_skill_by_code(state: AltersDep, code=Body(None)): try: - skills = get_skill_tree_info(code.get("code", "")) - if skills.get("job",{}).get("class","") != state.alter: - return response(code=500, message="技能加点代码职业与登录职业不匹配", data=None) + skills = get_skill_tree_info(code.get('code', '')) + if skills.get('job', {}).get('class', '') != state.alter: + return response(code=500, message='技能加点代码职业与登录职业不匹配', data=None) return response(data=skills) except Exception as e: - print(f"Error fetching skill tree info: {e}") + print(f'Error fetching skill tree info: {e}') if isinstance(e, ResponseException): return response(code=500, message=str(e), data=None) - return response(code=500, message="解析技能加点失败", data=None) \ No newline at end of file + return response(code=500, message='解析技能加点失败', data=None) diff --git a/backend/core/basic/character/calc_equip.py b/backend/core/basic/character/calc_equip.py index 6b97a919..3b097376 100644 --- a/backend/core/basic/character/calc_equip.py +++ b/backend/core/basic/character/calc_equip.py @@ -101,7 +101,7 @@ class CalcEquipMixin(CharacterBase): max_point_oath_suit = max((suit for suit in oathSuitInfo if oathSuitInfo[suit]['point'] > 0), key=lambda suit: oathSuitInfo[suit]['point'], default=None) zero_point_suits = [suit for suit in suitInfo if suitInfo[suit]['point'] == 0] # 套装没有到太初的时候,优先把誓约套装的点数加到装备套装上,以达到更高的套装等级 - if 0 < suitInfo[max_point_suit]['point'] < 2550 and oathSuitInfo.get('max_point_oath_suit', None) is not None: + if suitInfo is not None and 0 < suitInfo[max_point_suit]['point'] < 2550 and oathSuitInfo.get('max_point_oath_suit', None) is not None: suitInfo[max_point_suit]['point'] += min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) oathSuitInfo[max_point_oath_suit]['point'] -= min(2550 - suitInfo[max_point_suit]['point'], oathSuitInfo[max_point_oath_suit]['point']) pass diff --git a/backend/core/open/helper.py b/backend/core/open/helper.py index 01359612..a8c62fee 100644 --- a/backend/core/open/helper.py +++ b/backend/core/open/helper.py @@ -79,12 +79,12 @@ job_mapping = { async def get_user_info_by_id(user_id: str, alter: AltersDep): if alter is None: - raise ResponseException("登录过期或无效Token,请刷新后重试") + raise ResponseException('登录过期或无效Token,请刷新后重试') name = next((k for k, v in job_mapping.items() if v == alter.origin), '') # 通过OCR助手获取用户信息 helper_info = await get_main_user_info_by_id(user_id, name) if helper_info is None: - raise ResponseException("当前助手ID不存在或已隐藏,请确认后重试") + raise ResponseException('当前助手ID不存在或已隐藏,请确认后重试') else: return trans_to_dcalc_set(helper_info, alter) pass @@ -93,7 +93,7 @@ async def get_user_info_by_id(user_id: str, alter: AltersDep): def trans_to_dcalc_set(detail, alter: AltersDep): job = job_mapping.get(detail.get('job', ''), '') if job != alter.origin: - raise ResponseException("未能匹配到当前职业对应的角色信息,请确认后重试") + raise ResponseException('未能匹配到当前职业对应的角色信息,请确认后重试') basic = get_equipment('0') basicAvatars = basic.funs.get_dress_list([]) equs = detail.get('equs', []) @@ -126,9 +126,9 @@ def trans_to_dcalc_set(detail, alter: AltersDep): # 贴膜 if dcalcEqu: info['id'] = dcalcEqu.id - dcalcEquFusion = next((item for item in basic.stones if item.name == equ.get('upgrade', '')), None) - if dcalcEquFusion: - info['fusion'] = dcalcEquFusion.id + # dcalcEquFusion = next((item for item in basic.stones if item.name == equ.get('upgrade', '')), None) + # if dcalcEquFusion: + # info['fusion'] = dcalcEquFusion.id info['enchant'] = getEnchatIdByName(equ.get('enchant', ''), equ.get('posName', ''), basic.enchants) emblems = [getEmblemIdByName(i.get('detail', ''), i.get('categorize', ''), i.get('rarity', ''), basic.emblems) for i in equ.get('emblems', [])] info['emblem_0'] = emblems[0] if len(emblems) > 0 else 0 @@ -167,7 +167,7 @@ def trans_to_dcalc_set(detail, alter: AltersDep): if item.get('posName', '') == '皮肤': match = re.search(r'\[(\d+)级\]', item.get('name', '')) lv = int(match.group(1)) if match else None - if lv : + if lv: item['enchant'] = f'Lv{lv}主动+1|全属强(12)|四维(55)' if item.get('posName', '') == '光环': # 先默认这个了 不管了 @@ -182,11 +182,14 @@ def trans_to_dcalc_set(detail, alter: AltersDep): 'equips': equips, 'avatars': avatar, 'avatarLink': detail.get('avatarLink', ''), - 'dressInfo': [{ - 'dress': i.get('name', ''), - 'clone': i.get('clone', ''), - 'part': i.get('posName', ''), - } for i in detail.get('avatars', [])] + 'dressInfo': [ + { + 'dress': i.get('name', ''), + 'clone': i.get('clone', ''), + 'part': i.get('posName', ''), + } + for i in detail.get('avatars', []) + ], } # 处理装备 # 处理时装 diff --git a/backend/dataFiles/dcalc_0.db b/backend/dataFiles/dcalc_0.db index 3bf8aaa8..5e7cf403 100644 Binary files a/backend/dataFiles/dcalc_0.db and b/backend/dataFiles/dcalc_0.db differ diff --git a/backend/openapi b/backend/openapi index 03f3bbf0..680ed85d 160000 --- a/backend/openapi +++ b/backend/openapi @@ -1 +1 @@ -Subproject commit 03f3bbf037b53d7c0dfbee7be52a1989464c5103 +Subproject commit 680ed85d6e8646ad98afe7208a7381dc366bc4f8 diff --git a/frontend/src/api/calc/type.ts b/frontend/src/api/calc/type.ts index 7bdd486a..5b13f368 100644 --- a/frontend/src/api/calc/type.ts +++ b/frontend/src/api/calc/type.ts @@ -21,6 +21,7 @@ export interface IResultSkill { } export interface IResultUserInfo { + id: number name: string value: string | number } diff --git a/frontend/src/api/info/type.ts b/frontend/src/api/info/type.ts index 8b23f4d0..aae83455 100644 --- a/frontend/src/api/info/type.ts +++ b/frontend/src/api/info/type.ts @@ -72,13 +72,13 @@ export interface IEquipment { Buffer: number[] detail: string bufferDetail: string -} - -export interface IOathInfo extends IEquipment { position: string[] wearUrl: string[] + oathPos: string + displayUrl?: string } + export interface ISkill { icon: string name: string diff --git a/frontend/src/components/calc/autocomplete/index.vue b/frontend/src/components/calc/autocomplete/index.vue index a8a85915..f3d3bd3b 100644 --- a/frontend/src/components/calc/autocomplete/index.vue +++ b/frontend/src/components/calc/autocomplete/index.vue @@ -11,6 +11,7 @@ import { renderList, watch, } from 'vue' +import { getElementZoom } from '@/utils/position' type HandleChangeFunction = (value: string | number) => string[] | Promise @@ -55,10 +56,12 @@ export default defineComponent({ function onResize() { if (triggerRef.value) { const { width, height, left, top } = triggerRef.value.getBoundingClientRect() + const zoom = getElementZoom('body') + dropdownPosition.value = { - w: width, - x: left, - y: top + height + 2, + w: width / zoom, + x: left / zoom, + y: (top + height + 2) / zoom, } } } diff --git a/frontend/src/components/calc/cascader/index.vue b/frontend/src/components/calc/cascader/index.vue index 492ddd63..f5f59345 100644 --- a/frontend/src/components/calc/cascader/index.vue +++ b/frontend/src/components/calc/cascader/index.vue @@ -4,6 +4,7 @@ import type { CSSProperties, PropType } from 'vue' import { Teleport, Transition, computed, defineComponent, onDeactivated, ref, watch } from 'vue' import { onClickOutside, useVModel } from '@vueuse/core' +import { getElementZoom } from '@/utils/position' interface ICascaderItem { label: string id?: string | number @@ -74,18 +75,19 @@ export default defineComponent({ function onResize() { if (triggerRef.value) { const { width, height, left, top } = triggerRef.value.getBoundingClientRect() + const zoom = getElementZoom('body') if (window.innerHeight - top > 160) { dropdownPosition.value = { - w: width, - x: left, - y: top + height + 2, + w: width / zoom, + x: left / zoom, + y: (top + height + 2) / zoom, z: 0, } } else { dropdownPosition.value = { - w: width, - x: left, - z: window.innerHeight - top + 2, + w: width / zoom, + x: left / zoom, + z: (window.innerHeight - top + 2) / zoom, y: 0, } } diff --git a/frontend/src/components/calc/iconselect/index.vue b/frontend/src/components/calc/iconselect/index.vue index 7452f786..1c6c66d2 100644 --- a/frontend/src/components/calc/iconselect/index.vue +++ b/frontend/src/components/calc/iconselect/index.vue @@ -13,6 +13,7 @@ import { } from 'vue' import { onClickOutside } from '@vueuse/core' +import { getElementZoom } from '@/utils/position' export default defineComponent({ name: 'IIconselect', @@ -72,20 +73,24 @@ export default defineComponent({ const dropdownPosition = ref({ x: 0, y: 0, w: 0 }) // 下拉框位置 const dropdownStyle = computed(() => { + const zoom = getElementZoom(appendToRef.value) + return { left: `${dropdownPosition.value.x}px`, top: `${dropdownPosition.value.y}px`, - width: `${columnNum.value * 32 + 11}px`, + width: `${(columnNum.value * 32 + 11) / zoom}px`, } }) function onResize() { if (triggerRef.value) { const { width, height, left, top } = triggerRef.value.getBoundingClientRect() + const zoom = getElementZoom(appendToRef.value) + dropdownPosition.value = { - w: width, - x: left - 2, - y: (top + height + 2), + w: width / zoom, + x: (left - 2) / zoom, + y: (top + height + 2) / zoom, } } } diff --git a/frontend/src/components/calc/select/index.vue b/frontend/src/components/calc/select/index.vue index 777f31f7..89aef50e 100644 --- a/frontend/src/components/calc/select/index.vue +++ b/frontend/src/components/calc/select/index.vue @@ -15,6 +15,7 @@ import { import { onClickOutside, useVModel } from '@vueuse/core' import { classPropType, labelPropType } from '@/components/hooks/types' +import { getElementZoom } from '@/utils/position' export default defineComponent({ name: 'ISelect', @@ -98,18 +99,19 @@ export default defineComponent({ function onResize() { if (triggerRef.value) { const { width, height, left, top } = triggerRef.value.getBoundingClientRect() + const zoom = getElementZoom(appendToRef.value) if (window.innerHeight - top > 160) { dropdownPosition.value = { - w: width, - x: left, - y: (top + height + 2), + w: width / zoom, + x: left / zoom, + y: (top + height + 2) / zoom, z: 0, } } else { dropdownPosition.value = { - w: width, - x: left, - z: (window.innerHeight - top + 2), + w: width / zoom, + x: left / zoom, + z: (window.innerHeight - top + 2) / zoom, y: 0, } } diff --git a/frontend/src/components/dnf/Equipment/Icon/index.vue b/frontend/src/components/dnf/Equipment/Icon/index.vue index ec52e5cf..ec22fd50 100644 --- a/frontend/src/components/dnf/Equipment/Icon/index.vue +++ b/frontend/src/components/dnf/Equipment/Icon/index.vue @@ -3,7 +3,9 @@
@@ -21,6 +23,7 @@ import { getImageURL } from '@/utils/images' const props = defineProps<{ equipment?: IEquipment inactive?: boolean + useDisplayUrl?: boolean }>() const rarity = computed(() => { diff --git a/frontend/src/components/dnf/Equipment/Info/index.vue b/frontend/src/components/dnf/Equipment/Info/index.vue index ee635072..c5e056a5 100644 --- a/frontend/src/components/dnf/Equipment/Info/index.vue +++ b/frontend/src/components/dnf/Equipment/Info/index.vue @@ -38,16 +38,12 @@
-
+