From 6941fde0ca0f45c2302cb8d26126c3dce7d58b85 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Thu, 27 Mar 2025 16:09:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0prompt=E7=94=9F=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=80=9A=E7=94=A8=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 9 + package.json | 1 + src/assets/img/prompt.jpg | Bin 0 -> 5903 bytes src/components/menu.ts | 6 + src/components/table-edit.vue | 2 +- src/router/index.ts | 9 + src/store/permiss.ts | 1 + src/types/form-option.ts | 1 + src/views/system/copy-test.vue | 467 +++++++++++++++++++++++++++ src/views/system/function.vue | 2 +- src/views/system/gen-chat.vue | 99 +++--- src/views/system/prompt-gen.vue | 271 ++++++++++++++++ src/views/system/prompt-generate.vue | 296 ----------------- yarn.lock | 7 + 14 files changed, 833 insertions(+), 338 deletions(-) create mode 100644 src/assets/img/prompt.jpg create mode 100644 src/views/system/copy-test.vue create mode 100644 src/views/system/prompt-gen.vue delete mode 100644 src/views/system/prompt-generate.vue diff --git a/package-lock.json b/package-lock.json index 16c2d25..da1587c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,7 @@ "js-md5": "^0.8.3", "katex": "^0.16.21", "markdown-it": "^14.1.0", + "markdown-it-highlightjs": "^4.2.0", "markdown-it-katex": "^2.0.3", "markdown-it-mermaid": "^0.2.5", "marked": "^15.0.7", @@ -3313,6 +3314,14 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/markdown-it-highlightjs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-highlightjs/-/markdown-it-highlightjs-4.2.0.tgz", + "integrity": "sha512-NC7pXE8KkOl6xWJVRNt8p6wgJVznXKsE0HgYGdk6DD2tn1l4L9f0ALf3VIoGVkotNU1uGQatSxfBF1zZPUMmuQ==", + "dependencies": { + "highlight.js": "^11.9.0" + } + }, "node_modules/markdown-it-katex": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/markdown-it-katex/-/markdown-it-katex-2.0.3.tgz", diff --git a/package.json b/package.json index 328dfcf..df2c4c4 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "js-md5": "^0.8.3", "katex": "^0.16.21", "markdown-it": "^14.1.0", + "markdown-it-highlightjs": "^4.2.0", "markdown-it-katex": "^2.0.3", "markdown-it-mermaid": "^0.2.5", "marked": "^15.0.7", diff --git a/src/assets/img/prompt.jpg b/src/assets/img/prompt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cfa6dcbe11ac515cb3c16c7217617511a8220402 GIT binary patch literal 5903 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 literal 0 HcmV?d00001 diff --git a/src/components/menu.ts b/src/components/menu.ts index f18a679..e8cf98c 100644 --- a/src/components/menu.ts +++ b/src/components/menu.ts @@ -199,6 +199,12 @@ export const menuData: Menus[] = [ index: '/gen-chat', title: '通用人机对话', }, + { + id: '55', + icon: 'ChatDotSquare', + index: '/gen-prompt', + title: '提示词生成', + }, { id: '6', icon: 'DocumentAdd', diff --git a/src/components/table-edit.vue b/src/components/table-edit.vue index 0ba3130..df9fba6 100644 --- a/src/components/table-edit.vue +++ b/src/components/table-edit.vue @@ -9,7 +9,7 @@ + :placeholder="item.placeholder" clearable > import(/* webpackChunkName: "gen-chat" */ '../views/system/gen-chat.vue'), }, + { + path: '/gen-prompt', + name: 'gen-prompt', + meta: { + title: 'prompt生成', + permiss: '55', + }, + component: () => import(/* webpackChunkName: "gen-prompt" */ '../views/system/prompt-gen.vue'), + }, { path: '/system-role', name: 'system-role', diff --git a/src/store/permiss.ts b/src/store/permiss.ts index bbe23ab..9bf3d5b 100644 --- a/src/store/permiss.ts +++ b/src/store/permiss.ts @@ -51,6 +51,7 @@ export const usePermissStore = defineStore('permiss', { '52', //模型管理 '53', //通用人机对话 '54', //功能管理 + '55', //提示词生成 ], user: ['0', '8', '7','9', '61','53'], }, diff --git a/src/types/form-option.ts b/src/types/form-option.ts index 19865bb..680a86e 100644 --- a/src/types/form-option.ts +++ b/src/types/form-option.ts @@ -15,6 +15,7 @@ export interface FormOptionList { opts?: any[]; format?: string; activeValue?: any; + multiple?: boolean; inactiveValue?: any; activeText?: string; inactiveText?: string; diff --git a/src/views/system/copy-test.vue b/src/views/system/copy-test.vue new file mode 100644 index 0000000..072304a --- /dev/null +++ b/src/views/system/copy-test.vue @@ -0,0 +1,467 @@ + + + + + \ No newline at end of file diff --git a/src/views/system/function.vue b/src/views/system/function.vue index 7b10cb5..e37e740 100644 --- a/src/views/system/function.vue +++ b/src/views/system/function.vue @@ -124,7 +124,7 @@ let options_edit = ref({ span: 12, list: [ { type: 'input', label: '名称', prop: 'Name', required: true }, - { type: 'select', label: '模型', prop: 'ModelID', required: true, opts:model_select_opts.value}, + { type: 'select', label: '模型', prop: 'ModelID', required: true, opts:model_select_opts.value, multiple: true}, { type: 'input', label: '功能', prop: 'Function', required: true }, { type: 'input', label: '描述', prop: 'Info', required: true }, ] diff --git a/src/views/system/gen-chat.vue b/src/views/system/gen-chat.vue index a977163..9f642a3 100644 --- a/src/views/system/gen-chat.vue +++ b/src/views/system/gen-chat.vue @@ -2,7 +2,7 @@
-
+
新会话
@@ -44,7 +44,7 @@
- +
+ +
+ +
Loading...
@@ -89,22 +93,14 @@ import { ElCard, ElInput, ElButton } from "element-plus"; import { WSMessage, AIQMessage, OllamaMessage } from "@/types/im"; import { ElMessage } from "element-plus"; import { GetMessageService } from "@/api/im"; -import {Check, Loading} from '@element-plus/icons-vue' +import {Check, Loading, DocumentCopy} from '@element-plus/icons-vue' import MarkdownIt from "markdown-it"; import markdownItMermaid from "markdown-it-mermaid"; import hljs from "highlight.js"; import { Session } from "@/types/session"; import bash from "highlight.js/lib/languages/bash"; import { FindSessionService } from "@/api/session"; -import javascript from "highlight.js/lib/languages/javascript"; -import typescript from "highlight.js/lib/languages/typescript"; -import java from "highlight.js/lib/languages/java"; -import sql from "highlight.js/lib/languages/sql"; -import nginx from "highlight.js/lib/languages/nginx"; -import json from "highlight.js/lib/languages/json"; -import yaml from "highlight.js/lib/languages/yaml"; -import xml from "highlight.js/lib/languages/xml"; -import shell from "highlight.js/lib/languages/shell"; +import markdownItHighlightjs from 'markdown-it-highlightjs'; import "katex/dist/katex.min.css"; interface Message { role: "user" | "assistant"; @@ -112,33 +108,12 @@ interface Message { finished?: boolean; } -hljs.registerLanguage("bash", bash); -hljs.registerLanguage("javascript", javascript); -hljs.registerLanguage("typescript", typescript); -hljs.registerLanguage("java", java); -hljs.registerLanguage("sql", sql); -hljs.registerLanguage("nginx", nginx); -hljs.registerLanguage("json", json); -hljs.registerLanguage("yaml", yaml); -hljs.registerLanguage("xml", xml); -hljs.registerLanguage("shell", shell); -const md = new MarkdownIt({ - html: true, - linkify: true, - breaks: true, - xhtmlOut: true, - typographer: true, - highlight: (str, lang) => { - if (lang && hljs.getLanguage(lang)) { - try { - return `
${
-          hljs.highlight(str, { language: lang, ignoreIllegals: true }).value
-        }
`; - } catch (__) {} - } - return `
${md.utils.escapeHtml(str)}
`; - }, -}); +const md = new MarkdownIt(); +md.use(markdownItHighlightjs,{ + hljs, + auto: true, + code: true +}) const historySessions = ref([]); const loading = ref(false); @@ -161,6 +136,30 @@ const scrollToBottom = () => { x.scrollTop = x.scrollHeight; //将滚轮置底 }; +const copyCode = (code: string) => { + navigator.clipboard.writeText(code).then(() => { + ElMessage.success("代码已复制到剪贴板"); + }); +}; + +const doButtonD = () => { + const codeBlocks = document.querySelectorAll('pre code'); + codeBlocks.forEach((codeBlock) => { + // 创建复制按钮 + const copyButton = document.createElement('button'); + copyButton.textContent = '复制代码'; + copyButton.classList.add('copy-code-button'); + copyButton.addEventListener('click', () => { + copyCode(codeBlock.textContent); + }); + // 设置代码块父元素的定位,以便按钮定位 + const pre = codeBlock.parentNode; + pre.style.position = 'relative'; + // 将复制按钮添加到代码块父元素中 + pre.appendChild(copyButton); + }); +}; + onMounted(() => { // if (typeof window !== 'undefined') { // // 浏览器环境 @@ -175,7 +174,7 @@ onMounted(() => { console.log("WebSocket 连接已建立"); ElMessage.success("连接成功"); }; - getMessage(125); + //getMessage(125); messagesContainer.value = document.querySelector(".chat-messages"); socket.value.onmessage = (event) => { @@ -253,6 +252,8 @@ const loadSession = async (session_id: number) => { (session) => session.ID == session_id )?.Name; await getMessage(session_id); + scrollToBottom(); + //doButtonD(); }; const clearCurrent = () => { @@ -313,6 +314,13 @@ const getMessage = async (session_id: number) => { } return {}; }; +const copyMessage = (content: string) => { + navigator.clipboard.writeText(content).then(() => { + ElMessage.success('复制成功'); + }).catch((error) => { + ElMessage.error('复制失败: ' + error); + }); +}; diff --git a/src/views/system/prompt-gen.vue b/src/views/system/prompt-gen.vue new file mode 100644 index 0000000..3360c5a --- /dev/null +++ b/src/views/system/prompt-gen.vue @@ -0,0 +1,271 @@ + + + + + \ No newline at end of file diff --git a/src/views/system/prompt-generate.vue b/src/views/system/prompt-generate.vue deleted file mode 100644 index cc751e9..0000000 --- a/src/views/system/prompt-generate.vue +++ /dev/null @@ -1,296 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index e686304..925e1d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2153,6 +2153,13 @@ magic-string@^0.30.7: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +markdown-it-highlightjs@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/markdown-it-highlightjs/-/markdown-it-highlightjs-4.2.0.tgz" + integrity sha512-NC7pXE8KkOl6xWJVRNt8p6wgJVznXKsE0HgYGdk6DD2tn1l4L9f0ALf3VIoGVkotNU1uGQatSxfBF1zZPUMmuQ== + dependencies: + highlight.js "^11.9.0" + markdown-it-katex@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/markdown-it-katex/-/markdown-it-katex-2.0.3.tgz"