BxK2^dm`XE%l-kYYuDNBm<*2M z#PY&IrCuK0)_-rPa#&tS((qk{(wFy9C6n9bBQMRQeqC;uPe*ioQ!+r4uY;zApNe-$ z)A8}&hE?OsujamH`BX$5LJ&W7?EBT!;TZvD>@DXR4y~R6^jJK76K2i03A?_?`zNIT zdP9sdg-`0F#hS@zP@t}DGAb?RxUL4Jm9^08GQ^?dC*jKp$@ z{hIkV2}RTQEFGNsA|?huoO58zqCGMmJ(3^K0@`xi -`PkBP!4FOg~S9OIq#R9V%F(N-y-Sk05 zUokr^LP|x7(h^NXHaKg8PtWRfDG#D;s90KidsK_1PbscS!Ofi=N?mLi;8Llr38n6R z&g0=+rW)~<;A+=LetD|Fp1N2$=jwg-BO>dk>!^kBT(XfY=)#~YKjZTu;HoNI1JalK zvlsd|pVs_~DyH^@V2kYg>OT|4jvq?Jc)&jrS}%xz%LUh#*hTgIu@~Uoop*nr^A&;9 zEDMo~HL`#cTjp+XsU$EPQ+;O{Ba}pp4c4-o2)Nw;q;gJ-;HHGFVyUNKOZfqx*y=k! zFhYsMd%;@j69FfnM$Sgvs^M_|lj>A4V)`mBVnCDM@%!2Q?|@IMGyU|27R0&y!ThzS za3Jewil0gp*chFRA30Y@bdM}4JhQqYl|+w4!Czgv)h?j|qohUOoT^f=c5phV<}QJw zXS2EHyb=w=Q-~Iu&AnN?zwnv>Wu39YcU~?KbYlN988inmD0uq=4~snF`$^>Vku{i% z8rs!HPg->CobM&DUjH#B+$)1?5B*71g=nK$C$!z~oe^>#phhttOnE-U=scuT6y$E) zw?DaD>D!US=^R=)6#g^eY;P!mO8Lgk>VZJ^yve$A6+qg3PoFW_d1GV?h87cblxJQ` zCDGiSY|g~iAaKqDNqiSi+JO?RSGT@lKp=+IjGW)b(X!XyQnL0;bRK=kY=t1j&&S=& zL5)c?z3!1LMS}H@uF6bVC`$s=Tk>Sl7vPOz9@d$}f{aix 1uoC|3OR8__BJZkqdc@HRjDEs4SR7xl@LA6Lwh!0de`BpP{9;dWO_*FGc^nb z)=x?e{e5Q@`(ZP=W$Na3OCSvV$;#`h%8`VE?fnlwSyUJbUVlDN7UkfSq3nF2n_8(L zQe%6up2v)=DDB@l-Yj?zV`ng!{PU8~J&a&bh0Ynq{`^Y-Ux*$hq~;Aah_qj%F8VT1 z%}VU@S5XJ`Ao@4vG8E^RUm6~XrAK=T@~!4+3Zt8g8?QAQiPBA|%AKOHXzpmHnIhPw zbM(-n>lhv@GAj<<>7~Q`NQbowdV!J(w91gKCq=^0D&5unWs&46DVLtXhfvzTJ3>Bf zK^?QrIE`6 }szREcaIX(})ciA +a z!zxKdPW){AzjY4(Km0Gv)c@s>tnW(qMi0N>bwg}He{9QzBhQC>dxiVxUJ3Pq2#1E6 zy0(g%mWsw%M|BNdKus5bomPYCs;SAi*QNa@gTP>K946|&H?ZRr)rJhDe|xwZrfZI~ z_X#rzz82(-3-UDyzRm$t*SQYUP&*BM?hVB&L8_AfQnm7l@Co2B_71-6qoR36O$KS} YVD_8g&A-|@4e4=MAgvL#CYNsh2Wv#f-~a#s literal 0 HcmV?d00001 diff --git a/hertz_springboot_ui/src/assets/img/profile_bg.jpg b/ui/src/assets/img/profile_bg.jpg similarity index 100% rename from hertz_springboot_ui/src/assets/img/profile_bg.jpg rename to ui/src/assets/img/profile_bg.jpg diff --git a/hertz_springboot_ui/src/assets/style.css b/ui/src/assets/style.css similarity index 76% rename from hertz_springboot_ui/src/assets/style.css rename to ui/src/assets/style.css index 0ff6052..a9e0c33 100644 --- a/hertz_springboot_ui/src/assets/style.css +++ b/ui/src/assets/style.css @@ -1,10 +1,10 @@ :root { /* iOS Color Palette */ - --ios-primary: #007AFF; - --ios-primary-light: #47a0ff; + --ios-primary: #3542ec; + --ios-primary-light: #0011FF; --ios-success: #34C759; --ios-warning: #FF9500; - --ios-danger: #FF3B30; + --ios-danger: #FF4040; --ios-gray: #8E8E93; --ios-bg: #F2F4F8; --ios-surface: rgba(255, 255, 255, 0.7); @@ -56,7 +56,7 @@ body { .el-card__header { border-bottom: 1px solid var(--ios-border) !important; - padding: 16px 24px !important; + padding: 10px 24px !important; font-weight: 600; font-size: 16px; } @@ -68,7 +68,19 @@ body { transition: all 0.2s ease !important; } -.el-button:not(.is-circle):not(.is-text) { +.el-button.is-link:hover { + color: var(--ios-primary-light); +} + + +.el-button--primary { + --el-button-hover-bg-color: var(--ios-primary-light); + --el-button-hover-border-color: var(--ios-primary-light); + --el-button-active-bg-color: var(--ios-primary-light); + --el-button-active-border-color: var(--ios-primary-light); +} + +.el-button:not(.is-circle):not(.is-text):not(.is-link) { height: 36px !important; padding: 0 20px !important; } @@ -111,6 +123,14 @@ body { background-color: rgba(0, 122, 255, 0.03) !important; } +.el-checkbox__inner { + width: 15px; + height: 15px; + border-radius: 4px; +} + + + /* Dialog Styling */ .el-dialog { border-radius: 20px !important; @@ -240,3 +260,48 @@ html, body { scrollbar-width: none; -ms-overflow-style: none; } + +/* MessageBox Styling */ +.el-message-box { + border-radius: var(--ios-radius) !important; + border: none !important; + box-shadow: var(--ios-shadow-hover) !important; + background-color: rgba(255, 255, 255, 0.95) !important; + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + padding: 0 !important; + width: 400px !important; + max-width: 90vw; +} + +.el-message-box__header { + padding: 20px 24px 10px !important; +} + +.el-message-box__title { + font-weight: 600; + font-size: 18px !important; +} + +.el-message-box__headerbtn { + top: 20px !important; + right: 20px !important; +} + +.el-message-box__content { + padding: 10px 24px 20px !important; + font-size: 15px !important; + color: #1d1d1f; +} + +.el-message-box__btns { + padding: 0 24px 24px !important; + display: flex; + justify-content: flex-end; + gap: 12px; +} + +.el-message-box__btns .el-button { + margin-left: 0 !important; + min-width: 80px; +} diff --git a/ui/src/components/ContentPage.vue b/ui/src/components/ContentPage.vue new file mode 100644 index 0000000..d649248 --- /dev/null +++ b/ui/src/components/ContentPage.vue @@ -0,0 +1,66 @@ + + ++ + + diff --git a/hertz_springboot_ui/src/components/Error.vue b/ui/src/components/Error.vue similarity index 93% rename from hertz_springboot_ui/src/components/Error.vue rename to ui/src/components/Error.vue index bd393bb..f481060 100644 --- a/hertz_springboot_ui/src/components/Error.vue +++ b/ui/src/components/Error.vue @@ -3,18 +3,18 @@+ + ++ + + + ++ + ++ ++ + ++ +++ @@ -97,11 +97,9 @@ function switchAccount() { display: flex; justify-content: center; align-items: center; - height: 100vh; - padding: 16px; - background: radial-gradient(circle at top left, #e3f2fd, transparent 45%), - radial-gradient(circle at bottom right, #f3e5f5, transparent 45%), - #f2f4f8; + min-height: 100%; + padding: 32px 16px; + flex: 1; } .error-card { diff --git a/hertz_springboot_ui/src/layouts/AdminLayout.vue b/ui/src/layouts/AdminLayout.vue similarity index 97% rename from hertz_springboot_ui/src/layouts/AdminLayout.vue rename to ui/src/layouts/AdminLayout.vue index 5d51c43..51d233e 100644 --- a/hertz_springboot_ui/src/layouts/AdminLayout.vue +++ b/ui/src/layouts/AdminLayout.vue @@ -1,7 +1,7 @@{{ codeText }}-+{{ displayTitle }}{{ displaySubTitle }}-+- +@@ -172,7 +172,6 @@ function logout() { .admin-menu { border-right: none; - background: transparent; padding: 16px 12px; flex: 1; overflow-y: auto; @@ -221,6 +220,7 @@ function logout() { padding: 6px 12px; border-radius: 20px; transition: background-color 0.2s; + outline: none; } .default-avatar { diff --git a/hertz_springboot_ui/src/layouts/PortalLayout.vue b/ui/src/layouts/PortalLayout.vue similarity index 91% rename from hertz_springboot_ui/src/layouts/PortalLayout.vue rename to ui/src/layouts/PortalLayout.vue index ba34b93..6832f78 100644 --- a/hertz_springboot_ui/src/layouts/PortalLayout.vue +++ b/ui/src/layouts/PortalLayout.vue @@ -2,12 +2,14 @@Hertz Admin
-+Hertz Admin
首页 +监控 +聊天 关于 @@ -87,6 +89,8 @@ function logout() { .portal-layout { min-height: 100vh; background-color: var(--ios-bg); + display: flex; + flex-direction: column; } .portal-header { position: sticky; @@ -94,6 +98,7 @@ function logout() { z-index: 100; height: 64px; border-bottom: 1px solid var(--ios-border); + flex-shrink: 0; } .header-content { max-width: 1200px; @@ -145,10 +150,7 @@ function logout() { padding: 4px 8px; border-radius: 20px; transition: background-color 0.2s; -} - -.user-link:hover { - border: none; + outline: none; } .default-avatar { @@ -163,5 +165,9 @@ function logout() { max-width: 1200px; margin: 0 auto; padding: 32px 24px; + width: 100%; + flex: 1; + display: flex; + flex-direction: column; } diff --git a/hertz_springboot_ui/src/main.js b/ui/src/main.js similarity index 100% rename from hertz_springboot_ui/src/main.js rename to ui/src/main.js diff --git a/hertz_springboot_ui/src/router/index.js b/ui/src/router/index.js similarity index 52% rename from hertz_springboot_ui/src/router/index.js rename to ui/src/router/index.js index 0d16a15..877bad5 100644 --- a/hertz_springboot_ui/src/router/index.js +++ b/ui/src/router/index.js @@ -14,23 +14,30 @@ const routes = [ { path: '/', redirect: '/portal/home' }, { path: '/login', component: Login }, { path: '/register', component: Register }, - { - path: '/403', - component: () => import('../components/Error.vue'), - props: { - code: 403, - title: '抱歉,您没有权限访问该页面', - subTitle: '请联系管理员开通权限,或切换账号后重试。', - }, - }, { path: '/portal', component: PortalLayout, children: [ { path: '', redirect: '/portal/home' }, { path: 'home', component: () => import('../views/portal/Home.vue') }, + { path: 'monitor', component: () => import('../views/portal/Monitor.vue') }, + { path: 'chat', component: () => import('../views/portal/Chat.vue') }, { path: 'about', component: () => import('../views/portal/About.vue') }, { path: 'profile', component: () => import('../views/Profile.vue') }, + { + path: '403', + component: () => import('../components/Error.vue'), + props: { + code: 403, + title: '抱歉,您没有权限访问该页面', + subTitle: '请联系管理员开通权限,或切换账号后重试。', + }, + }, + { + path: ':pathMatch(.*)*', + component: () => import('../components/Error.vue'), + props: { code: 404 }, + }, ], }, { @@ -40,12 +47,32 @@ const routes = [ children: [ { path: '', name: ROUTE_NAMES.AdminRoot, redirect: '/admin/dashboard' }, { path: 'profile', component: () => import('../views/Profile.vue') }, + { + path: '403', + component: () => import('../components/Error.vue'), + props: { + code: 403, + title: '抱歉,您没有权限访问该页面', + subTitle: '请联系管理员开通权限,或切换账号后重试。', + }, + }, + { + path: ':pathMatch(.*)*', + component: () => import('../components/Error.vue'), + props: { code: 404 }, + }, ], }, { path: '/:pathMatch(.*)*', - component: () => import('../components/Error.vue'), - props: { code: 404 }, + component: PortalLayout, + children: [ + { + path: '', + component: () => import('../components/Error.vue'), + props: { code: 404 }, + }, + ], }, ] diff --git a/hertz_springboot_ui/src/router/setupGuards.js b/ui/src/router/setupGuards.js similarity index 100% rename from hertz_springboot_ui/src/router/setupGuards.js rename to ui/src/router/setupGuards.js diff --git a/hertz_springboot_ui/src/router/utils.js b/ui/src/router/utils.js similarity index 100% rename from hertz_springboot_ui/src/router/utils.js rename to ui/src/router/utils.js diff --git a/hertz_springboot_ui/src/stores/auth.js b/ui/src/stores/auth.js similarity index 100% rename from hertz_springboot_ui/src/stores/auth.js rename to ui/src/stores/auth.js diff --git a/hertz_springboot_ui/src/stores/menu.js b/ui/src/stores/menu.js similarity index 100% rename from hertz_springboot_ui/src/stores/menu.js rename to ui/src/stores/menu.js diff --git a/hertz_springboot_ui/src/views/Login.vue b/ui/src/views/Login.vue similarity index 72% rename from hertz_springboot_ui/src/views/Login.vue rename to ui/src/views/Login.vue index 47f082d..2b31620 100644 --- a/hertz_springboot_ui/src/views/Login.vue +++ b/ui/src/views/Login.vue @@ -13,6 +13,12 @@+ + +++ +
@@ -27,21 +33,42 @@ + diff --git a/hertz_springboot_ui/src/views/admin/system/Role.vue b/ui/src/views/admin/system/Role.vue similarity index 88% rename from hertz_springboot_ui/src/views/admin/system/Role.vue rename to ui/src/views/admin/system/Role.vue index 7e759f1..36913cf 100644 --- a/hertz_springboot_ui/src/views/admin/system/Role.vue +++ b/ui/src/views/admin/system/Role.vue @@ -1,15 +1,17 @@ 登录 -- 角色管理 + + ++ - -+ +- ((query.page = 1), load())">查询 -新增角色 -++ -+ ((query.page = 1), load())">查询 +新增角色 ++ - @@ -35,17 +37,19 @@ +-- @@ -91,6 +95,7 @@ diff --git a/ui/src/views/portal/Chat.vue b/ui/src/views/portal/Chat.vue new file mode 100644 index 0000000..ff9c43b --- /dev/null +++ b/ui/src/views/portal/Chat.vue @@ -0,0 +1,838 @@ + + + + + + + + diff --git a/hertz_springboot_ui/src/views/portal/Home.vue b/ui/src/views/portal/Home.vue similarity index 100% rename from hertz_springboot_ui/src/views/portal/Home.vue rename to ui/src/views/portal/Home.vue diff --git a/ui/src/views/portal/Monitor.vue b/ui/src/views/portal/Monitor.vue new file mode 100644 index 0000000..b10a1b4 --- /dev/null +++ b/ui/src/views/portal/Monitor.vue @@ -0,0 +1,287 @@ + ++ + + ++ ++++++ {{ conv.title }} + {{ formatTime(conv.updatedAt) }} + +++ + + + + +++ + + +{{ welcomeMessage }}++++ + +++ ++ ++ + + ++ {{ currentConversationTitle }} + ++ ++++ +++ ++ ++ + + + + diff --git a/hertz_springboot_ui/vite.config.js b/ui/vite.config.js similarity index 100% rename from hertz_springboot_ui/vite.config.js rename to ui/vite.config.js++ +系统监控
+刷新 ++ ++++ + + + + ++ + + +++ ++ CPU + +++ +++ 核心数: + {{ serverInfo.cpu.cpuNum }} +++ 系统使用: + {{ serverInfo.cpu.sys }}% +++ 用户使用: + {{ serverInfo.cpu.used }}% +++ 空闲: + {{ serverInfo.cpu.free }}% +++ + + +++ ++ 内存 + +++ +++ 总内存: + {{ serverInfo.mem.total }}GB +++ 已用: + {{ serverInfo.mem.used }}GB +++ 剩余: + {{ serverInfo.mem.free }}GB +++ 使用率: + {{ serverInfo.mem.usage }}% +++ + + + + +++ ++ 服务器信息 + + +{{ serverInfo.sys.computerName }} +{{ serverInfo.sys.osName }} +{{ serverInfo.sys.computerIp }} +{{ serverInfo.sys.osArch }} ++ + + + +++ ++ 磁盘状态 + + ++ + + + + + + + ++ + +