Springboot各层代码编写

本文以Employee实体为例,介绍了SpringBoot应用的开发流程,包括实体类的定义,数据层接口(DAO)的创建,服务层(Service)的接口与实现,Controller接口的编写,以及Filter过滤层的实现,用于用户登录检查。同时展示了程序启动类的配置,强调了ServletComponentScan注解的重要性。
摘要由CSDN通过智能技术生成


本文章以Employee(员工)实体类为例子

一、实体类

如下例子:

@Data
public class Employee implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String username;
    private String name;
    private String password;
    private String phone;
    private String sex;
    private String idNumber;
    private Integer status;
    @TableField(fill = FieldFill.INSERT)//插入时填充字段
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)//插入和更新时填充字段
    private LocalDateTime updateTime;
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;

二、数据层(dao)

如下例子:

@Mapper
public interface EmployeeDao extends BaseMapper<Employee> {
}

三、服务层(service)

1.编写EmployeeService接口

public interface EmployeeService extends IService<Employee> {
}

2.编写EmployeeServiceImpl实现类

@Service
public class EmployeeServiceImpl extends ServiceImpl<EmployeeDao, Employee> implements EmployeeService {
    
}

四、编写controller(业务层)接口

以下实例包括了员工的登录,退出,添加,删除,禁用等接口

@RestController
@RequestMapping("/employee")
@Slf4j
public class EmployeeController {
    @Autowired
    private EmployeeService employeeService;
    //员工登录
    @PostMapping("/login")
    public R<Employee> login(HttpServletRequest request,@RequestBody Employee employee){
        //1.将页面传过来的密码进行MD5加密
        String password = employee.getPassword();
        password = DigestUtils.md5DigestAsHex(password.getBytes());
        //2.根据username查询数据库
        LambdaQueryWrapper<Employee> lw = new LambdaQueryWrapper<>();
        lw.eq(Employee::getUsername,employee.getUsername());
        Employee emp = employeeService.getOne(lw);
        //3.没有查询到返回登录失败
        if(emp==null){
            return R.error("登录失败!");
        }
        //4.密码比对
        if(!emp.getPassword().equals(password)){
            return R.error("登录失败!");
        }
        //5.查看员工状态是否禁用,如果禁用返回禁用结果
        if(emp.getStatus()==0){
            return R.error("账号已禁用!");
        }
        //6.登录成果,将员工id存储到session中,并返回登录成果结果
        request.getSession().setAttribute("employee",emp.getId());
        return R.success(emp);
    }
    @PostMapping("logout")//员工退出
    public R<String> logout(HttpServletRequest request){
        //清除session中保存的员工id
        request.getSession().removeAttribute("employee");
        return R.success("退出成功!");
    }
    @PostMapping//新增员工
    public R<String> save(HttpServletRequest request,@RequestBody Employee employee){
        System.out.println(employee.toString());
        //设置初始密码123456,进行md5加密
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        //设置当前系统时间
        //employee.setCreateTime(LocalDateTime.now());
        //employee.setUpdateTime(LocalDateTime.now());
        //获得当前用户登录的id
        //Long empId = (Long)request.getSession().getAttribute("employee");
        //employee.setCreateUser(empId);
        //employee.setUpdateUser(empId);
        employeeService.save(employee);
        return R.success("新增员工成功!");
    }
    @GetMapping("/page")//分页查询
    public R<Page> page(int page,int pageSize,String name){
        //构造分页构造器
        Page p1 = new Page(page,pageSize);
        //条件构造器
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper();
        //添加过滤条件
        lqw.like(name!=null,Employee::getName,name);
        //添加排序条件
        lqw.orderByDesc(Employee::getUpdateTime);
        //执行查询
        employeeService.page(p1,lqw);

        return R.success(p1);
    }
    @PutMapping//根据id修改员工信息
    public R<String> update(HttpServletRequest request,@RequestBody Employee employee){
        //这里的id会丢失精度,因为js最多处理16位数字,id有19位,所以需要配置消息转换器,将id转成string返回给页面
        //employee.setUpdateTime(LocalDateTime.now());
        //Long empId = (Long)request.getSession().getAttribute("employee");
        //employee.setUpdateUser(empId);
        long id = Thread.currentThread().getId();
        log.info("线程id为:{}",id);
        employeeService.updateById(employee);
        return R.success("状态修改成功!");
    }
    @GetMapping("/{id}")//根据id查询员工信息
    public R<Employee> getById(@PathVariable Long id){
        Employee emp = employeeService.getById(id);
        if (emp != null) {
            return R.success(emp);
        }
        return R.error("没有查询到该员工信息");
    }
}

五、Filter过滤层

页面拦截代码:

//检查用户是否已经登录
@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.获取本次请求的url
        String requestURI = request.getRequestURI();
        //定义不需要处理的url
        String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};
        //2.判断本次请求是否需要处理
        boolean check = check(urls,requestURI);
        //3.如果不需要处理直接放行
        if (check) {
            filterChain.doFilter(request,response);
            return;
        }
        //4.判断登录状态,登录了直接放行
        if(request.getSession().getAttribute("employee")!=null){
            Long empId = (Long) request.getSession().getAttribute("employee");
            long id = Thread.currentThread().getId();
            BaseContext.setCurrentId(empId);
            log.info("线程id为:{}",id);
            filterChain.doFilter(request,response);
            return;
        }
        //5.如果未登录则返回登录结果,通过输出流的方式向客户端响应数据
        response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        return;

    }
    //检查本次请求是否需要放行
    public boolean check(String[] urls,String requestURI){
        for (String url : urls) {
        	//匹配url是否包含再requestURI路径中
            boolean match = PATH_MATCHER.match(url, requestURI);
            if (match) {
                return true;
            }
        }
        return false;
    }
}

六、程序启动类TestApplication.java

注意:一定要加@ServletComponentScan注解,否则拦截器不生效

@SpringBootApplication
@ServletComponentScan//扫描拦截器,标识开启扫描Servlet组件的功能
public class TestApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class,args);
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝朽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值