register.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <script setup lang="ts">
  2. import { FormInstance, FormRules, ElMessage } from 'element-plus'
  3. import service from '../../plugins/axios'
  4. import { reactive, ref } from 'vue'
  5. import { token } from '../../plugins/pinia'
  6. let ressuccess = ''
  7. const codvisible = ref(false)
  8. const bt_disabled = ref(false)
  9. function codsuccess(success: string) {
  10. codvisible.value = false
  11. bt_disabled.value = true
  12. ressuccess = success
  13. form.cod = '✅验证通过'
  14. }
  15. const form = reactive({
  16. name: '',
  17. emali: '',
  18. paw: '',
  19. paw1: '',
  20. cod: '',
  21. })
  22. const rules = reactive<FormRules>({
  23. name: [
  24. { required: true, message: '请输入用户名', trigger: 'blur' },
  25. { min: 6, max: 12, message: '长度在 6 到 12 个字符', trigger: 'blur' },
  26. ],
  27. emali: [
  28. { required: true, message: '请输入邮箱', trigger: 'blur' },
  29. {
  30. type: 'email',
  31. message: '请输入正确的邮箱地址',
  32. trigger: ['blur', 'change'],
  33. },
  34. ],
  35. paw: [
  36. { required: true, message: '请输入密码', trigger: 'blur' },
  37. { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' },
  38. ],
  39. paw1: [
  40. { required: true, message: '请再次输入密码', trigger: 'blur' },
  41. { min: 6, max: 20, message: '长度在 6 到 20 个字符', trigger: 'blur' },
  42. {
  43. validator: (rule, value, callback) => {
  44. if (value !== form.paw) {
  45. callback(new Error('两次输入密码不一致!'))
  46. } else {
  47. callback()
  48. }
  49. },
  50. trigger: 'blur',
  51. },
  52. ],
  53. cod: [{ required: true, message: '请点击按钮进行验证', trigger: 'change' }],
  54. })
  55. const formRef = ref<FormInstance>()
  56. const bt_resgister = async (formEl: FormInstance | undefined) => {
  57. formEl?.validate((valid, e) => {
  58. if (valid) {
  59. service({
  60. url: 'auth/register',
  61. method: 'post',
  62. headers: {
  63. 'Content-Type': 'application/json',
  64. cod: ressuccess,
  65. },
  66. data: {
  67. name: form.name,
  68. emali: form.emali,
  69. paw: form.paw,
  70. },
  71. })
  72. .then((res) => {
  73. if (res.data.token) {
  74. token().token = res.data.token
  75. window.location.href = '/home'
  76. ElMessage.success('注册成功')
  77. } else {
  78. formRef.value?.resetFields()
  79. ElMessage.error(res.data.msg)
  80. }
  81. })
  82. .catch((err) => {
  83. ElMessage.error(err.message)
  84. formRef.value?.resetFields()
  85. })
  86. }
  87. })
  88. }
  89. </script>
  90. <template>
  91. <el-card class="box-card register">
  92. <el-form ref="formRef"
  93. :model="form"
  94. label-position="top"
  95. :rules="rules">
  96. <el-form-item label="用户名"
  97. prop="name">
  98. <el-input v-model="form.name" />
  99. </el-form-item>
  100. <el-form-item label="邮箱"
  101. prop="emali">
  102. <el-input type="email"
  103. v-model="form.emali" />
  104. </el-form-item>
  105. <el-form-item label="密码"
  106. prop="paw">
  107. <el-input type="password"
  108. v-model="form.paw" />
  109. </el-form-item>
  110. <el-form-item label="确认密码"
  111. prop="paw1">
  112. <el-input type="password"
  113. v-model="form.paw1" />
  114. </el-form-item>
  115. <el-form-item>
  116. <el-checkbox>
  117. <span>我已阅读并同意</span>
  118. <el-link type="primary"
  119. href="#">《用户协议》</el-link>
  120. </el-checkbox>
  121. </el-form-item>
  122. <el-form-item label="验证码"
  123. prop="cod">
  124. <el-input type="password"
  125. v-model="form.cod"
  126. style="display:none" />
  127. <el-popover placement="top"
  128. :width="330"
  129. :visible="codvisible">
  130. <template #reference>
  131. <el-button :type="bt_disabled?'success':'info'"
  132. style="width: 100%;"
  133. :disabled="bt_disabled"
  134. @click="(codvisible = !codvisible)">{{bt_disabled?"✅验证通过":"点击进行验证"}}</el-button>
  135. </template>
  136. <Suspense>
  137. <template #default>
  138. <el-space>
  139. <div class="center">
  140. <cod @success="codsuccess" />
  141. </div>
  142. </el-space>
  143. </template>
  144. <template #fallback>
  145. 验证码获取中
  146. </template>
  147. </Suspense>
  148. </el-popover>
  149. </el-form-item>
  150. </el-form>
  151. <el-divider />
  152. <el-button type="primary"
  153. style="width:100%;"
  154. @click="bt_resgister(formRef)">注册</el-button>
  155. <br>
  156. <div>
  157. <el-button type="text"
  158. id="to_login"
  159. style="float:right;">已有账号?去登录</el-button>
  160. </div>
  161. <br>
  162. </el-card>
  163. </template>
  164. <style scoped >
  165. </style>