tenant-form.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <template>
  2. <el-form
  3. ref="loginForm"
  4. :rules="loginRules"
  5. :model="loginForm"
  6. class="login-form"
  7. status-icon
  8. label-width="0"
  9. >
  10. <el-form-item prop="company">
  11. <el-input
  12. v-model="loginForm.company"
  13. :placeholder="$t('login.company')"
  14. autocomplete="off"
  15. prefix-icon="iconfont ibps-icon-university"
  16. clearable
  17. @keyup.enter.native="handleRegister"
  18. />
  19. </el-form-item>
  20. <el-form-item prop="companyCode">
  21. <el-input
  22. v-model="loginForm.code"
  23. :placeholder="$t('login.companyCode')"
  24. autocomplete="off"
  25. prefix-icon="iconfont ibps-icon-university"
  26. @keyup.enter.native="handleRegister"
  27. />
  28. </el-form-item>
  29. <el-form-item prop="scale">
  30. <el-select
  31. v-model="loginForm.scale"
  32. placeholder="公司规模"
  33. style="width:100%;"
  34. >
  35. <el-option label="1-50人" value="1-50人" />
  36. <el-option label="51-100人" value="51-100人" />
  37. <el-option label="101-200人" value="101-200人" />
  38. <el-option label="201-500人" value="201-500人" />
  39. <el-option label="501-1000人" value="501-1000人" />
  40. <el-option label="1001及以上" value="1001及以上" />
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item prop="area">
  44. <ibps-address-cascader v-model="area" :data="areaData" level="province" top-val="86" data-type="name" />
  45. </el-form-item>
  46. <el-form-item prop="fullName">
  47. <el-input
  48. v-model="loginForm.fullName"
  49. :placeholder="$t('login.fullName')"
  50. autocomplete="off"
  51. prefix-icon="iconfont ibps-icon-user"
  52. @keyup.enter.native="handleRegister"
  53. />
  54. </el-form-item>
  55. <el-form-item prop="gender">
  56. <el-radio-group v-model="loginForm.gender">
  57. <el-radio label="male">{{ $t('login.gender.male') }}</el-radio>
  58. <el-radio label="female">{{ $t('login.gender.female') }}</el-radio>
  59. </el-radio-group>
  60. </el-form-item>
  61. <el-form-item prop="email">
  62. <el-input v-model="loginForm.email" :placeholder="$t('login.email')" autocomplete="off" prefix-icon="iconfont ibps-icon-envelope" @keyup.enter.native="handleRegister" />
  63. </el-form-item>
  64. <el-form-item prop="mobile">
  65. <el-input v-model="loginForm.mobile" :placeholder="$t('login.mobile')" autocomplete="off" prefix-icon="iconfont ibps-icon-mobile" @keyup.enter.native="handleRegister" />
  66. </el-form-item>
  67. <el-form-item prop="passWd">
  68. <el-input v-model="loginForm.passWd" :type="passwordType" :placeholder="$t('login.password')" prefix-icon="ibps-icon-lock" autocomplete="off" @keyup.enter.native="handleRegister">
  69. <i slot="suffix" :class="passwordType=='password'?'ibps-icon-eye-slash':'ibps-icon-eye'" class=" el-input__icon" @click="showPassword" />
  70. </el-input>
  71. </el-form-item>
  72. <el-form-item prop="validCode">
  73. <el-input v-model="loginForm.validCode" :placeholder="$t('login.code')" autocomplete="off" prefix-icon="iconfont ibps-icon-qrcode" @keyup.enter.native="handleRegister">
  74. <template slot="append"><span :class="[{display:msgKey}]" class="msg-text" @click="handleSend">{{ $t(msgKey?'login.msgScuccess':'login.msgInit',{'time':msgTime}) }}</span></template>
  75. </el-input>
  76. </el-form-item>
  77. <el-form-item>
  78. <el-button type="primary" class="login-submit" @click.native.prevent="handleRegister">{{ $t('login.registration') }}</el-button>
  79. </el-form-item>
  80. <el-form-item>
  81. <el-button plain class="login-submit" @click.native.prevent="handleLogin">{{ $t('login.backLogin') }}</el-button>
  82. </el-form-item>
  83. </el-form>
  84. </template>
  85. <script>
  86. import { validateMobile, validateEmpty } from '@/utils/validate'
  87. import { sendSms } from '@/api/oauth2/user'
  88. import { pca } from 'area-data'
  89. import IbpsAddressCascader from '@/components/ibps-address/cascader'
  90. const MSGTIME = 60 // 时间 60秒
  91. export default {
  92. name: 'codelogin',
  93. components: {
  94. IbpsAddressCascader
  95. },
  96. data() {
  97. const validatePhone = (rule, value, callback) => {
  98. const isMobile = validateMobile(value)
  99. if (!isMobile.result) {
  100. callback(new Error(this.$t('validate.mobile.' + isMobile.msg)))
  101. } else {
  102. callback()
  103. }
  104. }
  105. const validateCode = (rule, value, callback) => {
  106. if (value.length !== 6) {
  107. callback(new Error(this.$t('login.codeLength')))
  108. } else {
  109. callback()
  110. }
  111. }
  112. const validateSpecialCharacters = (rule, value, callback) => {
  113. if (this.$utils.isEmpty(value)) {
  114. return validateEmpty(rule, value, callback)
  115. }
  116. const specialCharacters = /((?=[\x21-\x7e]+)[^A-Za-z0-9])/g
  117. if (specialCharacters.test(value)) {
  118. callback(new Error('请勿携带特殊字符'))
  119. } else {
  120. callback()
  121. }
  122. }
  123. return {
  124. msgTime: MSGTIME,
  125. msgKey: false,
  126. areaData: pca,
  127. passwordType: 'password',
  128. defaultArea: ['广东省', '广州市'],
  129. loginForm: {
  130. company: '',
  131. companyCode: '',
  132. fullName: '',
  133. gender: 'female',
  134. area: '',
  135. mobile: '',
  136. passWd: '',
  137. validCode: ''
  138. },
  139. loginRules: {
  140. fullName: [{ required: true, trigger: 'blur', validator: validateSpecialCharacters }],
  141. company: [{ required: true, trigger: 'blur', validator: validateSpecialCharacters }],
  142. address: [{ required: true, message: this.$t('validate.required') }],
  143. mobile: [{ required: true, trigger: 'blur', validator: validatePhone }],
  144. passWd: [{ required: true, message: this.$t('validate.required') }],
  145. validCode: [{ required: true, trigger: 'change', validator: validateCode }]
  146. }
  147. }
  148. },
  149. computed: {
  150. area: {
  151. get() {
  152. if (this.loginForm.area === '') {
  153. return this.defaultArea
  154. } else {
  155. return this.loginForm.area.split('-')
  156. }
  157. },
  158. set(newValue) {
  159. this.loginForm.area = newValue.join('-')
  160. }
  161. }
  162. },
  163. methods: {
  164. showPassword() {
  165. this.passwordType === ''
  166. ? (this.passwordType = 'password')
  167. : (this.passwordType = '')
  168. },
  169. // 发送验证码
  170. handleSend() {
  171. const isMobile = validateMobile(this.loginForm.mobile)
  172. if (!isMobile.result) {
  173. this.$message.closeAll()
  174. this.$message.error(this.$t('login.mobileCorrect'))
  175. this.$el[5].focus()
  176. return
  177. }
  178. // 真正发送验证码
  179. sendSms({
  180. mobile: this.loginForm.mobile,
  181. forget: false
  182. }).then((data) => {
  183. if (this.msgKey) { return }
  184. this.msgKey = true
  185. const time = setInterval(() => {
  186. this.msgTime--
  187. if (this.msgTime === 0) {
  188. this.msgTime = MSGTIME
  189. this.msgKey = false
  190. clearInterval(time)
  191. }
  192. }, 1000)
  193. }).catch((e) => {
  194. })
  195. },
  196. handleRegister() {
  197. this.$refs.loginForm.validate(valid => {
  198. if (valid) {
  199. this.$store.dispatch('ibps/saas/register', this.loginForm).then(res => {
  200. this.$confirm('注册帐号成功', '提示', {
  201. confirmButtonText: '返回登录',
  202. cancelButtonText: '取消',
  203. type: 'success'
  204. }).then(() => {
  205. this.$router.push({ path: '/login' })
  206. }).catch(() => {
  207. })
  208. })
  209. }
  210. })
  211. },
  212. handleLogin() {
  213. this.$router.push({ path: '/login' })
  214. }
  215. }
  216. }
  217. </script>
  218. <style>
  219. .msg-text {
  220. display: block;
  221. width: 60px;
  222. font-size: 12px;
  223. text-align: center;
  224. cursor: pointer;
  225. }
  226. .msg-text.display {
  227. color: #ccc;
  228. }
  229. </style>