From 66be7a3ba0b56ec462a30acfc62dec9cd021e59b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E7=90=A6?= Date: Tue, 14 Jul 2026 14:27:53 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9B=B4=E5=A4=9A=E5=8F=AF?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=9A=84=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/components/Header.vue | 22 +-- client/src/components/MobileMenu.vue | 9 +- client/src/components/ThemeToggle.vue | 81 ++++++++++ client/src/components/admin/AdminLayout.vue | 5 +- .../components/admin/ChangePasswordModal.vue | 146 ++++++++++++++++++ client/src/pages/admin/Profile.vue | 40 +---- 6 files changed, 237 insertions(+), 66 deletions(-) create mode 100644 client/src/components/ThemeToggle.vue create mode 100644 client/src/components/admin/ChangePasswordModal.vue diff --git a/client/src/components/Header.vue b/client/src/components/Header.vue index fc31559..491728c 100644 --- a/client/src/components/Header.vue +++ b/client/src/components/Header.vue @@ -70,15 +70,7 @@ @@ -124,6 +125,7 @@ import { useRouter, useRoute } from 'vue-router' import { useToast } from '../../composables/useToast' import { useAuth } from '../../composables/useAuth' import SessionExpiredModal from './SessionExpiredModal.vue' +import ChangePasswordModal from './ChangePasswordModal.vue' import AdminMenuItem from './AdminMenuItem.vue' import { getCurrentUser } from '../../services/api' import { openActiveMenuAncestors, findRouteTitle, type MenuItem } from './adminMenuTypes' @@ -137,6 +139,7 @@ const currentUser = ref(getUser()) // Dropdown logic const isUserDropdownOpen = ref(false) +const showChangePassword = ref(false) const dropdownRef = ref(null) const toggleUserDropdown = () => { @@ -155,7 +158,7 @@ const goToProfile = () => { } const goToProfilePassword = () => { - router.push({ path: '/admin/profile', hash: '#password' }) + showChangePassword.value = true isUserDropdownOpen.value = false } diff --git a/client/src/components/admin/ChangePasswordModal.vue b/client/src/components/admin/ChangePasswordModal.vue new file mode 100644 index 0000000..8977e03 --- /dev/null +++ b/client/src/components/admin/ChangePasswordModal.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/client/src/pages/admin/Profile.vue b/client/src/pages/admin/Profile.vue index 2397176..518ed80 100644 --- a/client/src/pages/admin/Profile.vue +++ b/client/src/pages/admin/Profile.vue @@ -65,24 +65,6 @@ - - -
-

修改密码

-
-
- - -
-
- - -
- -
-
@@ -91,7 +73,7 @@ import { reactive, ref, onMounted } from 'vue' import { useToast } from '../../composables/useToast' import { useAuth } from '../../composables/useAuth' import { useUserProfileModal } from '../../composables/useUserProfileModal' -import { getCurrentUser, updateCurrentUser, updateCurrentUserPassword } from '../../services/api' +import { getCurrentUser, updateCurrentUser } from '../../services/api' import ImagePicker from '../../components/admin/ImagePicker.vue' import EmailAutocomplete from '../../components/ui/EmailAutocomplete.vue' @@ -100,7 +82,6 @@ const { setUser, getUser } = useAuth() const { openUserProfile } = useUserProfileModal() const saving = ref(false) -const changingPassword = ref(false) const userId = ref(null) const form = reactive({ @@ -113,11 +94,6 @@ const form = reactive({ wechatQrcode: '', }) -const passwordForm = reactive({ - oldPassword: '', - newPassword: '', -}) - const loadProfile = async () => { try { const user = await getCurrentUser() @@ -156,20 +132,6 @@ const handleSaveProfile = async () => { } } -const handleChangePassword = async () => { - changingPassword.value = true - try { - await updateCurrentUserPassword(passwordForm.oldPassword, passwordForm.newPassword) - passwordForm.oldPassword = '' - passwordForm.newPassword = '' - toast.success('密码已更新') - } catch (e: unknown) { - toast.error(e instanceof Error ? e.message : '密码更新失败') - } finally { - changingPassword.value = false - } -} - const openPreview = () => { const id = userId.value || getUser()?.id if (id) openUserProfile(id)