Login.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <template>
  2. <div class="login-page">
  3. <div class="login-box">
  4. <div class="login-header">
  5. <i class="el-icon-monitor"></i>
  6. <span>管理后台</span>
  7. </div>
  8. <p class="login-tip">请使用账号密码登录</p>
  9. <el-form
  10. ref="form"
  11. :model="form"
  12. :rules="rules"
  13. size="medium"
  14. @submit.native.prevent="handleSubmit"
  15. >
  16. <el-form-item prop="username">
  17. <el-input
  18. v-model="form.username"
  19. placeholder="请输入账号"
  20. prefix-icon="el-icon-user"
  21. autocomplete="username"
  22. />
  23. </el-form-item>
  24. <el-form-item prop="password">
  25. <el-input
  26. v-model="form.password"
  27. type="password"
  28. placeholder="请输入密码"
  29. prefix-icon="el-icon-lock"
  30. autocomplete="current-password"
  31. show-password
  32. @keyup.enter.native="handleSubmit"
  33. />
  34. </el-form-item>
  35. <el-form-item>
  36. <el-button
  37. type="primary"
  38. :loading="loading"
  39. class="login-btn"
  40. native-type="submit"
  41. >
  42. 登录
  43. </el-button>
  44. </el-form-item>
  45. </el-form>
  46. <p class="login-hint">演示账号:admin / 123456</p>
  47. </div>
  48. </div>
  49. </template>
  50. <script>
  51. import request from '@/utils/request'
  52. export default {
  53. name: 'Login',
  54. data() {
  55. return {
  56. loading: false,
  57. form: { username: '', password: '' },
  58. rules: {
  59. username: [{ required: true, message: '请输入账号', trigger: 'blur' }],
  60. password: [{ required: true, message: '请输入密码', trigger: 'blur' }]
  61. }
  62. }
  63. },
  64. methods: {
  65. handleSubmit() {
  66. this.$refs.form.validate(async (valid) => {
  67. if (!valid) return
  68. this.loading = true
  69. try {
  70. const res = await request.post('/api/login', this.form)
  71. localStorage.setItem('token', res.data.token)
  72. localStorage.setItem('username', res.data.username)
  73. this.$message.success('登录成功')
  74. const redirect = this.$route.query.redirect || '/'
  75. this.$router.replace(redirect)
  76. } finally {
  77. this.loading = false
  78. }
  79. })
  80. }
  81. }
  82. }
  83. </script>
  84. <style scoped>
  85. .login-page {
  86. height: 100vh;
  87. display: flex;
  88. align-items: center;
  89. justify-content: center;
  90. background: linear-gradient(135deg, #304156 0%, #1f2d3d 100%);
  91. }
  92. .login-box {
  93. width: 380px;
  94. padding: 36px 32px 24px;
  95. background: #fff;
  96. border-radius: 8px;
  97. box-shadow: 0 6px 24px rgba(0, 0, 0, 0.2);
  98. }
  99. .login-header {
  100. display: flex;
  101. align-items: center;
  102. justify-content: center;
  103. gap: 10px;
  104. color: #304156;
  105. font-size: 22px;
  106. font-weight: bold;
  107. }
  108. .login-header i { font-size: 26px; }
  109. .login-tip {
  110. margin: 10px 0 24px;
  111. color: #909399;
  112. text-align: center;
  113. font-size: 13px;
  114. }
  115. .login-btn {
  116. width: 100%;
  117. }
  118. .login-hint {
  119. margin: 8px 0 0;
  120. color: #c0c4cc;
  121. text-align: center;
  122. font-size: 12px;
  123. }
  124. </style>