feat(user): add local avatar management flow

This commit is contained in:
kate522 committed 2026-07-29 13:35:17 +08:00
1 parent 1b4ba8938a
commit e94437ef60
20 files changed
+289 -186

No files matched your search

-25
View File
@@ -85,22 +85,6 @@
</n-form>
</n-card>
<!-- 4. 头像 -->
<n-card class="aksrt-section-card">
<div class="aksrt-section-header">
<span class="section-icon"><svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></svg></span>
<h3>Gravatar 头像源</h3>
</div>
<n-form :model="basic" label-placement="left" label-width="130" class="aksrt-form">
<n-form-item label="头像服务源">
<n-select v-model:value="basic.avatar_source" :options="avatarSourceOptions" placeholder="选择头像镜像源" />
<template #feedback>
<span class="aksrt-hint-text">国内站点建议优先选 Cravatar。</span>
</template>
</n-form-item>
</n-form>
</n-card>
<!-- 5. 备案 -->
<n-card class="aksrt-section-card">
<div class="aksrt-section-header">
@@ -140,7 +124,6 @@ const saving = ref(false)
const basic = reactive({
comment_enabled: true,
comment_requires_registration: false,
avatar_source: 'cn.cravatar.com',
icp_number: '',
police_number: '',
lazyload_enabled: true,
@@ -149,12 +132,6 @@ const basic = reactive({
comment_pagination_mode: 'numbered',
})
const avatarSourceOptions = [
{ label: 'Cravatar (国内推荐)', value: 'cn.cravatar.com' },
{ label: 'Gravatar 国内镜像', value: 'cn.gravatar.com' },
{ label: 'Gravatar 官方', value: 'gravatar.com' },
]
async function loadAll() {
loading.value = true
try {
@@ -163,7 +140,6 @@ async function loadAll() {
const d = basicRes.data
basic.comment_enabled = d.comment_enabled !== false
basic.comment_requires_registration = !!d.comment_requires_registration
basic.avatar_source = d.avatar_source || 'cn.cravatar.com'
basic.icp_number = d.icp_number || ''
basic.police_number = d.police_number || ''
basic.lazyload_enabled = d.lazyload_enabled !== false
@@ -184,7 +160,6 @@ async function handleSave() {
const basicPayload = {
comment_enabled: basic.comment_enabled,
comment_requires_registration: basic.comment_requires_registration,
avatar_source: basic.avatar_source,
icp_number: basic.icp_number,
police_number: basic.police_number,
lazyload_enabled: basic.lazyload_enabled,
@@ -40,7 +40,7 @@
<n-form-item label="允许用户上传头像">
<n-switch v-model:value="form.allow_avatar_upload" />
<template #feedback>
<span class="aksrt-hint-text">关闭后用户只能使用 Gravatar/Cravatar 自动头像。</span>
<span class="aksrt-hint-text">关闭后用户使用项目内置默认头像,且不能自行更换。</span>
</template>
</n-form-item>
@@ -65,13 +65,6 @@
<h3>公开资料编辑位</h3>
</div>
<n-form :model="form" label-placement="left" label-width="170" class="aksrt-form">
<n-form-item label="头像编辑入口">
<n-switch v-model:value="form.user_avatar_upload" />
<template #feedback>
<span class="aksrt-hint-text">开启后,用户中心会显示跳转到 WordPress 原生资料页的头像修改入口。</span>
</template>
</n-form-item>
<n-form-item label="背景图编辑位">
<n-switch v-model:value="form.user_cover_upload" />
<template #feedback>
@@ -121,7 +114,6 @@ const homeSummary = reactive({
const form = reactive({
dynamicTabs: ['posts', 'comments', 'favorites'],
user_avatar_upload: true,
user_cover_upload: true,
user_social_links: true,
})
@@ -160,7 +152,6 @@ async function load() {
const permissionData = extractData(permissionRes)
form.dynamicTabs = parseTabs(featureData.user_center_tabs || 'profile,posts,comments,favorites')
form.user_avatar_upload = featureData.user_avatar_upload !== false
form.user_cover_upload = featureData.user_cover_upload !== false
form.user_social_links = featureData.user_social_links !== false
@@ -179,7 +170,6 @@ async function handleSave() {
try {
await api.saveSchemaPage('users', 'features', {
user_center_tabs: ['profile', ...form.dynamicTabs].join(','),
user_avatar_upload: form.user_avatar_upload,
user_cover_upload: form.user_cover_upload,
user_social_links: form.user_social_links,
})