chore(admin): final polish and QA doc
This commit is contained in:
+15
-19
@@ -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 节清单逐项点验;若发现任何“功能不一致/缺按钮/接口报错”,把具体页面与操作步骤发我即可快速修复
|
||||||
|
|||||||
@@ -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)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
],
|
],
|
||||||
|
|||||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -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
@@ -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
+1
-1
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
-1
@@ -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};
|
||||||
+1
-1
@@ -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};
|
||||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -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}
|
|
||||||
@@ -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}
|
||||||
+1
-1
@@ -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}
|
||||||
+1
-1
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
@@ -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};
|
||||||
@@ -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};
|
||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user