index.vue 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <script setup lang="ts">
  2. import type { FormInstance, FormRules } from 'element-plus'
  3. import { ElMessage } from 'element-plus'
  4. defineOptions({
  5. name: 'ResetPasswordForm',
  6. })
  7. const props = defineProps<{
  8. userName?: string
  9. }>()
  10. const emits = defineEmits<{
  11. onLogin: [userName: string]
  12. onResetPassword: [userName: string]
  13. }>()
  14. const loading = ref(false)
  15. const formRef = useTemplateRef<FormInstance>('formRef')
  16. const form = ref({
  17. userName: props.userName ?? localStorage.login_account ?? '',
  18. captcha: '',
  19. newPassword: '',
  20. })
  21. const rules = ref<FormRules>({
  22. userName: [
  23. { required: true, trigger: 'blur', message: '请输入用户名' },
  24. ],
  25. captcha: [
  26. { required: true, trigger: 'blur', message: '请输入验证码' },
  27. ],
  28. newPassword: [
  29. { required: true, trigger: 'blur', message: '请输入新密码' },
  30. { min: 6, max: 18, trigger: 'blur', message: '密码长度为6到18位' },
  31. ],
  32. })
  33. function handleReset() {
  34. ElMessage({
  35. message: '重置密码仅提供界面演示,无实际功能,需开发者自行扩展',
  36. type: 'info',
  37. })
  38. formRef.value?.validate((valid) => {
  39. if (valid) {
  40. // 这里编写业务代码
  41. emits('onResetPassword', form.value.userName)
  42. }
  43. })
  44. }
  45. </script>
  46. <template>
  47. <ElForm ref="formRef" :model="form" :rules="rules" class="min-h-500px w-full flex-col-stretch-center p-12">
  48. <h3 class="mb-8 text-xl color-[var(--el-text-color-primary)] font-bold">
  49. 忘记密码了? 🔒
  50. </h3>
  51. <div>
  52. <ElFormItem prop="userName">
  53. <ElInput v-model="form.userName" size="large" placeholder="用户名" type="text" tabindex="1">
  54. <template #prefix>
  55. <SvgIcon name="i-ri:user-3-fill" />
  56. </template>
  57. </ElInput>
  58. </ElFormItem>
  59. <ElFormItem prop="captcha">
  60. <ElInput v-model="form.captcha" size="large" placeholder="验证码" type="text" tabindex="2">
  61. <template #prefix>
  62. <SvgIcon name="i-ic:baseline-verified-user" />
  63. </template>
  64. <template #append>
  65. <ElButton>发送验证码</ElButton>
  66. </template>
  67. </ElInput>
  68. </ElFormItem>
  69. <ElFormItem prop="newPassword">
  70. <ElInput v-model="form.newPassword" type="password" size="large" placeholder="新密码" tabindex="3" show-password>
  71. <template #prefix>
  72. <SvgIcon name="i-ri:lock-2-fill" />
  73. </template>
  74. </ElInput>
  75. </ElFormItem>
  76. </div>
  77. <ElButton :loading="loading" type="primary" size="large" style="width: 100%; margin-top: 20px;" @click.prevent="handleReset">
  78. 确认
  79. </ElButton>
  80. <div class="mt-4 flex-center gap-2 text-sm color-[var(--el-text-color-secondary)]">
  81. <ElLink type="primary" :underline="false" @click="emits('onLogin', form.userName)">
  82. 去登录
  83. </ElLink>
  84. </div>
  85. </ElForm>
  86. </template>