index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. /*注册*/
  2. <template>
  3. <div class="register">
  4. <div class="container">
  5. <div class="content">
  6. <div class="steps">
  7. <p>
  8. <span :class="[active==0?'on':'']">邮箱验证</span>
  9. &gt;
  10. <span :class="[active==1?'on':'']">设置密码</span>
  11. &gt;
  12. <span :class="[active==2?'on':'']">注册成功</span>
  13. </p>
  14. </div>
  15. <h3 class="title" v-if="active!=2">免费注册</h3>
  16. <el-form
  17. v-if="active==0"
  18. ref="emailForm"
  19. class="register-form"
  20. :model="emailForm"
  21. :rules="emailRules"
  22. label-position="left"
  23. >
  24. <el-form-item prop="email">
  25. <el-input
  26. ref="email"
  27. type="text"
  28. size="small"
  29. name="email"
  30. v-model="emailForm.email"
  31. placeholder="请输入邮箱地址"
  32. >
  33. <span slot="prefix" class="solt">邮箱</span>
  34. </el-input>
  35. </el-form-item>
  36. <el-form-item prop="code">
  37. <el-input
  38. ref="code"
  39. type="text"
  40. size="small"
  41. style="width:220px"
  42. name="code"
  43. v-model="emailForm.code"
  44. placeholder="请输入验证码"
  45. >
  46. <span slot="prefix" class="solt">验证码</span>
  47. </el-input>
  48. <el-button
  49. class="code"
  50. type="danger"
  51. size="small"
  52. :disabled="countDown>0"
  53. plain
  54. @click.native.prevent="getCode"
  55. >{{countDown>0?`${countDown}s`:'获取验证码'}}</el-button>
  56. </el-form-item>
  57. <div class="agree">
  58. <el-checkbox v-model="emailForm.checked"></el-checkbox>
  59. <span>点击“下一步”按钮将视为您已阅读并同意</span>
  60. <router-link to="/protocol/index">《注册协议》</router-link>
  61. </div>
  62. <el-button type="danger" size="small" class="next-btn" @click.native.prevent="Next">下一步</el-button>
  63. </el-form>
  64. <el-form
  65. v-if="active==1"
  66. ref="setForm"
  67. class="register-form"
  68. :model="setForm"
  69. :rules="setRules"
  70. label-position="left"
  71. >
  72. <el-form-item prop="name">
  73. <el-input
  74. ref="name"
  75. type="text"
  76. size="small"
  77. name="name"
  78. v-model="setForm.name"
  79. placeholder="请设置用户名"
  80. >
  81. <span slot="prefix" class="solt">用户名</span>
  82. </el-input>
  83. </el-form-item>
  84. <el-form-item prop="pwd">
  85. <el-input
  86. ref="pwd"
  87. :type="setForm.pwdType"
  88. size="small"
  89. name="pwd"
  90. minlength="6"
  91. maxlength="8"
  92. v-model="setForm.pwd"
  93. placeholder="请输入密码"
  94. >
  95. <span slot="prefix" class="solt">密码</span>
  96. <svg-icon
  97. slot="suffix"
  98. :icon-class="setForm.pwdType === 'password' ? 'eye' : 'eye-open'"
  99. @click="showPwd"
  100. />
  101. </el-input>
  102. </el-form-item>
  103. <el-form-item prop="spwd">
  104. <el-input
  105. ref="spwd"
  106. :type="setForm.spwdType"
  107. size="small"
  108. name="spwd"
  109. minlength="6"
  110. maxlength="8"
  111. v-model="setForm.spwd"
  112. placeholder="请确认密码"
  113. >
  114. <span slot="prefix" class="solt">确认密码</span>
  115. <svg-icon
  116. slot="suffix"
  117. :icon-class="setForm.spwdType === 'password' ? 'eye' : 'eye-open'"
  118. @click="showSpwd"
  119. />
  120. </el-input>
  121. </el-form-item>
  122. <el-button type="danger" size="small" class="next-btn" @click.native.prevent="Next">下一步</el-button>
  123. </el-form>
  124. <div class="link" v-if="active!=2">
  125. 已有账号?
  126. <router-link class="link-item" to="/login/index">立即登录</router-link>
  127. </div>
  128. <div v-if="active==2" class="success">
  129. <i class="el-icon-circle-check" />
  130. <p>恭喜您,注册成功!</p>
  131. <router-link to="/login/index">返回登录页面</router-link>
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. </template>
  137. <script>
  138. import { validEmail, validCode, validPwd } from '@/utils/validate'
  139. import { request, enPassword } from '@/utils/request'
  140. export default {
  141. name: 'Register',
  142. data() {
  143. const validateEmail = (rule, value, callback) => {
  144. if (value) {
  145. if (!validEmail(value)) {
  146. callback(new Error('请输入正确的邮箱'))
  147. } else {
  148. callback()
  149. }
  150. } else {
  151. callback(new Error('请输入邮箱'))
  152. }
  153. }
  154. const validateCode = (rule, value, callback) => {
  155. if (value) {
  156. if (!validCode(value)) {
  157. callback(new Error('验证码为6位数字'))
  158. } else {
  159. callback()
  160. }
  161. } else {
  162. callback(new Error('请输入验证码'))
  163. }
  164. }
  165. const validatePwd = (rule, value, callback) => {
  166. if (value) {
  167. if (!validPwd(value)) {
  168. callback(new Error('6~8位,字母开头,只能包含字母、数字和下划线'))
  169. } else {
  170. callback()
  171. }
  172. } else {
  173. callback(new Error('请输入密码'))
  174. }
  175. }
  176. const validateSpwd = (rule, value, callback) => {
  177. if (value) {
  178. if (value != this.setForm.pwd) {
  179. callback(new Error('两次密码不一致'))
  180. } else {
  181. callback()
  182. }
  183. } else {
  184. callback(new Error('请再次输入密码'))
  185. }
  186. }
  187. return {
  188. active: 0, //当前步骤
  189. countDown: '00', // 倒计时
  190. emailForm: {
  191. email: '',
  192. code: '',
  193. checked: true
  194. },
  195. emailRules: {
  196. email: [{ required: true, trigger: 'blur', validator: validateEmail }],
  197. code: [{ required: true, trigger: 'blur', validator: validateCode }]
  198. },
  199. setForm: {
  200. name: '',
  201. pwd: '',
  202. spwd: '',
  203. pwdType: 'password',
  204. spwdType: 'password'
  205. },
  206. setRules: {
  207. name: [{ required: true, message: '请设置用户名', trigger: 'blur' }],
  208. pwd: [
  209. // { required: true, trigger: 'blur', validator: validatePwd }
  210. { required: true, message: '请输入密码', trigger: 'blur' },
  211. { min: 6, max: 8, message: '密码长度为6到8位', trigger: 'blur' }
  212. ],
  213. spwd: [{ required: true, trigger: 'blur', validator: validateSpwd }]
  214. }
  215. }
  216. },
  217. computed: {},
  218. methods: {
  219. // 切换显示密码
  220. showPwd() {
  221. this.setForm.pwdType =
  222. this.setForm.pwdType === 'password' ? '' : 'password'
  223. this.$nextTick(() => {
  224. this.$refs.pwd.focus()
  225. })
  226. },
  227. // 切换显示二次密码
  228. showSpwd() {
  229. this.setForm.spwdType =
  230. this.setForm.spwdType === 'password' ? '' : 'password'
  231. this.$nextTick(() => {
  232. this.$refs.spwd.focus()
  233. })
  234. },
  235. // 倒计时
  236. theLast() {
  237. this.countDown = 60
  238. let timer = setInterval(() => {
  239. if (this.countDown > 0) {
  240. this.countDown--
  241. this.countDown < 10 && (this.countDown = '0' + this.countDown)
  242. } else {
  243. clearInterval(timer)
  244. }
  245. }, 1000)
  246. },
  247. //获取验证码
  248. getCode() {
  249. if (this.countDown > 0) return this.$message.error('请不要频繁点击!')
  250. if (!this.emailForm.email) return this.$message.error('请输入邮箱地址!')
  251. let params = {
  252. transCode: 'A00001',
  253. mail: this.emailForm.email,
  254. queryNo: '',
  255. type: '0'
  256. }
  257. request(params)
  258. .then(res => {
  259. this.$message.success(
  260. '验证码已发送至邮箱:' + this.emailForm.email + ',请注意查收!'
  261. )
  262. this.theLast()
  263. })
  264. .catch(err => {})
  265. },
  266. // 下一步
  267. Next() {
  268. if (this.active == 0) {
  269. this.$refs.emailForm.validate(valid => {
  270. if (valid) {
  271. if (this.emailForm.checked) {
  272. let params = {
  273. transCode: 'UT0003',
  274. mail: this.emailForm.email,
  275. verificationCode: this.emailForm.code
  276. }
  277. request(params)
  278. .then(res => {
  279. this.$message.success('邮箱验证通过!')
  280. this.active = 1
  281. })
  282. .catch(err => {})
  283. } else {
  284. this.$alert('请仔细阅读《注册协议》,并同意!', '提示', {
  285. confirmButtonText: '确定',
  286. callback: action => {}
  287. })
  288. }
  289. } else {
  290. return false
  291. }
  292. })
  293. } else if (this.active == 1) {
  294. this.$refs.setForm.validate(valid => {
  295. if (valid) {
  296. let params = {
  297. transCode: 'A00003',
  298. userName: this.setForm.name,
  299. password: enPassword(this.setForm.pwd),
  300. mail: this.emailForm.email
  301. }
  302. request(params)
  303. .then(res => {
  304. this.$message({
  305. message: '恭喜您,注册成功!',
  306. type: 'success'
  307. })
  308. this.active = 2
  309. })
  310. .catch(err => {})
  311. } else {
  312. return false
  313. }
  314. })
  315. }
  316. }
  317. }
  318. }
  319. </script>
  320. <style lang="scss" scoped>
  321. @import '@/styles/variables.scss';
  322. @import '@/styles/mixin.scss';
  323. .register {
  324. padding: 50px 0;
  325. @include w_h(100%, 100%);
  326. background: $color_f5;
  327. .container {
  328. @include w_h(100%, 100%);
  329. .content {
  330. margin: 0 auto;
  331. @include w_h(430px, 100%);
  332. background: $color_f;
  333. box-shadow: 0 0 7px 7px rgba(0, 0, 0, 0.04);
  334. .steps {
  335. @include w_h(100%, 34px);
  336. font-size: 12px;
  337. line-height: 34px;
  338. text-align: center;
  339. color: #78a4db;
  340. background: #004498;
  341. .on {
  342. color: $color_f;
  343. }
  344. }
  345. .title {
  346. margin: 30px auto;
  347. font-size: 20px;
  348. text-align: center;
  349. color: $color_3;
  350. }
  351. .register-form {
  352. padding: 0 50px 30px;
  353. @include w_h(100%);
  354. background: $color_f;
  355. .solt {
  356. padding: 0 6px;
  357. font-size: 12px;
  358. color: $color_6;
  359. }
  360. .code {
  361. @include position(absolute, 4px, auto, auto, 0);
  362. @include w_h(100px);
  363. font-size: 12px;
  364. vertical-align: middle;
  365. cursor: pointer;
  366. user-select: none;
  367. }
  368. .agree {
  369. text-align: left;
  370. font-size: 12px;
  371. a {
  372. color: #409eff;
  373. }
  374. }
  375. .next-btn {
  376. margin: 30px auto 10px;
  377. @include w_h();
  378. }
  379. }
  380. .link {
  381. font-size: 12px;
  382. text-align: center;
  383. color: $color_9;
  384. .link-item {
  385. color: $color_on;
  386. }
  387. }
  388. .success {
  389. font-size: 14px;
  390. text-align: center;
  391. i {
  392. margin-top: 50px;
  393. font-size: 60px;
  394. color: #41b300;
  395. }
  396. p {
  397. margin: 20px auto;
  398. font-size: 20px;
  399. font-weight: 700;
  400. color: $color_3;
  401. }
  402. a {
  403. font-size: 14px;
  404. color: $color_9;
  405. }
  406. a:hover {
  407. color: #409eff;
  408. }
  409. }
  410. }
  411. }
  412. }
  413. </style>
  414. <style lang="scss">
  415. @import '@/styles/variables.scss';
  416. @supports (-webkit-mask: none) and (not (cater-color: $color_9)) {
  417. .register-form .el-input input {
  418. font-size: 12px;
  419. color: $color_9;
  420. }
  421. }
  422. .register-form {
  423. .el-input {
  424. &__inner:focus {
  425. border-color: $color_9;
  426. }
  427. &--prefix .el-input__inner {
  428. color: $color_6;
  429. padding-left: 65px;
  430. }
  431. }
  432. }
  433. </style>>