调解系统PC端服务

register.vue 14KB

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