Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-05-05 18:59:06 +08:00
co-authored by Copilot
parent 44c9df9b20
commit 01b648a3e7
52 changed files with 2491 additions and 89 deletions
+12
View File
@@ -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:
+56
View File
@@ -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
}
+119
View File
@@ -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));
}
+4
View File
@@ -0,0 +1,4 @@
import info from './info'
import calc from './calc'
export default { ...info, ...calc }
+39
View File
@@ -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;
},
};
});
+227
View File
@@ -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;
}[];
}
+6
View File
@@ -0,0 +1,6 @@
export interface IDataType<T = any> {
code?: number
message: string
data: T
state?: number
}