基于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> {
}

未完待续!

相关推荐
晓风伴月18 分钟前
微信小程序:在ios中border边框显示不全
ios·微信小程序·小程序
Xf3n1an23 分钟前
html语法
前端·html
张拭心24 分钟前
亚马逊 AI IDE Kiro “狙击”Cursor?实测心得
前端·ai编程
岁忧26 分钟前
(nice!!!)(LeetCode 面试经典 150 题 ) 30. 串联所有单词的子串 (哈希表+字符串+滑动窗口)
java·c++·leetcode·面试·go·散列表
烛阴40 分钟前
为什么你的Python项目总是混乱?层级包构建全解析
前端·python
@大迁世界1 小时前
React 及其生态新闻 — 2025年6月
前端·javascript·react.js·前端框架·ecmascript
红尘散仙2 小时前
Rust 终端 UI 开发新玩法:用 Ratatui Kit 轻松打造高颜值 CLI
前端·后端·rust
mldong2 小时前
mldong-goframe:基于 GoFrame + Vben5 的全栈快速开发框架正式开源!
vue.js·后端·go
新酱爱学习2 小时前
前端海报生成的几种方式:从 Canvas 到 Skyline
前端·javascript·微信小程序
袁煦丞2 小时前
把纸堆变数据流!Paperless-ngx让文件管理像打游戏一样爽:cpolar内网穿透实验室第539个成功挑战
前端·程序员·远程工作