RegisterForm.vue 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <el-form
  3. ref="formRef"
  4. :show-label="false"
  5. :show-require-mark="false"
  6. size="large"
  7. :model="formInline"
  8. :rules="rules"
  9. >
  10. <el-form-item prop="username">
  11. <el-input v-model="formInline.username" placeholder="请输入用户名">
  12. <template #prefix>
  13. <el-icon class="el-input__icon" size="18" color="#808695">
  14. <PersonOutline />
  15. </el-icon>
  16. </template>
  17. </el-input>
  18. </el-form-item>
  19. <el-form-item prop="mobile">
  20. <div class="flex w-full">
  21. <el-input class="order-first" v-model="formInline.mobile" placeholder="请输入手机号码">
  22. <template #prefix>
  23. <el-icon class="el-input__icon" size="18" color="#808695">
  24. <MobileOutlined />
  25. </el-icon>
  26. </template>
  27. </el-input>
  28. <el-button class="order-last ml-3" :disabled="isGetCode" @click="getCode"
  29. >{{ codeMsg }}<span v-if="isGetCode">s</span>
  30. </el-button>
  31. </div>
  32. </el-form-item>
  33. <el-form-item prop="code">
  34. <el-input v-model="formInline.code" placeholder="请输入验证码">
  35. <template #prefix>
  36. <el-icon class="el-input__icon" size="18" color="#808695">
  37. <SafetyOutlined />
  38. </el-icon>
  39. </template>
  40. </el-input>
  41. </el-form-item>
  42. <el-form-item prop="password">
  43. <el-input
  44. v-model="formInline.password"
  45. type="password"
  46. show-password
  47. placeholder="请输入密码"
  48. >
  49. <template #prefix>
  50. <el-icon class="el-input__icon" size="18" color="#808695">
  51. <LockClosedOutline />
  52. </el-icon>
  53. </template>
  54. </el-input>
  55. </el-form-item>
  56. <el-form-item prop="retPassword">
  57. <el-input
  58. v-model="formInline.retPassword"
  59. type="password"
  60. show-password
  61. placeholder="请再次输入密码"
  62. @keyup.enter="handleSubmit"
  63. >
  64. <template #prefix>
  65. <el-icon class="el-input__icon" size="18" color="#808695">
  66. <LockClosedOutline />
  67. </el-icon>
  68. </template>
  69. </el-input>
  70. </el-form-item>
  71. <el-form-item class="default-color" prop="agreement">
  72. <div class="flex justify-between">
  73. <div class="flex-initial">
  74. <el-checkbox v-model="formInline.agreement">我同意隐私协议</el-checkbox>
  75. </div>
  76. </div>
  77. </el-form-item>
  78. <el-form-item :show-label="false">
  79. <el-button
  80. class="w-full"
  81. type="primary"
  82. @click="handleSubmit"
  83. size="large"
  84. :loading="loading"
  85. >
  86. 注册
  87. </el-button>
  88. </el-form-item>
  89. <el-form-item :show-label="false">
  90. <el-button class="w-full" size="large" block @click="backLogin">返回</el-button>
  91. </el-form-item>
  92. </el-form>
  93. </template>
  94. <script lang="ts" setup>
  95. import { reactive, ref } from 'vue';
  96. import { ElMessage } from 'element-plus';
  97. import { PersonOutline, LockClosedOutline } from '@vicons/ionicons5';
  98. import { MobileOutlined, SafetyOutlined } from '@vicons/antd';
  99. const formRef = ref();
  100. const loading = ref(false);
  101. const codeMsg: any = ref('获取验证码');
  102. const isGetCode = ref(false);
  103. const emit = defineEmits(['backLogin']);
  104. const formInline = reactive({
  105. username: '',
  106. password: '',
  107. retPassword: '',
  108. mobile: '',
  109. code: '',
  110. agreement: false,
  111. });
  112. const rules = {
  113. username: { required: true, message: '请输入用户名', trigger: 'blur' },
  114. mobile: { required: true, message: '请输入手机号码', trigger: 'blur' },
  115. code: { required: true, message: '请输入短信验证码', trigger: 'blur' },
  116. password: { required: true, message: '请输入密码', trigger: 'blur' },
  117. retPassword: { required: true, message: '请输入确认密码', trigger: 'blur' },
  118. agreement: {
  119. required: true,
  120. type: 'boolean',
  121. trigger: 'change',
  122. message: '请先勾选协议',
  123. validator: (_, value) => value === true,
  124. },
  125. };
  126. const handleSubmit = () => {
  127. loading.value = true;
  128. formRef.value.validate(async (valid) => {
  129. if (valid) {
  130. ElMessage.success('注册准备就绪');
  131. loading.value = false;
  132. } else {
  133. loading.value = false;
  134. ElMessage({
  135. message: '请填写完整信息',
  136. type: 'error',
  137. });
  138. }
  139. });
  140. };
  141. const backLogin = () => {
  142. emit('backLogin');
  143. };
  144. function getCode() {
  145. codeMsg.value = 60;
  146. isGetCode.value = true;
  147. let time = setInterval(() => {
  148. codeMsg.value--;
  149. if (codeMsg.value <= 0) {
  150. clearInterval(time);
  151. codeMsg.value = '获取验证码';
  152. isGetCode.value = false;
  153. }
  154. }, 1000);
  155. }
  156. </script>