Add KDocs action feedback
This commit is contained in:
@@ -44,6 +44,10 @@ const kdocsStatus = ref({})
|
|||||||
const kdocsQrOpen = ref(false)
|
const kdocsQrOpen = ref(false)
|
||||||
const kdocsQrImage = ref('')
|
const kdocsQrImage = ref('')
|
||||||
const kdocsPolling = ref(false)
|
const kdocsPolling = ref(false)
|
||||||
|
const kdocsStatusLoading = ref(false)
|
||||||
|
const kdocsQrLoading = ref(false)
|
||||||
|
const kdocsClearLoading = ref(false)
|
||||||
|
const kdocsActionHint = ref('')
|
||||||
let kdocsPollingTimer = null
|
let kdocsPollingTimer = null
|
||||||
|
|
||||||
const weekdaysOptions = [
|
const weekdaysOptions = [
|
||||||
@@ -71,12 +75,24 @@ const scheduleWeekdayDisplay = computed(() =>
|
|||||||
.map((d) => weekdayNames[Number(d)] || d)
|
.map((d) => weekdayNames[Number(d)] || d)
|
||||||
.join('、'),
|
.join('、'),
|
||||||
)
|
)
|
||||||
|
const kdocsActionBusy = computed(
|
||||||
|
() => kdocsStatusLoading.value || kdocsQrLoading.value || kdocsClearLoading.value,
|
||||||
|
)
|
||||||
|
|
||||||
function normalizeBrowseType(value) {
|
function normalizeBrowseType(value) {
|
||||||
if (String(value) === '注册前未读') return '注册前未读'
|
if (String(value) === '注册前未读') return '注册前未读'
|
||||||
return '应读'
|
return '应读'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setKdocsHint(message) {
|
||||||
|
if (!message) {
|
||||||
|
kdocsActionHint.value = ''
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const time = new Date().toLocaleTimeString('zh-CN', { hour12: false })
|
||||||
|
kdocsActionHint.value = `${message} (${time})`
|
||||||
|
}
|
||||||
|
|
||||||
async function loadAll() {
|
async function loadAll() {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
@@ -250,10 +266,16 @@ async function saveKdocsConfig() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function refreshKdocsStatus() {
|
async function refreshKdocsStatus() {
|
||||||
|
if (kdocsStatusLoading.value) return
|
||||||
|
kdocsStatusLoading.value = true
|
||||||
|
setKdocsHint('正在刷新状态')
|
||||||
try {
|
try {
|
||||||
kdocsStatus.value = await fetchKdocsStatus({ live: 1 })
|
kdocsStatus.value = await fetchKdocsStatus({ live: 1 })
|
||||||
|
setKdocsHint('状态已刷新')
|
||||||
} catch {
|
} catch {
|
||||||
// handled by interceptor
|
setKdocsHint('刷新失败,请稍后重试')
|
||||||
|
} finally {
|
||||||
|
kdocsStatusLoading.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,6 +286,7 @@ async function pollKdocsStatus() {
|
|||||||
const loggedIn = status?.logged_in === true || status?.last_login_ok === true
|
const loggedIn = status?.logged_in === true || status?.last_login_ok === true
|
||||||
if (loggedIn) {
|
if (loggedIn) {
|
||||||
ElMessage.success('扫码成功,已登录')
|
ElMessage.success('扫码成功,已登录')
|
||||||
|
setKdocsHint('扫码成功,已登录')
|
||||||
kdocsQrOpen.value = false
|
kdocsQrOpen.value = false
|
||||||
stopKdocsPolling()
|
stopKdocsPolling()
|
||||||
}
|
}
|
||||||
@@ -275,6 +298,7 @@ async function pollKdocsStatus() {
|
|||||||
function startKdocsPolling() {
|
function startKdocsPolling() {
|
||||||
stopKdocsPolling()
|
stopKdocsPolling()
|
||||||
kdocsPolling.value = true
|
kdocsPolling.value = true
|
||||||
|
setKdocsHint('扫码检测中')
|
||||||
pollKdocsStatus()
|
pollKdocsStatus()
|
||||||
kdocsPollingTimer = setInterval(pollKdocsStatus, 2000)
|
kdocsPollingTimer = setInterval(pollKdocsStatus, 2000)
|
||||||
}
|
}
|
||||||
@@ -288,31 +312,48 @@ function stopKdocsPolling() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function onFetchKdocsQr() {
|
async function onFetchKdocsQr() {
|
||||||
|
if (kdocsQrLoading.value) return
|
||||||
|
kdocsQrLoading.value = true
|
||||||
|
setKdocsHint('正在获取二维码')
|
||||||
try {
|
try {
|
||||||
|
kdocsQrImage.value = ''
|
||||||
const res = await fetchKdocsQr()
|
const res = await fetchKdocsQr()
|
||||||
kdocsQrImage.value = res?.qr_image || ''
|
kdocsQrImage.value = res?.qr_image || ''
|
||||||
if (!kdocsQrImage.value) {
|
if (!kdocsQrImage.value) {
|
||||||
if (res?.logged_in) {
|
if (res?.logged_in) {
|
||||||
ElMessage.success('当前已登录,无需扫码')
|
ElMessage.success('当前已登录,无需扫码')
|
||||||
|
setKdocsHint('当前已登录,无需扫码')
|
||||||
await refreshKdocsStatus()
|
await refreshKdocsStatus()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ElMessage.warning('未获取到二维码')
|
ElMessage.warning('未获取到二维码')
|
||||||
|
setKdocsHint('未获取到二维码')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
setKdocsHint('二维码已获取')
|
||||||
kdocsQrOpen.value = true
|
kdocsQrOpen.value = true
|
||||||
} catch {
|
} catch {
|
||||||
// handled by interceptor
|
setKdocsHint('获取二维码失败')
|
||||||
|
} finally {
|
||||||
|
kdocsQrLoading.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onClearKdocsLogin() {
|
async function onClearKdocsLogin() {
|
||||||
|
if (kdocsClearLoading.value) return
|
||||||
|
kdocsClearLoading.value = true
|
||||||
|
setKdocsHint('正在清除登录态')
|
||||||
try {
|
try {
|
||||||
await clearKdocsLogin()
|
await clearKdocsLogin()
|
||||||
|
kdocsQrOpen.value = false
|
||||||
|
kdocsQrImage.value = ''
|
||||||
ElMessage.success('登录态已清除')
|
ElMessage.success('登录态已清除')
|
||||||
|
setKdocsHint('登录态已清除')
|
||||||
await refreshKdocsStatus()
|
await refreshKdocsStatus()
|
||||||
} catch {
|
} catch {
|
||||||
// handled by interceptor
|
setKdocsHint('清除登录态失败')
|
||||||
|
} finally {
|
||||||
|
kdocsClearLoading.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -535,9 +576,31 @@ onMounted(loadAll)
|
|||||||
|
|
||||||
<div class="row-actions">
|
<div class="row-actions">
|
||||||
<el-button type="primary" @click="saveKdocsConfig">保存表格配置</el-button>
|
<el-button type="primary" @click="saveKdocsConfig">保存表格配置</el-button>
|
||||||
<el-button @click="refreshKdocsStatus">刷新状态</el-button>
|
<el-button
|
||||||
<el-button type="success" plain @click="onFetchKdocsQr">获取二维码</el-button>
|
:loading="kdocsStatusLoading"
|
||||||
<el-button type="danger" plain @click="onClearKdocsLogin">清除登录</el-button>
|
:disabled="kdocsActionBusy && !kdocsStatusLoading"
|
||||||
|
@click="refreshKdocsStatus"
|
||||||
|
>
|
||||||
|
刷新状态
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="success"
|
||||||
|
plain
|
||||||
|
:loading="kdocsQrLoading"
|
||||||
|
:disabled="kdocsActionBusy && !kdocsQrLoading"
|
||||||
|
@click="onFetchKdocsQr"
|
||||||
|
>
|
||||||
|
获取二维码
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
plain
|
||||||
|
:loading="kdocsClearLoading"
|
||||||
|
:disabled="kdocsActionBusy && !kdocsClearLoading"
|
||||||
|
@click="onClearKdocsLogin"
|
||||||
|
>
|
||||||
|
清除登录
|
||||||
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="help">
|
<div class="help">
|
||||||
@@ -548,6 +611,7 @@ onMounted(loadAll)
|
|||||||
· 待上传 {{ kdocsStatus.queue_size || 0 }}
|
· 待上传 {{ kdocsStatus.queue_size || 0 }}
|
||||||
<span v-if="kdocsStatus.last_error">· 最近错误:{{ kdocsStatus.last_error }}</span>
|
<span v-if="kdocsStatus.last_error">· 最近错误:{{ kdocsStatus.last_error }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="kdocsActionHint" class="help">操作提示:{{ kdocsActionHint }}</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
|
||||||
<el-dialog v-model="kdocsQrOpen" title="扫码登录" width="min(420px, 92vw)">
|
<el-dialog v-model="kdocsQrOpen" title="扫码登录" width="min(420px, 92vw)">
|
||||||
|
|||||||
@@ -1,34 +1,34 @@
|
|||||||
{
|
{
|
||||||
"_email-CANx8Tja.js": {
|
"_email-BBYDqLKN.js": {
|
||||||
"file": "assets/email-CANx8Tja.js",
|
"file": "assets/email-BBYDqLKN.js",
|
||||||
"name": "email",
|
"name": "email",
|
||||||
"imports": [
|
"imports": [
|
||||||
"index.html"
|
"index.html"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"_system-CM-zje4U.js": {
|
"_system-BDTy0cf_.js": {
|
||||||
"file": "assets/system-CM-zje4U.js",
|
"file": "assets/system-BDTy0cf_.js",
|
||||||
"name": "system",
|
"name": "system",
|
||||||
"imports": [
|
"imports": [
|
||||||
"index.html"
|
"index.html"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"_tasks-MT8n16Cr.js": {
|
"_tasks-CeZTKYlS.js": {
|
||||||
"file": "assets/tasks-MT8n16Cr.js",
|
"file": "assets/tasks-CeZTKYlS.js",
|
||||||
"name": "tasks",
|
"name": "tasks",
|
||||||
"imports": [
|
"imports": [
|
||||||
"index.html"
|
"index.html"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"_users-BfTiBX13.js": {
|
"_users-CWMQV7em.js": {
|
||||||
"file": "assets/users-BfTiBX13.js",
|
"file": "assets/users-CWMQV7em.js",
|
||||||
"name": "users",
|
"name": "users",
|
||||||
"imports": [
|
"imports": [
|
||||||
"index.html"
|
"index.html"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"index.html": {
|
"index.html": {
|
||||||
"file": "assets/index-DD_NUvZR.js",
|
"file": "assets/index-BDEpmftQ.js",
|
||||||
"name": "index",
|
"name": "index",
|
||||||
"src": "index.html",
|
"src": "index.html",
|
||||||
"isEntry": true,
|
"isEntry": true,
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/AnnouncementsPage.vue": {
|
"src/pages/AnnouncementsPage.vue": {
|
||||||
"file": "assets/AnnouncementsPage-DJV9obay.js",
|
"file": "assets/AnnouncementsPage-D9Qeb7XP.js",
|
||||||
"name": "AnnouncementsPage",
|
"name": "AnnouncementsPage",
|
||||||
"src": "src/pages/AnnouncementsPage.vue",
|
"src": "src/pages/AnnouncementsPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
@@ -60,12 +60,12 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/EmailPage.vue": {
|
"src/pages/EmailPage.vue": {
|
||||||
"file": "assets/EmailPage-D-tsUWFT.js",
|
"file": "assets/EmailPage-wPg_LfpQ.js",
|
||||||
"name": "EmailPage",
|
"name": "EmailPage",
|
||||||
"src": "src/pages/EmailPage.vue",
|
"src": "src/pages/EmailPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
"imports": [
|
"imports": [
|
||||||
"_email-CANx8Tja.js",
|
"_email-BBYDqLKN.js",
|
||||||
"index.html"
|
"index.html"
|
||||||
],
|
],
|
||||||
"css": [
|
"css": [
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/FeedbacksPage.vue": {
|
"src/pages/FeedbacksPage.vue": {
|
||||||
"file": "assets/FeedbacksPage-DZUE-vHi.js",
|
"file": "assets/FeedbacksPage-DZkgKcO5.js",
|
||||||
"name": "FeedbacksPage",
|
"name": "FeedbacksPage",
|
||||||
"src": "src/pages/FeedbacksPage.vue",
|
"src": "src/pages/FeedbacksPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
@@ -85,13 +85,13 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/LogsPage.vue": {
|
"src/pages/LogsPage.vue": {
|
||||||
"file": "assets/LogsPage-CdMEmjzm.js",
|
"file": "assets/LogsPage-CjnNneeo.js",
|
||||||
"name": "LogsPage",
|
"name": "LogsPage",
|
||||||
"src": "src/pages/LogsPage.vue",
|
"src": "src/pages/LogsPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
"imports": [
|
"imports": [
|
||||||
"_users-BfTiBX13.js",
|
"_users-CWMQV7em.js",
|
||||||
"_tasks-MT8n16Cr.js",
|
"_tasks-CeZTKYlS.js",
|
||||||
"index.html"
|
"index.html"
|
||||||
],
|
],
|
||||||
"css": [
|
"css": [
|
||||||
@@ -99,22 +99,22 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/ReportPage.vue": {
|
"src/pages/ReportPage.vue": {
|
||||||
"file": "assets/ReportPage-DAW30JOI.js",
|
"file": "assets/ReportPage-CuHgaMnw.js",
|
||||||
"name": "ReportPage",
|
"name": "ReportPage",
|
||||||
"src": "src/pages/ReportPage.vue",
|
"src": "src/pages/ReportPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
"imports": [
|
"imports": [
|
||||||
"index.html",
|
"index.html",
|
||||||
"_email-CANx8Tja.js",
|
"_email-BBYDqLKN.js",
|
||||||
"_tasks-MT8n16Cr.js",
|
"_tasks-CeZTKYlS.js",
|
||||||
"_system-CM-zje4U.js"
|
"_system-BDTy0cf_.js"
|
||||||
],
|
],
|
||||||
"css": [
|
"css": [
|
||||||
"assets/ReportPage-Q8rCsG8A.css"
|
"assets/ReportPage-Q8rCsG8A.css"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/SecurityPage.vue": {
|
"src/pages/SecurityPage.vue": {
|
||||||
"file": "assets/SecurityPage-C21EbRZb.js",
|
"file": "assets/SecurityPage-hp7dnVAc.js",
|
||||||
"name": "SecurityPage",
|
"name": "SecurityPage",
|
||||||
"src": "src/pages/SecurityPage.vue",
|
"src": "src/pages/SecurityPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
@@ -126,7 +126,7 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/SettingsPage.vue": {
|
"src/pages/SettingsPage.vue": {
|
||||||
"file": "assets/SettingsPage-BM2ulFCL.js",
|
"file": "assets/SettingsPage-DfeoFZRa.js",
|
||||||
"name": "SettingsPage",
|
"name": "SettingsPage",
|
||||||
"src": "src/pages/SettingsPage.vue",
|
"src": "src/pages/SettingsPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
@@ -138,25 +138,25 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/SystemPage.vue": {
|
"src/pages/SystemPage.vue": {
|
||||||
"file": "assets/SystemPage-D5R5QCv7.js",
|
"file": "assets/SystemPage-CMSxrPFY.js",
|
||||||
"name": "SystemPage",
|
"name": "SystemPage",
|
||||||
"src": "src/pages/SystemPage.vue",
|
"src": "src/pages/SystemPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
"imports": [
|
"imports": [
|
||||||
"_system-CM-zje4U.js",
|
"_system-BDTy0cf_.js",
|
||||||
"index.html"
|
"index.html"
|
||||||
],
|
],
|
||||||
"css": [
|
"css": [
|
||||||
"assets/SystemPage-5z0b5M8t.css"
|
"assets/SystemPage-DHDS5_BP.css"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"src/pages/UsersPage.vue": {
|
"src/pages/UsersPage.vue": {
|
||||||
"file": "assets/UsersPage-DxOwX5c9.js",
|
"file": "assets/UsersPage-CPdD81iA.js",
|
||||||
"name": "UsersPage",
|
"name": "UsersPage",
|
||||||
"src": "src/pages/UsersPage.vue",
|
"src": "src/pages/UsersPage.vue",
|
||||||
"isDynamicEntry": true,
|
"isDynamicEntry": true,
|
||||||
"imports": [
|
"imports": [
|
||||||
"_users-BfTiBX13.js",
|
"_users-CWMQV7em.js",
|
||||||
"index.html"
|
"index.html"
|
||||||
],
|
],
|
||||||
"css": [
|
"css": [
|
||||||
|
|||||||
+1
-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
+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
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -1 +1 @@
|
|||||||
import{a as m,_ as B,r as p,f as u,g as T,h as P,j as r,m as a,w as l,q as x,L as i,K as b}from"./index-DD_NUvZR.js";async function C(o){const{data:s}=await m.put("/admin/username",{new_username:o});return s}async function S(o){const{data:s}=await m.put("/admin/password",{new_password:o});return s}async function U(){const{data:o}=await m.post("/logout");return o}const A={class:"page-stack"},E={__name:"SettingsPage",setup(o){const s=p(""),d=p(""),n=p(!1);function k(t){const e=String(t||"");return e.length<8?{ok:!1,message:"密码长度至少8位"}:e.length>128?{ok:!1,message:"密码长度不能超过128个字符"}:!/[a-zA-Z]/.test(e)||!/\d/.test(e)?{ok:!1,message:"密码必须包含字母和数字"}:{ok:!0,message:""}}async function f(){try{await U()}catch{}finally{window.location.href="/yuyx"}}async function V(){const t=s.value.trim();if(!t){i.error("请输入新用户名");return}try{await b.confirm(`确定将管理员用户名修改为「${t}」吗?修改后需要重新登录。`,"修改用户名",{confirmButtonText:"确认修改",cancelButtonText:"取消",type:"warning"})}catch{return}n.value=!0;try{await C(t),i.success("用户名修改成功,请重新登录"),s.value="",setTimeout(f,1200)}catch{}finally{n.value=!1}}async function h(){const t=d.value;if(!t){i.error("请输入新密码");return}const e=k(t);if(!e.ok){i.error(e.message);return}try{await b.confirm("确定修改管理员密码吗?修改后需要重新登录。","修改密码",{confirmButtonText:"确认修改",cancelButtonText:"取消",type:"warning"})}catch{return}n.value=!0;try{await S(t),i.success("密码修改成功,请重新登录"),d.value="",setTimeout(f,1200)}catch{}finally{n.value=!1}}return(t,e)=>{const g=u("el-input"),w=u("el-form-item"),v=u("el-form"),y=u("el-button"),_=u("el-card");return P(),T("div",A,[e[7]||(e[7]=r("div",{class:"app-page-title"},[r("h2",null,"设置"),r("span",{class:"app-muted"},"管理员账号设置")],-1)),a(_,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:l(()=>[e[3]||(e[3]=r("h3",{class:"section-title"},"修改管理员用户名",-1)),a(v,{"label-width":"120px"},{default:l(()=>[a(w,{label:"新用户名"},{default:l(()=>[a(g,{modelValue:s.value,"onUpdate:modelValue":e[0]||(e[0]=c=>s.value=c),placeholder:"输入新用户名",disabled:n.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),a(y,{type:"primary",loading:n.value,onClick:V},{default:l(()=>[...e[2]||(e[2]=[x("保存用户名",-1)])]),_:1},8,["loading"])]),_:1}),a(_,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:l(()=>[e[5]||(e[5]=r("h3",{class:"section-title"},"修改管理员密码",-1)),a(v,{"label-width":"120px"},{default:l(()=>[a(w,{label:"新密码"},{default:l(()=>[a(g,{modelValue:d.value,"onUpdate:modelValue":e[1]||(e[1]=c=>d.value=c),type:"password","show-password":"",placeholder:"输入新密码",disabled:n.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),a(y,{type:"primary",loading:n.value,onClick:h},{default:l(()=>[...e[4]||(e[4]=[x("保存密码",-1)])]),_:1},8,["loading"]),e[6]||(e[6]=r("div",{class:"help"},"建议使用更强密码(至少8位且包含字母与数字)。",-1))]),_:1})])}}},M=B(E,[["__scopeId","data-v-12a26d11"]]);export{M as default};
|
import{a as m,_ as B,r as p,f as u,g as T,h as P,j as r,m as a,w as l,q as x,L as i,K as b}from"./index-BDEpmftQ.js";async function C(o){const{data:s}=await m.put("/admin/username",{new_username:o});return s}async function S(o){const{data:s}=await m.put("/admin/password",{new_password:o});return s}async function U(){const{data:o}=await m.post("/logout");return o}const A={class:"page-stack"},E={__name:"SettingsPage",setup(o){const s=p(""),d=p(""),n=p(!1);function k(t){const e=String(t||"");return e.length<8?{ok:!1,message:"密码长度至少8位"}:e.length>128?{ok:!1,message:"密码长度不能超过128个字符"}:!/[a-zA-Z]/.test(e)||!/\d/.test(e)?{ok:!1,message:"密码必须包含字母和数字"}:{ok:!0,message:""}}async function f(){try{await U()}catch{}finally{window.location.href="/yuyx"}}async function V(){const t=s.value.trim();if(!t){i.error("请输入新用户名");return}try{await b.confirm(`确定将管理员用户名修改为「${t}」吗?修改后需要重新登录。`,"修改用户名",{confirmButtonText:"确认修改",cancelButtonText:"取消",type:"warning"})}catch{return}n.value=!0;try{await C(t),i.success("用户名修改成功,请重新登录"),s.value="",setTimeout(f,1200)}catch{}finally{n.value=!1}}async function h(){const t=d.value;if(!t){i.error("请输入新密码");return}const e=k(t);if(!e.ok){i.error(e.message);return}try{await b.confirm("确定修改管理员密码吗?修改后需要重新登录。","修改密码",{confirmButtonText:"确认修改",cancelButtonText:"取消",type:"warning"})}catch{return}n.value=!0;try{await S(t),i.success("密码修改成功,请重新登录"),d.value="",setTimeout(f,1200)}catch{}finally{n.value=!1}}return(t,e)=>{const g=u("el-input"),w=u("el-form-item"),v=u("el-form"),y=u("el-button"),_=u("el-card");return P(),T("div",A,[e[7]||(e[7]=r("div",{class:"app-page-title"},[r("h2",null,"设置"),r("span",{class:"app-muted"},"管理员账号设置")],-1)),a(_,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:l(()=>[e[3]||(e[3]=r("h3",{class:"section-title"},"修改管理员用户名",-1)),a(v,{"label-width":"120px"},{default:l(()=>[a(w,{label:"新用户名"},{default:l(()=>[a(g,{modelValue:s.value,"onUpdate:modelValue":e[0]||(e[0]=c=>s.value=c),placeholder:"输入新用户名",disabled:n.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),a(y,{type:"primary",loading:n.value,onClick:V},{default:l(()=>[...e[2]||(e[2]=[x("保存用户名",-1)])]),_:1},8,["loading"])]),_:1}),a(_,{shadow:"never","body-style":{padding:"16px"},class:"card"},{default:l(()=>[e[5]||(e[5]=r("h3",{class:"section-title"},"修改管理员密码",-1)),a(v,{"label-width":"120px"},{default:l(()=>[a(w,{label:"新密码"},{default:l(()=>[a(g,{modelValue:d.value,"onUpdate:modelValue":e[1]||(e[1]=c=>d.value=c),type:"password","show-password":"",placeholder:"输入新密码",disabled:n.value},null,8,["modelValue","disabled"])]),_:1})]),_:1}),a(y,{type:"primary",loading:n.value,onClick:h},{default:l(()=>[...e[4]||(e[4]=[x("保存密码",-1)])]),_:1},8,["loading"]),e[6]||(e[6]=r("div",{class:"help"},"建议使用更强密码(至少8位且包含字母与数字)。",-1))]),_:1})])}}},M=B(E,[["__scopeId","data-v-12a26d11"]]);export{M as default};
|
||||||
@@ -1 +0,0 @@
|
|||||||
.page-stack[data-v-5af0394e]{display:flex;flex-direction:column;gap:12px}.card[data-v-5af0394e]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.section-title[data-v-5af0394e]{margin:0 0 12px;font-size:14px;font-weight:800}.kdocs-qr[data-v-5af0394e]{display:flex;flex-direction:column;align-items:center;gap:12px}.kdocs-qr img[data-v-5af0394e]{width:260px;max-width:100%;border:1px solid var(--app-border);border-radius:8px;padding:8px;background:#fff}.help[data-v-5af0394e]{margin-top:6px;font-size:12px;color:var(--app-muted)}.row-actions[data-v-5af0394e]{display:flex;flex-wrap:wrap;gap:10px}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
|||||||
|
.page-stack[data-v-682b6c42]{display:flex;flex-direction:column;gap:12px}.card[data-v-682b6c42]{border-radius:var(--app-radius);border:1px solid var(--app-border)}.section-title[data-v-682b6c42]{margin:0 0 12px;font-size:14px;font-weight:800}.kdocs-qr[data-v-682b6c42]{display:flex;flex-direction:column;align-items:center;gap:12px}.kdocs-qr img[data-v-682b6c42]{width:260px;max-width:100%;border:1px solid var(--app-border);border-radius:8px;padding:8px;background:#fff}.help[data-v-682b6c42]{margin-top:6px;font-size:12px;color:var(--app-muted)}.row-actions[data-v-682b6c42]{display:flex;flex-wrap:wrap;gap:10px}
|
||||||
+1
-1
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{a as n}from"./index-DD_NUvZR.js";async function i(){const{data:a}=await n.get("/email/settings");return a}async function e(a){const{data:t}=await n.post("/email/settings",a);return t}async function c(){const{data:a}=await n.get("/email/stats");return a}async function o(a){const{data:t}=await n.get("/email/logs",{params:a});return t}async function l(a){const{data:t}=await n.post("/email/logs/cleanup",{days:a});return t}export{o as a,i as b,l as c,c as f,e as u};
|
import{a as n}from"./index-BDEpmftQ.js";async function i(){const{data:a}=await n.get("/email/settings");return a}async function e(a){const{data:t}=await n.post("/email/settings",a);return t}async function c(){const{data:a}=await n.get("/email/stats");return a}async function o(a){const{data:t}=await n.get("/email/logs",{params:a});return t}async function l(a){const{data:t}=await n.post("/email/logs/cleanup",{days:a});return t}export{o as a,i as b,l as c,c as f,e as u};
|
||||||
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
|||||||
import{a}from"./index-DD_NUvZR.js";async function s(){const{data:t}=await a.get("/system/config");return t}async function c(t){const{data:e}=await a.post("/system/config",t);return e}async function o(){const{data:t}=await a.post("/schedule/execute",{});return t}export{o as e,s as f,c as u};
|
import{a}from"./index-BDEpmftQ.js";async function s(){const{data:t}=await a.get("/system/config");return t}async function c(t){const{data:e}=await a.post("/system/config",t);return e}async function o(){const{data:t}=await a.post("/schedule/execute",{});return t}export{o as e,s as f,c as u};
|
||||||
@@ -1 +1 @@
|
|||||||
import{a}from"./index-DD_NUvZR.js";async function c(){const{data:t}=await a.get("/server/info");return t}async function e(){const{data:t}=await a.get("/docker_stats");return t}async function o(){const{data:t}=await a.get("/task/stats");return t}async function r(){const{data:t}=await a.get("/task/running");return t}async function i(t){const{data:s}=await a.get("/task/logs",{params:t});return s}async function f(t){const{data:s}=await a.post("/task/logs/clear",{days:t});return s}export{r as a,c as b,e as c,i as d,f as e,o as f};
|
import{a}from"./index-BDEpmftQ.js";async function c(){const{data:t}=await a.get("/server/info");return t}async function e(){const{data:t}=await a.get("/docker_stats");return t}async function o(){const{data:t}=await a.get("/task/stats");return t}async function r(){const{data:t}=await a.get("/task/running");return t}async function i(t){const{data:s}=await a.get("/task/logs",{params:t});return s}async function f(t){const{data:s}=await a.post("/task/logs/clear",{days:t});return s}export{r as a,c as b,e as c,i as d,f as e,o as f};
|
||||||
@@ -1 +1 @@
|
|||||||
import{a as t}from"./index-DD_NUvZR.js";async function n(){const{data:s}=await t.get("/users");return s}async function o(s){const{data:a}=await t.post(`/users/${s}/approve`);return a}async function c(s){const{data:a}=await t.post(`/users/${s}/reject`);return a}async function i(s){const{data:a}=await t.delete(`/users/${s}`);return a}async function u(s,a){const{data:e}=await t.post(`/users/${s}/vip`,{days:a});return e}async function p(s){const{data:a}=await t.delete(`/users/${s}/vip`);return a}async function d(s,a){const{data:e}=await t.post(`/users/${s}/reset_password`,{new_password:a});return e}export{o as a,p as b,d as c,i as d,n as f,c as r,u as s};
|
import{a as t}from"./index-BDEpmftQ.js";async function n(){const{data:s}=await t.get("/users");return s}async function o(s){const{data:a}=await t.post(`/users/${s}/approve`);return a}async function c(s){const{data:a}=await t.post(`/users/${s}/reject`);return a}async function i(s){const{data:a}=await t.delete(`/users/${s}`);return a}async function u(s,a){const{data:e}=await t.post(`/users/${s}/vip`,{days:a});return e}async function p(s){const{data:a}=await t.delete(`/users/${s}/vip`);return a}async function d(s,a){const{data:e}=await t.post(`/users/${s}/reset_password`,{new_password:a});return e}export{o as a,p as b,d as c,i as d,n as f,c as r,u as s};
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
<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-DD_NUvZR.js"></script>
|
<script type="module" crossorigin src="./assets/index-BDEpmftQ.js"></script>
|
||||||
<link rel="stylesheet" crossorigin href="./assets/index-DxTKnDeo.css">
|
<link rel="stylesheet" crossorigin href="./assets/index-DxTKnDeo.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
Reference in New Issue
Block a user