本节介绍本项目后端的基础框架搭建,包括基础的增删改查功能,以及权限校验,日志记录,参数校验等基础功能的实现。
源码下载: 点击下载
讲解视频:
Uniapp+Springboot+Kimi实现模拟面试小程序-前端项目搭建
一.基础框架
后端一般包括dao/mapper/serice/conrtoller/vo/entity/utils/sdk/resource/config等基础包,分别定义不通的功能。
- dao/mapper 系统数据库操作层,负责和数据库进行交互,本系统使用mybatis-plus实现。
- service 业务逻辑层,进行系统业务逻辑处理。
- comtroller resetful api接口层,负责对外提供api接口。
- vo 和前端表单数据结构对应,负责通过接口与前端接收和传递数据信息。
- entity 系统实体定义,和数据库表结构一一对应。
- utils 系统工具方法
- sdk 第三方sdk,本系统主要集成kimi的sdk接口工具。
- resource 静态资源及配置文件信息。
- config 系统配置类型,包括权限配置/mybatis等的相关配置文件。
具体项目结构如下;
二.基础功能
后端一般包括基础的增删改查/接口开发/事务管理/日志记录/权限管理/接口参数合法性校验等基本功能。
2.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("-----------------------系统启动完成-----------------------");
}
}
- 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();
}
}
- 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);
}
}
- 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 实体定义
- 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;
}
- 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;
}
}
- 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;
}
- 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;
}
- 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;
}
}
- 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;
}
}
- 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;
}
- 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;
}
- 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;
}
- 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;
}
- 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 层定义实现
- 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> {
}
- 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);
// }
}
- 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);
}
- 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> {
}
- 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);
}
- 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);
}
- 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);
}
- 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> {
}
- 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> {
}
- 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> {
}
- 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> {
}
未完待续!