diff --git a/server/config_handler.go b/server/config_handler.go index 655aa351..6c09e4ba 100644 --- a/server/config_handler.go +++ b/server/config_handler.go @@ -299,8 +299,8 @@ func (s *Server) ListApiKeysHandle(c *gin.Context) { // GetChatRoleListHandle 获取聊天角色列表 func (s *Server) GetChatRoleListHandle(c *gin.Context) { - var rolesOrder = []string{"gpt", "programmer", "teacher", "red_book", "dou_yin", "weekly_report", "girl_friend", - "kong_zi", "lu_xun", "steve_jobs", "elon_musk", "translator", "english_trainer", + var rolesOrder = []string{"gpt", "teacher", "translator", "english_trainer", "weekly_report", "girl_friend", + "kong_zi", "lu_xun", "steve_jobs", "elon_musk", "red_book", "dou_yin", "programmer", "seller", "good_comment", "psychiatrist", "artist"} var res = make([]interface{}, 0) var roles = GetChatRoles() diff --git a/server/server.go b/server/server.go index ee571aa6..716d1230 100644 --- a/server/server.go +++ b/server/server.go @@ -302,5 +302,8 @@ func (s *Server) LoginHandle(c *gin.Context) { return } - c.JSON(http.StatusOK, types.BizVo{Code: types.Success, Data: sessionId}) + c.JSON(http.StatusOK, types.BizVo{Code: types.Success, Data: struct { + User types.User `json:"user"` + SessionId string `json:"session_id"` + }{User: *user, SessionId: sessionId}}) } diff --git a/web/src/utils/storage.js b/web/src/utils/storage.js index 714e5f58..86aaad53 100644 --- a/web/src/utils/storage.js +++ b/web/src/utils/storage.js @@ -3,13 +3,23 @@ * storage handler */ -const SessionIdKey = 'ChatGPT_SESSION_ID'; +const SessionUserKey = 'LOGIN_USER'; export const Global = {} export function getSessionId() { - return sessionStorage.getItem(SessionIdKey) + const user = getLoginUser(); + return user ? user['session_id'] : ''; } -export function setSessionId(value) { - sessionStorage.setItem(SessionIdKey, value) +export function getLoginUser() { + const value = sessionStorage.getItem(SessionUserKey); + if (value) { + return JSON.parse(value); + } else { + return null; + } +} + +export function setLoginUser(value) { + sessionStorage.setItem(SessionUserKey, JSON.stringify(value)) } \ No newline at end of file diff --git a/web/src/views/Chat.vue b/web/src/views/Chat.vue index 14ae48c7..9f9d4320 100644 --- a/web/src/views/Chat.vue +++ b/web/src/views/Chat.vue @@ -102,12 +102,12 @@ import {defineComponent, nextTick} from 'vue' import ChatPrompt from "@/components/ChatPrompt.vue"; import ChatReply from "@/components/ChatReply.vue"; -import {randString} from "@/utils/libs"; +import {isMobile, randString} from "@/utils/libs"; import {ElMessage, ElMessageBox} from 'element-plus' import {Tools, Lock, Delete} from '@element-plus/icons-vue' import ConfigDialog from '@/components/ConfigDialog.vue' import {httpPost, httpGet} from "@/utils/http"; -import {getSessionId, setSessionId} from "@/utils/storage"; +import {getSessionId, setLoginUser} from "@/utils/storage"; import hl from 'highlight.js' import 'highlight.js/styles/a11y-dark.css' @@ -140,6 +140,11 @@ export default defineComponent({ }, mounted: function () { + if (!isMobile()) { + this.$router.push("plus"); + return; + } + nextTick(() => { this.chatBoxHeight = window.innerHeight - this.toolBoxHeight; ElMessage.warning("强烈建议使用PC浏览器访问获的更好的聊天体验!") @@ -379,7 +384,7 @@ export default defineComponent({ httpPost("/api/login", { token: this.token }).then((res) => { - setSessionId(res.data) + setLoginUser(res.data) this.connect(); this.loading = false; }).catch(() => { diff --git a/web/src/views/ChatPlus.vue b/web/src/views/ChatPlus.vue index 22bda815..3b18ae67 100644 --- a/web/src/views/ChatPlus.vue +++ b/web/src/views/ChatPlus.vue @@ -31,6 +31,16 @@
+ +
@@ -129,30 +139,32 @@ import {defineComponent, nextTick} from 'vue' import ChatPrompt from "@/components/plus/ChatPrompt.vue"; import ChatReply from "@/components/plus/ChatReply.vue"; -import {randString} from "@/utils/libs"; +import {isMobile, randString} from "@/utils/libs"; import {ElMessage, ElMessageBox} from 'element-plus' -import {Tools, Lock, Delete, Picture} from '@element-plus/icons-vue' +import {Tools, Lock, Delete, Picture, Search} from '@element-plus/icons-vue' import ConfigDialog from '@/components/ConfigDialog.vue' import {httpPost, httpGet} from "@/utils/http"; -import {getSessionId, setSessionId} from "@/utils/storage"; +import {getSessionId, setLoginUser} from "@/utils/storage"; import hl from 'highlight.js' import 'highlight.js/styles/a11y-dark.css' export default defineComponent({ name: "ChatPlus", - components: {ChatPrompt, ChatReply, Tools, Lock, Delete, Picture, ConfigDialog}, + components: {Search, ChatPrompt, ChatReply, Tools, Lock, Delete, Picture, ConfigDialog}, data() { return { title: 'ChatGPT 控制台', logo: 'images/logo.png', chatData: [], - chatRoles: [], + chatRoles: [], // 当前显示的角色集合 + allChatRoles: [], // 所有角色集合 role: 'gpt', inputValue: '', // 聊天内容 showConnectDialog: false, showLoginDialog: false, token: '', // 会话 token replyIcon: 'images/avatar/gpt.png', // 回复信息的头像 + roleName: "", // 搜索角色名称 lineBuffer: '', // 输出缓冲行 connectingMessageBox: null, // 保存重连的消息框对象 @@ -167,6 +179,11 @@ export default defineComponent({ }, mounted: function () { + if (isMobile()) { + this.$router.push("mobile"); + return; + } + nextTick(() => { this.resizeElement(); }) @@ -194,6 +211,7 @@ export default defineComponent({ httpGet("/api/config/chat-roles/get").then((res) => { // ElMessage.success('创建会话成功!'); this.chatRoles = res.data; + this.allChatRoles = res.data; this.loading = false }).catch(() => { ElMessage.error("获取聊天角色失败"); @@ -391,7 +409,7 @@ export default defineComponent({ httpPost("/api/login", { token: this.token }).then((res) => { - setSessionId(res.data) + setLoginUser(res.data) this.connect(); }).catch(() => { ElMessage.error("口令错误"); @@ -431,7 +449,22 @@ export default defineComponent({ }) }).catch(() => { }) - } + }, + + // 搜索聊天角色 + searchRole: function () { + if (this.roleName === '') { + this.chatRoles = this.allChatRoles; + return; + } + const roles = []; + for (let i = 0; i < this.allChatRoles.length; i++) { + if (this.allChatRoles[i].name.indexOf(this.roleName) !== -1) { + roles.push(this.allChatRoles[i]); + } + } + this.chatRoles = roles; + }, }, }) @@ -493,13 +526,25 @@ export default defineComponent({ .left-box { display flex + flex-flow column min-width 220px; max-width 250px; background-color: #28292A border-top: 1px solid #2F3032 border-right: 1px solid #2F3032 + .search-box { + flex-wrap wrap + padding 10px 15px; + + .el-input__wrapper { + background-color: #363535; + box-shadow: none + } + } + // 隐藏滚动条 + ::-webkit-scrollbar { width: 0; height: 0;