register.vue 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <template>
  2. <!-- 注册 -->
  3. <div class="flex-col registerPage">
  4. <s-header :name="$t('register.header')" :noback="false"></s-header>
  5. <div class="registerFormBox">
  6. <van-form @submit="registerSubmit">
  7. <van-field v-model="username" name="username" :label="$t('register.usernameLabel')"
  8. :placeholder="$t('register.usernamePlaceholder')"
  9. :rules="[{ required: true, message: $t('register.usernameRequired') }]" />
  10. <br>
  11. <van-field v-model="name" name="name" :label="$t('register.nameLabel')"
  12. :placeholder="$t('register.namePlaceholder')"
  13. :rules="[{ required: true, message: $t('register.nameRequired') }]" />
  14. <br>
  15. <van-field v-model="password" name="password" type="password" :label="$t('register.passwordLabel')"
  16. :placeholder="$t('register.passwordPlaceholder')"
  17. :rules="[{ required: true, message: $t('register.passwordRequired') }]" />
  18. <br>
  19. <van-field v-model="passwordCheck" name="passwordCheck" type="password" :label="$t('register.passwordCheckLabel')"
  20. :placeholder="$t('register.passwordCheckPlaceholder')"
  21. :rules="[{ required: true, message: $t('register.passwordCheckRequired') }]" />
  22. <br>
  23. <!-- 国家或地区 -->
  24. <div class="van-cell van-field">
  25. <div class="van-cell__title van-field__label"><span>{{ $t('register.country') }}</span></div>
  26. <div class="van-cell__value van-field__value radioBox">
  27. <van-radio-group v-model="ifForeign" direction="horizontal">
  28. <van-radio name="0" icon-size="18px">{{ $t('register.chinese') }}</van-radio>
  29. <van-radio name="1" icon-size="18px">{{ $t('register.other') }}</van-radio>
  30. </van-radio-group>
  31. </div>
  32. </div>
  33. <!-- 中国 -->
  34. <div v-if="ifForeign === '0'">
  35. <div class="van-cell van-field">
  36. <div class="van-cell__title van-field__label"><span>{{ $t('register.logonMode') }}</span></div>
  37. <div class="van-cell__value van-field__value radioBox">
  38. <van-radio-group class="o-pr-18" v-model="logonMode" direction="horizontal">
  39. <van-radio name="10" icon-size="18px" :value="0">{{ $t('register.phoneRegistration') }}</van-radio>
  40. <van-radio name="11" icon-size="18px" :value="1">{{ $t('register.emailRegistration') }}</van-radio>
  41. </van-radio-group>
  42. </div>
  43. </div>
  44. <!-- 国内手机 -->
  45. <van-field v-if="logonMode === '10'" v-model="phone" name="phone" type="tel" :label="$t('register.phoneLabel')"
  46. :placeholder="$t('register.phonePlaceholder')"
  47. :rules="[{ required: ifForeign === '0' && logonMode === '10', message: $t('register.phoneRequired') }]" />
  48. <br v-if="ifForeign === '0' && logonMode === '10'">
  49. <!-- 短信验证码 -->
  50. <van-field v-if="logonMode === '10'" v-model="code" name="code" :label="$t('register.codeLabel')"
  51. :placeholder="$t('register.codePlaceholder')"
  52. :rules="[{ required: true, message: $t('register.codeRequired') }]">
  53. <template #button v-if="ifForeign === '0' && logonMode === '10'">
  54. <van-button size="small" type="primary" @click="seedVerCode()"
  55. :disabled="time !== 0 || phone.length === 0">{{
  56. time === 0 ?
  57. $t('register.seedVerCode') : time + $t('register.replaysInSeconds')
  58. }}
  59. </van-button>
  60. </template>
  61. </van-field>
  62. <!-- 国内邮箱 -->
  63. <van-field v-if="logonMode === '11'" v-model="email" name="email" :label="$t('register.emailLabel')"
  64. :placeholder="$t('register.emailPlaceholder')" :rules="[
  65. { required: ifForeign === '0' && logonMode === '11', message: $t('register.emailRequired') },
  66. { pattern: /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/, message: '邮箱格式错误!' }
  67. ]" :minlength="3" :maxlength="20">
  68. </van-field>
  69. <br v-if="ifForeign === '0' && logonMode === '11'">
  70. <!-- 国内邮箱验证码 -->
  71. <van-field v-if="logonMode === '11'" v-model="code" name="code" :label="$t('register.emailCodeLabel')"
  72. :placeholder="$t('register.emailCodePlaceholder')"
  73. :rules="[{ required: true, message: $t('register.emailCodeRequired') }]">
  74. <template #button v-if="ifForeign === '0' && logonMode === '11'">
  75. <van-button size="small" type="primary" @click="seedVerCode()"
  76. :disabled="time !== 0 || email.length === 0">{{
  77. time === 0 ?
  78. $t('register.seedVerCode') : time + $t('register.replaysInSeconds')
  79. }}
  80. </van-button>
  81. </template>
  82. </van-field>
  83. </div>
  84. <!-- 海外 -->
  85. <div v-if="ifForeign === '1'">
  86. <!-- 海外邮箱 -->
  87. <van-field v-if="ifForeign === '1'" v-model="email" name="email" :label="$t('register.emailLabel')"
  88. :placeholder="$t('register.emailPlaceholder')"
  89. :rules="[{ required: ifForeign === '1', message: $t('register.emailRequired') }]" />
  90. <br v-if="ifForeign === '1'">
  91. <!-- 海外邮箱验证码 -->
  92. <van-field v-if="ifForeign === '1'" v-model="code" name="code" :label="$t('register.emailCodeLabel')"
  93. :placeholder="$t('register.emailCodePlaceholder')"
  94. :rules="[{ required: true, message: $t('register.emailCodeRequired') }]">
  95. <template #button v-if="ifForeign === '1'">
  96. <van-button size="small" type="primary" @click="seedVerCode()"
  97. :disabled="time !== 0 || email.length === 0">{{
  98. time === 0 ?
  99. $t('register.seedVerCode') : time + $t('register.replaysInSeconds')
  100. }}
  101. </van-button>
  102. </template>
  103. </van-field>
  104. </div>
  105. <!-- 提交验证信息 -->
  106. <van-button round type="primary" class="register" native-type="submit">{{
  107. $t('register.registerButton')
  108. }}
  109. </van-button>
  110. </van-form>
  111. </div>
  112. </div>
  113. </template>
  114. <script>
  115. import md5 from 'js-md5';
  116. import { ref, onMounted, reactive, toRefs } from 'vue';
  117. import { Toast } from 'vant';
  118. import { sentRegisterCode, tAdminSave } from '@/service/register';
  119. import sHeader from '@/components/SimpleHeader';
  120. import logiLogoImgUrl from "@/assets/login/logo.png";
  121. import { useRouter } from 'vue-router';
  122. import { getLocal, setLocal, styleUrl } from '@/common/js/utils';
  123. export default {
  124. setup() {
  125. const active = ref(0);
  126. const username = ref('');
  127. const name = ref('');
  128. const password = ref('');
  129. const passwordCheck = ref('');
  130. const ifForeign = ref('0');
  131. const logonMode = ref('10');
  132. const phone = ref('');
  133. const email = ref('');
  134. const code = ref('');
  135. const verifyRef = ref(null);
  136. const verCodeTime = reactive({
  137. time: 0
  138. });
  139. let phoneOrEmailStr = ref('');
  140. const router = useRouter();
  141. // 注册点击
  142. const registerSubmit = async () => {
  143. if (password.value !== passwordCheck.value) {
  144. Toast.fail('两次密码不一致,请确认密码');
  145. return false;
  146. }
  147. const { data } = await tAdminSave({
  148. username: username.value,
  149. name: name.value,
  150. password: md5(password.value),
  151. ifForeign: ifForeign.value,
  152. // phone: phone.value,
  153. // email: email.value,
  154. phoneOrEmail: phoneOrEmailStr,
  155. code: code.value,
  156. companyType: '0'
  157. });
  158. if (data.code === '00000') {
  159. Toast('注册成功');
  160. router.push({ path: '/login' });
  161. } else {
  162. Toast.fail(data.message);
  163. }
  164. };
  165. // 发送验证码
  166. const seedVerCode = async () => {
  167. if (ifForeign.value === '1') {
  168. phoneOrEmailStr = email.value;
  169. } else if (ifForeign.value === '0' && logonMode.value === '10') {
  170. phoneOrEmailStr = phone.value;
  171. } else {
  172. phoneOrEmailStr = email.value;
  173. }
  174. const { data } = await sentRegisterCode({
  175. ifForeign: ifForeign.value,
  176. phoneOrEmail: phoneOrEmailStr
  177. });
  178. console.log('seedVerCodeSuccess', data);
  179. if (data.code === '00000') {
  180. Toast(data.data);
  181. console.log('seedVerCodeSuccess');
  182. verCodeTime.time = 3 * 60;
  183. verCodeTimeInterval();
  184. } else {
  185. Toast.fail(data.message);
  186. }
  187. }
  188. // 验证码发送成功开始3分钟倒计时
  189. const verCodeTimeInterval = () => {
  190. verCodeTime.time--;
  191. setLocal('registerVerCodeTime', verCodeTime.time)
  192. if (verCodeTime.time !== 0) {
  193. setTimeout(() => {
  194. verCodeTimeInterval();
  195. }, 1000);
  196. }
  197. }
  198. // 初始化页面获取验证码倒计时
  199. onMounted(async () => {
  200. // 加载样式
  201. styleUrl('register');
  202. verCodeTime.time = getLocal('registerVerCodeTime');
  203. if (verCodeTime.time && verCodeTime.time !== '') {
  204. verCodeTime.time = parseInt(verCodeTime.time);
  205. if (verCodeTime.time > 0) {
  206. verCodeTimeInterval();
  207. }
  208. } else {
  209. verCodeTime.time = 0;
  210. }
  211. });
  212. const signOptions = [
  213. { text: '手机注册', value: "mo" },
  214. { text: '邮箱注册', value: "ema" }
  215. ]
  216. const option1 = [
  217. {
  218. text: 'aaaa', value: 0,
  219. },
  220. {
  221. text: 'ccc', value: 1
  222. }
  223. ]
  224. const option2 = [
  225. {
  226. text: 'bbb', value: 'b'
  227. }
  228. ]
  229. return {
  230. ...toRefs(verCodeTime),
  231. logiLogoImgUrl,
  232. username,
  233. name,
  234. password,
  235. passwordCheck,
  236. ifForeign,
  237. phone,
  238. email,
  239. code,
  240. verifyRef,
  241. verCodeTime,
  242. verCodeTimeInterval,
  243. seedVerCode,
  244. registerSubmit,
  245. option1,
  246. option2,
  247. signOptions,
  248. signinModel: 'aaabb',
  249. active,
  250. logonMode,
  251. }
  252. },
  253. components: { sHeader }
  254. }
  255. </script>
  256. <style lang="less" scoped>
  257. @import '../common/style/mixin';
  258. </style>