Register.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. <template>
  2. <div class="login">
  3. <el-card class="box-card">
  4. <div slot="header"
  5. class="clearfix">
  6. <span>注册</span>
  7. </div>
  8. <div>
  9. <ul class="choose-type">
  10. <li :class="{ active: form.registerType == '10' }"
  11. @click="changeType('10')"><i class="el-icon-user-solid"></i>注册课题组成员</li>
  12. <li :class="{ active: form.registerType == '20' }"
  13. @click="changeType('20')"><i class="el-icon-notebook-2"></i>注册课题组负责人</li>
  14. </ul>
  15. <el-steps :space="200"
  16. :active="active"
  17. finish-status="success"
  18. align-center
  19. class="mb20">
  20. <el-step title="登录信息"></el-step>
  21. <el-step title="个人信息"></el-step>
  22. <!-- <el-step title="其它信息"></el-step> -->
  23. </el-steps>
  24. <el-form ref="loginInfoRef"
  25. size="mini"
  26. v-show="active == 0"
  27. :model="form"
  28. :rules="rules"
  29. label-width="80px">
  30. <el-form-item label="登录账号"
  31. prop="userName">
  32. <el-input name="username"
  33. placeholder="请输入登录账号"
  34. v-model="form.userName"></el-input>
  35. </el-form-item>
  36. <el-form-item label="密码"
  37. prop="password">
  38. <el-input name="password"
  39. type="password"
  40. placeholder="请输入密码"
  41. v-model="form.password"
  42. autocomplete="off"></el-input>
  43. </el-form-item>
  44. <el-form-item label="确认密码"
  45. prop="confirmPassword">
  46. <el-input name="confirmPassword"
  47. type="password"
  48. placeholder="请输入密码"
  49. v-model="form.confirmPassword"
  50. autocomplete="off"></el-input>
  51. </el-form-item>
  52. </el-form>
  53. <el-form ref="personInfoRef"
  54. size="mini"
  55. v-show="active == 1"
  56. :model="form"
  57. :rules="rules"
  58. label-width="80px">
  59. <el-form-item label="姓名"
  60. prop="nickName">
  61. <el-input placeholder="请输入姓名"
  62. v-model="form.nickName"></el-input>
  63. </el-form-item>
  64. <el-form-item label="性别"
  65. prop="sex">
  66. <el-radio-group placeholder="请"
  67. v-model="form.sex">
  68. <el-radio v-for="item in userSexList"
  69. :key="item.dictValue"
  70. :label="item.dictValue">{{ item.dictLabel }}</el-radio>
  71. </el-radio-group>
  72. </el-form-item>
  73. <el-form-item label="用户类型"
  74. prop="userType">
  75. <el-radio-group v-model="form.userType"
  76. placeholder="请选择用户类型"
  77. style="width: 100%"
  78. clearable>
  79. <el-radio v-for="item in userTypeList"
  80. :key="item.id"
  81. :label="item.dictValue">{{ item.dictLabel }}</el-radio>
  82. </el-radio-group>
  83. </el-form-item>
  84. <el-form-item label="组织部门"
  85. prop="deptId">
  86. <el-cascader ref="casc"
  87. :options="deptData"
  88. @change="deptChange"
  89. :props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'deptName' }"
  90. placeholder="请选择组织部门"
  91. clearable
  92. class="w100"
  93. v-model="form.deptId">
  94. <template #default="{ node, data }">
  95. <span>{{ data.deptName }}</span>
  96. <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
  97. </template>
  98. </el-cascader>
  99. </el-form-item>
  100. <el-form-item label="证件号"
  101. prop="idCode">
  102. <el-input placeholder="请输入证件号"
  103. v-model="form.idCode"
  104. class="w100 input-with-select">
  105. <el-select slot="prepend"
  106. v-model="form.idType"
  107. placeholder="请选择证件类型">
  108. <el-option v-for="item in userCertList"
  109. :key="item.dictValue"
  110. :label="item.dictLabel"
  111. :value="item.dictValue" />
  112. </el-select>
  113. </el-input>
  114. </el-form-item>
  115. <el-form-item label="课题组"
  116. prop="applyPgName"
  117. v-if="form.registerType === '20'">
  118. <el-input v-model="form.applyPgName"></el-input>
  119. </el-form-item>
  120. <el-form-item label="课题组"
  121. prop="applyPg"
  122. v-else>
  123. <el-select v-model="form.applyPg"
  124. placeholder="请选择课题组"
  125. value-key="id"
  126. class="w100">
  127. <el-option v-for="item in pjtList"
  128. :key="item.id"
  129. :label="item.pgName"
  130. :value="item"></el-option>
  131. </el-select>
  132. </el-form-item>
  133. <el-form-item label="所在时间"
  134. prop="projectDate"
  135. v-show="form.registerType === '10'">
  136. <el-date-picker v-model="form.projectDate"
  137. type="daterange"
  138. class="w100"
  139. value-format="yyyy-MM-dd"
  140. range-separator="至"
  141. start-placeholder="开始日期"
  142. end-placeholder="结束日期" />
  143. </el-form-item>
  144. </el-form>
  145. <div class="buttons">
  146. <el-button size="mini"
  147. v-if="active > 0"
  148. @click="preStep">上一步</el-button>
  149. <el-button size="mini"
  150. v-if="active < 1"
  151. type="primary"
  152. @click="nextStep">下一步</el-button>
  153. <el-button size="mini"
  154. v-if="active === 1"
  155. @click="onRegister"
  156. type="primary">注册</el-button>
  157. </div>
  158. </div>
  159. </el-card>
  160. </div>
  161. </template>
  162. <script>
  163. import crypto from "sm-crypto";
  164. import { setToken } from "@/utils/auth";
  165. import { register } from "@/api/login";
  166. import to from "await-to-js";
  167. import {
  168. getDictDataByType,
  169. getDeptTree,
  170. getProjectGroupList,
  171. } from "@/api/dict";
  172. export default {
  173. data() {
  174. const checkPassword = (rule, value, callback) => {
  175. if (value === "") {
  176. callback(new Error("请再次输入密码"));
  177. } else if (value !== this.form.password) {
  178. callback(new Error("两次输入密码不一致!"));
  179. } else {
  180. callback();
  181. }
  182. };
  183. const checkDate = (rule, value, callback) => {
  184. console.log(value, 'valueeeeee');
  185. if(this.form.registerType === '10' && !value.length) {
  186. callback(new Error("请选择所在时间"));
  187. }
  188. callback()
  189. };
  190. return {
  191. active: 0,
  192. type: "person",
  193. labelPosition: "right",
  194. form: {
  195. id: 0,
  196. userName: "", // 账户名称
  197. nickName: "", // 用户姓名
  198. userType: "10", // 关联角色
  199. deptId: null,
  200. deptName: "", // 单位名称
  201. postIds: [],
  202. roleIds: [],
  203. groupIds: [],
  204. phone: "", // 手机号
  205. email: "", // 邮箱
  206. sex: "30", // 性别
  207. password: "", // 账户密码
  208. confirmPassword: "",
  209. status: "10", // 用户状态
  210. describe: "", // 用户描述
  211. avatar: "",
  212. idType: "10", //证件类型
  213. idCode: "", // 证件号
  214. personnelType: "", // 人员类型
  215. projectId: null,
  216. projectName: "",
  217. projectDate: [],
  218. registerType: '10',
  219. applyPg: {},
  220. applyPgName: '',
  221. applyPgId: null
  222. },
  223. rules: {
  224. userName: [
  225. { required: true, message: "请输入用户名", trigger: "blur" },
  226. ],
  227. password: [
  228. { required: true, message: "请输入密码", trigger: "blur" },
  229. {
  230. min: 5,
  231. max: 20,
  232. message: "密码长度在 5 到 20 个字符",
  233. trigger: "blur",
  234. },
  235. ],
  236. confirmPassword: [
  237. { required: true, validator: checkPassword, trigger: "blur" },
  238. ],
  239. nickName: [{ required: true, message: "请输入姓名", trigger: "blur" }],
  240. userType: [
  241. { required: true, message: "请选择用户类型", trigger: "change" },
  242. ],
  243. deptId: [
  244. { required: true, message: "请选择组织部门", trigger: "change" },
  245. ],
  246. idCode: [{ required: true, message: "请输入证件号", trigger: "blur" }],
  247. applyPg: [
  248. { required: true, message: "请选择课题组", trigger: "change" },
  249. ],
  250. applyPgName: [
  251. { required: true, message: "请输入课题组", trigger: "blur" },
  252. ],
  253. projectDate: [
  254. { required: true, validator: checkDate, trigger: "change" },
  255. ]
  256. },
  257. loading: false,
  258. userTypeList: [],
  259. userSexList: [],
  260. userCertList: [],
  261. deptData: [],
  262. pjtList: [],
  263. };
  264. },
  265. mounted() {
  266. this.getDicts();
  267. },
  268. methods: {
  269. getDicts() {
  270. Promise.all([
  271. getDictDataByType("sys_user_type"),
  272. getDictDataByType("sys_com_sex"),
  273. getDictDataByType("sys_user_certificate"),
  274. getDeptTree(),
  275. getProjectGroupList(),
  276. ]).then(([type, sex, cert, dept, pjt]) => {
  277. this.userTypeList = type.data.values || [];
  278. this.userSexList = sex.data.values || [];
  279. this.userCertList = cert.data.values || [];
  280. this.deptData = dept.data || [];
  281. this.pjtList = pjt.data.list || [];
  282. });
  283. },
  284. changeType(val) {
  285. this.form.registerType = val;
  286. },
  287. // 部门选择
  288. deptChange() {
  289. if (this.form.userType === "20") return;
  290. const nodes = this.$refs.casc.getCheckedNodes();
  291. this.form.deptName = nodes[0].label;
  292. },
  293. preStep() {
  294. this.active--;
  295. },
  296. nextStep() {
  297. if (this.active < 2) {
  298. let form = "loginInfoRef";
  299. if (this.active == 1) {
  300. form = "personInfoRef";
  301. }
  302. this.$refs[form].validate(async (valid) => {
  303. if (valid) {
  304. this.active++;
  305. }
  306. });
  307. }
  308. },
  309. onRegister() {
  310. this.$refs.personInfoRef.validate(async valid => {
  311. if(valid) {
  312. const params = JSON.parse(JSON.stringify(this.form))
  313. params.password = crypto.sm3(params.password);
  314. delete params.confirmPassword
  315. if(params.projectDate.length) {
  316. params.startDate = params.projectDate[0]
  317. params.endDate = params.projectDate[1]
  318. }
  319. delete params.projectDate
  320. if(params.registerType === '10') {
  321. params.applyPgId = params.applyPg.id
  322. params.applyPgName = params.applyPg.padName
  323. }
  324. delete params.applyPg
  325. const [err] = await to(register(params));
  326. if(err) {
  327. this.$message.warning('操作失败')
  328. return
  329. }
  330. this.$message.success({
  331. message: '注册成功,即将跳转登录页',
  332. onClose: () => {
  333. this.$router.push('/login')
  334. }
  335. })
  336. }
  337. })
  338. },
  339. login() {
  340. if (this.active < 3) {
  341. this.active++;
  342. } else {
  343. }
  344. this.$refs.lform.validate(async (valid) => {});
  345. },
  346. },
  347. };
  348. </script>
  349. <style lang="scss" scoped>
  350. a {
  351. text-decoration: none;
  352. color: #409eff;
  353. }
  354. .login {
  355. width: 100%;
  356. height: calc(100vh - 116px);
  357. display: flex;
  358. align-items: center;
  359. justify-content: center;
  360. background: url("../assets/img/login-bg.png") center no-repeat;
  361. background-size: 100% 100%;
  362. }
  363. .text {
  364. font-size: 14px;
  365. }
  366. .item {
  367. margin-bottom: 18px;
  368. }
  369. .clearfix:before,
  370. .clearfix:after {
  371. display: table;
  372. content: "";
  373. }
  374. .clearfix:after {
  375. clear: both;
  376. }
  377. .box-card {
  378. width: 500px;
  379. margin: 0 auto;
  380. }
  381. .el-form-item__content {
  382. text-align: start;
  383. }
  384. .choose-type {
  385. display: flex;
  386. list-style: none;
  387. margin-bottom: 12px;
  388. li {
  389. height: 80px;
  390. width: 270px;
  391. display: flex;
  392. flex-direction: column;
  393. align-items: center;
  394. justify-content: center;
  395. border-radius: 8px;
  396. border: 1px solid #ebeef5;
  397. cursor: pointer;
  398. transition: all 0.3s;
  399. color: #8c8888;
  400. & + li {
  401. margin-left: 12px;
  402. }
  403. &:hover,
  404. &.active {
  405. border-color: #409eff;
  406. color: #409eff;
  407. }
  408. i {
  409. font-size: 30px;
  410. margin-bottom: 12px;
  411. }
  412. }
  413. }
  414. .buttons {
  415. display: flex;
  416. justify-content: flex-end;
  417. }
  418. ::v-deep .input-with-select .el-input-group__prepend {
  419. background-color: #fff;
  420. width: 40%;
  421. }
  422. .el-steps {
  423. justify-content: center;
  424. }
  425. </style>