Login.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <template>
  2. <div class="login-view">
  3. <div class="login-content">
  4. <el-form class="login-form" :model="loginForm" status-icon :rules="rules" ref="loginForm" label-width="60px"
  5. @keyup.enter.native="submitForm('loginForm')">
  6. <div class="login-brand">登陆盒子IM</div>
  7. <el-form-item label="终端" prop="userName" v-show="false">
  8. <el-input type="terminal" v-model="loginForm.terminal" autocomplete="off"></el-input>
  9. </el-form-item>
  10. <el-form-item label="用户名" prop="userName">
  11. <el-input type="userName" v-model="loginForm.userName" autocomplete="off"
  12. placeholder="用户名"></el-input>
  13. </el-form-item>
  14. <el-form-item label="密码" prop="password">
  15. <el-input type="password" v-model="loginForm.password" autocomplete="off"
  16. placeholder="密码"></el-input>
  17. </el-form-item>
  18. <el-form-item>
  19. <el-button type="primary" @click="submitForm('loginForm')">登陆</el-button>
  20. <el-button @click="resetForm('loginForm')">清空</el-button>
  21. </el-form-item>
  22. <div class="register">
  23. <router-link to="/register">没有账号,前往注册</router-link>
  24. </div>
  25. </el-form>
  26. </div>
  27. <icp></icp>
  28. </div>
  29. </template>
  30. <script>
  31. import Icp from '../components/common/Icp.vue'
  32. export default {
  33. name: "login",
  34. components: {
  35. Icp
  36. },
  37. data() {
  38. var checkUsername = (rule, value, callback) => {
  39. if (!value) {
  40. return callback(new Error('请输入用户名'));
  41. }
  42. callback();
  43. };
  44. var checkPassword = (rule, value, callback) => {
  45. if (value === '') {
  46. callback(new Error('请输入密码'));
  47. }
  48. callback();
  49. };
  50. return {
  51. loginForm: {
  52. terminal: this.$enums.TERMINAL_TYPE.WEB,
  53. userName: '',
  54. password: ''
  55. },
  56. rules: {
  57. userName: [{
  58. validator: checkUsername,
  59. trigger: 'blur'
  60. }],
  61. password: [{
  62. validator: checkPassword,
  63. trigger: 'blur'
  64. }]
  65. }
  66. };
  67. },
  68. methods: {
  69. submitForm(formName) {
  70. this.$refs[formName].validate((valid) => {
  71. if (valid) {
  72. this.$http({
  73. url: "/login",
  74. method: 'post',
  75. data: this.loginForm
  76. })
  77. .then((data) => {
  78. // 保存密码到cookie(不安全)
  79. this.setCookie('username', this.loginForm.userName);
  80. this.setCookie('password', this.loginForm.password);
  81. // 保存token
  82. sessionStorage.setItem("accessToken", data.accessToken);
  83. sessionStorage.setItem("refreshToken", data.refreshToken);
  84. this.$message.success("登陆成功");
  85. this.$router.push("/home/chat");
  86. })
  87. }
  88. });
  89. },
  90. resetForm(formName) {
  91. this.$refs[formName].resetFields();
  92. },
  93. getCookie(name) {
  94. let reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
  95. let arr = document.cookie.match(reg)
  96. if (arr) {
  97. return unescape(arr[2]);
  98. }
  99. return '';
  100. },
  101. setCookie(name, value) {
  102. document.cookie = name + "=" + escape(value);
  103. }
  104. },
  105. mounted() {
  106. this.loginForm.userName = this.getCookie("username");
  107. // cookie存密码并不安全,暂时是为了方便
  108. this.loginForm.password = this.getCookie("password");
  109. }
  110. }
  111. </script>
  112. <style scoped lang="scss">
  113. .login-view {
  114. width: 100%;
  115. height: 100%;
  116. background: #E8F2FF;
  117. background-size: cover;
  118. box-sizing: border-box;
  119. .login-content {
  120. position: relative;
  121. display: flex;
  122. justify-content: space-around;
  123. align-items: center;
  124. padding: 10%;
  125. .login-form {
  126. height: 340px;
  127. width: 400px;
  128. padding: 30px;
  129. background: white;
  130. opacity: 0.9;
  131. box-shadow: 0px 0px 1px #ccc;
  132. border-radius: 3%;
  133. overflow: hidden;
  134. border: 1px solid #ccc;
  135. .login-brand {
  136. line-height: 50px;
  137. margin: 30px 0 40px 0;
  138. font-size: 22px;
  139. font-weight: 600;
  140. letter-spacing: 2px;
  141. text-transform: uppercase;
  142. text-align: center;
  143. }
  144. .register {
  145. display: flex;
  146. flex-direction: row-reverse;
  147. line-height: 40px;
  148. text-align: left;
  149. padding-left: 20px;
  150. }
  151. }
  152. }
  153. }
  154. </style>