mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-09-05 15:36:49 +08:00
feat: 更新版本至2.0.7
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "moviepilot",
|
"name": "moviepilot",
|
||||||
"version": "2.0.6",
|
"version": "2.0.7",
|
||||||
"private": true,
|
"private": true,
|
||||||
"bin": "dist/service.js",
|
"bin": "dist/service.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -0,0 +1,157 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import api from '@/api'
|
||||||
|
import { useToast } from 'vue-toast-notification'
|
||||||
|
|
||||||
|
// 定义事件
|
||||||
|
const emit = defineEmits(['done', 'close'])
|
||||||
|
|
||||||
|
// 提示框
|
||||||
|
const $toast = useToast()
|
||||||
|
|
||||||
|
// 是否加载中
|
||||||
|
const loading = ref(false)
|
||||||
|
|
||||||
|
// 用户认证表单
|
||||||
|
const authForm = ref<any>({
|
||||||
|
site: null,
|
||||||
|
params: {},
|
||||||
|
})
|
||||||
|
|
||||||
|
// 所有认证站点
|
||||||
|
const authSites = ref<{
|
||||||
|
[key: string]: {
|
||||||
|
name: string
|
||||||
|
icon: string
|
||||||
|
params: { [key: string]: any }
|
||||||
|
}
|
||||||
|
}>({})
|
||||||
|
|
||||||
|
// 生成站点拉选项
|
||||||
|
const dropdownItems = computed(() => {
|
||||||
|
return Object.keys(authSites.value).map(key => {
|
||||||
|
return {
|
||||||
|
key,
|
||||||
|
name: authSites.value[key].name,
|
||||||
|
prependAvatar: authSites.value[key].icon,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 读取authSites.params,生成表单配置列表
|
||||||
|
const formFields = computed(() => {
|
||||||
|
const site = authSites.value[authForm.value.site]
|
||||||
|
return Object.keys(site?.params || {})
|
||||||
|
.filter(item => {
|
||||||
|
return site.params[item].name && site.params[item].type
|
||||||
|
})
|
||||||
|
.map(key => {
|
||||||
|
return {
|
||||||
|
key,
|
||||||
|
site: authForm.value.site,
|
||||||
|
name: site.params[key].name,
|
||||||
|
type: site.params[key].type,
|
||||||
|
placeholder: site.params[key].placeholder,
|
||||||
|
tooltip: site.params[key].tooltip,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 查询之前使用的认证参数
|
||||||
|
async function loadLastAuthParams() {
|
||||||
|
try {
|
||||||
|
const result: { [key: string]: any } = await api.get(`system/setting/UserSiteAuthParams`)
|
||||||
|
if (result.success) {
|
||||||
|
authForm.value = result.data?.value || {}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载认证站点配置
|
||||||
|
async function loadAuthSites() {
|
||||||
|
try {
|
||||||
|
authSites.value = (await api.get(`site/auth`)) || {}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 完成
|
||||||
|
async function handleDone() {
|
||||||
|
await checkUser()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 认证处理
|
||||||
|
async function checkUser() {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const result: { [key: string]: any } = await api.post(`site/auth`, authForm.value)
|
||||||
|
if (result.success) {
|
||||||
|
$toast.success('用户认证成功,请重新登录!')
|
||||||
|
// 1秒后刷新页面
|
||||||
|
setTimeout(() => {
|
||||||
|
emit('done')
|
||||||
|
}, 1000)
|
||||||
|
} else {
|
||||||
|
$toast.error(`认证失败:${result.message}`)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
await loadAuthSites()
|
||||||
|
loadLastAuthParams()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<VDialog width="40rem" scrollable max-height="85vh">
|
||||||
|
<VCard title="用户认证" class="rounded-t">
|
||||||
|
<DialogCloseBtn @click="emit('close')" />
|
||||||
|
<VCardText>
|
||||||
|
<VRow>
|
||||||
|
<VCol cols="12">
|
||||||
|
<VSelect
|
||||||
|
v-model="authForm.site"
|
||||||
|
:items="dropdownItems"
|
||||||
|
item-value="key"
|
||||||
|
item-title="name"
|
||||||
|
label="选择认证站点"
|
||||||
|
item-props
|
||||||
|
>
|
||||||
|
</VSelect>
|
||||||
|
</VCol>
|
||||||
|
</VRow>
|
||||||
|
<VRow>
|
||||||
|
<VCol v-for="param in formFields" :key="param.key" cols="12" md="6">
|
||||||
|
<VTextField
|
||||||
|
v-model="authForm.params[param.site.toUpperCase() + '_' + param.key.toUpperCase()]"
|
||||||
|
:type="param.type"
|
||||||
|
:label="param.name"
|
||||||
|
:placeholder="param.placeholder"
|
||||||
|
:hint="param.tooltip"
|
||||||
|
clearable
|
||||||
|
persistent-hint
|
||||||
|
/>
|
||||||
|
</VCol>
|
||||||
|
</VRow>
|
||||||
|
</VCardText>
|
||||||
|
<VCardText class="text-center">
|
||||||
|
<VBtn
|
||||||
|
variant="elevated"
|
||||||
|
@click="handleDone"
|
||||||
|
prepend-icon="mdi-check"
|
||||||
|
class="px-5"
|
||||||
|
size="large"
|
||||||
|
:disabled="loading"
|
||||||
|
>
|
||||||
|
开始认证
|
||||||
|
</VBtn>
|
||||||
|
</VCardText>
|
||||||
|
</VCard>
|
||||||
|
</VDialog>
|
||||||
|
</template>
|
||||||
@@ -6,6 +6,7 @@ import router from '@/router'
|
|||||||
import avatar1 from '@images/avatars/avatar-1.png'
|
import avatar1 from '@images/avatars/avatar-1.png'
|
||||||
import api from '@/api'
|
import api from '@/api'
|
||||||
import ProgressDialog from '@/components/dialog/ProgressDialog.vue'
|
import ProgressDialog from '@/components/dialog/ProgressDialog.vue'
|
||||||
|
import UserAuthDialog from '@/components/dialog/UserAuthDialog.vue'
|
||||||
|
|
||||||
// Vuex Store
|
// Vuex Store
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
@@ -19,6 +20,9 @@ const $toast = useToast()
|
|||||||
// 进度框
|
// 进度框
|
||||||
const progressDialog = ref(false)
|
const progressDialog = ref(false)
|
||||||
|
|
||||||
|
// 站点认证对话框
|
||||||
|
const siteAuthDialog = ref(false)
|
||||||
|
|
||||||
// 执行注销操作
|
// 执行注销操作
|
||||||
function logout() {
|
function logout() {
|
||||||
// 清除登录状态信息
|
// 清除登录状态信息
|
||||||
@@ -56,10 +60,22 @@ async function restart() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 显示站点认证对话框
|
||||||
|
function showSiteAuthDialog() {
|
||||||
|
siteAuthDialog.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用户站点认证成功
|
||||||
|
function siteAuthDone() {
|
||||||
|
siteAuthDialog.value = false
|
||||||
|
logout()
|
||||||
|
}
|
||||||
|
|
||||||
// 从Vuex Store中获取信息
|
// 从Vuex Store中获取信息
|
||||||
const superUser = computed(() => store.state.auth.superUser)
|
const superUser = computed(() => store.state.auth.superUser)
|
||||||
const userName = computed(() => store.state.auth.userName)
|
const userName = computed(() => store.state.auth.userName)
|
||||||
const avatar = computed(() => store.state.auth.avatar || avatar1)
|
const avatar = computed(() => store.state.auth.avatar || avatar1)
|
||||||
|
const userLevel = computed(() => store.state.auth.level)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -94,6 +110,14 @@ const avatar = computed(() => store.state.auth.avatar || avatar1)
|
|||||||
<VListItemTitle>个人信息</VListItemTitle>
|
<VListItemTitle>个人信息</VListItemTitle>
|
||||||
</VListItem>
|
</VListItem>
|
||||||
|
|
||||||
|
<!-- 👉 Site Auth -->
|
||||||
|
<VListItem v-if="userLevel < 2" link @click="showSiteAuthDialog">
|
||||||
|
<template #prepend>
|
||||||
|
<VIcon class="me-2" icon="mdi-lock-check-outline" size="22" />
|
||||||
|
</template>
|
||||||
|
<VListItemTitle>用户认证</VListItemTitle>
|
||||||
|
</VListItem>
|
||||||
|
|
||||||
<!-- 👉 FAQ -->
|
<!-- 👉 FAQ -->
|
||||||
<VListItem href="https://wiki.movie-pilot.org" target="_blank">
|
<VListItem href="https://wiki.movie-pilot.org" target="_blank">
|
||||||
<template #prepend>
|
<template #prepend>
|
||||||
@@ -126,4 +150,6 @@ const avatar = computed(() => store.state.auth.avatar || avatar1)
|
|||||||
</VAvatar>
|
</VAvatar>
|
||||||
<!-- 重启进度框 -->
|
<!-- 重启进度框 -->
|
||||||
<ProgressDialog v-if="progressDialog" v-model="progressDialog" text="正在重启 ..." />
|
<ProgressDialog v-if="progressDialog" v-model="progressDialog" text="正在重启 ..." />
|
||||||
|
<!-- 用户认证对话框 -->
|
||||||
|
<UserAuthDialog v-if="siteAuthDialog" v-model="siteAuthDialog" @done="siteAuthDone" @close="siteAuthDialog = false" />
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
Reference in New Issue
Block a user