parent
e13486812c
commit
22065758d4
@ -0,0 +1,410 @@
|
|||||||
|
<template>
|
||||||
|
<div class="settings-view">
|
||||||
|
<div class="page-header">
|
||||||
|
<h1>设置</h1>
|
||||||
|
<p>管理你的账户偏好和应用设置</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings-content">
|
||||||
|
<!-- 通知设置 -->
|
||||||
|
<el-card class="settings-card" shadow="hover">
|
||||||
|
<template #header>
|
||||||
|
<h3>通知设置</h3>
|
||||||
|
</template>
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">邮件通知</div>
|
||||||
|
<div class="setting-desc">接收新评论和点赞的邮件通知</div>
|
||||||
|
</div>
|
||||||
|
<el-switch v-model="notificationSettings.email" />
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">浏览器通知</div>
|
||||||
|
<div class="setting-desc">在浏览器中显示实时通知</div>
|
||||||
|
</div>
|
||||||
|
<el-switch v-model="notificationSettings.browser" />
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">私信通知</div>
|
||||||
|
<div class="setting-desc">接收新私信的通知</div>
|
||||||
|
</div>
|
||||||
|
<el-switch v-model="notificationSettings.message" />
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<!-- 隐私设置 -->
|
||||||
|
<el-card class="settings-card" shadow="hover">
|
||||||
|
<template #header>
|
||||||
|
<h3>隐私设置</h3>
|
||||||
|
</template>
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">个人资料可见性</div>
|
||||||
|
<div class="setting-desc">其他用户是否可以查看你的个人资料</div>
|
||||||
|
</div>
|
||||||
|
<el-select v-model="privacySettings.profileVisibility" style="width: 140px;">
|
||||||
|
<el-option label="公开" value="public" />
|
||||||
|
<el-option label="仅好友" value="friends" />
|
||||||
|
<el-option label="私密" value="private" />
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">在线状态</div>
|
||||||
|
<div class="setting-desc">是否显示你的在线状态</div>
|
||||||
|
</div>
|
||||||
|
<el-switch v-model="privacySettings.showOnlineStatus" />
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">活动历史</div>
|
||||||
|
<div class="setting-desc">是否保存你的活动历史记录</div>
|
||||||
|
</div>
|
||||||
|
<el-switch v-model="privacySettings.saveActivityHistory" />
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<!-- 界面设置 -->
|
||||||
|
<el-card class="settings-card" shadow="hover">
|
||||||
|
<template #header>
|
||||||
|
<h3>界面设置</h3>
|
||||||
|
</template>
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">主题模式</div>
|
||||||
|
<div class="setting-desc">选择你喜欢的界面主题</div>
|
||||||
|
</div>
|
||||||
|
<el-select v-model="interfaceSettings.theme" style="width: 120px;">
|
||||||
|
<el-option label="自动" value="auto" />
|
||||||
|
<el-option label="浅色" value="light" />
|
||||||
|
<el-option label="深色" value="dark" />
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">语言</div>
|
||||||
|
<div class="setting-desc">选择界面显示语言</div>
|
||||||
|
</div>
|
||||||
|
<el-select v-model="interfaceSettings.language" style="width: 120px;">
|
||||||
|
<el-option label="中文" value="zh-CN" />
|
||||||
|
<el-option label="English" value="en-US" />
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">页面大小</div>
|
||||||
|
<div class="setting-desc">每页显示的内容数量</div>
|
||||||
|
</div>
|
||||||
|
<el-select v-model="interfaceSettings.pageSize" style="width: 100px;">
|
||||||
|
<el-option label="10" :value="10" />
|
||||||
|
<el-option label="20" :value="20" />
|
||||||
|
<el-option label="50" :value="50" />
|
||||||
|
</el-select>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<!-- 账户安全 -->
|
||||||
|
<el-card class="settings-card" shadow="hover">
|
||||||
|
<template #header>
|
||||||
|
<h3>账户安全</h3>
|
||||||
|
</template>
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">两步验证</div>
|
||||||
|
<div class="setting-desc">为你的账户添加额外的安全保护</div>
|
||||||
|
</div>
|
||||||
|
<el-button size="small" @click="setupTwoFactor">
|
||||||
|
{{ securitySettings.twoFactorEnabled ? '已启用' : '启用' }}
|
||||||
|
</el-button>
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">登录通知</div>
|
||||||
|
<div class="setting-desc">新设备登录时发送通知</div>
|
||||||
|
</div>
|
||||||
|
<el-switch v-model="securitySettings.loginNotification" />
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">会话管理</div>
|
||||||
|
<div class="setting-desc">查看和管理你的登录会话</div>
|
||||||
|
</div>
|
||||||
|
<el-button size="small" @click="manageSessions">管理会话</el-button>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
|
||||||
|
<!-- 数据管理 -->
|
||||||
|
<el-card class="settings-card" shadow="hover">
|
||||||
|
<template #header>
|
||||||
|
<h3>数据管理</h3>
|
||||||
|
</template>
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">数据导出</div>
|
||||||
|
<div class="setting-desc">下载你的所有数据</div>
|
||||||
|
</div>
|
||||||
|
<el-button size="small" @click="exportData">导出数据</el-button>
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">清除缓存</div>
|
||||||
|
<div class="setting-desc">清除本地缓存数据</div>
|
||||||
|
</div>
|
||||||
|
<el-button size="small" @click="clearCache">清除缓存</el-button>
|
||||||
|
</div>
|
||||||
|
<el-divider />
|
||||||
|
<div class="setting-item danger">
|
||||||
|
<div class="setting-info">
|
||||||
|
<div class="setting-title">删除账户</div>
|
||||||
|
<div class="setting-desc">永久删除你的账户和所有数据</div>
|
||||||
|
</div>
|
||||||
|
<el-button size="small" type="danger" @click="deleteAccount">删除账户</el-button>
|
||||||
|
</div>
|
||||||
|
</el-card>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 保存按钮 -->
|
||||||
|
<div class="save-actions">
|
||||||
|
<el-button @click="resetSettings">重置</el-button>
|
||||||
|
<el-button type="primary" @click="saveSettings" :loading="saving">保存设置</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, onMounted } from 'vue';
|
||||||
|
import { ElMessage, ElMessageBox, ElCard, ElSwitch, ElSelect, ElOption, ElButton, ElDivider } from 'element-plus';
|
||||||
|
|
||||||
|
// 设置数据
|
||||||
|
const notificationSettings = ref({
|
||||||
|
email: true,
|
||||||
|
browser: false,
|
||||||
|
message: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const privacySettings = ref({
|
||||||
|
profileVisibility: 'public',
|
||||||
|
showOnlineStatus: true,
|
||||||
|
saveActivityHistory: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const interfaceSettings = ref({
|
||||||
|
theme: 'auto',
|
||||||
|
language: 'zh-CN',
|
||||||
|
pageSize: 20
|
||||||
|
});
|
||||||
|
|
||||||
|
const securitySettings = ref({
|
||||||
|
twoFactorEnabled: false,
|
||||||
|
loginNotification: true
|
||||||
|
});
|
||||||
|
|
||||||
|
const saving = ref(false);
|
||||||
|
|
||||||
|
// 保存设置
|
||||||
|
const saveSettings = async () => {
|
||||||
|
saving.value = true;
|
||||||
|
try {
|
||||||
|
// 模拟API调用
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||||
|
|
||||||
|
// 这里应该调用真实的API来保存设置
|
||||||
|
// await settingsApi.saveSettings({
|
||||||
|
// notification: notificationSettings.value,
|
||||||
|
// privacy: privacySettings.value,
|
||||||
|
// interface: interfaceSettings.value,
|
||||||
|
// security: securitySettings.value
|
||||||
|
// });
|
||||||
|
|
||||||
|
ElMessage.success('设置保存成功');
|
||||||
|
} catch (error) {
|
||||||
|
ElMessage.error('设置保存失败');
|
||||||
|
} finally {
|
||||||
|
saving.value = false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 重置设置
|
||||||
|
const resetSettings = () => {
|
||||||
|
notificationSettings.value = {
|
||||||
|
email: true,
|
||||||
|
browser: false,
|
||||||
|
message: true
|
||||||
|
};
|
||||||
|
|
||||||
|
privacySettings.value = {
|
||||||
|
profileVisibility: 'public',
|
||||||
|
showOnlineStatus: true,
|
||||||
|
saveActivityHistory: true
|
||||||
|
};
|
||||||
|
|
||||||
|
interfaceSettings.value = {
|
||||||
|
theme: 'auto',
|
||||||
|
language: 'zh-CN',
|
||||||
|
pageSize: 20
|
||||||
|
};
|
||||||
|
|
||||||
|
securitySettings.value = {
|
||||||
|
twoFactorEnabled: false,
|
||||||
|
loginNotification: true
|
||||||
|
};
|
||||||
|
|
||||||
|
ElMessage.success('设置已重置');
|
||||||
|
};
|
||||||
|
|
||||||
|
// 启用两步验证
|
||||||
|
const setupTwoFactor = () => {
|
||||||
|
ElMessage.info('两步验证功能开发中');
|
||||||
|
};
|
||||||
|
|
||||||
|
// 管理会话
|
||||||
|
const manageSessions = () => {
|
||||||
|
ElMessage.info('会话管理功能开发中');
|
||||||
|
};
|
||||||
|
|
||||||
|
// 导出数据
|
||||||
|
const exportData = () => {
|
||||||
|
ElMessage.info('数据导出功能开发中');
|
||||||
|
};
|
||||||
|
|
||||||
|
// 清除缓存
|
||||||
|
const clearCache = () => {
|
||||||
|
localStorage.clear();
|
||||||
|
sessionStorage.clear();
|
||||||
|
ElMessage.success('缓存已清除');
|
||||||
|
};
|
||||||
|
|
||||||
|
// 删除账户
|
||||||
|
const deleteAccount = async () => {
|
||||||
|
try {
|
||||||
|
await ElMessageBox.confirm(
|
||||||
|
'确定要删除账户吗?此操作不可逆,所有数据将永久丢失。',
|
||||||
|
'删除账户',
|
||||||
|
{
|
||||||
|
confirmButtonText: '确定删除',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'error'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
ElMessage.info('账户删除功能开发中');
|
||||||
|
} catch {
|
||||||
|
// 用户取消
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
// 这里可以加载用户的设置数据
|
||||||
|
// loadUserSettings();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.settings-view {
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-header {
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-header h1 {
|
||||||
|
font-size: 28px;
|
||||||
|
color: var(--el-text-color-primary);
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.page-header p {
|
||||||
|
color: var(--el-text-color-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-card {
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-card :deep(.el-card__header) {
|
||||||
|
padding: 18px 20px;
|
||||||
|
border-bottom: 1px solid var(--el-border-color-lighter);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-card h3 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 18px;
|
||||||
|
color: var(--el-text-color-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-item {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 16px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-item.danger {
|
||||||
|
border-left: 3px solid var(--el-color-danger);
|
||||||
|
padding-left: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-info {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-title {
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--el-text-color-primary);
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-desc {
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--el-text-color-secondary);
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.save-actions {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 12px;
|
||||||
|
margin-top: 40px;
|
||||||
|
padding-top: 20px;
|
||||||
|
border-top: 1px solid var(--el-border-color-lighter);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 响应式设计 */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.settings-view {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.setting-item {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.save-actions {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in new issue