学院官网管理系统的后端!SpringBoot整合Mybatis!!

目录

配置层

Controller控制层

1.文章控制层

2.用户控制层

异常控制

拦截器

1.jwt令牌

2.拦截器

映射层

1.文章映射

2.用户信息映射

对象层

1.文章

2.用户

3.为前端传输的信息的封装

4.分页处理信息的封装

服务层

文章服务层

文章实现层

用户服务层

用户实现层

配置文件

这里是我的项目结构

配置层

配置层主要做接口的拦截功能。

package com.example.project.config;

import com.example.project.interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //登录接口不拦截
        registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login");
    }

}

Controller控制层

1.文章控制层

package com.example.project.controller;

import com.example.project.pojo.PageBean;
import com.example.project.pojo.Result;
import com.example.project.pojo.Article;
import com.example.project.service.ArticleService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/article")
public class ArticleController {
     @Autowired
     private ArticleService articleService;
     //获取所有文章信息
     @GetMapping("/list")
    public Result<List<Article>> list(){
        List<Article> list=articleService.getlist();


        return  Result.success(list);
    }
    //添加文章
   @PostMapping
    public  Result add(@RequestBody Article article){
         articleService.add(article);

         return Result.success();
    }

    //获取用户上传的文章
    @GetMapping("/mylist")
    public  Result<List<Article>> mylist(){
         List<Article> list=articleService.getmylist();
         return  Result.success(list);
    }
   //删除用户文章
   //删除用户文章
   @DeleteMapping("/delete")
   public  Result<String> delete(@RequestParam int id){
       articleService.delete(id);
       return Result.success("操作成功");
   }

    @PostMapping("/update")
    public Result<String> update(@RequestBody Article article){
        articleService.update(article);
        return Result.success("操作成功");

    }

    @GetMapping("/page")
    public Result<PageBean<Article>> selectpage(Integer pageNum, Integer pageSize){

        PageBean<Article> data=  articleService.selectpage(pageNum,pageSize);

        return Result.success(data);
    }
    //条件分页查询
    @GetMapping("/mypage")
    public  Result<PageBean<Article>> selectmypage(Integer pageNum, Integer pageSize) {


        PageBean<Article> data = articleService.getmypage(pageNum, pageSize);

        return Result.success(data);
    }

}

2.用户控制层

package com.example.project.controller;



import com.example.project.pojo.Result;
import com.example.project.pojo.User;
import com.example.project.service.UserService;
import com.example.project.utils.JwtUtils;
import com.example.project.utils.ThreadLocalUtil;
import jakarta.validation.constraints.Pattern;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;


import java.util.HashMap;
import java.util.Map;

@RestController
@Validated
@RequestMapping("/user")
//@Validated   //validation spring 提供的校验数据工具  @Pattern(regexp="^\\${}$") 正则表达式
public class UserController {
    @Autowired
    private UserService userService;
   //添加新管理员
    @PostMapping("/register")
    public Result register(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$") String password,@Pattern(regexp = "^\\S$") String name){
        //查询管理员
            User u = userService.findbyusername(username);
            if (u == null) {
                userService.register(username, password,name);
                return  Result.success();

            } else {
               return Result.error("用户名已被占用");
            }
        }
        //获取用户信息
        @GetMapping ("/userInfo")
        public Result<User> userinfo(){

            Map<String,Object> map= ThreadLocalUtil.get();
            String username =(String) map.get("username");
            User u=userService.findbyusername(username);
            return Result.success(u);
        }


    //登录
    @PostMapping("/login")
    public  Result<String>loginIn(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$")String password){

            User u = userService.findbyusername(username);
            if(u==null){

                return  Result.error("用户名错误");
            }

            if(password.equals(u.getPassword())){
                Map<String,Object> claims=new HashMap<>();
                claims.put("id",u.getId());
                claims.put("username",u.getUsername());
                claims.put("name",u.getName());

                String token = JwtUtils.genToken(claims);

                return Result.success(token);
            }


                return Result.error("用户名或密码错误");

    }

    //更新密码
    @PatchMapping("/updatePwd")
    public  Result updatePwd(@RequestBody Map<String,String> params){
        //校验参数
       String oldpwd=params.get("old_pwd");
       String newpwd=params.get("new_pwd");
       String repwd=params.get("re_pwd");

        if(!StringUtils.hasLength(oldpwd)||!StringUtils.hasLength(newpwd)||!StringUtils.hasLength(repwd)){
            return Result.error("缺少必要参数");
        }

        //原密码是否正确
        Map<String,Object> map=ThreadLocalUtil.get();
        User loginUser=userService.findbyusername((String) map.get("username"));
        if(!loginUser.getPassword().equals(oldpwd)){
            return Result.error("原密码不正确");
        }
        if(!newpwd.equals(repwd)){
            return Result.error("两次填写的新密码不一样");
        }
        userService.updatePwd(newpwd);
        return Result.success();

    }

}

异常控制

把所有的异常信息封装到一个Result对象里面

package com.example.project.exception;


import com.example.project.pojo.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(Exception.class)
    public Result handleException(Exception e){
        e.printStackTrace();
        return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"操作失败");
    }
}

拦截器

1.jwt令牌

在用户成功登录后会生成一个jwt令牌作为用户的唯一标识来放在接口中,后端通过jwt令牌来对用户进行拦截。jwt令牌信息可以作为一个用户的唯一标识。以下是jwt令牌的工具类

package com.example.project.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;
import java.util.Map;

public class JwtUtils {
    private static final  String key="zut";

    //接受业务数据,生成token并返回
    public static  String genToken(Map<String,Object> claims){
        return JWT.create()
                .withClaim("claims",claims)
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*12))
                .sign(Algorithm.HMAC256(key));

    }
    //接受token,验证token 返回数据
    public static Map<String,Object> parseToken(String token){
        return JWT.require(Algorithm.HMAC256(key))
                .build()
                .verify(token)
                .getClaim("claims").asMap();
    }
}

2.拦截器

主要用来做登录拦截

package com.example.project.interceptors;

import com.example.project.utils.JwtUtils;
import com.example.project.utils.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Map;

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       String token= request.getHeader("jwt");
       try {
           Map<String, Object> claims = JwtUtils.parseToken(token);
           //将claims放入threadlocal
           ThreadLocalUtil.set(claims);
       return  true;
       }catch (Exception o){
           //表示未登录
           response.setStatus(401);
           return false;
       }

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
           //清空Threadlocal中的数据
        ThreadLocalUtil.remove();
    }
    }

映射层

mapper映射,为服务类做准备

1.文章映射

package com.example.project.mapper;

import com.example.project.pojo.Article;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface ArticleMapper {

    //查看所有文章
    @Select("select * from article")
    List<Article> getlist();

    //上传文章
     @Insert("insert into article(title,content,description,user,userId,createTime,updateTime,area)values (#{title},#{content},#{description},#{user},#{userId},#{createTime},#{updateTime},#{area})")
    void add(Article article);

    @Select("select * from article where userId=#{userId}")
    List<Article> getmylist(int userId);

    @Delete("delete  from article where id=#{id}")
    void delete(int id);

    @Update("update article set title = #{title}, description = #{description}, content = #{content}, updateTime = #{updateTime} where id = #{id}")
    void update(Article article);
}

2.用户信息映射

package com.example.project.mapper;

import com.example.project.pojo.Article;
import com.example.project.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

@Mapper
public interface UserMapper {
    //根据用户名查询
    @Select("select * from user where username=#{username}")
    User findbyusername(String username);

    //添加
    @Insert("insert into user(username,password,name)values(#{username},#{password},#{name})")
    void add(String username, String password, String name);

    //查找我的文章
     @Update("update user set password=#{newpwd} where id=#{id} ")
    void updatePwd(String newpwd, Integer id);


}

对象层

1.文章

package com.example.project.pojo;

import lombok.Data;


import java.time.LocalDate;


@Data
public class Article {
   private Integer id;  //文章编号
   private String title;   //标题
   private String content;    //内容
   private String description;
   private String  user;   //发布者
   private Integer  userId;  //发布者Id
   private LocalDate createTime;  //发出日期
   private LocalDate updateTime;   //更改日期
   private Integer area;
}

2.用户

ackage com.example.project.pojo;

import com.fasterxml.jackson.annotation.JsonIgnore;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

@Data
public class User {
    @NotNull
   private Integer id;// 主键id

   private String username;//用户名 5-16长度
    @JsonIgnore
   private String password;//密码  5-16长度
   @NotEmpty
   private String name; //姓名

}

3.为前端传输的信息的封装

ackage com.example.project.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//定义一个Result 以Json格式 传递数据给前端
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result <T>{
   private Integer code; //状态码 0成功 -1失败
   private String mess;  //提示信息
   private T data;//

public static <E> Result<E> success(E data){
    return  new Result<>(0,"操作成功",data);
}
public  static  Result success(){
    return new Result(0,"操作成功",null);
}
public static  Result error(String message){
    return new Result(1,message,null);
}


}

4.分页处理信息的封装

package com.example.project.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@NoArgsConstructor
@Data
@AllArgsConstructor
public class PageBean<T> {

    private Long total;
    private List<T> items;
}

服务层

文章服务层

package com.example.project.service;

import com.example.project.pojo.Article;
import com.example.project.pojo.PageBean;

import java.util.List;

public interface ArticleService {
    List<Article> getlist();

    void add(Article article);

    List<Article> getmylist();

    void delete(int id);
    //更新数据
    void update(Article article);

    //分页查询
    PageBean<Article> selectpage(Integer pageNum, Integer pageSize);
    //条件分页查询
    PageBean<Article> getmypage(Integer pageNum, Integer pageSize);
}
文章实现层
package com.example.project.service.impl;

import com.example.project.mapper.ArticleMapper;
import com.example.project.pojo.Article;
import com.example.project.pojo.PageBean;
import com.example.project.service.ArticleService;
import com.example.project.utils.ThreadLocalUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;


import java.time.LocalDate;

import java.util.List;
import java.util.Map;

@Service
public class ArticleServiceImpl implements ArticleService {

    @Autowired
    private ArticleMapper articleMapper;
    @Override
    public List<Article> getlist() {
        List<Article> list=articleMapper.getlist();
        return list;
    }

    @Override
    public void add(Article article) {
        article.setCreateTime(LocalDate.now()); //添加时间
        article.setUpdateTime(LocalDate.now());
        Map<String,Object> map=ThreadLocalUtil.get();
        String name= (String) map.get("name");
        int userId=(int)map.get("id");
        article.setUser(name);
        article.setUserId(userId);
        articleMapper.add(article);
    }

    @Override
    public List<Article> getmylist() {
        Map<String,Object> map=ThreadLocalUtil.get();
        int userId=(int)map.get("id");
        List<Article> list= articleMapper.getmylist(userId);
        return list;
    }

    @Override
    public void delete(int id) {
        articleMapper.delete(id);
    }

    @Override
    public void update(Article article) {

        article.setUpdateTime(LocalDate.now());

        articleMapper.update(article);
    }

    @Override
    public PageBean<Article> selectpage(Integer pageNum, Integer pageSize) {
        PageBean<Article> pb=new PageBean<>();

        //开启分页查询 PageHelper
        PageHelper.startPage(pageNum,pageSize);

        List<Article> as=articleMapper.getlist();
        //Page中提供方法,可以获取PageHelper分页查询后 得到的总记录条数和当前页数据
        Page<Article> p=(Page<Article>) as;
        pb.setTotal(p.getTotal());
        pb.setItems(p.getResult());
        return pb;
    }

    @Override
    public PageBean<Article> getmypage(Integer pageNum, Integer pageSize) {
        PageBean<Article> pb=new PageBean<>();

        //开启分页查询 PageHelper
        PageHelper.startPage(pageNum,pageSize);
        Map<String,Object> map=ThreadLocalUtil.get();
        int userId=(int)map.get("id");
        List<Article> as=articleMapper.getmylist(userId);
        //Page中提供方法,可以获取PageHelper分页查询后 得到的总记录条数和当前页数据
        Page<Article> p=(Page<Article>) as;
        pb.setTotal(p.getTotal());
        pb.setItems(p.getResult());
        return pb;
    }


用户服务层


import com.example.project.pojo.User;

public interface UserService {
    //根据用户名查询管理员
    User findbyusername(String username);
  //添加新的管理员账户
    void register(String username, String password, String name);
   //更新密码
    void updatePwd(String newpwd);
}
用户实现层
package com.example.project.service.impl;

import com.example.project.mapper.UserMapper;
import com.example.project.pojo.User;
import com.example.project.service.UserService;
import com.example.project.utils.ThreadLocalUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public User findbyusername(String username) {
      User u= userMapper.findbyusername(username);

        return u;
    }

    @Override
    public void register(String username, String password, String name) {

        userMapper.add(username,password,name);

    }



    @Override
    public void updatePwd(String newpwd) {
           Map<String,Object> map= ThreadLocalUtil.get();
           Integer id=(Integer) map.get("id");
           userMapper.updatePwd(newpwd,id);
    }
}

配置文件

<?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 https://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>3.1.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>project</name>
    <description>project</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>4.4.0</version>
        </dependency>

    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder-jammy-base:latest</builder>
                    </image>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

以上是全部的后端代码,希望能够带来帮助

猜你喜欢

转载自blog.csdn.net/weixin_73733267/article/details/135437846
今日推荐