@@ -10,7 +10,7 @@ from api.dp import RedisDep, AltersDep
|
|||||||
from core.basic.equipment import get_equipment
|
from core.basic.equipment import get_equipment
|
||||||
from core.character.adventure import get_adv_list
|
from core.character.adventure import get_adv_list
|
||||||
from core.basic.character import createCharacter
|
from core.basic.character import createCharacter
|
||||||
from core.open.helper import get_user_info_by_id
|
from core.open.helper import get_user_info_by_id, get_user_list_by_id
|
||||||
from core.open.skillTree import get_skill_tree_info
|
from core.open.skillTree import get_skill_tree_info
|
||||||
from api.core.exception import ResponseException
|
from api.core.exception import ResponseException
|
||||||
|
|
||||||
@@ -115,6 +115,13 @@ async def get_skill_info(state: AltersDep, skillId: str, level: int, redis: Redi
|
|||||||
return response(data=skill_info)
|
return response(data=skill_info)
|
||||||
|
|
||||||
|
|
||||||
|
@router.get('/dnfhelper/{uid}/list')
|
||||||
|
async def get_dnfhelper_list(uid: str, redis: RedisDep):
|
||||||
|
result = await get_user_list_by_id(uid)
|
||||||
|
return response(data=result)
|
||||||
|
# return response(code=500, message='Failed to fetch DNFHelper list', data=None)
|
||||||
|
|
||||||
|
|
||||||
@router.get('/dnfhelper/{uid}/')
|
@router.get('/dnfhelper/{uid}/')
|
||||||
async def get_info_by_dnfhelper(uid: str, state: AltersDep, redis: RedisDep):
|
async def get_info_by_dnfhelper(uid: str, state: AltersDep, redis: RedisDep):
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from openapi.dnfhelper.public import get_main_user_info_by_id
|
from openapi.dnfhelper.public import get_main_user_info_by_id, get_user_list
|
||||||
from core.basic.equipment import get_equipment
|
from core.basic.equipment import get_equipment
|
||||||
from api.dp import AltersDep
|
from api.dp import AltersDep
|
||||||
from api.core.exception import ResponseException
|
from api.core.exception import ResponseException
|
||||||
@@ -77,6 +77,15 @@ job_mapping = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def get_user_list_by_id(user_id: str):
|
||||||
|
# 通过OCR助手获取用户列表
|
||||||
|
helper_list = await get_user_list(user_id)
|
||||||
|
if helper_list is None:
|
||||||
|
raise ResponseException('当前用户ID不存在或无公开角色,请确认后重试')
|
||||||
|
else:
|
||||||
|
return helper_list
|
||||||
|
|
||||||
|
|
||||||
async def get_user_info_by_id(user_id: str, alter: AltersDep):
|
async def get_user_info_by_id(user_id: str, alter: AltersDep):
|
||||||
if alter is None:
|
if alter is None:
|
||||||
raise ResponseException('登录过期或无效Token,请刷新后重试')
|
raise ResponseException('登录过期或无效Token,请刷新后重试')
|
||||||
|
|||||||
+1
-1
Submodule backend/openapi updated: 4a72406baa...2ec8a1040d
@@ -0,0 +1,312 @@
|
|||||||
|
{
|
||||||
|
"globals": {
|
||||||
|
"Component": true,
|
||||||
|
"ComponentPublicInstance": true,
|
||||||
|
"ComputedRef": true,
|
||||||
|
"DirectiveBinding": true,
|
||||||
|
"EffectScope": true,
|
||||||
|
"ExtractDefaultPropTypes": true,
|
||||||
|
"ExtractPropTypes": true,
|
||||||
|
"ExtractPublicPropTypes": true,
|
||||||
|
"InjectionKey": true,
|
||||||
|
"MaybeRef": true,
|
||||||
|
"MaybeRefOrGetter": true,
|
||||||
|
"PropType": true,
|
||||||
|
"Ref": true,
|
||||||
|
"ShallowRef": true,
|
||||||
|
"Slot": true,
|
||||||
|
"Slots": true,
|
||||||
|
"VNode": true,
|
||||||
|
"WritableComputedRef": true,
|
||||||
|
"asyncComputed": true,
|
||||||
|
"autoResetRef": true,
|
||||||
|
"computed": true,
|
||||||
|
"computedAsync": true,
|
||||||
|
"computedEager": true,
|
||||||
|
"computedInject": true,
|
||||||
|
"computedWithControl": true,
|
||||||
|
"controlledComputed": true,
|
||||||
|
"controlledRef": true,
|
||||||
|
"createApp": true,
|
||||||
|
"createDisposableDirective": true,
|
||||||
|
"createEventHook": true,
|
||||||
|
"createGlobalState": true,
|
||||||
|
"createInjectionState": true,
|
||||||
|
"createReactiveFn": true,
|
||||||
|
"createRef": true,
|
||||||
|
"createReusableTemplate": true,
|
||||||
|
"createSharedComposable": true,
|
||||||
|
"createTemplatePromise": true,
|
||||||
|
"createUnrefFn": true,
|
||||||
|
"customRef": true,
|
||||||
|
"debouncedRef": true,
|
||||||
|
"debouncedWatch": true,
|
||||||
|
"defineAsyncComponent": true,
|
||||||
|
"defineComponent": true,
|
||||||
|
"eagerComputed": true,
|
||||||
|
"effectScope": true,
|
||||||
|
"extendRef": true,
|
||||||
|
"getCurrentInstance": true,
|
||||||
|
"getCurrentScope": true,
|
||||||
|
"getCurrentWatcher": true,
|
||||||
|
"h": true,
|
||||||
|
"ignorableWatch": true,
|
||||||
|
"inject": true,
|
||||||
|
"injectLocal": true,
|
||||||
|
"isDefined": true,
|
||||||
|
"isProxy": true,
|
||||||
|
"isReactive": true,
|
||||||
|
"isReadonly": true,
|
||||||
|
"isRef": true,
|
||||||
|
"isShallow": true,
|
||||||
|
"makeDestructurable": true,
|
||||||
|
"markRaw": true,
|
||||||
|
"nextTick": true,
|
||||||
|
"onActivated": true,
|
||||||
|
"onBeforeMount": true,
|
||||||
|
"onBeforeRouteLeave": true,
|
||||||
|
"onBeforeRouteUpdate": true,
|
||||||
|
"onBeforeUnmount": true,
|
||||||
|
"onBeforeUpdate": true,
|
||||||
|
"onClickOutside": true,
|
||||||
|
"onDeactivated": true,
|
||||||
|
"onElementRemoval": true,
|
||||||
|
"onErrorCaptured": true,
|
||||||
|
"onKeyStroke": true,
|
||||||
|
"onLongPress": true,
|
||||||
|
"onMounted": true,
|
||||||
|
"onRenderTracked": true,
|
||||||
|
"onRenderTriggered": true,
|
||||||
|
"onScopeDispose": true,
|
||||||
|
"onServerPrefetch": true,
|
||||||
|
"onStartTyping": true,
|
||||||
|
"onUnmounted": true,
|
||||||
|
"onUpdated": true,
|
||||||
|
"onWatcherCleanup": true,
|
||||||
|
"pausableWatch": true,
|
||||||
|
"provide": true,
|
||||||
|
"provideLocal": true,
|
||||||
|
"reactify": true,
|
||||||
|
"reactifyObject": true,
|
||||||
|
"reactive": true,
|
||||||
|
"reactiveComputed": true,
|
||||||
|
"reactiveOmit": true,
|
||||||
|
"reactivePick": true,
|
||||||
|
"readonly": true,
|
||||||
|
"ref": true,
|
||||||
|
"refAutoReset": true,
|
||||||
|
"refDebounced": true,
|
||||||
|
"refDefault": true,
|
||||||
|
"refManualReset": true,
|
||||||
|
"refThrottled": true,
|
||||||
|
"refWithControl": true,
|
||||||
|
"resolveComponent": true,
|
||||||
|
"shallowReactive": true,
|
||||||
|
"shallowReadonly": true,
|
||||||
|
"shallowRef": true,
|
||||||
|
"syncRef": true,
|
||||||
|
"syncRefs": true,
|
||||||
|
"templateRef": true,
|
||||||
|
"throttledRef": true,
|
||||||
|
"throttledWatch": true,
|
||||||
|
"toRaw": true,
|
||||||
|
"toReactive": true,
|
||||||
|
"toRef": true,
|
||||||
|
"toRefs": true,
|
||||||
|
"toValue": true,
|
||||||
|
"triggerRef": true,
|
||||||
|
"tryOnBeforeMount": true,
|
||||||
|
"tryOnBeforeUnmount": true,
|
||||||
|
"tryOnMounted": true,
|
||||||
|
"tryOnScopeDispose": true,
|
||||||
|
"tryOnUnmounted": true,
|
||||||
|
"unref": true,
|
||||||
|
"unrefElement": true,
|
||||||
|
"until": true,
|
||||||
|
"useActiveElement": true,
|
||||||
|
"useAnimate": true,
|
||||||
|
"useArrayDifference": true,
|
||||||
|
"useArrayEvery": true,
|
||||||
|
"useArrayFilter": true,
|
||||||
|
"useArrayFind": true,
|
||||||
|
"useArrayFindIndex": true,
|
||||||
|
"useArrayFindLast": true,
|
||||||
|
"useArrayIncludes": true,
|
||||||
|
"useArrayJoin": true,
|
||||||
|
"useArrayMap": true,
|
||||||
|
"useArrayReduce": true,
|
||||||
|
"useArraySome": true,
|
||||||
|
"useArrayUnique": true,
|
||||||
|
"useAsyncQueue": true,
|
||||||
|
"useAsyncState": true,
|
||||||
|
"useAttrs": true,
|
||||||
|
"useBase64": true,
|
||||||
|
"useBattery": true,
|
||||||
|
"useBluetooth": true,
|
||||||
|
"useBreakpoints": true,
|
||||||
|
"useBroadcastChannel": true,
|
||||||
|
"useBrowserLocation": true,
|
||||||
|
"useCached": true,
|
||||||
|
"useClipboard": true,
|
||||||
|
"useClipboardItems": true,
|
||||||
|
"useCloned": true,
|
||||||
|
"useColorMode": true,
|
||||||
|
"useConfirmDialog": true,
|
||||||
|
"useCountdown": true,
|
||||||
|
"useCounter": true,
|
||||||
|
"useCssModule": true,
|
||||||
|
"useCssSupports": true,
|
||||||
|
"useCssVar": true,
|
||||||
|
"useCssVars": true,
|
||||||
|
"useCurrentElement": true,
|
||||||
|
"useCycleList": true,
|
||||||
|
"useDark": true,
|
||||||
|
"useDateFormat": true,
|
||||||
|
"useDebounce": true,
|
||||||
|
"useDebounceFn": true,
|
||||||
|
"useDebouncedRefHistory": true,
|
||||||
|
"useDeviceMotion": true,
|
||||||
|
"useDeviceOrientation": true,
|
||||||
|
"useDevicePixelRatio": true,
|
||||||
|
"useDevicesList": true,
|
||||||
|
"useDisplayMedia": true,
|
||||||
|
"useDocumentVisibility": true,
|
||||||
|
"useDraggable": true,
|
||||||
|
"useDropZone": true,
|
||||||
|
"useElementBounding": true,
|
||||||
|
"useElementByPoint": true,
|
||||||
|
"useElementHover": true,
|
||||||
|
"useElementSize": true,
|
||||||
|
"useElementVisibility": true,
|
||||||
|
"useEventBus": true,
|
||||||
|
"useEventListener": true,
|
||||||
|
"useEventSource": true,
|
||||||
|
"useEyeDropper": true,
|
||||||
|
"useFavicon": true,
|
||||||
|
"useFetch": true,
|
||||||
|
"useFileDialog": true,
|
||||||
|
"useFileSystemAccess": true,
|
||||||
|
"useFocus": true,
|
||||||
|
"useFocusWithin": true,
|
||||||
|
"useFps": true,
|
||||||
|
"useFullscreen": true,
|
||||||
|
"useGamepad": true,
|
||||||
|
"useGeolocation": true,
|
||||||
|
"useId": true,
|
||||||
|
"useIdle": true,
|
||||||
|
"useImage": true,
|
||||||
|
"useInfiniteScroll": true,
|
||||||
|
"useIntersectionObserver": true,
|
||||||
|
"useInterval": true,
|
||||||
|
"useIntervalFn": true,
|
||||||
|
"useKeyModifier": true,
|
||||||
|
"useLastChanged": true,
|
||||||
|
"useLink": true,
|
||||||
|
"useLocalStorage": true,
|
||||||
|
"useMagicKeys": true,
|
||||||
|
"useManualRefHistory": true,
|
||||||
|
"useMediaControls": true,
|
||||||
|
"useMediaQuery": true,
|
||||||
|
"useMemoize": true,
|
||||||
|
"useMemory": true,
|
||||||
|
"useModel": true,
|
||||||
|
"useMounted": true,
|
||||||
|
"useMouse": true,
|
||||||
|
"useMouseInElement": true,
|
||||||
|
"useMousePressed": true,
|
||||||
|
"useMutationObserver": true,
|
||||||
|
"useNavigatorLanguage": true,
|
||||||
|
"useNetwork": true,
|
||||||
|
"useNow": true,
|
||||||
|
"useObjectUrl": true,
|
||||||
|
"useOffsetPagination": true,
|
||||||
|
"useOnline": true,
|
||||||
|
"usePageLeave": true,
|
||||||
|
"useParallax": true,
|
||||||
|
"useParentElement": true,
|
||||||
|
"usePerformanceObserver": true,
|
||||||
|
"usePermission": true,
|
||||||
|
"usePointer": true,
|
||||||
|
"usePointerLock": true,
|
||||||
|
"usePointerSwipe": true,
|
||||||
|
"usePreferredColorScheme": true,
|
||||||
|
"usePreferredContrast": true,
|
||||||
|
"usePreferredDark": true,
|
||||||
|
"usePreferredLanguages": true,
|
||||||
|
"usePreferredReducedMotion": true,
|
||||||
|
"usePreferredReducedTransparency": true,
|
||||||
|
"usePrevious": true,
|
||||||
|
"useRafFn": true,
|
||||||
|
"useRefHistory": true,
|
||||||
|
"useResizeObserver": true,
|
||||||
|
"useRoute": true,
|
||||||
|
"useRouter": true,
|
||||||
|
"useSSRWidth": true,
|
||||||
|
"useScreenOrientation": true,
|
||||||
|
"useScreenSafeArea": true,
|
||||||
|
"useScriptTag": true,
|
||||||
|
"useScroll": true,
|
||||||
|
"useScrollLock": true,
|
||||||
|
"useSessionStorage": true,
|
||||||
|
"useShare": true,
|
||||||
|
"useSlots": true,
|
||||||
|
"useSorted": true,
|
||||||
|
"useSpeechRecognition": true,
|
||||||
|
"useSpeechSynthesis": true,
|
||||||
|
"useStepper": true,
|
||||||
|
"useStorage": true,
|
||||||
|
"useStorageAsync": true,
|
||||||
|
"useStyleTag": true,
|
||||||
|
"useSupported": true,
|
||||||
|
"useSwipe": true,
|
||||||
|
"useTemplateRef": true,
|
||||||
|
"useTemplateRefsList": true,
|
||||||
|
"useTextDirection": true,
|
||||||
|
"useTextSelection": true,
|
||||||
|
"useTextareaAutosize": true,
|
||||||
|
"useThrottle": true,
|
||||||
|
"useThrottleFn": true,
|
||||||
|
"useThrottledRefHistory": true,
|
||||||
|
"useTimeAgo": true,
|
||||||
|
"useTimeAgoIntl": true,
|
||||||
|
"useTimeout": true,
|
||||||
|
"useTimeoutFn": true,
|
||||||
|
"useTimeoutPoll": true,
|
||||||
|
"useTimestamp": true,
|
||||||
|
"useTitle": true,
|
||||||
|
"useToNumber": true,
|
||||||
|
"useToString": true,
|
||||||
|
"useToggle": true,
|
||||||
|
"useTransition": true,
|
||||||
|
"useUrlSearchParams": true,
|
||||||
|
"useUserMedia": true,
|
||||||
|
"useVModel": true,
|
||||||
|
"useVModels": true,
|
||||||
|
"useVibrate": true,
|
||||||
|
"useVirtualList": true,
|
||||||
|
"useWakeLock": true,
|
||||||
|
"useWebNotification": true,
|
||||||
|
"useWebSocket": true,
|
||||||
|
"useWebWorker": true,
|
||||||
|
"useWebWorkerFn": true,
|
||||||
|
"useWindowFocus": true,
|
||||||
|
"useWindowScroll": true,
|
||||||
|
"useWindowSize": true,
|
||||||
|
"watch": true,
|
||||||
|
"watchArray": true,
|
||||||
|
"watchAtMost": true,
|
||||||
|
"watchDebounced": true,
|
||||||
|
"watchDeep": true,
|
||||||
|
"watchEffect": true,
|
||||||
|
"watchIgnorable": true,
|
||||||
|
"watchImmediate": true,
|
||||||
|
"watchOnce": true,
|
||||||
|
"watchPausable": true,
|
||||||
|
"watchPostEffect": true,
|
||||||
|
"watchSyncEffect": true,
|
||||||
|
"watchThrottled": true,
|
||||||
|
"watchTriggerable": true,
|
||||||
|
"watchWithFilter": true,
|
||||||
|
"whenever": true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,4 +7,5 @@
|
|||||||
"categories": {
|
"categories": {
|
||||||
"correctness": "error"
|
"correctness": "error"
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+78
@@ -0,0 +1,78 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
/* prettier-ignore */
|
||||||
|
// @ts-nocheck
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
|
// Generated by unplugin-auto-import
|
||||||
|
// biome-ignore lint: disable
|
||||||
|
export {}
|
||||||
|
declare global {
|
||||||
|
const EffectScope: typeof import('vue').EffectScope
|
||||||
|
const computed: typeof import('vue').computed
|
||||||
|
const createApp: typeof import('vue').createApp
|
||||||
|
const customRef: typeof import('vue').customRef
|
||||||
|
const defineAsyncComponent: typeof import('vue').defineAsyncComponent
|
||||||
|
const defineComponent: typeof import('vue').defineComponent
|
||||||
|
const effectScope: typeof import('vue').effectScope
|
||||||
|
const getCurrentInstance: typeof import('vue').getCurrentInstance
|
||||||
|
const getCurrentScope: typeof import('vue').getCurrentScope
|
||||||
|
const getCurrentWatcher: typeof import('vue').getCurrentWatcher
|
||||||
|
const h: typeof import('vue').h
|
||||||
|
const inject: typeof import('vue').inject
|
||||||
|
const isProxy: typeof import('vue').isProxy
|
||||||
|
const isReactive: typeof import('vue').isReactive
|
||||||
|
const isReadonly: typeof import('vue').isReadonly
|
||||||
|
const isRef: typeof import('vue').isRef
|
||||||
|
const isShallow: typeof import('vue').isShallow
|
||||||
|
const markRaw: typeof import('vue').markRaw
|
||||||
|
const nextTick: typeof import('vue').nextTick
|
||||||
|
const onActivated: typeof import('vue').onActivated
|
||||||
|
const onBeforeMount: typeof import('vue').onBeforeMount
|
||||||
|
const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
|
||||||
|
const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
|
||||||
|
const onBeforeUnmount: typeof import('vue').onBeforeUnmount
|
||||||
|
const onBeforeUpdate: typeof import('vue').onBeforeUpdate
|
||||||
|
const onDeactivated: typeof import('vue').onDeactivated
|
||||||
|
const onErrorCaptured: typeof import('vue').onErrorCaptured
|
||||||
|
const onMounted: typeof import('vue').onMounted
|
||||||
|
const onRenderTracked: typeof import('vue').onRenderTracked
|
||||||
|
const onRenderTriggered: typeof import('vue').onRenderTriggered
|
||||||
|
const onScopeDispose: typeof import('vue').onScopeDispose
|
||||||
|
const onServerPrefetch: typeof import('vue').onServerPrefetch
|
||||||
|
const onUnmounted: typeof import('vue').onUnmounted
|
||||||
|
const onUpdated: typeof import('vue').onUpdated
|
||||||
|
const onWatcherCleanup: typeof import('vue').onWatcherCleanup
|
||||||
|
const provide: typeof import('vue').provide
|
||||||
|
const reactive: typeof import('vue').reactive
|
||||||
|
const readonly: typeof import('vue').readonly
|
||||||
|
const ref: typeof import('vue').ref
|
||||||
|
const resolveComponent: typeof import('vue').resolveComponent
|
||||||
|
const shallowReactive: typeof import('vue').shallowReactive
|
||||||
|
const shallowReadonly: typeof import('vue').shallowReadonly
|
||||||
|
const shallowRef: typeof import('vue').shallowRef
|
||||||
|
const toRaw: typeof import('vue').toRaw
|
||||||
|
const toRef: typeof import('vue').toRef
|
||||||
|
const toRefs: typeof import('vue').toRefs
|
||||||
|
const toValue: typeof import('vue').toValue
|
||||||
|
const triggerRef: typeof import('vue').triggerRef
|
||||||
|
const unref: typeof import('vue').unref
|
||||||
|
const useAttrs: typeof import('vue').useAttrs
|
||||||
|
const useCssModule: typeof import('vue').useCssModule
|
||||||
|
const useCssVars: typeof import('vue').useCssVars
|
||||||
|
const useId: typeof import('vue').useId
|
||||||
|
const useLink: typeof import('vue-router').useLink
|
||||||
|
const useModel: typeof import('vue').useModel
|
||||||
|
const useRoute: typeof import('vue-router').useRoute
|
||||||
|
const useRouter: typeof import('vue-router').useRouter
|
||||||
|
const useSlots: typeof import('vue').useSlots
|
||||||
|
const useTemplateRef: typeof import('vue').useTemplateRef
|
||||||
|
const watch: typeof import('vue').watch
|
||||||
|
const watchEffect: typeof import('vue').watchEffect
|
||||||
|
const watchPostEffect: typeof import('vue').watchPostEffect
|
||||||
|
const watchSyncEffect: typeof import('vue').watchSyncEffect
|
||||||
|
}
|
||||||
|
// for type re-export
|
||||||
|
declare global {
|
||||||
|
// @ts-ignore
|
||||||
|
export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
|
||||||
|
import('vue')
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import { globalIgnores } from 'eslint/config'
|
import { globalIgnores } from "eslint/config";
|
||||||
import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript'
|
import { defineConfigWithVueTs, vueTsConfigs } from "@vue/eslint-config-typescript";
|
||||||
import pluginVue from 'eslint-plugin-vue'
|
import pluginVue from "eslint-plugin-vue";
|
||||||
import pluginOxlint from 'eslint-plugin-oxlint'
|
import pluginOxlint from "eslint-plugin-oxlint";
|
||||||
import skipFormatting from 'eslint-config-prettier/flat'
|
import skipFormatting from "eslint-config-prettier/flat";
|
||||||
|
|
||||||
// To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
|
// To allow more languages other than `ts` in `.vue` files, uncomment the following lines:
|
||||||
// import { configureVueProject } from '@vue/eslint-config-typescript'
|
// import { configureVueProject } from '@vue/eslint-config-typescript'
|
||||||
@@ -11,16 +11,23 @@ import skipFormatting from 'eslint-config-prettier/flat'
|
|||||||
|
|
||||||
export default defineConfigWithVueTs(
|
export default defineConfigWithVueTs(
|
||||||
{
|
{
|
||||||
name: 'app/files-to-lint',
|
name: "app/files-to-lint",
|
||||||
files: ['**/*.{vue,ts,mts,tsx}'],
|
files: ["**/*.{vue,ts,mts,tsx}"],
|
||||||
},
|
},
|
||||||
|
|
||||||
globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']),
|
globalIgnores(["**/dist/**", "**/dist-ssr/**", "**/coverage/**"]),
|
||||||
|
|
||||||
...pluginVue.configs['flat/essential'],
|
...pluginVue.configs["flat/essential"],
|
||||||
vueTsConfigs.recommended,
|
vueTsConfigs.recommended,
|
||||||
|
|
||||||
...pluginOxlint.buildFromOxlintConfigFile('.oxlintrc.json'),
|
...pluginOxlint.buildFromOxlintConfigFile(".oxlintrc.json"),
|
||||||
|
|
||||||
skipFormatting,
|
skipFormatting,
|
||||||
)
|
|
||||||
|
{
|
||||||
|
name: "app/rules",
|
||||||
|
rules: {
|
||||||
|
"vue/multi-word-component-names": "off",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tailwindcss/vite": "^4.2.4",
|
"@tailwindcss/vite": "^4.2.4",
|
||||||
"@vueuse/core": "^14.3.0",
|
"@vueuse/core": "^14.3.0",
|
||||||
|
"axios": "^1.16.0",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"lucide-vue-next": "^1.0.0",
|
"lucide-vue-next": "^1.0.0",
|
||||||
@@ -46,6 +47,7 @@
|
|||||||
"oxfmt": "^0.45.0",
|
"oxfmt": "^0.45.0",
|
||||||
"oxlint": "~1.60.0",
|
"oxlint": "~1.60.0",
|
||||||
"typescript": "~6.0.0",
|
"typescript": "~6.0.0",
|
||||||
|
"unplugin-auto-import": "^21.0.0",
|
||||||
"vite": "^8.0.8",
|
"vite": "^8.0.8",
|
||||||
"vite-plugin-vue-devtools": "^8.1.1",
|
"vite-plugin-vue-devtools": "^8.1.1",
|
||||||
"vue-tsc": "^3.2.6"
|
"vue-tsc": "^3.2.6"
|
||||||
|
|||||||
Generated
+178
@@ -14,6 +14,9 @@ importers:
|
|||||||
'@vueuse/core':
|
'@vueuse/core':
|
||||||
specifier: ^14.3.0
|
specifier: ^14.3.0
|
||||||
version: 14.3.0(vue@3.5.33(typescript@6.0.3))
|
version: 14.3.0(vue@3.5.33(typescript@6.0.3))
|
||||||
|
axios:
|
||||||
|
specifier: ^1.16.0
|
||||||
|
version: 1.16.0
|
||||||
class-variance-authority:
|
class-variance-authority:
|
||||||
specifier: ^0.7.1
|
specifier: ^0.7.1
|
||||||
version: 0.7.1
|
version: 0.7.1
|
||||||
@@ -96,6 +99,9 @@ importers:
|
|||||||
typescript:
|
typescript:
|
||||||
specifier: ~6.0.0
|
specifier: ~6.0.0
|
||||||
version: 6.0.3
|
version: 6.0.3
|
||||||
|
unplugin-auto-import:
|
||||||
|
specifier: ^21.0.0
|
||||||
|
version: 21.0.0(@vueuse/core@14.3.0(vue@3.5.33(typescript@6.0.3)))
|
||||||
vite:
|
vite:
|
||||||
specifier: ^8.0.8
|
specifier: ^8.0.8
|
||||||
version: 8.0.10(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.4)
|
version: 8.0.10(@types/node@24.12.2)(jiti@2.6.1)(stylus@0.57.0)(yaml@2.8.4)
|
||||||
@@ -1176,11 +1182,17 @@ packages:
|
|||||||
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
|
resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
|
asynckit@0.4.0:
|
||||||
|
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
|
||||||
|
|
||||||
atob@2.1.2:
|
atob@2.1.2:
|
||||||
resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
|
resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
|
||||||
engines: {node: '>= 4.5.0'}
|
engines: {node: '>= 4.5.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
axios@1.16.0:
|
||||||
|
resolution: {integrity: sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==}
|
||||||
|
|
||||||
balanced-match@1.0.2:
|
balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
|
||||||
@@ -1286,6 +1298,10 @@ packages:
|
|||||||
color-name@1.1.4:
|
color-name@1.1.4:
|
||||||
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
|
||||||
|
|
||||||
|
combined-stream@1.0.8:
|
||||||
|
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
|
||||||
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
commander@11.1.0:
|
commander@11.1.0:
|
||||||
resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
|
resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
|
||||||
engines: {node: '>=16'}
|
engines: {node: '>=16'}
|
||||||
@@ -1407,6 +1423,10 @@ packages:
|
|||||||
defu@6.1.7:
|
defu@6.1.7:
|
||||||
resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
|
resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
|
||||||
|
|
||||||
|
delayed-stream@1.0.0:
|
||||||
|
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||||
|
engines: {node: '>=0.4.0'}
|
||||||
|
|
||||||
depd@2.0.0:
|
depd@2.0.0:
|
||||||
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
@@ -1487,6 +1507,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
|
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
es-set-tostringtag@2.1.0:
|
||||||
|
resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
escalade@3.2.0:
|
escalade@3.2.0:
|
||||||
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
|
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -1498,6 +1522,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
escape-string-regexp@5.0.0:
|
||||||
|
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
eslint-config-prettier@10.1.8:
|
eslint-config-prettier@10.1.8:
|
||||||
resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
|
resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
@@ -1564,6 +1592,9 @@ packages:
|
|||||||
estree-walker@2.0.2:
|
estree-walker@2.0.2:
|
||||||
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
|
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
|
||||||
|
|
||||||
|
estree-walker@3.0.3:
|
||||||
|
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
|
||||||
|
|
||||||
esutils@2.0.3:
|
esutils@2.0.3:
|
||||||
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
@@ -1651,10 +1682,23 @@ packages:
|
|||||||
flatted@3.4.2:
|
flatted@3.4.2:
|
||||||
resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
|
resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==}
|
||||||
|
|
||||||
|
follow-redirects@1.16.0:
|
||||||
|
resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==}
|
||||||
|
engines: {node: '>=4.0'}
|
||||||
|
peerDependencies:
|
||||||
|
debug: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
debug:
|
||||||
|
optional: true
|
||||||
|
|
||||||
foreground-child@3.3.1:
|
foreground-child@3.3.1:
|
||||||
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
|
resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
|
form-data@4.0.5:
|
||||||
|
resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==}
|
||||||
|
engines: {node: '>= 6'}
|
||||||
|
|
||||||
forwarded@0.2.0:
|
forwarded@0.2.0:
|
||||||
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
@@ -1750,6 +1794,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
|
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
has-tostringtag@1.0.2:
|
||||||
|
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
|
||||||
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
hasown@2.0.3:
|
hasown@2.0.3:
|
||||||
resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
|
resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -1890,6 +1938,9 @@ packages:
|
|||||||
js-tokens@4.0.0:
|
js-tokens@4.0.0:
|
||||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
|
||||||
|
|
||||||
|
js-tokens@9.0.1:
|
||||||
|
resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
|
||||||
|
|
||||||
jsesc@3.1.0:
|
jsesc@3.1.0:
|
||||||
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
|
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -2080,10 +2131,18 @@ packages:
|
|||||||
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
|
||||||
engines: {node: '>=8.6'}
|
engines: {node: '>=8.6'}
|
||||||
|
|
||||||
|
mime-db@1.52.0:
|
||||||
|
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
mime-db@1.54.0:
|
mime-db@1.54.0:
|
||||||
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
|
resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
|
||||||
engines: {node: '>= 0.6'}
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
|
mime-types@2.1.35:
|
||||||
|
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
|
||||||
|
engines: {node: '>= 0.6'}
|
||||||
|
|
||||||
mime-types@3.0.2:
|
mime-types@3.0.2:
|
||||||
resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
|
resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
@@ -2362,6 +2421,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
|
||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
|
|
||||||
|
proxy-from-env@2.1.0:
|
||||||
|
resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==}
|
||||||
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
punycode@2.3.1:
|
punycode@2.3.1:
|
||||||
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -2573,6 +2636,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
|
resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
strip-literal@3.1.0:
|
||||||
|
resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==}
|
||||||
|
|
||||||
stylus@0.57.0:
|
stylus@0.57.0:
|
||||||
resolution: {integrity: sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==}
|
resolution: {integrity: sha512-yOI6G8WYfr0q8v8rRvE91wbxFU+rJPo760Va4MF6K0I6BZjO4r+xSynkvyPBP9tV1CIEUeRsiidjIs2rzb1CnQ==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
@@ -2684,6 +2750,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==}
|
resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==}
|
||||||
engines: {node: '>=20.18.1'}
|
engines: {node: '>=20.18.1'}
|
||||||
|
|
||||||
|
unimport@5.7.0:
|
||||||
|
resolution: {integrity: sha512-njnL6sp8lEA8QQbZrt+52p/g4X0rw3bnGGmUcJnt1jeG8+iiqO779aGz0PirCtydAIVcuTBRlJ52F0u46z309Q==}
|
||||||
|
engines: {node: '>=18.12.0'}
|
||||||
|
|
||||||
universalify@2.0.1:
|
universalify@2.0.1:
|
||||||
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
|
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
|
||||||
engines: {node: '>= 10.0.0'}
|
engines: {node: '>= 10.0.0'}
|
||||||
@@ -2692,10 +2762,26 @@ packages:
|
|||||||
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
|
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
|
|
||||||
|
unplugin-auto-import@21.0.0:
|
||||||
|
resolution: {integrity: sha512-vWuC8SwqJmxZFYwPojhOhOXDb5xFhNNcEVb9K/RFkyk/3VnfaOjzitWN7v+8DEKpMjSsY2AEGXNgt6I0yQrhRQ==}
|
||||||
|
engines: {node: '>=20.19.0'}
|
||||||
|
peerDependencies:
|
||||||
|
'@nuxt/kit': ^4.0.0
|
||||||
|
'@vueuse/core': '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
'@nuxt/kit':
|
||||||
|
optional: true
|
||||||
|
'@vueuse/core':
|
||||||
|
optional: true
|
||||||
|
|
||||||
unplugin-utils@0.3.1:
|
unplugin-utils@0.3.1:
|
||||||
resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
|
resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
|
||||||
engines: {node: '>=20.19.0'}
|
engines: {node: '>=20.19.0'}
|
||||||
|
|
||||||
|
unplugin@2.3.11:
|
||||||
|
resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==}
|
||||||
|
engines: {node: '>=18.12.0'}
|
||||||
|
|
||||||
unplugin@3.0.0:
|
unplugin@3.0.0:
|
||||||
resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==}
|
resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==}
|
||||||
engines: {node: ^20.19.0 || >=22.12.0}
|
engines: {node: ^20.19.0 || >=22.12.0}
|
||||||
@@ -4006,8 +4092,18 @@ snapshots:
|
|||||||
|
|
||||||
astral-regex@2.0.0: {}
|
astral-regex@2.0.0: {}
|
||||||
|
|
||||||
|
asynckit@0.4.0: {}
|
||||||
|
|
||||||
atob@2.1.2: {}
|
atob@2.1.2: {}
|
||||||
|
|
||||||
|
axios@1.16.0:
|
||||||
|
dependencies:
|
||||||
|
follow-redirects: 1.16.0
|
||||||
|
form-data: 4.0.5
|
||||||
|
proxy-from-env: 2.1.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- debug
|
||||||
|
|
||||||
balanced-match@1.0.2: {}
|
balanced-match@1.0.2: {}
|
||||||
|
|
||||||
balanced-match@4.0.4: {}
|
balanced-match@4.0.4: {}
|
||||||
@@ -4118,6 +4214,10 @@ snapshots:
|
|||||||
|
|
||||||
color-name@1.1.4: {}
|
color-name@1.1.4: {}
|
||||||
|
|
||||||
|
combined-stream@1.0.8:
|
||||||
|
dependencies:
|
||||||
|
delayed-stream: 1.0.0
|
||||||
|
|
||||||
commander@11.1.0: {}
|
commander@11.1.0: {}
|
||||||
|
|
||||||
commander@14.0.3: {}
|
commander@14.0.3: {}
|
||||||
@@ -4202,6 +4302,8 @@ snapshots:
|
|||||||
|
|
||||||
defu@6.1.7: {}
|
defu@6.1.7: {}
|
||||||
|
|
||||||
|
delayed-stream@1.0.0: {}
|
||||||
|
|
||||||
depd@2.0.0: {}
|
depd@2.0.0: {}
|
||||||
|
|
||||||
destr@2.0.5: {}
|
destr@2.0.5: {}
|
||||||
@@ -4270,12 +4372,21 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
es-errors: 1.3.0
|
es-errors: 1.3.0
|
||||||
|
|
||||||
|
es-set-tostringtag@2.1.0:
|
||||||
|
dependencies:
|
||||||
|
es-errors: 1.3.0
|
||||||
|
get-intrinsic: 1.3.0
|
||||||
|
has-tostringtag: 1.0.2
|
||||||
|
hasown: 2.0.3
|
||||||
|
|
||||||
escalade@3.2.0: {}
|
escalade@3.2.0: {}
|
||||||
|
|
||||||
escape-html@1.0.3: {}
|
escape-html@1.0.3: {}
|
||||||
|
|
||||||
escape-string-regexp@4.0.0: {}
|
escape-string-regexp@4.0.0: {}
|
||||||
|
|
||||||
|
escape-string-regexp@5.0.0: {}
|
||||||
|
|
||||||
eslint-config-prettier@10.1.8(eslint@10.3.0(jiti@2.6.1)):
|
eslint-config-prettier@10.1.8(eslint@10.3.0(jiti@2.6.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
eslint: 10.3.0(jiti@2.6.1)
|
eslint: 10.3.0(jiti@2.6.1)
|
||||||
@@ -4364,6 +4475,10 @@ snapshots:
|
|||||||
|
|
||||||
estree-walker@2.0.2: {}
|
estree-walker@2.0.2: {}
|
||||||
|
|
||||||
|
estree-walker@3.0.3:
|
||||||
|
dependencies:
|
||||||
|
'@types/estree': 1.0.8
|
||||||
|
|
||||||
esutils@2.0.3: {}
|
esutils@2.0.3: {}
|
||||||
|
|
||||||
etag@1.8.1: {}
|
etag@1.8.1: {}
|
||||||
@@ -4483,11 +4598,21 @@ snapshots:
|
|||||||
|
|
||||||
flatted@3.4.2: {}
|
flatted@3.4.2: {}
|
||||||
|
|
||||||
|
follow-redirects@1.16.0: {}
|
||||||
|
|
||||||
foreground-child@3.3.1:
|
foreground-child@3.3.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
cross-spawn: 7.0.6
|
cross-spawn: 7.0.6
|
||||||
signal-exit: 4.1.0
|
signal-exit: 4.1.0
|
||||||
|
|
||||||
|
form-data@4.0.5:
|
||||||
|
dependencies:
|
||||||
|
asynckit: 0.4.0
|
||||||
|
combined-stream: 1.0.8
|
||||||
|
es-set-tostringtag: 2.1.0
|
||||||
|
hasown: 2.0.3
|
||||||
|
mime-types: 2.1.35
|
||||||
|
|
||||||
forwarded@0.2.0: {}
|
forwarded@0.2.0: {}
|
||||||
|
|
||||||
fresh@2.0.0: {}
|
fresh@2.0.0: {}
|
||||||
@@ -4577,6 +4702,10 @@ snapshots:
|
|||||||
|
|
||||||
has-symbols@1.1.0: {}
|
has-symbols@1.1.0: {}
|
||||||
|
|
||||||
|
has-tostringtag@1.0.2:
|
||||||
|
dependencies:
|
||||||
|
has-symbols: 1.1.0
|
||||||
|
|
||||||
hasown@2.0.3:
|
hasown@2.0.3:
|
||||||
dependencies:
|
dependencies:
|
||||||
function-bind: 1.1.2
|
function-bind: 1.1.2
|
||||||
@@ -4675,6 +4804,8 @@ snapshots:
|
|||||||
|
|
||||||
js-tokens@4.0.0: {}
|
js-tokens@4.0.0: {}
|
||||||
|
|
||||||
|
js-tokens@9.0.1: {}
|
||||||
|
|
||||||
jsesc@3.1.0: {}
|
jsesc@3.1.0: {}
|
||||||
|
|
||||||
json-buffer@3.0.1: {}
|
json-buffer@3.0.1: {}
|
||||||
@@ -4823,8 +4954,14 @@ snapshots:
|
|||||||
braces: 3.0.3
|
braces: 3.0.3
|
||||||
picomatch: 2.3.2
|
picomatch: 2.3.2
|
||||||
|
|
||||||
|
mime-db@1.52.0: {}
|
||||||
|
|
||||||
mime-db@1.54.0: {}
|
mime-db@1.54.0: {}
|
||||||
|
|
||||||
|
mime-types@2.1.35:
|
||||||
|
dependencies:
|
||||||
|
mime-db: 1.52.0
|
||||||
|
|
||||||
mime-types@3.0.2:
|
mime-types@3.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
mime-db: 1.54.0
|
mime-db: 1.54.0
|
||||||
@@ -5121,6 +5258,8 @@ snapshots:
|
|||||||
forwarded: 0.2.0
|
forwarded: 0.2.0
|
||||||
ipaddr.js: 1.9.1
|
ipaddr.js: 1.9.1
|
||||||
|
|
||||||
|
proxy-from-env@2.1.0: {}
|
||||||
|
|
||||||
punycode@2.3.1: {}
|
punycode@2.3.1: {}
|
||||||
|
|
||||||
qs@6.15.1:
|
qs@6.15.1:
|
||||||
@@ -5409,6 +5548,10 @@ snapshots:
|
|||||||
|
|
||||||
strip-final-newline@2.0.0: {}
|
strip-final-newline@2.0.0: {}
|
||||||
|
|
||||||
|
strip-literal@3.1.0:
|
||||||
|
dependencies:
|
||||||
|
js-tokens: 9.0.1
|
||||||
|
|
||||||
stylus@0.57.0:
|
stylus@0.57.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
css: 3.0.0
|
css: 3.0.0
|
||||||
@@ -5513,15 +5656,50 @@ snapshots:
|
|||||||
|
|
||||||
undici@7.25.0: {}
|
undici@7.25.0: {}
|
||||||
|
|
||||||
|
unimport@5.7.0:
|
||||||
|
dependencies:
|
||||||
|
acorn: 8.16.0
|
||||||
|
escape-string-regexp: 5.0.0
|
||||||
|
estree-walker: 3.0.3
|
||||||
|
local-pkg: 1.1.2
|
||||||
|
magic-string: 0.30.21
|
||||||
|
mlly: 1.8.2
|
||||||
|
pathe: 2.0.3
|
||||||
|
picomatch: 4.0.4
|
||||||
|
pkg-types: 2.3.1
|
||||||
|
scule: 1.3.0
|
||||||
|
strip-literal: 3.1.0
|
||||||
|
tinyglobby: 0.2.16
|
||||||
|
unplugin: 2.3.11
|
||||||
|
unplugin-utils: 0.3.1
|
||||||
|
|
||||||
universalify@2.0.1: {}
|
universalify@2.0.1: {}
|
||||||
|
|
||||||
unpipe@1.0.0: {}
|
unpipe@1.0.0: {}
|
||||||
|
|
||||||
|
unplugin-auto-import@21.0.0(@vueuse/core@14.3.0(vue@3.5.33(typescript@6.0.3))):
|
||||||
|
dependencies:
|
||||||
|
local-pkg: 1.1.2
|
||||||
|
magic-string: 0.30.21
|
||||||
|
picomatch: 4.0.4
|
||||||
|
unimport: 5.7.0
|
||||||
|
unplugin: 2.3.11
|
||||||
|
unplugin-utils: 0.3.1
|
||||||
|
optionalDependencies:
|
||||||
|
'@vueuse/core': 14.3.0(vue@3.5.33(typescript@6.0.3))
|
||||||
|
|
||||||
unplugin-utils@0.3.1:
|
unplugin-utils@0.3.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
picomatch: 4.0.4
|
picomatch: 4.0.4
|
||||||
|
|
||||||
|
unplugin@2.3.11:
|
||||||
|
dependencies:
|
||||||
|
'@jridgewell/remapping': 2.3.5
|
||||||
|
acorn: 8.16.0
|
||||||
|
picomatch: 4.0.4
|
||||||
|
webpack-virtual-modules: 0.6.2
|
||||||
|
|
||||||
unplugin@3.0.0:
|
unplugin@3.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/remapping': 2.3.5
|
'@jridgewell/remapping': 2.3.5
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
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<IResult>('/calc', config)
|
||||||
|
return res.data
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// Compare this snippet from frontend/src/api/common/index.ts:
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
export interface IResult {
|
||||||
|
uuid: string
|
||||||
|
skills: IResultSkill[]
|
||||||
|
info: IResultUserInfo[]
|
||||||
|
suits: {
|
||||||
|
suit?: IResultSuit
|
||||||
|
oath?: IResultSuit
|
||||||
|
correction?: number
|
||||||
|
}
|
||||||
|
buffer: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IResultSkill {
|
||||||
|
name: string
|
||||||
|
icon: string
|
||||||
|
lv: number
|
||||||
|
data: number
|
||||||
|
ratio: number
|
||||||
|
cd: number
|
||||||
|
damage: number
|
||||||
|
mode: string
|
||||||
|
buff: number[]
|
||||||
|
learnLv: number
|
||||||
|
type: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IResultUserInfo {
|
||||||
|
id: number
|
||||||
|
name: string
|
||||||
|
value: string | number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IResultSuit {
|
||||||
|
id: string
|
||||||
|
count: number
|
||||||
|
imageUrl: string
|
||||||
|
level: number
|
||||||
|
name: string
|
||||||
|
point: number
|
||||||
|
rarity: string
|
||||||
|
value: string
|
||||||
|
suitId: string
|
||||||
|
skills: {
|
||||||
|
id: string
|
||||||
|
skillId: string
|
||||||
|
name: string
|
||||||
|
imageUrl: string
|
||||||
|
enable: boolean
|
||||||
|
}[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IResultSkillCount {
|
||||||
|
count: number
|
||||||
|
mode: string
|
||||||
|
name: string
|
||||||
|
}
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
import type { AxiosInstance, AxiosResponse } from "axios";
|
||||||
|
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'
|
||||||
|
|
||||||
|
export interface HttpResponse<T = unknown> extends AxiosResponse {
|
||||||
|
code?: number;
|
||||||
|
message: string;
|
||||||
|
data: T;
|
||||||
|
state?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
let instance: AxiosInstance | null = null;
|
||||||
|
|
||||||
|
let baseURL = "/api";
|
||||||
|
|
||||||
|
// 避免远程开发的时候冲突
|
||||||
|
if (import.meta.env.MODE == "development") {
|
||||||
|
baseURL = "http://127.0.0.1:47173/api";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (import.meta.env.MODE == "web" || import.meta.env.MODE == "show") {
|
||||||
|
baseURL = "https://api.dnftools.com/";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (import.meta.env.MODE == "test") {
|
||||||
|
baseURL = "https://testapi.dnftools.com/";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解压
|
||||||
|
function unzip(key: string) {
|
||||||
|
// 将二进制字符串转换为字符数组
|
||||||
|
|
||||||
|
const charData = key.split("").map((x) => {
|
||||||
|
return x?.charCodeAt(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 将数字数组转换成字节数组
|
||||||
|
const binData = new Uint8Array(charData);
|
||||||
|
|
||||||
|
// 解压
|
||||||
|
const data = ungzip(binData);
|
||||||
|
|
||||||
|
const decoder = new TextDecoder();
|
||||||
|
const str = decoder.decode(data);
|
||||||
|
|
||||||
|
// unescape(str) --->解压后解码,防止中午乱码
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function defineRequest<T>(fn: (ax: AxiosInstance) => T) {
|
||||||
|
if (!instance) {
|
||||||
|
instance = axios.create({
|
||||||
|
baseURL,
|
||||||
|
});
|
||||||
|
|
||||||
|
instance.interceptors.request.use(
|
||||||
|
(request) => {
|
||||||
|
// const configStore = useConfigStore()
|
||||||
|
// const token = configStore.token
|
||||||
|
// const uid = useAppStore().uid
|
||||||
|
|
||||||
|
const token = useInfoStore().alter_token;
|
||||||
|
|
||||||
|
if (token) {
|
||||||
|
request.headers["Alter-Token"] = token;
|
||||||
|
}
|
||||||
|
|
||||||
|
return request;
|
||||||
|
},
|
||||||
|
(error) => {
|
||||||
|
// do something
|
||||||
|
return Promise.reject(error);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
instance.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8";
|
||||||
|
// instance.defaults.headers["Accept-Encoding"] = "gzip"
|
||||||
|
// instance.defaults.headers["Content-Encoding"] = "gzip"
|
||||||
|
// add response interceptors
|
||||||
|
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-#d4d6b6 text-center',
|
||||||
|
// style: 'white-space:pre-wrap;width:250px;margin:10px',
|
||||||
|
// },
|
||||||
|
// `出现错误,可加群反馈:183439472\n${response.data.message}`,
|
||||||
|
// )
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
console.error(response.data.message);
|
||||||
|
}
|
||||||
|
// 解密数据
|
||||||
|
if (typeof response.data.data == "string") {
|
||||||
|
try {
|
||||||
|
const data = unzip(atob(response.data.data as string));
|
||||||
|
response.data.data = JSON.parse(data);
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
return response.data;
|
||||||
|
},
|
||||||
|
async (error: Error) => {
|
||||||
|
return Promise.reject(error);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fn(Object.create(instance));
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
import info from './info'
|
||||||
|
import calc from './calc'
|
||||||
|
|
||||||
|
export default { ...info, ...calc }
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import { defineRequest } from "../common";
|
||||||
|
import type { IAdventureInfo, ICharacterInfo, IHelperInfo, ISkillInfo } from "./type";
|
||||||
|
|
||||||
|
export default defineRequest((request) => {
|
||||||
|
return {
|
||||||
|
async adventures() {
|
||||||
|
const res = await request.get<IAdventureInfo[]>("/adventure");
|
||||||
|
return res.data;
|
||||||
|
},
|
||||||
|
async createToken(alter: string, equVersion?: string) {
|
||||||
|
const res = await request.get<string>(`/token/get/${alter}`, { params: { equVersion } });
|
||||||
|
return res.data;
|
||||||
|
},
|
||||||
|
async characterInfo() {
|
||||||
|
const res = await request.get<ICharacterInfo>("/character");
|
||||||
|
return res.data;
|
||||||
|
},
|
||||||
|
async skillDetail(skillId: string, level: number) {
|
||||||
|
const res = await request.get<ISkillInfo>(`/skill/${skillId}/${level}`);
|
||||||
|
return res.data;
|
||||||
|
},
|
||||||
|
async getConfigFromHelper(uid: string) {
|
||||||
|
const res = await request.get(`/dnfhelper/${uid}/`);
|
||||||
|
return res.data;
|
||||||
|
},
|
||||||
|
async getSkillFromCode(code: string) {
|
||||||
|
const res = await request.post(`/skillTree/`, { code });
|
||||||
|
return res.data;
|
||||||
|
},
|
||||||
|
async getOathInfo(suitId: string, skillId: string, rarity: string, lv: number) {
|
||||||
|
const res = await request.get(`/info/oath/${suitId}/${skillId}`, { params: { rarity, lv } });
|
||||||
|
return res.data;
|
||||||
|
},
|
||||||
|
async getHelperList(id: string) {
|
||||||
|
const res = await request.get<IHelperInfo>(`/dnfhelper/${id}/list`);
|
||||||
|
return res.data;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
@@ -0,0 +1,227 @@
|
|||||||
|
export interface IAdventureInfo {
|
||||||
|
title: string;
|
||||||
|
name: string;
|
||||||
|
children: IAlterInfo[];
|
||||||
|
}
|
||||||
|
export interface IAlterOption {
|
||||||
|
name: string;
|
||||||
|
title: string;
|
||||||
|
value?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IAlterInfo {
|
||||||
|
name: string;
|
||||||
|
url?: string;
|
||||||
|
title: string;
|
||||||
|
default_value: string;
|
||||||
|
options?: IAlterOption[];
|
||||||
|
open?: boolean;
|
||||||
|
comment?: string;
|
||||||
|
value?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ICharacterInfo {
|
||||||
|
role: string;
|
||||||
|
alter: string;
|
||||||
|
name: string;
|
||||||
|
buffer: boolean;
|
||||||
|
equVersion: string;
|
||||||
|
equips: IEquipment[];
|
||||||
|
properties: string[];
|
||||||
|
stones: IEquipment[];
|
||||||
|
enchants: IEnchantingInfo[];
|
||||||
|
emblems: IEmblemInfo[];
|
||||||
|
oaths: IEquipment[];
|
||||||
|
weapons: string[];
|
||||||
|
subweapons: string[];
|
||||||
|
skills: ISkill[];
|
||||||
|
suits: ISuit[];
|
||||||
|
avatar: Record<string, IAvatarInfo[]>;
|
||||||
|
jades: IJade[];
|
||||||
|
sundry: Record<string, ISundry>;
|
||||||
|
options: { id: number; name: string; options: string[] }[];
|
||||||
|
oaths_skills: Record<
|
||||||
|
string,
|
||||||
|
{
|
||||||
|
suitInfo: {
|
||||||
|
name: string;
|
||||||
|
rarity: string;
|
||||||
|
SkillAttack: number;
|
||||||
|
Buffer: number;
|
||||||
|
Attack: number;
|
||||||
|
}[];
|
||||||
|
skills: { skillId: string; name: string; icon: string }[];
|
||||||
|
}
|
||||||
|
>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISundry {
|
||||||
|
id: number;
|
||||||
|
options: {
|
||||||
|
name: string;
|
||||||
|
value: number;
|
||||||
|
}[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IEquipment {
|
||||||
|
id: string;
|
||||||
|
imageUrl: string;
|
||||||
|
itemType: string;
|
||||||
|
itemDetailType: string;
|
||||||
|
name: string;
|
||||||
|
categorize: string;
|
||||||
|
suit: string[];
|
||||||
|
rarity: string;
|
||||||
|
max_adaptation: number;
|
||||||
|
STR: number[];
|
||||||
|
INT: number[];
|
||||||
|
Vitality: number[];
|
||||||
|
Spirit: number[];
|
||||||
|
AtkP: number[];
|
||||||
|
AtkM: number[];
|
||||||
|
AtkI: number[];
|
||||||
|
SkillAttack: number[];
|
||||||
|
Attack: number[];
|
||||||
|
Buffer: number[];
|
||||||
|
detail: string;
|
||||||
|
bufferDetail: string;
|
||||||
|
position: string[];
|
||||||
|
wearUrl: string[];
|
||||||
|
oathPos: string;
|
||||||
|
displayUrl?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISkill {
|
||||||
|
icon: string;
|
||||||
|
name: string;
|
||||||
|
id: number;
|
||||||
|
learnLv: number;
|
||||||
|
position: number;
|
||||||
|
line: number;
|
||||||
|
type: string;
|
||||||
|
maxLearnLv: number;
|
||||||
|
maxLv: number;
|
||||||
|
bind: boolean;
|
||||||
|
hasVP: boolean;
|
||||||
|
hasUP: boolean;
|
||||||
|
vps: {
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
}[];
|
||||||
|
uuid: string;
|
||||||
|
upType: "damage" | "heal";
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISuit {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
imageUrl: string;
|
||||||
|
suitId: number;
|
||||||
|
suitName: string;
|
||||||
|
point: number;
|
||||||
|
rarity: string;
|
||||||
|
level: number;
|
||||||
|
SkillAttack: number;
|
||||||
|
Buffer: number;
|
||||||
|
value: string;
|
||||||
|
bufferValue: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IEnchantingInfo {
|
||||||
|
id: string | number;
|
||||||
|
fame: number | undefined;
|
||||||
|
position: string[];
|
||||||
|
detail: string;
|
||||||
|
categorize: string[];
|
||||||
|
rarity?: string;
|
||||||
|
type?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IEmblemInfo {
|
||||||
|
fame: number;
|
||||||
|
id: string;
|
||||||
|
rarity: string;
|
||||||
|
type: string;
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IAvatarInfo {
|
||||||
|
id: number;
|
||||||
|
options: string[];
|
||||||
|
part: string;
|
||||||
|
rarity: string;
|
||||||
|
suit?: string;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IJade {
|
||||||
|
name: string;
|
||||||
|
id: number;
|
||||||
|
max: number;
|
||||||
|
min: number;
|
||||||
|
pre: number;
|
||||||
|
unit: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ISkillInfo {
|
||||||
|
name: string;
|
||||||
|
type: string;
|
||||||
|
desc: string;
|
||||||
|
descDetail: string;
|
||||||
|
consumeItem: ConsumeItem;
|
||||||
|
descSpecial: string[];
|
||||||
|
maxLevel: number;
|
||||||
|
requiredLevel: number;
|
||||||
|
requiredLevelRange: number;
|
||||||
|
preRequiredSkill: any;
|
||||||
|
jobId: string;
|
||||||
|
jobName: string;
|
||||||
|
jobGrowLevel: any[];
|
||||||
|
evolution: Evolution[];
|
||||||
|
enhancement: Enhancement[];
|
||||||
|
attribute: Attribute;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ConsumeItem {
|
||||||
|
itemId: string;
|
||||||
|
itemName: string;
|
||||||
|
value: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Evolution {
|
||||||
|
type: number;
|
||||||
|
name: string;
|
||||||
|
desc: string;
|
||||||
|
descDetail: string;
|
||||||
|
skills?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Enhancement {
|
||||||
|
type: number;
|
||||||
|
status: Status[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Status {
|
||||||
|
name: string;
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Attribute {
|
||||||
|
optionDesc: string;
|
||||||
|
level: number;
|
||||||
|
consumeMp: number;
|
||||||
|
coolTime: number;
|
||||||
|
castingTime?: number;
|
||||||
|
optionValue: Record<`value${string}`, string>;
|
||||||
|
detail: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IHelperInfo {
|
||||||
|
id: string;
|
||||||
|
avatar: string;
|
||||||
|
roleList: {
|
||||||
|
roleId: string;
|
||||||
|
roleName: string;
|
||||||
|
avatarLink: string;
|
||||||
|
}[];
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
export interface IDataType<T = any> {
|
||||||
|
code?: number
|
||||||
|
message: string
|
||||||
|
data: T
|
||||||
|
state?: number
|
||||||
|
}
|
||||||
@@ -11,12 +11,7 @@ import {
|
|||||||
FieldLabel,
|
FieldLabel,
|
||||||
FieldSeparator,
|
FieldSeparator,
|
||||||
} from "@/components/ui/field";
|
} from "@/components/ui/field";
|
||||||
import {
|
import { Input } from "@/components/ui/input";
|
||||||
InputOTP,
|
|
||||||
InputOTPGroup,
|
|
||||||
InputOTPSeparator,
|
|
||||||
InputOTPSlot,
|
|
||||||
} from "@/components/ui/input-otp";
|
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
class?: HTMLAttributes["class"];
|
class?: HTMLAttributes["class"];
|
||||||
@@ -35,35 +30,11 @@ const props = defineProps<{
|
|||||||
<span class="sr-only">DNF计算器</span>
|
<span class="sr-only">DNF计算器</span>
|
||||||
</a>
|
</a>
|
||||||
<!-- <h1 class="text-xl font-bold">输入助手ID</h1> -->
|
<!-- <h1 class="text-xl font-bold">输入助手ID</h1> -->
|
||||||
<FieldDescription>请输入助手的社区ID </FieldDescription>
|
<!-- <FieldDescription>请输入助手的社区ID </FieldDescription> -->
|
||||||
</div>
|
</div>
|
||||||
<Field class="flex flex-col items-center">
|
<Field class="flex flex-col items-center">
|
||||||
<FieldLabel for="otp" class="sr-only"> 助手ID </FieldLabel>
|
<FieldLabel for="helperId" class="sr-only"> 助手ID </FieldLabel>
|
||||||
<InputOTP id="otp" :maxlength="9" required container-class="gap-4" class="justify-center">
|
<Input id="helperId" type="number" placeholder="助手社区ID" required />
|
||||||
<InputOTPGroup
|
|
||||||
class="gap-2.5 *:data-[slot=input-otp-slot]:h-16 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl"
|
|
||||||
>
|
|
||||||
<InputOTPSlot :index="0" />
|
|
||||||
<InputOTPSlot :index="1" />
|
|
||||||
<InputOTPSlot :index="2" />
|
|
||||||
</InputOTPGroup>
|
|
||||||
<InputOTPSeparator />
|
|
||||||
<InputOTPGroup
|
|
||||||
class="gap-2.5 *:data-[slot=input-otp-slot]:h-16 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl"
|
|
||||||
>
|
|
||||||
<InputOTPSlot :index="3" />
|
|
||||||
<InputOTPSlot :index="4" />
|
|
||||||
<InputOTPSlot :index="5" />
|
|
||||||
</InputOTPGroup>
|
|
||||||
<InputOTPSeparator />
|
|
||||||
<InputOTPGroup
|
|
||||||
class="gap-2.5 *:data-[slot=input-otp-slot]:h-16 *:data-[slot=input-otp-slot]:w-12 *:data-[slot=input-otp-slot]:rounded-md *:data-[slot=input-otp-slot]:border *:data-[slot=input-otp-slot]:text-xl"
|
|
||||||
>
|
|
||||||
<InputOTPSlot :index="6" />
|
|
||||||
<InputOTPSlot :index="7" />
|
|
||||||
<InputOTPSlot :index="8" />
|
|
||||||
</InputOTPGroup>
|
|
||||||
</InputOTP>
|
|
||||||
<!-- <FieldDescription class="text-center">
|
<!-- <FieldDescription class="text-center">
|
||||||
Didn't receive the code? <a href="#">Resend</a>
|
Didn't receive the code? <a href="#">Resend</a>
|
||||||
</FieldDescription> -->
|
</FieldDescription> -->
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from "vue";
|
||||||
|
import { cn } from "@/lib/utils";
|
||||||
|
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
class?: HTMLAttributes["class"];
|
||||||
|
size?: "default" | "sm";
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
size: "default",
|
||||||
|
},
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
data-slot="card"
|
||||||
|
:data-size="size"
|
||||||
|
:class="
|
||||||
|
cn(
|
||||||
|
'ring-foreground/10 bg-card text-card-foreground gap-4 overflow-hidden rounded-xl py-4 text-sm ring-1 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl group/card flex flex-col transition-all duration-200 hover:shadow-lg hover:ring-foreground/20',
|
||||||
|
props.class,
|
||||||
|
)
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
data-slot="card-action"
|
||||||
|
:class="cn('col-start-2 row-span-2 row-start-1 self-start justify-self-end', props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
data-slot="card-content"
|
||||||
|
:class="cn('px-4 group-data-[size=sm]/card:px-3', props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
data-slot="card-description"
|
||||||
|
:class="cn('text-muted-foreground text-sm', props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
data-slot="card-footer"
|
||||||
|
:class="cn('bg-muted/50 rounded-b-xl border-t p-4 group-data-[size=sm]/card:p-3 flex items-center', props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
data-slot="card-header"
|
||||||
|
:class="cn('gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]', props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
data-slot="card-title"
|
||||||
|
:class="cn('text-base leading-snug font-medium group-data-[size=sm]/card:text-sm cn-font-heading', props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
export { default as Card } from './Card.vue'
|
||||||
|
export { default as CardAction } from './CardAction.vue'
|
||||||
|
export { default as CardContent } from './CardContent.vue'
|
||||||
|
export { default as CardDescription } from './CardDescription.vue'
|
||||||
|
export { default as CardFooter } from './CardFooter.vue'
|
||||||
|
export { default as CardHeader } from './CardHeader.vue'
|
||||||
|
export { default as CardTitle } from './CardTitle.vue'
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
data-slot="input-group"
|
||||||
|
role="group"
|
||||||
|
:class="cn(
|
||||||
|
'border-input dark:bg-input/30 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-disabled:bg-input/50 dark:has-disabled:bg-input/80 h-8 rounded-lg border transition-colors in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:ring-3 has-[[data-slot][aria-invalid=true]]:ring-3 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5 group/input-group relative flex w-full min-w-0 items-center outline-none has-[>textarea]:h-auto',
|
||||||
|
props.class,
|
||||||
|
)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import type { InputGroupVariants } from '.'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
import { inputGroupAddonVariants } from '.'
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<{
|
||||||
|
align?: InputGroupVariants['align']
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>(), {
|
||||||
|
align: 'inline-start',
|
||||||
|
})
|
||||||
|
|
||||||
|
function handleInputGroupAddonClick(e: MouseEvent) {
|
||||||
|
const currentTarget = e.currentTarget as HTMLElement | null
|
||||||
|
const target = e.target as HTMLElement | null
|
||||||
|
if (target && target.closest('button')) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (currentTarget && currentTarget?.parentElement) {
|
||||||
|
currentTarget.parentElement?.querySelector('input')?.focus()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div
|
||||||
|
role="group"
|
||||||
|
data-slot="input-group-addon"
|
||||||
|
:data-align="props.align"
|
||||||
|
:class="cn(inputGroupAddonVariants({ align: props.align }), props.class)"
|
||||||
|
@click="handleInputGroupAddonClick"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { InputGroupButtonProps } from '.'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
import { Button } from '@/components/ui/button'
|
||||||
|
import { inputGroupButtonVariants } from '.'
|
||||||
|
|
||||||
|
const props = withDefaults(defineProps<InputGroupButtonProps>(), {
|
||||||
|
size: 'xs',
|
||||||
|
variant: 'ghost',
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Button
|
||||||
|
type="button"
|
||||||
|
:data-size="props.size"
|
||||||
|
:variant="props.variant"
|
||||||
|
:class="cn(inputGroupButtonVariants({ size: props.size }), props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</Button>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
import { Input } from '@/components/ui/input'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Input
|
||||||
|
data-slot="input-group-control"
|
||||||
|
:class="cn(
|
||||||
|
'rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent flex-1',
|
||||||
|
props.class,
|
||||||
|
)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<span
|
||||||
|
:class="cn(
|
||||||
|
'text-muted-foreground gap-2 text-sm [&_svg:not([class*=size-])]:size-4 flex items-center [&_svg]:pointer-events-none',
|
||||||
|
props.class,
|
||||||
|
)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
import { Textarea } from '@/components/ui/textarea'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Textarea
|
||||||
|
data-slot="input-group-control"
|
||||||
|
:class="cn(
|
||||||
|
'rounded-none border-0 bg-transparent py-2 shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent flex-1 resize-none',
|
||||||
|
props.class,
|
||||||
|
)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
import type { VariantProps } from 'class-variance-authority'
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import type { ButtonVariants } from '@/components/ui/button'
|
||||||
|
import { cva } from 'class-variance-authority'
|
||||||
|
|
||||||
|
export { default as InputGroup } from './InputGroup.vue'
|
||||||
|
export { default as InputGroupAddon } from './InputGroupAddon.vue'
|
||||||
|
export { default as InputGroupButton } from './InputGroupButton.vue'
|
||||||
|
export { default as InputGroupInput } from './InputGroupInput.vue'
|
||||||
|
export { default as InputGroupText } from './InputGroupText.vue'
|
||||||
|
export { default as InputGroupTextarea } from './InputGroupTextarea.vue'
|
||||||
|
|
||||||
|
export const inputGroupAddonVariants = cva(
|
||||||
|
'text-muted-foreground h-auto gap-2 py-1.5 text-sm font-medium group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-[calc(var(--radius)-5px)] [&>svg:not([class*=size-])]:size-4 flex cursor-text items-center justify-center select-none',
|
||||||
|
{
|
||||||
|
variants: {
|
||||||
|
align: {
|
||||||
|
'inline-start': 'pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem] order-first',
|
||||||
|
'inline-end': 'pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem] order-last',
|
||||||
|
'block-start': 'px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2 order-first w-full justify-start',
|
||||||
|
'block-end': 'px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2 order-last w-full justify-start',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
align: 'inline-start',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
export type InputGroupVariants = VariantProps<typeof inputGroupAddonVariants>
|
||||||
|
|
||||||
|
export const inputGroupButtonVariants = cva(
|
||||||
|
'gap-2 text-sm flex items-center shadow-none',
|
||||||
|
{
|
||||||
|
variants: {
|
||||||
|
size: {
|
||||||
|
'xs': 'h-6 gap-1 rounded-[calc(var(--radius)-3px)] px-1.5 [&>svg:not([class*=size-])]:size-3.5',
|
||||||
|
'sm': '',
|
||||||
|
'icon-xs': 'size-6 rounded-[calc(var(--radius)-3px)] p-0 has-[>svg]:p-0',
|
||||||
|
'icon-sm': 'size-8 p-0 has-[>svg]:p-0',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
defaultVariants: {
|
||||||
|
size: 'xs',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
export type InputGroupButtonVariants = VariantProps<typeof inputGroupButtonVariants>
|
||||||
|
|
||||||
|
export interface InputGroupButtonProps {
|
||||||
|
variant?: ButtonVariants['variant']
|
||||||
|
size?: InputGroupButtonVariants['size']
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<kbd
|
||||||
|
data-slot="kbd"
|
||||||
|
:class="cn('bg-muted text-muted-foreground in-data-[slot=tooltip-content]:bg-background/20 in-data-[slot=tooltip-content]:text-background dark:in-data-[slot=tooltip-content]:bg-background/10 h-5 w-fit min-w-5 gap-1 rounded-sm px-1 font-sans text-xs font-medium [&_svg:not([class*=size-])]:size-3 pointer-events-none inline-flex items-center justify-center select-none', props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</kbd>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<kbd
|
||||||
|
data-slot="kbd-group"
|
||||||
|
:class="cn('gap-1 inline-flex items-center', props.class)"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
</kbd>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export { default as Kbd } from './Kbd.vue'
|
||||||
|
export { default as KbdGroup } from './KbdGroup.vue'
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from 'vue'
|
||||||
|
import { useVModel } from '@vueuse/core'
|
||||||
|
import { cn } from '@/lib/utils'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes['class']
|
||||||
|
defaultValue?: string | number
|
||||||
|
modelValue?: string | number
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emits = defineEmits<{
|
||||||
|
(e: 'update:modelValue', payload: string | number): void
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const modelValue = useVModel(props, 'modelValue', emits, {
|
||||||
|
passive: true,
|
||||||
|
defaultValue: props.defaultValue,
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<textarea
|
||||||
|
v-model="modelValue"
|
||||||
|
data-slot="textarea"
|
||||||
|
:class="cn('border-input dark:bg-input/30 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 rounded-lg border bg-transparent px-2.5 py-2 text-base transition-colors focus-visible:ring-3 aria-invalid:ring-3 md:text-sm flex field-sizing-content min-h-16 w-full outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50', props.class)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export { default as Textarea } from './Textarea.vue'
|
||||||
+13
-9
@@ -1,13 +1,17 @@
|
|||||||
import { createApp } from 'vue'
|
import { createApp } from "vue";
|
||||||
import { createPinia } from 'pinia'
|
import { pinia } from "@/stores";
|
||||||
|
|
||||||
import App from './App.vue'
|
import router from "./router";
|
||||||
import router from './router'
|
import App from "@/pages/index.vue";
|
||||||
import './style.css'
|
import "./style.css";
|
||||||
|
|
||||||
const app = createApp(App)
|
const appContainer = document.createElement("div");
|
||||||
|
appContainer.setAttribute("style", "text-rendering: geometricPrecision;letter-spacing: -0.1px;");
|
||||||
|
document.body.appendChild(appContainer);
|
||||||
|
|
||||||
app.use(createPinia())
|
const app = createApp(App);
|
||||||
app.use(router)
|
|
||||||
|
|
||||||
app.mount('#app')
|
app.use(pinia);
|
||||||
|
app.use(router);
|
||||||
|
|
||||||
|
app.mount(appContainer);
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { HTMLAttributes } from "vue";
|
||||||
|
|
||||||
|
import { GalleryVerticalEnd, Shuffle } from "lucide-vue-next";
|
||||||
|
|
||||||
|
import { cn } from "@/lib/utils";
|
||||||
|
import { Button } from "@/components/ui/button";
|
||||||
|
import {
|
||||||
|
Field,
|
||||||
|
FieldDescription,
|
||||||
|
FieldGroup,
|
||||||
|
FieldLabel,
|
||||||
|
FieldSeparator,
|
||||||
|
} from "@/components/ui/field";
|
||||||
|
import { InputGroup, InputGroupInput, InputGroupAddon } from "@/components/ui/input-group";
|
||||||
|
import { Kbd } from "@/components/ui/kbd";
|
||||||
|
import { useDnfHelperStore } from "@/stores/dnfhelper";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
class?: HTMLAttributes["class"];
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const helperId = ref("");
|
||||||
|
|
||||||
|
const onSubmit = async (e: Event) => {
|
||||||
|
e.preventDefault();
|
||||||
|
await useDnfHelperStore().refleshHelperInfo(helperId.value);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div :class="cn('flex flex-col gap-6', props.class)">
|
||||||
|
<form @submit="onSubmit">
|
||||||
|
<FieldGroup>
|
||||||
|
<div class="flex flex-col items-center gap-2 text-center">
|
||||||
|
<a href="#" class="flex flex-col items-center gap-2 font-medium">
|
||||||
|
<div class="flex size-8 items-center justify-center rounded-md">
|
||||||
|
<GalleryVerticalEnd class="size-6" />
|
||||||
|
</div>
|
||||||
|
<span class="sr-only">DNF计算器</span>
|
||||||
|
</a>
|
||||||
|
<!-- <h1 class="text-xl font-bold">输入助手ID</h1> -->
|
||||||
|
<!-- <FieldDescription>请输入助手的社区ID </FieldDescription> -->
|
||||||
|
</div>
|
||||||
|
<Field class="flex flex-col items-center">
|
||||||
|
<FieldLabel for="helperId" class="sr-only"> 助手ID </FieldLabel>
|
||||||
|
<InputGroup>
|
||||||
|
<InputGroupInput
|
||||||
|
id="helperId"
|
||||||
|
type="number"
|
||||||
|
placeholder="助手社区ID"
|
||||||
|
required
|
||||||
|
v-model="helperId"
|
||||||
|
/>
|
||||||
|
<InputGroupAddon>
|
||||||
|
<Shuffle />
|
||||||
|
</InputGroupAddon>
|
||||||
|
<InputGroupAddon align="inline-end">
|
||||||
|
<Kbd>Enter</Kbd>
|
||||||
|
</InputGroupAddon>
|
||||||
|
</InputGroup>
|
||||||
|
<!-- <FieldDescription class="text-center">
|
||||||
|
Didn't receive the code? <a href="#">Resend</a>
|
||||||
|
</FieldDescription> -->
|
||||||
|
</Field>
|
||||||
|
<Field>
|
||||||
|
<Button class="self-center w-sm!" type="submit"> 确认 </Button>
|
||||||
|
</Field>
|
||||||
|
</FieldGroup>
|
||||||
|
</form>
|
||||||
|
<FieldSeparator class="w-sm self-center">没有助手ID</FieldSeparator>
|
||||||
|
<FieldDescription class="px-6 text-center">
|
||||||
|
<Button variant="outline"> 选择职业 </Button>
|
||||||
|
</FieldDescription>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { useDnfHelperStore } from "@/stores/dnfhelper";
|
||||||
|
import Bind from "./bind.vue";
|
||||||
|
import List from "./list.vue";
|
||||||
|
|
||||||
|
const helperStore = useDnfHelperStore();
|
||||||
|
|
||||||
|
const listInfo = computed(() => helperStore.helperInfo?.roleList ?? []);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<template v-if="listInfo.length == 0">
|
||||||
|
<Bind class="self-center justify-center w-fit !max-w-sm h-full" />
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<List :list="listInfo" />
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import {
|
||||||
|
Card,
|
||||||
|
CardContent,
|
||||||
|
CardDescription,
|
||||||
|
CardFooter,
|
||||||
|
CardHeader,
|
||||||
|
CardTitle,
|
||||||
|
} from "@/components/ui/card";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
list: {
|
||||||
|
roleId: string;
|
||||||
|
roleName: string;
|
||||||
|
roleJob: string;
|
||||||
|
avatarLink: string;
|
||||||
|
fame: number;
|
||||||
|
}[];
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const { list } = toRefs(props);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-4 p-5 box-border">
|
||||||
|
<template v-for="item in list" :key="item.roleId">
|
||||||
|
<Card class="w-full">
|
||||||
|
<CardHeader>
|
||||||
|
<CardTitle>{{ item.roleJob }}</CardTitle>
|
||||||
|
</CardHeader>
|
||||||
|
<CardContent class="flex items-center justify-center h-sm">
|
||||||
|
<img :src="item.avatarLink" alt="avatar" class="w-auto h-sm rounded-full object-cover" />
|
||||||
|
</CardContent>
|
||||||
|
<CardFooter class="flex justify-between">
|
||||||
|
<span>{{ item.roleName }}</span>
|
||||||
|
<span>{{ item.fame }} </span>
|
||||||
|
</CardFooter>
|
||||||
|
</Card>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import AppSidebar from "@/components/AppSidebar.vue";
|
import AppSidebar from "@/components/AppSidebar.vue";
|
||||||
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar";
|
import { SidebarInset, SidebarProvider } from "@/components/ui/sidebar";
|
||||||
import OTPForm from "@/components/OTPForm.vue";
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -9,13 +8,7 @@ import OTPForm from "@/components/OTPForm.vue";
|
|||||||
<div class="flex w-full">
|
<div class="flex w-full">
|
||||||
<AppSidebar />
|
<AppSidebar />
|
||||||
<SidebarInset>
|
<SidebarInset>
|
||||||
<div
|
<router-view />
|
||||||
class="bg-background flex min-h-svh flex-col items-center justify-center gap-6 p-6 md:p-10"
|
|
||||||
>
|
|
||||||
<div class="w-full max-w-xl">
|
|
||||||
<OTPForm />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- router-view -->
|
<!-- router-view -->
|
||||||
</SidebarInset>
|
</SidebarInset>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,12 +1,23 @@
|
|||||||
import { createRouter, createWebHistory } from "vue-router";
|
import { createRouter, createWebHistory } from "vue-router";
|
||||||
import App from "../App.vue";
|
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(import.meta.env.BASE_URL),
|
history: createWebHistory(import.meta.env.BASE_URL),
|
||||||
routes: [
|
routes: [
|
||||||
{
|
{
|
||||||
path: "/",
|
path: "/",
|
||||||
component: App,
|
name: "home",
|
||||||
|
component: () => import("@/pages/index.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "/dcalc",
|
||||||
|
name: "dcalc",
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: "/dcalc/dnfhelper",
|
||||||
|
name: "dnfhelper",
|
||||||
|
component: () => import("@/pages/Dcalc/DnfHelper/index.vue"),
|
||||||
|
},
|
||||||
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,293 @@
|
|||||||
|
import { defineStore } from "pinia";
|
||||||
|
import { useInfoStore } from "./info";
|
||||||
|
import api from "@/api";
|
||||||
|
import type { IEquipment } from "@/api/info/type";
|
||||||
|
import type { IResultSkillCount } from "@/api/calc/type";
|
||||||
|
// | '上衣'
|
||||||
|
// | '头肩'
|
||||||
|
// | '下装'
|
||||||
|
// | '腰带'
|
||||||
|
// | '鞋'
|
||||||
|
// | '手镯'
|
||||||
|
// | '项链'
|
||||||
|
// | '戒指'
|
||||||
|
// | '耳环'
|
||||||
|
// | '辅助装备'
|
||||||
|
// | '魔法石'
|
||||||
|
// | '武器',
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export interface IConfigEquip {
|
||||||
|
id: string;
|
||||||
|
reinforce: number;
|
||||||
|
reinforceType: number;
|
||||||
|
enchant: string;
|
||||||
|
emblem_0: string;
|
||||||
|
emblem_1: string;
|
||||||
|
upgrade: number;
|
||||||
|
refine: number;
|
||||||
|
adaptation: number;
|
||||||
|
fusion: string;
|
||||||
|
precision: number;
|
||||||
|
weaponFusion: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IConfigOath {
|
||||||
|
id: string;
|
||||||
|
adaptation: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IConfigEmblem {
|
||||||
|
lv: number;
|
||||||
|
items: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IConfig {
|
||||||
|
skills: Record<string, { lv: number; vp: number; up: number }>;
|
||||||
|
equips: Record<string, IConfigEquip>;
|
||||||
|
oaths: Record<string, IConfigOath>;
|
||||||
|
oathSkill: string;
|
||||||
|
jades: Record<
|
||||||
|
string,
|
||||||
|
{
|
||||||
|
id: number;
|
||||||
|
value: number;
|
||||||
|
}
|
||||||
|
>;
|
||||||
|
avatar: Record<
|
||||||
|
string,
|
||||||
|
{
|
||||||
|
id: string;
|
||||||
|
enchant: string;
|
||||||
|
emblem_0: string;
|
||||||
|
emblem_1: string;
|
||||||
|
option: string;
|
||||||
|
}
|
||||||
|
>;
|
||||||
|
sundry: Record<string, unknown>;
|
||||||
|
bindAwake: number;
|
||||||
|
/** 系统奶 */
|
||||||
|
DSB: boolean;
|
||||||
|
/** 奶 */
|
||||||
|
BUFF: boolean;
|
||||||
|
options: Record<string, number>;
|
||||||
|
avatarLink: string;
|
||||||
|
emblems: Record<string, IConfigEmblem>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const defaultEqusConfig = {
|
||||||
|
id: "",
|
||||||
|
reinforce: 0,
|
||||||
|
reinforceType: 0,
|
||||||
|
enchant: "",
|
||||||
|
emblem_0: "",
|
||||||
|
emblem_1: "",
|
||||||
|
upgrade: 0,
|
||||||
|
refine: 0,
|
||||||
|
adaptation: 0,
|
||||||
|
fusion: "",
|
||||||
|
precision: 0,
|
||||||
|
weaponFusion: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
const defaultAvatarConfig = {
|
||||||
|
id: "",
|
||||||
|
enchant: "",
|
||||||
|
emblem_0: "",
|
||||||
|
emblem_1: "",
|
||||||
|
option: "0",
|
||||||
|
};
|
||||||
|
|
||||||
|
const defaultOathConfig = {
|
||||||
|
id: "",
|
||||||
|
adaptation: 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
const defaultEmblemConfig = {
|
||||||
|
lv: 0,
|
||||||
|
items: ["", "", "", "", "", ""],
|
||||||
|
};
|
||||||
|
|
||||||
|
export const useConfigStore = defineStore("configStore", () => {
|
||||||
|
const config = ref<IConfig>({
|
||||||
|
skills: {},
|
||||||
|
equips: {},
|
||||||
|
oaths: {},
|
||||||
|
oathSkill: "1",
|
||||||
|
jades: {},
|
||||||
|
avatar: {},
|
||||||
|
sundry: {},
|
||||||
|
bindAwake: 50,
|
||||||
|
DSB: false,
|
||||||
|
BUFF: false,
|
||||||
|
options: {},
|
||||||
|
avatarLink: "",
|
||||||
|
emblems: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
const skillCountConfig = ref<IResultSkillCount[]>([]);
|
||||||
|
|
||||||
|
const loadConfig = () => {
|
||||||
|
const infoStore = useInfoStore();
|
||||||
|
const alter = infoStore.infos?.alter;
|
||||||
|
|
||||||
|
if (alter) {
|
||||||
|
const localConfig = localStorage.getItem(`dcalc/${alter}/config`);
|
||||||
|
const localSkillConfig = localStorage.getItem(`dcalc/${alter}/config/skillCount`);
|
||||||
|
if (localConfig) {
|
||||||
|
config.value = JSON.parse(localConfig);
|
||||||
|
}
|
||||||
|
if (localSkillConfig) {
|
||||||
|
skillCountConfig.value = JSON.parse(localSkillConfig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!config.value) {
|
||||||
|
config.value = {
|
||||||
|
skills: {},
|
||||||
|
equips: {},
|
||||||
|
oaths: {},
|
||||||
|
oathSkill: "1",
|
||||||
|
jades: {},
|
||||||
|
avatar: {},
|
||||||
|
sundry: {},
|
||||||
|
bindAwake: 50,
|
||||||
|
DSB: false,
|
||||||
|
BUFF: false,
|
||||||
|
options: {},
|
||||||
|
avatarLink: "",
|
||||||
|
emblems: {},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (!config.value?.equips) config.value.equips = {};
|
||||||
|
if (!config.value?.skills) config.value.skills = {};
|
||||||
|
if (!config.value?.jades) config.value.jades = {};
|
||||||
|
if (!config.value?.avatar) config.value.avatar = {};
|
||||||
|
if (!config.value?.sundry) config.value.sundry = {};
|
||||||
|
if (!config.value?.bindAwake) config.value.bindAwake = 50;
|
||||||
|
if (!config.value?.options) config.value.options = {};
|
||||||
|
if (!config.value?.oaths) config.value.oaths = {};
|
||||||
|
if (!config.value?.emblems) config.value.emblems = {};
|
||||||
|
|
||||||
|
const part = [...infoStore.parts, "宠物", "副武器"].filter(
|
||||||
|
(a) => !config.value?.equips.hasOwnProperty(a),
|
||||||
|
);
|
||||||
|
const avatarPart = infoStore.avatarParts
|
||||||
|
.filter((a) => a != "宠物")
|
||||||
|
.filter((a) => !config.value?.avatar.hasOwnProperty(a));
|
||||||
|
|
||||||
|
const skillIDs = infoStore.skills
|
||||||
|
.map((skill) => skill.id.toString())
|
||||||
|
.filter((a) => !config.value?.skills.hasOwnProperty(a));
|
||||||
|
|
||||||
|
part.forEach((p) => {
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
|
config.value && (config.value.equips[p] = { ...defaultEqusConfig });
|
||||||
|
});
|
||||||
|
|
||||||
|
avatarPart.forEach((p) => {
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
|
config.value && (config.value.avatar[p] = { ...defaultAvatarConfig });
|
||||||
|
});
|
||||||
|
|
||||||
|
infoStore.oathParts.forEach((p) => {
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
|
config.value &&
|
||||||
|
!config.value?.oaths.hasOwnProperty(p) &&
|
||||||
|
(config.value.oaths[p.toString()] = { ...defaultOathConfig });
|
||||||
|
});
|
||||||
|
|
||||||
|
infoStore.options.forEach((option) => {
|
||||||
|
if (Object.keys(config.value.options).includes(option.id.toString())) return;
|
||||||
|
config.value.options[option.id.toString()] = 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
skillIDs.forEach((id) => {
|
||||||
|
// oxlint-disable-next-line no-unused-expressions
|
||||||
|
config.value &&
|
||||||
|
(config.value.skills[id] = {
|
||||||
|
lv: infoStore.skills.find((skill) => skill.id.toString() === id)?.maxLearnLv ?? 0,
|
||||||
|
vp: 0,
|
||||||
|
up: 0,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
(
|
||||||
|
["0", "1", "2", "3"].filter((key) => !Object.keys(config.value.jades).includes(key)) ?? []
|
||||||
|
).forEach((key) => {
|
||||||
|
config.value.jades[key] = {
|
||||||
|
id: -1,
|
||||||
|
value: 0,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const saveConfig = () => {
|
||||||
|
const infoStore = useInfoStore();
|
||||||
|
const alter = infoStore.infos?.alter;
|
||||||
|
if (alter) {
|
||||||
|
localStorage.setItem(`dcalc/${alter}/config`, JSON.stringify(config.value));
|
||||||
|
localStorage.setItem(
|
||||||
|
`dcalc/${alter}/config/skillCount`,
|
||||||
|
JSON.stringify(skillCountConfig.value),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const calc = async () => {
|
||||||
|
if (!useInfoStore().infos?.alter) return undefined;
|
||||||
|
const res = await api.calc(config.value);
|
||||||
|
if (res.suits.oath?.suitId != res.suits.suit?.suitId) {
|
||||||
|
config.value.oathSkill = "1";
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
const chooseEqu = (
|
||||||
|
equip: IEquipment | undefined,
|
||||||
|
isFusion: boolean = false,
|
||||||
|
isSubWeapon: boolean = false,
|
||||||
|
) => {
|
||||||
|
if (!equip) return;
|
||||||
|
const part = isSubWeapon
|
||||||
|
? "副武器"
|
||||||
|
: equip?.itemType == "武器"
|
||||||
|
? "武器"
|
||||||
|
: equip?.itemDetailType;
|
||||||
|
if (equip && config.value.equips[part]) {
|
||||||
|
const key = isFusion ? "fusion" : "id";
|
||||||
|
if (config.value.equips[part][key] == equip.id) {
|
||||||
|
config.value.equips[part][key] = "";
|
||||||
|
} else {
|
||||||
|
config.value.equips[part][key] = equip.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const result = useAsyncState(
|
||||||
|
() => {
|
||||||
|
return calc();
|
||||||
|
},
|
||||||
|
{
|
||||||
|
uuid: "",
|
||||||
|
skills: [],
|
||||||
|
info: [],
|
||||||
|
suits: {},
|
||||||
|
buffer: false,
|
||||||
|
},
|
||||||
|
{ resetOnExecute: false },
|
||||||
|
);
|
||||||
|
|
||||||
|
return {
|
||||||
|
config,
|
||||||
|
loadConfig,
|
||||||
|
saveConfig,
|
||||||
|
calc,
|
||||||
|
result,
|
||||||
|
chooseEqu,
|
||||||
|
skillCountConfig,
|
||||||
|
defaultEqusConfig,
|
||||||
|
defaultAvatarConfig,
|
||||||
|
defaultOathConfig,
|
||||||
|
defaultEmblemConfig,
|
||||||
|
};
|
||||||
|
});
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
import { ref, computed } from 'vue'
|
|
||||||
import { defineStore } from 'pinia'
|
|
||||||
|
|
||||||
export const useCounterStore = defineStore('counter', () => {
|
|
||||||
const count = ref(0)
|
|
||||||
const doubleCount = computed(() => count.value * 2)
|
|
||||||
function increment() {
|
|
||||||
count.value++
|
|
||||||
}
|
|
||||||
|
|
||||||
return { count, doubleCount, increment }
|
|
||||||
})
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
import { defineStore } from "pinia";
|
||||||
|
import api from "@/api";
|
||||||
|
import type { IHelperInfo } from "@/api/info/type";
|
||||||
|
|
||||||
|
export const useDnfHelperStore = defineStore("dnfHelperStore", () => {
|
||||||
|
const helperInfo = useLocalStorage<IHelperInfo | null>("dnfHelperInfo", null, {
|
||||||
|
serializer: {
|
||||||
|
read: (v) => (v ? JSON.parse(v) : null),
|
||||||
|
write: (v) => JSON.stringify(v),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const refleshHelperInfo = async (uid: string) => {
|
||||||
|
const data = await api.getHelperList(uid);
|
||||||
|
console.log("helperInfo", data);
|
||||||
|
if (data) {
|
||||||
|
helperInfo.value = data;
|
||||||
|
console.log(helperInfo.value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const logout = () => {
|
||||||
|
helperInfo.value = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
helperInfo,
|
||||||
|
refleshHelperInfo,
|
||||||
|
logout,
|
||||||
|
};
|
||||||
|
});
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import { createPinia } from 'pinia'
|
||||||
|
|
||||||
|
export * from './info'
|
||||||
|
export * from './config'
|
||||||
|
|
||||||
|
export const pinia = createPinia()
|
||||||
@@ -0,0 +1,194 @@
|
|||||||
|
import api from '@/api'
|
||||||
|
import type { ICharacterInfo, IEquipment, ISuit } from '@/api/info/type'
|
||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { useConfigStore } from './config'
|
||||||
|
import type { IResult, IResultSkill, IResultSkillCount } from '@/api/calc/type'
|
||||||
|
|
||||||
|
export const useInfoStore = defineStore('infoStore', () => {
|
||||||
|
const alter_token = ref<string>('')
|
||||||
|
const infos = ref<ICharacterInfo | null>(null)
|
||||||
|
|
||||||
|
const oathCache = ref<
|
||||||
|
{
|
||||||
|
suitId: string
|
||||||
|
skillId: string
|
||||||
|
rarity: string
|
||||||
|
lv: number
|
||||||
|
data: ISuit
|
||||||
|
}[]
|
||||||
|
>([])
|
||||||
|
|
||||||
|
const skills = computed(() => infos.value?.skills ?? [])
|
||||||
|
|
||||||
|
const equips = computed(() => infos.value?.equips ?? [])
|
||||||
|
|
||||||
|
const suits = computed(() => infos.value?.suits ?? [])
|
||||||
|
|
||||||
|
const enchants = computed(() => infos.value?.enchants ?? [])
|
||||||
|
|
||||||
|
const emblems = computed(() => infos.value?.emblems ?? [])
|
||||||
|
|
||||||
|
// const stones = computed(() => infos.value?.stones ?? [])
|
||||||
|
|
||||||
|
const avatars = computed(() => infos.value?.avatar ?? {})
|
||||||
|
|
||||||
|
const jades = computed(() => infos.value?.jades ?? [])
|
||||||
|
|
||||||
|
const sundries = computed(() => infos.value?.sundry ?? {})
|
||||||
|
|
||||||
|
const options = computed(() => infos.value?.options ?? [])
|
||||||
|
|
||||||
|
const oaths = computed(() => {
|
||||||
|
const origin = infos.value?.oaths ?? []
|
||||||
|
const result: IEquipment[] = []
|
||||||
|
origin.forEach((o) => {
|
||||||
|
o.position.forEach((p, i) => {
|
||||||
|
result.push({
|
||||||
|
...o,
|
||||||
|
oathPos: p,
|
||||||
|
displayUrl: o.wearUrl?.[parseInt(p)]
|
||||||
|
? `/equipment/icon/oathprimer/primer_equip/${o.wearUrl?.[parseInt(p)]}`
|
||||||
|
: o.imageUrl,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
})
|
||||||
|
|
||||||
|
const getOathInfo = async (suitId: string, skillId: string, rarity: string, lv: number) => {
|
||||||
|
const res = oathCache.value.find(
|
||||||
|
(o) => o.suitId === suitId && o.skillId === skillId && o.rarity === rarity && o.lv === lv,
|
||||||
|
)
|
||||||
|
if (res) {
|
||||||
|
return {
|
||||||
|
...res.data,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const data: ISuit = await api.getOathInfo(suitId, skillId, rarity, lv)
|
||||||
|
oathCache.value.push({ suitId, skillId, rarity, lv, data })
|
||||||
|
return {
|
||||||
|
...data,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const oathSkills = computed(() => {
|
||||||
|
const origin = infos.value?.oaths_skills
|
||||||
|
if (!origin) return origin
|
||||||
|
|
||||||
|
const skillOrder = ['2', '1', '3']
|
||||||
|
|
||||||
|
return Object.fromEntries(
|
||||||
|
Object.entries(origin).map(([key, value]) => [
|
||||||
|
key,
|
||||||
|
{
|
||||||
|
...value,
|
||||||
|
skills: [...value.skills].sort((left, right) => {
|
||||||
|
const leftIndex = skillOrder.indexOf(left.skillId)
|
||||||
|
const rightIndex = skillOrder.indexOf(right.skillId)
|
||||||
|
const normalizedLeftIndex = leftIndex === -1 ? skillOrder.length : leftIndex
|
||||||
|
const normalizedRightIndex = rightIndex === -1 ? skillOrder.length : rightIndex
|
||||||
|
|
||||||
|
return normalizedLeftIndex - normalizedRightIndex
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
const standardUUID = ref<string>()
|
||||||
|
|
||||||
|
const setStandard = (
|
||||||
|
result?: IResult,
|
||||||
|
skillCount?: {
|
||||||
|
count: number
|
||||||
|
mode: string
|
||||||
|
name: string
|
||||||
|
}[],
|
||||||
|
) => {
|
||||||
|
if (!result) {
|
||||||
|
if (!!standardUUID.value) {
|
||||||
|
sessionStorage.removeItem(standardUUID.value)
|
||||||
|
}
|
||||||
|
standardUUID.value = undefined
|
||||||
|
} else {
|
||||||
|
standardUUID.value = result.uuid
|
||||||
|
sessionStorage.setItem(result.uuid, JSON.stringify({ skills: result.skills, skillCount }))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const standard = computed(() => {
|
||||||
|
const value = sessionStorage.getItem(standardUUID.value ?? '')
|
||||||
|
if (!value) return undefined
|
||||||
|
else return JSON.parse(value) as { skills: IResultSkill[]; skillCount: IResultSkillCount[] }
|
||||||
|
})
|
||||||
|
|
||||||
|
const parts = [
|
||||||
|
'头肩',
|
||||||
|
'上衣',
|
||||||
|
'下装',
|
||||||
|
'腰带',
|
||||||
|
'鞋',
|
||||||
|
'武器',
|
||||||
|
'称号',
|
||||||
|
'手镯',
|
||||||
|
'项链',
|
||||||
|
'辅助装备',
|
||||||
|
'戒指',
|
||||||
|
'耳环',
|
||||||
|
'魔法石',
|
||||||
|
'宠物',
|
||||||
|
]
|
||||||
|
|
||||||
|
const avatarParts = [
|
||||||
|
'武器装扮',
|
||||||
|
'头部',
|
||||||
|
'帽子',
|
||||||
|
'脸部',
|
||||||
|
'光环',
|
||||||
|
'胸部',
|
||||||
|
'上衣',
|
||||||
|
'皮肤',
|
||||||
|
'快捷栏装备',
|
||||||
|
'腰带',
|
||||||
|
'下装',
|
||||||
|
'鞋',
|
||||||
|
'宠物',
|
||||||
|
'宠物装备-红',
|
||||||
|
'宠物装备-绿',
|
||||||
|
'宠物装备-蓝',
|
||||||
|
]
|
||||||
|
|
||||||
|
const oathParts = Array.from({ length: 12 }, (_, i) => i.toString())
|
||||||
|
|
||||||
|
const emblemParts = ['彩色', '红色', '蓝色', '绿色', '黄色', '白金']
|
||||||
|
|
||||||
|
const createCharacter = async (alter: string, equVersion?: string) => {
|
||||||
|
const time = new Date().getTime()
|
||||||
|
alter_token.value = btoa(JSON.stringify({ alter, equVersion, time }))
|
||||||
|
infos.value = await api.characterInfo()
|
||||||
|
useConfigStore().loadConfig()
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
alter_token,
|
||||||
|
infos,
|
||||||
|
skills,
|
||||||
|
equips,
|
||||||
|
suits,
|
||||||
|
createCharacter,
|
||||||
|
enchants,
|
||||||
|
emblems,
|
||||||
|
parts,
|
||||||
|
oaths,
|
||||||
|
avatarParts,
|
||||||
|
oathParts,
|
||||||
|
emblemParts,
|
||||||
|
avatars,
|
||||||
|
jades,
|
||||||
|
setStandard,
|
||||||
|
standard,
|
||||||
|
sundries,
|
||||||
|
options,
|
||||||
|
oathSkills,
|
||||||
|
getOathInfo,
|
||||||
|
}
|
||||||
|
})
|
||||||
+306
@@ -0,0 +1,306 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
/* prettier-ignore */
|
||||||
|
// @ts-nocheck
|
||||||
|
// noinspection JSUnusedGlobalSymbols
|
||||||
|
// Generated by unplugin-auto-import
|
||||||
|
// biome-ignore lint: disable
|
||||||
|
export {}
|
||||||
|
declare global {
|
||||||
|
const EffectScope: typeof import('vue').EffectScope
|
||||||
|
const asyncComputed: typeof import('@vueuse/core').asyncComputed
|
||||||
|
const autoResetRef: typeof import('@vueuse/core').autoResetRef
|
||||||
|
const computed: typeof import('vue').computed
|
||||||
|
const computedAsync: typeof import('@vueuse/core').computedAsync
|
||||||
|
const computedEager: typeof import('@vueuse/core').computedEager
|
||||||
|
const computedInject: typeof import('@vueuse/core').computedInject
|
||||||
|
const computedWithControl: typeof import('@vueuse/core').computedWithControl
|
||||||
|
const controlledComputed: typeof import('@vueuse/core').controlledComputed
|
||||||
|
const controlledRef: typeof import('@vueuse/core').controlledRef
|
||||||
|
const createApp: typeof import('vue').createApp
|
||||||
|
const createDisposableDirective: typeof import('@vueuse/core').createDisposableDirective
|
||||||
|
const createEventHook: typeof import('@vueuse/core').createEventHook
|
||||||
|
const createGlobalState: typeof import('@vueuse/core').createGlobalState
|
||||||
|
const createInjectionState: typeof import('@vueuse/core').createInjectionState
|
||||||
|
const createReactiveFn: typeof import('@vueuse/core').createReactiveFn
|
||||||
|
const createRef: typeof import('@vueuse/core').createRef
|
||||||
|
const createReusableTemplate: typeof import('@vueuse/core').createReusableTemplate
|
||||||
|
const createSharedComposable: typeof import('@vueuse/core').createSharedComposable
|
||||||
|
const createTemplatePromise: typeof import('@vueuse/core').createTemplatePromise
|
||||||
|
const createUnrefFn: typeof import('@vueuse/core').createUnrefFn
|
||||||
|
const customRef: typeof import('vue').customRef
|
||||||
|
const debouncedRef: typeof import('@vueuse/core').debouncedRef
|
||||||
|
const debouncedWatch: typeof import('@vueuse/core').debouncedWatch
|
||||||
|
const defineAsyncComponent: typeof import('vue').defineAsyncComponent
|
||||||
|
const defineComponent: typeof import('vue').defineComponent
|
||||||
|
const eagerComputed: typeof import('@vueuse/core').eagerComputed
|
||||||
|
const effectScope: typeof import('vue').effectScope
|
||||||
|
const extendRef: typeof import('@vueuse/core').extendRef
|
||||||
|
const getCurrentInstance: typeof import('vue').getCurrentInstance
|
||||||
|
const getCurrentScope: typeof import('vue').getCurrentScope
|
||||||
|
const getCurrentWatcher: typeof import('vue').getCurrentWatcher
|
||||||
|
const h: typeof import('vue').h
|
||||||
|
const ignorableWatch: typeof import('@vueuse/core').ignorableWatch
|
||||||
|
const inject: typeof import('vue').inject
|
||||||
|
const injectLocal: typeof import('@vueuse/core').injectLocal
|
||||||
|
const isDefined: typeof import('@vueuse/core').isDefined
|
||||||
|
const isProxy: typeof import('vue').isProxy
|
||||||
|
const isReactive: typeof import('vue').isReactive
|
||||||
|
const isReadonly: typeof import('vue').isReadonly
|
||||||
|
const isRef: typeof import('vue').isRef
|
||||||
|
const isShallow: typeof import('vue').isShallow
|
||||||
|
const makeDestructurable: typeof import('@vueuse/core').makeDestructurable
|
||||||
|
const markRaw: typeof import('vue').markRaw
|
||||||
|
const nextTick: typeof import('vue').nextTick
|
||||||
|
const onActivated: typeof import('vue').onActivated
|
||||||
|
const onBeforeMount: typeof import('vue').onBeforeMount
|
||||||
|
const onBeforeRouteLeave: typeof import('vue-router').onBeforeRouteLeave
|
||||||
|
const onBeforeRouteUpdate: typeof import('vue-router').onBeforeRouteUpdate
|
||||||
|
const onBeforeUnmount: typeof import('vue').onBeforeUnmount
|
||||||
|
const onBeforeUpdate: typeof import('vue').onBeforeUpdate
|
||||||
|
const onClickOutside: typeof import('@vueuse/core').onClickOutside
|
||||||
|
const onDeactivated: typeof import('vue').onDeactivated
|
||||||
|
const onElementRemoval: typeof import('@vueuse/core').onElementRemoval
|
||||||
|
const onErrorCaptured: typeof import('vue').onErrorCaptured
|
||||||
|
const onKeyStroke: typeof import('@vueuse/core').onKeyStroke
|
||||||
|
const onLongPress: typeof import('@vueuse/core').onLongPress
|
||||||
|
const onMounted: typeof import('vue').onMounted
|
||||||
|
const onRenderTracked: typeof import('vue').onRenderTracked
|
||||||
|
const onRenderTriggered: typeof import('vue').onRenderTriggered
|
||||||
|
const onScopeDispose: typeof import('vue').onScopeDispose
|
||||||
|
const onServerPrefetch: typeof import('vue').onServerPrefetch
|
||||||
|
const onStartTyping: typeof import('@vueuse/core').onStartTyping
|
||||||
|
const onUnmounted: typeof import('vue').onUnmounted
|
||||||
|
const onUpdated: typeof import('vue').onUpdated
|
||||||
|
const onWatcherCleanup: typeof import('vue').onWatcherCleanup
|
||||||
|
const pausableWatch: typeof import('@vueuse/core').pausableWatch
|
||||||
|
const provide: typeof import('vue').provide
|
||||||
|
const provideLocal: typeof import('@vueuse/core').provideLocal
|
||||||
|
const reactify: typeof import('@vueuse/core').reactify
|
||||||
|
const reactifyObject: typeof import('@vueuse/core').reactifyObject
|
||||||
|
const reactive: typeof import('vue').reactive
|
||||||
|
const reactiveComputed: typeof import('@vueuse/core').reactiveComputed
|
||||||
|
const reactiveOmit: typeof import('@vueuse/core').reactiveOmit
|
||||||
|
const reactivePick: typeof import('@vueuse/core').reactivePick
|
||||||
|
const readonly: typeof import('vue').readonly
|
||||||
|
const ref: typeof import('vue').ref
|
||||||
|
const refAutoReset: typeof import('@vueuse/core').refAutoReset
|
||||||
|
const refDebounced: typeof import('@vueuse/core').refDebounced
|
||||||
|
const refDefault: typeof import('@vueuse/core').refDefault
|
||||||
|
const refManualReset: typeof import('@vueuse/core').refManualReset
|
||||||
|
const refThrottled: typeof import('@vueuse/core').refThrottled
|
||||||
|
const refWithControl: typeof import('@vueuse/core').refWithControl
|
||||||
|
const resolveComponent: typeof import('vue').resolveComponent
|
||||||
|
const shallowReactive: typeof import('vue').shallowReactive
|
||||||
|
const shallowReadonly: typeof import('vue').shallowReadonly
|
||||||
|
const shallowRef: typeof import('vue').shallowRef
|
||||||
|
const syncRef: typeof import('@vueuse/core').syncRef
|
||||||
|
const syncRefs: typeof import('@vueuse/core').syncRefs
|
||||||
|
const templateRef: typeof import('@vueuse/core').templateRef
|
||||||
|
const throttledRef: typeof import('@vueuse/core').throttledRef
|
||||||
|
const throttledWatch: typeof import('@vueuse/core').throttledWatch
|
||||||
|
const toRaw: typeof import('vue').toRaw
|
||||||
|
const toReactive: typeof import('@vueuse/core').toReactive
|
||||||
|
const toRef: typeof import('vue').toRef
|
||||||
|
const toRefs: typeof import('vue').toRefs
|
||||||
|
const toValue: typeof import('vue').toValue
|
||||||
|
const triggerRef: typeof import('vue').triggerRef
|
||||||
|
const tryOnBeforeMount: typeof import('@vueuse/core').tryOnBeforeMount
|
||||||
|
const tryOnBeforeUnmount: typeof import('@vueuse/core').tryOnBeforeUnmount
|
||||||
|
const tryOnMounted: typeof import('@vueuse/core').tryOnMounted
|
||||||
|
const tryOnScopeDispose: typeof import('@vueuse/core').tryOnScopeDispose
|
||||||
|
const tryOnUnmounted: typeof import('@vueuse/core').tryOnUnmounted
|
||||||
|
const unref: typeof import('vue').unref
|
||||||
|
const unrefElement: typeof import('@vueuse/core').unrefElement
|
||||||
|
const until: typeof import('@vueuse/core').until
|
||||||
|
const useActiveElement: typeof import('@vueuse/core').useActiveElement
|
||||||
|
const useAnimate: typeof import('@vueuse/core').useAnimate
|
||||||
|
const useArrayDifference: typeof import('@vueuse/core').useArrayDifference
|
||||||
|
const useArrayEvery: typeof import('@vueuse/core').useArrayEvery
|
||||||
|
const useArrayFilter: typeof import('@vueuse/core').useArrayFilter
|
||||||
|
const useArrayFind: typeof import('@vueuse/core').useArrayFind
|
||||||
|
const useArrayFindIndex: typeof import('@vueuse/core').useArrayFindIndex
|
||||||
|
const useArrayFindLast: typeof import('@vueuse/core').useArrayFindLast
|
||||||
|
const useArrayIncludes: typeof import('@vueuse/core').useArrayIncludes
|
||||||
|
const useArrayJoin: typeof import('@vueuse/core').useArrayJoin
|
||||||
|
const useArrayMap: typeof import('@vueuse/core').useArrayMap
|
||||||
|
const useArrayReduce: typeof import('@vueuse/core').useArrayReduce
|
||||||
|
const useArraySome: typeof import('@vueuse/core').useArraySome
|
||||||
|
const useArrayUnique: typeof import('@vueuse/core').useArrayUnique
|
||||||
|
const useAsyncQueue: typeof import('@vueuse/core').useAsyncQueue
|
||||||
|
const useAsyncState: typeof import('@vueuse/core').useAsyncState
|
||||||
|
const useAttrs: typeof import('vue').useAttrs
|
||||||
|
const useBase64: typeof import('@vueuse/core').useBase64
|
||||||
|
const useBattery: typeof import('@vueuse/core').useBattery
|
||||||
|
const useBluetooth: typeof import('@vueuse/core').useBluetooth
|
||||||
|
const useBreakpoints: typeof import('@vueuse/core').useBreakpoints
|
||||||
|
const useBroadcastChannel: typeof import('@vueuse/core').useBroadcastChannel
|
||||||
|
const useBrowserLocation: typeof import('@vueuse/core').useBrowserLocation
|
||||||
|
const useCached: typeof import('@vueuse/core').useCached
|
||||||
|
const useClipboard: typeof import('@vueuse/core').useClipboard
|
||||||
|
const useClipboardItems: typeof import('@vueuse/core').useClipboardItems
|
||||||
|
const useCloned: typeof import('@vueuse/core').useCloned
|
||||||
|
const useColorMode: typeof import('@vueuse/core').useColorMode
|
||||||
|
const useConfirmDialog: typeof import('@vueuse/core').useConfirmDialog
|
||||||
|
const useCountdown: typeof import('@vueuse/core').useCountdown
|
||||||
|
const useCounter: typeof import('@vueuse/core').useCounter
|
||||||
|
const useCssModule: typeof import('vue').useCssModule
|
||||||
|
const useCssSupports: typeof import('@vueuse/core').useCssSupports
|
||||||
|
const useCssVar: typeof import('@vueuse/core').useCssVar
|
||||||
|
const useCssVars: typeof import('vue').useCssVars
|
||||||
|
const useCurrentElement: typeof import('@vueuse/core').useCurrentElement
|
||||||
|
const useCycleList: typeof import('@vueuse/core').useCycleList
|
||||||
|
const useDark: typeof import('@vueuse/core').useDark
|
||||||
|
const useDateFormat: typeof import('@vueuse/core').useDateFormat
|
||||||
|
const useDebounce: typeof import('@vueuse/core').useDebounce
|
||||||
|
const useDebounceFn: typeof import('@vueuse/core').useDebounceFn
|
||||||
|
const useDebouncedRefHistory: typeof import('@vueuse/core').useDebouncedRefHistory
|
||||||
|
const useDeviceMotion: typeof import('@vueuse/core').useDeviceMotion
|
||||||
|
const useDeviceOrientation: typeof import('@vueuse/core').useDeviceOrientation
|
||||||
|
const useDevicePixelRatio: typeof import('@vueuse/core').useDevicePixelRatio
|
||||||
|
const useDevicesList: typeof import('@vueuse/core').useDevicesList
|
||||||
|
const useDisplayMedia: typeof import('@vueuse/core').useDisplayMedia
|
||||||
|
const useDocumentVisibility: typeof import('@vueuse/core').useDocumentVisibility
|
||||||
|
const useDraggable: typeof import('@vueuse/core').useDraggable
|
||||||
|
const useDropZone: typeof import('@vueuse/core').useDropZone
|
||||||
|
const useElementBounding: typeof import('@vueuse/core').useElementBounding
|
||||||
|
const useElementByPoint: typeof import('@vueuse/core').useElementByPoint
|
||||||
|
const useElementHover: typeof import('@vueuse/core').useElementHover
|
||||||
|
const useElementSize: typeof import('@vueuse/core').useElementSize
|
||||||
|
const useElementVisibility: typeof import('@vueuse/core').useElementVisibility
|
||||||
|
const useEventBus: typeof import('@vueuse/core').useEventBus
|
||||||
|
const useEventListener: typeof import('@vueuse/core').useEventListener
|
||||||
|
const useEventSource: typeof import('@vueuse/core').useEventSource
|
||||||
|
const useEyeDropper: typeof import('@vueuse/core').useEyeDropper
|
||||||
|
const useFavicon: typeof import('@vueuse/core').useFavicon
|
||||||
|
const useFetch: typeof import('@vueuse/core').useFetch
|
||||||
|
const useFileDialog: typeof import('@vueuse/core').useFileDialog
|
||||||
|
const useFileSystemAccess: typeof import('@vueuse/core').useFileSystemAccess
|
||||||
|
const useFocus: typeof import('@vueuse/core').useFocus
|
||||||
|
const useFocusWithin: typeof import('@vueuse/core').useFocusWithin
|
||||||
|
const useFps: typeof import('@vueuse/core').useFps
|
||||||
|
const useFullscreen: typeof import('@vueuse/core').useFullscreen
|
||||||
|
const useGamepad: typeof import('@vueuse/core').useGamepad
|
||||||
|
const useGeolocation: typeof import('@vueuse/core').useGeolocation
|
||||||
|
const useId: typeof import('vue').useId
|
||||||
|
const useIdle: typeof import('@vueuse/core').useIdle
|
||||||
|
const useImage: typeof import('@vueuse/core').useImage
|
||||||
|
const useInfiniteScroll: typeof import('@vueuse/core').useInfiniteScroll
|
||||||
|
const useIntersectionObserver: typeof import('@vueuse/core').useIntersectionObserver
|
||||||
|
const useInterval: typeof import('@vueuse/core').useInterval
|
||||||
|
const useIntervalFn: typeof import('@vueuse/core').useIntervalFn
|
||||||
|
const useKeyModifier: typeof import('@vueuse/core').useKeyModifier
|
||||||
|
const useLastChanged: typeof import('@vueuse/core').useLastChanged
|
||||||
|
const useLink: typeof import('vue-router').useLink
|
||||||
|
const useLocalStorage: typeof import('@vueuse/core').useLocalStorage
|
||||||
|
const useMagicKeys: typeof import('@vueuse/core').useMagicKeys
|
||||||
|
const useManualRefHistory: typeof import('@vueuse/core').useManualRefHistory
|
||||||
|
const useMediaControls: typeof import('@vueuse/core').useMediaControls
|
||||||
|
const useMediaQuery: typeof import('@vueuse/core').useMediaQuery
|
||||||
|
const useMemoize: typeof import('@vueuse/core').useMemoize
|
||||||
|
const useMemory: typeof import('@vueuse/core').useMemory
|
||||||
|
const useModel: typeof import('vue').useModel
|
||||||
|
const useMounted: typeof import('@vueuse/core').useMounted
|
||||||
|
const useMouse: typeof import('@vueuse/core').useMouse
|
||||||
|
const useMouseInElement: typeof import('@vueuse/core').useMouseInElement
|
||||||
|
const useMousePressed: typeof import('@vueuse/core').useMousePressed
|
||||||
|
const useMutationObserver: typeof import('@vueuse/core').useMutationObserver
|
||||||
|
const useNavigatorLanguage: typeof import('@vueuse/core').useNavigatorLanguage
|
||||||
|
const useNetwork: typeof import('@vueuse/core').useNetwork
|
||||||
|
const useNow: typeof import('@vueuse/core').useNow
|
||||||
|
const useObjectUrl: typeof import('@vueuse/core').useObjectUrl
|
||||||
|
const useOffsetPagination: typeof import('@vueuse/core').useOffsetPagination
|
||||||
|
const useOnline: typeof import('@vueuse/core').useOnline
|
||||||
|
const usePageLeave: typeof import('@vueuse/core').usePageLeave
|
||||||
|
const useParallax: typeof import('@vueuse/core').useParallax
|
||||||
|
const useParentElement: typeof import('@vueuse/core').useParentElement
|
||||||
|
const usePerformanceObserver: typeof import('@vueuse/core').usePerformanceObserver
|
||||||
|
const usePermission: typeof import('@vueuse/core').usePermission
|
||||||
|
const usePointer: typeof import('@vueuse/core').usePointer
|
||||||
|
const usePointerLock: typeof import('@vueuse/core').usePointerLock
|
||||||
|
const usePointerSwipe: typeof import('@vueuse/core').usePointerSwipe
|
||||||
|
const usePreferredColorScheme: typeof import('@vueuse/core').usePreferredColorScheme
|
||||||
|
const usePreferredContrast: typeof import('@vueuse/core').usePreferredContrast
|
||||||
|
const usePreferredDark: typeof import('@vueuse/core').usePreferredDark
|
||||||
|
const usePreferredLanguages: typeof import('@vueuse/core').usePreferredLanguages
|
||||||
|
const usePreferredReducedMotion: typeof import('@vueuse/core').usePreferredReducedMotion
|
||||||
|
const usePreferredReducedTransparency: typeof import('@vueuse/core').usePreferredReducedTransparency
|
||||||
|
const usePrevious: typeof import('@vueuse/core').usePrevious
|
||||||
|
const useRafFn: typeof import('@vueuse/core').useRafFn
|
||||||
|
const useRefHistory: typeof import('@vueuse/core').useRefHistory
|
||||||
|
const useResizeObserver: typeof import('@vueuse/core').useResizeObserver
|
||||||
|
const useRoute: typeof import('vue-router').useRoute
|
||||||
|
const useRouter: typeof import('vue-router').useRouter
|
||||||
|
const useSSRWidth: typeof import('@vueuse/core').useSSRWidth
|
||||||
|
const useScreenOrientation: typeof import('@vueuse/core').useScreenOrientation
|
||||||
|
const useScreenSafeArea: typeof import('@vueuse/core').useScreenSafeArea
|
||||||
|
const useScriptTag: typeof import('@vueuse/core').useScriptTag
|
||||||
|
const useScroll: typeof import('@vueuse/core').useScroll
|
||||||
|
const useScrollLock: typeof import('@vueuse/core').useScrollLock
|
||||||
|
const useSessionStorage: typeof import('@vueuse/core').useSessionStorage
|
||||||
|
const useShare: typeof import('@vueuse/core').useShare
|
||||||
|
const useSlots: typeof import('vue').useSlots
|
||||||
|
const useSorted: typeof import('@vueuse/core').useSorted
|
||||||
|
const useSpeechRecognition: typeof import('@vueuse/core').useSpeechRecognition
|
||||||
|
const useSpeechSynthesis: typeof import('@vueuse/core').useSpeechSynthesis
|
||||||
|
const useStepper: typeof import('@vueuse/core').useStepper
|
||||||
|
const useStorage: typeof import('@vueuse/core').useStorage
|
||||||
|
const useStorageAsync: typeof import('@vueuse/core').useStorageAsync
|
||||||
|
const useStyleTag: typeof import('@vueuse/core').useStyleTag
|
||||||
|
const useSupported: typeof import('@vueuse/core').useSupported
|
||||||
|
const useSwipe: typeof import('@vueuse/core').useSwipe
|
||||||
|
const useTemplateRef: typeof import('vue').useTemplateRef
|
||||||
|
const useTemplateRefsList: typeof import('@vueuse/core').useTemplateRefsList
|
||||||
|
const useTextDirection: typeof import('@vueuse/core').useTextDirection
|
||||||
|
const useTextSelection: typeof import('@vueuse/core').useTextSelection
|
||||||
|
const useTextareaAutosize: typeof import('@vueuse/core').useTextareaAutosize
|
||||||
|
const useThrottle: typeof import('@vueuse/core').useThrottle
|
||||||
|
const useThrottleFn: typeof import('@vueuse/core').useThrottleFn
|
||||||
|
const useThrottledRefHistory: typeof import('@vueuse/core').useThrottledRefHistory
|
||||||
|
const useTimeAgo: typeof import('@vueuse/core').useTimeAgo
|
||||||
|
const useTimeAgoIntl: typeof import('@vueuse/core').useTimeAgoIntl
|
||||||
|
const useTimeout: typeof import('@vueuse/core').useTimeout
|
||||||
|
const useTimeoutFn: typeof import('@vueuse/core').useTimeoutFn
|
||||||
|
const useTimeoutPoll: typeof import('@vueuse/core').useTimeoutPoll
|
||||||
|
const useTimestamp: typeof import('@vueuse/core').useTimestamp
|
||||||
|
const useTitle: typeof import('@vueuse/core').useTitle
|
||||||
|
const useToNumber: typeof import('@vueuse/core').useToNumber
|
||||||
|
const useToString: typeof import('@vueuse/core').useToString
|
||||||
|
const useToggle: typeof import('@vueuse/core').useToggle
|
||||||
|
const useTransition: typeof import('@vueuse/core').useTransition
|
||||||
|
const useUrlSearchParams: typeof import('@vueuse/core').useUrlSearchParams
|
||||||
|
const useUserMedia: typeof import('@vueuse/core').useUserMedia
|
||||||
|
const useVModel: typeof import('@vueuse/core').useVModel
|
||||||
|
const useVModels: typeof import('@vueuse/core').useVModels
|
||||||
|
const useVibrate: typeof import('@vueuse/core').useVibrate
|
||||||
|
const useVirtualList: typeof import('@vueuse/core').useVirtualList
|
||||||
|
const useWakeLock: typeof import('@vueuse/core').useWakeLock
|
||||||
|
const useWebNotification: typeof import('@vueuse/core').useWebNotification
|
||||||
|
const useWebSocket: typeof import('@vueuse/core').useWebSocket
|
||||||
|
const useWebWorker: typeof import('@vueuse/core').useWebWorker
|
||||||
|
const useWebWorkerFn: typeof import('@vueuse/core').useWebWorkerFn
|
||||||
|
const useWindowFocus: typeof import('@vueuse/core').useWindowFocus
|
||||||
|
const useWindowScroll: typeof import('@vueuse/core').useWindowScroll
|
||||||
|
const useWindowSize: typeof import('@vueuse/core').useWindowSize
|
||||||
|
const watch: typeof import('vue').watch
|
||||||
|
const watchArray: typeof import('@vueuse/core').watchArray
|
||||||
|
const watchAtMost: typeof import('@vueuse/core').watchAtMost
|
||||||
|
const watchDebounced: typeof import('@vueuse/core').watchDebounced
|
||||||
|
const watchDeep: typeof import('@vueuse/core').watchDeep
|
||||||
|
const watchEffect: typeof import('vue').watchEffect
|
||||||
|
const watchIgnorable: typeof import('@vueuse/core').watchIgnorable
|
||||||
|
const watchImmediate: typeof import('@vueuse/core').watchImmediate
|
||||||
|
const watchOnce: typeof import('@vueuse/core').watchOnce
|
||||||
|
const watchPausable: typeof import('@vueuse/core').watchPausable
|
||||||
|
const watchPostEffect: typeof import('vue').watchPostEffect
|
||||||
|
const watchSyncEffect: typeof import('vue').watchSyncEffect
|
||||||
|
const watchThrottled: typeof import('@vueuse/core').watchThrottled
|
||||||
|
const watchTriggerable: typeof import('@vueuse/core').watchTriggerable
|
||||||
|
const watchWithFilter: typeof import('@vueuse/core').watchWithFilter
|
||||||
|
const whenever: typeof import('@vueuse/core').whenever
|
||||||
|
}
|
||||||
|
// for type re-export
|
||||||
|
declare global {
|
||||||
|
// @ts-ignore
|
||||||
|
export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, ShallowRef, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
|
||||||
|
import('vue')
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
"ignoreDeprecations": "6.0",
|
"ignoreDeprecations": "6.0",
|
||||||
|
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
|
|
||||||
// Path mapping for cleaner imports.
|
// Path mapping for cleaner imports.
|
||||||
"paths": {
|
"paths": {
|
||||||
@@ -18,5 +18,6 @@
|
|||||||
// `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking.
|
// `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking.
|
||||||
// Specified here to keep it out of the root directory.
|
// Specified here to keep it out of the root directory.
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo"
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo"
|
||||||
}
|
},
|
||||||
|
"composite": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,5 +23,6 @@
|
|||||||
// `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking.
|
// `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking.
|
||||||
// Specified here to keep it out of the root directory.
|
// Specified here to keep it out of the root directory.
|
||||||
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo"
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo"
|
||||||
}
|
},
|
||||||
|
"composite": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import path from 'node:path'
|
import path from "node:path";
|
||||||
|
|
||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from "vite";
|
||||||
import tailwindcss from '@tailwindcss/vite'
|
import tailwindcss from "@tailwindcss/vite";
|
||||||
import vue from '@vitejs/plugin-vue'
|
import vue from "@vitejs/plugin-vue";
|
||||||
import vueJsx from '@vitejs/plugin-vue-jsx'
|
import vueJsx from "@vitejs/plugin-vue-jsx";
|
||||||
import vueDevTools from 'vite-plugin-vue-devtools'
|
import vueDevTools from "vite-plugin-vue-devtools";
|
||||||
|
import AutoImport from "unplugin-auto-import/vite";
|
||||||
|
|
||||||
// https://vite.dev/config/
|
// https://vite.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
@@ -13,10 +14,26 @@ export default defineConfig({
|
|||||||
vue(),
|
vue(),
|
||||||
vueJsx(),
|
vueJsx(),
|
||||||
vueDevTools(),
|
vueDevTools(),
|
||||||
|
AutoImport({
|
||||||
|
imports: ["vue", "vue-router", "@vueuse/core"],
|
||||||
|
include: [
|
||||||
|
/\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
|
||||||
|
/\.vue$/,
|
||||||
|
/\.vue\?vue/, // .vue
|
||||||
|
],
|
||||||
|
dts: "src/types/auto-imports.d.ts", // specify the dts file path
|
||||||
|
// 解决eslint报错问题
|
||||||
|
eslintrc: {
|
||||||
|
// 这里先设置成true然后npm run dev 运行之后会生成 .eslintrc-auto-import.json 文件之后,在改为false
|
||||||
|
enabled: true,
|
||||||
|
filepath: "./.eslintrc-auto-import.json", // 生成的文件路径
|
||||||
|
globalsPropValue: true,
|
||||||
|
},
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
'@': path.resolve(__dirname, './src')
|
"@": path.resolve(__dirname, "./src"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user