更新邮件页面和管理API
This commit is contained in:
@@ -102,10 +102,120 @@ const smtpForm = reactive({
|
||||
priority: 0,
|
||||
})
|
||||
|
||||
const SMTP_TEMPLATES = [
|
||||
{
|
||||
key: 'custom',
|
||||
label: '自定义(手动填写)',
|
||||
defaults: null,
|
||||
note: '适用于其他邮箱/自建SMTP',
|
||||
links: [],
|
||||
},
|
||||
{
|
||||
key: 'gmail',
|
||||
label: 'Gmail',
|
||||
defaults: { host: 'smtp.gmail.com', port: 465, use_ssl: true, use_tls: false },
|
||||
note: '通常需要开启两步验证并创建应用专用密码(App Password)',
|
||||
links: [
|
||||
{ label: 'SMTP 设置说明', url: 'https://support.google.com/mail/answer/7126229?hl=zh-Hans' },
|
||||
{ label: 'App Password', url: 'https://myaccount.google.com/apppasswords' },
|
||||
],
|
||||
},
|
||||
{
|
||||
key: 'qq',
|
||||
label: 'QQ 邮箱',
|
||||
defaults: { host: 'smtp.qq.com', port: 465, use_ssl: true, use_tls: false },
|
||||
note: '需要在邮箱设置中开启 SMTP 并获取授权码(不是QQ登录密码)',
|
||||
links: [{ label: 'QQ邮箱 SMTP 帮助', url: 'https://service.mail.qq.com/cgi-bin/help?subtype=1&id=28&no=1001256' }],
|
||||
},
|
||||
{
|
||||
key: '163',
|
||||
label: '163 邮箱',
|
||||
defaults: { host: 'smtp.163.com', port: 465, use_ssl: true, use_tls: false },
|
||||
note: '需要在邮箱设置中开启 SMTP 并使用授权码/客户端授权密码',
|
||||
links: [{ label: '网易邮箱 SMTP 帮助', url: 'https://help.mail.163.com/faqDetail.do?code=d7a5dc8471a22b76' }],
|
||||
},
|
||||
{
|
||||
key: '126',
|
||||
label: '126 邮箱',
|
||||
defaults: { host: 'smtp.126.com', port: 465, use_ssl: true, use_tls: false },
|
||||
note: '需要在邮箱设置中开启 SMTP 并使用授权码/客户端授权密码',
|
||||
links: [{ label: '网易邮箱帮助', url: 'https://help.mail.163.com/' }],
|
||||
},
|
||||
{
|
||||
key: 'outlook',
|
||||
label: 'Outlook/Hotmail',
|
||||
defaults: { host: 'smtp-mail.outlook.com', port: 587, use_ssl: false, use_tls: true },
|
||||
note: '建议使用 TLS 587(部分账号需开启 SMTP AUTH)',
|
||||
links: [
|
||||
{
|
||||
label: '微软 SMTP 设置',
|
||||
url: 'https://support.microsoft.com/office/pop-imap-and-smtp-settings-for-outlook-com-d088b0b7-0d38-4f9a-bc5d-509f9e4c6d3d',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
key: 'office365',
|
||||
label: 'Microsoft 365/Exchange',
|
||||
defaults: { host: 'smtp.office365.com', port: 587, use_ssl: false, use_tls: true },
|
||||
note: '企业邮箱常用配置(需启用 SMTP AUTH)',
|
||||
links: [{ label: '微软官方说明', url: 'https://learn.microsoft.com/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission' }],
|
||||
},
|
||||
{
|
||||
key: 'icloud',
|
||||
label: 'iCloud',
|
||||
defaults: { host: 'smtp.mail.me.com', port: 587, use_ssl: false, use_tls: true },
|
||||
note: '需要在 Apple ID 中生成“App 专用密码”',
|
||||
links: [{ label: 'Apple 邮件服务器设置', url: 'https://support.apple.com/zh-cn/HT202304' }],
|
||||
},
|
||||
{
|
||||
key: 'tencent_exmail',
|
||||
label: '腾讯企业邮箱',
|
||||
defaults: { host: 'smtp.exmail.qq.com', port: 465, use_ssl: true, use_tls: false },
|
||||
note: '企业邮箱常用配置',
|
||||
links: [{ label: '腾讯企业邮箱帮助', url: 'https://service.exmail.qq.com/cgi-bin/help?subtype=1&id=23&no=1001068' }],
|
||||
},
|
||||
{
|
||||
key: 'aliyun_exmail',
|
||||
label: '阿里企业邮箱',
|
||||
defaults: { host: 'smtp.mxhichina.com', port: 465, use_ssl: true, use_tls: false },
|
||||
note: '企业邮箱常用配置',
|
||||
links: [{ label: '阿里云文档', url: 'https://help.aliyun.com/document_detail/50652.html' }],
|
||||
},
|
||||
]
|
||||
|
||||
const smtpTemplateKey = ref('custom')
|
||||
const currentSmtpTemplate = computed(() => SMTP_TEMPLATES.find((t) => t.key === smtpTemplateKey.value) || SMTP_TEMPLATES[0])
|
||||
|
||||
const smtpPasswordPlaceholder = computed(() =>
|
||||
smtpEditMode.value && smtpHasPassword.value ? '留空保持不变' : 'SMTP密码或授权码',
|
||||
)
|
||||
|
||||
function inferSmtpTemplateKey(row) {
|
||||
const host = String(row?.host || '').trim().toLowerCase()
|
||||
if (!host) return 'custom'
|
||||
const byHost = {
|
||||
'smtp.gmail.com': 'gmail',
|
||||
'smtp.qq.com': 'qq',
|
||||
'smtp.163.com': '163',
|
||||
'smtp.126.com': '126',
|
||||
'smtp-mail.outlook.com': 'outlook',
|
||||
'smtp.office365.com': 'office365',
|
||||
'smtp.mail.me.com': 'icloud',
|
||||
'smtp.exmail.qq.com': 'tencent_exmail',
|
||||
'smtp.mxhichina.com': 'aliyun_exmail',
|
||||
}
|
||||
return byHost[host] || 'custom'
|
||||
}
|
||||
|
||||
function applySmtpTemplate(key) {
|
||||
const tpl = SMTP_TEMPLATES.find((t) => t.key === key)
|
||||
if (!tpl || !tpl.defaults) return
|
||||
smtpForm.host = tpl.defaults.host
|
||||
smtpForm.port = tpl.defaults.port
|
||||
smtpForm.use_ssl = tpl.defaults.use_ssl
|
||||
smtpForm.use_tls = tpl.defaults.use_tls
|
||||
}
|
||||
|
||||
function resetSmtpForm() {
|
||||
smtpForm.id = null
|
||||
smtpForm.name = '默认配置'
|
||||
@@ -121,6 +231,7 @@ function resetSmtpForm() {
|
||||
smtpForm.daily_limit = 0
|
||||
smtpForm.priority = 0
|
||||
smtpHasPassword.value = false
|
||||
smtpTemplateKey.value = 'custom'
|
||||
}
|
||||
|
||||
async function loadSmtpConfigs() {
|
||||
@@ -137,6 +248,7 @@ async function loadSmtpConfigs() {
|
||||
function openCreateSmtp() {
|
||||
smtpEditMode.value = false
|
||||
resetSmtpForm()
|
||||
smtpTemplateKey.value = 'custom'
|
||||
smtpDialogOpen.value = true
|
||||
}
|
||||
|
||||
@@ -158,6 +270,7 @@ function openEditSmtp(row) {
|
||||
smtpForm.daily_limit = row.daily_limit ?? 0
|
||||
smtpForm.priority = row.priority ?? 0
|
||||
smtpHasPassword.value = Boolean(row.has_password)
|
||||
smtpTemplateKey.value = inferSmtpTemplateKey(row)
|
||||
|
||||
smtpDialogOpen.value = true
|
||||
}
|
||||
@@ -613,6 +726,26 @@ onMounted(refreshAll)
|
||||
<el-form-item label="启用">
|
||||
<el-switch v-model="smtpForm.enabled" />
|
||||
</el-form-item>
|
||||
<el-form-item label="邮箱模板">
|
||||
<div style="width: 100%">
|
||||
<el-select v-model="smtpTemplateKey" placeholder="选择常用邮箱模板" style="width: 100%" @change="applySmtpTemplate">
|
||||
<el-option v-for="t in SMTP_TEMPLATES" :key="t.key" :label="t.label" :value="t.key" />
|
||||
</el-select>
|
||||
<div
|
||||
v-if="currentSmtpTemplate.note || (currentSmtpTemplate.links && currentSmtpTemplate.links.length)"
|
||||
class="help"
|
||||
>
|
||||
<span v-if="currentSmtpTemplate.note">{{ currentSmtpTemplate.note }}</span>
|
||||
<template v-if="currentSmtpTemplate.links && currentSmtpTemplate.links.length">
|
||||
<span v-if="currentSmtpTemplate.note"> · </span>
|
||||
<span v-for="(l, idx) in currentSmtpTemplate.links" :key="l.url">
|
||||
<el-link :href="l.url" target="_blank" type="primary" :underline="false">{{ l.label }}</el-link>
|
||||
<span v-if="idx < currentSmtpTemplate.links.length - 1"> · </span>
|
||||
</span>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="服务器">
|
||||
<el-input v-model="smtpForm.host" placeholder="smtp.example.com" />
|
||||
</el-form-item>
|
||||
|
||||
@@ -1067,13 +1067,13 @@ def test_smtp_config_api(config_id):
|
||||
"""测试SMTP配置"""
|
||||
try:
|
||||
data = request.json or {}
|
||||
test_email = data.get("email", "")
|
||||
test_email = str(data.get("email", "") or "").strip()
|
||||
if not test_email:
|
||||
return jsonify({"error": "请提供测试邮箱"}), 400
|
||||
|
||||
import re
|
||||
|
||||
if not re.match(r"^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$", test_email):
|
||||
if not re.match(r"^[^\s@]+@[^\s@]+\.[^\s@]+$", test_email):
|
||||
return jsonify({"error": "邮箱格式不正确"}), 400
|
||||
|
||||
result = email_service.test_smtp_config(config_id, test_email)
|
||||
|
||||
@@ -3,22 +3,22 @@
|
||||
"file": "assets/datetime-ZCuLLiQt.js",
|
||||
"name": "datetime"
|
||||
},
|
||||
"_taskSource-D0AL5oGK.js": {
|
||||
"file": "assets/taskSource-D0AL5oGK.js",
|
||||
"_taskSource-DzNjmQDj.js": {
|
||||
"file": "assets/taskSource-DzNjmQDj.js",
|
||||
"name": "taskSource",
|
||||
"imports": [
|
||||
"index.html"
|
||||
]
|
||||
},
|
||||
"_users-BH0CdfvW.js": {
|
||||
"file": "assets/users-BH0CdfvW.js",
|
||||
"_users-B1kPIkKM.js": {
|
||||
"file": "assets/users-B1kPIkKM.js",
|
||||
"name": "users",
|
||||
"imports": [
|
||||
"index.html"
|
||||
]
|
||||
},
|
||||
"index.html": {
|
||||
"file": "assets/index-ZGOE7TRg.js",
|
||||
"file": "assets/index-BqAAVlPU.js",
|
||||
"name": "index",
|
||||
"src": "index.html",
|
||||
"isEntry": true,
|
||||
@@ -38,7 +38,7 @@
|
||||
]
|
||||
},
|
||||
"src/pages/AnnouncementsPage.vue": {
|
||||
"file": "assets/AnnouncementsPage-Bw-BD6ea.js",
|
||||
"file": "assets/AnnouncementsPage-DUunv30t.js",
|
||||
"name": "AnnouncementsPage",
|
||||
"src": "src/pages/AnnouncementsPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
@@ -50,7 +50,7 @@
|
||||
]
|
||||
},
|
||||
"src/pages/EmailPage.vue": {
|
||||
"file": "assets/EmailPage-C1zk6vnH.js",
|
||||
"file": "assets/EmailPage-MVQ8NXWH.js",
|
||||
"name": "EmailPage",
|
||||
"src": "src/pages/EmailPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
@@ -58,11 +58,11 @@
|
||||
"index.html"
|
||||
],
|
||||
"css": [
|
||||
"assets/EmailPage-BzgagLF4.css"
|
||||
"assets/EmailPage-rjdHSL6t.css"
|
||||
]
|
||||
},
|
||||
"src/pages/FeedbacksPage.vue": {
|
||||
"file": "assets/FeedbacksPage-C4AHdE3c.js",
|
||||
"file": "assets/FeedbacksPage-VtHcv1l3.js",
|
||||
"name": "FeedbacksPage",
|
||||
"src": "src/pages/FeedbacksPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
@@ -74,13 +74,13 @@
|
||||
]
|
||||
},
|
||||
"src/pages/LogsPage.vue": {
|
||||
"file": "assets/LogsPage-BqqryFPi.js",
|
||||
"file": "assets/LogsPage-DJpjJkiT.js",
|
||||
"name": "LogsPage",
|
||||
"src": "src/pages/LogsPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
"imports": [
|
||||
"_users-BH0CdfvW.js",
|
||||
"_taskSource-D0AL5oGK.js",
|
||||
"_users-B1kPIkKM.js",
|
||||
"_taskSource-DzNjmQDj.js",
|
||||
"index.html"
|
||||
],
|
||||
"css": [
|
||||
@@ -88,12 +88,12 @@
|
||||
]
|
||||
},
|
||||
"src/pages/PendingPage.vue": {
|
||||
"file": "assets/PendingPage-DheEpatu.js",
|
||||
"file": "assets/PendingPage-BQ1HrHQZ.js",
|
||||
"name": "PendingPage",
|
||||
"src": "src/pages/PendingPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
"imports": [
|
||||
"_users-BH0CdfvW.js",
|
||||
"_users-B1kPIkKM.js",
|
||||
"index.html",
|
||||
"_datetime-ZCuLLiQt.js"
|
||||
],
|
||||
@@ -102,7 +102,7 @@
|
||||
]
|
||||
},
|
||||
"src/pages/SettingsPage.vue": {
|
||||
"file": "assets/SettingsPage-CH77CIS6.js",
|
||||
"file": "assets/SettingsPage-Dw-cPgJM.js",
|
||||
"name": "SettingsPage",
|
||||
"src": "src/pages/SettingsPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
@@ -114,12 +114,12 @@
|
||||
]
|
||||
},
|
||||
"src/pages/StatsPage.vue": {
|
||||
"file": "assets/StatsPage-D7Miz3zC.js",
|
||||
"file": "assets/StatsPage-8WacBSiG.js",
|
||||
"name": "StatsPage",
|
||||
"src": "src/pages/StatsPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
"imports": [
|
||||
"_taskSource-D0AL5oGK.js",
|
||||
"_taskSource-DzNjmQDj.js",
|
||||
"index.html"
|
||||
],
|
||||
"css": [
|
||||
@@ -127,7 +127,7 @@
|
||||
]
|
||||
},
|
||||
"src/pages/SystemPage.vue": {
|
||||
"file": "assets/SystemPage-D6njCz2p.js",
|
||||
"file": "assets/SystemPage-CM9A6Faz.js",
|
||||
"name": "SystemPage",
|
||||
"src": "src/pages/SystemPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
@@ -139,12 +139,12 @@
|
||||
]
|
||||
},
|
||||
"src/pages/UsersPage.vue": {
|
||||
"file": "assets/UsersPage-CC0fPC2O.js",
|
||||
"file": "assets/UsersPage-Bd2ccTR3.js",
|
||||
"name": "UsersPage",
|
||||
"src": "src/pages/UsersPage.vue",
|
||||
"isDynamicEntry": true,
|
||||
"imports": [
|
||||
"_users-BH0CdfvW.js",
|
||||
"_users-B1kPIkKM.js",
|
||||
"_datetime-ZCuLLiQt.js",
|
||||
"index.html"
|
||||
],
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
.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
static/admin/assets/EmailPage-MVQ8NXWH.js
Normal file
1
static/admin/assets/EmailPage-MVQ8NXWH.js
Normal file
File diff suppressed because one or more lines are too long
1
static/admin/assets/EmailPage-rjdHSL6t.css
Normal file
1
static/admin/assets/EmailPage-rjdHSL6t.css
Normal file
@@ -0,0 +1 @@
|
||||
.page-stack[data-v-d7801344]{display:flex;flex-direction:column;gap:12px}.toolbar[data-v-d7801344]{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.card[data-v-d7801344]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.section-head[data-v-d7801344]{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px;flex-wrap:wrap}.section-title[data-v-d7801344]{margin:0;font-size:14px;font-weight:800}.help[data-v-d7801344]{margin-top:8px;font-size:12px;color:var(--app-muted)}.table-wrap[data-v-d7801344]{overflow-x:auto}.stat-card[data-v-d7801344]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.stat-value[data-v-d7801344]{font-size:20px;font-weight:900;line-height:1.1}.stat-label[data-v-d7801344]{margin-top:6px;font-size:12px;color:var(--app-muted)}.ok[data-v-d7801344]{color:#047857}.err[data-v-d7801344]{color:#b91c1c}.sub-stats[data-v-d7801344]{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.ellipsis[data-v-d7801344]{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pagination[data-v-d7801344]{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:14px;flex-wrap:wrap}.page-hint[data-v-d7801344]{font-size:12px}.dialog-actions[data-v-d7801344]{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.spacer[data-v-d7801344]{flex: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 @@
|
||||
import{f as E,a as I,r as A}from"./users-BH0CdfvW.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-ZGOE7TRg.js";import{p as L}from"./datetime-ZCuLLiQt.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-B1kPIkKM.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-BqAAVlPU.js";import{p as L}from"./datetime-ZCuLLiQt.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 @@
|
||||
import{C 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-ZGOE7TRg.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};
|
||||
import{C 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-BqAAVlPU.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};
|
||||
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
||||
import{C as w,_ as Ue,r as d,y as Ce,o as Pe,z as he,j as se,e as Be,c as B,a as c,b as l,w as t,d as p,k as f,g as u,h as n,l as V,F as Te,s as Ne,t as _,E,m as x}from"./index-ZGOE7TRg.js";async function Ie(){const{data:s}=await w.get("/system/config");return s}async function X(s){const{data:b}=await w.post("/system/config",s);return b}async function Ae(){const{data:s}=await w.post("/schedule/execute",{});return s}async function Se(){const{data:s}=await w.get("/proxy/config");return s}async function $e(s){const{data:b}=await w.post("/proxy/config",s);return b}async function Ee(s){const{data:b}=await w.post("/proxy/test",s);return b}async function Le(){const{data:s}=await w.get("/update/status");return s}async function je(){const{data:s}=await w.get("/update/result");return s}async function Re(s={}){const{data:b}=await w.get("/update/log",{params:s});return b}async function De(){const{data:s}=await w.post("/update/check",{});return s}async function Fe(s={}){const{data:b}=await w.post("/update/run",s);return b}const He={class:"page-stack"},Me={class:"app-page-title"},ze={class:"row-actions"},qe={class:"row-actions"},Oe={class:"row-actions",style:{"align-items":"center"}},We={class:"row-actions"},Ge={key:0},Je={key:1},Ke={key:2},Qe={key:3,class:"help"},Xe={key:4,class:"help"},Ye={__name:"SystemPage",setup(s){const b=d(!1),L=d(2),j=d(1),R=d(3),k=d(!1),D=d("02:00"),T=d("应读"),U=d(["1","2","3","4","5","6","7"]),N=d(!1),C=d(""),F=d(3),H=d(!1),M=d(10),z=d(7),J=d(!1),P=d(!1),g=d(null),q=d(""),i=d(null),O=d(""),K=d(!1),W=d(!1);let I=null;const re=[{label:"周一",value:"1"},{label:"周二",value:"2"},{label:"周三",value:"3"},{label:"周四",value:"4"},{label:"周五",value:"5"},{label:"周六",value:"6"},{label:"周日",value:"7"}],de={1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"},ie=Ce(()=>(U.value||[]).map(a=>de[Number(a)]||a).join("、"));function ce(a){return String(a)==="注册前未读"?"注册前未读":"应读"}function A(a){const e=String(a||"").trim();return e?e.length>12?`${e.slice(0,12)}…`:e:"-"}async function S({withLog:a=!0}={}){J.value=!0,q.value="";try{const[e,r]=await Promise.all([Le(),je()]);e?.ok?g.value=e.data||null:(g.value=null,q.value=e?.error||"未发现更新状态(Update-Agent 可能未运行)"),i.value=r?.ok?r.data:null;const y=i.value?.job_id;if(a&&y){const m=await Re({job_id:y,max_bytes:2e5});O.value=m?.log||"",K.value=!!m?.truncated}else O.value="",K.value=!1}catch{}finally{J.value=!1}}function Y(){I||(I=setInterval(async()=>{i.value?.status==="running"&&await S()},5e3))}function pe(){I&&(clearInterval(I),I=null)}async function Z(){b.value=!0;try{const[a,e]=await Promise.all([Ie(),Se()]);L.value=a.max_concurrent_global??2,j.value=a.max_concurrent_per_account??1,R.value=a.max_screenshot_concurrent??3,k.value=(a.schedule_enabled??0)===1,D.value=a.schedule_time||"02:00",T.value=ce(a.schedule_browse_type);const r=String(a.schedule_weekdays||"1,2,3,4,5,6,7").split(",").map(y=>y.trim()).filter(Boolean);U.value=r.length?r:["1","2","3","4","5","6","7"],H.value=(a.auto_approve_enabled??0)===1,M.value=a.auto_approve_hourly_limit??10,z.value=a.auto_approve_vip_days??7,N.value=(e.proxy_enabled??0)===1,C.value=e.proxy_api_url||"",F.value=e.proxy_expire_minutes??3,await S({withLog:!1}),Y()}catch{}finally{b.value=!1}}async function me(){const a={max_concurrent_global:Number(L.value),max_concurrent_per_account:Number(j.value),max_screenshot_concurrent:Number(R.value)};try{await E.confirm(`确定更新并发配置吗?
|
||||
import{C as w,_ as Ue,r as d,y as Ce,o as Pe,z as he,j as se,e as Be,c as B,a as c,b as l,w as t,d as p,k as f,g as u,h as n,l as V,F as Te,s as Ne,t as _,E,m as x}from"./index-BqAAVlPU.js";async function Ie(){const{data:s}=await w.get("/system/config");return s}async function X(s){const{data:b}=await w.post("/system/config",s);return b}async function Ae(){const{data:s}=await w.post("/schedule/execute",{});return s}async function Se(){const{data:s}=await w.get("/proxy/config");return s}async function $e(s){const{data:b}=await w.post("/proxy/config",s);return b}async function Ee(s){const{data:b}=await w.post("/proxy/test",s);return b}async function Le(){const{data:s}=await w.get("/update/status");return s}async function je(){const{data:s}=await w.get("/update/result");return s}async function Re(s={}){const{data:b}=await w.get("/update/log",{params:s});return b}async function De(){const{data:s}=await w.post("/update/check",{});return s}async function Fe(s={}){const{data:b}=await w.post("/update/run",s);return b}const He={class:"page-stack"},Me={class:"app-page-title"},ze={class:"row-actions"},qe={class:"row-actions"},Oe={class:"row-actions",style:{"align-items":"center"}},We={class:"row-actions"},Ge={key:0},Je={key:1},Ke={key:2},Qe={key:3,class:"help"},Xe={key:4,class:"help"},Ye={__name:"SystemPage",setup(s){const b=d(!1),L=d(2),j=d(1),R=d(3),k=d(!1),D=d("02:00"),T=d("应读"),U=d(["1","2","3","4","5","6","7"]),N=d(!1),C=d(""),F=d(3),H=d(!1),M=d(10),z=d(7),J=d(!1),P=d(!1),g=d(null),q=d(""),i=d(null),O=d(""),K=d(!1),W=d(!1);let I=null;const re=[{label:"周一",value:"1"},{label:"周二",value:"2"},{label:"周三",value:"3"},{label:"周四",value:"4"},{label:"周五",value:"5"},{label:"周六",value:"6"},{label:"周日",value:"7"}],de={1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六",7:"周日"},ie=Ce(()=>(U.value||[]).map(a=>de[Number(a)]||a).join("、"));function ce(a){return String(a)==="注册前未读"?"注册前未读":"应读"}function A(a){const e=String(a||"").trim();return e?e.length>12?`${e.slice(0,12)}…`:e:"-"}async function S({withLog:a=!0}={}){J.value=!0,q.value="";try{const[e,r]=await Promise.all([Le(),je()]);e?.ok?g.value=e.data||null:(g.value=null,q.value=e?.error||"未发现更新状态(Update-Agent 可能未运行)"),i.value=r?.ok?r.data:null;const y=i.value?.job_id;if(a&&y){const m=await Re({job_id:y,max_bytes:2e5});O.value=m?.log||"",K.value=!!m?.truncated}else O.value="",K.value=!1}catch{}finally{J.value=!1}}function Y(){I||(I=setInterval(async()=>{i.value?.status==="running"&&await S()},5e3))}function pe(){I&&(clearInterval(I),I=null)}async function Z(){b.value=!0;try{const[a,e]=await Promise.all([Ie(),Se()]);L.value=a.max_concurrent_global??2,j.value=a.max_concurrent_per_account??1,R.value=a.max_screenshot_concurrent??3,k.value=(a.schedule_enabled??0)===1,D.value=a.schedule_time||"02:00",T.value=ce(a.schedule_browse_type);const r=String(a.schedule_weekdays||"1,2,3,4,5,6,7").split(",").map(y=>y.trim()).filter(Boolean);U.value=r.length?r:["1","2","3","4","5","6","7"],H.value=(a.auto_approve_enabled??0)===1,M.value=a.auto_approve_hourly_limit??10,z.value=a.auto_approve_vip_days??7,N.value=(e.proxy_enabled??0)===1,C.value=e.proxy_api_url||"",F.value=e.proxy_expire_minutes??3,await S({withLog:!1}),Y()}catch{}finally{b.value=!1}}async function me(){const a={max_concurrent_global:Number(L.value),max_concurrent_per_account:Number(j.value),max_screenshot_concurrent:Number(R.value)};try{await E.confirm(`确定更新并发配置吗?
|
||||
|
||||
全局并发数: ${a.max_concurrent_global}
|
||||
单账号并发数: ${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
@@ -1 +1 @@
|
||||
import{C as e}from"./index-ZGOE7TRg.js";async function l(){const{data:t}=await e.get("/server/info");return t}async function d(){const{data:t}=await e.get("/docker_stats");return t}async function p(){const{data:t}=await e.get("/task/stats");return t}async function f(){const{data:t}=await e.get("/task/running");return t}async function g(t){const{data:a}=await e.get("/task/logs",{params:t});return a}async function h(t){const{data:a}=await e.post("/task/logs/clear",{days:t});return a}function r(t){return String(t||"").trim()}function c(t){return!t.startsWith("user_scheduled")||!t.includes(":")?"":t.split(":",2)[1]||""}function m(t){const a=r(t);if(!a||a==="manual")return{group:"manual",label:"手动",type:"success",tooltip:""};if(a==="scheduled")return{group:"scheduled",label:"定时任务",type:"primary",tooltip:"系统定时"};if(a.startsWith("user_scheduled")){const n=c(a),s=String(n||"").replace(/^batch_/,"");return{group:"scheduled",label:"定时任务",type:"primary",tooltip:s?`用户定时批次:${s}`:"用户定时"}}return{group:"manual",label:"手动",type:"success",tooltip:{batch:"手动批量",manual_screenshot:"手动截图",immediate:"立即执行",resumed:"断点恢复"}[a]||a}}export{d as a,p as b,f as c,g as d,h as e,l as f,m as g};
|
||||
import{C as e}from"./index-BqAAVlPU.js";async function l(){const{data:t}=await e.get("/server/info");return t}async function d(){const{data:t}=await e.get("/docker_stats");return t}async function p(){const{data:t}=await e.get("/task/stats");return t}async function f(){const{data:t}=await e.get("/task/running");return t}async function g(t){const{data:a}=await e.get("/task/logs",{params:t});return a}async function h(t){const{data:a}=await e.post("/task/logs/clear",{days:t});return a}function r(t){return String(t||"").trim()}function c(t){return!t.startsWith("user_scheduled")||!t.includes(":")?"":t.split(":",2)[1]||""}function m(t){const a=r(t);if(!a||a==="manual")return{group:"manual",label:"手动",type:"success",tooltip:""};if(a==="scheduled")return{group:"scheduled",label:"定时任务",type:"primary",tooltip:"系统定时"};if(a.startsWith("user_scheduled")){const n=c(a),s=String(n||"").replace(/^batch_/,"");return{group:"scheduled",label:"定时任务",type:"primary",tooltip:s?`用户定时批次:${s}`:"用户定时"}}return{group:"manual",label:"手动",type:"success",tooltip:{batch:"手动批量",manual_screenshot:"手动截图",immediate:"立即执行",resumed:"断点恢复"}[a]||a}}export{d as a,p as b,f as c,g as d,h as e,l as f,m as g};
|
||||
@@ -1 +1 @@
|
||||
import{C as a}from"./index-ZGOE7TRg.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{C as a}from"./index-BqAAVlPU.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,7 +5,7 @@
|
||||
<link rel="icon" type="image/svg+xml" href="./vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>后台管理 - 知识管理平台</title>
|
||||
<script type="module" crossorigin src="./assets/index-ZGOE7TRg.js"></script>
|
||||
<script type="module" crossorigin src="./assets/index-BqAAVlPU.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="./assets/index-BIDpnzAs.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
Reference in New Issue
Block a user