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