优化报表页面,移除统计页面

This commit is contained in:
2025-12-15 22:12:15 +08:00
parent 9aa28f5b9e
commit d650c6f584
30 changed files with 851 additions and 904 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.page-stack[data-v-e84f7d23]{display:flex;flex-direction:column;gap:12px}.title-group[data-v-e84f7d23]{display:flex;flex-direction:column;gap:2px}.toolbar[data-v-e84f7d23]{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.card[data-v-e84f7d23]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.metric-label[data-v-e84f7d23]{font-size:12px;color:var(--app-muted)}.metric-value[data-v-e84f7d23]{margin-top:6px;font-size:22px;font-weight:900;line-height:1.1}.section-head[data-v-e84f7d23]{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:12px}.section-title[data-v-e84f7d23]{margin:0;font-size:14px;font-weight:800}.kv[data-v-e84f7d23]{border:1px solid var(--app-border);border-radius:12px;padding:12px;background:#fff}.kv-v[data-v-e84f7d23]{font-size:18px;font-weight:900;line-height:1.1}.kv-k[data-v-e84f7d23]{margin-top:6px;font-size:12px}.ok[data-v-e84f7d23]{color:#047857}.warn[data-v-e84f7d23]{color:#b45309}.err[data-v-e84f7d23]{color:#b91c1c}.divider[data-v-e84f7d23]{height:1px;background:var(--app-border);margin:14px 0}.sys-grid[data-v-e84f7d23]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.sys-item[data-v-e84f7d23]{border:1px solid var(--app-border);border-radius:12px;padding:12px;background:#fff}.sys-k[data-v-e84f7d23]{font-size:12px}.sys-sub[data-v-e84f7d23]{margin-top:8px;font-size:12px}.desc-inline[data-v-e84f7d23]{margin-left:8px}.sub-title[data-v-e84f7d23]{font-size:13px;font-weight:800;margin-bottom:10px}.type-grid[data-v-e84f7d23]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.type-item[data-v-e84f7d23]{border:1px solid var(--app-border);border-radius:12px;padding:12px;background:#fff}.type-v[data-v-e84f7d23]{font-size:16px;font-weight:900}.type-k[data-v-e84f7d23]{margin-top:6px;font-size:12px}.table-wrap[data-v-e84f7d23]{overflow-x:auto}.help[data-v-e84f7d23]{margin-top:10px;font-size:12px}@media(max-width:768px){.sys-grid[data-v-e84f7d23]{grid-template-columns:1fr}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
import{D as m,_ as T,r as p,a as h,b as r,d as a,w as s,e as u,h as k,j as b,q as d,E as x}from"./index-Do26tg8I.js";async function C(o){const{data:t}=await m.put("/admin/username",{new_username:o});return t}async function E(o){const{data:t}=await m.put("/admin/password",{new_password:o});return t}async function P(){const{data:o}=await m.post("/logout");return o}const U={class:"page-stack"},N={__name:"SettingsPage",setup(o){const t=p(""),i=p(""),n=p(!1);async function f(){try{await P()}catch{}finally{window.location.href="/yuyx"}}async function V(){const l=t.value.trim();if(!l){d.error("请输入新用户名");return}try{await x.confirm(`确定将管理员用户名修改为「${l}」吗?修改后需要重新登录。`,"修改用户名",{confirmButtonText:"确认修改",cancelButtonText:"取消",type:"warning"})}catch{return}n.value=!0;try{await C(l),d.success("用户名修改成功,请重新登录"),t.value="",setTimeout(f,1200)}catch{}finally{n.value=!1}}async function B(){const l=i.value;if(!l){d.error("请输入新密码");return}if(l.length<6){d.error("密码至少6个字符");return}try{await x.confirm("确定修改管理员密码吗?修改后需要重新登录。","修改密码",{confirmButtonText:"确认修改",cancelButtonText:"取消",type:"warning"})}catch{return}n.value=!0;try{await E(l),d.success("密码修改成功,请重新登录"),i.value="",setTimeout(f,1200)}catch{}finally{n.value=!1}}return(l,e)=>{const w=u("el-input"),v=u("el-form-item"),y=u("el-form"),_=u("el-button"),g=u("el-card");return k(),h("div",U,[e[7]||(e[7]=r("div",{class:"app-page-title"},[r("h2",null,"设置"),r("span",{class:"app-muted"},"管理员账号设置")],-1)),a(g,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:s(()=>[e[3]||(e[3]=r("h3",{class:"section-title"},"修改管理员用户名",-1)),a(y,{"label-width":"120px"},{default:s(()=>[a(v,{label:"新用户名"},{default:s(()=>[a(w,{modelValue:t.value,"onUpdate:modelValue":e[0]||(e[0]=c=>t.value=c),placeholder:"输入新用户名",disabled:n.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),a(_,{type:"primary",loading:n.value,onClick:V},{default:s(()=>[...e[2]||(e[2]=[b("保存用户名",-1)])]),_:1},8,["loading"])]),_:1}),a(g,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:s(()=>[e[5]||(e[5]=r("h3",{class:"section-title"},"修改管理员密码",-1)),a(y,{"label-width":"120px"},{default:s(()=>[a(v,{label:"新密码"},{default:s(()=>[a(w,{modelValue:i.value,"onUpdate:modelValue":e[1]||(e[1]=c=>i.value=c),type:"password","show-password":"",placeholder:"输入新密码",disabled:n.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),a(_,{type:"primary",loading:n.value,onClick:B},{default:s(()=>[...e[4]||(e[4]=[b("保存密码",-1)])]),_:1},8,["loading"]),e[6]||(e[6]=r("div",{class:"help"},"建议使用更强密码至少8位且包含字母与数字。",-1))]),_:1})])}}},M=T(N,[["__scopeId","data-v-2f4b840f"]]);export{M as default};

View File

@@ -0,0 +1 @@
import{S as m,_ as T,r as p,e as h,f as r,g as a,w as s,n as u,x as k,y as x,L as i,K as b}from"./index-DJ3M_U2-.js";async function C(o){const{data:t}=await m.put("/admin/username",{new_username:o});return t}async function P(o){const{data:t}=await m.put("/admin/password",{new_password:o});return t}async function U(){const{data:o}=await m.post("/logout");return o}const E={class:"page-stack"},N={__name:"SettingsPage",setup(o){const t=p(""),d=p(""),n=p(!1);async function f(){try{await U()}catch{}finally{window.location.href="/yuyx"}}async function V(){const l=t.value.trim();if(!l){i.error("请输入新用户名");return}try{await b.confirm(`确定将管理员用户名修改为「${l}」吗?修改后需要重新登录。`,"修改用户名",{confirmButtonText:"确认修改",cancelButtonText:"取消",type:"warning"})}catch{return}n.value=!0;try{await C(l),i.success("用户名修改成功,请重新登录"),t.value="",setTimeout(f,1200)}catch{}finally{n.value=!1}}async function B(){const l=d.value;if(!l){i.error("请输入新密码");return}if(l.length<6){i.error("密码至少6个字符");return}try{await b.confirm("确定修改管理员密码吗?修改后需要重新登录。","修改密码",{confirmButtonText:"确认修改",cancelButtonText:"取消",type:"warning"})}catch{return}n.value=!0;try{await P(l),i.success("密码修改成功,请重新登录"),d.value="",setTimeout(f,1200)}catch{}finally{n.value=!1}}return(l,e)=>{const w=u("el-input"),y=u("el-form-item"),v=u("el-form"),_=u("el-button"),g=u("el-card");return k(),h("div",E,[e[7]||(e[7]=r("div",{class:"app-page-title"},[r("h2",null,"设置"),r("span",{class:"app-muted"},"管理员账号设置")],-1)),a(g,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:s(()=>[e[3]||(e[3]=r("h3",{class:"section-title"},"修改管理员用户名",-1)),a(v,{"label-width":"120px"},{default:s(()=>[a(y,{label:"新用户名"},{default:s(()=>[a(w,{modelValue:t.value,"onUpdate:modelValue":e[0]||(e[0]=c=>t.value=c),placeholder:"输入新用户名",disabled:n.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),a(_,{type:"primary",loading:n.value,onClick:V},{default:s(()=>[...e[2]||(e[2]=[x("保存用户名",-1)])]),_:1},8,["loading"])]),_:1}),a(g,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:s(()=>[e[5]||(e[5]=r("h3",{class:"section-title"},"修改管理员密码",-1)),a(v,{"label-width":"120px"},{default:s(()=>[a(y,{label:"新密码"},{default:s(()=>[a(w,{modelValue:d.value,"onUpdate:modelValue":e[1]||(e[1]=c=>d.value=c),type:"password","show-password":"",placeholder:"输入新密码",disabled:n.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),a(_,{type:"primary",loading:n.value,onClick:B},{default:s(()=>[...e[4]||(e[4]=[x("保存密码",-1)])]),_:1},8,["loading"]),e[6]||(e[6]=r("div",{class:"help"},"建议使用更强密码至少8位且包含字母与数字。",-1))]),_:1})])}}},A=T(N,[["__scopeId","data-v-2f4b840f"]]);export{A as default};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.page-stack[data-v-84b6799b]{display:flex;flex-direction:column;gap:12px}.metric-card[data-v-84b6799b],.card[data-v-84b6799b]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.metric-label[data-v-84b6799b]{font-size:12px;color:var(--app-muted)}.metric-value[data-v-84b6799b]{margin-top:6px;font-size:18px;font-weight:800}.metric-sub[data-v-84b6799b]{margin-top:4px;font-size:12px}.section-head[data-v-84b6799b]{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:12px}.section-title[data-v-84b6799b]{margin:0;font-size:14px;font-weight:800}.count-row[data-v-84b6799b]{margin-bottom:10px}.count-card[data-v-84b6799b]{border-radius:10px;border:1px solid var(--app-border)}.count-card.ok[data-v-84b6799b]{background:#10b98114}.count-card.warn[data-v-84b6799b]{background:#f59e0b14}.count-value[data-v-84b6799b]{font-size:22px;font-weight:900;line-height:1.1}.count-label[data-v-84b6799b]{margin-top:4px;font-size:12px;color:var(--app-muted)}.sub-title[data-v-84b6799b]{margin-top:14px;margin-bottom:8px;font-size:13px;font-weight:800}.empty[data-v-84b6799b]{padding:10px 0}.task-list[data-v-84b6799b]{display:flex;flex-direction:column;gap:8px}.task-item[data-v-84b6799b]{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding:10px 12px;border-radius:10px;border:1px solid var(--app-border);background:#fff}.task-item.queue[data-v-84b6799b]{background:#f59e0b0f}.task-line[data-v-84b6799b]{display:flex;align-items:center;flex-wrap:wrap;gap:8px}.task-line2[data-v-84b6799b]{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:6px;font-size:12px}.task-user[data-v-84b6799b]{font-weight:600}.task-account[data-v-84b6799b]{font-weight:700;color:#2563eb}.dot[data-v-84b6799b]{width:8px;height:8px;border-radius:999px;display:inline-block}.task-status[data-v-84b6799b]{font-weight:700}.task-right[data-v-84b6799b]{font-size:12px;font-weight:700;color:#10b981;white-space:nowrap}.task-right.warn[data-v-84b6799b]{color:#f59e0b}@media(max-width:768px){.task-item[data-v-84b6799b]{flex-direction:column}.task-right[data-v-84b6799b]{align-self:flex-end}}.stat-grid[data-v-84b6799b]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.stat-box[data-v-84b6799b]{border-radius:12px;border:1px solid var(--app-border);padding:12px}.stat-box.ok[data-v-84b6799b]{background:#10b98114}.stat-box.err[data-v-84b6799b]{background:#ef444414}.stat-box.info[data-v-84b6799b]{background:#3b82f614}.stat-box.info2[data-v-84b6799b]{background:#06b6d414}.stat-name[data-v-84b6799b]{font-size:12px;font-weight:800;margin-bottom:6px}.stat-row[data-v-84b6799b]{display:flex;align-items:baseline;gap:8px}.stat-big[data-v-84b6799b]{font-size:20px;font-weight:900}.stat-row2[data-v-84b6799b]{margin-top:6px;font-size:12px}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{D as n}from"./index-Do26tg8I.js";async function i(){const{data:a}=await n.get("/email/settings");return a}async function e(a){const{data:t}=await n.post("/email/settings",a);return t}async function c(){const{data:a}=await n.get("/email/stats");return a}async function o(a){const{data:t}=await n.get("/email/logs",{params:a});return t}async function l(a){const{data:t}=await n.post("/email/logs/cleanup",{days:a});return t}export{i as a,o as b,l as c,c as f,e as u};
import{S as n}from"./index-DJ3M_U2-.js";async function i(){const{data:a}=await n.get("/email/settings");return a}async function e(a){const{data:t}=await n.post("/email/settings",a);return t}async function c(){const{data:a}=await n.get("/email/stats");return a}async function o(a){const{data:t}=await n.get("/email/logs",{params:a});return t}async function l(a){const{data:t}=await n.post("/email/logs/cleanup",{days:a});return t}export{i as a,o as b,l as c,c as f,e as u};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
function s(t){return String(t||"").trim()}function a(t){return!t.startsWith("user_scheduled")||!t.includes(":")?"":t.split(":",2)[1]||""}function i(t){const e=s(t);if(!e||e==="manual")return{group:"manual",label:"手动",type:"success",tooltip:""};if(e==="scheduled")return{group:"scheduled",label:"定时任务",type:"primary",tooltip:"系统定时"};if(e.startsWith("user_scheduled")){const u=a(e),r=String(u||"").replace(/^batch_/,"");return{group:"scheduled",label:"定时任务",type:"primary",tooltip:r?`用户定时批次:${r}`:"用户定时"}}return{group:"manual",label:"手动",type:"success",tooltip:{batch:"手动批量",manual_screenshot:"手动截图",immediate:"立即执行",resumed:"断点恢复"}[e]||e}}export{i as g};

View File

@@ -1 +1 @@
import{D as a}from"./index-Do26tg8I.js";async function c(){const{data:t}=await a.get("/server/info");return t}async function e(){const{data:t}=await a.get("/docker_stats");return t}async function o(){const{data:t}=await a.get("/task/stats");return t}async function r(){const{data:t}=await a.get("/task/running");return t}async function i(t){const{data:s}=await a.get("/task/logs",{params:t});return s}async function f(t){const{data:s}=await a.post("/task/logs/clear",{days:t});return s}export{r as a,c as b,e as c,i as d,f as e,o as f};
import{S as a}from"./index-DJ3M_U2-.js";async function c(){const{data:t}=await a.get("/server/info");return t}async function e(){const{data:t}=await a.get("/docker_stats");return t}async function o(){const{data:t}=await a.get("/task/stats");return t}async function r(){const{data:t}=await a.get("/task/running");return t}async function i(t){const{data:s}=await a.get("/task/logs",{params:t});return s}async function f(t){const{data:s}=await a.post("/task/logs/clear",{days:t});return s}export{r as a,c as b,e as c,i as d,f as e,o as f};

View File

@@ -1 +1 @@
import{D as a}from"./index-Do26tg8I.js";async function s(){const{data:t}=await a.get("/system/config");return t}async function c(t){const{data:e}=await a.post("/system/config",t);return e}async function u(){const{data:t}=await a.post("/schedule/execute",{});return t}async function o(){const{data:t}=await a.get("/update/status");return t}async function r(){const{data:t}=await a.get("/update/result");return t}async function d(t={}){const{data:e}=await a.get("/update/log",{params:t});return e}async function i(){const{data:t}=await a.post("/update/check",{});return t}async function f(t={}){const{data:e}=await a.post("/update/run",t);return e}export{o as a,r as b,d as c,f as d,u as e,s as f,i as r,c as u};
import{S as a}from"./index-DJ3M_U2-.js";async function s(){const{data:t}=await a.get("/system/config");return t}async function c(t){const{data:e}=await a.post("/system/config",t);return e}async function u(){const{data:t}=await a.post("/schedule/execute",{});return t}async function o(){const{data:t}=await a.get("/update/status");return t}async function r(){const{data:t}=await a.get("/update/result");return t}async function d(t={}){const{data:e}=await a.get("/update/log",{params:t});return e}async function i(){const{data:t}=await a.post("/update/check",{});return t}async function f(t={}){const{data:e}=await a.post("/update/run",t);return e}export{o as a,r as b,d as c,f as d,u as e,s as f,i as r,c as u};

View File

@@ -1 +1 @@
import{D as t}from"./index-Do26tg8I.js";async function n(){const{data:s}=await t.get("/users");return s}async function o(s){const{data:a}=await t.post(`/users/${s}/approve`);return a}async function c(s){const{data:a}=await t.post(`/users/${s}/reject`);return a}async function i(s){const{data:a}=await t.delete(`/users/${s}`);return a}async function u(s,a){const{data:e}=await t.post(`/users/${s}/vip`,{days:a});return e}async function p(s){const{data:a}=await t.delete(`/users/${s}/vip`);return a}async function d(s,a){const{data:e}=await t.post(`/users/${s}/reset_password`,{new_password:a});return e}export{o as a,p as b,d as c,i as d,n as f,c as r,u as s};
import{S as t}from"./index-DJ3M_U2-.js";async function n(){const{data:s}=await t.get("/users");return s}async function o(s){const{data:a}=await t.post(`/users/${s}/approve`);return a}async function c(s){const{data:a}=await t.post(`/users/${s}/reject`);return a}async function i(s){const{data:a}=await t.delete(`/users/${s}`);return a}async function u(s,a){const{data:e}=await t.post(`/users/${s}/vip`,{days:a});return e}async function p(s){const{data:a}=await t.delete(`/users/${s}/vip`);return a}async function d(s,a){const{data:e}=await t.post(`/users/${s}/reset_password`,{new_password:a});return e}export{o as a,p as b,d as c,i as d,n as f,c as r,u as s};