register.vue 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. <template>
  2. <div class="register">
  3. <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form">
  4. <h3 class="title">国家账羚羊财务平台</h3>
  5. <el-form-item prop="phonenumber">
  6. <el-input v-model="registerForm.phonenumber" type="text" size="large" auto-complete="off" placeholder="手机号">
  7. <template #prefix>
  8. <svg-icon icon-class="phone" class="el-input__icon input-icon" />
  9. </template>
  10. </el-input>
  11. </el-form-item>
  12. <el-form-item prop="username">
  13. <el-input v-model="registerForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
  14. <template #prefix>
  15. <svg-icon icon-class="user" class="el-input__icon input-icon" />
  16. </template>
  17. </el-input>
  18. </el-form-item>
  19. <el-form-item prop="password">
  20. <el-input v-model="registerForm.password" type="password" size="large" auto-complete="off" placeholder="请输入密码" @keyup.enter="handleRegister">
  21. <template #prefix>
  22. <svg-icon icon-class="password" class="el-input__icon input-icon" />
  23. </template>
  24. </el-input>
  25. </el-form-item>
  26. <el-form-item prop="confirmPassword">
  27. <el-input v-model="registerForm.confirmPassword" type="password" size="large" auto-complete="off" placeholder="请确认密码" @keyup.enter="handleRegister">
  28. <template #prefix>
  29. <svg-icon icon-class="password" class="el-input__icon input-icon" />
  30. </template>
  31. </el-input>
  32. </el-form-item>
  33. <el-form-item prop="companyName">
  34. <el-input v-model="registerForm.companyName" type="text" size="large" auto-complete="off" placeholder="企业名称" @keyup.enter="handleRegister">
  35. <template #prefix>
  36. <svg-icon icon-class="build" class="el-input__icon input-icon" />
  37. </template>
  38. </el-input>
  39. </el-form-item>
  40. <el-form-item prop="creditCode">
  41. <el-input v-model="registerForm.creditCode" type="text" size="large" auto-complete="off" placeholder="统一社会信用编码" @keyup.enter="handleRegister">
  42. <template #prefix>
  43. <svg-icon icon-class="online" class="el-input__icon input-icon" />
  44. </template>
  45. </el-input>
  46. </el-form-item>
  47. <el-form-item prop="role">
  48. <el-radio-group v-model="registerForm.role">
  49. <el-radio label="6" border>发单方</el-radio>
  50. <el-radio label="7" border>供应商</el-radio>
  51. </el-radio-group>
  52. </el-form-item>
  53. <el-form-item prop="code" v-if="captchaEnabled">
  54. <el-input size="large" v-model="registerForm.code" auto-complete="off" placeholder="验证码" style="width: 63%" @keyup.enter="handleRegister">
  55. <template #prefix>
  56. <svg-icon icon-class="validCode" class="el-input__icon input-icon" />
  57. </template>
  58. </el-input>
  59. <div class="register-code">
  60. <el-button :disabled="isDisabled" style="margin-left:5px;padding-top: 18px;padding-bottom: 18px;" plain :type="isDisabled?'info':'primary'" @click="sendVerifyCode">{{content}}</el-button>
  61. </div>
  62. </el-form-item>
  63. <el-form-item style="width:100%;">
  64. <el-button :loading="loading" size="large" type="primary" style="width:100%;" @click.prevent="handleRegister">
  65. <span v-if="!loading">注 册</span>
  66. <span v-else>注 册 中...</span>
  67. </el-button>
  68. <div style="float: right;">
  69. <router-link class="link-type" :to="'/login'">使用已有账户登录</router-link>
  70. </div>
  71. </el-form-item>
  72. </el-form>
  73. <!-- 底部 -->
  74. <div class="el-register-footer">
  75. <span>Copyright © 2023-2024 账羚羊 All Rights Reserved.</span>
  76. </div>
  77. </div>
  78. </template>
  79. <script setup>
  80. import { ElMessageBox } from 'element-plus'
  81. import { register } from '@/api/login'
  82. import { ref } from '@vue/reactivity'
  83. import { sendSms } from '@/api/tool/sms'
  84. const router = useRouter()
  85. const { proxy } = getCurrentInstance()
  86. const isDisabled = ref(false)
  87. const count = ref(null)
  88. const timer = ref(null)
  89. const content = ref('获取短信验证码')
  90. const phoneReg = /^((1[0-9][0-9])|(15[^4,\D])|(14[57])|(17[0])|(17[7])|(18[0,0-9]))\d{8}$/
  91. const registerForm = ref({
  92. username: '',
  93. password: '',
  94. phonenumber: '',
  95. confirmPassword: '',
  96. companyName: '',
  97. creditCode: '',
  98. role: '2',
  99. code: '',
  100. uuid: ''
  101. })
  102. const equalToPassword = (rule, value, callback) => {
  103. if (registerForm.value.password !== value) {
  104. callback(new Error('两次输入的密码不一致'))
  105. } else {
  106. callback()
  107. }
  108. }
  109. const isCreditCode = async (rule, value, callback) => {
  110. const reg = /^([0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}|[1-9]\d{14})$/
  111. if (!reg.test(value)) {
  112. callback(new Error('统一社会信用编码格式不正确!'))
  113. } else {
  114. callback()
  115. }
  116. }
  117. const isPhoneNumber = async (rule, value, callback) => {
  118. if (!phoneReg.test(value)) {
  119. callback(new Error('请输入正确的手机号!'))
  120. } else {
  121. callback()
  122. }
  123. }
  124. const registerRules = {
  125. username: [
  126. { required: true, trigger: 'blur', message: '请输入您的账号' },
  127. { min: 2, max: 20, message: '用户账号长度必须介于 2 和 20 之间', trigger: 'blur' }
  128. ],
  129. password: [
  130. { required: true, trigger: 'blur', message: '请输入您的密码' },
  131. { min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
  132. ],
  133. confirmPassword: [
  134. { required: true, trigger: 'blur', message: '请再次输入您的密码' },
  135. { required: true, validator: equalToPassword, trigger: 'blur' }
  136. ],
  137. companyName: [{ required: true, trigger: 'blur', message: '企业名称为必填项' }],
  138. creditCode: [
  139. { required: true, trigger: 'blur', message: '统一社会信用编码为必填项' },
  140. { required: true, validator: isCreditCode, trigger: 'blur' }
  141. ],
  142. phonenumber: [
  143. { required: true, trigger: 'blur', message: '手机号为必填项' },
  144. { required: true, validator: isPhoneNumber, trigger: 'blur' }
  145. ],
  146. code: [{ required: true, trigger: 'change', message: '请输入验证码' }]
  147. }
  148. const codeUrl = ref('')
  149. const loading = ref(false)
  150. const captchaEnabled = ref(true)
  151. function handleRegister() {
  152. proxy.$refs.registerRef.validate((valid) => {
  153. if (valid) {
  154. loading.value = true
  155. register(registerForm.value)
  156. .then((res) => {
  157. const username = registerForm.value.username
  158. ElMessageBox.alert("<font color='red'>恭喜你,您的账号 " + username + ' 注册成功!</font>', '系统提示', {
  159. dangerouslyUseHTMLString: true,
  160. type: 'success'
  161. })
  162. .then(() => {
  163. router.push('/login')
  164. })
  165. .catch(() => {})
  166. })
  167. .catch(() => {
  168. loading.value = false
  169. })
  170. }
  171. })
  172. }
  173. function sendVerifyCode() {
  174. if (phoneReg.test(registerForm.value.phonenumber)) {
  175. sendSms(registerForm.value).then((res) => {
  176. if (res.code === 200) {
  177. const TIME_COUNT = 60
  178. count.value = 60
  179. timer.value = window.setInterval(() => {
  180. if (count.value > 0 && count.value <= TIME_COUNT) {
  181. // 倒计时时不可点击
  182. isDisabled.value = true
  183. // 计时秒数
  184. count.value--
  185. // 更新按钮的文字内容
  186. content.value = count.value + 's后重新获取'
  187. } else {
  188. // 倒计时完,可点击
  189. isDisabled.value = false
  190. // 更新按钮文字内容
  191. content.value = '获取短信验证码'
  192. // 清空定时器!!!
  193. clearInterval(timer.value)
  194. timer.value = null
  195. }
  196. }, 1000)
  197. } else {
  198. proxy.$modal.msgWarning('请勿频繁地获取验证码')
  199. }
  200. })
  201. } else {
  202. proxy.$modal.msgError('请输入正确的手机号')
  203. }
  204. }
  205. </script>
  206. <style lang='scss' scoped>
  207. .register {
  208. display: flex;
  209. justify-content: center;
  210. align-items: center;
  211. height: 100%;
  212. background-image: url('../assets/images/login-background.png');
  213. background-size: cover;
  214. }
  215. .title {
  216. margin: 0px auto 30px auto;
  217. text-align: center;
  218. color: #707070;
  219. }
  220. .register-form {
  221. border-radius: 6px;
  222. background: #ffffff;
  223. width: 400px;
  224. padding: 25px 25px 5px 25px;
  225. .el-input {
  226. height: 40px;
  227. input {
  228. height: 40px;
  229. }
  230. }
  231. .input-icon {
  232. height: 39px;
  233. width: 14px;
  234. margin-left: 0px;
  235. }
  236. }
  237. .register-tip {
  238. font-size: 13px;
  239. text-align: center;
  240. color: #bfbfbf;
  241. }
  242. .register-code {
  243. width: 33%;
  244. height: 40px;
  245. float: right;
  246. img {
  247. cursor: pointer;
  248. vertical-align: middle;
  249. }
  250. }
  251. .el-register-footer {
  252. height: 40px;
  253. line-height: 40px;
  254. position: fixed;
  255. bottom: 0;
  256. width: 100%;
  257. text-align: center;
  258. color: #fff;
  259. font-family: Arial;
  260. font-size: 12px;
  261. letter-spacing: 1px;
  262. }
  263. .register-code-img {
  264. height: 40px;
  265. padding-left: 12px;
  266. }
  267. </style>