From 2700b63887f943e64de40dcbf242e9a51a17b9e3 Mon Sep 17 00:00:00 2001 From: RockYang Date: Wed, 21 Jun 2023 18:44:18 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E8=B0=83=E6=95=B4=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=A1=86=E6=9E=B6=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/go/handler/admin/admin_handler.go | 35 ++++ api/go/handler/admin/user_handler.go | 17 -- api/go/handler/chat_handler.go | 10 +- api/go/main.go | 3 +- web/src/assets/css/color-dark.css | 45 +++-- web/src/assets/css/color-dark.styl | 30 +++ web/src/assets/css/main.css | 220 ++++++++++------------ web/src/assets/css/main.styl | 149 +++++++++++++++ web/src/assets/iconfont/iconfont.css | 10 +- web/src/assets/iconfont/iconfont.js | 2 +- web/src/assets/iconfont/iconfont.json | 7 + web/src/assets/iconfont/iconfont.ttf | Bin 7340 -> 7432 bytes web/src/assets/iconfont/iconfont.woff | Bin 4984 -> 5028 bytes web/src/assets/iconfont/iconfont.woff2 | Bin 4300 -> 4316 bytes web/src/components/admin/AdminHeader.vue | 49 ++++- web/src/components/admin/AdminSidebar.vue | 31 ++- web/src/components/admin/AdminTags.vue | 4 +- web/src/views/admin/ApiKey.vue | 21 +-- web/src/views/admin/Home.vue | 4 +- web/src/views/admin/Login.vue | 147 ++++++++------- web/src/views/admin/LoginLog.vue | 6 +- web/src/views/admin/RoleList.vue | 16 +- web/src/views/admin/UserList.vue | 23 ++- web/src/views/admin/demo/Table.vue | 75 ++++---- 24 files changed, 566 insertions(+), 338 deletions(-) create mode 100644 web/src/assets/css/color-dark.styl create mode 100644 web/src/assets/css/main.styl diff --git a/api/go/handler/admin/admin_handler.go b/api/go/handler/admin/admin_handler.go index a59cad56..c69727ea 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/store/model" "chatplus/utils" "chatplus/utils/resp" @@ -70,3 +71,37 @@ func (h *ManagerHandler) Session(c *gin.Context) { resp.SUCCESS(c) } } + +// TestUser 修正用户配置数据接口 +// 将用户订阅角色的数据结构从 map 改成数组 +func (h *ManagerHandler) TestUser(c *gin.Context) { + var users []model.User + h.db.Find(&users) + for _, u := range users { + var m map[string]int + var roleKeys = make([]string, 0) + err := utils.JsonDecode(u.ChatRoles, &m) + if err != nil { + continue + } + + for k, _ := range m { + roleKeys = append(roleKeys, k) + } + u.ChatRoles = utils.JsonEncode(roleKeys) + h.db.Updates(&u) + + } + resp.SUCCESS(c, "SUCCESS") +} + +// TestRole 修改角色图片,改成绝对路径 +func (h *ManagerHandler) TestRole(c *gin.Context) { + var roles []model.ChatRole + h.db.Find(&roles) + for _, r := range roles { + r.Icon = "/" + r.Icon + h.db.Updates(&r) + } + resp.SUCCESS(c, "SUCCESS") +} diff --git a/api/go/handler/admin/user_handler.go b/api/go/handler/admin/user_handler.go index bbb8b90e..96a4b4ed 100644 --- a/api/go/handler/admin/user_handler.go +++ b/api/go/handler/admin/user_handler.go @@ -143,20 +143,3 @@ func (h *UserHandler) LoginLog(c *gin.Context) { resp.SUCCESS(c, vo.NewPage(total, page, pageSize, logs)) } - -func (h *UserHandler) InitUser(c *gin.Context) { - var users []model.User - h.db.Find(&users) - for _, u := range users { - var m map[string]int - var roleKeys = make([]string, 0) - utils.JsonDecode(u.ChatRoles, &m) - for k, _ := range m { - roleKeys = append(roleKeys, k) - } - u.ChatRoles = utils.JsonEncode(roleKeys) - h.db.Updates(&u) - - } - resp.SUCCESS(c, "SUCCESS") -} diff --git a/api/go/handler/chat_handler.go b/api/go/handler/chat_handler.go index 4e9f1898..b24dca29 100644 --- a/api/go/handler/chat_handler.go +++ b/api/go/handler/chat_handler.go @@ -125,19 +125,19 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session types.ChatSession if userVo.Status == false { replyMessage(ws, "您的账号已经被禁用,如果疑问,请联系管理员!") - replyMessage(ws, "![](images/wx.png)") + replyMessage(ws, "![](/images/wx.png)") return nil } if userVo.Calls <= 0 { replyMessage(ws, "您的对话次数已经用尽,请联系管理员充值!") - replyMessage(ws, "![](images/wx.png)") + replyMessage(ws, "![](/images/wx.png)") return nil } if userVo.ExpiredTime > 0 && userVo.ExpiredTime <= time.Now().Unix() { replyMessage(ws, "您的账号已经过期,请联系管理员!") - replyMessage(ws, "![](images/wx.png)") + replyMessage(ws, "![](/images/wx.png)") return nil } var req = types.ApiRequest{ @@ -189,7 +189,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session types.ChatSession } replyMessage(ws, ErrorMsg) - replyMessage(ws, "![](images/wx.png)") + replyMessage(ws, "![](/images/wx.png)") return err } else { defer response.Body.Close() @@ -221,7 +221,7 @@ func (h *ChatHandler) sendMessage(ctx context.Context, session types.ChatSession if err != nil { // 数据解析出错 logger.Error(err, line) replyMessage(ws, ErrorMsg) - replyMessage(ws, "![](images/wx.png)") + replyMessage(ws, "![](/images/wx.png)") break } diff --git a/api/go/main.go b/api/go/main.go index 9d43fc3f..7b8cf8f7 100644 --- a/api/go/main.go +++ b/api/go/main.go @@ -125,6 +125,8 @@ func main() { group.POST("login", h.Login) group.GET("logout", h.Logout) group.GET("session", h.Session) + group.GET("test/user", h.TestUser) + group.GET("test/role", h.TestRole) }), fx.Invoke(func(s *core.AppServer, h *admin.ApiKeyHandler) { group := s.Engine.Group("/api/admin/apikey/") @@ -138,7 +140,6 @@ func main() { group.POST("update", h.Update) group.GET("remove", h.Remove) group.GET("loginLog", h.LoginLog) - group.GET("test", h.InitUser) }), fx.Invoke(func(s *core.AppServer, h *admin.ChatRoleHandler) { group := s.Engine.Group("/api/admin/role/") diff --git a/web/src/assets/css/color-dark.css b/web/src/assets/css/color-dark.css index 7f322765..e02e7a62 100644 --- a/web/src/assets/css/color-dark.css +++ b/web/src/assets/css/color-dark.css @@ -1,23 +1,22 @@ -.header{ - background-color: #242f42; -} -.login-wrap{ - background: #324157; -} -.plugins-tips{ - background: #eef1f6; -} -.plugins-tips a{ - color: #20a0ff; -} - -.tags-li.active { - border: 1px solid #409EFF; - background-color: #409EFF; -} -.message-title{ - color: #20a0ff; -} -.collapse-btn:hover{ - background: rgb(40,52,70); -} \ No newline at end of file +.admin-home .header { + background-color: #242f42; +} +.admin-home .login-wrap { + background: #324157; +} +.admin-home .plugins-tips { + background: #eef1f6; +} +.admin-home .plugins-tips a { + color: #20a0ff; +} +.admin-home .tags-li.active { + border: 1px solid #409eff; + background-color: #409eff; +} +.admin-home .message-title { + color: #20a0ff; +} +.admin-home .collapse-btn:hover { + background: #283446; +} diff --git a/web/src/assets/css/color-dark.styl b/web/src/assets/css/color-dark.styl new file mode 100644 index 00000000..a6677788 --- /dev/null +++ b/web/src/assets/css/color-dark.styl @@ -0,0 +1,30 @@ +.admin-home { + .header { + background-color: #242f42; + } + + .login-wrap { + background: #324157; + } + + .plugins-tips { + background: #eef1f6; + } + + .plugins-tips a { + color: #20a0ff; + } + + .tags-li.active { + border: 1px solid #409EFF; + background-color: #409EFF; + } + + .message-title { + color: #20a0ff; + } + + .collapse-btn:hover { + background: rgb(40, 52, 70); + } +} \ No newline at end of file diff --git a/web/src/assets/css/main.css b/web/src/assets/css/main.css index 6b2241c9..46646e31 100644 --- a/web/src/assets/css/main.css +++ b/web/src/assets/css/main.css @@ -1,138 +1,118 @@ * { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } - html, body, #app, .wrapper { - width: 100%; - height: 100%; - overflow: hidden; + width: 100%; + height: 100%; + overflow: hidden; } - body { - font-family: 'PingFang SC', "Helvetica Neue", Helvetica, "microsoft yahei", arial, STHeiTi, sans-serif; + font-family: 'PingFang SC', "Helvetica Neue", Helvetica, "microsoft yahei", arial, STHeiTi, sans-serif; } - -a { - text-decoration: none +.admin-home a { + text-decoration: none; } - - -.content-box { - position: absolute; - left: 250px; - right: 0; - top: 70px; - bottom: 0; - padding-bottom: 30px; - -webkit-transition: left .3s ease-in-out; - transition: left .3s ease-in-out; - background: #f0f0f0; +.admin-home .content-box { + position: absolute; + left: 250px; + right: 0; + top: 70px; + bottom: 0; + padding-bottom: 30px; + -webkit-transition: left 0.3s ease-in-out; + transition: left 0.3s ease-in-out; + background: #f0f0f0; } - -.content { - width: auto; - height: 100%; - padding: 10px; - overflow-y: scroll; - box-sizing: border-box; -} - -.content-collapse { - left: 65px; -} - -.container { - padding: 30px; - background: #fff; - border: 1px solid #ddd; - border-radius: 5px; -} - -.crumbs { - margin: 10px 0; -} - -.el-table th { - background-color: #f5f7fa !important; -} - -.pagination { - margin: 20px 0; - text-align: right; -} - -.plugins-tips { - padding: 20px 10px; - margin-bottom: 20px; -} - -.el-button + .el-tooltip { - margin-left: 10px; -} - -.el-table tr:hover { - background: #f6faff; -} - -.mgb20 { - margin-bottom: 20px; -} - -.move-enter-active, -.move-leave-active { - transition: opacity .1s ease; -} - -.move-enter-from, -.move-leave-to { - opacity: 0; -} - +.admin-home .content-box .content { + width: auto; + height: 100%; + padding: 10px; + overflow-y: scroll; + box-sizing: border-box; /*BaseForm*/ - -.form-box { - width: 600px; } - -.form-box .line { - text-align: center; +.admin-home .content-box .content .container { + padding: 30px; + background: #fff; + border: 1px solid #ddd; + border-radius: 5px; } - -.el-time-panel__content::after, -.el-time-panel__content::before { - margin-top: -7px; +.admin-home .content-box .content .container .handle-box { + margin-bottom: 20px; } - -.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) { - padding-bottom: 0; +.admin-home .content-box .content .crumbs { + margin: 10px 0; } - - -[class*=" el-icon-"], [class^=el-icon-] { - speak: none; - font-style: normal; - font-weight: 400; - font-variant: normal; - text-transform: none; - line-height: 1; - vertical-align: baseline; - display: inline-block; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; +.admin-home .content-box .content .el-table th { + background-color: #f5f7fa !important; } - -.el-sub-menu [class^=el-icon-] { - vertical-align: middle; - margin-right: 5px; - width: 24px; - text-align: center; - font-size: 18px; +.admin-home .content-box .content .pagination { + margin: 20px 0; + display: flex; + justify-content: center; + width: 100%; +} +.admin-home .content-box .content .plugins-tips { + padding: 20px 10px; + margin-bottom: 20px; +} +.admin-home .content-box .content .el-button + .el-tooltip { + margin-left: 10px; +} +.admin-home .content-box .content .el-table tr:hover { + background: #f6faff; +} +.admin-home .content-box .content .mgb20 { + margin-bottom: 20px; +} +.admin-home .content-box .content .move-enter-active, +.admin-home .content-box .content .move-leave-active { + transition: opacity 0.1s ease; +} +.admin-home .content-box .content .move-enter-from, +.admin-home .content-box .content .move-leave-to { + opacity: 0; +} +.admin-home .content-box .content .form-box { + width: 600px; +} +.admin-home .content-box .content .form-box .line { + text-align: center; +} +.admin-home .content-box .content .el-time-panel__content::after, +.admin-home .content-box .content .el-time-panel__content::before { + margin-top: -7px; +} +.admin-home .content-box .content .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) { + padding-bottom: 0; +} +.admin-home .content-box .content [class*=" el-icon-"], +.admin-home .content-box .content [class^=el-icon-] { + speak: none; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: baseline; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.admin-home .content-box .content .el-sub-menu [class^=el-icon-] { + vertical-align: middle; + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; +} +.admin-home .content-box .content [hidden] { + display: none !important; +} +.admin-home .content-collapse { + left: 65px; } - -[hidden] { - display: none !important; -} \ No newline at end of file diff --git a/web/src/assets/css/main.styl b/web/src/assets/css/main.styl new file mode 100644 index 00000000..6d7e7169 --- /dev/null +++ b/web/src/assets/css/main.styl @@ -0,0 +1,149 @@ +* { + margin: 0; + padding: 0; +} + +html, +body, +#app, +.wrapper { + width: 100%; + height: 100%; + overflow: hidden; +} + +body { + font-family: 'PingFang SC', "Helvetica Neue", Helvetica, "microsoft yahei", arial, STHeiTi, sans-serif; +} + +.admin-home { + a { + text-decoration: none + } + + .content-box { + position: absolute; + left: 250px; + right: 0; + top: 70px; + bottom: 0; + padding-bottom: 30px; + -webkit-transition: left .3s ease-in-out; + transition: left .3s ease-in-out; + background: #f0f0f0; + + .content { + width: auto; + height: 100%; + padding: 10px; + overflow-y: scroll; + box-sizing: border-box; + + .container { + padding: 30px; + background: #fff; + border: 1px solid #ddd; + border-radius: 5px; + + .handle-box { + margin-bottom: 20px; + } + } + + .crumbs { + margin: 10px 0; + } + + .el-table th { + background-color: #f5f7fa !important; + } + + .pagination { + margin: 20px 0; + display: flex; + justify-content: center; + width: 100%; + } + + .plugins-tips { + padding: 20px 10px; + margin-bottom: 20px; + } + + .el-button + .el-tooltip { + margin-left: 10px; + } + + .el-table tr:hover { + background: #f6faff; + } + + .mgb20 { + margin-bottom: 20px; + } + + .move-enter-active, + .move-leave-active { + transition: opacity .1s ease; + } + + .move-enter-from, + .move-leave-to { + opacity: 0; + } + + /*BaseForm*/ + + .form-box { + width: 600px; + } + + .form-box .line { + text-align: center; + } + + .el-time-panel__content::after, + .el-time-panel__content::before { + margin-top: -7px; + } + + .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) { + padding-bottom: 0; + } + + + [class*=" el-icon-"], [class^=el-icon-] { + speak: none; + font-style: normal; + font-weight: 400; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: baseline; + display: inline-block; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + .el-sub-menu [class^=el-icon-] { + vertical-align: middle; + margin-right: 5px; + width: 24px; + text-align: center; + font-size: 18px; + } + + [hidden] { + display: none !important; + } + } + } + + .content-collapse { + left: 65px; + } +} + + + + diff --git a/web/src/assets/iconfont/iconfont.css b/web/src/assets/iconfont/iconfont.css index a996e61d..faf6be13 100644 --- a/web/src/assets/iconfont/iconfont.css +++ b/web/src/assets/iconfont/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 4125778 */ - src: url('iconfont.woff2?t=1687330009953') format('woff2'), - url('iconfont.woff?t=1687330009953') format('woff'), - url('iconfont.ttf?t=1687330009953') format('truetype'); + src: url('iconfont.woff2?t=1687341905766') format('woff2'), + url('iconfont.woff?t=1687341905766') format('woff'), + url('iconfont.ttf?t=1687341905766') format('truetype'); } .iconfont { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.icon-sub-menu:before { + content: "\e86b"; +} + .icon-wechat-pay:before { content: "\e639"; } diff --git a/web/src/assets/iconfont/iconfont.js b/web/src/assets/iconfont/iconfont.js index 8ae4572f..264aa565 100644 --- a/web/src/assets/iconfont/iconfont.js +++ b/web/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4125778='',function(a){var l=(l=document.getElementsByTagName("script"))[l.length-1],c=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var t,o,i,e,h,n=function(l,c){c.parentNode.insertBefore(l,c)};if(c&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}t=function(){var l,c=document.createElement("div");c.innerHTML=a._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?n(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),t()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=t,e=a.document,h=!1,d(),e.onreadystatechange=function(){"complete"==e.readyState&&(e.onreadystatechange=null,s())})}function s(){h||(h=!0,i())}function d(){try{e.documentElement.doScroll("left")}catch(l){return void setTimeout(d,50)}s()}}(window); \ No newline at end of file +window._iconfont_svg_string_4125778='',function(a){var l=(l=document.getElementsByTagName("script"))[l.length-1],c=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var t,o,i,e,h,s=function(l,c){c.parentNode.insertBefore(l,c)};if(c&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}t=function(){var l,c=document.createElement("div");c.innerHTML=a._iconfont_svg_string_4125778,(c=c.getElementsByTagName("svg")[0])&&(c.setAttribute("aria-hidden","true"),c.style.position="absolute",c.style.width=0,c.style.height=0,c.style.overflow="hidden",c=c,(l=document.body).firstChild?s(c,l.firstChild):l.appendChild(c))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),t()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=t,e=a.document,h=!1,d(),e.onreadystatechange=function(){"complete"==e.readyState&&(e.onreadystatechange=null,n())})}function n(){h||(h=!0,i())}function d(){try{e.documentElement.doScroll("left")}catch(l){return void setTimeout(d,50)}n()}}(window); \ No newline at end of file diff --git a/web/src/assets/iconfont/iconfont.json b/web/src/assets/iconfont/iconfont.json index 93b5ee4d..56a70d2f 100644 --- a/web/src/assets/iconfont/iconfont.json +++ b/web/src/assets/iconfont/iconfont.json @@ -5,6 +5,13 @@ "css_prefix_text": "icon-", "description": "", "glyphs": [ + { + "icon_id": "6343824", + "name": "menu", + "font_class": "sub-menu", + "unicode": "e86b", + "unicode_decimal": 59499 + }, { "icon_id": "1487626", "name": "微信支付", diff --git a/web/src/assets/iconfont/iconfont.ttf b/web/src/assets/iconfont/iconfont.ttf index 22a40db837974b0e82698b94e01e7d5e6cd9c680..70a94037aae06f2be5cdc006b73ddf673ff7891c 100644 GIT binary patch delta 772 zcma)&zfTik9LAsb?)rmLg_f28Hb4VJtcY=t1Z}i2`~ez?qjEr{Nhz&qNkE65gTX-! zc#|#~Oq@(KVR7itusAq%Fkx^|W8QX95(hh|3jS3y7t2S#xo$eD(=|4`eFG7r|X)opp_j z<_eXyD>Kdk^}ev5T`n$|C-+WkJU`2RqF}C-#5i8^dmsDZ6|<1-em0PP1@u!uTPhXH zm4?5)4J1bS!^f@K$oV(~OH%!L=i9Ze^mlX`d_fDZZ#Dkzj^k8~&-!ilL2#b8+;eez zP}~p+dsCS9S22Gy>Zw75p?lQ?_Yg-%VR)HR7-ki+pK4x=;&}E?uY! z>Gp*BkO>7RK_(TP37JxGI^?8+J|Isi=m>J!qssg&iVE6@9IB{i^jgME!MTN^ZK(l(3OO>otM z7Fy;nP@%XG6xxN0uG}byf>4WyN*8idL|nBy?fBhX+igf5#ex3F@IbAH* z>enyDe^~D)?^jEev2bv2V1xPRdC!%@dR4Muz8vPgcPcDTbUitme*qjRvEgL3GFuy6 ze0LW(#w2VmuV*d>5SnEA!PnHS&ipPqd^#xM<(1KYXB@{3|GRgecMWB|TsAL=PRO(z zkCr5icI9SPx4aMquVtO#nPO`VADfKtM=vcM&8fcVk;-}VaU6Y6*&D()|MLKy=*9u; zLmN8Kg&tNH97K|R64bVz>e|@>l3cy!DQPg$uASBnM#50Pg_U3!X<a?&rOpn86 zo3w)+VNN>O8z$$V3YY;0^}w8U*ttz(m>aPl!&DqC5i7I_g~Pmda0HmQ4i1CnM+e73 z^OJ)EqWQ~Vf5djd!J)A|@37-@6(o@Nr&L<4s6Fqgx8)D{8;Ox*F8R1^LD%#f{iVI0 VV(98xV)>8+(dBf%Aeu`r{slbIkL&;d diff --git a/web/src/assets/iconfont/iconfont.woff b/web/src/assets/iconfont/iconfont.woff index b18e8505df7eb9be715fe8f1bcf82650cbef5363..23aaf9519ded24e3e87283b140d096ec304d0980 100644 GIT binary patch delta 4536 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 WiH$VDi(dI5G>m-!_jWZ%0000xB$YP+ delta 4518 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 K!U$vl0001zVm6=v literal 4300 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
Dm$((CY6lm$DZQv z=bsA3;jzSyOO;YdL4l+KfC{A*V=o@c+)W741M~SAx zO&c?`XEuI?8HYi{t#5SUQ;&+xx01mkhR##FVac1AXS(L7_i69GdQZ)957Nmu$j%jc zuKIwJvOnH)S*a*1Q#2A7Y}5xo@NMnFA``QATNl_?>zPwjJ6|)R-kso3d*s0w+z}`Tc&ULy67IA*ZMfH(F_JgG;be zY7fsD`FaQ5Wr=z=rxNN%^oc4HPEM^57}@tNr5_I!=#0Y4`f84EQLau*$~XojL%)m} ztp*KWD_EuzsQC@883x`eAEb(({y`8R_>j)83Rfq4Cyl8bwfJ4sRZYF1|V@u2NMCTC6!c zraKIr4}VBm$v4~6z8xM@5_z$5#@;*+kXN+wUcYKQy8f&~u^E?#wvOJyz1&1RiKK42 zHG(@l`gxvgCb-O9GHMw*1h+}yI7|8IHNoTe$8yeeN6vODXi?S1RaVE;#e>$tLWAz! zmapI(01W;xV;}JaCnw@G3)+$c*S6qTI*wB<_%IVko%DV>9v7iH?4;K6GKg{HZ`6lZ z5Aj&!56f0jQy{{e+cQ{ z`^W#do?gVuG+erVz*&Jyx{_a3UQlOSgHxf*z`PXuF6YDaaQ9+97oCl!$G)hv%6LnG z|Go{@*b;J&^WZPYzO_exVJ=aQ0S(cR37QzPSz-xX(8iG465m#0&4EIbDamzUp#w`q zYQqv0`$Pjn&Y_7R_m)^{188H&?dEMxWZ3R zF>G2*K`nE2w*P+bfYqx>MD%={ByPRR>kAP=g%doFyd|AAC+aX4R%y6m8iFAyxeX!d z2*CP~jf5t#bq3TeCRG)}>YRkVuU0|jY5M-A^K-i0IbZLt3^AnTq9iM-rW>YZJ1)1! z>+=V61?40sog5Y#+eT3r1XoFVR@HZbnZpKVs=Do`HQIF_ffD2EdaKLIld54JHkNo1 uhp}kk270@colgP`Gr}6yT1Ho4eDbQ3F -
+
+
@@ -9,8 +13,6 @@
- -
@@ -87,6 +89,21 @@ const avatar = ref('/images/user-info.jpg') const donateImg = ref('/images/wechat-pay.png') const showDialog = ref(false) const sidebar = useSidebarStore(); +const title = ref('Chat-Plus 控制台') +const logo = ref('/images/logo.png') + +// 获取会话信息 +httpGet("/api/admin/session").then(() => { + // 加载系统配置 + httpGet('/api/admin/config/get?key=system').then(res => { + title.value = res.data['admin_title']; + }).catch(e => { + ElMessage.error("加载系统配置失败: " + e.message) + }) +}).catch(() => { + router.replace('/admin/login') +}) + // 侧边栏折叠 const collapseChange = () => { sidebar.handleCollapse(); @@ -101,7 +118,7 @@ onMounted(() => { const router = useRouter(); const logout = function () { httpGet("/api/admin/logout").then(() => { - router.push('/admin/login') + router.replace('/admin/login') }).catch((e) => { ElMessage.error("注销失败: " + e.message); }) @@ -128,13 +145,18 @@ const logout = function () { .logo { float: left; - width: 250px; - line-height: 70px; + padding-left 10px; + display flex + + .text { + line-height: 66px; + margin-left 10px; + } } .header-right { float: right; - padding-right: 50px; + padding-right: 20px; .header-user-con { display: flex; @@ -208,4 +230,17 @@ const logout = function () { } } } + +.admin-header { + .logo { + .el-image { + padding-top 10px + + .el-image__inner { + height 40px + } + } + } +} + diff --git a/web/src/components/admin/AdminSidebar.vue b/web/src/components/admin/AdminSidebar.vue index 61298b3c..0ba406d4 100644 --- a/web/src/components/admin/AdminSidebar.vue +++ b/web/src/components/admin/AdminSidebar.vue @@ -14,7 +14,7 @@