Login.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template>
  2. <div class="login">
  3. <transition name="fade-down" appear>
  4. <div class="login-body">
  5. <div class="body-top">后台管理系统</div>
  6. <div class="body-main">
  7. <!-- 在你想获取的组件上 通过绑定ref来获取该组件实例 -->
  8. <!-- ref="userForm" -->
  9. <el-form
  10. ref="userForm"
  11. label-width="80px"
  12. :model="userForm"
  13. :rules="rules"
  14. >
  15. <el-form-item label="账号" prop="username">
  16. <el-input
  17. prefix-icon="el-icon-user"
  18. placeholder="请输入账号..."
  19. size="mini"
  20. autofocus
  21. v-model="userForm.username"
  22. ></el-input>
  23. </el-form-item>
  24. <el-form-item label="密码" prop="password">
  25. <el-input
  26. prefix-icon="el-icon-key"
  27. type="password"
  28. show-password
  29. placeholder="请输入密码..."
  30. size="mini"
  31. v-model="userForm.password"
  32. ></el-input>
  33. </el-form-item>
  34. <el-form-item :style="{ textAlign: 'right' }">
  35. <el-button type="primary" round size="mini" @click="onLogin"
  36. >登录</el-button
  37. >
  38. </el-form-item>
  39. </el-form>
  40. </div>
  41. </div>
  42. </transition>
  43. </div>
  44. </template>
  45. <script>
  46. import { login } from '../api/system';
  47. export default {
  48. name: 'Login',
  49. data() {
  50. return {
  51. // 添加表单数据对象
  52. userForm: {
  53. // 下面的属性名称 尽量和后台接口对应上
  54. username: 'admin',
  55. password: '123456',
  56. },
  57. rules: {
  58. username: [
  59. { required: true, message: '必须输入账号!', trigger: 'blur' },
  60. ],
  61. password: [
  62. { required: true, message: '必须输入密码!', trigger: 'blur' },
  63. {
  64. min: 3,
  65. max: 16,
  66. message: '录入的密码长度在3-16之间!',
  67. trigger: 'blur',
  68. },
  69. ],
  70. },
  71. };
  72. },
  73. methods: {
  74. async onLogin() {
  75. // $refs属性 存储所有 当前组件通过ref绑定dom对象或者组件实例
  76. // console.log(this.$refs);
  77. // 1 首先验证表单 通过才可以将用户名和密码提交给服务器
  78. let valid = await this.$refs.userForm.validate().catch((err) => false);
  79. console.log(valid);
  80. if (valid) {
  81. // 如果valid == true 表示表单验证通过,然后 发起http请求将账号和密码提交给服务器
  82. // let result = await login(this.userForm);
  83. // 如果服务器返回的数据中code属性值为 200 表示登录成功
  84. // let { code, msg, data } = result.data;
  85. let { code, msg, data } = await login(this.userForm);
  86. // debugger;
  87. this.$message({
  88. showClose: true,
  89. message: msg,
  90. type: 'success',
  91. });
  92. if (code === 200) {
  93. // localStorage只能存储字符串类型
  94. sessionStorage.setItem('token', data.token);
  95. localStorage.setItem('userInfo', JSON.stringify(data.userInfo));
  96. // 将 登录用户信息 存储到Vuex中
  97. this.$store.commit('setUserInfo', data.userInfo);
  98. // 将页面导航到主页
  99. this.$router.push('/dashboard');
  100. this.$store.commit('system/addTab', {
  101. label: '工作台',
  102. name: '01',
  103. url: '/dashboard',
  104. });
  105. }
  106. // console.log(result);
  107. }
  108. },
  109. },
  110. };
  111. </script>
  112. <style lang="css" scoped>
  113. .login {
  114. background-image: url('../assets/bg.jpg');
  115. background-repeat: no-repeat;
  116. box-sizing: border-box;
  117. width: 100%;
  118. height: 100vh;
  119. display: flex;
  120. justify-content: center;
  121. align-items: center;
  122. }
  123. .login .login-body {
  124. width: 400px;
  125. height: 255px;
  126. box-sizing: border-box;
  127. background-color: #ccc;
  128. border-radius: 10px;
  129. padding-top: 20px;
  130. }
  131. .login .login-body .body-top {
  132. color: #333;
  133. font-size: 24px;
  134. font-weight: 700;
  135. text-align: center;
  136. margin-bottom: 20px;
  137. }
  138. .login .login-body .body-main {
  139. padding-right: 36px;
  140. }
  141. .fade-down-enter-active {
  142. animation: fade-down 0.5s ease-in-out;
  143. }
  144. @keyframes fade-down {
  145. from {
  146. transform: translateY(-100px);
  147. opacity: 0;
  148. }
  149. 50% {
  150. transform: scale(1.1);
  151. }
  152. to {
  153. transform: translateY(0px);
  154. opacity: 1;
  155. }
  156. }
  157. </style>