Files
offerpai_backend/.kiro/steering/项目结构说明.md
T
2026-07-31 16:36:41 +08:00

638 lines
58 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
inclusion: manual
---
# OfferPie BackEnd 项目结构说明
## 1️⃣ 项目整体层次
```
offerpie/back-end
├─ pom.xml # 父 Maven 项目,统一管理依赖、插件、属性
├─ clientapi/ # **C 端**(面向用户)API 服务,启动类 ClientApplication
│ ├─ pom.xml
│ └─ src/main/java
│ └─ org.jiayunet
│ ├─ ClientApplication.java # Spring Boot 主入口(C 端)
│ ├─ annotation/
│ │ └─ FuncPermission.java # 功能权限校验注解(标记在Controller方法上)
│ ├─ aop/
│ │ └─ FuncPermissionAspect.java # 功能权限校验切面(拦截注解,校验+扣减+异常回退)
│ ├─ controller/
│ │ ├─ LoginController.java # 登录相关接口(发送验证码、短信登录、检查登录状态)
│ │ ├─ RouteMenuController.java # 路由菜单接口(获取用户有效菜单树)
│ │ ├─ UserProfileController.java # 用户个人资料接口(主表+5张子表的查询与保存)
│ │ ├─ UserManageController.java # 用户账号管理接口(查看/修改个人信息、注销账号、邀请统计)
│ │ ├─ UserFeedbackController.java # 用户反馈接口(提交反馈)
│ │ ├─ UserResumeController.java # 用户简历接口(简历列表、主表及5张子表的CRUD、子表单条添加/编辑/删除、简历删除、设置默认简历)
│ │ ├─ JobIntentionController.java # 求职意向接口(查询与保存)
│ │ ├─ JobController.java # 岗位接口(岗位列表查询、收藏、投递、不感兴趣、求职助手任务列表、AI岗位推荐)
│ │ ├─ JobAgentConfigController.java # 求职助手配置接口(配置查询与保存)
│ │ ├─ CompanyController.java # 公司接口(查询公司类型列表,/company)
│ │ ├─ RecruitAnnouncementController.java # 招聘公告接口(公开免鉴权,/public/recruitAnnouncement
│ │ ├─ MentorController.java # 导师接口(对接简历星球开放平台,公开免鉴权,/public/mentor
│ │ ├─ MemberProductController.java # 会员商品接口(商品列表、创建订单、查询订单详情)【暂未启用,注释@RestController】
│ │ ├─ MemberStatusController.java # 会员状态接口(查询会员状态、查询功能权限库存)
│ │ └─ MessageController.java # 站内信消息接口(消息列表、未读数、按类型未读数、标记已读)
│ ├─ service/
│ │ ├─ LoginService.java # 登录业务逻辑(验证码校验、自动注册、JWT生成、Cookie设置)
│ │ ├─ UserRegisterService.java # 用户注册服务(注册逻辑、邀请码生成与绑定)
│ │ ├─ UserManageService.java # 用户账号管理服务(查看/修改个人信息、注销账号、邀请统计)
│ │ ├─ UserFeedbackService.java # 用户反馈服务(提交反馈记录)
│ │ ├─ FuncPermissionService.java # 功能权限服务(校验、扣减、查询、添加库存、回退)
│ │ ├─ RouteMenuService.java # 路由菜单服务(查询、添加库存、获取用户菜单树)
│ │ ├─ UserProfileService.java # 用户个人资料服务(主表+5张子表的CRUD)
│ │ ├─ JobIntentionService.java # 求职意向服务(查询与保存/更新)
│ │ ├─ JobService.java # 岗位服务(岗位列表查询、匹配度计算编排、求职助手任务列表、AI岗位推荐)
│ │ ├─ JobAgentConfigService.java # 求职助手配置服务(配置查询与保存)
│ │ ├─ CompanyService.java # 公司服务(公司类型去重列表,兜底过滤NULL与空白值)
│ │ ├─ RecruitAnnouncementService.java # 招聘公告服务(列表/详情/推荐/统计/筛选项/投递入口)
│ │ ├─ UserResumeService.java # 用户简历服务(简历列表、主表及5张子表的CRUD、子表单条添加/编辑/删除、设置默认简历)
│ │ ├─ MemberProductService.java # 会员商品服务(商品列表、创建订单、支付回调处理)【暂未启用,注释@Service】
│ │ ├─ MemberGrantService.java # 会员权益发放服务(续费会员+发放功能/菜单权限)
│ │ ├─ MemberStatusService.java # 会员状态查询服务(查询会员状态、功能权限库存详情)
│ │ ├─ MessageQueryService.java # 站内信查询服务(消息分页列表、未读数、按类型未读数)
│ │ ├─ AlipayNotifyMessageAbstractImpl.java # 支付宝支付回调实现(验证流水+更新状态+触发发放)【暂未启用】
│ │ └─ WxPayNotifyMessageAbstractImpl.java # 微信支付回调实现(验证流水+更新状态+触发发放)
│ └─ pojo/
│ ├─ param/
│ │ ├─ userProfile/ # 个人资料入参(UserProfileParam、各子表Param
│ │ ├─ resume/ # 简历入参(ResumeParam、各子表Param、各子表UpdateParam、ResumeSubTableParam、ResumeInfoUpdateParam
│ │ ├─ job/ # 岗位相关入参(JobIntentionParam、JobQueryParam、JobAgentTaskQueryParam、JobAgentRecommendParam、JobApplyParam、JobApplyQueryParam、JobFavoriteQueryParam、JobDislikeParam
│ │ ├─ jobAgent/ # 求职助手入参(JobAgentConfigParam、ChatMessageParam
│ │ ├─ recruitAnnouncement/ # 招聘公告入参(RecruitAnnouncementQueryParam、RecruitAnnouncementRecommendParam
│ │ ├─ memberProduct/ # 会员商品入参(CreateOrderParam
│ │ ├─ message/ # 站内信入参(MessageQueryParam
│ │ ├─ feedback/ # 用户反馈入参(UserFeedbackParam
│ │ └─ user/ # 用户账号管理入参(UserInfoParam
│ ├─ dto/
│ │ ├─ SmsLoginDto.java # 短信登录入参(mobileNumber + code + inviteCode
│ │ ├─ userProfile/ # 个人资料出参(UserProfileDto、各子表Dto
│ │ ├─ resume/ # 简历出参(ResumeDto、ResumeListItemDto、各子表Dto
│ │ ├─ job/ # 岗位相关出参(JobIntentionDto、JobDto、JobDetailDto、JobMatchScoreDto、JobAgentRecommendDto、JobApplicationDto
│ │ ├─ jobAgent/ # 求职助手出参(JobAgentConfigDto、ChatMessageDto
│ │ ├─ recruitAnnouncement/ # 招聘公告出参(RecruitAnnouncementDto、RecruitAnnouncementDetailDto、RecruitAnnouncementRecommendDto、RecruitAnnouncementStatisticsDto
│ │ ├─ memberProduct/ # 会员商品出参(CreateOrderDto、OrderDetailDto
│ │ ├─ memberStatus/ # 会员状态出参(MemberStatusDto、FuncStockDto
│ │ ├─ message/ # 站内信出参(MessageDto、MessageUnreadCountDto
│ │ └─ user/ # 用户账号管理出参(UserInfoDto、InviteStatsDto
│ └─ vo/
│ ├─ LoginVo.java # 登录返回(userId + nick
│ ├─ RouteMenuVo.java # 路由菜单树形VO(含children子菜单)
│ ├─ JobApplyCountVo.java # 岗位投递数量统计VO
│ └─ JobFavoriteCountVo.java # 岗位收藏数量统计VO
├─ admin/ # **B 端**管理后台服务,启动类 AdminApplicationThymeleaf 页面 + REST 接口)
│ ├─ pom.xml
│ ├─ Dockerfile / Jenkinsfile / nginx.conf
│ └─ src/main
│ ├─ java/org.jiayunet
│ │ ├─ AdminApplication.java # Spring Boot 主入口(B 端)
│ │ └─ admin/
│ │ ├─ constant/
│ │ │ └─ AdminRedisKeyName.java # B 端 Redis Key 常量(login:token、login:fail、login:lock
│ │ ├─ controller/
│ │ │ ├─ AdminLoginController.java # 管理员登录(/public
│ │ │ ├─ AdminUserController.java # 用户管理(列表/统计/禁用启用,/user)
│ │ │ ├─ AdminOrderController.java # 订单管理(列表/统计,/order)
│ │ │ ├─ AdminProductController.java # 商品管理(CRUD/product
│ │ │ └─ PageController.java # 页面路由(返回Thymeleaf视图名,不走统一响应包装)
│ │ ├─ service/
│ │ │ ├─ AdminLoginService.java # 管理员登录(密码校验、失败累计3次锁4小时、JWT、多设备踢出、Cookie)
│ │ │ ├─ AdminUserService.java # 用户管理(分页+简历数量统计、新增数统计、禁用/启用)
│ │ │ ├─ AdminOrderService.java # 订单管理(分页+关联用户/商品、支付数与收入统计)
│ │ │ └─ AdminProductService.java # 商品管理(会员商品CRUD)
│ │ └─ pojo/
│ │ ├─ param/ # login/AdminLoginParam、user/UserPageParam、order/OrderPageParam、product/ProductPageParam、product/ProductSaveParam
│ │ └─ dto/ # user/UserListDto、user/UserStatsDto、order/OrderListDto、order/OrderStatsDto
│ └─ resources/ # application.yml + dev/test/prod 多环境配置、Thymeleaf 模板与静态资源
├─ common/ # **共享层**:被 C 端和 B 端共同使用的代码库
│ ├─ pom.xml
│ └─ src/main/java
│ └─ org.jiayunet
│ ├─ config/ # 统一配置
│ │ ├─ OssConfig.java # 阿里云OSS凭证配置
│ │ ├─ RedissonConf.java # Redisson客户端配置
│ │ ├─ SecurityConfig.java # Spring Security配置(JWT过滤器、app.ignore.urls 白名单)
│ │ ├─ WxPayConfig.java # 微信支付配置
│ │ ├─ SmsConfig.java # 阿里云短信客户端配置
│ │ ├─ AsyncConfig.java # 异步线程池配置
│ │ ├─ JacksonConfig.java # Jackson序列化配置
│ │ ├─ MybatisConfig.java # MyBatis-Plus配置(分页插件等)
│ │ ├─ LongListTypeHandler.java # MyBatis List<Long> JSON类型处理器
│ │ ├─ UpdateBatchMethod.java # 批量更新SQL注入策略
│ │ └─ WebConfig.java # Spring MVC拦截器注册(黑名单+防重放)
│ ├─ constant/
│ │ └─ PreRedisKeyName.java # Redis Key前缀常量(preventReplay、blackList、login:token
│ ├─ mapper/
│ │ └─ CommonMapper.java # 通用Mapper接口(继承BaseMapper,提供批量插入/更新)
│ ├─ tool/ # 工具类
│ │ ├─ HttpTool.java # HTTP请求工具
│ │ ├─ HttpIpTool.java # IP地址获取工具
│ │ ├─ AuthenticTool.java # 认证相关工具(JWT生成/解析)
│ │ ├─ ObjectTool.java # 通用对象工具
│ │ ├─ UserSecurityTool.java # 当前登录用户ID获取工具
│ │ ├─ VerifyImageCodeUtils.java # 图形验证码工具
│ │ └─ server/
│ │ └─ RedisServerTool.java # Redis操作工具(封装Redisson
│ ├─ interceptor/ # 全局拦截器/过滤器
│ │ ├─ JwtAuthenticationTokenFilter.java # JWT认证过滤器
│ │ ├─ LoggingOriginalRequestFilter.java # 请求日志过滤器
│ │ ├─ TraceIdFilter.java # TraceId链路追踪过滤器
│ │ ├─ BlackListInterceptor.java # 黑名单拦截器
│ │ ├─ PreventReplayInterceptor.java # 防重放拦截器
│ │ └─ SqlLoggerInterceptor.java # SQL日志拦截器
│ ├─ aop/
│ │ └─ ControllerLogAspect.java # Controller日志切面
│ ├─ exception/ # 业务异常定义
│ │ ├─ BusinessException.java # 业务异常
│ │ ├─ BusinessExpCodeEnum.java # 业务异常码枚举
│ │ └─ BusinessExpCodeOperations.java # 异常码操作接口
│ ├─ web/ # Spring MVC全局增强
│ │ ├─ GlobalExceptionAdvice.java # 全局异常处理器
│ │ └─ UnifiedResponseBodyAdvice.java # 统一响应体包装
│ ├─ pojo/ # 公共POJO
│ │ ├─ UnifiedResponse.java # 统一响应结构
│ │ ├─ PageParam.java # 分页请求参数基类(pageNum/pageSize/keywordpageSize上限200
│ │ ├─ PageResult.java # 分页结果包装
│ │ ├─ login/
│ │ │ └─ RedisLoginTokenInfo.java # Redis中登录Token信息结构
│ │ └─ interceptor/
│ │ └─ RedisPreventReplayInfo.java # Redis中防重放信息结构
│ ├─ email/
│ │ └─ EmailAbility.java # 邮件发送封装
│ ├─ sms/
│ │ └─ AliYunSmsAbility.java # 阿里云短信发送能力
│ ├─ oss/
│ │ └─ AliOssAbility.java # 阿里云OSS能力(上传/下载/签名URL)
│ ├─ ai/ # AI对话能力封装
│ │ ├─ AiChatAbility.java # OpenAI兼容多供应商对话
│ │ ├─ AiChatConfig.java # AI供应商配置
│ │ └─ AiResponseCleanTool.java # AI响应文本清洗工具
│ ├─ alipay/ # 支付宝支付能力
│ │ ├─ AlipayClientConfig.java # 支付宝客户端配置(@ConditionalOnProperty
│ │ ├─ AlipayPagePayAbility.java # 支付宝电脑网站支付下单
│ │ ├─ AlipayNotifyController.java # 支付宝回调入口(验签+分发)
│ │ └─ AlipayNotifyMessageAbstract.java # 支付宝回调处理抽象接口
│ └─ wxPay/ # 微信支付能力
│ ├─ WxJsPayAbility.java # 微信JS支付
│ ├─ WxNativePayAbility.java # 微信Native支付
│ ├─ WxTransferPayAbility.java # 微信转账
│ ├─ WxPayNotifyController.java # 微信支付回调入口
│ ├─ WxPayNotifyMessageAbstract.java # 微信回调处理抽象接口
│ └─ server/
│ ├─ TransferServer.java # 微信转账服务端封装
│ └─ model/ # 转账相关请求/响应模型(TransferBillsRequest/Response、CancelRequest/Response、BillNoQueryRequest、TransferNotification、TransferResultResponse、JsRequestPay
└─ manager/ # **B 端 + C 端共享** 的业务实现
├─ pom.xml
└─ src/main/java
└─ org.jiayunet
├─ constant/ # 常量枚举
│ ├─ OssBucketEnum.java # OSS Bucket枚举
│ ├─ OssPathEnum.java # OSS路径枚举
│ ├─ SmsTemplateEnum.java # 短信模板枚举
│ └─ sms/
│ ├─ SmsVariableAllows.java # 短信变量白名单
│ └─ UniversalSmsVariable.java # 通用短信变量
├─ controller/ # 对外REST接口
│ ├─ HealthCheckController.java # 健康检查接口
│ ├─ OssController.java # 文件上传/下载接口
│ ├─ AgreementController.java # 协议接口(根据协议码查询最新启用版本)
│ ├─ RegionController.java # 地区接口(树形/层级/搜索/批量查询)
│ ├─ JobCategoryController.java # 岗位分类接口(树形/层级/搜索/批量查询)
│ ├─ IndustryController.java # 行业接口(树形/层级/搜索/批量查询)
│ └─ MentorMockChatController.java # 导师模拟对话接口(/public/mentor/mockChat
├─ remote/jsxq/ # 简历星球(jianshixingqiu)开放平台远程调用
│ ├─ JsxqClient.java # 平台客户端(统一请求头、拆 {code,msg,data,ok} 包装、按类型反序列化)
│ ├─ JsxqProperties.java # 域名/令牌/租户配置
│ ├─ pojo/JsxqResponse.java # 平台统一响应结构
│ ├─ pojo/JsxqPage.java # 平台分页结构
│ ├─ pojo/param/ # MentorPageParam、QrCodeParam
│ └─ pojo/dto/ # MentorItemDto、MentorFullInfoDto、TeacherTalkDto、ChatEvaluateDto
├─ mapper/ # MyBatis Mapper
│ ├─ UserMapper.java
│ ├─ AdminUserMapper.java # 管理员用户Mapper
│ ├─ OssFileMapper.java
│ ├─ UserInviteMapper.java # 用户邀请记录Mapper
│ ├─ RouteMenuMapper.java # 路由菜单Mapper
│ ├─ FuncPermissionMapper.java # 功能权限Mapper
│ ├─ UserRouteMenuStockMapper.java # 用户路由菜单库存Mapper
│ ├─ UserFuncPermissionStockMapper.java # 用户功能权限库存Mapper
│ ├─ UserFuncUsageLogMapper.java # 用户功能使用记录Mapper
│ ├─ ChinaRegionsCodeMapper.java # 地区Mapper
│ ├─ JobCategoryMapper.java # 岗位类型Mapper
│ ├─ CompanyMapper.java # 公司Mapper
│ ├─ JobMapper.java # 岗位Mapper(含selectJobPage自定义SQL
│ ├─ JobRegionRelationMapper.java # 岗位-地区关联Mapper
│ ├─ JobSkillTagRelationMapper.java # 岗位-技能标签关联Mapper
│ ├─ IndustryMapper.java # 行业Mapper
│ ├─ SkillTagMapper.java # 技能标签Mapper(含insertIgnore自定义SQL
│ ├─ MajorCategoryMapper.java # 专业分类Mapper
│ ├─ RecruitAnnouncementMapper.java # 招聘公告主表Mapper(XML:最后更新时间、统计、列表分页、推荐分页)
│ ├─ RecruitAnnouncementYearMapper.java # 公告-招聘届数Mapper@Select分组去重)
│ ├─ RecruitAnnouncementBatchMapper.java # 公告-批次Mapper@Select分组去重)
│ ├─ RecruitAnnouncementTagMapper.java # 公告-标签Mapper@Select分组去重)
│ ├─ RecruitAnnouncementCityMapper.java # 公告-热招城市Mapper@Select分组去重)
│ ├─ RecruitAnnouncementCategoryMapper.java # 公告-岗位大类Mapper@Select分组去重)
│ ├─ RecruitAnnouncementIndustryMapper.java # 公告-行业Mapper@Select分组去重)
│ ├─ RecruitAnnouncementEducationMapper.java # 公告-学历要求Mapper@Select分组去重)
│ ├─ MentorMockChatMapper.java # 导师模拟对话缓存Mapper
│ ├─ UserJobFavoriteMapper.java # 用户收藏岗位Mapper
│ ├─ UserJobApplicationMapper.java # 用户投递记录Mapper
│ ├─ UserJobDislikeMapper.java # 用户不感兴趣记录Mapper
│ ├─ UserJobIntentionMapper.java # 用户求职意向Mapper
│ ├─ UserProfileMapper.java # 用户个人资料Mapper
│ ├─ UserProfileEducationMapper.java # 用户教育经历Mapper
│ ├─ UserProfileWorkMapper.java # 用户工作经历Mapper
│ ├─ UserProfileInternshipMapper.java # 用户实习经历Mapper
│ ├─ 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
│ ├─ ResumeDiagnosisReportMapper.java # 简历诊断报告Mapper
│ ├─ ResumeDiagnosisIssueMapper.java # 简历诊断问题Mapper
│ ├─ JobAgentConfigMapper.java # 求职助手配置Mapper
│ ├─ JobAgentChatMessageMapper.java # 求职助手对话消息Mapper
│ ├─ UserJobCustomizeResumeMapper.java # 用户岗位定制简历Mapper
│ ├─ MessageMapper.java # 站内信消息Mapper
│ ├─ MessageReadMapper.java # 消息已读状态Mapper
│ ├─ AgreementMapper.java # 协议Mapper
│ ├─ MemberProductMapper.java # 会员商品Mapper
│ ├─ MemberOrderMapper.java # 会员订单Mapper
│ ├─ MemberUserMapper.java # 会员用户Mapper
│ ├─ MemberFuncItemMapper.java # 会员功能配置项Mapper
│ ├─ MemberRouteItemMapper.java # 会员菜单配置项Mapper
│ ├─ PayWechatFlowMapper.java # 微信支付流水Mapper
│ ├─ PayAlipayFlowMapper.java # 支付宝支付流水Mapper
│ └─ UserFeedbackMapper.java # 用户反馈Mapper
├─ pojo/
│ ├─ po/ # 持久化实体
│ │ ├─ User.java
│ │ ├─ AdminUser.java # 管理员用户表(bg_admin_user
│ │ ├─ OssFile.java
│ │ ├─ UserInvite.java # 用户邀请记录表(bg_user_invite
│ │ ├─ RouteMenu.java # 路由菜单表(bg_route_menu
│ │ ├─ FuncPermission.java # 功能权限表(bg_func_permission
│ │ ├─ UserRouteMenuStock.java # 用户路由菜单库存表(bg_user_route_menu_stock
│ │ ├─ UserFuncPermissionStock.java # 用户功能权限库存表(bg_user_func_permission_stock
│ │ ├─ UserFuncUsageLog.java # 用户功能使用记录表(bg_user_func_usage_log
│ │ ├─ ChinaRegionsCode.java # 地区表(bg_china_regions_code
│ │ ├─ JobCategory.java # 岗位类型表(bg_job_category
│ │ ├─ Company.java # 公司表(bg_company
│ │ ├─ Job.java # 岗位表(bg_job
│ │ ├─ JobRegionRelation.java # 岗位-地区关联表(bg_job_region_relation
│ │ ├─ JobSkillTagRelation.java # 岗位-技能标签关联表(bg_job_skill_tag_relation
│ │ ├─ Industry.java # 行业字典表(bg_industry
│ │ ├─ SkillTag.java # 技能标签表(bg_skill_tag
│ │ ├─ MajorCategory.java # 专业分类表(bg_major_category
│ │ ├─ RecruitAnnouncement.java # 招聘公告主表(bg_recruit_announcement
│ │ ├─ RecruitAnnouncementYear.java # 公告-招聘届数关联表(bg_recruit_announcement_year
│ │ ├─ RecruitAnnouncementBatch.java # 公告-批次关联表(bg_recruit_announcement_batch
│ │ ├─ RecruitAnnouncementTag.java # 公告-标签关联表(bg_recruit_announcement_tag
│ │ ├─ RecruitAnnouncementCity.java # 公告-热招城市关联表(bg_recruit_announcement_city
│ │ ├─ RecruitAnnouncementCategory.java # 公告-岗位大类关联表(bg_recruit_announcement_category
│ │ ├─ RecruitAnnouncementIndustry.java # 公告-行业关联表(bg_recruit_announcement_industry
│ │ ├─ RecruitAnnouncementEducation.java # 公告-学历要求关联表(bg_recruit_announcement_education
│ │ ├─ MentorMockChat.java # 导师模拟对话表(bg_mentor_mock_chat,按导师ID唯一)
│ │ ├─ UserJobFavorite.java # 用户收藏岗位表(bg_user_job_favorite
│ │ ├─ UserJobApplication.java # 用户投递记录表(bg_user_job_application
│ │ ├─ UserJobDislike.java # 用户不感兴趣记录表(bg_user_job_dislike
│ │ ├─ UserJobIntention.java # 用户求职意向表(bg_user_job_intention
│ │ ├─ UserProfile.java # 用户个人资料表(bg_user_profile
│ │ ├─ UserProfileEducation.java # 用户教育经历表(bg_user_profile_education
│ │ ├─ UserProfileWork.java # 用户工作经历表(bg_user_profile_work
│ │ ├─ UserProfileInternship.java # 用户实习经历表(bg_user_profile_internship
│ │ ├─ 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
│ │ ├─ ResumeDiagnosisReport.java # 简历诊断报告表(bg_resume_diagnosis_report
│ │ ├─ ResumeDiagnosisIssue.java # 简历诊断问题表(bg_resume_diagnosis_issue
│ │ ├─ JobAgentConfig.java # 求职助手配置表(bg_job_agent_config
│ │ ├─ JobAgentChatMessage.java # 求职助手对话消息表(bg_job_agent_chat_message
│ │ ├─ UserJobCustomizeResume.java # 用户岗位定制简历表(bg_user_job_customize_resume
│ │ ├─ Message.java # 站内信消息表(bg_message
│ │ ├─ MessageRead.java # 消息已读状态表(bg_message_read
│ │ ├─ Agreement.java # 协议表(bg_agreement,版本递增)
│ │ ├─ MemberProduct.java # 会员商品表(bg_member_product
│ │ ├─ MemberOrder.java # 会员订单表(bg_member_order
│ │ ├─ MemberUser.java # 会员用户表(bg_member_user
│ │ ├─ MemberFuncItem.java # 会员功能配置项表(bg_member_func_item
│ │ ├─ MemberRouteItem.java # 会员菜单配置项表(bg_member_route_item
│ │ ├─ PayWechatFlow.java # 微信支付流水表(bg_pay_wechat_flow
│ │ ├─ PayAlipayFlow.java # 支付宝支付流水表(bg_pay_alipay_flow
│ │ └─ UserFeedback.java # 用户反馈表(bg_user_feedback
│ ├─ dto/ # Mapper 入参 / 跨模块传输对象
│ │ ├─ RecruitAnnouncementQueryDto.java # 招聘公告查询条件(供Mapper使用,避免manager反向依赖client-api
│ │ └─ mentor/MentorMockChatDto.java # 导师模拟对话出参
│ └─ vo/ # ViewObject / SQL查询结果
│ ├─ OssUrlVo.java # OSS签名URL返回
│ ├─ DescriptionParagraph.java # 描述段落对象(JSON字段通用结构)
│ ├─ LanguageAbility.java # 语言能力对象(求职助手配置JSON字段)
│ ├─ JobListItemVo.java # 岗位列表项VO
│ ├─ RecruitAnnouncementListItemVo.java # 公告列表项VO(列表与推荐共用)
│ ├─ RecruitAnnouncementStatisticsVo.java # 公告统计VO(日/月/累计)
│ ├─ UserHonorsVo.java # 用户荣誉VO
│ ├─ AgreementListVo.java # 协议列表VO
│ ├─ RegionTreeVo.java # 地区树形VO
│ ├─ RegionVo.java # 地区VO
│ ├─ JobCategoryTreeVo.java # 岗位分类树形VO
│ ├─ JobCategoryVo.java # 岗位分类VO
│ ├─ IndustryTreeVo.java # 行业树形VO
│ └─ IndustryVo.java # 行业VO
├─ resources/mapper/ # MyBatis XML映射文件
│ ├─ JobMapper.xml # 岗位自定义SQLselectJobPage
│ └─ RecruitAnnouncementMapper.xml # 公告自定义SQLselectLastCreateTime、selectStatistics、selectAnnouncementPage、selectRecommendPage
└─ service/ # 业务Service
├─ OssService.java # 文件上传/下载服务
├─ SmsService.java # 短信发送服务
├─ DictCacheService.java # 字典缓存服务(地区/岗位分类/行业树形缓存)
├─ RegionService.java # 地区服务(树形/层级/搜索/批量查询)
├─ JobCategoryService.java # 岗位分类服务(树形/层级/搜索/批量查询)
├─ IndustryService.java # 行业服务(树形/层级/搜索/批量查询)
├─ AgreementService.java # 协议服务(查询最新版本、列表、创建/编辑版本递增)
├─ MentorMockChatService.java # 导师模拟对话生成服务(查缓存→取导师信息与话题→AI生成→入库)
├─ UserProfileAnalyzeService.java # 用户简历分析服务(AI三次调用:综合分析/专业归一化/技能提取)
├─ JobMatchService.java # 岗位匹配度计算服务(教育30%+经历30%+技能40%
└─ MessageService.java # 站内信服务(发送系统/运营/订单消息)
```
> **设计理念** – 业务实体和 Mapper 位于 `manager`B 端(admin)和 C 端(client-api)共享;C 端特有的注解、切面、权限服务、路由菜单服务位于 `client-api`,B 端特有的登录与管理服务位于 `admin`;`common` 提供统一的技术支撑。
>
> **模块依赖方向**`client-api` / `admin` → `manager` → `common`,反向依赖不成立。因此 Mapper 需要接收复杂查询条件时,要在 `manager` 侧定义 DTO(如 `RecruitAnnouncementQueryDto`),不能直接引用 `client-api` 的 ParamSQL 查询结果同理放在 `manager/pojo/vo`。
## 2️⃣ 各层模块职责
| 层级 | 主要职责 | 关键类/包 |
|------|----------|-----------|
| **client-api** | - 面向终端用户的 REST API <br> - 启动 Spring Boot 应用(`ClientApplication` <br> - 短信验证码登录(含自动注册、邀请码绑定) <br> - **功能权限校验**:注解 + 切面 + 权限服务(校验、扣减、回退) <br> - **路由菜单**:获取用户有效菜单树 <br> - **用户管理**:查看/修改信息、注销账号、邀请统计 <br> - **用户反馈**:提交反馈 <br> - **会员体系**:商品下单、支付回调、会员状态查询、权益发放 <br> - **求职助手**:配置管理、AI岗位推荐、任务列表 <br> - **招聘公告**:列表/详情/推荐/统计/筛选项查询 <br> - **导师**:对接简历星球开放平台 | `ClientApplication``LoginController``RouteMenuController``UserManageController``UserFeedbackController``MemberProductController``MemberStatusController``JobController``JobAgentConfigController``UserResumeController``MessageController``RecruitAnnouncementController``CompanyController``MentorController``FuncPermission``FuncPermissionAspect``FuncPermissionService``MemberGrantService``RecruitAnnouncementService` |
| **admin** | - B 端管理后台(`AdminApplication`),Thymeleaf 页面 + REST 接口 <br> - **管理员登录**:账号密码 + JWT + 失败锁定 <br> - **用户管理**:分页列表、注册统计、禁用/启用 <br> - **订单管理**:分页列表、支付数与收入统计 <br> - **商品管理**:会员商品 CRUD | `AdminApplication``AdminLoginController``AdminUserController``AdminOrderController``AdminProductController``PageController``AdminLoginService``AdminUserService``AdminOrderService``AdminProductService``AdminRedisKeyName` |
| **common** | - **统一配置**OSS、Redis、Security、WxPay、Alipay、Sms、Async、Jackson、MyBatis、Web 等 <br> - **跨层工具**:HTTP、IP、认证、验证码、Redis Server、用户安全 <br> - **通用Mapper**CommonMapper(批量插入/更新) <br> - **全局拦截/切面**:日志、TraceId、黑名单、防重放、SQL打印 <br> - **统一异常/响应**`GlobalExceptionAdvice``UnifiedResponse``PageResult` <br> - **业务能力抽象**:邮件、短信、OSS、AI对话、微信支付(Native/JS/Transfer)、支付宝支付(PagePay <br> - **公共 POJO**:登录令牌、防重放信息、分页参数/结果 | `config/`, `constant/`, `mapper/`, `tool/`, `interceptor/`, `aop/`, `exception/`, `web/`, `pojo/`, `email/`, `sms/`, `oss/`, `ai/`, `alipay/`, `wxPay/` |
| **manager** | - **业务实体**(用户/管理员、OSS文件、邀请、权限与库存、地区/岗位分类/行业/技能标签/专业分类字典、岗位及关联表、招聘公告及7张关联表、用户行为表、个人资料及5张子表、简历及5张子表、诊断报告/问题、求职助手配置/对话/定制简历、导师模拟对话、站内信、协议、会员商品/订单/用户/配置项、支付流水、用户反馈) <br> - **MyBatis Mapper**(对应全部业务实体) <br> - **字典/公共 API**:文件上传/下载、健康检查、地区/岗位分类/行业字典查询、协议查询、导师模拟对话 <br> - **远程调用**:简历星球开放平台客户端(`remote/jsxq` <br> - **业务逻辑**OssService、SmsService、DictCacheService、RegionService、JobCategoryService、IndustryService、AgreementService、MentorMockChatService、UserProfileAnalyzeService、JobMatchService、MessageService | `controller/`, `mapper/`, `remote/`, `pojo/po/`, `pojo/dto/`, `pojo/vo/`, `service/`, `constant/` |
> **注**:岗位与公司的数据清洗已迁出后端,由独立服务 `offerpie_job_cleaner` 负责(读 PostgreSQL 爬虫原始数据 → AI 清洗 → 写入 MySQL 业务库);招聘公告采集由 `offerpie_spider` 负责。后端只消费清洗后的业务表。
## 3️⃣ 关键业务实体
| 实体 | 所属模块 | 作用概述 |
|------|----------|----------|
| `User` | manager | 记录用户基础信息(手机号、邮箱、密码、昵称、头像、生日、性别、真实姓名、微信绑定、邀请码等)。 |
| `AdminUser` | manager | 管理员用户表(bg_admin_user),B 端后台登录账号。 |
| `OssFile` | manager | 描述 OSS 中文件的元数据(路径、大小、标签等)。 |
| `UserInvite` | manager | 用户邀请记录表,记录邀请人与被邀请人的关系、邀请时间、奖励天数。 |
| `UserFeedback` | manager | 用户反馈表(bg_user_feedback),记录用户提交的反馈类型和内容。 |
| `RouteMenu` | manager | 路由菜单表(bg_route_menu),支持多级树形结构,openAccess 标识是否公开免费。 |
| `FuncPermission` | manager | 功能权限表(bg_func_permission),func_code 唯一,daily_free_count 配置每日免费次数。 |
| `UserRouteMenuStock` | manager | 用户路由菜单库存表,记录用户拥有的菜单权限,支持时间维度。 |
| `UserFuncPermissionStock` | manager | 用户功能权限库存表,支持时间/次数/复合维度。 |
| `UserFuncUsageLog` | manager | 用户功能使用记录表,用于免费次数统计和异常回退。 |
| `Agreement` | manager | 协议表(bg_agreement),按协议码分组,版本递增管理。 |
| `MemberProduct` / `MemberOrder` / `MemberUser` | manager | 会员商品、订单、会员到期状态。 |
| `MemberFuncItem` / `MemberRouteItem` | manager | 会员套餐包含的功能权限项与菜单权限项。 |
| `PayWechatFlow` / `PayAlipayFlow` | manager | 微信 / 支付宝支付流水。 |
| `ChinaRegionsCode` | manager | 地区表(bg_china_regions_code),省/市/区三级,code 为主键。 |
| `JobCategory` | manager | 岗位类型表(bg_job_category),树形结构。 |
| `Company` | manager | 公司表(bg_company),公司基本信息、融资、规模、新闻动态、company_type、logo_url。 |
| `Job` | manager | 岗位表(bg_job),岗位信息、薪资、标签、技能标签、要求专业、专业敏感度。 |
| `JobRegionRelation` / `JobSkillTagRelation` | manager | 岗位-地区、岗位-技能标签关联表。 |
| `Industry` | manager | 行业字典表(bg_industry),树形结构。 |
| `SkillTag` | manager | 技能标签表(bg_skill_tag),AI 自动入库,name 唯一索引。 |
| `MajorCategory` | manager | 专业分类表(bg_major_category),三级树形结构,用于专业匹配。 |
| `RecruitAnnouncement` | manager | 招聘公告主表(bg_recruit_announcement),公告标题、公司简介、面向对象、专业要求、招聘岗位、笔试、投递时间与入口(announcement_url/apply_url/apply_email/invite_code)、来源、clean_status、status。 |
| `RecruitAnnouncement{Year,Batch,Tag,City,Category,Industry,Education}` | manager | 公告的 7 张多值维度关联表,统一结构(id + announcement_id + 值字段 + create_time),直接存原始值不引字典表,无唯一约束。 |
| `MentorMockChat` | manager | 导师模拟对话表(bg_mentor_mock_chat),缓存 AI 生成的对话,按导师 ID 唯一。 |
| `UserJobFavorite` / `UserJobApplication` / `UserJobDislike` / `UserJobIntention` | manager | 用户收藏、投递、不感兴趣、求职意向。 |
| `UserProfile` + 5 张子表 | manager | 用户个人资料及教育/工作/实习/项目/竞赛经历,主表存维度评分字段。 |
| `UserProfileSkillTagRelation` | manager | 用户技能标签关联表,AI 自动识别生成。 |
| `UserResume` + 5 张子表 | manager | 用户简历及教育/工作/实习/项目/竞赛经历,一个用户可有多份简历。 |
| `ResumeDiagnosisReport` / `ResumeDiagnosisIssue` | manager | 简历诊断报告与问题明细。 |
| `JobAgentConfig` / `JobAgentChatMessage` / `UserJobCustomizeResume` | manager | 求职助手配置、对话消息、岗位定制简历。 |
| `Message` / `MessageRead` | manager | 站内信消息与已读状态。 |
## 4️⃣ 权限体系设计
### 整体架构
- **前端**:路由控制菜单/页面可见性,登录后拉取用户有效菜单树(含公开免费菜单 + 库存授权菜单)
- **后端**AOP 切面拦截 `@FuncPermission` 注解,校验权限 + 扣减库存,业务异常自动回退次数
- **权限来源**:会员购买成功后通过 `MemberGrantService` 统一发放到库存表
- **免鉴权路径**:由配置 `app.ignore.urls` 控制(当前为 `/public/**,/job/list,/job/detail,/route/menu`),`antMatchers` 匹配完整路径,因此 `/public` 必须写在类级 `@RequestMapping` 的最前面
### 数据库表(5张)
| 表名 | 说明 |
|------|------|
| `bg_route_menu` | 路由菜单定义(树形结构,open_access 标识公开免费菜单) |
| `bg_user_route_menu_stock` | 用户路由菜单库存(时间维度) |
| `bg_func_permission` | 功能权限定义(func_code 唯一,daily_free_count 配置每日免费次数) |
| `bg_user_func_permission_stock` | 用户功能权限库存(时间/次数/复合维度) |
| `bg_user_func_usage_log` | 用户功能使用记录(每次使用插入,用于免费次数统计和异常回退) |
### 库存维度
- `time_limit` + `expire_time`:时间维度,0=不限时,1=限时
- `count_limit` + `remain_count`:次数维度,0=不限次,1=限次
- 两个维度独立控制,组合形成四种模式:永久不限次、限时不限次、永久限次、限时限次
- 添加库存时不降级:已经不限时/不限次的不会被覆盖
### 切面校验流程
1. 拿注解上的 funcCode + 当前登录用户 userId
2. 查 bg_func_permissionfuncCode + status=1),拿到 dailyFreeCount
3. dailyFreeCount > 0 → COUNT 今日使用记录,未超额 → 插入使用记录,放行
4. 免费额度用完或无免费额度 → 查付费库存表(userId + funcCode
5. 无记录 → 无权限
6. time_limit=1 且过期 → 已过期
7. count_limit=0 → 插入使用记录,放行
8. count_limit=1 → SQL 原子扣减 `remain_count = remain_count - 1`WHERE remain_count > 0)→ 插入使用记录,放行
9. 业务方法异常 → 删除使用记录 + 尝试回退库存次数(count_limit=1 时 remain_count + 1
## 5️⃣ 会员商品与支付体系
### 整体架构
- **商品管理**`MemberProduct` 定义会员套餐(名称、价格、时长天数、排序、上下架),B 端由 `AdminProductService` 维护
- **下单流程**:用户选择商品 → 创建订单(`MemberOrder`) → 根据支付渠道调用微信/支付宝下单 → 返回支付凭据
- **支付回调**:微信/支付宝回调 → 验签 → 更新流水 → 调用 `handlePaySuccess` → 更新订单状态 → 发放权益
- **权益发放**`MemberGrantService.grant()` → 续费会员时长 → 按 `MemberFuncItem` 发放功能权限 → 按 `MemberRouteItem` 发放菜单权限
### 数据库表
| 表名 | 说明 |
|------|------|
| `bg_member_product` | 会员商品定义(价格、时长、排序、状态) |
| `bg_member_order` | 会员订单(用户、商品、金额、支付渠道、状态、支付时间) |
| `bg_member_user` | 会员用户状态(一个用户一条记录,记录到期时间) |
| `bg_member_func_item` | 会员功能配置项(定义会员包含哪些功能权限、次数限制) |
| `bg_member_route_item` | 会员菜单配置项(定义会员包含哪些菜单权限) |
| `bg_pay_wechat_flow` | 微信支付流水 |
| `bg_pay_alipay_flow` | 支付宝支付流水 |
### 支付渠道
- **微信Native支付**:通过 `WxNativePayAbility` 调用微信下单接口,返回二维码URL
- **支付宝电脑网站支付**:通过 `AlipayPagePayAbility` 调用支付宝下单接口,返回HTML表单(内嵌二维码)
- 回调分别由 `WxPayNotifyController``AlipayNotifyController` 处理验签,再委托给具体实现类
## 6️⃣ 共享技术栈(位于 `common`)
| 类别 | 关键实现 | 位置 |
|------|----------|------|
| **配置** | `OssConfig`, `RedissonConf`, `SecurityConfig`, `WxPayConfig`, `SmsConfig`, `AsyncConfig`, `JacksonConfig`, `MybatisConfig`, `WebConfig` | `common/config` |
| **安全** | JWT 过滤器 (`JwtAuthenticationTokenFilter`)、登录令牌 (`RedisLoginTokenInfo`)、防重放 (`PreventReplayInterceptor`)、黑名单 (`BlackListInterceptor`) | `common/interceptor``common/pojo` |
| **通用Mapper** | `CommonMapper`(继承BaseMapper,提供batchInsert/batchUpdate方法) | `common/mapper` |
| **常量** | `PreRedisKeyName`Redis Key前缀:preventReplay、blackList、login:token | `common/constant` |
| **邮件** | `EmailAbility`(封装邮件发送) | `common/email` |
| **短信** | `AliYunSmsAbility`(阿里云短信发送,ConditionalOnProperty | `common/sms` |
| **OSS** | `AliOssAbility`(阿里云OSS上传/下载/签名URLConditionalOnProperty | `common/oss` |
| **AI** | `AiChatAbility`OpenAI 兼容多供应商对话)、`AiChatConfig`(供应商配置)、`AiResponseCleanTool`AI响应文本清洗) | `common/ai` |
| **支付宝** | `AlipayClientConfig``AlipayPagePayAbility``AlipayNotifyController``AlipayNotifyMessageAbstract` | `common/alipay` |
| **微信支付** | `WxJsPayAbility`, `WxNativePayAbility`, `WxTransferPayAbility`, `WxPayNotifyController`, `WxPayNotifyMessageAbstract`, `server/TransferServer``server/model/*` | `common/wxPay` |
| **全局异常** | `GlobalExceptionAdvice`web包), `BusinessException`, `BusinessExpCodeEnum`, `BusinessExpCodeOperations`exception包) | `common/exception`, `common/web` |
| **日志 & AOP** | `ControllerLogAspect`, `LoggingOriginalRequestFilter`, `TraceIdFilter`, `SqlLoggerInterceptor` | `common/aop`, `common/interceptor` |
| **工具类** | `HttpTool`, `HttpIpTool`, `AuthenticTool`, `ObjectTool`, `UserSecurityTool`, `VerifyImageCodeUtils`, `RedisServerTool` | `common/tool` |
| **统一返回体** | `UnifiedResponse`, `UnifiedResponseBodyAdvice`, `PageParam`, `PageResult` | `common/pojo`, `common/web` |
| **批量/更新** | `UpdateBatchMethod`(批量更新SQL注入策略)、`LongListTypeHandler`List<Long> JSON类型处理器) | `common/config` |
## 7️⃣ 岗位列表与匹配度计算设计
### 整体架构
- **触发时机**:用户访问岗位列表接口(支持筛选条件:地区/岗位类型/行业/工作类型/公司类型/公司ID)
- **核心流程**:扩展层级筛选 → 查询不感兴趣记录 → 扩展排除列表 → SQL分页查询 → 查询收藏状态 → 批量计算匹配度 → 组装返回
- **匹配度计算**:教育30% + 经历30% + 技能40%,在Java层批量计算
- **分页策略**`pageParam.setSearchCount(false)`,不查总数(前端按「加载更多」处理)
### 匹配度计算规则
总分公式:`MatchScore = Sedu × 30% + Sexp × 30% + Sskill × 40%`
#### 教育维度(Sedu
- 学校等级分(Srank):1→100, 2→80, 3→60, 4→40
- 专业相关度(Smajor):通过 bg_major_category 树形匹配,完全匹配→100,同二级→70,同一级→30,不相关→0
- 根据 majorSensitivity 决定权重:强制(学校0.4+专业0.6,专业<40则总分减半)、优先(学校0.6+专业0.4)、不限(仅学校分)
#### 经历维度(Sexp
- `Sexp = 公司背书×30% + 时长×10% + 经历深度×60%`
- 公司背书:1→100, 2→60, 3→30, 4→0
- 经历时长:1→100, 2→60, 3→30
- 经历深度 = 职责深度×40% + 量化产出×30% + 荣誉×30%
- 职责深度:1→100, 2→80, 3→40
- 量化产出:1→100, 2→70, 3→40
- 荣誉:封顶累加制(national每项20、provincial每项10、school每项5、paper每项15),总分不超过100
#### 技能维度(Sskill
- 岗位无要求 → 100分
- 用户无技能 → 0分
- 匹配0个 → 0分
- 匹配≥1个 → 30分保底 + 70分按比例:`30 + (匹配数量 / 岗位要求数量) × 70`
### 核心服务
- **JobService**client-api):岗位列表查询主流程编排
- **JobMatchService**manager):批量计算匹配度(教育/经历/技能三个维度)
## 8️⃣ 招聘公告模块设计
### 数据模型
- **一主七从**:主表 `bg_recruit_announcement` + 7 张多值维度关联表(届数/批次/标签/城市/岗位大类/行业/学历)
- 从表统一结构:`id` + `announcement_id` + 单个值字段 + `create_time`,雪花主键,只有普通索引,**无唯一约束**(重复写入需按 announcement_id 先删后插)
- 刻意不引字典表,从表直接存原始文本值,避免归一化限制 AI 解析结果;筛选按名称匹配
- 双状态:`clean_status`0-清洗中 1-完成)、`status`(0-失效 1-有效),有效数据口径为两者皆为 1
### 接口一览(`/public/recruitAnnouncement`,全部免鉴权)
| 接口 | 说明 |
|------|------|
| `POST /page` | 分页列表,支持关键字(公司名/招聘岗位 LIKE)+ 发布时间区间 + 投递截止区间 + 公司类型 + 7 个多值维度筛选(条件间为「且」) |
| `GET /detail` | 详情,返回主表字段(不含三个投递入口地址)+ 公司 logo 与类型 + 全部 7 个多值维度 |
| `POST /recommend` | 推荐,按传入公告的行业或岗位大类命中任一即推荐 |
| `GET /statistics` | 统计(今日新增/本月新增/累计),一次条件聚合出三个计数 |
| `GET /lastUpdateTime` | 最后更新时间(按 id 倒序取第一条的 create_time |
| `GET /announcementUrl` `/applyUrl` `/applyEmail` | 按公告 id 分别查询公告地址、投递地址、投递邮箱(只查单列) |
| `GET /batch` `/category` `/city` `/education` `/industry` `/tag` `/year` | 各维度筛选项,`GROUP BY` 值字段去重 |
### 实现约定
- **列表与推荐**:主表 + `bg_company` INNER JOIN 只取单值字段,多值维度不进 SQL;拿到本页 id 后按 `IN` 批量查从表,在 Java 侧 `groupingBy` + `mapping` 组装,避免 N+1
- **详情**`selectById` 取 PO + 单独查公司两列 + 7 张从表各查一次,共 9 次查询,全部走主键或 `idx_announcement_id`
- **筛选**:多值维度用 `ra.id IN (子查询)` 半连接;推荐场景两个维度是「或」关系,用 `UNION` 合并后再套单个 `IN`(避免 `OR` 连接多个 `IN` 无法半连接优化),`<trim prefixOverrides="UNION">` 处理动态拼接
- **统计时区**:固定 `ZoneId.of("Asia/Shanghai")` 计算今日零点与本月 1 号零点,不依赖 JVM 默认时区
- **分页**`setSearchCount(false)``total` 恒为 0
## 9️⃣ 导师模块设计(对接简历星球开放平台)
### 整体架构
- **远程客户端**`JsxqClient`manager/remote/jsxq)统一拼公共请求头、拆平台 `{code,msg,data,ok}` 包装、按类型反序列化 data,业务接口为其 public 方法
- **配置**`JsxqProperties` 管理域名、令牌、租户
- **对外接口**`MentorController`client-api`/public/mentor`)透传导师分页列表、导师完整信息、老师话题、老师评价
- **模拟对话**`MentorMockChatController` + `MentorMockChatService`manager`/public/mentor/mockChat`
### 模拟对话流程
1. 按 mentorId 查 `bg_mentor_mock_chat`,有缓存直接返回
2. 无缓存则通过 `JsxqClient` 获取导师信息与话题
3. 调用 `AiChatAbility` 生成对话
4. 结果入库缓存,再返回
## 🔟 用户简历分析设计
### 整体架构
- **触发时机**:用户保存个人资料(主表或任意子表)后异步触发
- **分析流程**:三次 AI 调用 → 第一次综合分析(学校等级、公司背书、经历时长、职责深度、量化产出、荣誉),第二次专业归一化(匹配到 bg_major_category ID),第三次技能提取(自由提取,入 bg_skill_tag
- **数据存储**:维度数据更新 bg_user_profile,技能全量替换 bg_user_profile_skill_tag_relation
### 核心流程
1. 查询用户完整个人资料(主表 + 5张子表)
2. 数据有效性检查(主表或所有子表为空 → 清空关联表)
3. 第一次 AI 调用:综合分析(schoolRank、companyPrestige、experienceDuration、roleDepth、outputQuality、honors)→ 更新 bg_user_profile
4. 第二次 AI 调用:专业归一化(传三级专业分类列表)→ 更新 bg_user_profile.major_ids
5. 第三次 AI 调用:技能提取(自由提取,prompt与岗位侧一致)→ INSERT IGNORE 入 bg_skill_tag → 全量替换 bg_user_profile_skill_tag_relation
### 异步执行
- 使用 Spring `@Async` 注解,配置独立线程池
- 每次 AI 调用独立容错,某一次失败不影响其他维度
- 核心服务:**UserProfileAnalyzeService**manager
## 1️⃣1️⃣ 邀请模块设计
### 数据库表(1张)
| 表名 | 说明 |
|------|------|
| `bg_user_invite` | 用户邀请记录(记录邀请人与被邀请人的关系、邀请时间、奖励天数) |
### 核心逻辑
- 用户注册时自动生成10位邀请码(大写字母+数字),存入 `User.invite_code`,碰撞检查最多重试3次
- 注册时可携带 `inviteCode`,有效则写入邀请记录,无效仅日志警告不阻断注册
- 注册逻辑由 `UserRegisterService` 独立承担,`LoginService` 委托调用
- 邀请统计由 `UserManageService.getInviteStats()` 提供(累计邀请人数、累计获得会员天数)
## 1️⃣2️⃣ B 端管理后台设计
### 整体架构
- 独立启动类 `AdminApplication`,独立 `application.yml`(含 dev/test/prod),Thymeleaf 渲染页面 + REST 接口
- `PageController` 返回视图名,不参与 `UnifiedResponseBodyAdvice` 统一包装
- 复用 `manager` 的全部 Mapper 与 `common` 的技术设施,不重复定义实体
### 登录与安全
- 账号密码登录(`bg_admin_user`),JWT 令牌写入 Redis
- 失败累计:连续 3 次失败锁定账号 4 小时
- Redis Key`login:token:{adminId}``login:fail:{username}``login:lock:{username}`(常量见 `AdminRedisKeyName`
- 登录成功写入 Redis 并设置 Cookie,支持多设备踢出
### 管理能力
| 模块 | 能力 |
|------|------|
| 用户管理 | 分页列表(含每人简历数量)、总数/今日/本周/本月新增统计、禁用与启用 |
| 订单管理 | 分页列表(关联用户与商品信息)、总数/已支付数/今日本周本月支付数与收入统计 |
| 商品管理 | 会员商品新增、编辑、分页查询 |
## 1️⃣3️⃣ 构建与运行
- **父 POM**`back-end/pom.xml`)统一管理子模块的依赖与插件,Java 17。
- 子模块(`client-api`, `admin`, `common`, `manager`)均可单独 `mvn clean install`,生成各自的 jar 包。
- **启动入口**C 端运行 `client-api``ClientApplication`B 端运行 `admin``AdminApplication`。两者都会自动扫描并加载 `common`(配置、拦截、工具)与 `manager` 中声明的 Mapper 与 Service。
- **MyBatis XML**`mapper-locations: classpath*:mapper/**/*.xml`,放在 `manager/src/main/resources/mapper/` 下。注意同一方法不能同时存在 `@Select` 注解和 XML 语句,否则启动报 `Mapped Statements collection already contains value`
- **条件加载**:多个能力组件使用 `@ConditionalOnProperty` 按配置启用(OSS、SMS、Alipay),未配置时不加载。
- **部署**`client-api``admin` 各有独立 `Dockerfile``Jenkinsfile`(含 `.test` 变体)、`nginx.conf``docker-compose.*.yml`
## 1️⃣4️⃣ 小结
- 项目采用 **四模块结构**
1. **client-api** → C 端 REST 接口 + 功能权限校验 + 路由菜单 + 用户管理 + 会员体系 + 支付回调 + 招聘公告 + 导师。
2. **admin** → B 端管理后台(管理员登录、用户/订单/商品管理,Thymeleaf 页面)。
3. **manager** → 业务实体、Mapper、远程调用与业务 API/Service,B 端 + C 端共享层。
4. **common** → 所有层共同依赖的底层设施(配置、工具、拦截、异常、支付、OSS、短信、AI、邮件等)。
- 依赖方向单向:`client-api` / `admin``manager``common`。跨模块传参需在 `manager` 侧定义 DTO/VO。
- 权限体系分两层:前端路由控制菜单可见性,后端切面控制功能点权限与库存扣减。
- 会员体系:商品下单 → 支付回调 → `MemberGrantService` 统一发放权益(会员时长 + 功能权限 + 菜单权限)。
- 支付双通道:微信Native支付 + 支付宝电脑网站支付,各自独立流水表和回调处理。
- 数据来源:招聘公告由 `offerpie_spider` 采集,岗位与公司由 `offerpie_job_cleaner` 清洗入库,后端只消费业务表。