基于Springboot+UniApp+Ai实现模拟面试小工具三:后端项目基础框架搭建上

本节介绍本项目后端的基础框架搭建,包括基础的增删改查功能,以及权限校验,日志记录,参数校验等基础功能的实现。

源码下载: 点击下载
讲解视频:

Uniapp+Springboot+Kimi实现模拟面试小程序-前端项目搭建

一.基础框架

后端一般包括dao/mapper/serice/conrtoller/vo/entity/utils/sdk/resource/config等基础包,分别定义不通的功能。

  1. dao/mapper 系统数据库操作层,负责和数据库进行交互,本系统使用mybatis-plus实现。
  2. service 业务逻辑层,进行系统业务逻辑处理。
  3. comtroller resetful api接口层,负责对外提供api接口。
  4. vo 和前端表单数据结构对应,负责通过接口与前端接收和传递数据信息。
  5. entity 系统实体定义,和数据库表结构一一对应。
  6. utils 系统工具方法
  7. sdk 第三方sdk,本系统主要集成kimi的sdk接口工具。
  8. resource 静态资源及配置文件信息。
  9. config 系统配置类型,包括权限配置/mybatis等的相关配置文件。

具体项目结构如下;

二.基础功能

后端一般包括基础的增删改查/接口开发/事务管理/日志记录/权限管理/接口参数合法性校验等基本功能。

2.1. 系统启动类及配置文件实现

  1. AiworkApplication
java 复制代码
package com.junjunjun.aiwork;

import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@ComponentScan({"com.junjunjun.aiwork","com.junjunjun.aiwork.*"})
@MapperScan({"com.baomidou.mybatisplus.samples.quickstart.mapper","com.junjunjun.aiwork.dao.*"})
@Slf4j
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AiworkApplication {

	public static void main(String[] args) {
		log.info("-----------------------系统启动中-----------------------");
		SpringApplication.run(AiworkApplication.class, args);
		log.info("-----------------------系统启动完成-----------------------");
	}

}
  1. MybatisPlusConfig
java 复制代码
package com.junjunjun.aiwork;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@MapperScan("com.junjunjun.aiwork.dao")
public class MybatisPlusConfig {

    /**
     * 添加分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
        // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
        return interceptor;
    }

    /**
     * 对象转化
     * @return
     */
    @Bean
    public ObjectMapper objectMapper(){
        return  new ObjectMapper();
    }

}
  1. SpringContextUtils
java 复制代码
package com.junjunjun.aiwork;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtils implements ApplicationContextAware {
    private static ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtils.context = applicationContext;
    }
    public static <T> T getBean(Class<T> cls){
        return context.getBean(cls);
    }
}
  1. WebMvcConfig
java 复制代码
package com.junjunjun.aiwork;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 注册静态资源的路径映射
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
		WebMvcConfigurer.super.addResourceHandlers(registry);
	}
}

2.2. entity 实体定义

  1. BaseEntity
java 复制代码
package com.junjunjun.aiwork.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.OrderBy;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 实体基础类
 */
@Data
@ToString
@Accessors(chain = true)
public abstract class BaseEntity implements Serializable {
    /**
     * ID
     */
    @TableId(type= IdType.AUTO)
    @OrderBy(asc = true, sort = 10) // 指定默认排序为倒序,优先级为10
    @NotNull(message = "分页信息不能为空",groups = Update.class)
    private Long id;
    /**
     * 是否删除
     */
    @TableLogic
    private int deleted;
}
  1. User
java 复制代码
package com.junjunjun.aiwork.entity.user;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.entity.system.Role;
import com.junjunjun.aiwork.validate.Create;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 用户表
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName(value="junjunjun_user",resultMap="userResultMap")
public class User extends BaseEntity implements UserDetails {
    /**
     * 账号
     */
    @NotBlank(message = "账号信息不能为空",groups = {Update.class, Create.class})
    private String account;
    /**
     * 姓名
     */
    @NotBlank(message = "姓名信息不能为空",groups = {Update.class, Create.class})
    private String name;
    /**
     * 头像
     */
    private String header;
    /**
     * 性别
     */
    private String sex;
    /**
     * 电话
     */
    private String phone;
    /**
     * 密码
     */
    @NotBlank(message = "密码不能为空",groups = { Create.class})
    private String password;
    /**
     * 小程序的openid
     */
    private String openid;

    /**
     * 角色数据
     */
    @TableField(exist = false)
    @NotEmpty(message = "角色信息不能为空",groups = {Update.class, Create.class})
    private List<Role> roles;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<GrantedAuthority> auths = new ArrayList<>();
        if(roles!=null){
            roles.forEach(item->{
                auths.add(item);
                if(item.getMenus()!=null){
                    item.getMenus().forEach(menuItem->{
                        auths.add(menuItem);
                    });
                }
            });
        }
        return auths;
    }

    @Override
    public String getUsername() {
        return account;
    }
}
  1. UserRoleItem
java 复制代码
package com.junjunjun.aiwork.entity.user;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.validate.Create;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.Accessors;

/**
 * 用户角色关联表
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName("junjunjun_user_role_item")
public class UserRoleItem extends  BaseEntity{

    @TableField("user_id")
    @NotNull(message = "所属用户不能为空",groups = {Update.class, Create.class})
    private Long userId;

    @TableField("role_id")
    @NotNull(message = "角色信息不能为空",groups = {Update.class, Create.class})
    private  Long roleId;
}
  1. Log
java 复制代码
package com.junjunjun.aiwork.entity.system;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import lombok.*;
import lombok.experimental.Accessors;

import java.util.Date;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName("junjunjun_log")
public class Log extends BaseEntity {
    //标题
    private String title;
    //用户名
    private String username;
    //操作类型
    private String type;
    //操作明细
    private String msg;
    //参数
    private String param;
    //方法
    private String method;
    //执行类
    private String target;
    //操作时间
    private  Date date;
    //操作客户端IP
    private String ip;
    //操作客户端IP
    private String url;
    //操作客户端IP
    private String requestmethod;


    /**
     *面试时间
     */
    @TableField(exist = false)
    private Date start;
    /**
     *面试时间
     */
    @TableField(exist = false)
    private Date end;
}
  1. Menu
java 复制代码
package com.junjunjun.aiwork.entity.system;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.validate.Create;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotBlank;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.security.core.GrantedAuthority;

/**
 * 菜单
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName("junjunjun_menu")
public class Menu extends BaseEntity implements GrantedAuthority {
    //上级
    @TableField("parent_id")
    private Long parentId;
    //名称
    @NotBlank(message = "名称不能为空",groups = {Update.class, Create.class})
    private String name;
    //图标
    private String icon;
    //组件
    private String compontent;
    //类型:1前端展示组件,2权限控制
    @NotBlank(message = "类型不能为空",groups = {Update.class, Create.class})
    private String type;
    //顺序
    @TableField("sort_")
    private int sort_;
    //请求路径
    private String url;
    //权限标识
    private String permission;

    @Override
    public String getAuthority() {
        return permission;
    }
}
  1. Role
java 复制代码
package com.junjunjun.aiwork.entity.system;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.validate.Create;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.Accessors;
import org.springframework.security.core.GrantedAuthority;

import java.util.List;

/**
 * 角色
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName(value="junjunjun_role",resultMap="roleResultMap")
public class Role extends BaseEntity implements GrantedAuthority {
    @NotBlank(message = "角色名称不能为空",groups = {Update.class, Create.class})
    private String name;

    //权限描述
    @NotBlank(message = "权限描述不能为空",groups = {Update.class, Create.class})
    private String permission;

    //菜单数据
    @TableField(exist = false)
    @NotEmpty(message = "菜单不能为空",groups = {Update.class, Create.class})
    private List<Menu> menus;

    @Override
    public String getAuthority() {
        return permission;
    }
}
  1. RoleMenuItem
java 复制代码
package com.junjunjun.aiwork.entity.system;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.validate.Create;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.Accessors;

/**
 * 角色菜单关联表
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName("junjunjun_role_menu_item")
public class RoleMenuItem extends BaseEntity {
    @TableField("role_id")
    @NotNull(message = "角色不能为空",groups = {Update.class, Create.class})
    private Long roleId;
    @TableField("menu_id")
    @NotNull(message = "菜单不能为空",groups = {Update.class, Create.class})
    private Long menuId;
}
  1. Setting
java 复制代码
package com.junjunjun.aiwork.entity.system;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.validate.Create;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.*;
import lombok.experimental.Accessors;

/**
 * 系统配置
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName("junjunjun_setting")
public class Setting extends BaseEntity {
    @NotBlank(message = "key不能为空",groups = {Update.class, Create.class})
    @TableField("key_")
    private String key;
    @NotBlank(message = "值不能为空",groups = {Update.class, Create.class})
    private String value;
}
  1. Interview
java 复制代码
package com.junjunjun.aiwork.entity.data;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.entity.user.User;
import lombok.*;
import lombok.experimental.Accessors;

import java.util.Date;
import java.util.List;

/**
 * 面试记录
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName("junjunjun_interview")
public class Interview extends BaseEntity {
    /**
     *面试时间
     */
    private Date date;
    /**
     * 职位描述
     */
    private String job;
    /**
     * 面试人
     */
    private Long user;
    /**
     * 简历
     */
    private Long resume;

    /**
     * 面试建议
     */
    private String result;

    /**
     * 面试打分
     */
    private double scope;

    /**
     * 面试状态:1待面试,2面试中,3已结束,4已取消
     */
    private String status;

    /**
     *面试类型:1技术面试,2HR面试,3老板面试
     */
    private String type;

    /**
     *面试时间
     */
    @TableField(exist = false)
    private Date start;
    /**
     *面试时间
     */
    @TableField(exist = false)
    private Date end;

    //数据库忽略,关联的用户信息
    @TableField(exist = false)
    private User userInfo;

    //数据库忽略,关联的用户信息
    @TableField(exist = false)
    private Resume resumeInfo;

    //面试题目
    @TableField(exist = false)
    private List<QuestionItem> items;
}
  1. QuestionItem
java 复制代码
package com.junjunjun.aiwork.entity.data;

import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.validate.Create;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.Accessors;

/**
 * 面试的题目
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName("junjunjun_question_item")
public class QuestionItem extends BaseEntity {
    /**
     * 题目
     */
    @NotBlank(message = "题目不能为空",groups = {Create.class})
    private String question;
    /**
     * 答案
     */
    @NotBlank(message = "答案不能为空",groups = {Update.class})
    private String answer;
    /**
     * 所属面试
     */
    @NotNull(message = "所属面试不能为空",groups = {Update.class,Create.class})
    private Long interview;
}
  1. Resume
java 复制代码
package com.junjunjun.aiwork.entity.data;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.junjunjun.aiwork.entity.BaseEntity;
import com.junjunjun.aiwork.entity.user.User;
import com.junjunjun.aiwork.validate.Create;
import com.junjunjun.aiwork.validate.Update;
import jakarta.validation.constraints.NotBlank;
import lombok.*;
import lombok.experimental.Accessors;

import java.util.Date;

/**
 * 个人简历
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
@Accessors(chain = true)
@EqualsAndHashCode( callSuper =true)
@TableName("junjunjun_resume")
public class Resume extends BaseEntity {
    /**
     * 简历名称
     */
    @NotBlank(message = "名称不能为空",groups = {Update.class, Create.class})
    private String name;
    /**
     * 文件路径
     */
    private String file;
    /**
     * 标签
     */
    private String tag;
    /**
     * 文件内容
     */
    private String fileinfo;
    /**
     * 文件内容
     */
    private String content;
    /**
     * 上传时间
     */
    @TableField(value = "create_date")
    private Date createDate;
    /**
     * 所属用户
     */
    @TableField("user_id")
    private Long user;

    //数据库忽略,关联的用户信息
    @TableField(exist = false)
    private User userInfo;
}

2.3. dao 层定义实现

  1. BaseDao
java 复制代码
package com.junjunjun.aiwork.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.junjunjun.aiwork.entity.BaseEntity;

public interface BaseDao<T extends BaseEntity> extends BaseMapper<T> {
}
  1. UserDao
java 复制代码
package com.junjunjun.aiwork.dao.user;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.system.Role;
import com.junjunjun.aiwork.entity.user.User;
import org.apache.ibatis.annotations.*;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

@Mapper
public interface UserDao extends BaseDao<User> {
    @Select("select count(*) from junjunjun_user where deleted=0 and id in (select user_id from junjunjun_user_role_item where role_id = #{roleId})")
    long countByRole(long roleId);

    @Select("select count(*) from junjunjun_user where deleted=0 and id in (select user_id from junjunjun_user_role_item where role_id = #{roleId})")
    Long countByDayAndRole(Date day, long roleId);
//    @Select("select * from junjunjun_role where deleted=0 and id = #{id}")
//    @Results(id="userMap",value={
//            @Result(column="id", property="roles",javaType= List.class, many=@Many(select="com.junjunjun.aiwork.dao.system.RoleDao.selectAllByUserId" ))
//    })
//    User selectById(Serializable id);
//
//    @Override
//    @Results(id="userMap",value={
//            @Result(column="id", property="roles",javaType= List.class, many=@Many(select="com.junjunjun.aiwork.dao.system.RoleDao.selectAllByUserId" ))
//    })
//    default User selectOne(Wrapper<User> queryWrapper) {
//        return BaseDao.super.selectOne(queryWrapper);
//    }
//
//    @Override
//    @Results(id="userMap",value={
//            @Result(column="id", property="roles",javaType= List.class, many=@Many(select="com.junjunjun.aiwork.dao.system.RoleDao.selectAllByUserId" ))
//    })
//    default <P extends IPage<User>> P selectPage(P page, Wrapper<User> queryWrapper) {
//        return BaseDao.super.selectPage(page, queryWrapper);
//    }
}
  1. UserRoleItemDao
java 复制代码
package com.junjunjun.aiwork.dao.user;

import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.user.UserRoleItem;
import jakarta.validation.constraints.NotNull;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserRoleItemDao extends BaseDao<UserRoleItem> {
    @Delete("delete from junjunjun_user_role_item where user_id = #{id}")
    void deleteByUserId( Long id);
}
  1. LogDao
java 复制代码
package com.junjunjun.aiwork.dao.system;

import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.system.Log;
import com.junjunjun.aiwork.entity.system.Setting;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface LogDao extends BaseDao<Log> {
}
  1. MenuDao
java 复制代码
package com.junjunjun.aiwork.dao.system;

import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.system.Menu;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface MenuDao extends BaseDao<Menu> {
    /**
     * 查询角色对应的菜单数据
     * @param id 角色数据
     * @return 角色对应的菜单数据
     */
    @Select("select * from junjunjun_menu where deleted=0 and id in (select menu_id from junjunjun_role_menu_item where role_id = #{roleId})")
    List<Menu> selectAllByRoleId(@Param("roleId") Long id);
}
  1. RoleDao
java 复制代码
package com.junjunjun.aiwork.dao.system;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.system.Menu;
import com.junjunjun.aiwork.entity.system.Role;
import org.apache.ibatis.annotations.*;

import java.io.Serializable;
import java.util.List;

@Mapper
public interface RoleDao extends BaseDao<Role> {
//    @Select("select * from junjunjun_role where id = #{id} and deleted=0")
//    @Results(id="roleMap",value={
//            @Result(property = "id", column = "id"),
//        @Result(column="id", property="menus",javaType= List.class, many=@Many(select="com.junjunjun.aiwork.dao.system.MenuDao.selectAllByRoleId" ))
//    })
//    Role selectById(Serializable id);
//
//    @Override
//    @Results(id="roleMap",value={
//            @Result(property = "id", column = "id"),
//            @Result(column="id", property="menus",javaType= List.class, many=@Many(select="com.junjunjun.aiwork.dao.system.MenuDao.selectAllByRoleId" ))
//    })
//    List<Role> selectList(IPage<Role> page, @Param("ew") Wrapper<Role> queryWrapper);
//
//    @Override
//    @Results(id="roleMap",value={
//            @Result(property = "id", column = "id"),
//            @Result(column="id", property="menus",javaType= List.class, many=@Many(select="com.junjunjun.aiwork.dao.system.MenuDao.selectAllByRoleId" ))
//    })
//    List<Role> selectList(@Param("ew") Wrapper<Role> queryWrapper);

    /**
     * 查询用户对应的角色数据
     * @param id 用户数据
     * @return 用户对应的角色数据
     */
    @Select("select * from junjunjun_role where  deleted=0 and id in (select role_id from junjunjun_user_role_item where user_id = #{userId})")
    List<Role> selectAllByUserId(@Param("userId") Long id);
}
  1. RoleMenuItemDao
java 复制代码
package com.junjunjun.aiwork.dao.system;

import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.system.Menu;
import com.junjunjun.aiwork.entity.system.Role;
import com.junjunjun.aiwork.entity.system.RoleMenuItem;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface RoleMenuItemDao extends BaseDao<RoleMenuItem> {
    @Delete("delete from junjunjun_role_menu_item where role_id = #{id}")
    void deleteByRoleId(Long id);
//    void sysncMenuByRole(Role role,  List<Menu> menus);
}
  1. SettingDao
java 复制代码
package com.junjunjun.aiwork.dao.system;

import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.system.Setting;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface SettingDao extends BaseDao<Setting> {
}
  1. InterviewDao
java 复制代码
package com.junjunjun.aiwork.dao.data;

import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.data.Interview;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface InterviewDao extends BaseDao<Interview> {
}
  1. QuestionItemDao
java 复制代码
package com.junjunjun.aiwork.dao.data;

import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.data.QuestionItem;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface QuestionItemDao extends BaseDao<QuestionItem> {
}
  1. ResumeDao
java 复制代码
package com.junjunjun.aiwork.dao.data;

import com.junjunjun.aiwork.dao.BaseDao;
import com.junjunjun.aiwork.entity.data.Resume;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ResumeDao extends BaseDao<Resume> {
}

未完待续!

相关推荐
当时只道寻常20 小时前
Vue3 集成 NProgress 进度条:从入门到精通
前端·vue.js
kyriewen20 小时前
React性能优化:从“卡成狗”到“丝般顺滑”的5个秘诀
前端·react.js·性能优化
米丘20 小时前
Vue 3.x 单文件组件(SFC)模板编译过程解析
前端·vue.js·编译原理
helloweilei20 小时前
Web Streams 简介
前端·javascript
悟空瞎说20 小时前
Flutter热更新 Shorebird CodePush 原理、实现细节及费用说明
前端·flutter
didadida26220 小时前
从“不存在”的重复请求,聊到 Web 存储的深坑
前端
xiaominlaopodaren20 小时前
Three.js 渲染原理-透明渲染为什么这么难
前端
云南瑞达工程材料有限公司20 小时前
云南生态袋;云南园林生态袋;昆明河道治理生态袋;边坡生态袋
面试
米丘20 小时前
vue3.x 内置指令有哪些?
前端·vue.js