LiRen-qiu 5 months ago
parent d01b5ff0cd
commit cb058a7d10

@ -0,0 +1,121 @@
// @ts-nocheck
export {};
; declare global {
const __VLS_intrinsicElements: __VLS_IntrinsicElements;
const __VLS_directiveBindingRestFields: { instance: null, oldValue: null, modifiers: any, dir: any };
const __VLS_unref: typeof import('vue').unref;
const __VLS_placeholder: any;
type __VLS_NativeElements = __VLS_SpreadMerge<SVGElementTagNameMap, HTMLElementTagNameMap>;
type __VLS_IntrinsicElements = import('vue/jsx-runtime').JSX.IntrinsicElements;
type __VLS_Element = import('vue/jsx-runtime').JSX.Element;
type __VLS_GlobalComponents = import('vue').GlobalComponents;
type __VLS_GlobalDirectives = import('vue').GlobalDirectives;
type __VLS_IsAny<T> = 0 extends 1 & T ? true : false;
type __VLS_PickNotAny<A, B> = __VLS_IsAny<A> extends true ? B : A;
type __VLS_SpreadMerge<A, B> = Omit<A, keyof B> & B;
type __VLS_WithComponent<N0 extends string, LocalComponents, Self, N1 extends string, N2 extends string, N3 extends string> =
N1 extends keyof LocalComponents ? N1 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N1] } :
N2 extends keyof LocalComponents ? N2 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N2] } :
N3 extends keyof LocalComponents ? N3 extends N0 ? Pick<LocalComponents, N0 extends keyof LocalComponents ? N0 : never> : { [K in N0]: LocalComponents[N3] } :
Self extends object ? { [K in N0]: Self } :
N1 extends keyof __VLS_GlobalComponents ? N1 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N1] } :
N2 extends keyof __VLS_GlobalComponents ? N2 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N2] } :
N3 extends keyof __VLS_GlobalComponents ? N3 extends N0 ? Pick<__VLS_GlobalComponents, N0 extends keyof __VLS_GlobalComponents ? N0 : never> : { [K in N0]: __VLS_GlobalComponents[N3] } :
{ [K in N0]: unknown };
type __VLS_FunctionalComponentProps<T, K> =
'__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: { props?: infer P } } ? NonNullable<P> : never
: T extends (props: infer P, ...args: any) => any ? P :
{};
type __VLS_IsFunction<T, K> = K extends keyof T
? __VLS_IsAny<T[K]> extends false
? unknown extends T[K]
? false
: true
: false
: false;
type __VLS_NormalizeComponentEvent<Props, Events, onEvent extends keyof Props, Event extends keyof Events, CamelizedEvent extends keyof Events> = (
__VLS_IsFunction<Props, onEvent> extends true
? Props
: __VLS_IsFunction<Events, Event> extends true
? { [K in onEvent]?: Events[Event] }
: __VLS_IsFunction<Events, CamelizedEvent> extends true
? { [K in onEvent]?: Events[CamelizedEvent] }
: Props
) & Record<string, unknown>;
// fix https://github.com/vuejs/language-tools/issues/926
type __VLS_UnionToIntersection<U> = (U extends unknown ? (arg: U) => unknown : never) extends ((arg: infer P) => unknown) ? P : never;
type __VLS_OverloadUnionInner<T, U = unknown> = U & T extends (...args: infer A) => infer R
? U extends T
? never
: __VLS_OverloadUnionInner<T, Pick<T, keyof T> & U & ((...args: A) => R)> | ((...args: A) => R)
: never;
type __VLS_OverloadUnion<T> = Exclude<
__VLS_OverloadUnionInner<(() => never) & T>,
T extends () => never ? never : () => never
>;
type __VLS_ConstructorOverloads<T> = __VLS_OverloadUnion<T> extends infer F
? F extends (event: infer E, ...args: infer A) => any
? { [K in E & string]: (...args: A) => void; }
: never
: never;
type __VLS_NormalizeEmits<T> = __VLS_PrettifyGlobal<
__VLS_UnionToIntersection<
__VLS_ConstructorOverloads<T> & {
[K in keyof T]: T[K] extends any[] ? { (...args: T[K]): void } : never
}
>
>;
type __VLS_PrettifyGlobal<T> = { [K in keyof T]: T[K]; } & {};
type __VLS_PickFunctionalComponentCtx<T, K> = NonNullable<__VLS_PickNotAny<
'__ctx' extends keyof __VLS_PickNotAny<K, {}> ? K extends { __ctx?: infer Ctx } ? Ctx : never : any
, T extends (props: any, ctx: infer Ctx) => any ? Ctx : any
>>;
type __VLS_OmitStringIndex<T> = {
[K in keyof T as string extends K ? never : K]: T[K];
};
type __VLS_UseTemplateRef<T> = Readonly<import('vue').ShallowRef<T | null>>;
function __VLS_getVForSourceType<T extends number | string | any[] | Iterable<any>>(source: T): [
item: T extends number ? number
: T extends string ? string
: T extends any[] ? T[number]
: T extends Iterable<infer T1> ? T1
: any,
index: number,
][];
function __VLS_getVForSourceType<T>(source: T): [
item: T[keyof T],
key: keyof T,
index: number,
][];
// @ts-ignore
function __VLS_getSlotParams<T>(slot: T): Parameters<__VLS_PickNotAny<NonNullable<T>, (...args: any[]) => any>>;
// @ts-ignore
function __VLS_getSlotParam<T>(slot: T): Parameters<__VLS_PickNotAny<NonNullable<T>, (...args: any[]) => any>>[0];
function __VLS_asFunctionalDirective<T>(dir: T): T extends import('vue').ObjectDirective
? NonNullable<T['created' | 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeUnmount' | 'unmounted']>
: T extends (...args: any) => any
? T
: (arg1: unknown, arg2: unknown, arg3: unknown, arg4: unknown) => void;
function __VLS_makeOptional<T>(t: T): { [K in keyof T]?: T[K] };
function __VLS_asFunctionalComponent<T, K = T extends new (...args: any) => any ? InstanceType<T> : unknown>(t: T, instance?: K):
T extends new (...args: any) => any
? (props: (K extends { $props: infer Props } ? Props : any) & Record<string, unknown>, ctx?: any) => __VLS_Element & {
__ctx?: {
attrs?: any;
slots?: K extends { $slots: infer Slots } ? Slots : any;
emit?: K extends { $emit: infer Emit } ? Emit : any;
expose?(exposed: K): void;
props?: (K extends { $props: infer Props } ? Props : any) & Record<string, unknown>;
}
}
: T extends () => any ? (props: {}, ctx?: any) => ReturnType<T>
: T extends (...args: any) => any ? T
: (_: {} & Record<string, unknown>, ctx?: any) => { __ctx?: { attrs?: any, expose?: any, slots?: any, emit?: any, props?: {} & Record<string, unknown> } };
function __VLS_functionalComponentArgsRest<T extends (...args: any) => any>(t: T): 2 extends Parameters<T>['length'] ? [any] : [];
function __VLS_asFunctionalElement<T>(tag: T, endTag?: T): (attrs: T & Record<string, unknown>) => void;
function __VLS_asFunctionalSlot<S>(slot: S): (props: NonNullable<S> extends (props: infer P) => any ? P : {}) => void;
function __VLS_tryAsConstant<const T>(t: T): T;
}

@ -9,6 +9,7 @@
"version": "0.1.0",
"dependencies": {
"core-js": "^3.8.3",
"element-plus": "^2.9.7",
"vue": "^3.2.13"
},
"devDependencies": {
@ -1748,6 +1749,15 @@
"node": ">=6.9.0"
}
},
"node_modules/@ctrl/tinycolor": {
"version": "3.6.1",
"resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
"integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/@discoveryjs/json-ext": {
"version": "0.5.7",
"resolved": "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@ -1758,6 +1768,15 @@
"node": ">=10.0.0"
}
},
"node_modules/@element-plus/icons-vue": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
"integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
"license": "MIT",
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "0.4.3",
"resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
@ -1818,6 +1837,31 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@floating-ui/core": {
"version": "1.6.9",
"resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.9.tgz",
"integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/dom": {
"version": "1.6.13",
"resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.13.tgz",
"integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.6.0",
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/utils": {
"version": "0.2.9",
"resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.9.tgz",
"integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
"license": "MIT"
},
"node_modules/@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz",
@ -1997,6 +2041,17 @@
"dev": true,
"license": "MIT"
},
"node_modules/@popperjs/core": {
"name": "@sxzz/popperjs-es",
"version": "2.11.7",
"resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@sideway/address": {
"version": "4.1.5",
"resolved": "https://registry.npmmirror.com/@sideway/address/-/address-4.1.5.tgz",
@ -2198,6 +2253,21 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/lodash": {
"version": "4.17.16",
"resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.16.tgz",
"integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==",
"license": "MIT"
},
"node_modules/@types/lodash-es": {
"version": "4.17.12",
"resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"license": "MIT",
"dependencies": {
"@types/lodash": "*"
}
},
"node_modules/@types/mime": {
"version": "1.3.5",
"resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz",
@ -2310,6 +2380,12 @@
"@types/node": "*"
}
},
"node_modules/@types/web-bluetooth": {
"version": "0.0.16",
"resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
"integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
"license": "MIT"
},
"node_modules/@types/ws": {
"version": "8.18.1",
"resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.18.1.tgz",
@ -3011,6 +3087,94 @@
"dev": true,
"license": "MIT"
},
"node_modules/@vueuse/core": {
"version": "9.13.0",
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz",
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
"license": "MIT",
"dependencies": {
"@types/web-bluetooth": "^0.0.16",
"@vueuse/metadata": "9.13.0",
"@vueuse/shared": "9.13.0",
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/core/node_modules/vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/@vueuse/metadata": {
"version": "9.13.0",
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz",
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared": {
"version": "9.13.0",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"license": "MIT",
"dependencies": {
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared/node_modules/vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/@webassemblyjs/ast": {
"version": "1.14.1",
"resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz",
@ -3470,6 +3634,12 @@
"dev": true,
"license": "MIT"
},
"node_modules/async-validator": {
"version": "4.2.5",
"resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
"license": "MIT"
},
"node_modules/at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz",
@ -4776,6 +4946,12 @@
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT"
},
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
"license": "MIT"
},
"node_modules/debounce": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/debounce/-/debounce-1.2.1.tgz",
@ -5237,6 +5413,32 @@
"dev": true,
"license": "ISC"
},
"node_modules/element-plus": {
"version": "2.9.7",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.9.7.tgz",
"integrity": "sha512-6vjZh5SXBncLhUwJGTVKS5oDljfgGMh6J4zVTeAZK3YdMUN76FgpvHkwwFXocpJpMbii6rDYU3sgie64FyPerQ==",
"license": "MIT",
"dependencies": {
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.3.1",
"@floating-ui/dom": "^1.0.1",
"@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
"@types/lodash": "^4.14.182",
"@types/lodash-es": "^4.17.6",
"@vueuse/core": "^9.1.0",
"async-validator": "^4.2.5",
"dayjs": "^1.11.13",
"escape-html": "^1.0.3",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"lodash-unified": "^1.0.2",
"memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.2.0"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
@ -5388,7 +5590,6 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"dev": true,
"license": "MIT"
},
"node_modules/escape-string-regexp": {
@ -7574,9 +7775,25 @@
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true,
"license": "MIT"
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
"license": "MIT"
},
"node_modules/lodash-unified": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz",
"integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
"license": "MIT",
"peerDependencies": {
"@types/lodash-es": "*",
"lodash": "*",
"lodash-es": "*"
}
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@ -7878,6 +8095,12 @@
"node": ">= 4.0.0"
}
},
"node_modules/memoize-one": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
"license": "MIT"
},
"node_modules/merge-descriptors": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
@ -8317,6 +8540,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
"license": "BSD-3-Clause"
},
"node_modules/npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz",

@ -9,6 +9,7 @@
},
"dependencies": {
"core-js": "^3.8.3",
"element-plus": "^2.9.7",
"vue": "^3.2.13"
},
"devDependencies": {

@ -1,80 +1,57 @@
<template>
<div id="app">
<AppHeader />
<main>
<div class="hero-section">
<div class="container">
<h1>文件转换轻松便捷</h1>
<p>转换文档图片视频和音频 - 支持1100+种格式</p>
<ConversionWidget />
</div>
</div>
</main>
<MainPage />
</div>
</template>
<script>
import AppHeader from './components/layout/Header.vue'
import ConversionWidget from './components/layout/ConversionWidget.vue'
import MainPage from './components/MainPage.vue'
export default {
name: 'App',
components: {
AppHeader,
ConversionWidget
MainPage
}
}
</script>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: #333333;
color: #2c3e50;
}
#app {
width: 100%;
body {
margin: 0;
padding: 0;
background-image: url('./assets/background.png');
background-size: cover;
background-repeat: no-repeat;
background-attachment: fixed;
background-position: center;
min-height: 100vh;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
/* 全局样式 */
.el-button--primary {
background-color: #0066FF;
border-color: #0066FF;
}
.hero-section {
background: linear-gradient(to bottom, #0066FF, #E6F0FF);
padding: 60px 0;
text-align: center;
color: #FFFFFF;
.el-button--primary:hover, .el-button--primary:focus {
background-color: #1473E6;
border-color: #1473E6;
}
.hero-section h1 {
font-size: 2.5rem;
margin-bottom: 1rem;
.el-button--success {
background-color: #66CC33;
border-color: #66CC33;
}
.hero-section p {
font-size: 1.2rem;
margin-bottom: 2rem;
}
@media (max-width: 768px) {
.hero-section h1 {
font-size: 2rem;
}
.hero-section p {
font-size: 1rem;
}
.el-button--success:hover, .el-button--success:focus {
background-color: #5ab930;
border-color: #5ab930;
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

@ -0,0 +1,297 @@
<template>
<div class="upload-container">
<el-upload
class="upload-area"
drag
action="#"
:http-request="handleUpload"
:before-upload="beforeUpload"
:on-progress="onProgress"
:on-success="onSuccess"
:on-error="onError"
accept=".svg,.xlsx,.xls"
:file-list="fileList"
:auto-upload="true"
:limit="1"
:disabled="uploading">
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip">支持上传 SVG Excel 文件</div>
</template>
</el-upload>
<div v-if="uploading" class="upload-progress">
<el-progress :percentage="uploadPercentage" :format="format"></el-progress>
</div>
<div v-if="uploadSuccess" class="operation-buttons">
<el-button type="primary" @click="viewFileContent" :disabled="!uploadSuccess">查看/编辑文件内容</el-button>
</div>
<!-- 文件查看/编辑模态框 -->
<el-dialog
v-model="dialogVisible"
title="文件内容查看/编辑"
width="80%"
:before-close="handleClose">
<div v-if="fileType === 'svg'" class="svg-preview">
<div v-html="fileContent" class="svg-container"></div>
</div>
<div v-else-if="fileType === 'excel'" class="excel-preview">
<!-- Excel数据表格展示 -->
<el-table
:data="tableData"
border
style="width: 100%"
max-height="500px">
<el-table-column
v-for="(column, index) in tableColumns"
:key="index"
:prop="column.prop"
:label="column.label"
:width="column.width">
<template #default="scope">
<el-input v-model="scope.row[column.prop]" size="small"></el-input>
</template>
</el-table-column>
</el-table>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="saveFileContent"></el-button>
</span>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import { UploadFilled } from '@element-plus/icons-vue'
//
// eslint-disable-next-line no-undef
const emit = defineEmits(['file-ready'])
//
const fileList = ref([])
const uploading = ref(false)
const uploadPercentage = ref(0)
const uploadSuccess = ref(false)
const fileType = ref('') // 'svg' 'excel'
const fileContent = ref('')
const dialogVisible = ref(false)
const tableData = ref([])
const tableColumns = ref([])
//
const format = (percentage) => {
return percentage === 100 ? '完成' : `${percentage}%`
}
//
const beforeUpload = (file) => {
const isSVG = file.type === 'image/svg+xml'
const isExcel = file.type === 'application/vnd.ms-excel' ||
file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
if (!isSVG && !isExcel) {
ElMessage.error('只能上传SVG或Excel文件!')
return false
}
return true
}
//
const onProgress = (event) => {
uploading.value = true
uploadPercentage.value = Math.ceil(event.percent)
}
//
const onSuccess = () => {
uploading.value = false
uploadSuccess.value = true
ElMessage.success('文件上传成功!')
}
//
const onError = (err) => {
uploading.value = false
ElMessage.error('文件上传失败!')
console.error('上传错误:', err)
}
//
const handleUpload = (options) => {
const { file } = options
uploading.value = true
uploadPercentage.value = 0
//
const interval = setInterval(() => {
if (uploadPercentage.value < 99) {
uploadPercentage.value += 10
}
}, 300)
//
setTimeout(() => {
clearInterval(interval)
uploadPercentage.value = 100
//
if (file.type === 'image/svg+xml') {
fileType.value = 'svg'
} else {
fileType.value = 'excel'
}
//
readFileContent(file)
uploading.value = false
uploadSuccess.value = true
//
if (options.onSuccess) {
options.onSuccess()
}
//
emitFileReady()
}, 3000)
}
//
const readFileContent = (file) => {
const reader = new FileReader()
if (fileType.value === 'svg') {
reader.onload = (e) => {
// SVG
fileContent.value = sanitizeSvgContent(e.target.result)
}
reader.readAsText(file)
} else if (fileType.value === 'excel') {
// Excel
simulateExcelData()
}
}
// SVG
const sanitizeSvgContent = (content) => {
//
return content.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '')
}
// ExcelExcel
const simulateExcelData = () => {
//
tableColumns.value = [
{ prop: 'flightNo', label: '航班号', width: '120' },
{ prop: 'date', label: '日期', width: '120' },
{ prop: 'customerQuery', label: '客户问题', width: '250' },
{ prop: 'agentResponse', label: '客服回复', width: '250' },
{ prop: 'category', label: '问题类别', width: '120' }
]
//
tableData.value = [
{
flightNo: 'CA1234',
date: '2023-06-15',
customerQuery: '我的航班什么时候起飞?',
agentResponse: '您好CA1234航班计划于15:30起飞。',
category: '航班信息'
},
{
flightNo: 'MU5678',
date: '2023-06-15',
customerQuery: '我的行李还没到,怎么办?',
agentResponse: '很抱歉,我们会立即为您查询行李状态。',
category: '行李问题'
},
{
flightNo: 'CZ9012',
date: '2023-06-16',
customerQuery: '这个航班延误了,我能改签吗?',
agentResponse: '可以的,我们可以为您免费改签今天的其他航班。',
category: '航班延误'
}
]
}
//
const viewFileContent = () => {
dialogVisible.value = true
}
//
const handleClose = (done) => {
done()
}
//
const saveFileContent = () => {
ElMessage.success('修改已保存')
dialogVisible.value = false
}
//
const emitFileReady = () => {
emit('file-ready', {
fileType: fileType.value,
fileData: fileType.value === 'svg' ? fileContent.value : tableData.value
})
}
</script>
<style scoped>
.upload-container {
width: 100%;
background: rgba(255, 255, 255, 0.95);
border-radius: 8px;
padding: 24px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}
.upload-area {
width: 100%;
}
.upload-progress {
margin-top: 20px;
}
.operation-buttons {
margin-top: 20px;
display: flex;
justify-content: center;
}
.svg-preview, .excel-preview {
width: 100%;
max-height: 600px;
overflow: auto;
margin-bottom: 20px;
}
.svg-container {
background-color: #f5f7fa;
border: 1px dashed #dcdfe6;
border-radius: 4px;
min-height: 300px;
padding: 16px;
}
.dialog-footer {
display: flex;
justify-content: flex-end;
margin-top: 16px;
}
</style>

@ -0,0 +1,951 @@
<template>
<div class="main-page">
<div class="header">
<h1>航班对话数据处理系统</h1>
<p class="subtitle">SVG/Excel数据预处理合并格式单词纠错大模型分析一站式解决方案</p>
</div>
<!-- 步骤内容区域 -->
<div class="step-content">
<!-- 步骤1上传文件 -->
<div v-if="activeStep === 0" class="upload-step">
<file-upload @file-ready="onFileReady"></file-upload>
<!-- 步骤导航按钮 - 添加在步骤内容底部 -->
<div class="step-navigation-buttons">
<el-button
v-if="stepResults[0]"
type="primary"
@click="nextStep">
下一步
<el-icon class="el-icon--right"><arrow-right /></el-icon>
</el-button>
</div>
</div>
<!-- 步骤2预处理 -->
<div v-if="activeStep === 1" class="process-step">
<div class="step-header">
<h2>文件预处理</h2>
<p>对上传的航班对话数据进行初步预处理确保数据格式正确</p>
</div>
<div class="step-body">
<div class="settings-panel">
<h3>预处理选项</h3>
<el-form label-position="top">
<el-form-item label="移除空行">
<el-switch v-model="preprocessSettings.removeEmptyLines" />
</el-form-item>
<el-form-item label="标准化日期格式">
<el-switch v-model="preprocessSettings.standardizeDates" />
</el-form-item>
<el-form-item label="移除特殊字符">
<el-switch v-model="preprocessSettings.removeSpecialChars" />
</el-form-item>
</el-form>
<!-- 新增处理按钮 -->
<div class="action-buttons">
<el-button
type="primary"
@click="processPreprocess"
:loading="processing">
处理数据
</el-button>
</div>
</div>
<div class="result-panel" v-if="stepResults[1]">
<h3>预处理结果</h3>
<el-alert
title="预处理完成"
type="success"
:closable="false"
show-icon>
<div class="result-summary">
<p>处理时间{{ new Date().toLocaleString() }}</p>
<p>修正的行数{{ Math.floor(Math.random() * 20) + 5 }}</p>
<p>移除的空行{{ Math.floor(Math.random() * 10) }}</p>
</div>
</el-alert>
<div class="data-preview">
<el-table
:data="sampleData"
border
style="width: 100%"
max-height="300px">
<el-table-column
v-for="(column, index) in sampleColumns"
:key="index"
:prop="column.prop"
:label="column.label"
:width="column.width">
</el-table-column>
</el-table>
</div>
</div>
</div>
<!-- 步骤导航按钮 - 添加在步骤内容底部 -->
<div class="step-navigation-buttons">
<el-button @click="prevStep">
<el-icon class="el-icon--left"><arrow-left /></el-icon>
返回
</el-button>
<el-button
v-if="activeStep < 4 && stepResults[activeStep]"
type="primary"
@click="nextStep">
下一步
<el-icon class="el-icon--right"><arrow-right /></el-icon>
</el-button>
</div>
</div>
<!-- 步骤3合并格式 -->
<div v-if="activeStep === 2" class="process-step">
<div class="step-header">
<h2>合并格式</h2>
<p>将预处理后的数据合并为统一格式便于后续分析</p>
</div>
<div class="step-body">
<div class="settings-panel">
<h3>合并选项</h3>
<el-form label-position="top">
<el-form-item label="目标格式">
<el-radio-group v-model="mergeSettings.targetFormat">
<el-radio label="standard">标准格式</el-radio>
<el-radio label="extended">扩展格式</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="合并相似项">
<el-switch v-model="mergeSettings.mergeSimilarItems" />
</el-form-item>
<el-form-item label="生成唯一ID">
<el-switch v-model="mergeSettings.generateUniqueIds" />
</el-form-item>
</el-form>
<!-- 新增处理按钮 -->
<div class="action-buttons">
<el-button
type="primary"
@click="processMergeFormat"
:loading="processing">
处理数据
</el-button>
</div>
</div>
<div class="result-panel" v-if="stepResults[2]">
<h3>合并结果</h3>
<el-alert
title="格式合并完成"
type="success"
:closable="false"
show-icon>
<div class="result-summary">
<p>处理时间{{ new Date().toLocaleString() }}</p>
<p>合并条目数{{ Math.floor(Math.random() * 30) + 10 }}</p>
<p>匹配模式{{ mergeSettings.targetFormat === 'standard' ? '标准格式' : '扩展格式' }}</p>
</div>
</el-alert>
<div class="data-preview">
<el-table
:data="sampleData"
border
style="width: 100%"
max-height="300px">
<el-table-column
v-for="(column, index) in sampleColumns"
:key="index"
:prop="column.prop"
:label="column.label"
:width="column.width">
</el-table-column>
</el-table>
</div>
</div>
</div>
<!-- 步骤导航按钮 - 添加在步骤内容底部 -->
<div class="step-navigation-buttons">
<el-button @click="prevStep">
<el-icon class="el-icon--left"><arrow-left /></el-icon>
返回
</el-button>
<el-button
v-if="activeStep < 4 && stepResults[activeStep]"
type="primary"
@click="nextStep">
下一步
<el-icon class="el-icon--right"><arrow-right /></el-icon>
</el-button>
</div>
</div>
<!-- 步骤4单词纠错 -->
<div v-if="activeStep === 3" class="process-step">
<div class="step-header">
<h2>单词纠错</h2>
<p>检测并修正数据中的拼写错误和语法问题</p>
</div>
<div class="step-body">
<div class="settings-panel">
<h3>纠错选项</h3>
<el-form label-position="top">
<el-form-item label="拼写检查">
<el-switch v-model="spellCheckSettings.enabled" />
</el-form-item>
<el-form-item label="语法检查">
<el-switch v-model="spellCheckSettings.grammarCheck" />
</el-form-item>
<el-form-item label="专业术语库">
<el-select v-model="spellCheckSettings.termBase" placeholder="选择术语库">
<el-option label="航空术语" value="aviation"></el-option>
<el-option label="客服对话" value="customer-service"></el-option>
<el-option label="通用术语" value="general"></el-option>
</el-select>
</el-form-item>
</el-form>
<!-- 新增处理按钮 -->
<div class="action-buttons">
<el-button
type="primary"
@click="processSpellCheck"
:loading="processing">
处理数据
</el-button>
</div>
</div>
<div class="result-panel" v-if="stepResults[3]">
<h3>纠错结果</h3>
<el-alert
title="单词纠错完成"
type="success"
:closable="false"
show-icon>
<div class="result-summary">
<p>处理时间{{ new Date().toLocaleString() }}</p>
<p>纠正错误{{ Math.floor(Math.random() * 40) + 15 }}</p>
<p>不确定项{{ Math.floor(Math.random() * 10) + 2 }}</p>
</div>
</el-alert>
<div class="correction-list">
<h4>错误修正列表</h4>
<el-table
:data="correctionSamples"
border
style="width: 100%">
<el-table-column prop="original" label="原文" width="180"></el-table-column>
<el-table-column prop="corrected" label="修正" width="180"></el-table-column>
<el-table-column prop="type" label="错误类型"></el-table-column>
<el-table-column prop="confidence" label="置信度"></el-table-column>
</el-table>
</div>
</div>
</div>
<!-- 步骤导航按钮 - 添加在步骤内容底部 -->
<div class="step-navigation-buttons">
<el-button @click="prevStep">
<el-icon class="el-icon--left"><arrow-left /></el-icon>
返回
</el-button>
<el-button
v-if="activeStep < 4 && stepResults[activeStep]"
type="primary"
@click="nextStep">
下一步
<el-icon class="el-icon--right"><arrow-right /></el-icon>
</el-button>
</div>
</div>
<!-- 步骤5大模型分析 -->
<div v-if="activeStep === 4" class="process-step">
<div class="step-header">
<h2>大模型分析</h2>
<p>利用大语言模型对对话数据进行深度分析提取关键信息并生成洞察</p>
</div>
<div class="step-body">
<div class="settings-panel">
<h3>分析选项</h3>
<el-form label-position="top">
<el-form-item label="分析模型">
<el-select v-model="analysisSettings.model" placeholder="选择模型">
<el-option label="基础分析模型" value="basic"></el-option>
<el-option label="高级分析模型" value="advanced"></el-option>
<el-option label="专业航空模型" value="aviation-pro"></el-option>
</el-select>
</el-form-item>
<el-form-item label="分析深度">
<el-slider v-model="analysisSettings.depth" :step="1" :min="1" :max="5" show-stops></el-slider>
</el-form-item>
<el-form-item label="分析维度">
<el-checkbox-group v-model="analysisSettings.dimensions">
<el-checkbox label="情感分析"></el-checkbox>
<el-checkbox label="关键信息提取"></el-checkbox>
<el-checkbox label="问题分类"></el-checkbox>
<el-checkbox label="客户满意度评估"></el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<!-- 新增处理按钮 -->
<div class="action-buttons">
<el-button
type="primary"
@click="processAnalysis"
:loading="processing">
处理数据
</el-button>
</div>
</div>
<div class="result-panel" v-if="stepResults[4]">
<h3>分析结果</h3>
<el-alert
title="大模型分析完成"
type="success"
:closable="false"
show-icon>
<div class="result-summary">
<p>处理时间{{ new Date().toLocaleString() }}</p>
<p>分析条目{{ Math.floor(Math.random() * 50) + 30 }}</p>
<p>生成洞察{{ Math.floor(Math.random() * 15) + 5 }}</p>
</div>
</el-alert>
<div class="analysis-results">
<el-tabs type="border-card">
<el-tab-pane label="分析摘要">
<div class="analysis-summary">
<h4>主要发现</h4>
<p>通过对{{Math.floor(Math.random() * 50) + 30}}条航班对话数据的分析我们发现以下主要问题</p>
<ul>
<li>航班延误是客户投诉的主要原因占比约{{Math.floor(Math.random() * 30) + 20}}%</li>
<li>行李问题是第二大投诉点占比约{{Math.floor(Math.random() * 20) + 10}}%</li>
<li>客服回应速度和航班信息更新及时性是改进重点</li>
</ul>
<h4>建议改进方向</h4>
<ul>
<li>提高航班延误信息的透明度和及时性</li>
<li>改进行李追踪系统提供更精确的行李状态信息</li>
<li>优化客服培训提高问题解决效率</li>
</ul>
</div>
</el-tab-pane>
<el-tab-pane label="情感分析">
<div class="sentiment-chart">
<h4>客户情感分布</h4>
<div class="chart-placeholder">
<!-- 这里将来放置图表组件 -->
<div class="mock-chart">
<div class="chart-bar positive" style="width: 30%">正面 30%</div>
<div class="chart-bar neutral" style="width: 40%">中性 40%</div>
<div class="chart-bar negative" style="width: 30%">负面 30%</div>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="关键词统计">
<div class="keyword-stats">
<h4>高频关键词</h4>
<div class="keyword-cloud">
<span class="keyword-item" style="font-size: 24px; color: #409EFF">延误</span>
<span class="keyword-item" style="font-size: 20px; color: #67C23A">行李</span>
<span class="keyword-item" style="font-size: 18px; color: #E6A23C">退票</span>
<span class="keyword-item" style="font-size: 22px; color: #F56C6C">航班</span>
<span class="keyword-item" style="font-size: 16px; color: #909399">补偿</span>
<span class="keyword-item" style="font-size: 19px; color: #409EFF">更改</span>
<span class="keyword-item" style="font-size: 15px; color: #67C23A">座位</span>
<span class="keyword-item" style="font-size: 21px; color: #E6A23C">客服</span>
<span class="keyword-item" style="font-size: 17px; color: #F56C6C">信息</span>
<span class="keyword-item" style="font-size: 23px; color: #909399">问题</span>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
<!-- 步骤导航按钮 - 添加在步骤内容底部 -->
<div class="step-navigation-buttons">
<el-button @click="prevStep">
<el-icon class="el-icon--left"><arrow-left /></el-icon>
返回
</el-button>
<el-button
v-if="activeStep === 4 && stepResults[4]"
type="success"
@click="exportFinalResults">
导出分析结果
<el-icon class="el-icon--right"><download /></el-icon>
</el-button>
</div>
</div>
</div>
<!-- 底部步骤指示器 -->
<div class="bottom-steps-container">
<div class="steps-background">
<div class="steps-wrapper">
<!-- 重新设计的步骤流程 -->
<div class="steps-flow-container">
<!-- 步骤1 -->
<div class="step-item-container">
<div class="step-circle" :class="{ 'active': activeStep === 0, 'completed': stepResults[0] }">
<div class="ripple-effect" v-if="activeStep === 0"></div>
1
</div>
<div class="step-button-box" :class="{ 'active': activeStep === 0, 'completed': stepResults[0] }" @click="handleFileUploadClick">
<el-icon><upload /></el-icon>
<div class="step-text">上传文件</div>
</div>
</div>
<!-- 连接线 -->
<div class="step-connector" :class="{ 'active-connector': stepResults[0] }"></div>
<!-- 步骤2 -->
<div class="step-item-container">
<div class="step-circle" :class="{ 'active': activeStep === 1, 'completed': stepResults[1] }">
<div class="ripple-effect" v-if="activeStep === 1"></div>
2
</div>
<div class="step-button-box" :class="{ 'active': activeStep === 1, 'completed': stepResults[1], 'disabled': !stepResults[0] }" @click="goToStep(1)">
<div class="step-text">预处理</div>
</div>
</div>
<!-- 连接线 -->
<div class="step-connector" :class="{ 'active-connector': stepResults[1] }"></div>
<!-- 步骤3 -->
<div class="step-item-container">
<div class="step-circle" :class="{ 'active': activeStep === 2, 'completed': stepResults[2] }">
<div class="ripple-effect" v-if="activeStep === 2"></div>
3
</div>
<div class="step-button-box" :class="{ 'active': activeStep === 2, 'completed': stepResults[2], 'disabled': !stepResults[1] }" @click="goToStep(2)">
<div class="step-text">合并格式</div>
</div>
</div>
<!-- 连接线 -->
<div class="step-connector" :class="{ 'active-connector': stepResults[2] }"></div>
<!-- 步骤4 -->
<div class="step-item-container">
<div class="step-circle" :class="{ 'active': activeStep === 3, 'completed': stepResults[3] }">
<div class="ripple-effect" v-if="activeStep === 3"></div>
4
</div>
<div class="step-button-box" :class="{ 'active': activeStep === 3, 'completed': stepResults[3], 'disabled': !stepResults[2] }" @click="goToStep(3)">
<div class="step-text">单词纠错</div>
</div>
</div>
<!-- 连接线 -->
<div class="step-connector" :class="{ 'active-connector': stepResults[3] }"></div>
<!-- 步骤5 -->
<div class="step-item-container">
<div class="step-circle" :class="{ 'active': activeStep === 4, 'completed': stepResults[4] }">
<div class="ripple-effect" v-if="activeStep === 4"></div>
5
</div>
<div class="step-button-box" :class="{ 'active': activeStep === 4, 'completed': stepResults[4], 'disabled': !stepResults[3] }" @click="goToStep(4)">
<div class="step-text">大模型分析</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue'
import { ElMessage, ElLoading } from 'element-plus'
import { ArrowLeft, ArrowRight, Upload, Download } from '@element-plus/icons-vue'
import FileUpload from './FileUpload.vue'
//
const activeStep = ref(0)
const fileData = ref(null)
const fileType = ref(null)
const processing = ref(false)
//
const stepResults = reactive({
0: false,
1: false,
2: false,
3: false,
4: false
})
//
const preprocessSettings = reactive({
removeEmptyLines: true,
standardizeDates: true,
removeSpecialChars: false
})
//
const mergeSettings = reactive({
targetFormat: 'standard',
mergeSimilarItems: true,
generateUniqueIds: true
})
//
const spellCheckSettings = reactive({
enabled: true,
grammarCheck: true,
termBase: 'aviation'
})
//
const analysisSettings = reactive({
model: 'basic',
depth: 3,
dimensions: ['情感分析', '关键信息提取']
})
//
const sampleColumns = [
{ prop: 'flightNo', label: '航班号', width: '120' },
{ prop: 'date', label: '日期', width: '120' },
{ prop: 'customerQuery', label: '客户问题', width: '250' },
{ prop: 'agentResponse', label: '客服回复', width: '250' },
{ prop: 'category', label: '问题类别', width: '120' }
]
const sampleData = [
{
flightNo: 'CA1234',
date: '2023-06-15',
customerQuery: '我的航班什么时候起飞?',
agentResponse: '您好CA1234航班计划于15:30起飞。',
category: '航班信息'
},
{
flightNo: 'MU5678',
date: '2023-06-15',
customerQuery: '我的行李还没到,怎么办?',
agentResponse: '很抱歉,我们会立即为您查询行李状态。',
category: '行李问题'
},
{
flightNo: 'CZ9012',
date: '2023-06-16',
customerQuery: '这个航班延误了,我能改签吗?',
agentResponse: '可以的,我们可以为您免费改签今天的其他航班。',
category: '航班延误'
}
]
const correctionSamples = [
{ original: 'filght', corrected: 'flight', type: '拼写错误', confidence: '98%' },
{ original: 'customar', corrected: 'customer', type: '拼写错误', confidence: '95%' },
{ original: 'dely', corrected: 'delay', type: '拼写错误', confidence: '97%' },
{ original: 'bagage', corrected: 'baggage', type: '拼写错误', confidence: '99%' },
{ original: 'tickit', corrected: 'ticket', type: '拼写错误', confidence: '96%' }
]
//
const onFileReady = (data) => {
fileData.value = data.fileData
fileType.value = data.fileType
stepResults[0] = true
ElMessage.success('文件准备就绪,可以进行下一步操作')
}
//
const nextStep = () => {
if (activeStep.value < 4 && stepResults[activeStep.value]) {
activeStep.value += 1
}
}
//
const prevStep = () => {
if (activeStep.value > 0) {
//
const currentStep = activeStep.value
//
activeStep.value -= 1
//
for (let i = currentStep; i <= 4; i++) {
stepResults[i] = false
}
}
}
//
const goToStep = (step) => {
//
if (step === 0 || (step > 0 && stepResults[step-1])) {
activeStep.value = step
} else {
ElMessage.warning('请先完成前一步骤')
}
}
//
const handleFileUploadClick = () => {
activeStep.value = 0
}
//
const processPreprocess = () => {
simulateProcessing('正在进行预处理...', () => {
stepResults[1] = true
ElMessage.success('预处理完成!')
})
}
//
const processMergeFormat = () => {
simulateProcessing('正在合并格式...', () => {
stepResults[2] = true
ElMessage.success('格式合并完成!')
})
}
//
const processSpellCheck = () => {
simulateProcessing('正在进行单词纠错...', () => {
stepResults[3] = true
ElMessage.success('单词纠错完成!')
})
}
//
const processAnalysis = () => {
simulateProcessing('正在进行大模型分析,这可能需要一些时间...', () => {
stepResults[4] = true
ElMessage.success('大模型分析完成!')
}, 3000)
}
//
const simulateProcessing = (loadingText, callback, duration = 2000) => {
processing.value = true
const loadingInstance = ElLoading.service({
lock: true,
text: loadingText,
background: 'rgba(0, 0, 0, 0.7)'
})
//
setTimeout(() => {
loadingInstance.close()
processing.value = false
if (callback) callback()
}, duration)
}
//
const exportFinalResults = () => {
ElMessage.success('分析结果已导出')
}
</script>
<style scoped>
.main-page {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.header {
text-align: center;
margin-bottom: 30px;
background-color: rgba(255, 255, 255, 0.9);
padding: 15px;
border-radius: 8px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}
.header h1 {
color: #0066FF;
margin-bottom: 8px;
}
.subtitle {
color: #666;
font-size: 16px;
}
.step-content {
background: rgba(255, 255, 255, 0.95);
border-radius: 8px;
padding: 30px;
margin-bottom: 40px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
min-height: 500px;
}
.step-header {
margin-bottom: 20px;
}
.step-header h2 {
color: #0066FF;
margin-bottom: 8px;
}
.step-body {
display: flex;
gap: 30px;
}
.settings-panel {
flex: 1;
max-width: 300px;
}
.result-panel {
flex: 2;
}
.action-buttons {
margin-top: 20px;
}
.result-summary {
margin: 10px 0;
}
.data-preview {
margin-top: 20px;
}
.step-navigation-buttons {
margin-top: 30px;
display: flex;
justify-content: space-between;
}
.next-button {
margin-left: auto;
}
/* 步骤流程样式 */
.bottom-steps-container {
margin-top: 30px;
}
.steps-background {
background-color: rgba(230, 236, 245, 0.95);
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
}
.steps-wrapper {
max-width: 1000px;
margin: 0 auto;
}
.steps-flow-container {
display: flex;
align-items: center;
justify-content: space-between;
}
.step-item-container {
display: flex;
flex-direction: column;
align-items: center;
position: relative;
}
.step-circle {
width: 50px;
height: 50px;
border-radius: 50%;
background-color: #bbc6d6;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
font-size: 20px;
position: relative;
z-index: 2;
margin-bottom: 10px;
transition: all 0.3s;
}
.step-circle.active {
background-color: #0055dd;
transform: scale(1.2);
}
.step-circle.completed {
background-color: #55aa22;
}
.ripple-effect {
position: absolute;
top: -8px;
left: -8px;
right: -8px;
bottom: -8px;
border-radius: 50%;
border: 2px solid #0066FF;
animation: ripple 2s infinite;
}
@keyframes ripple {
0% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(1.3);
opacity: 0;
}
}
.step-button-box {
cursor: pointer;
text-align: center;
padding: 15px;
border-radius: 4px;
transition: all 0.3s;
width: 120px;
background-color: rgba(220, 230, 245, 0.8);
}
.step-button-box.active {
background-color: #daebff;
color: #0055dd;
font-weight: bold;
box-shadow: 0 2px 8px rgba(0, 100, 255, 0.2);
}
.step-button-box.completed {
color: #55aa22;
background-color: rgba(230, 245, 230, 0.9);
}
.step-button-box.disabled {
opacity: 0.5;
cursor: not-allowed;
}
.step-text {
margin-top: 5px;
font-weight: 500;
}
.step-connector {
flex-grow: 1;
height: 3px;
background-color: #bbc6d6;
margin: 0 10px;
position: relative;
z-index: 1;
transition: background-color 0.3s;
}
.active-connector {
background-color: #55aa22;
}
/* 分析结果样式 */
.analysis-summary {
padding: 16px;
}
.analysis-summary h4 {
margin-top: 20px;
margin-bottom: 10px;
color: #0066FF;
}
.analysis-summary ul {
padding-left: 20px;
}
.chart-placeholder {
height: 100px;
margin: 20px 0;
}
.mock-chart {
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-around;
gap: 10px;
}
.chart-bar {
height: 24px;
display: flex;
align-items: center;
padding-left: 10px;
color: white;
border-radius: 4px;
font-size: 14px;
}
.positive {
background-color: #67C23A;
}
.neutral {
background-color: #909399;
}
.negative {
background-color: #F56C6C;
}
.keyword-cloud {
padding: 20px;
text-align: center;
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 10px;
}
.keyword-item {
display: inline-block;
padding: 5px 10px;
border-radius: 20px;
background-color: #f5f7fa;
}
.correction-list {
margin-top: 20px;
}
.correction-list h4 {
margin-bottom: 10px;
color: #0066FF;
}
</style>

@ -1,4 +1,13 @@
import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
createApp(App).mount('#app')
const app = createApp(App)
app.use(ElementPlus, {
locale: zhCn
})
app.mount('#app')

Loading…
Cancel
Save