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 0000000..cfa6dcb Binary files /dev/null and b/src/assets/img/prompt.jpg differ 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"