chore(admin): final polish and QA doc

This commit is contained in:
2025-12-13 21:46:34 +08:00
parent 49bc8b83b1
commit 85a60009f3
27 changed files with 145 additions and 75 deletions

View File

@@ -347,6 +347,8 @@ admin-frontend/
- 补齐移动端适配与细节视觉统一 - 补齐移动端适配与细节视觉统一
- 保留旧版后台模板备份,便于回滚 - 保留旧版后台模板备份,便于回滚
> 当前仓库版本已将以上阶段全部落地,并额外完成:路由按需加载(首屏更轻)、侧栏徽章(待审核/待处理反馈)、移动端细节优化与错误提示防刷屏。
--- ---
## 6. 风险点与注意事项(提前说明) ## 6. 风险点与注意事项(提前说明)
@@ -401,30 +403,24 @@ admin-frontend/
--- ---
## 8. 需要你确认的问题(确认后再开始开发 ## 8. 已确认的决策(用于后续维护
已确认(来自你的回复): - 范围:只改后台(`/yuyx/admin`),并同步美化后台登录页(`/yuyx`),仅 UI 不改登录逻辑
- 技术Vue3 + Vite + Element Plus构建产物部署到 `static/admin/`;接口保持 `/yuyx/api/...` 不变
- 范围:先改后台(`/yuyx/admin`),并同步美化后台登录页(`/yuyx`),仅 UI 不改登录逻辑
- 技术Vue3 + Vite 构建产物部署到 `static/admin/`;部署时允许拉依赖并构建
- 布局:左侧导航 + 右侧内容Admin Layout - 布局:左侧导航 + 右侧内容Admin Layout
- 风格:简洁克制(浅色背景 + 卡片 + 少量主色点缀) - 风格:简洁克制(浅色背景 + 卡片 + 少量主色点缀),不做暗色模式
- 暗色模式:不需要 - 适配PC 优先;手机端不变形(表格允许横向滚动;表单在小屏做纵向布局)
- 适配PC 优先;同时保证手机端不变形(必要时对表格做响应式处理/横向滚动)
- 交互:允许把原生 `alert/confirm/prompt` 替换为 Element Plus 弹窗/对话框 - 交互:允许把原生 `alert/confirm/prompt` 替换为 Element Plus 弹窗/对话框
- 403 行为:保持现状(接口 403 时前端提示错误,不强制跳转登录页) - 403 行为:接口 403 时前端提示错误,不强制跳转登录页(并已增加提示节流,避免统计页刷新导致刷屏
- `/yuyx/vip`为历史废弃入口VIP 已整合在后台,已删除该路由 - 部署:根路径部署(例如 `https://zsglpt.workyai.cn/`),域名本身无影响
- `/yuyx/vip`历史废弃入口VIP 已整合在后台),已删除该路由
仍需你确认(只剩 1 点,影响 Vite `base` 与反代配置): > 备注:若未来需要二级目录部署(例如 `https://example.com/zsglpt/`),需要同步调整反代前缀/Flask 的 URL 生成,否则 `/static/...` 可能出现 404。
1) 部署路径/前缀:
- A. 你的站点是根路径部署(例如 `https://zsglpt.workyai.cn/` 直接访问就是本系统)
- B. 你的站点是二级目录部署(例如 `https://example.com/zsglpt/`,需要告诉我前缀 `/zsglpt`
> 说明:域名本身没有影响,关键在“是否挂在二级目录”。若是根路径部署,我们默认使用 `/static/admin/` 与 `/yuyx/api/...` 即可。
--- ---
## 9. 下一步 ## 9. 下一步(部署与验收)
你确认第 8 节后,我会按“分阶段交付”开始开发,并在每个阶段完成后给你可验收的版本点。 - 部署:更新到最新 `master` 后重启服务即可(`static/admin/` 构建产物已提交到仓库)
- 如需重新构建前端:`cd admin-frontend && npm ci && npm run build`
- 验收:按第 7 节清单逐项点验;若发现任何“功能不一致/缺按钮/接口报错”,把具体页面与操作步骤发我即可快速修复

View File

@@ -1,6 +1,17 @@
import axios from 'axios' import axios from 'axios'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
let lastToastKey = ''
let lastToastAt = 0
function toastErrorOnce(key, message, minIntervalMs = 1500) {
const now = Date.now()
if (key === lastToastKey && now - lastToastAt < minIntervalMs) return
lastToastKey = key
lastToastAt = now
ElMessage.error(message)
}
export const api = axios.create({ export const api = axios.create({
baseURL: '/yuyx/api', baseURL: '/yuyx/api',
timeout: 30_000, timeout: 30_000,
@@ -15,16 +26,15 @@ api.interceptors.response.use(
const message = payload?.error || payload?.message || error?.message || '请求失败' const message = payload?.error || payload?.message || error?.message || '请求失败'
if (status === 403) { if (status === 403) {
ElMessage.error(message || '需要管理员权限') toastErrorOnce('403', message || '需要管理员权限', 5000)
} else if (status) { } else if (status) {
ElMessage.error(message) toastErrorOnce(`http:${status}:${message}`, message)
} else if (error?.code === 'ECONNABORTED') { } else if (error?.code === 'ECONNABORTED') {
ElMessage.error('请求超时') toastErrorOnce('timeout', '请求超时', 3000)
} else { } else {
ElMessage.error(message) toastErrorOnce(`net:${message}`, message, 3000)
} }
return Promise.reject(error) return Promise.reject(error)
}, },
) )

View File

@@ -318,6 +318,22 @@ async function go(path) {
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.layout-header {
flex-wrap: wrap;
height: auto;
padding-top: 10px;
padding-bottom: 10px;
}
.header-right {
width: 100%;
justify-content: flex-end;
}
.admin-name .app-muted {
display: none;
}
.layout-main { .layout-main {
padding: 12px; padding: 12px;
} }

View File

@@ -1,5 +1,5 @@
<script setup> <script setup>
import { computed, onMounted, reactive, ref } from 'vue' import { computed, onBeforeUnmount, onMounted, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { cleanupEmailLogs, fetchEmailLogs, fetchEmailSettings, fetchEmailStats, updateEmailSettings } from '../api/email' import { cleanupEmailLogs, fetchEmailLogs, fetchEmailSettings, fetchEmailStats, updateEmailSettings } from '../api/email'
@@ -73,6 +73,11 @@ function scheduleSaveEmailSettings() {
saveTimer = window.setTimeout(saveEmailSettings, 300) saveTimer = window.setTimeout(saveEmailSettings, 300)
} }
onBeforeUnmount(() => {
if (saveTimer) window.clearTimeout(saveTimer)
saveTimer = null
})
// ========== SMTP 配置 ========== // ========== SMTP 配置 ==========
const smtpLoading = ref(false) const smtpLoading = ref(false)
const smtpConfigs = ref([]) const smtpConfigs = ref([])
@@ -596,7 +601,11 @@ onMounted(refreshAll)
</div> </div>
</el-card> </el-card>
<el-dialog v-model="smtpDialogOpen" :title="smtpEditMode ? '编辑SMTP配置' : '添加SMTP配置'" width="560px"> <el-dialog
v-model="smtpDialogOpen"
:title="smtpEditMode ? '编辑SMTP配置' : '添加SMTP配置'"
width="min(560px, 92vw)"
>
<el-form label-width="120px"> <el-form label-width="120px">
<el-form-item label="名称"> <el-form-item label="名称">
<el-input v-model="smtpForm.name" /> <el-input v-model="smtpForm.name" />

View File

@@ -415,6 +415,16 @@ onBeforeUnmount(() => {
color: #f59e0b; color: #f59e0b;
} }
@media (max-width: 768px) {
.task-item {
flex-direction: column;
}
.task-right {
align-self: flex-end;
}
}
.stat-grid { .stat-grid {
display: grid; display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr));

View File

@@ -49,3 +49,32 @@ a {
.app-muted { .app-muted {
color: var(--app-muted); color: var(--app-muted);
} }
@media (max-width: 768px) {
.app-page-title {
flex-wrap: wrap;
align-items: flex-start;
}
.el-dialog {
max-width: 92vw;
}
.el-form-item {
flex-direction: column;
align-items: stretch;
}
.el-form-item__label {
width: auto !important;
justify-content: flex-start !important;
padding: 0 0 6px !important;
line-height: 1.4;
text-align: left !important;
}
.el-form-item__content {
margin-left: 0 !important;
width: 100%;
}
}

View File

@@ -3,22 +3,22 @@
"file": "assets/datetime-CpkTDmvr.js", "file": "assets/datetime-CpkTDmvr.js",
"name": "datetime" "name": "datetime"
}, },
"_tasks-BUxA_MMn.js": { "_tasks-Dm4gmqjR.js": {
"file": "assets/tasks-BUxA_MMn.js", "file": "assets/tasks-Dm4gmqjR.js",
"name": "tasks", "name": "tasks",
"imports": [ "imports": [
"index.html" "index.html"
] ]
}, },
"_users-DVl5a2To.js": { "_users-BfeeRY2o.js": {
"file": "assets/users-DVl5a2To.js", "file": "assets/users-BfeeRY2o.js",
"name": "users", "name": "users",
"imports": [ "imports": [
"index.html" "index.html"
] ]
}, },
"index.html": { "index.html": {
"file": "assets/index-CCJGmygT.js", "file": "assets/index-BrN7V6n-.js",
"name": "index", "name": "index",
"src": "index.html", "src": "index.html",
"isEntry": true, "isEntry": true,
@@ -34,11 +34,11 @@
"src/pages/SettingsPage.vue" "src/pages/SettingsPage.vue"
], ],
"css": [ "css": [
"assets/index-lm5BCraY.css" "assets/index-BIDpnzAs.css"
] ]
}, },
"src/pages/AnnouncementsPage.vue": { "src/pages/AnnouncementsPage.vue": {
"file": "assets/AnnouncementsPage-CXFfpdyD.js", "file": "assets/AnnouncementsPage-D4dMhoIn.js",
"name": "AnnouncementsPage", "name": "AnnouncementsPage",
"src": "src/pages/AnnouncementsPage.vue", "src": "src/pages/AnnouncementsPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
@@ -50,7 +50,7 @@
] ]
}, },
"src/pages/EmailPage.vue": { "src/pages/EmailPage.vue": {
"file": "assets/EmailPage-D5rz9N2M.js", "file": "assets/EmailPage-DyjXJ34D.js",
"name": "EmailPage", "name": "EmailPage",
"src": "src/pages/EmailPage.vue", "src": "src/pages/EmailPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
@@ -58,11 +58,11 @@
"index.html" "index.html"
], ],
"css": [ "css": [
"assets/EmailPage-Dk6eRUoe.css" "assets/EmailPage-BzgagLF4.css"
] ]
}, },
"src/pages/FeedbacksPage.vue": { "src/pages/FeedbacksPage.vue": {
"file": "assets/FeedbacksPage-zx0MksLD.js", "file": "assets/FeedbacksPage-CfWRRZHi.js",
"name": "FeedbacksPage", "name": "FeedbacksPage",
"src": "src/pages/FeedbacksPage.vue", "src": "src/pages/FeedbacksPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
@@ -74,13 +74,13 @@
] ]
}, },
"src/pages/LogsPage.vue": { "src/pages/LogsPage.vue": {
"file": "assets/LogsPage-DnqHdnu7.js", "file": "assets/LogsPage-l4b_fzxa.js",
"name": "LogsPage", "name": "LogsPage",
"src": "src/pages/LogsPage.vue", "src": "src/pages/LogsPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
"imports": [ "imports": [
"_users-DVl5a2To.js", "_users-BfeeRY2o.js",
"_tasks-BUxA_MMn.js", "_tasks-Dm4gmqjR.js",
"index.html" "index.html"
], ],
"css": [ "css": [
@@ -88,12 +88,12 @@
] ]
}, },
"src/pages/PendingPage.vue": { "src/pages/PendingPage.vue": {
"file": "assets/PendingPage-DDGug1ac.js", "file": "assets/PendingPage-CxlYvx7A.js",
"name": "PendingPage", "name": "PendingPage",
"src": "src/pages/PendingPage.vue", "src": "src/pages/PendingPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
"imports": [ "imports": [
"_users-DVl5a2To.js", "_users-BfeeRY2o.js",
"index.html", "index.html",
"_datetime-CpkTDmvr.js" "_datetime-CpkTDmvr.js"
], ],
@@ -102,7 +102,7 @@
] ]
}, },
"src/pages/SettingsPage.vue": { "src/pages/SettingsPage.vue": {
"file": "assets/SettingsPage-BNOqaz0O.js", "file": "assets/SettingsPage-BzFvHjiG.js",
"name": "SettingsPage", "name": "SettingsPage",
"src": "src/pages/SettingsPage.vue", "src": "src/pages/SettingsPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
@@ -114,20 +114,20 @@
] ]
}, },
"src/pages/StatsPage.vue": { "src/pages/StatsPage.vue": {
"file": "assets/StatsPage-CfWiD1Ty.js", "file": "assets/StatsPage-BtlChspk.js",
"name": "StatsPage", "name": "StatsPage",
"src": "src/pages/StatsPage.vue", "src": "src/pages/StatsPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
"imports": [ "imports": [
"_tasks-BUxA_MMn.js", "_tasks-Dm4gmqjR.js",
"index.html" "index.html"
], ],
"css": [ "css": [
"assets/StatsPage-kYXPdoa5.css" "assets/StatsPage-sGNYYHzw.css"
] ]
}, },
"src/pages/SystemPage.vue": { "src/pages/SystemPage.vue": {
"file": "assets/SystemPage-Di4QNzPH.js", "file": "assets/SystemPage-CXvYxeG3.js",
"name": "SystemPage", "name": "SystemPage",
"src": "src/pages/SystemPage.vue", "src": "src/pages/SystemPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
@@ -139,12 +139,12 @@
] ]
}, },
"src/pages/UsersPage.vue": { "src/pages/UsersPage.vue": {
"file": "assets/UsersPage-zxqUvIyG.js", "file": "assets/UsersPage-BKx57Iyz.js",
"name": "UsersPage", "name": "UsersPage",
"src": "src/pages/UsersPage.vue", "src": "src/pages/UsersPage.vue",
"isDynamicEntry": true, "isDynamicEntry": true,
"imports": [ "imports": [
"_users-DVl5a2To.js", "_users-BfeeRY2o.js",
"_datetime-CpkTDmvr.js", "_datetime-CpkTDmvr.js",
"index.html" "index.html"
], ],

View File

@@ -0,0 +1 @@
.page-stack[data-v-0dc47913]{display:flex;flex-direction:column;gap:12px}.toolbar[data-v-0dc47913]{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.card[data-v-0dc47913]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.section-head[data-v-0dc47913]{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px;flex-wrap:wrap}.section-title[data-v-0dc47913]{margin:0;font-size:14px;font-weight:800}.help[data-v-0dc47913]{margin-top:8px;font-size:12px;color:var(--app-muted)}.table-wrap[data-v-0dc47913]{overflow-x:auto}.stat-card[data-v-0dc47913]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.stat-value[data-v-0dc47913]{font-size:20px;font-weight:900;line-height:1.1}.stat-label[data-v-0dc47913]{margin-top:6px;font-size:12px;color:var(--app-muted)}.ok[data-v-0dc47913]{color:#047857}.err[data-v-0dc47913]{color:#b91c1c}.sub-stats[data-v-0dc47913]{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.ellipsis[data-v-0dc47913]{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pagination[data-v-0dc47913]{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:14px;flex-wrap:wrap}.page-hint[data-v-0dc47913]{font-size:12px}.dialog-actions[data-v-0dc47913]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.spacer[data-v-0dc47913]{flex:1}

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.page-stack[data-v-3d6e76c6]{display:flex;flex-direction:column;gap:12px}.toolbar[data-v-3d6e76c6]{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.card[data-v-3d6e76c6]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.section-head[data-v-3d6e76c6]{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px;flex-wrap:wrap}.section-title[data-v-3d6e76c6]{margin:0;font-size:14px;font-weight:800}.help[data-v-3d6e76c6]{margin-top:8px;font-size:12px;color:var(--app-muted)}.table-wrap[data-v-3d6e76c6]{overflow-x:auto}.stat-card[data-v-3d6e76c6]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.stat-value[data-v-3d6e76c6]{font-size:20px;font-weight:900;line-height:1.1}.stat-label[data-v-3d6e76c6]{margin-top:6px;font-size:12px;color:var(--app-muted)}.ok[data-v-3d6e76c6]{color:#047857}.err[data-v-3d6e76c6]{color:#b91c1c}.sub-stats[data-v-3d6e76c6]{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.ellipsis[data-v-3d6e76c6]{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pagination[data-v-3d6e76c6]{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:14px;flex-wrap:wrap}.page-hint[data-v-3d6e76c6]{font-size:12px}.dialog-actions[data-v-3d6e76c6]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.spacer[data-v-3d6e76c6]{flex:1}

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{f as E,a as I,r as A}from"./users-DVl5a2To.js";import{_ as M,r as p,o as q,c as W,a as i,b as t,w as a,d,i as T,f as F,e as G,g as f,h as r,j as $,k as x,l as H,t as k,E as m,m as g,n as J,p as K}from"./index-CCJGmygT.js";import{p as L}from"./datetime-CpkTDmvr.js";const O={class:"page-stack"},Q={class:"app-page-title"},X={class:"table-wrap"},Y={class:"user-cell"},Z={class:"table-wrap"},ee={__name:"PendingPage",setup(te){const B=T("refreshStats",null),_=T("refreshNavBadges",null),v=p([]),c=p([]),w=p(!1),y=p(!1);function D(s){const e=s?.vip_expire_time;if(!e)return!1;if(String(e).startsWith("2099-12-31"))return!0;const o=L(e);return o?o.getTime()>Date.now():!1}async function j(){w.value=!0;try{v.value=await E()}catch{v.value=[]}finally{w.value=!1}}async function h(){y.value=!0;try{c.value=await F()}catch{c.value=[]}finally{y.value=!1}}async function u(){await Promise.all([j(),h()]),await _?.({pendingResets:c.value.length})}async function N(s){try{await m.confirm(`确定通过用户「${s.username}」的注册申请吗?`,"审核通过",{confirmButtonText:"通过",cancelButtonText:"取消",type:"success"})}catch{return}try{await I(s.id),g.success("用户审核通过"),await u(),await B?.()}catch{}}async function U(s){try{await m.confirm(`确定拒绝用户「${s.username}」的注册申请吗?`,"拒绝申请",{confirmButtonText:"拒绝",cancelButtonText:"取消",type:"warning"})}catch{return}try{await A(s.id),g.success("已拒绝用户"),await u(),await B?.()}catch{}}async function V(s){try{await m.confirm(`确定批准「${s.username}」的密码重置申请吗?`,"批准重置",{confirmButtonText:"批准",cancelButtonText:"取消",type:"success"})}catch{return}try{const e=await J(s.id);g.success(e?.message||"密码重置申请已批准"),await h(),await _?.({pendingResets:c.value.length})}catch{}}async function z(s){try{await m.confirm(`确定拒绝「${s.username}」的密码重置申请吗?`,"拒绝重置",{confirmButtonText:"拒绝",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await K(s.id);g.success(e?.message||"密码重置申请已拒绝"),await h(),await _?.({pendingResets:c.value.length})}catch{}}return q(u),(s,e)=>{const o=d("el-button"),l=d("el-table-column"),S=d("el-tag"),R=d("el-table"),C=d("el-card"),P=G("loading");return f(),W("div",O,[i("div",Q,[e[1]||(e[1]=i("h2",null,"待审核",-1)),i("div",null,[t(o,{onClick:u},{default:a(()=>[...e[0]||(e[0]=[r("刷新",-1)])]),_:1})])]),t(C,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:a(()=>[e[5]||(e[5]=i("h3",{class:"section-title"},"用户注册审核",-1)),i("div",X,[$((f(),x(R,{data:v.value,style:{width:"100%"}},{default:a(()=>[t(l,{prop:"id",label:"ID",width:"80"}),t(l,{label:"用户名","min-width":"200"},{default:a(({row:n})=>[i("div",Y,[i("strong",null,k(n.username),1),D(n)?(f(),x(S,{key:0,type:"warning",effect:"light",size:"small"},{default:a(()=>[...e[2]||(e[2]=[r("VIP",-1)])]),_:1})):H("",!0)])]),_:1}),t(l,{prop:"email",label:"邮箱","min-width":"220"},{default:a(({row:n})=>[r(k(n.email||"-"),1)]),_:1}),t(l,{prop:"created_at",label:"注册时间","min-width":"180"}),t(l,{label:"操作",width:"180",fixed:"right"},{default:a(({row:n})=>[t(o,{type:"success",size:"small",onClick:b=>N(n)},{default:a(()=>[...e[3]||(e[3]=[r("通过",-1)])]),_:1},8,["onClick"]),t(o,{type:"danger",size:"small",onClick:b=>U(n)},{default:a(()=>[...e[4]||(e[4]=[r("拒绝",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[P,w.value]])])]),_:1}),t(C,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:a(()=>[e[8]||(e[8]=i("h3",{class:"section-title"},"密码重置审核",-1)),i("div",Z,[$((f(),x(R,{data:c.value,style:{width:"100%"}},{default:a(()=>[t(l,{prop:"id",label:"申请ID",width:"90"}),t(l,{prop:"username",label:"用户名","min-width":"200"}),t(l,{prop:"email",label:"邮箱","min-width":"220"},{default:a(({row:n})=>[r(k(n.email||"-"),1)]),_:1}),t(l,{prop:"created_at",label:"申请时间","min-width":"180"}),t(l,{label:"操作",width:"180",fixed:"right"},{default:a(({row:n})=>[t(o,{type:"success",size:"small",onClick:b=>V(n)},{default:a(()=>[...e[6]||(e[6]=[r("批准",-1)])]),_:1},8,["onClick"]),t(o,{type:"danger",size:"small",onClick:b=>z(n)},{default:a(()=>[...e[7]||(e[7]=[r("拒绝",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[P,y.value]])])]),_:1})])}}},le=M(ee,[["__scopeId","data-v-f2aa6820"]]);export{le as default}; import{f as E,a as I,r as A}from"./users-BfeeRY2o.js";import{_ as M,r as p,o as q,c as W,a as i,b as t,w as a,d,i as T,f as F,e as G,g as f,h as r,j as $,k as x,l as H,t as k,E as m,m as g,n as J,p as K}from"./index-BrN7V6n-.js";import{p as L}from"./datetime-CpkTDmvr.js";const O={class:"page-stack"},Q={class:"app-page-title"},X={class:"table-wrap"},Y={class:"user-cell"},Z={class:"table-wrap"},ee={__name:"PendingPage",setup(te){const B=T("refreshStats",null),_=T("refreshNavBadges",null),v=p([]),c=p([]),w=p(!1),y=p(!1);function D(s){const e=s?.vip_expire_time;if(!e)return!1;if(String(e).startsWith("2099-12-31"))return!0;const o=L(e);return o?o.getTime()>Date.now():!1}async function j(){w.value=!0;try{v.value=await E()}catch{v.value=[]}finally{w.value=!1}}async function h(){y.value=!0;try{c.value=await F()}catch{c.value=[]}finally{y.value=!1}}async function u(){await Promise.all([j(),h()]),await _?.({pendingResets:c.value.length})}async function N(s){try{await m.confirm(`确定通过用户「${s.username}」的注册申请吗?`,"审核通过",{confirmButtonText:"通过",cancelButtonText:"取消",type:"success"})}catch{return}try{await I(s.id),g.success("用户审核通过"),await u(),await B?.()}catch{}}async function U(s){try{await m.confirm(`确定拒绝用户「${s.username}」的注册申请吗?`,"拒绝申请",{confirmButtonText:"拒绝",cancelButtonText:"取消",type:"warning"})}catch{return}try{await A(s.id),g.success("已拒绝用户"),await u(),await B?.()}catch{}}async function V(s){try{await m.confirm(`确定批准「${s.username}」的密码重置申请吗?`,"批准重置",{confirmButtonText:"批准",cancelButtonText:"取消",type:"success"})}catch{return}try{const e=await J(s.id);g.success(e?.message||"密码重置申请已批准"),await h(),await _?.({pendingResets:c.value.length})}catch{}}async function z(s){try{await m.confirm(`确定拒绝「${s.username}」的密码重置申请吗?`,"拒绝重置",{confirmButtonText:"拒绝",cancelButtonText:"取消",type:"warning"})}catch{return}try{const e=await K(s.id);g.success(e?.message||"密码重置申请已拒绝"),await h(),await _?.({pendingResets:c.value.length})}catch{}}return q(u),(s,e)=>{const o=d("el-button"),l=d("el-table-column"),S=d("el-tag"),R=d("el-table"),C=d("el-card"),P=G("loading");return f(),W("div",O,[i("div",Q,[e[1]||(e[1]=i("h2",null,"待审核",-1)),i("div",null,[t(o,{onClick:u},{default:a(()=>[...e[0]||(e[0]=[r("刷新",-1)])]),_:1})])]),t(C,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:a(()=>[e[5]||(e[5]=i("h3",{class:"section-title"},"用户注册审核",-1)),i("div",X,[$((f(),x(R,{data:v.value,style:{width:"100%"}},{default:a(()=>[t(l,{prop:"id",label:"ID",width:"80"}),t(l,{label:"用户名","min-width":"200"},{default:a(({row:n})=>[i("div",Y,[i("strong",null,k(n.username),1),D(n)?(f(),x(S,{key:0,type:"warning",effect:"light",size:"small"},{default:a(()=>[...e[2]||(e[2]=[r("VIP",-1)])]),_:1})):H("",!0)])]),_:1}),t(l,{prop:"email",label:"邮箱","min-width":"220"},{default:a(({row:n})=>[r(k(n.email||"-"),1)]),_:1}),t(l,{prop:"created_at",label:"注册时间","min-width":"180"}),t(l,{label:"操作",width:"180",fixed:"right"},{default:a(({row:n})=>[t(o,{type:"success",size:"small",onClick:b=>N(n)},{default:a(()=>[...e[3]||(e[3]=[r("通过",-1)])]),_:1},8,["onClick"]),t(o,{type:"danger",size:"small",onClick:b=>U(n)},{default:a(()=>[...e[4]||(e[4]=[r("拒绝",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[P,w.value]])])]),_:1}),t(C,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:a(()=>[e[8]||(e[8]=i("h3",{class:"section-title"},"密码重置审核",-1)),i("div",Z,[$((f(),x(R,{data:c.value,style:{width:"100%"}},{default:a(()=>[t(l,{prop:"id",label:"申请ID",width:"90"}),t(l,{prop:"username",label:"用户名","min-width":"200"}),t(l,{prop:"email",label:"邮箱","min-width":"220"},{default:a(({row:n})=>[r(k(n.email||"-"),1)]),_:1}),t(l,{prop:"created_at",label:"申请时间","min-width":"180"}),t(l,{label:"操作",width:"180",fixed:"right"},{default:a(({row:n})=>[t(o,{type:"success",size:"small",onClick:b=>V(n)},{default:a(()=>[...e[6]||(e[6]=[r("批准",-1)])]),_:1},8,["onClick"]),t(o,{type:"danger",size:"small",onClick:b=>z(n)},{default:a(()=>[...e[7]||(e[7]=[r("拒绝",-1)])]),_:1},8,["onClick"])]),_:1})]),_:1},8,["data"])),[[P,y.value]])])]),_:1})])}}},le=M(ee,[["__scopeId","data-v-f2aa6820"]]);export{le as default};

View File

@@ -1 +1 @@
import{B as m,_ as T,r as p,c as h,a as r,b as a,w as s,d as u,g as k,h as b,m as d,E as x}from"./index-CCJGmygT.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 B(){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 V(){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:B},{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:V},{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}; import{B as m,_ as T,r as p,c as h,a as r,b as a,w as s,d as u,g as k,h as b,m as d,E as x}from"./index-BrN7V6n-.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 B(){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 V(){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:B},{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:V},{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};

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

@@ -1,4 +1,4 @@
import{B as x,_ as le,r as s,y as ae,o as te,j as oe,e as ne,c as F,a as n,b as l,w as t,d as i,g,h as y,k as $,l as D,F as ue,s as se,t as re,E as I,m as p}from"./index-CCJGmygT.js";async function de(){const{data:d}=await x.get("/system/config");return d}async function H(d){const{data:v}=await x.post("/system/config",d);return v}async function ie(){const{data:d}=await x.post("/schedule/execute",{});return d}async function me(){const{data:d}=await x.get("/proxy/config");return d}async function ce(d){const{data:v}=await x.post("/proxy/config",d);return v}async function pe(d){const{data:v}=await x.post("/proxy/test",d);return v}const ve={class:"page-stack"},ye={class:"app-page-title"},_e={class:"row-actions"},fe={class:"row-actions"},xe={__name:"SystemPage",setup(d){const v=s(!1),w=s(2),k=s(1),P=s(3),m=s(!1),C=s("02:00"),b=s("应读"),_=s(["1","2","3","4","5","6","7"]),V=s(!1),f=s(""),B=s(3),N=s(!1),h=s(10),U=s(7),j=[{label:"周一",value:"1"},{label:"周二",value:"2"},{label:"周三",value:"3"},{label:"周四",value:"4"},{label:"周五",value:"5"},{label:"周六",value:"6"},{label:"周日",value:"7"}],L={1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"},O=ae(()=>(_.value||[]).map(a=>L[Number(a)]||a).join("、"));async function M(){v.value=!0;try{const[a,e]=await Promise.all([de(),me()]);w.value=a.max_concurrent_global??2,k.value=a.max_concurrent_per_account??1,P.value=a.max_screenshot_concurrent??3,m.value=(a.schedule_enabled??0)===1,C.value=a.schedule_time||"02:00",b.value=a.schedule_browse_type||"应读";const u=String(a.schedule_weekdays||"1,2,3,4,5,6,7").split(",").map(c=>c.trim()).filter(Boolean);_.value=u.length?u:["1","2","3","4","5","6","7"],N.value=(a.auto_approve_enabled??0)===1,h.value=a.auto_approve_hourly_limit??10,U.value=a.auto_approve_vip_days??7,V.value=(e.proxy_enabled??0)===1,f.value=e.proxy_api_url||"",B.value=e.proxy_expire_minutes??3}catch{}finally{v.value=!1}}async function W(){const a={max_concurrent_global:Number(w.value),max_concurrent_per_account:Number(k.value),max_screenshot_concurrent:Number(P.value)};try{await I.confirm(`确定更新并发配置吗? import{B as x,_ as le,r as s,y as ae,o as te,j as oe,e as ne,c as F,a as n,b as l,w as t,d as i,g,h as y,k as $,l as D,F as ue,s as se,t as re,E as I,m as p}from"./index-BrN7V6n-.js";async function de(){const{data:d}=await x.get("/system/config");return d}async function H(d){const{data:v}=await x.post("/system/config",d);return v}async function ie(){const{data:d}=await x.post("/schedule/execute",{});return d}async function me(){const{data:d}=await x.get("/proxy/config");return d}async function ce(d){const{data:v}=await x.post("/proxy/config",d);return v}async function pe(d){const{data:v}=await x.post("/proxy/test",d);return v}const ve={class:"page-stack"},ye={class:"app-page-title"},_e={class:"row-actions"},fe={class:"row-actions"},xe={__name:"SystemPage",setup(d){const v=s(!1),w=s(2),k=s(1),P=s(3),m=s(!1),C=s("02:00"),b=s("应读"),_=s(["1","2","3","4","5","6","7"]),V=s(!1),f=s(""),B=s(3),N=s(!1),h=s(10),U=s(7),j=[{label:"周一",value:"1"},{label:"周二",value:"2"},{label:"周三",value:"3"},{label:"周四",value:"4"},{label:"周五",value:"5"},{label:"周六",value:"6"},{label:"周日",value:"7"}],L={1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"},O=ae(()=>(_.value||[]).map(a=>L[Number(a)]||a).join("、"));async function M(){v.value=!0;try{const[a,e]=await Promise.all([de(),me()]);w.value=a.max_concurrent_global??2,k.value=a.max_concurrent_per_account??1,P.value=a.max_screenshot_concurrent??3,m.value=(a.schedule_enabled??0)===1,C.value=a.schedule_time||"02:00",b.value=a.schedule_browse_type||"应读";const u=String(a.schedule_weekdays||"1,2,3,4,5,6,7").split(",").map(c=>c.trim()).filter(Boolean);_.value=u.length?u:["1","2","3","4","5","6","7"],N.value=(a.auto_approve_enabled??0)===1,h.value=a.auto_approve_hourly_limit??10,U.value=a.auto_approve_vip_days??7,V.value=(e.proxy_enabled??0)===1,f.value=e.proxy_api_url||"",B.value=e.proxy_expire_minutes??3}catch{}finally{v.value=!1}}async function W(){const a={max_concurrent_global:Number(w.value),max_concurrent_per_account:Number(k.value),max_screenshot_concurrent:Number(P.value)};try{await I.confirm(`确定更新并发配置吗?
全局并发数: ${a.max_concurrent_global} 全局并发数: ${a.max_concurrent_global}
单账号并发数: ${a.max_concurrent_per_account} 单账号并发数: ${a.max_concurrent_per_account}

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 +1 @@
import{B as a}from"./index-CCJGmygT.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{e as a,o as b,r as c,i as d,f as e,c as f}; import{B as a}from"./index-BrN7V6n-.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{e as a,o as b,r as c,i as d,f as e,c as f};

View File

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

View File

@@ -5,8 +5,8 @@
<link rel="icon" type="image/svg+xml" href="./vite.svg" /> <link rel="icon" type="image/svg+xml" href="./vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>后台管理 - 知识管理平台</title> <title>后台管理 - 知识管理平台</title>
<script type="module" crossorigin src="./assets/index-CCJGmygT.js"></script> <script type="module" crossorigin src="./assets/index-BrN7V6n-.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-lm5BCraY.css"> <link rel="stylesheet" crossorigin href="./assets/index-BIDpnzAs.css">
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>