register.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <div class="loginView w-screen h-screen overflow-hidden flex">
  3. <div class="w-[32rem] bg-white m-auto border-t-8 border-blue-400 shadow-xl rounded-md pl-9 pr-9">
  4. <h2 class="text-xl text-center pt-4 font-bold">注册</h2>
  5. <el-form class="pt-4" ref="ruleFormRef" :model="ruleForm" :rules="rules">
  6. <el-form-item class="pt-1" prop="companyName">
  7. <el-input type="text" size="large" v-model="ruleForm.companyName" autocomplete="off" placeholder="公司名"
  8. clearable :prefix-icon="HomeFilled"></el-input>
  9. </el-form-item>
  10. <el-form-item class="pt-1" prop="name">
  11. <el-input type="text" size="large" v-model="ruleForm.name" autocomplete="off" placeholder="姓名" clearable
  12. :prefix-icon="UserFilled"></el-input>
  13. </el-form-item>
  14. <el-form-item class="pt-1" prop="phone">
  15. <el-input type="text" size="large" v-model="ruleForm.phone" autocomplete="off" placeholder="手机号" clearable
  16. :prefix-icon="Iphone"></el-input>
  17. </el-form-item>
  18. <el-form-item class="pt-1" prop="vcode">
  19. <el-input type="text" size="large" v-model="ruleForm.vcode" autocomplete="off" placeholder="验证码" clearable
  20. :prefix-icon="Tickets">
  21. <template #append>
  22. <el-button @click="sendVcode()" :disabled="ruleForm.phone == '' || showTimer">发送验证码<span
  23. v-if="showTimer">({{ countNum }})</span></el-button>
  24. </template>
  25. </el-input>
  26. </el-form-item>
  27. <el-form-item class="pt-1" prop="password">
  28. <el-input type="password" size="large" v-model="ruleForm.password" autocomplete="off"
  29. placeholder="设置密码,长度不低于6位" clearable :prefix-icon="Lock">
  30. </el-input>
  31. </el-form-item>
  32. <el-form-item class="pt-1" prop="repwd">
  33. <el-input type="password" size="large" v-model="ruleForm.repwd" autocomplete="off" placeholder="重复密码"
  34. clearable :prefix-icon="Lock">
  35. </el-input>
  36. </el-form-item>
  37. <div class="pt-4 mb-5">
  38. <el-button type="primary" size="large" class="w-full" :loading="registerLoading"
  39. @click="register(ruleFormRef)">注册</el-button>
  40. </div>
  41. </el-form>
  42. <div class="text-right mb-5 cursor-pointer text-blue-400 hover:text-blue-300" @click="router.push('/login')">
  43. 已有账号?返回登录
  44. </div>
  45. </div>
  46. </div>
  47. </template>
  48. <script lang="ts" setup>
  49. import { inject, reactive, ref } from "vue";
  50. import { useRouter, useRoute } from "vue-router";
  51. import { HomeFilled, UserFilled, Lock, Iphone, Tickets } from '@element-plus/icons-vue'
  52. import { ElNotification, ElMessage, type FormInstance, type FormRules } from 'element-plus'
  53. import { isValueEmpty } from "@/utils/tools";
  54. import { post } from "@/utils/request";
  55. import { REGISTER, SENDVCODE } from "./api";
  56. const globalPopup = inject<GlobalPopup>('globalPopup')
  57. const router = useRouter();
  58. const route = useRoute();
  59. const ruleFormRef = ref<FormInstance>();
  60. const ruleForm = ref({
  61. companyName: "",
  62. name: "",
  63. phone: "",
  64. vcode: "",
  65. password: "",
  66. repwd: ""
  67. });
  68. const rules = reactive<FormRules<typeof ruleForm>>({
  69. companyName: [{ required: true, message: '请输入公司名', trigger: 'blur' },],
  70. name: [{ required: true, message: '请输入姓名', trigger: 'blur' },],
  71. phone: [
  72. { required: true, message: '请输入手机号', trigger: 'blur' },
  73. { min: 11, max: 11, message: '请输入正确的手机号', trigger: 'blur' },
  74. ],
  75. vcode: [
  76. { required: true, message: '请输入验证码', trigger: 'blur' },
  77. ],
  78. password: [
  79. { required: true, message: '请设置密码,长度不低于6位', trigger: 'blur' },
  80. { min: 6, message: '密码长度不少于6位', trigger: 'blur' },
  81. ],
  82. repwd: [
  83. { required: true, message: '请重复输入密码', trigger: 'blur' },
  84. {
  85. validator: (_rule, value, callback) => {
  86. if (value !== ruleForm.value.password) {
  87. callback(new Error('两次密码不一致'));
  88. } else {
  89. callback();
  90. }
  91. }, trigger: 'blur'
  92. }
  93. ]
  94. })
  95. const registerLoading = ref(false);
  96. const showTimer = ref(false);
  97. const countNum = ref(10);
  98. const countDown = () => {
  99. if (countNum.value > 0) {
  100. setTimeout(() => {
  101. countNum.value -= 1;
  102. countDown()
  103. }, 1000)
  104. } else {
  105. showTimer.value = false;
  106. countNum.value = 10;
  107. }
  108. }
  109. const sendVcode = () => {
  110. showTimer.value = true;
  111. countDown();
  112. if (ruleForm.value.phone.trim().length != 11) {
  113. ElMessage.error({
  114. message: "请输入正确的手机号",
  115. type: "error",
  116. duration: 2000,
  117. })
  118. return
  119. }
  120. post(SENDVCODE, {
  121. mobile: ruleForm.value.phone
  122. }).then(res => {
  123. if (res.code == "ok") {
  124. ElMessage.success({
  125. message: "发送成功",
  126. type: "success",
  127. duration: 2000,
  128. })
  129. showTimer.value = true;
  130. countDown();
  131. }
  132. })
  133. }
  134. const register = (formEl: FormInstance | undefined) => {
  135. if (!formEl) {
  136. return
  137. }
  138. formEl.validate((valid: boolean) => {
  139. if (!valid) {
  140. return false as any;
  141. }
  142. registerLoading.value = true;
  143. let params = {
  144. ...ruleForm.value,
  145. }
  146. /* 如果地址栏有参数,就带上 */
  147. if (!isValueEmpty(route.query)) {
  148. params = {
  149. ...params,
  150. ...route.query
  151. }
  152. }
  153. post(REGISTER, params).then(res => {
  154. if (res.code == "ok") {
  155. globalPopup?.showSuccess("注册成功")
  156. registerLoading.value = false;
  157. router.back()
  158. } else {
  159. globalPopup?.showError(res.message || res.msg || "注册失败")
  160. registerLoading.value = false;
  161. }
  162. }).catch(err => {
  163. globalPopup?.showError(err.msg || err.msg || "注册失败")
  164. registerLoading.value = false;
  165. })
  166. })
  167. };
  168. </script>
  169. <style lang="scss" scoped>
  170. .loginView {
  171. background: #f0f2f5 url("../assets/login/background.png") no-repeat;
  172. }
  173. </style>