From f01fdd00704adda0c757411b5d9937bd5cade435 Mon Sep 17 00:00:00 2001 From: RockYang Date: Sun, 25 Jun 2023 17:01:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20vue-mobile=20=3D>=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E8=81=8A=E5=A4=A9=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=A1=B5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- web/src/main.js | 18 ++ web/src/router.js | 13 +- web/src/store/chat.js | 11 + .../{utils/storage.js => store/session.js} | 0 web/src/utils/http.js | 2 +- web/src/views/ChatPlus.vue | 20 +- web/src/views/Login.vue | 15 +- web/src/views/admin/Login.vue | 2 +- .../views/mobile/{Chat.vue => ChatList.vue} | 77 +++-- web/src/views/mobile/ChatSession.vue | 264 ++++++++++++++++++ 11 files changed, 385 insertions(+), 41 deletions(-) create mode 100644 web/src/store/chat.js rename web/src/{utils/storage.js => store/session.js} (100%) rename web/src/views/mobile/{Chat.vue => ChatList.vue} (68%) create mode 100644 web/src/views/mobile/ChatSession.vue diff --git a/README.md b/README.md index 3b46e050..a9b0915d 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ * 聊天体验跟 ChatGPT 官方版本完全一致。 * 内置了各种预训练好的角色,比如小红书写手,英语翻译大师,苏格拉底,孔子,乔布斯,周报助手等。轻松满足你的各种聊天和应用需求。 -**本项目基于 MIT 协议,免费开放全部源代码,可以作为个人学习使用或者商用。如需商用建议联系作者登记,仅做统计使用,优秀项目我们将在项目首页为您展示。 -** +**本项目基于 MIT 协议,免费开放全部源代码,可以作为个人学习使用或者商用。如需商用建议联系作者登记,仅做统计使用, +优秀项目我们将在项目首页为您展示。** ## 功能截图 diff --git a/web/src/main.js b/web/src/main.js index f6962bd8..f55099a6 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -5,8 +5,15 @@ import 'vant/lib/index.css'; import App from './App.vue' import {createPinia} from "pinia"; import { + Button, Cell, + CellGroup, ConfigProvider, + DropdownItem, + DropdownMenu, + Field, + Form, + Icon, Image, List, NavBar, @@ -14,6 +21,8 @@ import { Picker, Popup, Search, + Sticky, + SwipeCell, Tabbar, TabbarItem, TextEllipsis @@ -34,6 +43,15 @@ app.use(Notify) app.use(Picker) app.use(Popup) app.use(List); +app.use(Form); +app.use(Field); +app.use(CellGroup); +app.use(Button); +app.use(DropdownMenu); +app.use(Icon); +app.use(DropdownItem); +app.use(Sticky); +app.use(SwipeCell); app.use(router).use(ElementPlus).mount('#app') diff --git a/web/src/router.js b/web/src/router.js index 97f21a94..5e6f7ed9 100644 --- a/web/src/router.js +++ b/web/src/router.js @@ -102,17 +102,22 @@ const routes = [ ] }, + { + path: '/mobile/chat/session', + name: 'mobile-chat-session', + component: () => import('@/views/mobile/ChatSession.vue'), + }, { name: 'mobile', path: '/mobile', meta: {title: 'ChatGPT-智能助手V3'}, component: () => import('@/views/mobile/Home.vue'), - redirect: '/mobile/chat', + redirect: '/mobile/chat/list', children: [ { - path: '/mobile/chat', - name: 'mobile-chat', - component: () => import('@/views/mobile/Chat.vue'), + path: '/mobile/chat/list', + name: 'mobile-chat-list', + component: () => import('@/views/mobile/ChatList.vue'), }, { path: '/mobile/setting', diff --git a/web/src/store/chat.js b/web/src/store/chat.js new file mode 100644 index 00000000..09fa0d18 --- /dev/null +++ b/web/src/store/chat.js @@ -0,0 +1,11 @@ +import Storage from 'good-storage' + +const CHAT_CONFIG_KEY = "chat_config" + +export function getChatConfig() { + return Storage.get(CHAT_CONFIG_KEY) +} + +export function setChatConfig(chatConfig) { + Storage.set(CHAT_CONFIG_KEY, chatConfig) +} \ No newline at end of file diff --git a/web/src/utils/storage.js b/web/src/store/session.js similarity index 100% rename from web/src/utils/storage.js rename to web/src/store/session.js diff --git a/web/src/utils/http.js b/web/src/utils/http.js index 10c01e05..8cf8630b 100644 --- a/web/src/utils/http.js +++ b/web/src/utils/http.js @@ -1,5 +1,5 @@ import axios from 'axios' -import {getSessionId} from "@/utils/storage"; +import {getSessionId} from "@/store/session"; axios.defaults.timeout = 10000 axios.defaults.baseURL = process.env.VUE_APP_API_HOST diff --git a/web/src/views/ChatPlus.vue b/web/src/views/ChatPlus.vue index 36ea3bd1..ddbccc36 100644 --- a/web/src/views/ChatPlus.vue +++ b/web/src/views/ChatPlus.vue @@ -212,7 +212,7 @@ import 'highlight.js/styles/a11y-dark.css' import {dateFormat, randString, removeArrayItem, renderInputText, UUID} from "@/utils/libs"; import {ElMessage, ElMessageBox} from "element-plus"; import hl from "highlight.js"; -import {getLoginUser, getSessionId, removeLoginUser} from "@/utils/storage"; +import {getLoginUser, getSessionId, removeLoginUser} from "@/store/session"; import {httpGet, httpPost} from "@/utils/http"; import {useRouter} from "vue-router"; import Clipboard from "clipboard"; @@ -232,7 +232,7 @@ const mainWinHeight = ref(0); // 主窗口高度 const chatBoxHeight = ref(0); // 聊天内容框高度 const leftBoxHeight = ref(0); const loading = ref(true); -const user = ref(getLoginUser()); +const user = getLoginUser(); const roles = ref([]); const roleId = ref(0) const newChatItem = ref(null); @@ -246,7 +246,7 @@ onMounted(() => { checkSession().then(() => { isLogin.value = true // 加载角色列表 - httpGet(`/api/role/list?user_id=${user.value.id}`).then((res) => { + httpGet(`/api/role/list?user_id=${user.id}`).then((res) => { roles.value = res.data; roleId.value = roles.value[0]['id']; // 获取会话列表 @@ -265,8 +265,9 @@ onMounted(() => { }).catch(e => { ElMessage.error("加载系统配置失败: " + e.message) }) - }).catch(() => { - router.push('login') + }).catch((e) => { + console.log(e) + //router.push('login') }); const clipboard = new Clipboard('.copy-reply'); @@ -281,7 +282,7 @@ onMounted(() => { // 加载会话 const loadChats = function () { - httpGet("/api/chat/list?user_id=" + user.value.id).then((res) => { + httpGet("/api/chat/list?user_id=" + user.id).then((res) => { if (res.data) { chatList.value = res.data; allChats.value = res.data; @@ -405,7 +406,6 @@ const removeChat = function (event, chat) { // 创建 socket 连接 const prompt = ref(''); -// const replyIcon = 'images/avatar/gpt.png';// 回复信息的头像 const showStopGenerate = ref(false); // 停止生成 const showReGenerate = ref(false); // 重新生成 const previousText = ref(''); // 上一次提问 @@ -570,7 +570,7 @@ const sendMessage = function () { chatData.value.push({ type: "prompt", id: randString(32), - icon: user.value.avatar, + icon: user.avatar, content: renderInputText(prompt.value), created_at: new Date().getTime(), }); @@ -707,8 +707,8 @@ const searchChat = function () { } const updateUser = function (data) { - user.value.avatar = data.avatar; - user.value.nickname = data.nickname; + user.avatar = data.avatar; + user.nickname = data.nickname; } diff --git a/web/src/views/Login.vue b/web/src/views/Login.vue index 7db425ba..0950a061 100644 --- a/web/src/views/Login.vue +++ b/web/src/views/Login.vue @@ -4,7 +4,7 @@
{{ title }}
@@ -40,7 +40,7 @@
- +
@@ -52,9 +52,10 @@ import {onMounted, ref} from "vue"; import {Lock, UserFilled} from "@element-plus/icons-vue"; import {httpPost} from "@/utils/http"; import {ElMessage} from "element-plus"; -import {setLoginUser} from "@/utils/storage"; +import {setLoginUser} from "@/store/session"; import {useRouter} from "vue-router"; import FooterBar from "@/components/FooterBar.vue"; +import {isMobile} from "@/utils/libs"; const router = useRouter(); const title = ref('ChatGPT-PLUS 用户登录'); @@ -79,8 +80,11 @@ const login = function () { httpPost('/api/user/login', {username: username.value.trim(), password: password.value.trim()}).then((res) => { setLoginUser(res.data) - router.push("chat") - + if (isMobile()) { + router.push('/mobile') + } else { + router.push('chat') + } }).catch((e) => { ElMessage.error('登录失败,' + e.message) }) @@ -118,6 +122,7 @@ const login = function () { .logo { text-align center + .el-image { width 120px; } diff --git a/web/src/views/admin/Login.vue b/web/src/views/admin/Login.vue index b736a0ab..4e58c4e4 100644 --- a/web/src/views/admin/Login.vue +++ b/web/src/views/admin/Login.vue @@ -48,7 +48,7 @@ import {onMounted, ref} from "vue"; import {Lock, UserFilled} from "@element-plus/icons-vue"; import {httpPost} from "@/utils/http"; import {ElMessage} from "element-plus"; -import {setLoginUser} from "@/utils/storage"; +import {setLoginUser} from "@/store/session"; import {useRouter} from "vue-router"; import FooterBar from "@/components/FooterBar.vue"; diff --git a/web/src/views/mobile/Chat.vue b/web/src/views/mobile/ChatList.vue similarity index 68% rename from web/src/views/mobile/Chat.vue rename to web/src/views/mobile/ChatList.vue index 4dd4f7d5..5ebc0e90 100644 --- a/web/src/views/mobile/Chat.vue +++ b/web/src/views/mobile/ChatList.vue @@ -1,10 +1,13 @@