login.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <template>
  2. <div class="login-box">
  3. <div class="login-tabs">
  4. <div class="login-tab" :class="{'is-active': !type || type === 'codeLogin'}" @click="toOtherLogin('')">{{$t('login.userLogin')}}</div><div class="login-tab" :class="{'is-active': type==='camera'}" @click="toOtherLogin('camera')">{{$t('login.cameraLogin')}}</div>
  5. </div>
  6. <div class="account-login" v-if="!type">
  7. <input type="text" oninput="value=value.replace(/[^\d]/g,'')" maxlength="11" class="input" :placeholder="isInternational? $t('login.emailPlaceholder') : $t('login.phonePlaceholder')" v-model="form.phone">
  8. <div class="password-w">
  9. <input maxLength="16" :type="showPassword ? 'test' : 'password'" class="input password" :placeholder="$t('login.passwordPlaceholder')" v-model="form.password" @keyup.enter="login">
  10. <h-icon :type="showPassword ? 'mimakejian' : 'mimabukejian'" class="password-visible" @click="showPassword=!showPassword" />
  11. </div>
  12. <div class="toCodeLogin tips-tap" >
  13. <a @click="$router.push({name: 'login', query: {type: 'codeLogin'}})">{{$t('login.codeLogin')}}</a>
  14. </div>
  15. <div class="checkbox"><input type="checkbox" v-model="rememberMe" id="rember" /><label for="rember">{{$t('login.rememberPassword')}}</label></div>
  16. <div class="login-btn" @click="login" >{{$t('login.login')}}</div>
  17. <div class="others">
  18. <a class="other-actions" @click="$router.push('/login/forget')">{{ $t('login.forgetPassword') }}</a>
  19. <a class="other-actions" @click="$router.push('/login/register')">{{ $t('login.registerAccount') }}</a>
  20. </div>
  21. </div>
  22. <cameraLogin v-if="type === 'camera'" />
  23. <codeLogin v-if="type === 'codeLogin'" />
  24. </div>
  25. </template>
  26. <script>
  27. import cameraLogin from './cameraLogin'
  28. import codeLogin from './codeLogin'
  29. import { encodeStr } from '@/util'
  30. import { Base64 } from 'js-base64'
  31. import { mapState } from 'vuex'
  32. export default {
  33. data () {
  34. let remember = localStorage.getItem('remember') || false
  35. let username = localStorage.getItem('username')
  36. let password = localStorage.getItem('password')
  37. return {
  38. showPassword: false,
  39. rememberMe: remember,
  40. form: {
  41. phone: username,
  42. password: password
  43. }
  44. }
  45. },
  46. computed: {
  47. ...mapState({
  48. language: state => state.language.current,
  49. langToast: state => state.language.home.toast,
  50. isInternational: state => state.user.isInternational
  51. }),
  52. type () {
  53. return this.$route.query.type
  54. }
  55. },
  56. components: {
  57. cameraLogin,
  58. codeLogin
  59. },
  60. mounted () {
  61. this.rememberMe = eval(localStorage.getItem('remember')) || ''
  62. },
  63. methods: {
  64. toOtherLogin (type) {
  65. this.$router.push({
  66. url: '/login',
  67. query: {
  68. type: type
  69. }
  70. })
  71. },
  72. async login () {
  73. let check = value => {
  74. for (let i = 0, len = value.length; i < len; i++) {
  75. if (!value[i].val) {
  76. this.$toast.show('warn', (this.language === 'en' ? value[i].En : value[i].name) + this.langToast['7'])
  77. return
  78. }
  79. }
  80. return true
  81. }
  82. let checkStr = [
  83. {
  84. name: '手机',
  85. En: 'Phone number',
  86. val: this.form.phone
  87. },
  88. {
  89. name: '密码',
  90. En: 'Password',
  91. val: this.form.password
  92. }
  93. ]
  94. if (!check(checkStr)) {
  95. return
  96. }
  97. localStorage.setItem('remember', this.rememberMe)
  98. if (this.rememberMe) {
  99. localStorage.setItem('username', this.form.phone)
  100. localStorage.setItem('password', this.form.password)
  101. } else {
  102. localStorage.setItem('username', '')
  103. localStorage.setItem('password', '')
  104. }
  105. let params = {
  106. phoneNum: this.form.phone,
  107. password: encodeStr(Base64.encode(this.form.password)),
  108. randomcode: '1234',
  109. rememberMe: Boolean(this.rememberMe)
  110. }
  111. try {
  112. let res = await this.$store.dispatch('login', params)
  113. if (!res) {
  114. return
  115. }
  116. const from = this.$route.query.from
  117. // if (from) {
  118. // this.$router.push(from)
  119. // } else {
  120. // this.$router.push('/information')
  121. // }
  122. this.$router.push('/information')
  123. } catch (err) {
  124. }
  125. }
  126. }
  127. }
  128. </script>
  129. <style lang="scss" >
  130. .login-box {
  131. width: 398px;
  132. padding: 38px 0;
  133. input[type=text] {
  134. height: 60px;
  135. line-height: 60px;
  136. padding-left: 8px;
  137. border: 1px solid #909090;
  138. border-radius: 3px;
  139. }
  140. }
  141. .login-tabs {
  142. padding: 0 38px;
  143. }
  144. .login-tab {
  145. display: inline-block;
  146. width: 50%;
  147. font-size: 20px;
  148. text-align: center;
  149. padding-bottom: 10px;
  150. border-bottom: 1px solid #707070;
  151. margin-bottom: 38px;
  152. cursor: pointer;
  153. &.is-active {
  154. border-bottom: 2px solid #1FE4DC;
  155. padding-bottom: 9px;
  156. }
  157. }
  158. .account-login {
  159. padding: 0 38px;
  160. }
  161. .password-w {
  162. position: relative;
  163. margin: 29px 0 13px;
  164. .password-visible {
  165. position: absolute;
  166. right: 20px;
  167. font-size: 30px;
  168. line-height: 60px;
  169. cursor: pointer;
  170. top: 0;
  171. }
  172. }
  173. .password {
  174. }
  175. .toCodeLogin {
  176. text-align: right;
  177. a {
  178. cursor: pointer;
  179. }
  180. }
  181. .checkbox {
  182. // padding-left: 27px;
  183. position: relative;
  184. font-size: 16px;
  185. color: #202020;
  186. display: flex;
  187. align-items: center;
  188. line-height: 18px;
  189. input {
  190. margin-right: 7px;
  191. cursor: pointer;
  192. }
  193. }
  194. .login-btn {
  195. margin: 36px 0 18px;
  196. background: #1FE4DC;
  197. width: 100%;
  198. text-align: center;
  199. line-height: 60px;
  200. font-weight: 600;
  201. border-radius: 3px;
  202. cursor: pointer;
  203. }
  204. .others {
  205. text-align: center;
  206. }
  207. .other-actions {
  208. color: #202020;
  209. font-size: 16px;
  210. &:first-child {
  211. margin-right: 34px;
  212. position: relative;
  213. &::after {
  214. content: '';
  215. height: 14px;
  216. width: 1px;
  217. background: #909090;
  218. position: absolute;
  219. right: -18px;
  220. top: 50%;
  221. margin-top: -7px;
  222. }
  223. }
  224. }
  225. </style>