调解系统PC端服务

register.vue 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <template>
  2. <div class="register">
  3. <el-form ref="registerForm" :model="registerForm" :rules="registerRules" class="register-form">
  4. <h3 class="title">智慧调解系统注册</h3>
  5. <el-form-item prop="userName">
  6. <el-input v-model="registerForm.userName" type="text" auto-complete="off" @blur="changeInput" placeholder="账号">
  7. <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
  8. </el-input>
  9. </el-form-item>
  10. <el-form-item prop="passWord">
  11. <el-input v-model="registerForm.passWord" type="password" auto-complete="off" placeholder="密码"
  12. @keyup.enter.native="handleRegister">
  13. <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
  14. </el-input>
  15. </el-form-item>
  16. <el-form-item prop="confirmPassword">
  17. <el-input v-model="registerForm.confirmPassword" type="password" auto-complete="off" placeholder="确认密码"
  18. @keyup.enter.native="handleRegister">
  19. <svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
  20. </el-input>
  21. </el-form-item>
  22. <el-form-item prop="identityNo">
  23. <el-input v-model="registerForm.identityNo" type="text" auto-complete="off" placeholder="身份证号码">
  24. <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
  25. </el-input>
  26. </el-form-item>
  27. <el-form-item prop="email">
  28. <el-input v-model="registerForm.email" type="text" auto-complete="off" placeholder="邮箱">
  29. <svg-icon slot="prefix" icon-class="email" class="el-input__icon input-icon" />
  30. </el-input>
  31. </el-form-item>
  32. <el-form-item prop="name">
  33. <el-input v-model="registerForm.name" type="text" auto-complete="off" placeholder="用户名">
  34. <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
  35. </el-input>
  36. </el-form-item>
  37. <el-form-item prop="roleId">
  38. <el-select v-model="registerForm.roleId" placeholder="请选择角色" auto-complete="off" style="width: 100%;">
  39. <svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
  40. <el-option v-for="item in roleList" :key="item.roleId" :label="item.roleName" :value="item.roleId">
  41. </el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item prop="phone">
  45. <el-input v-model="registerForm.phone" auto-complete="off" placeholder="手机号" style="width: 63%">
  46. <svg-icon slot="prefix" icon-class="phone" class="el-input__icon input-icon" />
  47. </el-input>
  48. <div class="register-code">
  49. <el-button type="primary" :disabled="codeDisabled" @click="getCodeNumber(registerForm.phone)">{{ codeText
  50. }}</el-button>
  51. </div>
  52. </el-form-item>
  53. <el-form-item prop="verifyCode">
  54. <el-input v-model="registerForm.verifyCode" type="text" auto-complete="off" placeholder="手机验证码">
  55. <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
  56. </el-input>
  57. </el-form-item>
  58. <el-form-item prop="code" v-if="captchaEnabled">
  59. <el-input v-model="registerForm.code" auto-complete="off" placeholder="验证码" style="width: 63%"
  60. @keyup.enter.native="handleRegister">
  61. <svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
  62. </el-input>
  63. <div class="register-code">
  64. <img :src="codeUrl" @click="getCode" class="register-code-img" />
  65. </div>
  66. </el-form-item>
  67. <el-form-item style="width:100%;">
  68. <el-button :loading="loading" size="medium" type="primary" style="width:100%;"
  69. @click.native.prevent="handleRegister">
  70. <span v-if="!loading">注 册</span>
  71. <span v-else>注 册 中...</span>
  72. </el-button>
  73. <div style="float: right;">
  74. <router-link class="link-type" :to="'/login'">使用已有账户登录</router-link>
  75. </div>
  76. </el-form-item>
  77. </el-form>
  78. <!-- 底部 -->
  79. <!-- <div class="el-register-footer">
  80. <span>Copyright © 2018-2023 ruoyi.vip All Rights Reserved.</span>
  81. </div> -->
  82. </div>
  83. </template>
  84. <script>
  85. import { getCodeImg, register, sendCode, wxregister,verifyUserName } from "@/api/login";
  86. import { listRoleNotoken } from "@/api/system/role.js"
  87. export default {
  88. name: "Register",
  89. data() {
  90. const equalToPassword = (rule, value, callback) => {
  91. if (this.registerForm.passWord !== value) {
  92. callback(new Error("两次输入的密码不一致"));
  93. } else {
  94. callback();
  95. }
  96. };
  97. return {
  98. codeText: "发送验证码",
  99. codeDisabled: false,
  100. codeUrl: "",
  101. registerForm: {
  102. userName: "",
  103. passWord: "",
  104. phone: "",
  105. confirmPassword: "",
  106. code: "",
  107. uuid: "",
  108. },
  109. registerRules: {
  110. userName: [
  111. { required: true, trigger: "blur", message: "请输入您的账号" },
  112. { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' },
  113. {
  114. pattern:
  115. /^[0-9a-zA-Z]*$/g,
  116. message: '只能输入英文或者数字',
  117. trigger: 'blur',
  118. },
  119. ],
  120. password: [
  121. { required: true, trigger: "blur", message: "请输入您的密码" },
  122. { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
  123. ],
  124. confirmPassword: [
  125. { required: true, trigger: "blur", message: "请再次输入您的密码" },
  126. { required: true, validator: equalToPassword, trigger: "blur" }
  127. ],
  128. code: [{ required: true, trigger: "change", message: "请输入验证码" }],
  129. identityNo: [
  130. {
  131. required: true,
  132. message: '被申请人身份证号不能为空',
  133. trigger: 'blur',
  134. },
  135. {
  136. pattern:
  137. /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/,
  138. message: '请输入正确的身份证号码',
  139. trigger: 'blur',
  140. },
  141. ],
  142. email: [
  143. { required: true, trigger: "blur", message: "请再次输入您的密码" },
  144. {
  145. pattern:
  146. /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,
  147. message: '请输入正确的邮箱地址',
  148. trigger: 'blur',
  149. },
  150. ],
  151. name: [
  152. { required: true, trigger: "blur", message: "请输入用户名" },
  153. ],
  154. roleId: [
  155. { required: true, trigger: "blur", message: "请选择角色" },
  156. ],
  157. phone: [
  158. {
  159. required: true,
  160. message: '请输入手机号',
  161. trigger: 'blur',
  162. },
  163. {
  164. pattern: /^[1][3,4,5,6,7,8,9][0-9]{9}$/,
  165. message: '请输入正确的手机号码',
  166. trigger: 'blur',
  167. },
  168. ],
  169. verifyCode: [
  170. { required: true, trigger: "blur", message: "请输入验证码" },
  171. ],
  172. },
  173. loading: false,
  174. captchaEnabled: true,
  175. roleList: []
  176. };
  177. },
  178. created() {
  179. this.getCode();
  180. this.getListRole();
  181. },
  182. methods: {
  183. changeInput(){
  184. verifyUserName({userName:this.registerForm.userName})
  185. },
  186. /**获取角色 */
  187. getListRole() {
  188. listRoleNotoken().then(res => {
  189. const roleList = res.data.filter((item) => item.roleName == '申请人' || item.roleName == '被申请人');
  190. this.roleList = roleList;
  191. })
  192. },
  193. getCode() {
  194. getCodeImg().then(res => {
  195. this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
  196. if (this.captchaEnabled) {
  197. this.codeUrl = "data:image/gif;base64," + res.img;
  198. this.registerForm.uuid = res.uuid;
  199. }
  200. });
  201. },
  202. handleRegister() {
  203. this.$refs.registerForm.validate(valid => {
  204. if (valid) {
  205. this.loading = true;
  206. wxregister(this.registerForm).then(res => {
  207. const userName = this.registerForm.userName;
  208. this.$alert("<font color='red'>恭喜你,您的账号 " + userName + " 注册成功!</font>", '系统提示', {
  209. dangerouslyUseHTMLString: true,
  210. type: 'success'
  211. }).then(() => {
  212. this.$router.push("/login");
  213. }).catch(() => { });
  214. }).catch(() => {
  215. this.loading = false;
  216. if (this.captchaEnabled) {
  217. this.getCode();
  218. }
  219. })
  220. }
  221. });
  222. },
  223. getCodeNumber(data) {
  224. sendCode({
  225. phone: data
  226. }).then(res => {
  227. if (res.code != 200) {
  228. this.$modal.msgError(res.msg);
  229. return
  230. } else {
  231. this.$modal.msgSuccess('发送成功');
  232. let time = 60;
  233. let timer = setInterval(() => {
  234. time--;
  235. this.codeDisabled = true;
  236. this.codeText = time + 's重试'
  237. if (time == 0) {
  238. clearInterval(timer)
  239. this.codeText = '发送验证码'
  240. this.codeDisabled = false;
  241. }
  242. }, 1000)
  243. }
  244. })
  245. },
  246. }
  247. };
  248. </script>
  249. <style rel="stylesheet/scss" lang="scss">
  250. .register {
  251. display: flex;
  252. justify-content: center;
  253. align-items: center;
  254. //height: 100%;
  255. background-image: url("../assets/images/login-background.jpg");
  256. background-size: cover;
  257. }
  258. .title {
  259. margin: 0px auto 30px auto;
  260. text-align: center;
  261. color: #707070;
  262. }
  263. .register-form {
  264. border-radius: 6px;
  265. background: #ffffff;
  266. width: 400px;
  267. height: 80%;
  268. padding: 25px 25px 5px 25px;
  269. // .el-input {
  270. // height: 38px;
  271. // input {
  272. // height: 38px;
  273. // }
  274. // }
  275. .input-icon {
  276. height: 39px;
  277. width: 14px;
  278. margin-left: 2px;
  279. }
  280. }
  281. .register-tip {
  282. font-size: 13px;
  283. text-align: center;
  284. color: #bfbfbf;
  285. }
  286. .register-code {
  287. width: 33%;
  288. height: 38px;
  289. float: right;
  290. img {
  291. cursor: pointer;
  292. vertical-align: middle;
  293. }
  294. }
  295. .el-register-footer {
  296. height: 40px;
  297. line-height: 40px;
  298. position: fixed;
  299. bottom: 0;
  300. width: 100%;
  301. text-align: center;
  302. color: #fff;
  303. font-family: Arial;
  304. font-size: 12px;
  305. letter-spacing: 1px;
  306. }
  307. .register-code-img {
  308. height: 38px;
  309. }
  310. </style>