Spaces:
Sleeping
Sleeping
<template> | |
<div class="settings-page"> | |
<!-- 项目配置卡片 --> | |
<el-card v-if="settingStore.globalSetting" class="settings-card network-card"> | |
<template #header> | |
<div class="card-header"> | |
<el-icon><Connection /></el-icon> | |
<h2>项目配置</h2> | |
</div> | |
</template> | |
<div class="settings-section"> | |
<!-- 代理配置组 --> | |
<div class="settings-group"> | |
<div class="group-header"> | |
<h3>代理设置</h3> | |
<el-switch | |
v-model="localGlobalSetting.isProxyEnabled" | |
active-text="已启用" | |
@change="handleProxyChange" | |
/> | |
</div> | |
<div class="form-row"> | |
<div class="form-item"> | |
<label for="proxyDomain">代理服务器IP</label> | |
<el-input | |
id="proxyDomain" | |
v-model="localGlobalSetting.httpProxyHost" | |
placeholder="127.0.0.1" | |
:disabled="!localGlobalSetting.isProxyEnabled" | |
@input="handleProxyHostChange" | |
> | |
<template #prefix> | |
<el-icon><Monitor /></el-icon> | |
</template> | |
</el-input> | |
</div> | |
<div class="form-item"> | |
<label for="proxyPort">代理端口</label> | |
<el-input | |
id="proxyPort" | |
v-model="localGlobalSetting.httpProxyPort" | |
placeholder="7890" | |
:disabled="!localGlobalSetting.isProxyEnabled" | |
> | |
<template #prefix> | |
<el-icon><Position /></el-icon> | |
</template> | |
</el-input> | |
</div> | |
</div> | |
</div> | |
<!-- 注册码配置组 --> | |
<div class="settings-group"> | |
<h3>注册码设置</h3> | |
<div class="form-row"> | |
<div class="form-item"> | |
<label for="AdminUserCode">管理员注册码</label> | |
<el-input-number | |
id="AdminUserCode" | |
v-model="localGlobalSetting.AdminUserCode" | |
:controls="false" | |
:precision="0" | |
placeholder="设置管理员注册码" | |
> | |
<template #prefix> | |
<el-icon><Key /></el-icon> | |
</template> | |
</el-input-number> | |
</div> | |
<div class="form-item"> | |
<label for="CommonUserCode">普通用户注册码</label> | |
<el-input-number | |
id="CommonUserCode" | |
v-model="localGlobalSetting.CommonUserCode" | |
:controls="false" | |
:precision="0" | |
placeholder="设置普通用户注册码" | |
> | |
<template #prefix> | |
<el-icon><Key /></el-icon> | |
</template> | |
</el-input-number> | |
</div> | |
</div> | |
</div> | |
</div> | |
</el-card> | |
<!-- 用户配置卡片 --> | |
<el-card class="settings-card user-card"> | |
<template #header> | |
<div class="card-header"> | |
<el-icon><User /></el-icon> | |
<h2>用户配置</h2> | |
</div> | |
</template> | |
<div class="settings-section"> | |
<div class="settings-group"> | |
<h3>网盘授权</h3> | |
<div class="form-row"> | |
<div class="form-item full-width"> | |
<label for="cookie115">115网盘 Cookie</label> | |
<el-input | |
id="cookie115" | |
v-model="localUserSettings.cloud115Cookie" | |
type="password" | |
show-password | |
placeholder="请输入115网盘Cookie" | |
> | |
<template #prefix> | |
<el-icon><Lock /></el-icon> | |
</template> | |
</el-input> | |
</div> | |
</div> | |
<div class="form-row"> | |
<div class="form-item full-width"> | |
<label for="cookieQuark">夸克网盘 Cookie</label> | |
<el-input | |
id="cookieQuark" | |
v-model="localUserSettings.quarkCookie" | |
type="password" | |
show-password | |
placeholder="请输入夸克网盘Cookie" | |
> | |
<template #prefix> | |
<el-icon><Lock /></el-icon> | |
</template> | |
</el-input> | |
</div> | |
</div> | |
</div> | |
<!-- 帮助链接 --> | |
<div class="settings-help"> | |
<h3>帮助文档</h3> | |
<div class="help-links"> | |
<el-link | |
href="https://www.yuque.com/xiaoruihenbangde/ggogn3/ga6gaaiy5fsyw62l?singleDoc=true" | |
target="_blank" | |
type="primary" | |
> | |
<el-icon><QuestionFilled /></el-icon> | |
CloudSaver部署与使用常见问题 | |
</el-link> | |
<el-link | |
href="https://www.yuque.com/xiaoruihenbangde/ggogn3/cl2g0p9h3xrgfa5i" | |
target="_blank" | |
type="primary" | |
> | |
<el-icon><QuestionFilled /></el-icon> | |
CloudSaver功能介绍 | |
</el-link> | |
<el-link | |
href="https://alist.nn.ci/zh/guide/drivers/115.html#cookie获取方式" | |
target="_blank" | |
type="primary" | |
> | |
<el-icon><QuestionFilled /></el-icon> | |
如何获取115网盘Cookie? | |
</el-link> | |
<el-link | |
href="https://alist.nn.ci/zh/guide/drivers/quark.html#cookie" | |
target="_blank" | |
type="primary" | |
> | |
<el-icon><QuestionFilled /></el-icon> | |
如何获取夸克网盘Cookie? | |
</el-link> | |
</div> | |
</div> | |
</div> | |
</el-card> | |
<!-- 保存按钮 --> | |
<div class="settings-actions"> | |
<el-button type="primary" @click="handleSave"> 保存设置 </el-button> | |
</div> | |
</div> | |
</template> | |
<script setup lang="ts"> | |
import { useUserSettingStore } from "@/stores/userSetting"; | |
import { ref, watch } from "vue"; | |
import { ElMessage } from "element-plus"; | |
import type { GlobalSettingAttributes, UserSettingAttributes } from "@/types/user"; | |
import { | |
Connection, | |
Monitor, | |
Position, | |
Key, | |
User, | |
Lock, | |
QuestionFilled, | |
} from "@element-plus/icons-vue"; | |
const settingStore = useUserSettingStore(); | |
// 本地状态 | |
const localGlobalSetting = ref<GlobalSettingAttributes>({ | |
httpProxyHost: "127.0.0.1", | |
httpProxyPort: "7890", | |
isProxyEnabled: false, | |
AdminUserCode: 230713, | |
CommonUserCode: 9527, | |
}); | |
const localUserSettings = ref<UserSettingAttributes>({ | |
cloud115Cookie: "", | |
quarkCookie: "", | |
}); | |
// 监听 store 变化,更新本地状态 | |
watch( | |
() => settingStore.globalSetting, | |
(newVal) => { | |
if (newVal) { | |
localGlobalSetting.value = { ...newVal }; | |
} | |
}, | |
{ immediate: true } | |
); | |
watch( | |
() => settingStore.userSettings, | |
(newVal) => { | |
if (newVal) { | |
localUserSettings.value = { ...newVal }; | |
} | |
}, | |
{ immediate: true } | |
); | |
// 初始化获取设置 | |
settingStore.getSettings(); | |
// 处理代理开关变化并立即保存 | |
const handleProxyChange = async (val: boolean) => { | |
try { | |
localGlobalSetting.value.isProxyEnabled = val; | |
await settingStore.saveSettings({ | |
globalSetting: localGlobalSetting.value, | |
userSettings: localUserSettings.value, | |
}); | |
ElMessage.success("设置保存成功"); | |
} catch (error) { | |
// 保存失败时恢复开关状态 | |
ElMessage.error("设置保存失败"); | |
localGlobalSetting.value.isProxyEnabled = !val; | |
} | |
}; | |
// 处理代理地址,去除协议前缀 | |
const handleProxyHostChange = (val: string) => { | |
// 移除 http:// 或 https:// 前缀 | |
const cleanHost = val.replace(/^(https?:\/\/)/i, ""); | |
// 更新状态 | |
localGlobalSetting.value.httpProxyHost = cleanHost; | |
}; | |
// 其他设置的保存 | |
const handleSave = async () => { | |
try { | |
await settingStore.saveSettings({ | |
globalSetting: localGlobalSetting.value, | |
userSettings: localUserSettings.value, | |
}); | |
ElMessage.success("设置保存成功"); | |
} catch (error) { | |
console.error("保存设置失败:", error); | |
} | |
}; | |
</script> | |
<style lang="scss" scoped> | |
@import "@/styles/common.scss"; | |
.settings-page { | |
// max-width: 1000px; | |
margin: 0; | |
padding-bottom: 40px; | |
} | |
.settings-card { | |
margin-bottom: 24px; | |
border-radius: var(--theme-radius); | |
transition: var(--theme-transition); | |
border: 1px solid rgba(0, 0, 0, 0.08); | |
&:hover { | |
box-shadow: var(--theme-shadow); | |
} | |
:deep(.el-card__header) { | |
padding: 16px 20px; | |
border-bottom: 1px solid rgba(0, 0, 0, 0.06); | |
} | |
} | |
.card-header { | |
@include flex-center; | |
gap: 12px; | |
.el-icon { | |
font-size: 20px; | |
color: var(--theme-primary); | |
} | |
h2 { | |
margin: 0; | |
font-size: 16px; | |
font-weight: 600; | |
color: var(--theme-text-primary); | |
} | |
} | |
.settings-section { | |
padding: 20px; | |
} | |
.settings-group { | |
margin-bottom: 32px; | |
&:last-child { | |
margin-bottom: 0; | |
} | |
h3 { | |
margin: 0 0 16px; | |
font-size: 14px; | |
font-weight: 600; | |
color: var(--theme-text-regular); | |
} | |
.group-header { | |
@include flex-center; | |
justify-content: space-between; | |
margin-bottom: 16px; | |
h3 { | |
margin: 0; | |
} | |
} | |
} | |
.form-row { | |
display: flex; | |
gap: 24px; | |
margin-bottom: 16px; | |
&:last-child { | |
margin-bottom: 0; | |
} | |
} | |
.form-item { | |
flex: 1; | |
min-width: 0; | |
&.full-width { | |
width: 100%; | |
} | |
label { | |
display: block; | |
margin-bottom: 8px; | |
font-size: 13px; | |
color: var(--theme-text-secondary); | |
} | |
:deep(.el-input), | |
:deep(.el-input-number) { | |
width: 100%; | |
.el-input__wrapper { | |
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1); | |
transition: var(--theme-transition); | |
&:hover { | |
box-shadow: 0 0 0 1px var(--theme-primary); | |
} | |
&.is-focus { | |
box-shadow: | |
0 0 0 1px var(--theme-primary), | |
0 0 0 3px rgba(0, 102, 204, 0.1); | |
} | |
} | |
.el-input__prefix-inner { | |
.el-icon { | |
margin-right: 8px; | |
color: var(--theme-text-secondary); | |
} | |
} | |
} | |
} | |
.settings-help { | |
padding-top: 24px; | |
margin-top: 24px; | |
border-top: 1px solid rgba(0, 0, 0, 0.06); | |
.help-links { | |
display: flex; | |
flex-direction: column; | |
align-items: flex-start; | |
gap: 12px; | |
margin-top: 16px; | |
} | |
:deep(.el-link) { | |
display: flex; | |
align-items: center; | |
gap: 8px; | |
font-size: 14px; | |
.el-icon { | |
font-size: 16px; | |
} | |
&:hover { | |
transform: translateX(4px); | |
} | |
} | |
} | |
.settings-actions { | |
display: flex; | |
justify-content: flex-end; | |
margin-top: 24px; | |
.el-button { | |
min-width: 120px; | |
height: 40px; | |
border-radius: 20px; | |
font-size: 14px; | |
transition: var(--theme-transition); | |
.el-icon { | |
margin-right: 6px; | |
font-size: 16px; | |
} | |
&:hover { | |
transform: translateY(-2px); | |
box-shadow: var(--theme-shadow-sm); | |
} | |
} | |
} | |
</style> | |