From 650c480416fdc2f1a2ad7acbe4fefbdb477394df Mon Sep 17 00:00:00 2001 From: YGXB_net Date: Thu, 23 Apr 2026 23:51:24 +0800 Subject: [PATCH] =?UTF-8?q?refactor(admin):=20=E9=87=8D=E6=9E=84=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E7=95=8C=E9=9D=A2=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新 AdminView.vue 组件结构,使用新的布局和导航设计 - 集成 Element Plus 图标组件,提升界面美观度 - 添加响应式设计支持,适配移动端设备 - 重构 HomeView.vue 组件,改进 Token 查询功能 - 实现自动刷新机制,每5秒更新 Token 信息 - 优化 TokenDetailView.vue 组件,增强数据管理功能 - 添加确认对话框,防止误删操作 - 在 App.vue 中引入全局 CSS 变量和主题系统 - 创建通用组件样式类,统一页面外观 - 优化数据加载逻辑,提升页面性能和用户体验 --- web/public/favicon-vue.ico | Bin 0 -> 4286 bytes web/public/favicon.ico | Bin 4286 -> 10069 bytes web/src/App.vue | 156 ++++++- web/src/views/AdminView.vue | 234 ++++++++-- web/src/views/HomeView.vue | 318 ++++++++++--- web/src/views/TokenDetailView.vue | 649 ++++++++++++++++++++------- web/src/views/TokenManageView.vue | 722 +++++++++++++++++++----------- 7 files changed, 1574 insertions(+), 505 deletions(-) create mode 100644 web/public/favicon-vue.ico diff --git a/web/public/favicon-vue.ico b/web/public/favicon-vue.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/web/public/favicon.ico b/web/public/favicon.ico index df36fcfb72584e00488330b560ebcf34a41c64c2..f1ae864153822df01d9a50616a9618e54263afc8 100644 GIT binary patch literal 10069 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 literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S diff --git a/web/src/App.vue b/web/src/App.vue index 19444e6..58309fa 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -1,15 +1,161 @@ - + +html, body, #app { + height: 100%; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; +} + +.app-container { + min-height: 100vh; + background: var(--bg-page); + max-width: 100%; +} + +/* 卡片通用样式 */ +.content-card { + background: var(--bg-card); + border-radius: 8px; + padding: 24px; + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); +} + +/* 页面标题样式 */ +.page-title { + font-size: 20px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 20px; + padding-bottom: 12px; + border-bottom: 1px solid var(--border-color); +} + +/* Section 标题 */ +.section-title { + font-size: 16px; + font-weight: 600; + color: var(--text-primary); + margin: 20px 0 16px; +} + +/* 按钮组样式 */ +.btn-group { + display: flex; + gap: 12px; + flex-wrap: wrap; +} + +/* 表格工具栏 */ +.table-toolbar { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; + flex-wrap: wrap; + gap: 12px; +} + +/* Flex 布局工具类 */ +.flex-row { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 12px; +} + +.flex-between { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 12px; +} + +/* Gap 间距 */ +.gap-sm { gap: 8px; } +.gap-md { gap: 12px; } +.gap-lg { gap: 16px; } + +/* 间距工具类 */ +.mt-sm { margin-top: 8px; } +.mt-md { margin-top: 16px; } +.mt-lg { margin-top: 24px; } +.mb-sm { margin-bottom: 8px; } +.mb-md { margin-bottom: 16px; } +.mb-lg { margin-bottom: 24px; } +.ml-sm { margin-left: 8px; } +.ml-md { margin-left: 12px; } +.ml-lg { margin-left: 16px; } +.mr-sm { margin-right: 8px; } +.mr-md { margin-right: 12px; } +.mr-lg { margin-right: 16px; } + +/* 文本工具类 */ +.text-primary { color: var(--text-primary); } +.text-success { color: var(--success-color); } +.text-warning { color: var(--warning-color); } +.text-danger { color: var(--danger-color); } +.text-info { color: var(--info-color); } + +/* 加载动画 */ +.loading-container { + display: flex; + justify-content: center; + align-items: center; + min-height: 200px; +} + +/* 空状态 */ +.empty-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 48px; + color: var(--text-secondary); +} + +/* 响应式 */ +@media (max-width: 768px) { + .content-card { + padding: 16px; + border-radius: 0; + } + + .hide-on-mobile { + display: none; + } +} + \ No newline at end of file diff --git a/web/src/views/AdminView.vue b/web/src/views/AdminView.vue index 1c70962..7206353 100644 --- a/web/src/views/AdminView.vue +++ b/web/src/views/AdminView.vue @@ -1,50 +1,224 @@ +.admin-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 24px; + height: 60px; + background: var(--bg-header); + border-bottom: 1px solid var(--border-color); + position: sticky; + top: 0; + z-index: 100; +} + +.header-left { + display: flex; + align-items: center; +} + +.logo { + display: flex; + align-items: center; + gap: 10px; + color: var(--primary-color); + font-weight: 600; + font-size: 18px; +} + +.logo-text { + display: none; +} + +@media (min-width: 768px) { + .logo-text { + display: inline; + } +} + +.header-nav { + display: flex; + gap: 8px; +} + +.nav-item { + display: flex; + align-items: center; + gap: 6px; + padding: 8px 16px; + border-radius: 8px; + cursor: pointer; + color: var(--text-regular); + font-size: 14px; + transition: all 0.2s; +} + +.nav-item:hover { + background: var(--bg-page); + color: var(--text-primary); +} + +.nav-item.active { + background: var(--primary-color); + color: #fff; +} + +.header-right { + display: flex; + align-items: center; + gap: 12px; +} + +.admin-badge { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + background: var(--danger-color); + color: #fff; + border-radius: 20px; + font-size: 13px; +} + +.admin-main { + flex: 1; + padding: 24px 48px; + max-width: 100%; + overflow-x: auto; +} + +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.2s ease; +} + +.fade-enter-from, +.fade-leave-to { + opacity: 0; +} + +@media (max-width: 768px) { + .admin-header { + padding: 0 16px; + flex-wrap: wrap; + height: auto; + padding: 12px 16px; + } + + .header-nav { + order: 3; + width: 100%; + margin-top: 12px; + overflow-x: auto; + } + + .nav-item { + padding: 8px 12px; + font-size: 13px; + } + + .nav-item span { + display: none; + } + + .admin-main { + padding: 16px; + } +} + \ No newline at end of file diff --git a/web/src/views/HomeView.vue b/web/src/views/HomeView.vue index e701f74..6818dcf 100644 --- a/web/src/views/HomeView.vue +++ b/web/src/views/HomeView.vue @@ -1,77 +1,275 @@ - \ No newline at end of file diff --git a/web/src/views/TokenDetailView.vue b/web/src/views/TokenDetailView.vue index b6aaccf..1cd4898 100644 --- a/web/src/views/TokenDetailView.vue +++ b/web/src/views/TokenDetailView.vue @@ -1,198 +1,533 @@ - \ No newline at end of file diff --git a/web/src/views/TokenManageView.vue b/web/src/views/TokenManageView.vue index e65aafb..3853f1c 100644 --- a/web/src/views/TokenManageView.vue +++ b/web/src/views/TokenManageView.vue @@ -1,304 +1,520 @@