准备工作:项目创建
1、创建maven项目
注意:一定要检查项目编码以及maven仓库配置,jdk配置等
2、导入pom文件
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/>
</parent>
<groupId>com.userlyz</groupId>
<artifactId>reggie_take_out</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.23</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.5</version>
</plugin>
</plugins>
</build>
</project>
3、复制application.yml文件
代码语言:javascript复制server:
port: 8080
spring:
application:
#应用名称 可选
name: reggie_take_out
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/reggie?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
mybatis-plus:
configuration:
#在映射实体或者属性时,将数据库中表名和字段名中的下划线去掉,按照驼峰命名法映射
# 例如 表名address_book 就可以映射到AddressBook类名
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
id-type: ASSIGN_ID
4、创建SpringBoot程序入口
代码语言:javascript复制package com.userlyz.reggie;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@Slf4j
@SpringBootApplication
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class,args);
log.info("项目启动成功");
}
}
运行Boot程序,看是否成功
5、导入前端文件
注意前端文件的位置,在Boot程序中前台默认只能访问resource目录下的static和template文件夹下的文件
6、运行sql语句创建数据库
一、后台登录功能开发
1、前端页面点击登录会发送登录请求:
http://localhost:8080/employee/login
2、实体类和mapper的开发
在entity中导入实体类Employee类;使用mybatis-plus提供的自动生成的mapper
EmployeeMapper.java(interface)
代码语言:javascript复制@Mapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}
EmployeeService.java
代码语言:javascript复制public interface EmployeeService extends IService<Employee> {
}
EmployeeServiceImpl.java
代码语言:javascript复制@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeMapper, Employee> implements EmployeeService {
}
封装返回的结果类R.java
3、Controller
1、登录的具体流程图
2、编码
代码语言:javascript复制public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@PostMapping("/login")//员工登录
public R<Employee> login(HttpServletRequest request, @RequestBody Employee employee){
//将页面提交的密码password进行md5加密处理
String password=employee.getPassword();
password=DigestUtils.md5DigestAsHex(password.getBytes());
System.out.println("加密之后的密码是" password);
//根据页面提交的用户名查询数据库
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Employee::getUsername,employee.getUsername());
Employee emp = employeeService.getOne(queryWrapper);
//如果没有查询在则返回登录失败结果
if(emp==null){
return R.error("用户名不存在,登录失败");
}
//对比密码
if(!password.equals(emp.getPassword())){
return R.error("密码不正确");
}
//查看员工状态,如果为已禁用则返回已禁用结果
if(emp.getStatus()==0){
return R.error("账号已经禁用了");
}
//登录成功,将员工id存入Session并返回登录成功结果
request.getSession().setAttribute("employee",emp.getId());
return R.success(emp);
}
}
二、后台系统退出功能
点击退出按钮,发现是一个图片有一个响应事件地址 : http://localhost:8080/employee/logout
后端代码处理
①在EmployeeController中创建对应的处理方法来接受前端的请求,方式为post
②清理session中的id
③返回结果,是否退出成功
前端代码中:
代码语言:javascript复制methods: {
logout() {
logoutApi().then((res)=>{
if(res.code === 1){
localStorage.removeItem('userInfo')<!--删除浏览器中本地记录中的userInfo(登录成功的用户信息)-->
window.location.href = '/backend/page/login/login.html'<!--删除时候返回登录界面-->
}
})
},
功能测试
三、员工管理模块
完善登录功能
问题:如果用户不登陆,通过连接直接访问系统首页,照样可以正常访问。这种设计是不合理的,我们希望看到的是:登录之后可以访问,如果没有登录就不能访问,并跳转到登录界面 那么如何实现呢? 那就需要使用过滤器或者拦截器,在过滤器中或者拦截器中判断用户是否已经完成登录,如果没有完成登录,则跳转到登录界面
我们使用过滤器进行实现
实现步骤:
① 创建自定义过滤器LoginCheckFilter
②在启动类上加上注解@ServletComponentScan
③完善过滤器的处理逻辑
LoginCheckFilter
代码语言:javascript复制/*
检查用户是否已经完成登录
*/
@WebFilter(filterName = "LoginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter {
//路径匹配,支持通配符
public static final AntPathMatcher PATH_MATCHER=new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
//1、获取本次请求的URI
String requestURI = request.getRequestURI();
//定义不需要处理的请求路径
String[] urls=new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};
//2、判断本次请求是否需要处理
boolean check = check(requestURI, urls);
//3、如果不需要处理则放行
if(check){
log.info("本次请求{}不需要处理",requestURI);
filterChain.doFilter(request,response);
return;
}
//4、判断登录状态,如果已登录,则直接放行
if(request.getSession().getAttribute("employee")!=null){
log.info("用户已登录,用户id为{}",request.getSession().getAttribute("employee"));
filterChain.doFilter(request,response);
return;
}
//5、如果未登录则返回登录结果,通过输出流方式向客户端页面相应数据
//前端有检测在request.js
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
//
//log.info("拦截到请求:{}", request.getRequestURI());
//filterChain.doFilter(request,response);q
return;
}
/**
* 路径匹配,检查本次请求是否需要放行
* @param requestURI
* @param urls
* @return
*/
public boolean check(String requestURI,String[] urls){
for(String url : urls){
boolean match=PATH_MATCHER.match(url,requestURI);
if(match){
return true;
}
}
return false;
}
}