当前位置: 首页 > news >正文

十八、Javaweb-day18-前端实战-登录

十八、Javaweb-day18-前端实战-登录

  • 十八、Javaweb-day18-前端实战-登录
    • 18.1 登录
    • 18.2 退出
    • 18.3 打包部署

黑马在线讲义:https://heuqqdmbyk.feishu.cn/wiki/SE5owqapKiXSySkrHduchs4ynac

十八、Javaweb-day18-前端实战-登录

18.1 登录

在这里插入图片描述
查看接口文档:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

主要代码如下:

import axios from 'axios';
import router from '../router';
import { ElMessage } from 'element-plus';const request = axios.create({baseURL: '/api',timeout: 600000
})//axios的响应 response 拦截器
request.interceptors.response.use((response) => { //成功回调return response.data},(error) => { //失败回调if (error.response.status == 401) { // ===为全等(比较类型和值)  ==有隐式类型转换// 提示信息ElMessage.error('登录超时,请重新登录');// 跳转到登录页面router.push('/login');}return Promise.reject(error)}
)//axios的请求 request 拦截器 -- 获取localStorage中的token,在请求头中增加token请求头
request.interceptors.request.use((config) => { // 成功回调// console.log(config);const loginUser = JSON.parse(localStorage.getItem('loginUser'));if (loginUser && loginUser.token) {config.headers.token = loginUser.token;}return config;},(error) => { // 失败回调return Promise.reject(error);}
)export default request

login.js

import request from '@/utils/request';// 登录
export const loginApi = (data) => request.post('/login', data);

login/index.vue

<script setup>
import { ref } from 'vue';
import { loginApi } from '@/api/login';
import { ElMessage, ElMessageBox } from 'element-plus';
import { useRouter } from 'vue-router';const loginForm = ref({ username: '', password: '' });
// 调用useRouter()函数,就可以拿到router实例
const router = useRouter();// 登录
const login = async () => {const result = await loginApi(loginForm.value);if (result.code) { // 成功// 1. 提示信息ElMessage.success('登录成功');// 2. 存储当前登录员工的信息 -- JSON.stringify将对象转成字符串localStorage.setItem('loginUser', JSON.stringify(result.data));// 3. 跳转页面到首页router.push('/index');} else { // 失败ElMessage.error(result.msg);}
}// 重置
const clear = () => {loginForm.value = { username: '', password: ''};
}</script><template><div id="container"><div class="login-form"><el-form label-width="80px"><p class="title">Tlias智能学习辅助系统</p><el-form-item label="用户名" prop="username"><el-input v-model="loginForm.username" placeholder="请输入用户名"></el-input></el-form-item><el-form-item label="密码" prop="password"><el-input type="password" v-model="loginForm.password" placeholder="请输入密码"></el-input></el-form-item><el-form-item><el-button class="button" type="primary" @click="login">登 录</el-button><el-button class="button" type="info" @click="clear">重 置</el-button></el-form-item></el-form></div></div>
</template><style scoped>
#container {padding: 10%;height: 410px;background-image: url('../../assets/bg1.jpg');background-repeat: no-repeat;background-size: cover;
}.login-form {max-width: 400px;padding: 30px;margin: 0 auto;border: 1px solid #e0e0e0;border-radius: 10px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);background-color: white;
}.title {font-size: 30px;font-family: '楷体';text-align: center;margin-bottom: 30px;font-weight: bold;
}.button {margin-top: 30px;width: 120px;
}
</style>

18.2 退出

在这里插入图片描述
layout/index.vue

<script setup>
import { ref, onMounted } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import { useRouter } from 'vue-router';// 当前登录员工
const loginName = ref('');
const router = useRouter();// 钩子函数
onMounted (() => {const loginUser = JSON.parse(localStorage.getItem('loginUser'));if (loginUser && loginUser.name) {loginName.value = loginUser.name;}
})// 退出登录
const logout = () => {ElMessageBox.confirm('您确认退出登录吗?','提示',{confirmButtonText: '确认',cancelButtonText: '取消',type: 'warning',}).then(async () => { // 确认ElMessage.success('退出成功');localStorage.removeItem('loginUser');// 跳转页面-登录router.push('/login');}).catch(() => { // 取消ElMessage.info("您已取消退出");})
}</script><template><div class="common-layout"><el-container><!-- Header 区域 --><el-header class="header"><span class="title">Tlias智能学习辅助系统</span><span class="right_tool"><a href=""><el-icon><EditPen /></el-icon> 修改密码 &nbsp;&nbsp;&nbsp; | &nbsp;&nbsp;&nbsp;</a><a href="javascript:;" @click="logout"><el-icon><SwitchButton /></el-icon> 退出登录 【{{loginName}}</a></span></el-header><el-container><!-- 左侧菜单 --><el-aside width="200px" class="aside"><!-- 左侧菜单栏 --><el-menu router><!-- 首页菜单 --><el-menu-item index="/index"><el-icon><Promotion /></el-icon> 首页</el-menu-item><!-- 班级管理菜单 --><el-sub-menu index="/manage"><template #title><el-icon><Menu /></el-icon> 班级学员管理</template><el-menu-item index="/clazz"><el-icon><HomeFilled /></el-icon>班级管理</el-menu-item><el-menu-item index="/stu"><el-icon><UserFilled /></el-icon>学员管理</el-menu-item></el-sub-menu><!-- 系统信息管理 --><el-sub-menu index="/system"><template #title><el-icon><Tools /></el-icon>系统信息管理</template><el-menu-item index="/dept"><el-icon><HelpFilled /></el-icon>部门管理</el-menu-item><el-menu-item index="/emp"><el-icon><Avatar /></el-icon>员工管理</el-menu-item></el-sub-menu><!-- 数据统计管理 --><el-sub-menu index="/report"><template #title><el-icon><Histogram /></el-icon>数据统计管理</template><el-menu-item index="/empReport"><el-icon><InfoFilled /></el-icon>员工信息统计</el-menu-item><el-menu-item index="/stuReport"><el-icon><Share /></el-icon>学员信息统计</el-menu-item><el-menu-item index="/log"><el-icon><Document /></el-icon>日志信息统计</el-menu-item></el-sub-menu></el-menu></el-aside><el-main><router-view></router-view></el-main></el-container></el-container></div></template><style scoped>
.header {background-image: linear-gradient(to right, #00547d, #007fa4, #00aaa0, #00d072, #a8eb12);
}.title {color: white;font-size: 40px;font-family: 楷体;line-height: 60px;font-weight: bolder;
}.right_tool{float: right;line-height: 60px;
}a {color: white;text-decoration: none;
}.aside {width: 220px;border-right: 1px solid #ccc;height: 730px;
}
</style>

在这里插入图片描述
在这里插入图片描述

18.3 打包部署

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改配置文件config以后可以使用命令reload重新加载,stop可以停止nginx服务
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/608836.html

相关文章:

  • 《前端无障碍设计的深层逻辑与实践路径》
  • 【openlayers框架学习】十一:openlayers实战功能介绍与前端设计
  • K8S几种常见CNI深入比较
  • 企业自动化交互体系的技术架构与实现:从智能回复到自动评论—仙盟创梦IDE
  • ThinkPHP8学习篇(一):安装与配置
  • Go语言--语法基础7--函数定义与调用--自定义函数
  • Mysql深入学习:慢sql执行
  • Docker 国内可用镜像
  • ABP VNext + Quartz.NET vs Hangfire:灵活调度与任务管理
  • [嵌入式embed]C51单片机STC-ISP提示:正在检测目标单片机
  • 深度学习(鱼书)day10--与学习相关的技巧(后两节)
  • LWIP从FreeRTOS到uC/OS-III的适配性改动
  • 第六章第三节 TIM 输出比较
  • 关于Web前端安全防御之安全头配置
  • 位运算在权限授权中的应用及Vue3实践
  • 深入理解Java中String.intern()方法:从原理到并发控制实践
  • ElementUI常用的组件展示
  • 高质量数据集|大模型技术正从根本上改变传统数据工程的工作模式
  • Android 之 串口通信
  • zookeeper分布式锁 -- 读锁和写锁实现方式
  • 【Android】RecyclerView循环视图(2)——动态加载数据
  • 【C 学习】04-了解变量
  • 《volatile 与 synchronized 底层实现与性能比较》
  • 【OD机试题解法笔记】文件缓存系统
  • linux 扩展未分配的磁盘空间到home下
  • 【从零开始速通C语言1】 - 汇编语言1
  • RAG 知识库实战指南:基于 Spring AI 构建 AI 知识问答应用
  • 第N个泰波那契数
  • Coze 打通飞书多维表格,实现数据增删改查操作实战详解
  • 机器学习sklearn:支持向量机svm