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": [
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -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}
|
|
||||||
17
static/admin/assets/SystemPage-CMSxrPFY.js
Normal file
17
static/admin/assets/SystemPage-CMSxrPFY.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
static/admin/assets/SystemPage-DHDS5_BP.css
Normal file
1
static/admin/assets/SystemPage-DHDS5_BP.css
Normal file
@@ -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}
|
||||||
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