From fe7f021ddbfec5ca44480353f4c35c20866d21ba Mon Sep 17 00:00:00 2001 From: RockYang Date: Mon, 19 Jun 2023 11:09:23 +0800 Subject: [PATCH] feat: admin login page is ready --- api/go/handler/admin/admin_handler.go | 8 +- api/go/main.go | 1 + api/go/utils/user.go | 2 +- web/.env.production | 1 + web/src/actions/chat.js | 3 - web/src/main.js | 3 +- web/src/utils/storage.js | 14 +- web/src/views/ChatPlus.vue | 45 ++- web/src/views/admin/Admin.vue | 498 +++++++++++--------------- web/src/views/admin/Login.vue | 2 +- web/src/views/admin/Welcome.vue | 22 +- web/vue.config.js | 11 +- 12 files changed, 266 insertions(+), 344 deletions(-) delete mode 100644 web/src/actions/chat.js diff --git a/api/go/handler/admin/admin_handler.go b/api/go/handler/admin/admin_handler.go index c4fa0e0d..a59cad56 100644 --- a/api/go/handler/admin/admin_handler.go +++ b/api/go/handler/admin/admin_handler.go @@ -5,6 +5,7 @@ import ( "chatplus/core/types" "chatplus/handler" logger2 "chatplus/logger" + "chatplus/utils" "chatplus/utils/resp" "github.com/gin-contrib/sessions" @@ -35,7 +36,12 @@ func (h *ManagerHandler) Login(c *gin.Context) { } manager := h.App.AppConfig.Manager if data.Username == manager.Username && data.Password == manager.Password { - manager.Password = "" // 清空密码 + err := utils.SetLoginAdmin(c, manager) + if err != nil { + resp.ERROR(c, "Save session failed") + return + } + manager.Password = "" // 清空密码] resp.SUCCESS(c, manager) } else { resp.ERROR(c, "用户名或者密码错误") diff --git a/api/go/main.go b/api/go/main.go index a163f94d..f7785dfb 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -128,6 +128,7 @@ func main() { group := s.Engine.Group("/api/admin/") group.POST("login", h.Login) group.GET("logout", h.Logout) + group.GET("session", h.Session) }), fx.Invoke(func(s *core.AppServer, h *admin.ApiKeyHandler) { group := s.Engine.Group("/api/admin/apikey/") diff --git a/api/go/utils/user.go b/api/go/utils/user.go index 25dcfe03..41cf3e0b 100644 --- a/api/go/utils/user.go +++ b/api/go/utils/user.go @@ -19,7 +19,7 @@ func SetLoginUser(c *gin.Context, user model.User) error { func SetLoginAdmin(c *gin.Context, admin types.Manager) error { session := sessions.Default(c) - session.Set(types.SessionAdmin, admin) + session.Set(types.SessionAdmin, admin.Username) return session.Save() } diff --git a/web/.env.production b/web/.env.production index 87a04a4d..1ab0ff38 100644 --- a/web/.env.production +++ b/web/.env.production @@ -1,2 +1,3 @@ VUE_APP_API_HOST= VUE_APP_WS_HOST= +VUE_APP_BASE_URL= diff --git a/web/src/actions/chat.js b/web/src/actions/chat.js deleted file mode 100644 index db214e64..00000000 --- a/web/src/actions/chat.js +++ /dev/null @@ -1,3 +0,0 @@ -/** - * actions for chat page - */ \ No newline at end of file diff --git a/web/src/main.js b/web/src/main.js index a8fa9b41..18787504 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -18,11 +18,12 @@ const routes = [ {name: 'register', path: '/register', component: Register, meta: {title: '用户注册'}}, {name: 'plus', path: '/chat', component: ChatPlus, meta: {title: 'ChatGPT-智能助手V3'}}, {name: 'admin', path: '/admin', component: Admin, meta: {title: 'Chat-Plus 控制台'}}, - {name: 'admin/login', path: '/admin/login', component: AdminLogin, meta: {title: 'Chat-Plus 控制台登录'}}, + {name: 'admin-login', path: '/admin/login', component: AdminLogin, meta: {title: 'Chat-Plus 控制台登录'}}, {name: 'test', path: '/test', component: TestPage, meta: {title: '测试页面'}}, {name: 'NotFound', path: '/:all(.*)', component: NotFound, meta: {title: '页面没有找到'}}, ] +// console.log(MY_VARIABLE) const router = createRouter({ history: createWebHistory(), routes: routes, diff --git a/web/src/utils/storage.js b/web/src/utils/storage.js index 7aa7e815..866dff6b 100644 --- a/web/src/utils/storage.js +++ b/web/src/utils/storage.js @@ -5,20 +5,14 @@ */ const SessionUserKey = 'LOGIN_USER'; -const SessionAdminKey = 'LOGIN_ADMIN'; export function getSessionId() { const user = getLoginUser(); return user ? user['session_id'] : ''; } -export function getLoginAdmin() { - const value = sessionStorage.getItem(SessionAdminKey); - if (value) { - return JSON.parse(value); - } else { - return null; - } +export function removeLoginUser() { + sessionStorage.removeItem(SessionUserKey) } export function getLoginUser() { @@ -33,7 +27,3 @@ export function getLoginUser() { export function setLoginUser(user) { sessionStorage.setItem(SessionUserKey, JSON.stringify(user)) } - -export function setLoginAdmin(admin) { - sessionStorage.setItem(SessionAdminKey, JSON.stringify(admin)) -} diff --git a/web/src/views/ChatPlus.vue b/web/src/views/ChatPlus.vue index 2bd04040..f9620b90 100644 --- a/web/src/views/ChatPlus.vue +++ b/web/src/views/ChatPlus.vue @@ -183,9 +183,9 @@ - - + @@ -200,7 +200,6 @@ import { Close, Delete, Edit, - Monitor, Plus, Promotion, RefreshRight, Search, @@ -211,7 +210,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} from "@/utils/storage"; +import {getLoginUser, getSessionId, removeLoginUser} from "@/utils/storage"; import {httpGet, httpPost} from "@/utils/http"; import {useRouter} from "vue-router"; import Clipboard from "clipboard"; @@ -269,15 +268,15 @@ if (!user.value) { ElMessage.error('复制失败!'); }) }); -} -// 加载系统配置 -httpGet('/api/config/get?key=system').then(res => { - title.value = res.data.title; - models.value = res.data.models; -}).catch(e => { - ElMessage.error("加载系统配置失败: " + e.message) -}) + // 加载系统配置 + httpGet('/api/config/get?key=system').then(res => { + title.value = res.data.title; + models.value = res.data.models; + }).catch(e => { + ElMessage.error("加载系统配置失败: " + e.message) + }) +} const checkSession = function () { return new Promise((resolve, reject) => { @@ -631,6 +630,7 @@ const clearAllChats = function () { const logout = function () { activelyClose.value = true; httpGet('/api/user/logout').then(() => { + removeLoginUser(); router.push('login'); }).catch(() => { ElMessage.error('注销失败!'); @@ -720,8 +720,10 @@ const updateUser = function (data) { } - diff --git a/web/src/views/admin/Login.vue b/web/src/views/admin/Login.vue index dc5815c4..ebcb73e6 100644 --- a/web/src/views/admin/Login.vue +++ b/web/src/views/admin/Login.vue @@ -75,7 +75,7 @@ const login = function () { httpPost('/api/admin/login', {username: username.value.trim(), password: password.value.trim()}).then((res) => { setLoginUser(res.data) - router.push("admin") + router.push("/admin") }).catch((e) => { ElMessage.error('登录失败,' + e.message) }) diff --git a/web/src/views/admin/Welcome.vue b/web/src/views/admin/Welcome.vue index d1644d9a..0480371d 100644 --- a/web/src/views/admin/Welcome.vue +++ b/web/src/views/admin/Welcome.vue @@ -4,22 +4,14 @@ - diff --git a/web/vue.config.js b/web/vue.config.js index de05755e..8bcbe491 100644 --- a/web/vue.config.js +++ b/web/vue.config.js @@ -10,16 +10,11 @@ module.exports = defineConfig({ }, plugins: [ new webpack.optimize.MinChunkSizePlugin({minChunkSize: 10000}) - ], - // resolve: { - // fallback: { - // fs: false, - // path: require.resolve('path-browserify') - // } - // } + ] }, - publicPath: '/', + publicPath: process.env.NODE_ENV === 'production' ? '/' : '/', + outputDir: 'dist', crossorigin: "anonymous", devServer: {