diff --git a/.kiro/steering/项目结构说明.md b/.kiro/steering/项目结构说明.md index 728530b..6728228 100644 --- a/.kiro/steering/项目结构说明.md +++ b/.kiro/steering/项目结构说明.md @@ -99,6 +99,12 @@ offerpie/back-end │ ├─ UserProfileProjectMapper.java # 用户项目经历Mapper │ ├─ UserProfileCompetitionMapper.java # 用户竞赛经历Mapper │ ├─ UserProfileSkillTagRelationMapper.java # 用户技能标签关联Mapper + │ ├─ UserResumeMapper.java # 用户简历Mapper + │ ├─ UserResumeEducationMapper.java # 简历-教育经历Mapper + │ ├─ UserResumeWorkMapper.java # 简历-工作经历Mapper + │ ├─ UserResumeInternshipMapper.java # 简历-实习经历Mapper + │ ├─ UserResumeProjectMapper.java # 简历-项目经历Mapper + │ ├─ UserResumeCompetitionMapper.java # 简历-竞赛经历Mapper │ └─ AppJobDataMapper.java # 爬虫岗位原始数据Mapper ├─ pojo/ │ ├─ po/ # 持久化实体 @@ -130,6 +136,12 @@ offerpie/back-end │ │ ├─ UserProfileProject.java # 用户项目经历表(bg_user_profile_project) │ │ ├─ UserProfileCompetition.java # 用户竞赛经历表(bg_user_profile_competition) │ │ ├─ UserProfileSkillTagRelation.java # 用户技能标签关联表(bg_user_profile_skill_tag_relation) + │ │ ├─ UserResume.java # 用户简历表(bg_user_resume,简历维度信息+个人基本信息合并存储) + │ │ ├─ UserResumeEducation.java # 简历-教育经历表(bg_user_resume_education) + │ │ ├─ UserResumeWork.java # 简历-工作经历表(bg_user_resume_work) + │ │ ├─ UserResumeInternship.java # 简历-实习经历表(bg_user_resume_internship) + │ │ ├─ UserResumeProject.java # 简历-项目经历表(bg_user_resume_project) + │ │ ├─ UserResumeCompetition.java # 简历-竞赛经历表(bg_user_resume_competition) │ │ └─ AppJobData.java # 爬虫岗位原始数据表(app_job_data) │ └─ vo/ # ViewObject(OssUrlVo、DescriptionParagraph、JobListItemVo、UserHonorsVo 等) ├─ resources/mapper/ # MyBatis XML 映射文件 @@ -143,7 +155,7 @@ offerpie/back-end |------|----------|-----------| | **client-api** | - 面向终端用户的 REST API
- 启动 Spring Boot 应用
- 短信验证码登录(含自动注册、邀请码绑定)
- **功能权限校验**:注解 + 切面 + 权限服务(校验、扣减、回退)
- **路由菜单**:获取用户有效菜单树 | `ClientApplication`、`LoginController`、`RouteMenuController`、`FuncPermission`、`FuncPermissionAspect`、`FuncPermissionService`、`RouteMenuService`、`UserRegisterService`、`RouteMenuVo` | | **common** | - **统一配置**:OSS、Redis、Security、WxPay、Sms、Async 等
- **跨层工具**:HTTP、IP、认证、验证码、Redis Server 等
- **全局拦截/切面**:日志、TraceId、黑名单、SQL 打印
- **统一异常/响应**:`GlobalExceptionAdvice`、`UnifiedResponse`
- **业务抽象**:邮件发送、微信支付(Native/JS/Transfer)、异步任务
- **公共 POJO**:登录令牌、防重放信息等 | `config/`, `tool/`, `interceptor/`, `aop/`, `exception/`, `email/`, `wxPay/`, `pojo/` | -| **manager** | - **业务实体**(`User`、`OssFile`、`UserInvite`、`RouteMenu`、`FuncPermission`、`UserRouteMenuStock`、`UserFuncPermissionStock`、`UserFuncUsageLog`、`ChinaRegionsCode`、`JobCategory`、`Company`、`Job`、`JobRegionRelation`、`Industry`、`SkillTag`、`UserJobFavorite`、`UserJobApplication`、`UserJobDislike`、`AppJobData`)
- **MyBatis Mapper**(`UserMapper`、`OssFileMapper`、`UserInviteMapper`、`RouteMenuMapper`、`FuncPermissionMapper`、`UserRouteMenuStockMapper`、`UserFuncPermissionStockMapper`、`UserFuncUsageLogMapper`、`ChinaRegionsCodeMapper`、`JobCategoryMapper`、`CompanyMapper`、`JobMapper`、`JobRegionRelationMapper`、`IndustryMapper`、`SkillTagMapper`、`UserJobFavoriteMapper`、`UserJobApplicationMapper`、`UserJobDislikeMapper`、`AppJobDataMapper`)
- **业务 API**:文件上传/下载、健康检查等
- **业务逻辑**:服务层、工具类等
- **既供 B 端 UI(待实现)使用,也供 C 端业务直接调用** | `controller/`, `mapper/`, `pojo/po/`, `pojo/vo/`, `service/`, `constant/` | +| **manager** | - **业务实体**(`User`、`OssFile`、`UserInvite`、`RouteMenu`、`FuncPermission`、`UserRouteMenuStock`、`UserFuncPermissionStock`、`UserFuncUsageLog`、`ChinaRegionsCode`、`JobCategory`、`Company`、`Job`、`JobRegionRelation`、`Industry`、`SkillTag`、`UserJobFavorite`、`UserJobApplication`、`UserJobDislike`、`AppJobData`、`UserResume`、`UserResumeEducation`、`UserResumeWork`、`UserResumeInternship`、`UserResumeProject`、`UserResumeCompetition`)
- **MyBatis Mapper**(`UserMapper`、`OssFileMapper`、`UserInviteMapper`、`RouteMenuMapper`、`FuncPermissionMapper`、`UserRouteMenuStockMapper`、`UserFuncPermissionStockMapper`、`UserFuncUsageLogMapper`、`ChinaRegionsCodeMapper`、`JobCategoryMapper`、`CompanyMapper`、`JobMapper`、`JobRegionRelationMapper`、`IndustryMapper`、`SkillTagMapper`、`UserJobFavoriteMapper`、`UserJobApplicationMapper`、`UserJobDislikeMapper`、`AppJobDataMapper`、`UserResumeMapper`、`UserResumeEducationMapper`、`UserResumeWorkMapper`、`UserResumeInternshipMapper`、`UserResumeProjectMapper`、`UserResumeCompetitionMapper`)
- **业务 API**:文件上传/下载、健康检查等
- **业务逻辑**:服务层、工具类等
- **既供 B 端 UI(待实现)使用,也供 C 端业务直接调用** | `controller/`, `mapper/`, `pojo/po/`, `pojo/vo/`, `service/`, `constant/` | ## 3️⃣ 关键业务实体 | 实体 | 所属模块 | 作用概述 | @@ -180,6 +192,12 @@ offerpie/back-end | `JobSkillTagRelation` | manager | 岗位-技能标签关联表(bg_job_skill_tag_relation),AI提取的技能标签与岗位的关联,用于匹配度计算。 | | `UserProfileSkillTagRelation` | manager | 用户技能标签关联表(bg_user_profile_skill_tag_relation),记录用户匹配的技能标签,由AI自动识别生成。 | | `AppJobData` | manager | 爬虫岗位原始数据表(app_job_data),存储爬虫抓取的原始岗位数据,供清洗服务读取并写入业务表。 | +| `UserResume` | manager | 用户简历表(bg_user_resume),简历维度信息(名称、目标岗位、默认标记、排序)+ 个人基本信息(姓名、联系方式、技能、证书、个人概述等)合并存储,一个用户可有多份简历。 | +| `UserResumeEducation` | manager | 简历-教育经历表(bg_user_resume_education),学校、专业、学历(文本)、学习形式(文本)、起止时间、描述段落。 | +| `UserResumeWork` | manager | 简历-工作经历表(bg_user_resume_work),公司、职位、起止时间、描述段落。 | +| `UserResumeInternship` | manager | 简历-实习经历表(bg_user_resume_internship),公司、职位、起止时间、描述段落。 | +| `UserResumeProject` | manager | 简历-项目经历表(bg_user_resume_project),公司、项目名、角色、起止时间、描述段落。 | +| `UserResumeCompetition` | manager | 简历-竞赛经历表(bg_user_resume_competition),竞赛名、奖项、获奖时间、描述段落。 | ## 4️⃣ 权限体系设计 ### 整体架构 diff --git a/manager/src/main/java/org/jiayunet/mapper/UserResumeCompetitionMapper.java b/manager/src/main/java/org/jiayunet/mapper/UserResumeCompetitionMapper.java new file mode 100644 index 0000000..003c96a --- /dev/null +++ b/manager/src/main/java/org/jiayunet/mapper/UserResumeCompetitionMapper.java @@ -0,0 +1,12 @@ +package org.jiayunet.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jiayunet.pojo.po.UserResumeCompetition; + +/** + * 简历-竞赛经历Mapper + * + * @author zk + */ +public interface UserResumeCompetitionMapper extends BaseMapper { +} diff --git a/manager/src/main/java/org/jiayunet/mapper/UserResumeEducationMapper.java b/manager/src/main/java/org/jiayunet/mapper/UserResumeEducationMapper.java new file mode 100644 index 0000000..b347d0a --- /dev/null +++ b/manager/src/main/java/org/jiayunet/mapper/UserResumeEducationMapper.java @@ -0,0 +1,12 @@ +package org.jiayunet.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jiayunet.pojo.po.UserResumeEducation; + +/** + * 简历-教育经历Mapper + * + * @author zk + */ +public interface UserResumeEducationMapper extends BaseMapper { +} diff --git a/manager/src/main/java/org/jiayunet/mapper/UserResumeInternshipMapper.java b/manager/src/main/java/org/jiayunet/mapper/UserResumeInternshipMapper.java new file mode 100644 index 0000000..30f2389 --- /dev/null +++ b/manager/src/main/java/org/jiayunet/mapper/UserResumeInternshipMapper.java @@ -0,0 +1,12 @@ +package org.jiayunet.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jiayunet.pojo.po.UserResumeInternship; + +/** + * 简历-实习经历Mapper + * + * @author zk + */ +public interface UserResumeInternshipMapper extends BaseMapper { +} diff --git a/manager/src/main/java/org/jiayunet/mapper/UserResumeMapper.java b/manager/src/main/java/org/jiayunet/mapper/UserResumeMapper.java new file mode 100644 index 0000000..a31554b --- /dev/null +++ b/manager/src/main/java/org/jiayunet/mapper/UserResumeMapper.java @@ -0,0 +1,12 @@ +package org.jiayunet.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jiayunet.pojo.po.UserResume; + +/** + * 用户简历Mapper + * + * @author zk + */ +public interface UserResumeMapper extends BaseMapper { +} diff --git a/manager/src/main/java/org/jiayunet/mapper/UserResumeProjectMapper.java b/manager/src/main/java/org/jiayunet/mapper/UserResumeProjectMapper.java new file mode 100644 index 0000000..b1b8a32 --- /dev/null +++ b/manager/src/main/java/org/jiayunet/mapper/UserResumeProjectMapper.java @@ -0,0 +1,12 @@ +package org.jiayunet.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jiayunet.pojo.po.UserResumeProject; + +/** + * 简历-项目经历Mapper + * + * @author zk + */ +public interface UserResumeProjectMapper extends BaseMapper { +} diff --git a/manager/src/main/java/org/jiayunet/mapper/UserResumeWorkMapper.java b/manager/src/main/java/org/jiayunet/mapper/UserResumeWorkMapper.java new file mode 100644 index 0000000..16e1477 --- /dev/null +++ b/manager/src/main/java/org/jiayunet/mapper/UserResumeWorkMapper.java @@ -0,0 +1,12 @@ +package org.jiayunet.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jiayunet.pojo.po.UserResumeWork; + +/** + * 简历-工作经历Mapper + * + * @author zk + */ +public interface UserResumeWorkMapper extends BaseMapper { +} diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserResume.java b/manager/src/main/java/org/jiayunet/pojo/po/UserResume.java new file mode 100644 index 0000000..9eda186 --- /dev/null +++ b/manager/src/main/java/org/jiayunet/pojo/po/UserResume.java @@ -0,0 +1,82 @@ +package org.jiayunet.pojo.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; + +import java.time.Instant; +import java.util.List; + +/** + * 用户简历表(bg_user_resume) + *

简历维度信息 + 个人基本信息合并存储,个人信息与简历一对一,无需拆表

+ * + * @author zk + */ +@Data +@TableName(value = "bg_user_resume", autoResultMap = true) +public class UserResume { + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** 用户ID */ + private Long userId; + + // ========== 简历维度信息(非简历文本内容) ========== + + /** 简历名称(非简历文本内容) */ + private String resumeName; + + /** 目标岗位(非简历文本内容) */ + private String targetPosition; + + /** 是否默认简历 0=否 1=是 */ + private Integer isDefault; + + /** 排序序号,越小越靠前 */ + private Integer sortOrder; + + // ========== 简历个人信息(简历文本内容,与简历一对一) ========== + + /** 头像URL */ + private String avatarUrl; + + /** 真实姓名 */ + private String name; + + /** 邮箱 */ + private String email; + + /** 手机号码 */ + private String mobileNumber; + + /** 所在城市 */ + private String city; + + /** 微信号 */ + private String wechatNumber; + + /** 作品集链接 */ + private String portfolioUrl; + + /** 技能标签列表 */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List skills; + + /** 证书标签列表 */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List certificates; + + /** 个人概述 */ + private String summary; + + /** 简历创建时间 */ + private Instant createTime; + + /** 简历整体修改时间 */ + private Instant updateTime; +} diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserResumeCompetition.java b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeCompetition.java new file mode 100644 index 0000000..89c2cab --- /dev/null +++ b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeCompetition.java @@ -0,0 +1,53 @@ +package org.jiayunet.pojo.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import org.jiayunet.pojo.vo.DescriptionParagraph; + +import java.time.Instant; +import java.util.List; + +/** + * 简历-竞赛经历表(bg_user_resume_competition) + * + * @author zk + */ +@Data +@TableName(value = "bg_user_resume_competition", autoResultMap = true) +public class UserResumeCompetition { + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** 关联bg_user_resume.id */ + private Long resumeId; + + /** 用户ID(冗余,便于直接按用户查询) */ + private Long userId; + + /** 竞赛名称 */ + private String competitionName; + + /** 获奖情况,如全国二等奖 */ + private String award; + + /** 获奖时间,格式:2023.07 */ + private String awardDate; + + /** 描述段落,id为前端生成的短标识,用于简历优化时精确定位段落 */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List description; + + /** 排序序号,越小越靠前 */ + private Integer sortOrder; + + /** 创建时间 */ + private Instant createTime; + + /** 更新时间 */ + private Instant updateTime; +} diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserResumeEducation.java b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeEducation.java new file mode 100644 index 0000000..e432ded --- /dev/null +++ b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeEducation.java @@ -0,0 +1,62 @@ +package org.jiayunet.pojo.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import org.jiayunet.pojo.vo.DescriptionParagraph; + +import java.time.Instant; +import java.util.List; + +/** + * 简历-教育经历表(bg_user_resume_education) + * + * @author zk + */ +@Data +@TableName(value = "bg_user_resume_education", autoResultMap = true) +public class UserResumeEducation { + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** 关联bg_user_resume.id */ + private Long resumeId; + + /** 用户ID(冗余,便于直接按用户查询) */ + private Long userId; + + /** 学校名称 */ + private String school; + + /** 专业 */ + private String major; + + /** 学历:大专/本科/硕士/博士 */ + private String degree; + + /** 学习形式:全日制/非全日制 */ + private String studyType; + + /** 开始时间,格式:2023.09 */ + private String startDate; + + /** 结束时间,格式:2024.06 */ + private String endDate; + + /** 描述段落,id为前端生成的短标识,用于简历优化时精确定位段落 */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List description; + + /** 排序序号,越小越靠前 */ + private Integer sortOrder; + + /** 创建时间 */ + private Instant createTime; + + /** 更新时间 */ + private Instant updateTime; +} diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserResumeInternship.java b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeInternship.java new file mode 100644 index 0000000..5aec78f --- /dev/null +++ b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeInternship.java @@ -0,0 +1,56 @@ +package org.jiayunet.pojo.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import org.jiayunet.pojo.vo.DescriptionParagraph; + +import java.time.Instant; +import java.util.List; + +/** + * 简历-实习经历表(bg_user_resume_internship) + * + * @author zk + */ +@Data +@TableName(value = "bg_user_resume_internship", autoResultMap = true) +public class UserResumeInternship { + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** 关联bg_user_resume.id */ + private Long resumeId; + + /** 用户ID(冗余,便于直接按用户查询) */ + private Long userId; + + /** 公司名称 */ + private String companyName; + + /** 职位 */ + private String position; + + /** 开始时间,格式:2023.06 */ + private String startDate; + + /** 结束时间,格式:2023.09,至今则为空 */ + private String endDate; + + /** 描述段落,id为前端生成的短标识,用于简历优化时精确定位段落 */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List description; + + /** 排序序号,越小越靠前 */ + private Integer sortOrder; + + /** 创建时间 */ + private Instant createTime; + + /** 更新时间 */ + private Instant updateTime; +} diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserResumeProject.java b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeProject.java new file mode 100644 index 0000000..c9de516 --- /dev/null +++ b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeProject.java @@ -0,0 +1,59 @@ +package org.jiayunet.pojo.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import org.jiayunet.pojo.vo.DescriptionParagraph; + +import java.time.Instant; +import java.util.List; + +/** + * 简历-项目经历表(bg_user_resume_project) + * + * @author zk + */ +@Data +@TableName(value = "bg_user_resume_project", autoResultMap = true) +public class UserResumeProject { + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** 关联bg_user_resume.id */ + private Long resumeId; + + /** 用户ID(冗余,便于直接按用户查询) */ + private Long userId; + + /** 所属公司 */ + private String companyName; + + /** 项目名称 */ + private String projectName; + + /** 担任角色 */ + private String role; + + /** 开始时间,格式:2023.06 */ + private String startDate; + + /** 结束时间,格式:2023.09,至今则为空 */ + private String endDate; + + /** 描述段落,id为前端生成的短标识,用于简历优化时精确定位段落 */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List description; + + /** 排序序号,越小越靠前 */ + private Integer sortOrder; + + /** 创建时间 */ + private Instant createTime; + + /** 更新时间 */ + private Instant updateTime; +} diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserResumeWork.java b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeWork.java new file mode 100644 index 0000000..3932be9 --- /dev/null +++ b/manager/src/main/java/org/jiayunet/pojo/po/UserResumeWork.java @@ -0,0 +1,56 @@ +package org.jiayunet.pojo.po; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import org.jiayunet.pojo.vo.DescriptionParagraph; + +import java.time.Instant; +import java.util.List; + +/** + * 简历-工作经历表(bg_user_resume_work) + * + * @author zk + */ +@Data +@TableName(value = "bg_user_resume_work", autoResultMap = true) +public class UserResumeWork { + + @TableId(type = IdType.ASSIGN_ID) + private Long id; + + /** 关联bg_user_resume.id */ + private Long resumeId; + + /** 用户ID(冗余,便于直接按用户查询) */ + private Long userId; + + /** 公司名称 */ + private String companyName; + + /** 职位 */ + private String position; + + /** 开始时间,格式:2023.06 */ + private String startDate; + + /** 结束时间,格式:2023.09,至今则为空 */ + private String endDate; + + /** 描述段落,id为前端生成的短标识,用于简历优化时精确定位段落 */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List description; + + /** 排序序号,越小越靠前 */ + private Integer sortOrder; + + /** 创建时间 */ + private Instant createTime; + + /** 更新时间 */ + private Instant updateTime; +}