deepchart后台管理系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
5.0 KiB

2 months ago
2 months ago
2 months ago
  1. <template>
  2. <!-- 背景容器 -->
  3. <div class="login-bg">
  4. <!-- 登录表单 -->
  5. <div class="login-form">
  6. <h3>欢迎登录系统</h3>
  7. <el-form :model="loginForm" label-width="0" class="form-item">
  8. <!-- 账号输入框 -->
  9. <el-form-item>
  10. <el-input v-model="loginForm.username" prefix-icon="User" placeholder="请输入登录账号" clearable @input="clearErrorMsg"/>
  11. </el-form-item>
  12. <!-- 密码输入框 -->
  13. <el-form-item>
  14. <el-input v-model="loginForm.password" prefix-icon="Lock" type="password" placeholder="请输入登录密码" clearable @input="clearErrorMsg"/>
  15. </el-form-item>
  16. <!-- 错误提示 -->
  17. <div v-show="errorMsg" class="error-tip fixed-height">{{ errorMsg }}</div>
  18. <div v-show="!errorMsg" class="error-placeholder fixed-height"></div>
  19. <!-- 记住密码复选框 -->
  20. <el-form-item class="remember">
  21. <el-checkbox v-model="loginForm.remember">记住密码</el-checkbox>
  22. </el-form-item>
  23. <!-- 登录按钮 -->
  24. <el-form-item>
  25. <el-button type="primary" style="width: 100%;" @click="handleLogin">
  26. </el-button>
  27. </el-form-item>
  28. </el-form>
  29. </div>
  30. </div>
  31. </template>
  32. <script setup>
  33. import { ref, onMounted } from 'vue';
  34. import { useRouter } from 'vue-router';
  35. import { loginApi } from '../api/userPermissions'
  36. const router = useRouter();
  37. // 表单数据
  38. const loginForm = ref({
  39. username: '',
  40. password: '',
  41. remember: false
  42. });
  43. // 错误提示
  44. const errorMsg = ref('');
  45. // 页面加载时,自动填充“记住的账号密码”
  46. onMounted(() => {
  47. const storedLogin = localStorage.getItem('deepchart_login');
  48. if (storedLogin) {
  49. const { username, password, remember } = JSON.parse(storedLogin);
  50. loginForm.value.username = username;
  51. loginForm.value.password = password;
  52. loginForm.value.remember = remember;
  53. }
  54. });
  55. // 输入时清空错误提示
  56. const clearErrorMsg = () => {
  57. errorMsg.value = '';
  58. };
  59. // 登录逻辑:包含表单校验、消息提醒、记住密码存储
  60. const handleLogin = async() => {
  61. // 先清空之前的错误提示
  62. errorMsg.value = '';
  63. // 校验必填项
  64. if (!loginForm.value.username && !loginForm.value.password) {
  65. errorMsg.value = '请输入账号和密码后再登录';
  66. return;
  67. }
  68. if (!loginForm.value.username) {
  69. errorMsg.value = '账号为必填项,请输入账号';
  70. return;
  71. }
  72. if (!loginForm.value.password) {
  73. errorMsg.value = '密码为必填项,请输入密码';
  74. return;
  75. }
  76. // 登录
  77. try {
  78. const res = await loginApi({
  79. username: Number(loginForm.value.username),
  80. password: loginForm.value.password,
  81. app_from: 'en'
  82. });
  83. const data = res.data;
  84. if (data && data.data.token) {
  85. localStorage.setItem('token', data.data.token);
  86. // “记住密码”存储
  87. if (loginForm.value.remember) {
  88. localStorage.setItem('deepchart_login', JSON.stringify({
  89. username: loginForm.value.username,
  90. password: loginForm.value.password,
  91. remember: true
  92. }));
  93. } else {
  94. localStorage.removeItem('deepchart_login');
  95. }
  96. // 跳转到首页
  97. router.push('/');
  98. } else {
  99. errorMsg.value = '账号或密码有误,请重新输入';
  100. }
  101. } catch (error) {
  102. errorMsg.value = '登录失败,请稍后重试';
  103. console.error('登录请求异常:', error);
  104. }
  105. };
  106. </script>
  107. <style scoped>
  108. /* 背景图全屏样式 */
  109. .login-bg {
  110. background-image: url('../assets/images/login.png');
  111. background-size: cover;
  112. background-position: center;
  113. height: calc(100vh - 16px);
  114. display: flex;
  115. justify-content: center;
  116. align-items: center;
  117. }
  118. /* 表单样式 */
  119. .login-form {
  120. margin-left: 650px;
  121. width: 400px;
  122. padding: 40px 30px;
  123. }
  124. /* 标题样式 */
  125. .login-form h3 {
  126. text-align: center;
  127. margin-bottom: 50px;
  128. color: #2d3748;
  129. font-size: 24px;
  130. font-weight: 600;
  131. }
  132. .form-item {
  133. width: 100%;
  134. }
  135. /* 输入框区域 */
  136. .el-form-item {
  137. margin-bottom: 30px;
  138. }
  139. .el-input {
  140. border-radius: 4px;
  141. border: 1px solid #e5e7eb;
  142. height: 48px;
  143. }
  144. .el-input__inner {
  145. padding: 0 16px;
  146. font-size: 16px;
  147. }
  148. .el-input__placeholder {
  149. font-size: 16px !important;
  150. }
  151. /* 记住密码 */
  152. .remember {
  153. text-align: left;
  154. margin-bottom: 32px;
  155. font-size: 15px;
  156. color: #4b5563;
  157. }
  158. .el-checkbox__label {
  159. font-size: 15px !important;
  160. margin-left: 8px !important;
  161. }
  162. /* 登录按钮 */
  163. .el-button--primary {
  164. height: 52px;
  165. font-size: 18px;
  166. border-radius: 4px;
  167. background-color: #1890ff;
  168. border: none;
  169. }
  170. .el-button--primary:hover {
  171. background-color: #096dd9;
  172. }
  173. /* 图标大小适配 */
  174. .el-input__prefix {
  175. font-size: 18px !important;
  176. }
  177. /* 错误提示 */
  178. .error-tip {
  179. color: #ff4d4f;
  180. font-size: 14px;
  181. font-weight: 700;
  182. text-align: left;
  183. line-height: 1.5;
  184. overflow: hidden;
  185. }
  186. .error-placeholder {
  187. visibility: hidden;
  188. }
  189. .fixed-height {
  190. height: 21px;
  191. margin-bottom: 6px;
  192. }
  193. </style>