当前位置: 首页 > news >正文

基于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
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
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 {/*** 添加分页插件*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbTypereturn interceptor;}/*** 对象转化* @return*/@Beanpublic ObjectMapper objectMapper(){return  new ObjectMapper();}}
  1. SpringContextUtils
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;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {SpringContextUtils.context = applicationContext;}public static <T> T getBean(Class<T> cls){return context.getBean(cls);}
}
  1. WebMvcConfig
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 {@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");WebMvcConfigurer.super.addResourceHandlers(registry);}
}

2.2. entity 实体定义

  1. BaseEntity
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;/*** 是否删除*/@TableLogicprivate int deleted;
}
  1. User
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;@Overridepublic 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;}@Overridepublic String getUsername() {return account;}
}
  1. UserRoleItem
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
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;//操作客户端IPprivate String ip;//操作客户端IPprivate String url;//操作客户端IPprivate String requestmethod;/***面试时间*/@TableField(exist = false)private Date start;/***面试时间*/@TableField(exist = false)private Date end;
}
  1. Menu
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;@Overridepublic String getAuthority() {return permission;}
}
  1. Role
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;@Overridepublic String getAuthority() {return permission;}
}
  1. RoleMenuItem
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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> {
}

未完待续!

http://www.lryc.cn/news/586912.html

相关文章:

  • 在人工智能自动化编程时代:AI驱动开发和传统软件开发的分析对比
  • ECU(电子控制单元)是什么?
  • Hashtable 与 HashMap 的区别笔记
  • LeetCode|Day9|976. 三角形的最大周长|Python刷题笔记
  • 代码部落 20250629 CSP-S复赛 模拟赛
  • 代码随想录算法训练营第十八天
  • 攻防世界——Web题 very_easy_sql
  • 解析磁盘文件系统
  • 面试150 从中序与后序遍历构造二叉树
  • 手写std::optional:告别空指针的痛苦
  • HTTP与HTTPS详解
  • 20250713 保存 PGM / PPM 图片 C++
  • COZE token刷新
  • 一文读懂现代卷积神经网络—使用块的网络(VGG)
  • 2025江苏省信息安全管理与评估赛项二三阶段任务书
  • 改进后的 OpenCV 5.x + GStreamer + Python 3.12 编译流程(适用于 Orange Pi / ARM64)
  • 3.7 ASPICE的问题解决与改进过程
  • Linux-网络管理
  • iTestin 自动化录制工具
  • Kimi K2深度解析:开源万亿参数大模型,复杂场景能力强悍,为AI Agent而生!
  • Vision Kit之文档扫描
  • 【PyMuPDF】PDF图片处理过程内存优化分析
  • 论文Review 3DGSSLAM GauS-SLAM: Dense RGB-D SLAM with Gaussian Surfels
  • kettle从入门到精通 第102课 ETL之kettle xxl-job调度kettle的两种方式
  • 归并排序递归法和非递归法的简单简单介绍
  • 三种网络类型
  • X00211-基于残差edge-graph注意力机制的深度强化学习优化车辆路径问题
  • RedisJSON 技术揭秘(五)`JSON.ARRPOP` 原子弹出 修改数组的终极手段
  • 基于Java Web的销售管理系统设计系统
  • 操作系统--用户态和内核态