register.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <template>
  2. <div class="container">
  3. <n-form ref="formRef" label-placement="left" :label-width="160" :model="form" :rules="rules" size="large" require-mark-placement="left">
  4. <n-form-item :label="t('common.register.username')+':'" path="loginCode">
  5. <n-input v-model:value="form.loginCode" :placeholder="t('common.register.usernameTip')" />
  6. </n-form-item>
  7. <n-form-item :label="t('common.register.password')+':'" path="password">
  8. <n-input v-model:value="form.password" @input="handlePasswordInput" type="password" show-password-on="click" :placeholder="t('common.register.passwordTip')" />
  9. </n-form-item>
  10. <n-form-item :label="t('common.register.confirmPassword')+':'" path="confirmNewPassword" ref="confirmPasswordRef">
  11. <n-input v-model:value="form.confirmNewPassword" type="password" show-password-on="click" :placeholder="t('common.register.confirmPasswordTip')" />
  12. </n-form-item>
  13. <n-form-item :label="t('common.register.companyName')+':'" path="companyName">
  14. <n-input v-model:value="form.companyName" :placeholder="t('common.register.companyNameTip')" />
  15. </n-form-item>
  16. <n-form-item :label="t('common.register.companyPosition')+':'" path="addr">
  17. <n-input v-model:value="form.addr" :placeholder="t('common.register.positionTip')" />
  18. </n-form-item>
  19. <n-form-item :label="t('common.register.email')+':'" path="email">
  20. <n-input v-model:value="form.email" :placeholder="t('common.register.emailTip')" />
  21. </n-form-item>
  22. <n-form-item :label="t('common.register.contactPerson')+':'" path="name">
  23. <n-input v-model:value="form.name" :placeholder="t('common.register.contactPersonTip')" />
  24. </n-form-item>
  25. <n-form-item :label="t('common.register.phone')+':'" path="contact">
  26. <n-input v-model:value="form.contact" :placeholder="t('common.register.phoneTip')" />
  27. </n-form-item>
  28. <!-- <n-form-item label="描述:" path="demand">
  29. <n-input
  30. v-model:value="form.demand"
  31. type="textarea"
  32. placeholder="请输入描述"
  33. />
  34. </n-form-item> -->
  35. </n-form>
  36. <n-button class="login-btn" attr-type="button" type="info" color="#18A058" :disabled="submitLoading" @click="handleRegister">
  37. {{ submitLoading ? t('common.register.submitting') : t('common.register.submit') }}
  38. </n-button>
  39. </div>
  40. </template>
  41. <script lang="ts" setup>
  42. import { useI18n } from "#imports";
  43. import { createDiscreteApi } from "naive-ui";
  44. import { ref, reactive } from "vue";
  45. import { useUserStore } from "@/store/user";
  46. const emit = defineEmits(["closeSginDialog"]);
  47. const userStore = useUserStore();
  48. const { t, locale, setLocale } = useI18n();
  49. const message = createDiscreteApi(["message"]);
  50. const formRef = ref();
  51. const submitLoading = ref(false);
  52. const confirmPasswordRef = ref();
  53. const form: register = reactive({
  54. loginCode: "",
  55. password: "",
  56. confirmNewPassword: "",
  57. name: "",
  58. contact: "",
  59. email: "",
  60. companyName: "",
  61. // demand: "",
  62. addr: "",
  63. });
  64. const confirmPasswordValidate = (
  65. rule: FormItemRule,
  66. value: string
  67. ): boolean => {
  68. return value && value == form.password;
  69. };
  70. const rules: FormRules = {
  71. loginCode: [
  72. {
  73. required: true,
  74. message: t("common.register.usernameTip"),
  75. trigger: ["input", "blur"],
  76. },
  77. ],
  78. password: [
  79. {
  80. required: true,
  81. message: t("common.register.passwordTip"),
  82. trigger: ["input", "blur", "password-input"],
  83. },
  84. ],
  85. confirmNewPassword: [
  86. {
  87. required: true,
  88. message: t("common.register.confirmPasswordTip"),
  89. trigger: ["input", "blur"],
  90. },
  91. {
  92. required: true,
  93. validator: confirmPasswordValidate,
  94. message: t("common.register.passwordDoNotMatch"),
  95. trigger: ["blur", "password-input"],
  96. },
  97. ],
  98. email: [
  99. {
  100. required: true,
  101. message: t("common.register.emailTip"),
  102. trigger: ["input", "blur"],
  103. },
  104. {
  105. required: true,
  106. validator: (rule: FormItemRule, value: string): boolean => {
  107. return value && isEmail(value);
  108. },
  109. message: t("common.register.emailTip1"),
  110. trigger: ["blur"],
  111. },
  112. ],
  113. name: [
  114. {
  115. required: true,
  116. message: t("common.register.contactPersonTip"),
  117. trigger: ["input", "blur"],
  118. },
  119. ],
  120. contact: [
  121. {
  122. required: true,
  123. message: t("common.register.phoneTip"),
  124. trigger: ["input", "blur"],
  125. },
  126. {
  127. required: true,
  128. validator: (rule: FormItemRule, value: string): boolean => {
  129. return value && isPhoneNumber(value);
  130. },
  131. message: t("common.register.phoneFormat"),
  132. trigger: ["blur", "change"],
  133. },
  134. ],
  135. companyName: [
  136. {
  137. required: true,
  138. message: t("common.register.companyNameTip"),
  139. trigger: ["input", "blur"],
  140. },
  141. ],
  142. // addr: [
  143. // {
  144. // required: true,
  145. // message: "请输入公司职务",
  146. // trigger: ["input", "blur"],
  147. // },
  148. // ],
  149. // demand: [
  150. // {
  151. // required: true,
  152. // message: "请输入需求",
  153. // trigger: ["input", "blur"],
  154. // },
  155. // ],
  156. };
  157. const handlePasswordInput = () => {
  158. if (form.confirmPassword) {
  159. confirmPasswordRef.value?.validate({ trigger: "password-input" });
  160. }
  161. };
  162. const handleRegister = () => {
  163. formRef.value?.validate(async (errors: any) => {
  164. if (!errors) {
  165. submitLoading.value = true;
  166. const params = JSON.parse(JSON.stringify(form));
  167. params.loginCode = encryptByBase64(params.loginCode);
  168. params.password = encryptByBase64(params.password);
  169. params.confirmNewPassword = encryptByBase64(params.confirmNewPassword);
  170. const { code, data } = await register_Api(params);
  171. if (code === 200) {
  172. userStore.setToken(data?.token);
  173. userStore.setUserInfo(data?.user);
  174. message.message.success(t("common.register.success"));
  175. emit("closeSginDialog", "success");
  176. }
  177. submitLoading.value = false;
  178. }
  179. });
  180. };
  181. </script>
  182. <style lang="scss" scoped>
  183. .container {
  184. width: 100%;
  185. padding: 30px 20px;
  186. .login-btn {
  187. display: block;
  188. width: 50%;
  189. height: 50px;
  190. color: #fff;
  191. font-size: 18px;
  192. border-radius: 8px;
  193. margin: 0 auto;
  194. :deep(.n-button__content) {
  195. display: block;
  196. }
  197. }
  198. :deep(input::-ms-reveal) {
  199. display: none;
  200. }
  201. }
  202. </style>