From ec1fdb235e99f01092fb3e7b007913b00196518b Mon Sep 17 00:00:00 2001 From: cc500 <2014434568@qq.com> Date: Thu, 20 Mar 2025 16:12:02 +0800 Subject: [PATCH 1/3] =?UTF-8?q?.ts=E6=96=87=E4=BB=B6cleancode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- env.d.ts | 2 +- package.json | 3 +- shims-vue.d.ts | 5 +++ src/apis/paths/type.ts | 2 + src/apis/server.ts | 2 +- src/apis/tools.ts | 4 +- src/components/Message.ts | 6 +-- src/router/index.ts | 3 +- src/store/conversation.ts | 76 ++++++++++++++++++++----------------- src/store/historySession.ts | 2 +- src/views/dialogue/types.ts | 13 ++++--- tsconfig.json | 4 +- 12 files changed, 69 insertions(+), 53 deletions(-) create mode 100644 shims-vue.d.ts diff --git a/env.d.ts b/env.d.ts index fe3b512..ad8d6d5 100644 --- a/env.d.ts +++ b/env.d.ts @@ -9,7 +9,7 @@ // See the Mulan PSL v2 for more details. /// declare interface Window { - onHtmlEventDispatch: (); + onHtmlEventDispatch: any; } declare interface ImportMetaEnv { diff --git a/package.json b/package.json index cf068f3..9c23f93 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "build:micro": "vite build --mode micro", "preview": "vite preview", "lint": "eslint . --fix --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore", - "format": "prettier --write src/" + "format": "prettier --write src/", + "type-check": "tsc --noEmit" }, "engines": { "node": ">= 18.18.2" diff --git a/shims-vue.d.ts b/shims-vue.d.ts new file mode 100644 index 0000000..6769564 --- /dev/null +++ b/shims-vue.d.ts @@ -0,0 +1,5 @@ +declare module '*.vue' { + import type { DefineComponent } from 'vue'; + const component: DefineComponent<{}, {}, any>; + export default component; + } \ No newline at end of file diff --git a/src/apis/paths/type.ts b/src/apis/paths/type.ts index b4d1ce0..54e012e 100644 --- a/src/apis/paths/type.ts +++ b/src/apis/paths/type.ts @@ -56,6 +56,8 @@ export interface ConversationRecord { flow: Flow; content: Content; metadata: Metadata; + is_like?: boolean; + created_at: string; } // 定义对话内问答列表数据结构 diff --git a/src/apis/server.ts b/src/apis/server.ts index 16a5c1f..23516ca 100644 --- a/src/apis/server.ts +++ b/src/apis/server.ts @@ -73,7 +73,7 @@ server.interceptors.response.use( if (error.status !== 401 && error.status !== 403) { ElMessage({ showClose: true, - message: error?.response?.data?.message || error.message, + message: (error as any)?.response?.data?.message as string || error.message, icon: IconError, customClass: 'o-message--error', duration: 3000, diff --git a/src/apis/tools.ts b/src/apis/tools.ts index 81f85f8..dc100f1 100644 --- a/src/apis/tools.ts +++ b/src/apis/tools.ts @@ -182,12 +182,12 @@ export const handleStatusError = async ( return; } const originalRequest = error.config; - if (originalRequest.url === '/api/auth/refresh_token') { + if (originalRequest && originalRequest.url === '/api/auth/refresh_token') { // 长token过期,需要重新登录 handleAuthorize(status); return Promise.reject(error.response); } - if (originalRequest.url === '/api/auth/user') { + if (originalRequest && originalRequest.url === '/api/auth/user') { handleAuthorize(status); return; } diff --git a/src/components/Message.ts b/src/components/Message.ts index 13a8825..8224124 100644 --- a/src/components/Message.ts +++ b/src/components/Message.ts @@ -14,7 +14,7 @@ export const successMsg = (msgInfo: string) => { // customClass:"el-message--success", type: 'success', // showClose:true, - class: 'el-message--success', + // class: 'el-message--success', message: msgInfo, }); }; @@ -22,7 +22,7 @@ export const warningMsg = (msgInfo: string) => { ElMessage({ type: 'warning', // showClose:true, - class: 'el-message--warning', + // class: 'el-message--warning', message: msgInfo, }); }; @@ -31,7 +31,7 @@ export const errorMsg = (msgInfo: string) => { ElMessage({ type: 'error', // showClose:true, - class: 'el-message--error', + // class: 'el-message--error', message: msgInfo, }); }; diff --git a/src/router/index.ts b/src/router/index.ts index 8874bd5..d65636e 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -8,9 +8,8 @@ // PURPOSE. // See the Mulan PSL v2 for more details. import { createRouter, createWebHashHistory } from 'vue-router'; -import NotFoundComponent from 'src/views/404.vue'; +import NotFoundComponent from '@/views/404.vue'; import { qiankunWindow } from 'vite-plugin-qiankun/dist/helper'; -import { useAccountStore } from 'src/store'; const router = createRouter({ history: createWebHashHistory( diff --git a/src/store/conversation.ts b/src/store/conversation.ts index 8f1b582..b16c5bd 100644 --- a/src/store/conversation.ts +++ b/src/store/conversation.ts @@ -12,6 +12,7 @@ import { ref, nextTick } from 'vue'; import { useAccountStore, useHistorySessionStore } from 'src/store'; import { AppShowType, + FlowDataType, MessageArray, type ConversationItem, type RobotConversationItem, @@ -61,10 +62,12 @@ export const useSessionStore = defineStore('conversation', () => { } //完成所有渲染再执行 setTimeout(() => { - dialogueRef.value.scrollTo({ - top: dialogueRef.value.scrollHeight, - behavior: action, - }); + if (dialogueRef.value) { + dialogueRef.value.scrollTo({ + top: dialogueRef.value.scrollHeight, + behavior: action, + }); + } }, 0); }); }; @@ -74,7 +77,10 @@ export const useSessionStore = defineStore('conversation', () => { const isPaused = ref(false); // 会话列表 const conversationList = ref([]); - const app = ref({}); + const app = ref({ + appId: '', + name: '' + }); const appList = ref(); // ai回复是否还在生成中 const isAnswerGenerating = ref(false); @@ -227,7 +233,6 @@ export const useSessionStore = defineStore('conversation', () => { excelPath.value = ''; echartsObj.value = {}; txt2imgPath.value = ''; - let workFlowId = ''; // 这里存储工作流调试对话的判断id let addItem = ''; while (isEnd) { if (isPaused.value) { @@ -293,21 +298,20 @@ export const useSessionStore = defineStore('conversation', () => { message.content, ]; } else if (message['event'] === 'suggest') { - conversationItem.search_suggestions - ? conversationItem.search_suggestions.push( - Object(message.content), - ) - : (conversationItem.search_suggestions = [ - Object(message.content), - ]); - } else if (message['event'] === 'init') { + if (conversationItem.search_suggestions) { + conversationItem.search_suggestions.push(Object(message.content)); + } else { + conversationItem.search_suggestions = [Object(message.content)]; + } + } + else if (message['event'] === 'init') { //初始化获取 metadata conversationItem.metadata = message.metadata; conversationItem.createdAt = message.content.created_at; conversationItem.groupId = message.groupId; } else if (message['event'] === 'flow.start') { //事件流开始--后续验证对话无下拉连接后则完全替换 - let flow = message.flow; + const flow = message.flow; conversationItem.flowdata = { id: flow?.stepId || '', title: i18n.global.t('flow.flow_start'), @@ -340,13 +344,13 @@ export const useSessionStore = defineStore('conversation', () => { target.status = message.flow?.stepStatus; // 工作流添加每阶段的时间耗时 target['costTime'] = message.metadata?.timeCost; - if (message.flow.step_status === 'error') { + if (message.flow.step_status === 'error' && conversationItem.flowdata) { conversationItem.flowdata.status = message.flow?.stepStatus; } } } else if (message['event'] === 'flow.stop') { //时间流结束 - let flow = message.content.flow; + const flow = message.content.flow; if (params.type) { // 如果是工作流的调试功能-添加status/data conversationItem.flowdata = { @@ -357,7 +361,7 @@ export const useSessionStore = defineStore('conversation', () => { display: true, data: conversationItem?.flowdata?.data, }; - } else if (message.content.type !== 'schema') { + } else if (message.content.type !== 'schema' && conversationItem.flowdata) { // 删除 end 逻辑 conversationItem.flowdata = { id: flow?.stepId, @@ -369,11 +373,13 @@ export const useSessionStore = defineStore('conversation', () => { }; } else { conversationItem.paramsList = message.content.data; - conversationItem.flowdata.title = i18n.global.t( - 'flow.flow_params_error', - ); - conversationItem.flowdata.status = 'error'; - conversationItem.paramsList = message.content.data; + if(conversationItem.flowdata){ + conversationItem.flowdata.title = i18n.global.t( + 'flow.flow_params_error', + ); + conversationItem.flowdata.status = 'error'; + conversationItem.paramsList = message.content.data; + } } } } @@ -492,7 +498,9 @@ export const useSessionStore = defineStore('conversation', () => { const conversationItem = conversationList.value[ answerIndex ] as RobotConversationItem; - conversationItem.flowdata.status = 'error'; + if(conversationItem.flowdata){ + conversationItem.flowdata.status = 'error'; + } } if ( errorMsg && @@ -530,7 +538,7 @@ export const useSessionStore = defineStore('conversation', () => { useHistorySessionStore(); if (conversationList.value.length === 0) { // 如果当前还没有对话记录,将第一个问题的questtion作为对话标题 - const res = await updateSessionTitle({ + await updateSessionTitle({ conversationId: currentSelectedSession, title: question.slice(0, 20), }); @@ -617,7 +625,7 @@ export const useSessionStore = defineStore('conversation', () => { ? conversationList.value.findIndex((val) => val.cid === cid) : conversationList.value.length - 1; isPaused.value = true; - conversationList.value[answerIndex].message[0] += '暂停生成'; + (conversationList.value[answerIndex] as RobotConversationItem).message[0] += '暂停生成'; (conversationList.value[answerIndex] as RobotConversationItem).isFinish = true; cancel(); @@ -641,7 +649,7 @@ export const useSessionStore = defineStore('conversation', () => { const recordId = ( conversationList.value[answerInd] as RobotConversationItem ).recordId; - let groupId = undefined; + let groupId: string | undefined; if (type && type === 'params') { groupId = undefined; } else { @@ -675,8 +683,6 @@ export const useSessionStore = defineStore('conversation', () => { } (conversationList.value[answerInd] as RobotConversationItem).currentInd -= 1; - const index = (conversationList.value[answerInd] as RobotConversationItem) - .currentInd; }; /** * 下一条 @@ -695,8 +701,6 @@ export const useSessionStore = defineStore('conversation', () => { } (conversationList.value[answerInd] as RobotConversationItem).currentInd += 1; - const index = (conversationList.value[answerInd] as RobotConversationItem) - .currentInd; }; // #endregion @@ -759,7 +763,7 @@ export const useSessionStore = defineStore('conversation', () => { conversationId: record.conversationId, groupId: record.groupId, metadata: record.metadata, - flowdata: record?.flow ? GenerateFlowData(record.flow) : undefined, + flowdata: record?.flow ? GenerateFlowData(record.flow) as { id: number; title: string; status: string; data: any; display: boolean; progress: string; flowId?: string } : undefined, }, ); scrollBottom('auto'); @@ -768,7 +772,7 @@ export const useSessionStore = defineStore('conversation', () => { }; //将获取到的 flow 数据结构转换 const GenerateFlowData = (record: any): object => { - let flowData = { + const flowData = { id: record.recordId, title: record.id, status: 'success', @@ -787,8 +791,9 @@ export const useSessionStore = defineStore('conversation', () => { }, }); } - return flowData; + return flowData as FlowDataType; }; + const comment = (cid: number, isSupport: boolean, index: number): void => { const ind = conversationList.value.find((item) => item.cid === cid); // ind.message.items[index].is_like = isSupport; @@ -824,7 +829,8 @@ export const useSessionStore = defineStore('conversation', () => { } else { return false; } - } catch (e) { + } catch (err) { + console.error('An error occurred:', err); return false; } }; diff --git a/src/store/historySession.ts b/src/store/historySession.ts index 91e6d8d..e0c8f19 100644 --- a/src/store/historySession.ts +++ b/src/store/historySession.ts @@ -44,7 +44,7 @@ export const useHistorySessionStore = defineStore('sessionStore', () => { await getConversation(currentSelectedSession.value).then(() => { const a = document.getElementsByClassName('draw'); for (let i of a) { - i.style.display = 'none'; + (i as HTMLElement).style.display = 'none'; } }); }; diff --git a/src/views/dialogue/types.ts b/src/views/dialogue/types.ts index 6b6976c..8c103c3 100644 --- a/src/views/dialogue/types.ts +++ b/src/views/dialogue/types.ts @@ -64,8 +64,10 @@ export interface FlowType { export interface FlowDataType { id: string; - stauts: string; - // title: '', + status: string; + title?: string; + display?: boolean; + flowId?: string; data: any | undefined; } @@ -94,7 +96,7 @@ export interface RobotConversationItem { search_suggestions?: string[]; echartsObj?: any; metadata?: undefined | Metadata; - flowdata?: FlowType; + flowdata?: FlowType | undefined; paramsList?: any; } @@ -136,11 +138,12 @@ export class MessageArray { } getIslikeList(): number[] { - return this.items.map((item) => item.is_like); + //类型断言,将undefined转换为0。 + return this.items.map((item) => item.is_like ?? 0); } getisLikeByIndex(index: number): number { - return this.items.map((item) => item.is_like)[index]; + return this.items.map((item) => item.is_like ?? 0)[index]; } changeisLikeByCidAndIndex( diff --git a/tsconfig.json b/tsconfig.json index 6562094..c88a583 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,12 +28,12 @@ "typeRoots": ["./node_modules/@types/", "./types"], "paths": { "src*": ["src/*"], - "@/*": ["src/*"] + "@/*": ["src/*"], + "src/*": ["./src/*"] }, "lib": ["esnext", "dom", "dom.iterable", "scripthost"] }, "types": [ "vite/client" ], "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "vite.config.ts"], "exclude": ["node_modules", "dist"] - } -- Gitee From f0f46cd9c96f0023fc46749b4afec0e65f269799 Mon Sep 17 00:00:00 2001 From: cc500 <2014434568@qq.com> Date: Mon, 24 Mar 2025 14:30:37 +0800 Subject: [PATCH 2/3] cleancode --- eslint.config.js | 29 +++++++----- package.json | 2 +- src/apis/paths/apikey.ts | 6 ++- src/apis/paths/conversation.ts | 4 +- src/apis/server.ts | 3 +- src/apis/tools.ts | 2 +- src/components/Upload/index.vue | 13 +----- src/components/commonFooter/CommonFooter.vue | 1 - src/components/dialoguePanel/DialogueFlow.vue | 2 - .../dialoguePanel/DialoguePanel.vue | 20 ++------- src/components/dialoguePanel/FlowCode.vue | 6 +-- .../dialoguePanel/JsonFormComponent.vue | 9 ++-- src/components/dialoguePanel/chartsCss.ts | 4 +- src/components/sessionCard/SessionCard.vue | 3 +- .../sessionCard/SessionDropDown.vue | 2 - src/components/textMoreTootip/index.vue | 2 +- src/i18n/lang/zh-cn.ts | 2 - src/main.ts | 4 +- src/router/index.ts | 2 +- src/store/account.ts | 2 +- src/store/conversation.ts | 44 +++++++++++++------ src/store/historySession.ts | 2 +- src/views/api/index.vue | 2 +- src/views/createapp/components/workFlow.vue | 2 +- .../createapp/components/workFlowDebug.vue | 8 +--- src/views/createapp/index.vue | 2 - .../dialogue/components/DialogueAside.vue | 2 +- src/views/dialogue/types.ts | 1 - 28 files changed, 81 insertions(+), 100 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 2d403f6..26ecd88 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,15 +1,24 @@ -import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; -import pluginVue from "eslint-plugin-vue"; - +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import pluginVue from 'eslint-plugin-vue'; /** @type {import('eslint').Linter.Config[]} */ export default [ - {files: ["**/*.{js,mjs,cjs,ts,vue}"]}, - {languageOptions: { globals: globals.browser }}, + { files: ['**/*.{js,mjs,cjs,ts,vue}'] }, + { + ignores: [ + '**/node_modules/**', // 忽略 node_modules 目录 + '**/dist/**', // 忽略 dist 目录 + '**/.git/**', + ], + }, + { languageOptions: { globals: globals.browser } }, pluginJs.configs.recommended, ...tseslint.configs.recommended, - ...pluginVue.configs["flat/essential"], - {files: ["**/*.vue"], languageOptions: {parserOptions: {parser: tseslint.parser}}}, -]; \ No newline at end of file + ...pluginVue.configs['flat/essential'], + { + files: ['**/*.vue'], + languageOptions: { parserOptions: { parser: tseslint.parser } }, + }, +]; diff --git a/package.json b/package.json index 9c23f93..6fdca22 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build": "vite build", "build:micro": "vite build --mode micro", "preview": "vite preview", - "lint": "eslint . --fix --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore", + "lint": "eslint . --fix", "format": "prettier --write src/", "type-check": "tsc --noEmit" }, diff --git a/src/apis/paths/apikey.ts b/src/apis/paths/apikey.ts index ac2cdb9..3848437 100644 --- a/src/apis/paths/apikey.ts +++ b/src/apis/paths/apikey.ts @@ -14,7 +14,9 @@ import type { FcResponse } from 'src/apis/server'; * 验证用户信息 * @returns */ -export const getApiKey = (): Promise<[any, FcResponse<{}> | undefined]> => { +export const getApiKey = (): Promise<[any, FcResponse<{ + api_key: string; +}> | undefined]> => { return get('/api/auth/key'); }; @@ -25,7 +27,7 @@ export const getApiKey = (): Promise<[any, FcResponse<{}> | undefined]> => { export const changeApiKey = (params: { action: string; query?: string; -}): Promise<[any, FcResponse<{}> | undefined]> => { +}): Promise<[any, FcResponse | undefined]> => { return post('/api/auth/key', params, params); }; diff --git a/src/apis/paths/conversation.ts b/src/apis/paths/conversation.ts index 5989189..08a052f 100644 --- a/src/apis/paths/conversation.ts +++ b/src/apis/paths/conversation.ts @@ -21,9 +21,7 @@ export const stopGeneration = (): Promise< [ any, ( - | FcResponse<{ - // conversationId: string; - }> + | FcResponse | undefined ), ] diff --git a/src/apis/server.ts b/src/apis/server.ts index 23516ca..e185043 100644 --- a/src/apis/server.ts +++ b/src/apis/server.ts @@ -73,7 +73,8 @@ server.interceptors.response.use( if (error.status !== 401 && error.status !== 403) { ElMessage({ showClose: true, - message: (error as any)?.response?.data?.message as string || error.message, + message: + ((error as any)?.response?.data?.message as string) || error.message, icon: IconError, customClass: 'o-message--error', duration: 3000, diff --git a/src/apis/tools.ts b/src/apis/tools.ts index dc100f1..ad08b01 100644 --- a/src/apis/tools.ts +++ b/src/apis/tools.ts @@ -25,7 +25,7 @@ import i18n from 'src/i18n'; import { errorMsg } from 'src/components/Message'; function getCookie(name: string) { - let matches = document.cookie.match( + const matches = document.cookie.match( new RegExp( '(?:^|; )' + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + diff --git a/src/components/Upload/index.vue b/src/components/Upload/index.vue index 9ac014d..a292715 100644 --- a/src/components/Upload/index.vue +++ b/src/components/Upload/index.vue @@ -162,17 +162,8 @@ const beforeUpload = async (file: ElFile) => { } }; -const beforeUploadPromise = (fileWrapper: { file: File }): Promise => { - return new Promise((resolve, reject) => { - // ...(上面的异步逻辑,但在最后调用 resolve(true) 或 reject(false)) - }); -}; -// 上传进度 -const handleProgress = (event: ElUploadProgressEvent) => { - progressVal.value = event.percent; -}; // 上传完成 -const handleSuccess = (res: ElUploadProgressEvent, file: UploadFile) => { +const handleSuccess = () => { uploadDone.value = true; progressVal.value = 0; }; @@ -219,7 +210,7 @@ watch(getServiceYaml, () => { }); watch( () => themeStore.theme, - (newVal) => { + () => { if (themeStore.theme === 'dark') { extensions.value = [yaml(), oneDark]; } else { diff --git a/src/components/commonFooter/CommonFooter.vue b/src/components/commonFooter/CommonFooter.vue index 5697da9..a02803d 100644 --- a/src/components/commonFooter/CommonFooter.vue +++ b/src/components/commonFooter/CommonFooter.vue @@ -1,6 +1,5 @@