SignInForm.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <template>
  2. <el-card class="rpm-sign-in">
  3. <div slot="header" align="center">
  4. <span>登入内业管理系统</span>
  5. </div>
  6. <el-form ref="loginForm" :model="loginForm" :rules="loginRules" label-width="0" class="rpm-sign-in-login">
  7. <el-form-item prop="username">
  8. <el-input
  9. ref="username"
  10. placeholder="输入账号"
  11. type="text"
  12. tabindex="1"
  13. autocomplete="on"
  14. v-model="loginForm.username"
  15. />
  16. <div class="rpm-sign__tip cprimary" >
  17. 仅内部账号使用
  18. </div>
  19. </el-form-item>
  20. <el-form-item prop="password">
  21. <el-input
  22. ref="password"
  23. placeholder="输入密码"
  24. tabindex="2"
  25. :type="passwordType"
  26. autocomplete="new-password"
  27. v-model="loginForm.password"
  28. @keyup.native="checkCapslock"
  29. @blur="capsTooltip = false"
  30. @keyup.enter.native="handleLogin"
  31. >
  32. <i slot="suffix" class="el-icon-view" @click="showPwd"></i>
  33. </el-input>
  34. <div class="rpm-sign-in__tip cdanger" @click="qrcode=true" >
  35. 忘记密码
  36. </div>
  37. </el-form-item>
  38. <el-form-item prop="remember">
  39. <input type="checkbox" v-model="loginForm.remember" />
  40. <label class="ml10">记住密码</label>
  41. </el-form-item>
  42. <el-form-item>
  43. <el-button type="primary" @click.native.prevent="handleLogin">
  44. 登入
  45. </el-button>
  46. </el-form-item>
  47. </el-form>
  48. <el-dialog
  49. title="微信小程序扫码登入"
  50. class="fc tc"
  51. :visible.sync="qrcode"
  52. width="500px"
  53. :append-to-body="true"
  54. @close="qrcode=false"
  55. >
  56. <div class="qrcode">
  57. <img src="../../../assets/qrcode.jpg" />
  58. </div>
  59. </el-dialog>
  60. </el-card>
  61. </template>
  62. <script>
  63. import { validateLoginname, validatePassword } from '@/utils/validate'
  64. import md5 from '@/utils/md5'
  65. import { mapActions } from "vuex";
  66. const Base64 = require("js-base64").Base64;
  67. export default {
  68. name: 'Login',
  69. data() {
  70. return {
  71. visibleForm: 'signIn',
  72. loginForm: {
  73. username: '',
  74. password: '',
  75. remember: false,
  76. },
  77. loginRules: {
  78. username: [{ required: true, trigger: 'blur', validator: validateLoginname }],
  79. password: [{ required: true, trigger: 'blur', validator: validatePassword }]
  80. },
  81. qrcode: false,
  82. passwordType: 'password',
  83. capsTooltip: false,
  84. loading: false,
  85. showDialog: false,
  86. redirect: undefined,
  87. otherQuery: {}
  88. }
  89. },
  90. mounted() {
  91. if (this.loginForm.username === '') {
  92. this.$refs.username.focus()
  93. } else if (this.loginForm.password === '') {
  94. this.$refs.password.focus()
  95. }
  96. },
  97. created(){
  98. this.redirect = this.$route.query.redirect
  99. this.loginForm.username = this.getCookie("username");
  100. let password = this.getCookie("password")
  101. if (password) {
  102. this.loginForm.password = Base64.decode( password );
  103. this.loginForm.remember = true;
  104. }else{
  105. this.loginForm.remember = false;
  106. }
  107. },
  108. methods: {
  109. ...mapActions("user", ["login", "loadDepartment"]),
  110. checkCapslock(e) {
  111. const { key } = e
  112. this.capsTooltip = key && key.length === 1 && (key >= 'A' && key <= 'Z')
  113. },
  114. getCookie: function (key) {
  115. if (document.cookie.length > 0) {
  116. var start = document.cookie.indexOf(key + "=");
  117. if (start !== -1) {
  118. start = start + key.length + 1;
  119. var end = document.cookie.indexOf(";", start);
  120. if (end === -1) end = document.cookie.length;
  121. return unescape(document.cookie.substring(start, end));
  122. }
  123. }
  124. return "";
  125. },
  126. setCookie: function (cName, value, expiredays) {
  127. var exdate = new Date();
  128. exdate.setDate(exdate.getDate() + expiredays);
  129. document.cookie =
  130. cName +
  131. "=" +
  132. decodeURIComponent(value) +
  133. (expiredays == null ? "" : ";expires=" + exdate.toGMTString());
  134. },
  135. showPwd() {
  136. if (this.passwordType === 'password') {
  137. this.passwordType = ''
  138. } else {
  139. this.passwordType = 'password'
  140. }
  141. this.$nextTick(() => {
  142. this.$refs.password.focus()
  143. })
  144. },
  145. handleLogin() {
  146. let remember = this.loginForm.remember
  147. this.$refs.loginForm.validate(valid => {
  148. if (!valid) return;
  149. this.loading = true
  150. let param = { username: this.loginForm.username, password: md5(this.loginForm.password) }
  151. let path = this.redirect || '/';
  152. this.login( param).then(() => {
  153. this.$router.push({ path, query: this.otherQuery })
  154. this.setCookie("username", this.loginForm.username, 30);
  155. if( remember ){
  156. let passWord = Base64.encode(this.loginForm.password);
  157. this.setCookie("password", passWord, 30);
  158. }else{
  159. this.setCookie("password", "", 30);
  160. }
  161. this.loadDepartment()
  162. this.loading = false
  163. }).catch((err) => {
  164. console.log("err", err)
  165. this.loading = false
  166. })
  167. })
  168. }
  169. }
  170. }
  171. </script>
  172. <style lang="scss" scoped>
  173. .el-button {
  174. width: 100% !important;
  175. }
  176. .login-form{
  177. width: 450px;
  178. }
  179. .rpm-sign-in {
  180. position: absolute;
  181. top: 20px;
  182. right: 30px;
  183. width: 350px;
  184. }
  185. .rpm-sign-in__tip {
  186. padding-top: 2px;
  187. padding-bottom: 2px;
  188. cursor: pointer;
  189. display: inline-block;
  190. line-height: 100%;
  191. position: relative;
  192. font-size: 14px;
  193. }
  194. </style>