From 83ac495842d37fc2f0ca98f97d70b65537ef965d Mon Sep 17 00:00:00 2001 From: chenshaohua <635616957@qq.com> Date: Fri, 24 Jul 2026 13:43:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A1=8C=E4=B8=BA=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/HrUserBehaviorRecordController.java | 73 +++++++++++++++++++ .../cms/domain/msg/HrUserBehaviorRecord.java | 59 +++++++++++++++ .../msg/HrUserBehaviorRecordMapper.java | 11 +++ .../msg/HrUserBehaviorRecordService.java | 39 ++++++++++ .../impl/HrUserBehaviorRecordServiceImpl.java | 60 +++++++++++++++ .../mapper/msg/HrUserBehaviorRecordMapper.xml | 63 ++++++++++++++++ .../ruoyi/common/utils/SiteSecurityUtils.java | 11 +++ 7 files changed, 316 insertions(+) create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/HrUserBehaviorRecordController.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/msg/HrUserBehaviorRecord.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/msg/HrUserBehaviorRecordMapper.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/msg/HrUserBehaviorRecordService.java create mode 100644 ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/msg/impl/HrUserBehaviorRecordServiceImpl.java create mode 100644 ruoyi-bussiness/src/main/resources/mapper/msg/HrUserBehaviorRecordMapper.xml diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/HrUserBehaviorRecordController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/HrUserBehaviorRecordController.java new file mode 100644 index 0000000..1b6fd42 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/app/HrUserBehaviorRecordController.java @@ -0,0 +1,73 @@ +package com.ruoyi.cms.controller.app; + +import com.ruoyi.cms.domain.msg.HrUserBehaviorRecord; +import com.ruoyi.cms.service.msg.HrUserBehaviorRecordService; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.SiteSecurityUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/app/behavior") +@Api(tags = "移动端:行为记录") +public class HrUserBehaviorRecordController extends BaseController { + + @Autowired + private HrUserBehaviorRecordService hrUserBehaviorRecordService; + + /** + * 查询行为记录列表 + */ + @GetMapping("/list") + @ApiOperation("查询行为记录列表") + public TableDataInfo list(HrUserBehaviorRecord hrUserBehaviorRecord) { + if (!SiteSecurityUtils.isLogin()) { + throw new ServiceException("用户未登录"); + } + Long userId = SiteSecurityUtils.getUserId(); + boolean admin = SiteSecurityUtils.isAdmin(userId); + if (!admin) { + hrUserBehaviorRecord.setActorId(userId); + } else { + hrUserBehaviorRecord.setActorId(null); + } + startPage(); + List list = hrUserBehaviorRecordService.selectBehaviorRecordList(hrUserBehaviorRecord); + return getDataTable(list); + } + + /** + * 上报浏览行为/投递行为 + */ + @ApiOperation("上报浏览行为/投递行为") + @PostMapping("/report") + public AjaxResult reportBehavior(@RequestBody HrUserBehaviorRecord record) { + HrUserBehaviorRecord exist = hrUserBehaviorRecordService.getExistViewRecord( + record.getActorType(), + record.getActorId(), + record.getTargetType(), + record.getTargetId() + ); + if (exist == null) { + record.setViewNum(1); + hrUserBehaviorRecordService.save(record); + } else { + if (record.getViewDuration() > 0) { + // 页面离开上报:累加时长 + exist.setViewDuration(exist.getViewDuration() + record.getViewDuration()); + } else { + // 页面进入上报:次数+1 + exist.setViewNum(exist.getViewNum() + 1); + } + hrUserBehaviorRecordService.updateById(exist); + } + return success(); + } +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/msg/HrUserBehaviorRecord.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/msg/HrUserBehaviorRecord.java new file mode 100644 index 0000000..878927e --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/msg/HrUserBehaviorRecord.java @@ -0,0 +1,59 @@ +package com.ruoyi.cms.domain.msg; + +import com.baomidou.mybatisplus.annotation.*; +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("求职招聘双方行为记录表") +@TableName("hr_user_behavior_record") +public class HrUserBehaviorRecord extends BaseEntity { + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.AUTO) + private Long id; + + /** 操作人类型:1求职者 2招聘方 */ + @ApiModelProperty("操作人类型:1求职者 2招聘方") + private Integer actorType; + + /** 操作人ID(求职者ID/企业用户ID) */ + @ApiModelProperty("操作人ID(求职者ID/企业用户ID) ") + private Long actorId; + + /** 浏览目标类型:1简历 2岗位 */ + @ApiModelProperty("浏览目标类型:1简历 2岗位") + private Integer targetType; + + /** 目标ID(简历ID/岗位ID) */ + @ApiModelProperty("目标ID(简历ID/岗位ID)") + private Long targetId; + + /** 行为类型:1阅览 2投递简历 */ + @ApiModelProperty("行为类型:1阅览 2投递简历") + private Integer behaviorType; + + /** 阅览时长(单位:秒) */ + @ApiModelProperty("阅览时长(单位:秒)") + private Integer viewDuration; + + /** 阅览次数,多次打开累加 */ + @ApiModelProperty("阅览次数,多次打开累加") + private Integer viewNum; + + /** 状态:1正常 */ + @ApiModelProperty("状态:1正常") + private Integer behaviorStatus; + + /**开始时间*/ + @TableField(exist = false) + private String beginTime; + + /**截至时间*/ + @TableField(exist = false) + private String endTime; +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/msg/HrUserBehaviorRecordMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/msg/HrUserBehaviorRecordMapper.java new file mode 100644 index 0000000..9ebf011 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/msg/HrUserBehaviorRecordMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.cms.mapper.msg; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.cms.domain.msg.HrUserBehaviorRecord; + +import java.util.List; + +public interface HrUserBehaviorRecordMapper extends BaseMapper { + + List selectBehaviorRecordList(HrUserBehaviorRecord hrUserBehaviorRecord); +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/msg/HrUserBehaviorRecordService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/msg/HrUserBehaviorRecordService.java new file mode 100644 index 0000000..790c735 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/msg/HrUserBehaviorRecordService.java @@ -0,0 +1,39 @@ +package com.ruoyi.cms.service.msg; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.cms.domain.msg.HrUserBehaviorRecord; + +import java.util.List; + +public interface HrUserBehaviorRecordService extends IService { + + /** + * 查询行为记录列表 + */ + List selectBehaviorRecordList(HrUserBehaviorRecord queryVo); + + /** + * 新增行为记录 + */ + int insertBehaviorRecord(HrUserBehaviorRecord record); + + /** + * 修改行为记录 + */ + int updateBehaviorRecord(HrUserBehaviorRecord record); + + /** + * 批量删除 + */ + int deleteBehaviorRecordByIds(Long[] ids); + + /** + * 根据ID查询 + */ + HrUserBehaviorRecord selectBehaviorRecordById(Long id); + + /** + * 【业务埋点】查找同一主体同一目标当天浏览记录(用于累加次数、时长) + */ + HrUserBehaviorRecord getExistViewRecord(Integer actorType, Long actorId, Integer targetType, Long targetId); +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/msg/impl/HrUserBehaviorRecordServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/msg/impl/HrUserBehaviorRecordServiceImpl.java new file mode 100644 index 0000000..a1ad2a1 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/msg/impl/HrUserBehaviorRecordServiceImpl.java @@ -0,0 +1,60 @@ +package com.ruoyi.cms.service.msg.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.cms.domain.msg.HrUserBehaviorRecord; +import com.ruoyi.cms.mapper.msg.HrUserBehaviorRecordMapper; +import com.ruoyi.cms.service.msg.HrUserBehaviorRecordService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; + +@Service +public class HrUserBehaviorRecordServiceImpl extends ServiceImpl + implements HrUserBehaviorRecordService { + + @Autowired + private HrUserBehaviorRecordMapper hrUserBehaviorRecordMapper; + + @Override + public List selectBehaviorRecordList(HrUserBehaviorRecord hrUserBehaviorRecord) { + return hrUserBehaviorRecordMapper.selectBehaviorRecordList(hrUserBehaviorRecord); + } + + @Override + public int insertBehaviorRecord(HrUserBehaviorRecord record) { + return hrUserBehaviorRecordMapper.insert(record); + } + + @Override + public int updateBehaviorRecord(HrUserBehaviorRecord record) { + return hrUserBehaviorRecordMapper.updateById(record); + } + + @Override + public int deleteBehaviorRecordByIds(Long[] ids) { + return hrUserBehaviorRecordMapper.deleteBatchIds(Arrays.asList(ids)); + } + + @Override + public HrUserBehaviorRecord selectBehaviorRecordById(Long id) { + return hrUserBehaviorRecordMapper.selectById(id); + } + + @Override + public HrUserBehaviorRecord getExistViewRecord(Integer actorType, Long actorId, Integer targetType, Long targetId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(HrUserBehaviorRecord::getActorType, actorType); + wrapper.eq(HrUserBehaviorRecord::getActorId, actorId); + wrapper.eq(HrUserBehaviorRecord::getTargetType, targetType); + wrapper.eq(HrUserBehaviorRecord::getTargetId, targetId); + LocalDate today = LocalDate.now(); + wrapper.ge(HrUserBehaviorRecord::getCreateTime, today.atStartOfDay()); + wrapper.le(HrUserBehaviorRecord::getCreateTime, today.atTime(23,59,59)); + wrapper.last("limit 1"); + return baseMapper.selectOne(wrapper); + } +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/resources/mapper/msg/HrUserBehaviorRecordMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/msg/HrUserBehaviorRecordMapper.xml new file mode 100644 index 0000000..4fbf208 --- /dev/null +++ b/ruoyi-bussiness/src/main/resources/mapper/msg/HrUserBehaviorRecordMapper.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + SELECT id, actor_type, actor_id, target_type, target_id, behavior_type, + view_duration, view_times, behavior_status, del_flag, + create_by, create_time, update_by, update_time, remark + FROM hr_user_behavior_record + + + + + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SiteSecurityUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SiteSecurityUtils.java index 0630df5..727f387 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SiteSecurityUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SiteSecurityUtils.java @@ -150,4 +150,15 @@ public class SiteSecurityUtils throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED); } } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } }