当前位置: 首页 > 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.dtcms.com/a/277416.html

相关文章:

  • AI 助力:如何批量提取 Word 表格字段并导出至 Excel
  • React强大且灵活hooks库——ahooks入门实践之生命周期类hook(lifecycle)详解
  • vite---环境变量和模式配置(.env 文件)
  • 【论文阅读】Think Only When You Need with Large Hybrid-Reasoning Models
  • Linux进程状态实战指南:转换关系、监控命令与状态解析
  • 【Linux | 网络】应用层(HTTP)
  • html-input 系列
  • 二进制、八进制、十进制、十六进制的转换
  • 用 Node.js 构建模块化的 CLI 脚手架工具,从 GitHub 下载远程模板
  • HarmonyOS-ArkUI Web控件基础铺垫1-HTTP协议-数据包内容
  • 【基于开源大模型(如deepseek)开发应用及其发展趋势的一点思考】
  • 早期 CNN 的经典模型—卷积神经网络(LeNet)
  • 在Linux文件写入软件设计中,直接写入SSD时磁盘写入抖动(I/O延迟波动)的解决方案
  • [CH582M入门第六步]软件IIC驱动AHT10
  • Leetcode 3613. Minimize Maximum Component Cost
  • Vue文件上传实战指南
  • 深入理解 Linux 文件系统层级结构
  • Python 数据挖掘之数据探索
  • CCS-MSPM0G3507-7-模块篇-MPU6050的基本使用
  • Spring Boot 安全登录系统:前后端分离实现
  • MYSQL笔记1
  • 黑马点评系列问题之p63unlock.lua不知道怎么整
  • 嵌入式单片机开发 - Keil MDK 自定义 Output 与 Listing 输出
  • EtherCAT开源主站 SOEM 2.0 最新源码在嵌入式 Linux 下的移植与编译
  • 2025.7.13总结
  • 欧拉系统安装UKUI桌面环境
  • 无缝衔接直播流体验
  • Git Commit Message写错后如何修改?已Push的提交如何安全修复?
  • C#单例模式管理全局变量
  • 格密码–SIS问题,ISIS问题及nf-ISIS问题