feat: add job seeker notice settings API

This commit is contained in:
2026-07-22 20:29:59 +08:00
parent 0dc3ff96fc
commit c8c70652ac
13 changed files with 546 additions and 0 deletions

View File

@@ -2,16 +2,27 @@ package com.ruoyi.cms.controller.app;
import com.ruoyi.cms.domain.Job;
import com.ruoyi.cms.domain.Notice;
import com.ruoyi.cms.domain.dto.NoticeSettingRequest;
import com.ruoyi.cms.domain.vo.NoticeSettingVO;
import com.ruoyi.cms.service.IAppNoticeService;
import com.ruoyi.cms.service.IAppUserNoticeSettingService;
import com.ruoyi.common.annotation.BussinessLog;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.AppUser;
import com.ruoyi.common.core.domain.model.LoginSiteUser;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.cms.util.StringUtil;
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.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.security.core.Authentication;
import java.util.List;
@RestController
@@ -21,6 +32,35 @@ public class AppNoticeInfoController extends BaseController {
@Autowired
private IAppNoticeService appNoticeService;
@Autowired
private IAppUserNoticeSettingService appUserNoticeSettingService;
@ApiOperation("查看消息接收设置")
@GetMapping("/settings")
public AjaxResult getSettings()
{
Long userId = currentJobSeekerId();
if (userId == null)
{
return AjaxResult.error(HttpStatus.FORBIDDEN, "仅求职者可查看消息接收设置");
}
NoticeSettingVO settings = appUserNoticeSettingService.getSettings(userId);
return AjaxResult.success(settings);
}
@ApiOperation("保存消息接收设置")
@PutMapping("/settings")
@BussinessLog(title = "保存消息接收设置")
public AjaxResult saveSettings(@Validated @RequestBody NoticeSettingRequest request)
{
Long userId = currentJobSeekerId();
if (userId == null)
{
return AjaxResult.error(HttpStatus.FORBIDDEN, "仅求职者可保存消息接收设置");
}
appUserNoticeSettingService.saveSettings(userId, request);
return AjaxResult.success();
}
@ApiOperation("消息列表")
@GetMapping("/info")
public AjaxResult listNotRead(@RequestParam(required = false) Integer isRead)
@@ -60,4 +100,24 @@ public class AppNoticeInfoController extends BaseController {
List<Notice> list = appNoticeService.sysNoticeList();
return getDataTable(list);
}
/**
* 仅允许经移动端 Token 认证的求职者读写自己的设置。
*/
private Long currentJobSeekerId()
{
Authentication authentication = SiteSecurityUtils.getAuthentication();
if (authentication == null || !(authentication.getPrincipal() instanceof LoginSiteUser))
{
return null;
}
LoginSiteUser loginUser = (LoginSiteUser) authentication.getPrincipal();
AppUser appUser = loginUser.getUser();
if (loginUser.getUserId() == null || appUser == null
|| !StringUtil.IS_JOB_REQUEST_USER.equals(appUser.getIsCompanyUser()))
{
return null;
}
return loginUser.getUserId();
}
}

View File

@@ -0,0 +1,35 @@
package com.ruoyi.cms.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* 移动端求职者消息接收设置。
*/
@Data
@ApiModel("移动端求职者消息接收设置")
@TableName("app_user_notice_setting")
public class AppUserNoticeSetting extends BaseEntity
{
@TableId(type = IdType.AUTO)
private Long id;
/** APP 用户 ID每名用户仅有一条设置。 */
private Long userId;
/** 职位上新。 */
private Boolean jobUpdateEnabled;
/** 招聘会预约提醒。 */
private Boolean appointmentReminderEnabled;
/** 平台系统通知。 */
private Boolean systemNotificationEnabled;
/** 企业面试通知。 */
private Boolean interviewNotificationEnabled;
}

View File

@@ -0,0 +1,31 @@
package com.ruoyi.cms.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 移动端消息接收设置保存请求。
*/
@Data
@ApiModel("移动端消息接收设置保存请求")
public class NoticeSettingRequest
{
@NotNull(message = "职位上新开关不能为空")
@ApiModelProperty(value = "是否接收职位上新通知", required = true, example = "true")
private Boolean jobUpdateEnabled;
@NotNull(message = "预约提醒开关不能为空")
@ApiModelProperty(value = "是否接收招聘会预约提醒", required = true, example = "true")
private Boolean appointmentReminderEnabled;
@NotNull(message = "系统通知开关不能为空")
@ApiModelProperty(value = "是否接收系统通知", required = true, example = "true")
private Boolean systemNotificationEnabled;
@NotNull(message = "面试通知开关不能为空")
@ApiModelProperty(value = "是否接收面试通知", required = true, example = "true")
private Boolean interviewNotificationEnabled;
}

View File

@@ -0,0 +1,36 @@
package com.ruoyi.cms.domain.vo;
import com.ruoyi.cms.domain.AppUserNoticeSetting;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 移动端消息接收设置返回对象。
*/
@Data
@ApiModel("移动端消息接收设置")
public class NoticeSettingVO
{
@ApiModelProperty(value = "是否接收职位上新通知", example = "true")
private Boolean jobUpdateEnabled;
@ApiModelProperty(value = "是否接收招聘会预约提醒", example = "true")
private Boolean appointmentReminderEnabled;
@ApiModelProperty(value = "是否接收系统通知", example = "true")
private Boolean systemNotificationEnabled;
@ApiModelProperty(value = "是否接收面试通知", example = "true")
private Boolean interviewNotificationEnabled;
public static NoticeSettingVO from(AppUserNoticeSetting setting)
{
NoticeSettingVO result = new NoticeSettingVO();
result.setJobUpdateEnabled(setting.getJobUpdateEnabled());
result.setAppointmentReminderEnabled(setting.getAppointmentReminderEnabled());
result.setSystemNotificationEnabled(setting.getSystemNotificationEnabled());
result.setInterviewNotificationEnabled(setting.getInterviewNotificationEnabled());
return result;
}
}

View File

@@ -0,0 +1,15 @@
package com.ruoyi.cms.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.cms.domain.AppUserNoticeSetting;
/**
* 移动端用户消息接收设置 Mapper。
*/
public interface AppUserNoticeSettingMapper extends BaseMapper<AppUserNoticeSetting>
{
/**
* 保存设置。user_id 唯一约束保证并发首次保存时只会保留一条记录。
*/
int upsert(AppUserNoticeSetting setting);
}

View File

@@ -0,0 +1,20 @@
package com.ruoyi.cms.service;
import com.ruoyi.cms.domain.dto.NoticeSettingRequest;
import com.ruoyi.cms.domain.vo.NoticeSettingVO;
/**
* 移动端求职者消息接收设置服务。
*/
public interface IAppUserNoticeSettingService
{
/**
* 查询用户设置;尚未保存过时返回四项均开启的默认设置。
*/
NoticeSettingVO getSettings(Long userId);
/**
* 保存用户的完整四项设置。
*/
void saveSettings(Long userId, NoticeSettingRequest request);
}

View File

@@ -0,0 +1,62 @@
package com.ruoyi.cms.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cms.domain.AppUserNoticeSetting;
import com.ruoyi.cms.domain.dto.NoticeSettingRequest;
import com.ruoyi.cms.domain.vo.NoticeSettingVO;
import com.ruoyi.cms.mapper.AppUserNoticeSettingMapper;
import com.ruoyi.cms.service.IAppUserNoticeSettingService;
import org.springframework.stereotype.Service;
/**
* 移动端求职者消息接收设置服务实现。
*/
@Service
public class AppUserNoticeSettingServiceImpl
extends ServiceImpl<AppUserNoticeSettingMapper, AppUserNoticeSetting>
implements IAppUserNoticeSettingService
{
private final AppUserNoticeSettingMapper noticeSettingMapper;
public AppUserNoticeSettingServiceImpl(AppUserNoticeSettingMapper noticeSettingMapper)
{
this.noticeSettingMapper = noticeSettingMapper;
}
@Override
public NoticeSettingVO getSettings(Long userId)
{
AppUserNoticeSetting setting = noticeSettingMapper.selectOne(
Wrappers.<AppUserNoticeSetting>lambdaQuery()
.eq(AppUserNoticeSetting::getUserId, userId));
if (setting == null)
{
setting = defaultSetting(userId);
}
return NoticeSettingVO.from(setting);
}
@Override
public void saveSettings(Long userId, NoticeSettingRequest request)
{
AppUserNoticeSetting setting = new AppUserNoticeSetting();
setting.setUserId(userId);
setting.setJobUpdateEnabled(request.getJobUpdateEnabled());
setting.setAppointmentReminderEnabled(request.getAppointmentReminderEnabled());
setting.setSystemNotificationEnabled(request.getSystemNotificationEnabled());
setting.setInterviewNotificationEnabled(request.getInterviewNotificationEnabled());
noticeSettingMapper.upsert(setting);
}
private AppUserNoticeSetting defaultSetting(Long userId)
{
AppUserNoticeSetting setting = new AppUserNoticeSetting();
setting.setUserId(userId);
setting.setJobUpdateEnabled(Boolean.TRUE);
setting.setAppointmentReminderEnabled(Boolean.TRUE);
setting.setSystemNotificationEnabled(Boolean.TRUE);
setting.setInterviewNotificationEnabled(Boolean.TRUE);
return setting;
}
}