```
feat(layout): 添加退出登录功能
- 在布局组件中添加退出登录按钮
- 实现退出登录逻辑,包括清除本地存储和跳转到登录页
- 添加确认弹窗防止误操作
style(login): 优化登录页面样式响应式设计
- 将固定尺寸改为响应式单位(vw/vh)
- 添加媒体查询适配移动端显示
- 使用clamp函数实现字体大小自适应
- 调整各元素间距和尺寸参数
```
| | |
| | | height: 100%; |
| | | margin: 0; |
| | | padding: 0; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .login-container { |
| | |
| | | align-items: center; |
| | | justify-content: center; |
| | | position: relative; |
| | | width: 100%; |
| | | height: 100%; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | background-image: url("/images/pro-bg.png"); |
| | | background-size: cover; |
| | | background-position: center; |
| | | min-width: 320px; |
| | | min-height: 480px; |
| | | } |
| | | |
| | | .login-weaper { |
| | | display: flex; |
| | | width: 800px; |
| | | width: 90%; |
| | | max-width: 800px; |
| | | min-width: 320px; |
| | | box-shadow: -4px 5px 20px rgba(0, 0, 0, 0.3); |
| | | border-radius: 8px; |
| | | overflow: hidden; |
| | | margin: 20px; |
| | | } |
| | | |
| | | .login-left, |
| | | .login-border { |
| | | min-height: 450px; |
| | | min-height: 400px; |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | |
| | | |
| | | .login-time { |
| | | position: absolute; |
| | | top: 30px; |
| | | left: 30px; |
| | | top: 20px; |
| | | left: 20px; |
| | | color: rgba(255, 255, 255, 0.9); |
| | | font-weight: 300; |
| | | font-size: 16px; |
| | | font-size: clamp(12px, 2vw, 16px); |
| | | } |
| | | |
| | | .login-left .img { |
| | | width: 120px; |
| | | margin-bottom: 20px; |
| | | width: clamp(80px, 25vw, 120px); |
| | | margin-bottom: 15px; |
| | | } |
| | | |
| | | .login-left .title { |
| | | text-align: center; |
| | | color: #fff; |
| | | font-weight: 400; |
| | | letter-spacing: 3px; |
| | | font-size: 22px; |
| | | letter-spacing: 2px; |
| | | font-size: clamp(16px, 4vw, 22px); |
| | | margin: 0; |
| | | } |
| | | |
| | |
| | | border-bottom-right-radius: 8px; |
| | | background-color: #fff; |
| | | width: 55%; |
| | | padding: 40px 30px; |
| | | padding: 30px; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | |
| | | color: #333; |
| | | margin-bottom: 8px; |
| | | font-weight: 500; |
| | | font-size: 20px; |
| | | font-size: clamp(16px, 4vw, 20px); |
| | | text-align: center; |
| | | letter-spacing: 2px; |
| | | } |
| | | |
| | | .login-title-child { |
| | | color: #999; |
| | | margin-bottom: 30px; |
| | | margin-bottom: 25px; |
| | | font-weight: 300; |
| | | font-size: 12px; |
| | | font-size: clamp(10px, 2.5vw, 12px); |
| | | text-align: center; |
| | | letter-spacing: 1px; |
| | | } |
| | |
| | | margin: 0; |
| | | |
| | | .el-form-item { |
| | | margin-bottom: 20px; |
| | | margin-bottom: 18px; |
| | | } |
| | | |
| | | .el-input { |
| | | width: 100%; |
| | | |
| | | input { |
| | | padding: 12px 15px; |
| | | padding: clamp(10px, 3vw, 12px) clamp(12px, 3vw, 15px); |
| | | border: 1px solid #e4e7ed; |
| | | border-radius: 6px; |
| | | font-size: 14px; |
| | | font-size: clamp(12px, 3vw, 14px); |
| | | transition: border-color 0.3s; |
| | | box-sizing: border-box; |
| | | |
| | | &:focus { |
| | | border-color: #409eff; |
| | |
| | | .el-input__prefix { |
| | | i { |
| | | color: #909399; |
| | | font-size: 16px; |
| | | font-size: clamp(14px, 3vw, 16px); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | .login-submit { |
| | | width: 100%; |
| | | height: 42px; |
| | | height: clamp(36px, 8vw, 42px); |
| | | background: linear-gradient(135deg, #409eff 0%, #67b8ff 100%); |
| | | border: none; |
| | | border-radius: 6px; |
| | | font-size: 16px; |
| | | font-size: clamp(14px, 3vw, 16px); |
| | | letter-spacing: 2px; |
| | | color: #fff; |
| | | cursor: pointer; |
| | |
| | | &:active { |
| | | opacity: 0.8; |
| | | } |
| | | } |
| | | |
| | | @media screen and (max-width: 640px) { |
| | | .login-weaper { |
| | | flex-direction: column; |
| | | width: 95%; |
| | | } |
| | | |
| | | .login-left, |
| | | .login-border { |
| | | width: 100%; |
| | | min-height: auto; |
| | | border-radius: 0; |
| | | } |
| | | |
| | | .login-left { |
| | | border-top-left-radius: 8px; |
| | | border-top-right-radius: 8px; |
| | | padding: 25px 20px; |
| | | } |
| | | |
| | | .login-border { |
| | | border-bottom-left-radius: 8px; |
| | | border-bottom-right-radius: 8px; |
| | | padding: 25px 20px; |
| | | } |
| | | |
| | | .login-time { |
| | | position: static; |
| | | margin-bottom: 15px; |
| | | text-align: center; |
| | | } |
| | | } |
| | | |
| | | @media screen and (max-height: 500px) { |
| | | .login-weaper { |
| | | transform: scale(0.9); |
| | | } |
| | | } |
| | | |
| | | @media screen and (max-height: 450px) { |
| | | .login-weaper { |
| | | transform: scale(0.85); |
| | | } |
| | | } |
| | |
| | | --> |
| | | <template> |
| | | <div class="wrapper"> |
| | | <div class="logout-btn" @click="handleLogout"> |
| | | <i class="el-icon-logout"></i> |
| | | <span>退出登录</span> |
| | | </div> |
| | | <map-box ref="modalForm" :curMap="curMap" @getsearchSKValList="getsearchSKValList($event)"> |
| | | <!-- 主体内容区域 --> |
| | | <div slot="mainContent" class="main-content" id="MainContent"> |
| | |
| | | |
| | | <script> |
| | | import { getSignSituationList, getExamScoreList, getExamList, getLatestExam } from "@/api/home/index" |
| | | import { logout } from "@/api/user" |
| | | |
| | | import { EventBus } from "@/utils/EventBus" |
| | | |
| | |
| | | |
| | | handleVideoClose () { |
| | | this.$store.commit("SET_ISSHOWVIDEODIALOG", false) |
| | | }, |
| | | |
| | | handleLogout () { |
| | | this.$confirm('确定要退出登录吗?', '提示', { |
| | | confirmButtonText: '确定', |
| | | cancelButtonText: '取消', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | logout().then(() => { |
| | | this.$store.commit('SET_TOKEN', '') |
| | | this.$store.commit('SET_USER_INFO', {}) |
| | | localStorage.removeItem('token') |
| | | localStorage.removeItem('userInfo') |
| | | this.$router.push({ path: '/login' }) |
| | | }).catch(() => { |
| | | this.$store.commit('SET_TOKEN', '') |
| | | this.$store.commit('SET_USER_INFO', {}) |
| | | localStorage.removeItem('token') |
| | | localStorage.removeItem('userInfo') |
| | | this.$router.push({ path: '/login' }) |
| | | }) |
| | | }).catch(() => {}) |
| | | } |
| | | } |
| | | } |
| | |
| | | position: relative; |
| | | width: 100vw; |
| | | height: 100vh; |
| | | // border: 1px solid white; |
| | | |
| | | .logout-btn { |
| | | position: fixed; |
| | | top: 20px; |
| | | right: 20px; |
| | | z-index: 9999; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | padding: 10px 20px; |
| | | background: rgba(255, 255, 255, 0.15); |
| | | border: 1px solid rgba(255, 255, 255, 0.3); |
| | | border-radius: 25px; |
| | | color: #fff; |
| | | font-size: 14px; |
| | | cursor: pointer; |
| | | transition: all 0.3s ease; |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.25); |
| | | border-color: rgba(255, 255, 255, 0.5); |
| | | transform: translateY(-2px); |
| | | } |
| | | |
| | | &:active { |
| | | transform: translateY(0); |
| | | } |
| | | |
| | | i { |
| | | font-size: 16px; |
| | | } |
| | | } |
| | | |
| | | #MainContent { |
| | | position: absolute; |