register.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. <template>
  2. <div class="register">
  3. <el-form class="panel" :model="form" :rules="rules" ref="baseFormRef">
  4. <h2>单位注册</h2>
  5. <span class="desc">
  6. 此功能仅用于注册单位及单位管理员,
  7. 单位内其它用户可由单位管理员登录后创建。
  8. </span>
  9. <el-form-item
  10. class="panel-form-item"
  11. label="单位名称"
  12. :maxlength="50"
  13. prop="orgName"
  14. required
  15. >
  16. <el-input
  17. :maxlength="11"
  18. v-model.trim="form.orgName"
  19. placeholder="请输入"
  20. ></el-input>
  21. </el-form-item>
  22. <el-form-item class="panel-form-item" label="类型" prop="type">
  23. <el-select v-model="form.type">
  24. <el-option
  25. class="register-select-option"
  26. :value="Number(key)"
  27. :label="type"
  28. v-for="(type, key) in OrganizationTypeDesc"
  29. />
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item
  33. class="panel-form-item"
  34. label="姓名"
  35. prop="contact"
  36. required
  37. >
  38. <el-input
  39. :maxlength="100"
  40. v-model.trim="form.contact"
  41. placeholder="请选择"
  42. ></el-input>
  43. </el-form-item>
  44. <el-form-item
  45. class="panel-form-item"
  46. prop="userName"
  47. label="账号"
  48. required
  49. >
  50. <el-input
  51. :maxlength="11"
  52. v-model.trim="form.userName"
  53. placeholder="请输入手机号码"
  54. >
  55. </el-input>
  56. </el-form-item>
  57. <el-form-item
  58. class="panel-form-item msgcode"
  59. prop="msgAuthCode"
  60. label="验证码"
  61. required
  62. >
  63. <el-input
  64. :maxlength="8"
  65. v-model.trim="form.msgAuthCode"
  66. placeholder="输入验证码"
  67. >
  68. </el-input>
  69. <el-button
  70. class="getMsgAuthCode"
  71. :loading="checkCodeBtn.loading"
  72. :disabled="checkCodeBtn.disabled"
  73. style="margin-left: 10px"
  74. @click="getCheckCode"
  75. >
  76. {{ checkCodeBtn.text }}</el-button
  77. >
  78. </el-form-item>
  79. <!-- <el-form-item class="panel-form-item" label="密码" prop="password" required>
  80. <el-input v-model.trim="form.password" placeholder="请输入8-16位数字、字母大小写组合">
  81. </el-input>
  82. </el-form-item> -->
  83. <el-form-item
  84. class="panel-form-item"
  85. label="密码"
  86. prop="password"
  87. required
  88. >
  89. <el-input
  90. autocomplete="off"
  91. readonly
  92. onfocus="this.removeAttribute('readonly');"
  93. v-model="form.password"
  94. :type="addPassFlag ? 'text' : 'password'"
  95. :maxlength="20"
  96. placeholder="请输入8-16位数字、字母大小写组合"
  97. >
  98. <template #suffix>
  99. <span @click="addPassFlag = !addPassFlag" style="cursor: pointer">
  100. <el-icon v-if="addPassFlag">
  101. <View />
  102. </el-icon>
  103. <el-icon v-else>
  104. <Hide />
  105. </el-icon>
  106. </span>
  107. </template>
  108. </el-input>
  109. </el-form-item>
  110. <el-form-item
  111. class="panel-form-item"
  112. label="密码确认"
  113. prop="confirmPwd"
  114. required
  115. >
  116. <el-input
  117. autocomplete="off"
  118. readonly
  119. onfocus="this.removeAttribute('readonly');"
  120. v-model="form.confirmPwd"
  121. :type="addPassFlag1 ? 'text' : 'password'"
  122. :maxlength="20"
  123. placeholder="输入再次输入密码"
  124. >
  125. <template #suffix>
  126. <span @click="addPassFlag1 = !addPassFlag1" style="cursor: pointer">
  127. <el-icon v-if="addPassFlag1">
  128. <View />
  129. </el-icon>
  130. <el-icon v-else>
  131. <Hide />
  132. </el-icon>
  133. </span>
  134. </template>
  135. </el-input>
  136. </el-form-item>
  137. <el-form-item class="panel-form-item">
  138. <el-button type="primary" class="fill submit" @click="submitClick"
  139. >注册</el-button
  140. >
  141. </el-form-item>
  142. </el-form>
  143. </div>
  144. </template>
  145. <script lang="ts" setup>
  146. import { reactive, ref, unref } from "vue";
  147. import { ElMessage, type FormInstance, type FormRules } from "element-plus";
  148. import { OrganizationTypeDesc } from "@/store/organization";
  149. import { View, Hide } from "@element-plus/icons-vue";
  150. import { registerOrganization } from "@/request/organization";
  151. import { globalPasswordRex } from "@/util/regex";
  152. // import { encodePwd } from "@/util";
  153. import { getMsgAuthCode } from "@/request";
  154. const emit = defineEmits(["done"]);
  155. const baseFormRef = ref<FormInstance>();
  156. const addPassFlag = ref(false); //图标显示标识
  157. const addPassFlag1 = ref(false); //图标显示标识
  158. let checkCodeBtn = reactive<any>({
  159. text: "获取验证码",
  160. loading: false,
  161. disabled: false,
  162. duration: 60,
  163. timer: null,
  164. });
  165. const equalToPassword = (_, value: any, callback: any) => {
  166. if (form.password !== value) {
  167. callback(new Error("两次输入的密码不一致"));
  168. } else {
  169. callback();
  170. }
  171. };
  172. const rules = reactive<FormRules>({
  173. orgName: [{ required: true, message: "请选择单位名称", trigger: "select" }],
  174. msgAuthCode: [{ required: true, message: "请输入验证码", trigger: "change" }],
  175. contact: [{ required: true, message: "请输入姓名", trigger: "blur" }],
  176. userName: [
  177. { required: true, message: "请输入手机号码", trigger: "blur" },
  178. {
  179. required: true,
  180. pattern: /^1[3456789]\d{9}$/,
  181. message: "请输入手机号码",
  182. trigger: "blur",
  183. },
  184. ],
  185. password: [
  186. {
  187. required: true,
  188. pattern: globalPasswordRex,
  189. message: "请输入8-16位数字、字母大小写组合",
  190. trigger: "blur",
  191. },
  192. { required: true, min: 8, message: "密码太短!", trigger: "blur" },
  193. ],
  194. confirmPwd: [
  195. {
  196. required: true,
  197. pattern: globalPasswordRex,
  198. message: "请输入8-16位数字、字母大小写组合",
  199. trigger: "blur",
  200. },
  201. { required: true, min: 8, message: "密码太短!", trigger: "blur" },
  202. { required: true, validator: equalToPassword, trigger: "blur" },
  203. ],
  204. });
  205. const form = reactive({
  206. orgName: "",
  207. type: "",
  208. userName: "",
  209. password: "",
  210. contact: "",
  211. confirmPwd: "",
  212. msgAuthCode: "",
  213. });
  214. const getCheckCode = async () => {
  215. // 倒计时期间按钮不能单击
  216. await unref(baseFormRef)?.validateField("userName");
  217. const phoneNum = form.userName;
  218. console.log("getMsgCode", phoneNum);
  219. const res = await getMsgAuthCode("+86", phoneNum);
  220. if (res.success) {
  221. ElMessage.success(res.data);
  222. }
  223. if (checkCodeBtn.duration == 60) {
  224. checkCodeBtn.disabled = true;
  225. }
  226. // 清除掉定时器
  227. checkCodeBtn.timer && clearInterval(checkCodeBtn.timer);
  228. // 开启定时器
  229. checkCodeBtn.timer = setInterval(() => {
  230. const tmp = checkCodeBtn.duration--;
  231. checkCodeBtn.text = `${tmp}秒`;
  232. if (tmp <= 0) {
  233. // 清除掉定时器
  234. clearInterval(checkCodeBtn.timer);
  235. checkCodeBtn.duration = 60;
  236. checkCodeBtn.text = "重新获取";
  237. // 设置按钮可以单击
  238. checkCodeBtn.disabled = false;
  239. }
  240. console.info(checkCodeBtn.duration);
  241. }, 1000);
  242. };
  243. const submitClick = async () => {
  244. if (unref(baseFormRef)) {
  245. const res = await unref(baseFormRef)?.validate();
  246. if (res) {
  247. const result = await registerOrganization(form);
  248. console.log("result", result);
  249. emit("done");
  250. // ElMessage.success('新增成功!');
  251. }
  252. } else {
  253. throw "";
  254. }
  255. };
  256. </script>
  257. <style lang="scss" scoped>
  258. .register {
  259. padding: 10px 0;
  260. .panel {
  261. width: 430px;
  262. }
  263. .panel-form-item {
  264. padding-left: 0;
  265. padding-right: 0;
  266. }
  267. h2 {
  268. padding-left: 0;
  269. margin-bottom: 0;
  270. }
  271. .desc {
  272. color: #93795d;
  273. display: block;
  274. margin-bottom: 20px;
  275. }
  276. :deep(.panel-form-item .el-form-item__label) {
  277. line-height: 40px;
  278. font-size: 16px;
  279. min-width: 90px;
  280. }
  281. :deep(.el-form-item__error) {
  282. font-size: 14px;
  283. }
  284. :deep(.el-select) {
  285. width: 100%;
  286. height: 42px;
  287. line-height: 42px;
  288. .el-select__wrapper {
  289. height: 100%;
  290. font-size: 1.14rem;
  291. }
  292. }
  293. .msgcode {
  294. position: relative;
  295. }
  296. .getMsgAuthCode {
  297. border: 1px solid #93795d;
  298. background: rgba(147, 121, 93, 0.05);
  299. font-size: 14px;
  300. position: absolute;
  301. right: 5px;
  302. top: 5px;
  303. height: 32px;
  304. line-height: 32px;
  305. }
  306. .fill {
  307. width: 100%;
  308. }
  309. }
  310. </style>
  311. <style>
  312. .register-select-option {
  313. font-size: 1.14rem;
  314. min-height: 50px;
  315. line-height: 50px;
  316. /* padding: 5px 0; */
  317. }
  318. .el-form-item__label:before {
  319. display: none;
  320. }
  321. </style>