diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/mapper/NotifyRecipientMapper.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/mapper/NotifyRecipientMapper.java
new file mode 100644
index 000000000..f41bd9be3
--- /dev/null
+++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/mapper/NotifyRecipientMapper.java
@@ -0,0 +1,18 @@
+package com.aizuda.snailjob.template.datasource.persistence.mapper;
+
+import com.aizuda.snailjob.template.datasource.persistence.po.NotifyRecipient;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *
+ * 告警通知接收人 Mapper 接口
+ *
+ *
+ * @author opensnail
+ * @since 2024-04-17
+ */
+@Mapper
+public interface NotifyRecipientMapper extends BaseMapper {
+
+}
diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/po/NotifyRecipient.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/po/NotifyRecipient.java
new file mode 100644
index 000000000..7d0416350
--- /dev/null
+++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/persistence/po/NotifyRecipient.java
@@ -0,0 +1,74 @@
+package com.aizuda.snailjob.template.datasource.persistence.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ *
+ * 告警通知接收人
+ *
+ *
+ * @author opensnail
+ * @since 2024-04-17
+ */
+@Getter
+@Setter
+@TableName("sj_notify_recipient")
+public class NotifyRecipient implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 命名空间id
+ */
+ private String namespaceId;
+
+ /**
+ * 组名称
+ */
+ private String groupName;
+
+ /**
+ * 接收人名称
+ */
+ private String recipientName;
+
+ /**
+ * 通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书
+ */
+ private Integer notifyType;
+
+ /**
+ * 配置属性
+ */
+ private String notifyAttribute;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createDt;
+
+ /**
+ * 修改时间
+ */
+ private LocalDateTime updateDt;
+}
diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/resources/template/mapper/NotifyRecipientMapper.xml b/snail-job-datasource/snail-job-datasource-template/src/main/resources/template/mapper/NotifyRecipientMapper.xml
new file mode 100644
index 000000000..585ff9d2b
--- /dev/null
+++ b/snail-job-datasource/snail-job-datasource-template/src/main/resources/template/mapper/NotifyRecipientMapper.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/NotifyConfigController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/NotifyConfigController.java
index 76c495eee..f1b05bffc 100644
--- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/NotifyConfigController.java
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/NotifyConfigController.java
@@ -11,6 +11,7 @@ import com.aizuda.snailjob.server.web.model.base.PageResult;
import com.aizuda.snailjob.server.web.model.request.NotifyConfigQueryVO;
import com.aizuda.snailjob.server.web.model.request.NotifyConfigRequestVO;
import com.aizuda.snailjob.server.web.model.response.NotifyConfigResponseVO;
+import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -25,10 +26,9 @@ import java.util.List;
*/
@RestController
@RequestMapping("/notify-config")
+@RequiredArgsConstructor
public class NotifyConfigController {
-
- @Autowired
- private NotifyConfigService notifyConfigService;
+ private final NotifyConfigService notifyConfigService;
@LoginRequired
@GetMapping("list")
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/NotifyRecipientController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/NotifyRecipientController.java
new file mode 100644
index 000000000..152cf4dc8
--- /dev/null
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/NotifyRecipientController.java
@@ -0,0 +1,42 @@
+package com.aizuda.snailjob.server.web.controller;
+
+import com.aizuda.snailjob.server.web.model.base.PageResult;
+import com.aizuda.snailjob.server.web.model.request.NotifyRecipientQueryVO;
+import com.aizuda.snailjob.server.web.model.request.NotifyRecipientRequestVO;
+import com.aizuda.snailjob.server.web.model.response.NotifyRecipientResponseVO;
+import com.aizuda.snailjob.server.web.service.NotifyRecipientService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ *
+ * 告警通知接收人 前端控制器
+ *
+ *
+ * @author xiaowoniu
+ * @since 2024-04-17
+ */
+@RestController
+@RequestMapping("/notify-recipient")
+@RequiredArgsConstructor
+public class NotifyRecipientController {
+ private final NotifyRecipientService notifyRecipientService;
+
+ @PostMapping
+ public Boolean saveNotifyRecipient(@RequestBody @Validated NotifyRecipientRequestVO requestVO) {
+ return notifyRecipientService.saveNotifyRecipient(requestVO);
+ }
+
+ @PutMapping
+ public Boolean updateNotifyRecipient(@RequestBody @Validated NotifyRecipientRequestVO requestVO) {
+ return notifyRecipientService.updateNotifyRecipient(requestVO);
+ }
+
+ @GetMapping("/page/list")
+ public PageResult> getNotifyRecipientList(NotifyRecipientQueryVO queryVO) {
+ return notifyRecipientService.getNotifyRecipientList(queryVO);
+ }
+}
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/NotifyRecipientQueryVO.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/NotifyRecipientQueryVO.java
new file mode 100644
index 000000000..d86f7edbf
--- /dev/null
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/NotifyRecipientQueryVO.java
@@ -0,0 +1,11 @@
+package com.aizuda.snailjob.server.web.model.request;
+
+import com.aizuda.snailjob.server.web.model.base.BaseQueryVO;
+
+/**
+ * @author opensnail
+ * @date 2024-04-17 21:26:22
+ * @since sj_1.0.0
+ */
+public class NotifyRecipientQueryVO extends BaseQueryVO {
+}
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/NotifyRecipientRequestVO.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/NotifyRecipientRequestVO.java
new file mode 100644
index 000000000..fe62b7f6b
--- /dev/null
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/request/NotifyRecipientRequestVO.java
@@ -0,0 +1,9 @@
+package com.aizuda.snailjob.server.web.model.request;
+
+/**
+ * @author opensnail
+ * @date 2024-04-17 22:03:33
+ * @since sj_1.0.0
+ */
+public class NotifyRecipientRequestVO {
+}
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/response/NotifyRecipientResponseVO.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/response/NotifyRecipientResponseVO.java
new file mode 100644
index 000000000..a3b68a039
--- /dev/null
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/model/response/NotifyRecipientResponseVO.java
@@ -0,0 +1,52 @@
+package com.aizuda.snailjob.server.web.model.response;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author opensnail
+ * @date 2024-04-17 21:27:07
+ * @since sj_1.0.0
+ */
+@Data
+public class NotifyRecipientResponseVO {
+
+ private Long id;
+
+ /**
+ * 命名空间id
+ */
+ private String namespaceId;
+
+ /**
+ * 组名称
+ */
+ private String groupName;
+
+ /**
+ * 接收人名称
+ */
+ private String recipientName;
+
+ /**
+ * 通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书
+ */
+ private Integer notifyType;
+
+ /**
+ * 配置属性
+ */
+ private String notifyAttribute;
+
+ /**
+ * 描述
+ */
+ private String description;
+
+ /**
+ * 创建时间
+ */
+ private LocalDateTime createDt;
+
+}
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/NotifyRecipientService.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/NotifyRecipientService.java
new file mode 100644
index 000000000..ce285873d
--- /dev/null
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/NotifyRecipientService.java
@@ -0,0 +1,23 @@
+package com.aizuda.snailjob.server.web.service;
+
+import com.aizuda.snailjob.server.web.model.base.PageResult;
+import com.aizuda.snailjob.server.web.model.request.NotifyRecipientQueryVO;
+import com.aizuda.snailjob.server.web.model.request.NotifyRecipientRequestVO;
+import com.aizuda.snailjob.server.web.model.response.NotifyRecipientResponseVO;
+
+import java.util.List;
+
+/**
+ * @author opensnail
+ * @date 2024-04-17 21:24:21
+ * @since sj_1.0.0
+ */
+public interface NotifyRecipientService {
+
+ PageResult> getNotifyRecipientList(NotifyRecipientQueryVO queryVO);
+
+ Boolean saveNotifyRecipient(NotifyRecipientRequestVO requestVO);
+
+ Boolean updateNotifyRecipient(NotifyRecipientRequestVO requestVO);
+
+}
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/convert/NotifyRecipientResponseVOConverter.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/convert/NotifyRecipientResponseVOConverter.java
new file mode 100644
index 000000000..c867517d7
--- /dev/null
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/convert/NotifyRecipientResponseVOConverter.java
@@ -0,0 +1,22 @@
+package com.aizuda.snailjob.server.web.service.convert;
+
+import com.aizuda.snailjob.server.web.model.response.NotifyRecipientResponseVO;
+import com.aizuda.snailjob.template.datasource.persistence.po.NotifyRecipient;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author opensnail
+ * @date 2024-04-17 22:00:41
+ * @since sj_1.0.0
+ */
+@Mapper
+public interface NotifyRecipientResponseVOConverter {
+
+ NotifyRecipientResponseVOConverter INSTANCE = Mappers.getMapper(NotifyRecipientResponseVOConverter.class);
+
+ List toNotifyRecipientResponseVOs(List notifyRecipients);
+
+}
diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/NotifyRecipientServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/NotifyRecipientServiceImpl.java
new file mode 100644
index 000000000..aa15f2fce
--- /dev/null
+++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/NotifyRecipientServiceImpl.java
@@ -0,0 +1,46 @@
+package com.aizuda.snailjob.server.web.service.impl;
+
+import com.aizuda.snailjob.server.web.model.base.PageResult;
+import com.aizuda.snailjob.server.web.model.request.NotifyRecipientQueryVO;
+import com.aizuda.snailjob.server.web.model.request.NotifyRecipientRequestVO;
+import com.aizuda.snailjob.server.web.model.response.NotifyRecipientResponseVO;
+import com.aizuda.snailjob.server.web.service.NotifyRecipientService;
+import com.aizuda.snailjob.server.web.service.convert.NotifyRecipientResponseVOConverter;
+import com.aizuda.snailjob.template.datasource.persistence.mapper.NotifyRecipientMapper;
+import com.aizuda.snailjob.template.datasource.persistence.po.NotifyRecipient;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author opensnail
+ * @date 2024-04-17 21:24:51
+ * @since sj_1.0.0
+ */
+@Service
+@RequiredArgsConstructor
+public class NotifyRecipientServiceImpl implements NotifyRecipientService {
+ private final NotifyRecipientMapper notifyRecipientMapper;
+
+ @Override
+ public PageResult> getNotifyRecipientList(NotifyRecipientQueryVO queryVO) {
+ PageDTO pageDTO = new PageDTO<>(queryVO.getPage(), queryVO.getSize());
+
+ PageDTO notifyRecipientPageDTO = notifyRecipientMapper.selectPage(pageDTO, new LambdaQueryWrapper<>());
+
+ return new PageResult<>(pageDTO, NotifyRecipientResponseVOConverter.INSTANCE.toNotifyRecipientResponseVOs(notifyRecipientPageDTO.getRecords()));
+ }
+
+ @Override
+ public Boolean saveNotifyRecipient(NotifyRecipientRequestVO requestVO) {
+ return null;
+ }
+
+ @Override
+ public Boolean updateNotifyRecipient(NotifyRecipientRequestVO requestVO) {
+ return null;
+ }
+}