PasswordSettingPage.vue 3.33 KB
<!--
 * @Date: 2025-03-24 13:04:21
 * @LastEditors: hookehuyr hookehuyr@gmail.com
 * @LastEditTime: 2025-03-26 00:49:20
 * @FilePath: /mlaj/src/views/profile/settings/PasswordSettingPage.vue
 * @Description: 修改密码页面
-->
<template>
  <AppLayout title="">
    <div class="bg-gradient-to-br from-green-50 via-green-100/30 to-blue-50/30 min-h-screen">
      <div class="px-4 py-6">
        <FrostedGlass class="rounded-xl overflow-hidden">
          <div class="p-4">
            <van-form @submit="handlePasswordChange">
              <van-cell-group inset>
                <van-field
                  v-model="oldPassword"
                  type="password"
                  name="oldPassword"
                  label="原密码"
                  placeholder="请输入原密码"
                  :rules="[{ required: true, message: '请输入原密码' }, { min: 6, message: '密码长度至少6位' }]"
                />
                <van-field
                  v-model="newPassword"
                  type="password"
                  name="newPassword"
                  label="新密码"
                  placeholder="请输入新密码"
                  :rules="[{ required: true, message: '请输入新密码' }, { min: 6, message: '密码长度至少6位' }]"
                />
                <van-field
                  v-model="confirmPassword"
                  type="password"
                  name="confirmPassword"
                  label="确认新密码"
                  placeholder="请确认新密码"
                  :rules="[{ required: true, message: '请确认新密码' }, { validator: validateConfirmPassword, message: '两次输入的密码不一致' }]"
                />
              </van-cell-group>
              <div style="margin: 16px;">
                <van-button
                  native-type="submit"
                  type="primary"
                  block
                  round
                  :loading="loading"
                  class="bg-green-500 hover:bg-green-600 transition-colors"
                >
                  保存修改
                </van-button>
              </div>
            </van-form>
          </div>
        </FrostedGlass>
      </div>
    </div>
  </AppLayout>
</template>

<script setup>
import { ref } from 'vue';
import AppLayout from '@/components/layout/AppLayout.vue';
import FrostedGlass from '@/components/ui/FrostedGlass.vue';
import { resetPasswordAPI } from '@/api/users';

import { useTitle } from '@vueuse/core';

const $route = useRoute();
useTitle($route.meta.title);

// 密码
const oldPassword = ref('');
const newPassword = ref('');
const confirmPassword = ref('');
const loading = ref(false);

// 确认密码验证
const validateConfirmPassword = (val) => val === newPassword.value;

// 处理密码修改
const handlePasswordChange = async () => {
  loading.value = true;
  try {
    const response = await resetPasswordAPI({
      oldPassword: oldPassword.value,
      newPassword: newPassword.value
    });

    if (response.data) {
      // 清空输入框
      oldPassword.value = '';
      newPassword.value = '';
      confirmPassword.value = '';
      showSuccessToast('密码修改成功');
    }
  } catch (error) {
    console.error('密码修改失败:', error);
    showFailToast('密码修改失败,请重试');
  } finally {
    loading.value = false;
  }
};
</script>