From 6b4d979fd626d4d2943d78f855f7e0b5383e6476 Mon Sep 17 00:00:00 2001
From: junleea <354425203@qq.com>
Date: Fri, 28 Mar 2025 21:34:11 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=9A=E7=94=A8chat?=
=?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=BC=9A=E8=AF=9D?=
=?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=EF=BC=8C=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0=E5=8A=9F=E8=83=BD=E3=80=81?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=88?=
=?UTF-8?q?=E6=9C=AA=E5=85=A8=E9=83=A8=E5=AE=8C=E6=88=90=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 366 +++++-----------------------
src/api/file.ts | 49 ++++
src/components/menu.ts | 8 +-
src/router/index.ts | 9 +
src/store/permiss.ts | 1 +
src/types/file.ts | 6 +
src/views/element/upload.vue | 59 ++++-
src/views/system/file-chat.vue | 9 +
src/views/system/gen-chat.vue | 125 ++++++----
src/views/system/manage-file.vue | 211 ++++++++++++++++
src/views/system/manage-session.vue | 13 +-
11 files changed, 489 insertions(+), 367 deletions(-)
create mode 100644 src/api/file.ts
create mode 100644 src/types/file.ts
create mode 100644 src/views/system/file-chat.vue
create mode 100644 src/views/system/manage-file.vue
diff --git a/README.md b/README.md
index 7152702..d90a91e 100644
--- a/README.md
+++ b/README.md
@@ -1,306 +1,72 @@
-
-
-
-
- Loading...
-
-
-
-
-
-
-
-
-
- Send
-
-
-
-
-
-
-
+
+
+
\ No newline at end of file
diff --git a/src/api/file.ts b/src/api/file.ts
new file mode 100644
index 0000000..1524479
--- /dev/null
+++ b/src/api/file.ts
@@ -0,0 +1,49 @@
+import request from '@/utils/request2';
+
+export const FindUserFileService = (Data) => {
+ const params = new URLSearchParams();
+ for (let key in Data) {
+ params.append(key, Data[key])
+ }
+ return request.post('/file/file_list', params,{
+ headers: {
+ 'token': Data.token, //token
+ }
+ })
+}
+
+export const AddUserFileService = (Data) => {
+ const params = new URLSearchParams();
+ for (let key in Data) {
+ params.append(key, Data[key])
+ }
+ return request.post('/model/create', params,{
+ headers: {
+ 'token': Data.token, //token
+ }
+ })
+}
+
+export const UpdateUserFileService = (Data) => {
+ const params = new URLSearchParams();
+ for (let key in Data) {
+ params.append(key, Data[key])
+ }
+ return request.post('/file/file_update', params,{
+ headers: {
+ 'token': Data.token, //token
+ }
+ })
+}
+
+export const DelUserFileService = (Data) => {
+ const params = new URLSearchParams();
+ for (let key in Data) {
+ params.append(key, Data[key])
+ }
+ return request.post('/file/file_delete', params,{
+ headers: {
+ 'token': Data.token, //token
+ }
+ })
+}
\ No newline at end of file
diff --git a/src/components/menu.ts b/src/components/menu.ts
index e8cf98c..39ee585 100644
--- a/src/components/menu.ts
+++ b/src/components/menu.ts
@@ -36,7 +36,13 @@ export const menuData: Menus[] = [
pid: '1',
index: '/function',
title: '功能管理',
- }
+ },
+ {
+ id: '56',
+ pid: '1',
+ index: '/manage-file',
+ title: '文件管理',
+ },
],
},
diff --git a/src/router/index.ts b/src/router/index.ts
index 56f1cd5..648f9a1 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -50,6 +50,15 @@ const routes: RouteRecordRaw[] = [
},
component: () => import(/* webpackChunkName: "system-user" */ '../views/system/function.vue'),
},
+ {
+ path: '/manage-file',
+ name: 'manage-file',
+ meta: {
+ title: '文件管理',
+ permiss: '56',
+ },
+ component: () => import(/* webpackChunkName: "system-user" */ '../views/system/manage-file.vue'),
+ },
{
path: '/manage-session',
name: 'manage-session',
diff --git a/src/store/permiss.ts b/src/store/permiss.ts
index 9bf3d5b..5970d3f 100644
--- a/src/store/permiss.ts
+++ b/src/store/permiss.ts
@@ -52,6 +52,7 @@ export const usePermissStore = defineStore('permiss', {
'53', //通用人机对话
'54', //功能管理
'55', //提示词生成
+ '56', //文件管理
],
user: ['0', '8', '7','9', '61','53'],
},
diff --git a/src/types/file.ts b/src/types/file.ts
new file mode 100644
index 0000000..1f607b7
--- /dev/null
+++ b/src/types/file.ts
@@ -0,0 +1,6 @@
+export interface File {
+ name: string;
+ size: number;
+ type: string;
+ lastModified: number;
+}
\ No newline at end of file
diff --git a/src/views/element/upload.vue b/src/views/element/upload.vue
index 4766b6b..dd85b8b 100644
--- a/src/views/element/upload.vue
+++ b/src/views/element/upload.vue
@@ -1,11 +1,13 @@
支持拖拽
-
-
@@ -13,20 +15,51 @@
点击上传
-
-
支持裁剪
-
- vue-cropper:一个简单的vue图片裁剪插件。 访问地址:
-
vue-cropper。 示例请查看
-
个人中心-我的头像
-
diff --git a/src/views/system/file-chat.vue b/src/views/system/file-chat.vue
new file mode 100644
index 0000000..5ef22e6
--- /dev/null
+++ b/src/views/system/file-chat.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/system/gen-chat.vue b/src/views/system/gen-chat.vue
index 6291b01..eaaab78 100644
--- a/src/views/system/gen-chat.vue
+++ b/src/views/system/gen-chat.vue
@@ -2,9 +2,9 @@
-
- 新会话
-
+
+ 新会话
+
当前会话
@@ -30,21 +30,26 @@
+
Loading...
@@ -72,14 +81,24 @@
-
+
- 发送
+ 发送
@@ -93,13 +112,13 @@ 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, DocumentCopy} from '@element-plus/icons-vue'
+import { Check, Loading, DocumentCopy } from "@element-plus/icons-vue";
import MarkdownIt from "markdown-it";
import hljs from "highlight.js";
import { Session } from "@/types/session";
import { FindSessionService } from "@/api/session";
-import markdownItHighlightjs from 'markdown-it-highlightjs';
-import markdownItKatex from 'markdown-it-katex';
+import markdownItHighlightjs from "markdown-it-highlightjs";
+import markdownItKatex from "markdown-it-katex";
import mermaidPlugin from "@agoose77/markdown-it-mermaid";
import "katex/dist/katex.min.css";
interface Message {
@@ -147,34 +166,34 @@ const copyCode = (code: string) => {
};
const doButtonD = () => {
- const codeBlocks = document.querySelectorAll('pre code');
+ const codeBlocks = document.querySelectorAll("pre code");
codeBlocks.forEach((codeBlock) => {
//先查看是否已经添加了复制按钮
- if (codeBlock.parentNode.querySelector('.code-controls')) {
+ if (codeBlock.parentNode.querySelector(".code-controls")) {
return;
}
// 获取代码类型
- const codeType = codeBlock.className.replace('hljs ', '');
+ const codeType = codeBlock.className.replace("hljs ", "");
// 创建代码类型显示元素
- const codeTypeElement = document.createElement('span');
- codeTypeElement.textContent = codeType.split('-')[1];
+ const codeTypeElement = document.createElement("span");
+ codeTypeElement.textContent = codeType.split("-")[1];
codeTypeElement.setAttribute("background-color", "rgba(0, 0, 0, 0.1)");
codeTypeElement.setAttribute("padding", "3px 6px");
codeTypeElement.setAttribute("border-radius", "4px");
codeTypeElement.setAttribute("font-size", "0.9em");
// 创建复制按钮
- const copyButton = document.createElement('button');
+ const copyButton = document.createElement("button");
copyButton.setAttribute("background-color", "dodgerblue");
copyButton.setAttribute("display", "flex");
copyButton.setAttribute("align-items", "center");
copyButton.setAttribute("padding", "5px 10px");
copyButton.setAttribute("cursor", "pointer");
copyButton.setAttribute("border-radius", "4px");
- copyButton.textContent = '复制';
+ copyButton.textContent = "复制";
copyButton.classList.add();
- copyButton.addEventListener('click', () => {
+ copyButton.addEventListener("click", () => {
copyCode(codeBlock.textContent);
});
@@ -183,16 +202,14 @@ const doButtonD = () => {
// pre.style.position = 'relative';
// 创建一个容器用于放置代码类型和复制按钮
- const controlsContainer = document.createElement('div');
- controlsContainer.classList.add('code-controls');
+ const controlsContainer = document.createElement("div");
+ controlsContainer.classList.add("code-controls");
controlsContainer.appendChild(codeTypeElement);
controlsContainer.appendChild(copyButton);
// 将容器添加到代码块父元素中
pre.insertBefore(controlsContainer, codeBlock);
});
-
-
};
onMounted(() => {
@@ -250,6 +267,7 @@ onMounted(() => {
};
socket.value.onerror = (error) => {
+ socket.value = new WebSocket(url);
console.error("WebSocket 发生错误:", error);
};
});
@@ -271,10 +289,20 @@ const sendMessage = () => {
function: "gen-ai-chat",
session_id: sessionID.value,
};
+ try {
+ socket.value.send(JSON.stringify(msg));
+ } catch (e) {
+ ElMessage.error("发送失败!连接已断开!");
+ return;
+ }
+ if (sessionID.value == 0) {
+ sessionName.value = inputMessage.value;
+ }
messages.push({ role: "user", content: inputMessage.value, finished: true });
- socket.value.send(JSON.stringify(msg));
inputMessage.value = "";
- scrollToBottom();
+ nextTick(() => {
+ scrollToBottom(); // 新增滚动调用
+ });
loading.value = true;
if (sessionID.value == 0) {
sessionName.value = msg.msg;
@@ -351,11 +379,14 @@ const getMessage = async (session_id: number) => {
return {};
};
const copyMessage = (content: string) => {
- navigator.clipboard.writeText(content).then(() => {
- ElMessage.success('复制成功');
- }).catch((error) => {
- ElMessage.error('复制失败: ' + error);
- });
+ navigator.clipboard
+ .writeText(content)
+ .then(() => {
+ ElMessage.success("复制成功");
+ })
+ .catch((error) => {
+ ElMessage.error("复制失败: " + error);
+ });
};
diff --git a/src/views/system/manage-file.vue b/src/views/system/manage-file.vue
new file mode 100644
index 0000000..279fd14
--- /dev/null
+++ b/src/views/system/manage-file.vue
@@ -0,0 +1,211 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/system/manage-session.vue b/src/views/system/manage-session.vue
index 0f2ac03..8d82682 100644
--- a/src/views/system/manage-session.vue
+++ b/src/views/system/manage-session.vue
@@ -42,6 +42,12 @@ import TableSearch from '@/components/table-search.vue';
import { FormOption, FormOptionList } from '@/types/form-option';
const userRole = localStorage.getItem('role') == 'admin';
+const page = reactive({
+ index: 1,
+ size: 10,
+ total: 122,
+})
+const tableData = ref([]);
// 查询相关
const query = reactive({
@@ -76,12 +82,7 @@ let columns = ref([
{ prop: 'UpdatedAt', label: '更新时间',type: 'date',width: 150 },
{ prop: 'operator', label: '操作' , operate: { view: false, edit: true, delete: true,push: {link: true,label:"继续该会话"} }},
])
-const page = reactive({
- index: 1,
- size: 10,
- total: 122,
-})
-const tableData = ref([]);
+
const getData = async () => {
let req={
token: localStorage.getItem('token'),