【SpringBoot + Vue 实战项目-师生课程管理系统(附源码地址)】基于SpringBoot开发后端功能部分,实现教师、学生两种角色的Api接口

SpringBoot后端部分,实现教师、学生两种角色的Api接口

1. 项目总览

可移步我的主页查看项目总览博客
在这里插入图片描述

2. 后端技术栈

Java、SpringBoot、MySQL、Redis等
API文档使用swagger

3. 系统目录结构

在这里插入图片描述
系统主要采用控制层、业务层和数据库操作层三层架构实现整个后端框架。

4. 用户通用功能实现

主要包括:用户注册、用户登录、用户退出、获取用户信息、更新用户信息、上传用户头像等功能

用户注册

基本逻辑:
Controller层接收用户注册数据,封装到UserRegister类中
将数据转移给User类
调用Service层的业务逻辑方法完成注册
将结果封装并返回

Controller层

    /**
     * 用户注册页
     * @param userRegister
     * @return
     */
    @PostMapping("/register")
    @ApiOperation(value = "用户注册", notes = "用户注册")
    public Result<User> register(
            @ApiParam(name = "userRegister", value = "用户注册信息", required = true)
            @Validated @RequestBody UserRegister userRegister) {
        User user = new User(userRegister.getUsername(),
                userRegister.getPassword(),
                userRegister.getEmail(),
                userRegister.getGender(),
                userRegister.getPhone(),
                userRegister.getRole(),
                userRegister.getUsername());
        userService.register(user);
        return Result.success(user);
    }

Service层

实现细节:
对用户密码在存储之前进行加密操作,保证安全
在用户首次注册时,设置头像为默认头像
最后调用Mapper层方法,在数据库中插入用户数据

    @Override
    public void register(User user) {
        String salt = IdUtil.simpleUUID();
        String password = SecurityUtil.crypto(salt, user.getPassword());
        user.setPassword(password);
        user.setNickname(user.getUsername());
        user.setSalt(salt);
        user.setAvatar(aliyunConfig.getTargetUrl() + "/" + aliyunConfig.getTargetPath() + "default.png");
        userMapper.insert(user);
    }

Mapper层
用户通用功能对于数据库的操作都是简单的增删改查,只需要继承BaseMapper即可

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

用户登录

Controller层

    /**
     * 用户登录页
     * @param username
     * @param password
     * @return
     */
    @PostMapping("/login")
    @ApiOperation(value = "用户登录", notes = "用户登录")
    public Result<UserLoginVo> login(
            @ApiParam(name = "username", value = "用户名", required = true)
            @RequestParam("username") String username,
            @ApiParam(name = "password", value = "密码", required = true)
            @RequestParam("password") String password
                                     ) {
        User formUser = new User(username, password);
        UserLoginVo userLoginVo= userService.login(formUser);
        log.info(userLoginVo.getToken());
        return Result.success(userLoginVo);
    }

Service层

    @Override
    public UserLoginVo login(User formUser) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username", formUser.getUsername());
        User dbUser = userMapper.selectOne(wrapper);
        if (dbUser == null || !SecurityUtil.crypto(dbUser.getSalt(), formUser.getPassword()).equals(dbUser.getPassword()))
            throw new BizException(LOGIN_ERROR.getResultCode(), LOGIN_ERROR.getResultMsg());
        //todo: generate token to user
        String token = IdUtil.simpleUUID();
        redisTemplate.opsForValue().set(TOKEN_PREFIX + token, JSONUtil.toJsonStr(dbUser), 12, TimeUnit.HOURS);
        UserLoginVo userLoginVo = new UserLoginVo(
                formUser.getUsername(),
                dbUser.getNickname(),
                token,
                dbUser.getRole(),
                dbUser.getEmail(),
                dbUser.getPhone(),
                dbUser.getGender(),
                dbUser.getAvatar()
        );
        return userLoginVo;
    }

Mapper层

用户退出

Controller层

    /**
     * 用户登出页
     * @param token
     * @return
     */
    @GetMapping("/logout")
    @ApiOperation(value = "用户登出", notes = "用户登出")
    public Result<Boolean> logout(
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token) {
        userService.logout(token);
        return Result.success(true);
    }

Service层

    @Override
    public void logout(String token) {
        redisTemplate.delete(TOKEN_PREFIX + token);
    }

Mapper层

获取用户信息

Controller层

    /**
     * 获取用户信息
     * @param token
     * @return
     */
    @GetMapping("/userinfo")
    @ApiOperation(value = "获取用户信息", notes = "获取用户信息")
    public Result<User> userInfo(
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token){
        User user = userService.getByToken(token);
        return Result.success(user);
    }

Service层

    @Override
    public User userInfo(User u) {
        if(u == null){
            throw new BizException("502", "请先登录");
        }
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username", u.getUsername());
        User dbUser = userMapper.selectOne(wrapper);
        dbUser.setPassword("");
        return dbUser;
    }

Mapper层

更新用户信息

Controller层

    /**
     * 更新用户信息
     * @param userUpdateInfo
     * @return
     */
    @PostMapping("/updateUserInfo")
    @ApiOperation(value = "更新用户信息", notes = "更新用户信息")
    public Result<User> updateUserInfo(
            @ApiParam(name = "userUpdateInfo", value = "用户更新信息", required = true)
            @Validated @RequestBody UserUpdateInfo userUpdateInfo){
        return userService.updateUserInfo(userUpdateInfo);
    }

Service层

    @Override
    public Result<User> updateUserInfo(UserUpdateInfo userUpdateInfo) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("username", userUpdateInfo.getUsername());
        User dbUser = userMapper.selectOne(wrapper);
        dbUser.setEmail(userUpdateInfo.getEmail());
        dbUser.setPhone(userUpdateInfo.getPhone());
        dbUser.setNickname(userUpdateInfo.getNickname());
        userMapper.updateById(dbUser);
        dbUser.setPassword("");
        return Result.success(dbUser);
    }

Mapper层

上传用户头像

Controller层

    /**
     * 上传头像
     * @param file
     * @param token
     * @return
     */
    @PostMapping("/uploadAvatar")
    @ApiOperation(value = "图片文件更新头像", notes = "图片文件更新头像")
    public Result<String> uploadAvatar(
            @ApiParam(name = "file", value = "图片文件", required = true)
            @RequestParam("file") MultipartFile file,
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token){
        User current_user = userService.getByToken(token);
        return Result.success(userService.uploadAvatar(current_user, file));
    }

Service层

    @Override
    public String uploadAvatar(User user, MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        //获取文件后缀名
        String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //新生成文件名
        //简单使用
        String fileName = UUID.randomUUID().toString() + System.currentTimeMillis() + fileSuffix;
        String targetPath;
        try (InputStream fr = file.getInputStream()) {
            // 10年后的日期
            Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10);
            String savePath = aliyunConfig.getTargetPath() + fileName;
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(aliyunConfig.getBucketName(), savePath);
            request.setExpiration(expiration);
            URL url = ossClient.generatePresignedUrl(request);

            ossClient.putObject(aliyunConfig.getBucketName(), savePath, fr);
//            targetPath = aliyunConfig.getTargetUrl() + "/" + savePath;

            targetPath = url.toString();
            QueryWrapper<User> wrapper = new QueryWrapper<>();
            wrapper.eq("username", user.getUsername());
            User dbUser = userMapper.selectOne(wrapper);
            dbUser.setAvatar(targetPath);
            userMapper.updateById(dbUser);

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return targetPath;
    }

Mapper层

5. 教师功能实现

主要包括:发布新课程、查看开课的选课情况、教师查看自己开设的课程

发布新课程

Controller层

    /**
     * 教师发布新课程
     * @param newCourseInfo
     * @param token
     * @return
     */
    @PostMapping("/releaseCourse")
    @ApiOperation(value = "教师发布新课程", notes = "教师发布新课程")
    public Result<Course> teacherReleaseCourse(
            @ApiParam(name = "newCourseInfo", value = "课程信息", required = true)
            @RequestBody NewCourseInfo newCourseInfo,
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token) {
        User current_user = userService.getByToken(token);
        Course newCourse = new Course(newCourseInfo.getCourseId(),
                newCourseInfo.getCourseName(),
                newCourseInfo.getPrerequisites(),
                newCourseInfo.getCourseDescription(),
                newCourseInfo.getCourseType(),
                current_user.getUsername());
        courseService.teacherAddCourse(newCourse);
        return Result.success(newCourse);
    }

Service层

    @Override
    public void teacherAddCourse(Course newCourse) {
        courseMapper.teacherAddCourse(newCourse.getCourseId(),
                newCourse.getCourseName(),
                newCourse.getPrerequisites(),
                newCourse.getCourseDescription(),
                newCourse.getCourseType(),
                newCourse.getTeacherName());


    }

Mapper层

    /**
     * 教师添加课程
     */
    @Select("INSERT INTO course (course_id, course_name, prerequisites, course_description, course_type, teacher_name)\n" +
            "VALUES (#{courseId}, #{courseName}, #{prerequisites}, #{courseDescription}, #{courseType}, #{teacherName});\n")
    void teacherAddCourse(@Param("courseId") String courseId,
                          @Param("courseName") String courseName,
                          @Param("prerequisites") String prerequisites,
                          @Param("courseDescription") String courseDescription,
                          @Param("courseType") String courseType,
                          @Param("teacherName") String teacherName);

查看开课的选课情况

Controller层

    /**
     * 查看自己开课的选课的情况
     * @param token
     * @return
     */
    @GetMapping("/getCourseStudyInfo")
    @ApiOperation(value = "查看自己开课的选课情况", notes = "查看自己开课的选课情况")
    public Result<List<CourseStudyInfo>> teacherGetCourseStudyInfo(
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token){
        User current_user = userService.getByToken(token);
        List<CourseStudyInfo> courseStudyInfos = courseService.teacherGetCourseStudyInfo(current_user.getUsername());
        return Result.success(courseStudyInfos);
    }

Service层

@Override
    public List<CourseStudyInfo> teacherGetCourseStudyInfo(String teacherName) {
        List<CourseChosen> courseChosens = courseChosenMapper.teacherChosenCourseInfo(teacherName);
        Map<String, CourseStudyInfo> courseStudyInfoMap = new HashMap<>();

        for (CourseChosen courseChosen : courseChosens) {
            String courseName = courseChosen.getCourseName();

            // 如果Map中还没有该课程信息,则创建新的CourseStudyInfo对象
            CourseStudyInfo courseStudyInfo = courseStudyInfoMap.computeIfAbsent(courseName, k -> new CourseStudyInfo(k));

            // 更新CourseStudyInfo的选课人数(假设CourseChosen中没有直接的选课人数,需要统计)
            courseStudyInfo.setStudentNum(courseStudyInfo.getStudentNum() == null ? 1 : courseStudyInfo.getStudentNum() + 1);

            // 创建StudentStudyInfo并添加到CourseStudyInfo的列表中
            StudentStudyInfo studentStudyInfo = new StudentStudyInfo(
                    courseName,
                    courseChosen.getStudentName(),
                    courseChosen.getStudyTimeSum(),
                    courseChosen.getStudyDay(),
                    courseChosen.getTodayStudyTime(),
                    courseChosen.getTwoWeekStudy(),
                    courseChosen.getScore()
            );
            courseStudyInfo.getStudentStudyInfoList().add(studentStudyInfo);
        }

        // 将Map的值转换为List并返回
        return new ArrayList<>(courseStudyInfoMap.values());
    }

Mapper层

    /**
     * 教师查看自己开的课程的选课情况
     */
    @Select("SELECT * FROM student_course " +
            "WHERE teacher_name = #{teacherName} " +
            "ORDER BY course_name")
    List<CourseChosen> teacherChosenCourseInfo(@Param("teacherName")String teacherName);

教师查看自己开设的课程

Controller层

    /**
     * 教师查看自己开课的课程
     * @param token
     * @return
     */
    @GetMapping("/getCourses")
    @ApiOperation(value = "教师查看自己开课的课程", notes = "教师查看自己开课的课程")
    public Result<List<Course>> getCourseByTeacherName(
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token){
        User current_user = userService.getByToken(token);
        List<Course> courses = courseService.getCourseByTeacherName(current_user.getUsername());
        return Result.success(courses);
    }

Service层

    @Override
    public List<Course> getCourseByTeacherName(String teacherName) {
        QueryWrapper<Course> wrapper = new QueryWrapper<>();
        wrapper.eq("teacher_name", teacherName)
                .or()
                .eq("teacher_name", teacherName + "\r");
        return courseMapper.selectList(wrapper);
    }

6. 学生功能实现

主要包括:选课、退选、获取自己的选课信息

选课

Controller层

    /**
     * 添加选课
     * @param courseName
     * @param token
     * @return
     */
    @GetMapping("/selectCourse")
    @ApiOperation(value = "学生添加选课", notes = "添加选课")
    public Result<CourseChosen> selectCourse(
            @ApiParam(name = "courseName", value = "课程名称", required = true)
            @RequestParam("courseName") String courseName,
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token) {
        User user = userService.getByToken(token);
        CourseChosen courseChosen = courseService.studentAddCourse(courseName, user.getUsername());
        return Result.success(courseChosen);
    }

Service层

    @Override
    public CourseChosen studentAddCourse(String courseName, String studentName) {
        String teacherName = courseMapper.getCourseDetail(courseName).getTeacherName().replace("\r", "");
        for (CourseChosen courseChosen : courseChosenMapper.allChosenCourse(studentName)) {
            if (courseChosen.getCourseName().equals(courseName)) {
                throw new BizException(Course_Has_Been_Chosen.getResultCode(), Course_Has_Been_Chosen.getResultMsg());
            }
        }
        CourseChosen courseChosen = new CourseChosen(studentName, courseName, teacherName);
        courseChosenMapper.insert(courseChosen);
        return courseChosen;
    }

退选

Controller层

    /**
     * 删除选课
     * @param courseName
     * @param token
     * @return
     */
    @GetMapping("/deleteCourse")
    @ApiOperation(value = "学生删除选课", notes = "删除选课")
    public Result<String> deleteCourse(
            @ApiParam(name = "courseName", value = "课程名称", required = true)
            @RequestParam("courseName") String courseName,
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token) {
        User user = userService.getByToken(token);
        courseService.studentDeleteCourse(courseName, user.getUsername());
        return Result.success("退选成功");
    }

Service层

    @Override
    public void studentDeleteCourse(String courseName, String studentName) {
        for (CourseChosen courseChosen : courseChosenMapper.allChosenCourse(studentName)) {
            if (courseChosen.getCourseName().equals(courseName)) {
                courseChosenMapper.deleteChosenCourse(studentName, courseName);
                return;
            }
        }
        throw new BizException(Course_Has_Not_Been_Chosen.getResultCode(), Course_Has_Not_Been_Chosen.getResultMsg());

    }

Mapper层

    /**
     * 删除选课
     * @param studentName
     * @param courseName
     */
    @Delete("DELETE FROM student_course WHERE student_name = #{studentName} AND course_name = #{courseName}")
    void deleteChosenCourse(String studentName, String courseName);

获取自己的选课信息

Controller层

    /**
     * 获取学生选课信息
     * @param token
     * @return
     */
    @GetMapping("/getCourseStudyInfo")
    @ApiOperation(value = "学生获取选课信息", notes = "获取学生选课信息")
    public Result<List<CourseChosen>> getCourseStudyInfo(
            @ApiParam(name = "token", value = "用户认证令牌", required = true)
            @RequestParam("token") String token) {
        User user = userService.getByToken(token);
        List<CourseChosen> courseChosens = courseService.studentGetCourseStudyInfo(user.getUsername());
        return Result.success(courseChosens);
    }

Service层

    @Override
    public List<CourseChosen> studentGetCourseStudyInfo(String studentName) {
        List<CourseChosen> courseChosens = courseChosenMapper.studentChosenCourseInfo(studentName);
        if (courseChosens.isEmpty()){
            throw new BizException(NOT_SELECT_ANY_COURSES.getResultCode(), NOT_SELECT_ANY_COURSES.getResultMsg());
        }
        return courseChosens;
    }

Mapper层

    /**
     * 学生查看自己选课学习情况
     */
    @Select("SELECT * FROM student_course " +
            "WHERE student_name = #{studentName} " +
            "ORDER BY course_name")
    List<CourseChosen> studentChosenCourseInfo(@Param("studentName")String studentName);

7. 课程功能实现

主要包括:分页获取所有课程,获取指定类型的课程,获取课程详情,获取所有课程类别

分页获取所有课程

Controller层

/**
     * 获取所有课程
     * @return
     */
    @PostMapping("/list")
    @ApiOperation(value = "获取所有课程", notes = "获取所有课程")
    public Result<Page<Course>> getAllCourses(
            @ApiParam(name = "pageInfo", value = "分页信息", required = true)
            @RequestBody PageInfo pageInfo,
            @RequestParam(value = "token", required = false) String token,
            @RequestParam(value = "courseType", required = false) String courseType) {
        Page<Course> coursePage;
        if (!"".equals(courseType) && courseType != null){
            LambdaQueryWrapper<Course> wrapper = new LambdaQueryWrapper<>();
            wrapper.like(Course::getCourseType, courseType);
            Page<Course> page = new Page<>(
                            pageInfo.getPageNum(),
                            pageInfo.getPageSize()
            );
            coursePage = courseMapper.selectPage(page, wrapper);
        }else {
            Page<Course> page = new Page<>(
                    pageInfo.getPageNum(),
                    pageInfo.getPageSize()
            );
            coursePage = courseMapper.selectPage(page, null);
        }


        return Result.success(coursePage);
    }

获取指定类型的课程

Controller层

/**
     * 获取指定类型的课程
     * @param courseType
     * @return
     */
    @GetMapping("/getCourseByType")
    @ApiOperation(value = "获取指定类型的课程", notes = "获取指定类型的课程")
    public Result<String> getCourseByType(
            @ApiParam(name = "courseType", value = "课程类型", required = true)
            @RequestParam("courseType") String courseType) {
        List<Course> courses = courseService.getCourseByType(courseType);
        return Result.success(courses);
    }

Service层

    @Override
    public List<Course> getCourseByType(String courseType) {
        List<Course> courses = courseMapper.selectCourseByType(courseType);
        return courses;
    }

Mapper层

    /**
     * 根据课程类型查询课程
     * @param courseType
     * @return
     */
    @Select("SELECT id, course_id, course_name, prerequisites, course_description, course_type, teacher_name\n" +
            "FROM course\n" +
            "WHERE course_type = #{courseType};\n")
    List<Course> selectCourseByType(@Param("courseType") String courseType);

获取课程详情

Controller层

/**
     * 获取课程详情
     * @param courseName
     * @return
     */
    @GetMapping("/courseDetail")
    @ApiOperation(value = "获取课程详情", notes = "获取课程详情")
    public Result<Course> getCourseDetail(
            @ApiParam(name = "courseName", value = "课程名称", required = true)
            @RequestParam("courseName") String courseName){
        return Result.success(courseService.getCourseDetail(courseName));
    }

Service层

    @Override
    public Course getCourseDetail(String courseName) {
        return courseMapper.getCourseDetail(courseName);
    }

Mapper层

    /**
     * 根据课程名查询课程信息
     * @param courseName
     * @return
     */
    @Select("SELECT * FROM course WHERE course_name = #{courseName}")
    Course getCourseDetail(@Param("courseName") String courseName);

获取所有课程类别

Controller层

    /**
     * 获取所有课程类别
     * @return
     */
    @GetMapping("/getAllCourseType")
    @ApiOperation(value = "获取所有课程类别", notes = "获取所有课程类别")
    public Result<List<CourseType>> getAllCourseType() {
        List<CourseType> courseTypes = courseMapper.getAllCourseType();
        return Result.success(courseTypes);
    }

Mapper层

    /**
     * 查询所有课程类别
     */
    @Select("SELECT *\n" +
            "FROM type\n" +
            "ORDER BY \n" +
            "    CASE \n" +
            "        WHEN type = '其他' THEN 2 \n" +
            "        ELSE 1 \n" +
            "    END,\n" +
            "    num DESC")
    List<CourseType> getAllCourseType();

8. 其他模块

实体类、数据传输对象类、结果返回类

1、pojo文件夹:文件夹内的文件表示与数据库表对应的实体类
2、dto文件夹:文件夹内的文件表示后端将前端传来的数据包装起来的数据传输对象类
3、vo文件夹:文件夹内的文件表示后端处理完成后,将所需数据打包起来返回给前端的结果返回类

为什么需要这样三种类型的对象?
简单来说为了对有些隐私数据进行保护。用注册功能为例,注册时pojo类肯定会包含密码信息,但我们肯定不希望将密码,不论是加密后还是原始密码,暴露给前端,因此我们会用vo包装可以展示的数据进行返回。而dto是为了封装前端传输过来的数据,可以定制化接收参数。

自定义异常类

异常枚举

public enum ExceptionEnum implements BaseErrorInfoInterface{
    // 数据操作错误定义
    SUCCESS("200", "成功!"),
    EXISTED("4001", "账号已存在!"),
    INTERNAL_SERVER_ERROR("4002", "服务器内部错误!"),
    SERVER_BUSY("4003", "服务器正忙,请稍后再试!"),
    AUTH_ERROR("4004", "用户未登录!"),
    AUTH_NOT_ENOUGH("4005", "权限不足,请联系管理员!"),
    LOGIN_ERROR("4006", "用户名或密码错误!"),
    NOT_LOGIN("4007", "用户未登录!"),
    Course_Has_Been_Chosen("4008", "该课程已选!"),
    Course_Has_Not_Been_Chosen("4009", "请先选择该课程!"),
    NOT_SELECT_ANY_COURSES("4010", "还未选课");

    /**
     * 错误码
     */
    private final String resultCode;

    /**
     * 错误描述
     */
    private final String resultMsg;

    ExceptionEnum(String resultCode, String resultMsg) {
        this.resultCode = resultCode;
        this.resultMsg = resultMsg;
    }

    @Override
    public String getResultCode() {
        return resultCode;
    }

    @Override
    public String getResultMsg() {
        return resultMsg;
    }
}

自定义异常类

@ControllerAdvice
public class BizException extends RuntimeException{
    private static final long serialVersionUID = 1L;
    /**
     * 错误码
     */
    protected String errorCode;
    /**
     * 错误信息
     */
    protected String errorMsg;

    public BizException() {
        super();
    }

    public BizException(BaseErrorInfoInterface errorInfoInterface) {
        super(errorInfoInterface.getResultCode());
        this.errorCode = errorInfoInterface.getResultCode();
        this.errorMsg = errorInfoInterface.getResultMsg();
    }

    public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) {
        super(errorInfoInterface.getResultCode(), cause);
        this.errorCode = errorInfoInterface.getResultCode();
        this.errorMsg = errorInfoInterface.getResultMsg();
    }

    public BizException(String errorMsg) {
        super(errorMsg);
        this.errorMsg = errorMsg;
    }

    public BizException(String errorCode, String errorMsg) {
        super(errorCode);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public BizException(String errorCode, String errorMsg, Throwable cause) {
        super(errorCode, cause);
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    @Override
    public Throwable fillInStackTrace() {
        return this;
    }
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public Result<?> handleValidException(MethodArgumentNotValidException e) {
        String message = e.getBindingResult().getFieldError().getDefaultMessage();
        return Result.error(message);
    }
    @ExceptionHandler(value = SQLIntegrityConstraintViolationException.class)
    @ResponseBody
    public Result<?> handleValidException(SQLIntegrityConstraintViolationException e) {
        return Result.error(Integer.parseInt(EXISTED.getResultCode()), EXISTED.getResultMsg());
    }
    @ExceptionHandler(value = BizException.class)
    @ResponseBody
    public Result<?> handleValidException(BizException e) {
        return Result.error(Integer.parseInt(e.getErrorCode()),e.getErrorMsg());
    }
}

结果返回类

设置结果返回类,统一把返回数据包装起来返回给前端,真是非常J的做法!

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

    @ApiModelProperty(value = "状态码")
    private int code;
    @ApiModelProperty(value = "提示信息")
    private String msg;
    @ApiModelProperty(value = "返回数据")
    private T data;

    private Result(BaseErrorInfoInterface errorInfo) {
        this.code = Integer.parseInt(errorInfo.getResultCode());
        this.msg = errorInfo.getResultMsg();
    }


    private Result(BaseErrorInfoInterface errorInfo, T data) {
        this.code = Integer.parseInt(errorInfo.getResultCode());
        this.msg = errorInfo.getResultMsg();
        if (data != null && data.getClass() != ExceptionEnum.class) {
            this.data = data;
        }
    }

    /**
     * 成功时候的调用
     */
    public static <T> Result<T> success(T data) {
        return new Result<>(ExceptionEnum.SUCCESS, data);
    }

    public static <T> Result<T> success(List<Course> data) {
        return new Result(ExceptionEnum.SUCCESS, data);
    }


    /**
     * 失败
     */
    public static <T> Result<T> error(BaseErrorInfoInterface errorInfo) {
        Result<T> result = new Result<>(errorInfo);
        result.setData(null);
        return result;
    }

    /**
     * 失败
     */
    public static <T> Result<T> error(Integer code, String message) {
        Result<T> result = new Result<T>();
        result.setCode(code);
        result.setMsg(message);
        result.setData(null);
        return result;
    }

    /**
     * 失败
     */
    public static <T> Result<T> error(String message) {
        Result<T> result = new Result<T>();
        result.setCode(-1);
        result.setMsg(message);
        result.setData(null);
        return result;
    }

}

配置信息类

配置信息可以分为开发时配置和部署时配置,分设两个配置文件dev和prod,在主配置文件中选择即可,这样就避免了频繁debug修改配置。
在这里插入图片描述
application.yaml

spring:
  profiles:
    active: prod
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB

aliyun:
  endpoint: 
  accessKeyId: 
  accessKeySecret: 
  bucketName: 
  targetPath: 
  targetUrl: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值