24282 2 years ago
parent
commit
4871c941e9

+ 64 - 0
src/main/java/com/fjhx/base/BaseSelectVo.java

@@ -0,0 +1,64 @@
+package com.fjhx.base;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class BaseSelectVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 页数
+     */
+    private Integer pageNum;
+
+    /**
+     * 每页条数
+     */
+    private Integer pageSize;
+
+    /**
+     * 关键字查询
+     */
+    private String keyword;
+
+    /**
+     * 通用开始时间
+     */
+    private Date beginTime;
+
+    /**
+     * 通用结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 返回分页实体
+     */
+    public <T> Page<T> getPage() {
+        return new Page<>(getPageNum(), getPageSize());
+    }
+
+    public Integer getPageNum() {
+        return ObjectUtil.defaultIfNull(pageNum, 1);
+    }
+
+    public Integer getPageSize() {
+        return ObjectUtil.defaultIfNull(pageSize, 10);
+    }
+
+    public Date getBeginTime() {
+        return ObjectUtil.isNotEmpty(beginTime) ? DateUtil.endOfDay(beginTime) : null;
+    }
+
+    public Date getEndTime() {
+        return ObjectUtil.isNotEmpty(endTime) ? DateUtil.endOfDay(endTime) : null;
+    }
+
+}

+ 69 - 0
src/main/java/com/fjhx/base/BaseService.java

@@ -0,0 +1,69 @@
+package com.fjhx.base;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+@SuppressWarnings("unused")
+public interface BaseService<T> extends IService<T> {
+
+
+    default Page<T> page(BaseSelectVo baseSelectVo, Consumer<LambdaQueryWrapper<T>> consumer) {
+        return page(baseSelectVo.getPage(), Wrappers.<T>lambdaQuery().func(consumer));
+    }
+
+    default long count(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return count(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default T getOne(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return getOne(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer).last("limit 1"));
+    }
+
+    default List<T> list(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return list(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default List<Map<String, Object>> listMaps(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return listMaps(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default <K> List<K> listK(SFunction<T, K> mapper, Consumer<LambdaQueryWrapper<T>> consumer) {
+        List<T> list = list(Wrappers.<T>lambdaQuery().select(mapper).func(ObjectUtil.isNotEmpty(consumer), consumer));
+        return list.stream().map(mapper).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+    }
+
+    default <K, V> Map<K, V> mapKV(SFunction<T, K> kFun, SFunction<T, V> vFun, Consumer<LambdaQueryWrapper<T>> consumer) {
+        List<T> list = list(Wrappers.<T>lambdaQuery().select(kFun, vFun).func(ObjectUtil.isNotEmpty(consumer), consumer));
+        return list.stream().collect(Collectors.toMap(kFun, vFun, (v1, v2) -> v2));
+    }
+
+    default <K> Map<K, T> mapKEntity(SFunction<T, K> kFun, Consumer<LambdaQueryWrapper<T>> consumer) {
+        List<T> list = list(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+        return list.stream().collect(Collectors.toMap(kFun, item -> item, (v1, v2) -> v2));
+    }
+
+    default <K> Map<K, List<T>> mapKGroup(SFunction<T, K> kFun, Consumer<LambdaQueryWrapper<T>> consumer) {
+        List<T> list = list(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+        return list.stream().collect(Collectors.groupingBy(kFun));
+    }
+
+    default boolean update(Consumer<LambdaUpdateWrapper<T>> consumer) {
+        return update(Wrappers.<T>lambdaUpdate().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+    default boolean remove(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return remove(Wrappers.<T>lambdaQuery().func(ObjectUtil.isNotEmpty(consumer), consumer));
+    }
+
+}

+ 56 - 0
src/main/java/com/fjhx/config/WebMvcConfig.java

@@ -0,0 +1,56 @@
+package com.fjhx.config;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.fjhx.utils.PageWrapper;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+/**
+ * WebMvc配置
+ */
+@EnableWebMvc
+@Configuration
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    /**
+     * webMvc序列化
+     */
+    @Override
+    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+
+        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+
+        ObjectMapper objectMapper = converter.getObjectMapper()
+                // 时间格式化
+                .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))
+                .registerModule(new SimpleModule()
+                        // 将Long转换成String
+                        .addSerializer(Long.class, ToStringSerializer.instance)
+                        // 将Page转成PageWrapper
+                        .addSerializer(IPage.class, new JsonSerializer<IPage>() {
+                            @Override
+                            public void serialize(IPage page, JsonGenerator jg, SerializerProvider sp) throws IOException {
+                                jg.writeObject(new PageWrapper(page));
+                            }
+                        })
+                );
+
+        converter.setObjectMapper(objectMapper);
+        converters.add(converter);
+    }
+
+}

+ 0 - 18
src/main/java/com/fjhx/controller/EmailMessageContentController.java

@@ -1,18 +0,0 @@
-package com.fjhx.controller;
-
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.stereotype.Controller;
-
-/**
- * <p>
- * 邮件正文 前端控制器
- * </p>
- *
- * @author zlj
- * @since 2023-01-10
- */
-@Controller
-@RequestMapping("/emailMessageContent")
-public class EmailMessageContentController {
-
-}

+ 45 - 2
src/main/java/com/fjhx/controller/EmailMessageController.java

@@ -1,7 +1,16 @@
 package com.fjhx.controller;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.base.R;
+import com.fjhx.entity.EmailMessage;
+import com.fjhx.service.IEmailMessageContentService;
+import com.fjhx.service.IEmailMessageService;
+import com.fjhx.vo.GetEmailMessagePageVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * <p>
@@ -11,8 +20,42 @@ import org.springframework.stereotype.Controller;
  * @author zlj
  * @since 2022-12-21
  */
-@Controller
+@RestController
 @RequestMapping("/emailMessage")
 public class EmailMessageController {
 
+    @Autowired
+    private IEmailMessageService emailMessageService;
+
+    @Autowired
+    private IEmailMessageContentService emailMessageContentService;
+
+    /**
+     * 获取邮件分页信息
+     */
+    @GetMapping("/page")
+    public R page(GetEmailMessagePageVo vo) {
+        Page<EmailMessage> result = emailMessageService.getPage(vo);
+        return R.ok(result);
+    }
+
+    /**
+     * 删除邮件
+     */
+    @GetMapping("delete")
+    public R delete(@RequestParam("messageId") String messageId) {
+        emailMessageService.delete(messageId);
+        return R.ok();
+    }
+
+    /**
+     * 获取邮件正文
+     */
+    @GetMapping("content")
+    public R content(@RequestParam String email, @RequestParam("messageId") String messageId) {
+        String result = emailMessageContentService.getContent(email, messageId);
+        return R.ok(result);
+    }
+
+
 }

+ 5 - 0
src/main/java/com/fjhx/entity/EmailMessage.java

@@ -74,6 +74,11 @@ public class EmailMessage implements Serializable {
     private Boolean contentSync;
 
     /**
+     * 是否展示
+     */
+    private Boolean isShow;
+
+    /**
      * 创建时间
      */
     @TableField(fill = FieldFill.INSERT)

+ 2 - 2
src/main/java/com/fjhx/service/IEmailInfoService.java

@@ -1,7 +1,7 @@
 package com.fjhx.service;
 
+import com.fjhx.base.BaseService;
 import com.fjhx.entity.EmailInfo;
-import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
  * <p>
@@ -11,6 +11,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @author zlj
  * @since 2022-12-20
  */
-public interface IEmailInfoService extends IService<EmailInfo> {
+public interface IEmailInfoService extends BaseService<EmailInfo> {
 
 }

+ 4 - 2
src/main/java/com/fjhx/service/IEmailMessageContentService.java

@@ -1,7 +1,7 @@
 package com.fjhx.service;
 
+import com.fjhx.base.BaseService;
 import com.fjhx.entity.EmailMessageContent;
-import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
  * <p>
@@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
  * @author zlj
  * @since 2023-01-10
  */
-public interface IEmailMessageContentService extends IService<EmailMessageContent> {
+public interface IEmailMessageContentService extends BaseService<EmailMessageContent> {
+
+    String getContent(String email, String messageId);
 
 }

+ 9 - 3
src/main/java/com/fjhx/service/IEmailMessageService.java

@@ -1,16 +1,22 @@
 package com.fjhx.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.base.BaseService;
 import com.fjhx.entity.EmailMessage;
-import com.baomidou.mybatisplus.extension.service.IService;
+import com.fjhx.vo.GetEmailMessagePageVo;
 
 /**
  * <p>
- *  服务类
+ * 服务类
  * </p>
  *
  * @author zlj
  * @since 2022-12-21
  */
-public interface IEmailMessageService extends IService<EmailMessage> {
+public interface IEmailMessageService extends BaseService<EmailMessage> {
+
+    Page<EmailMessage> getPage(GetEmailMessagePageVo vo);
+
+    void delete(String messageId);
 
 }

+ 34 - 28
src/main/java/com/fjhx/service/impl/AccountServiceImpl.java

@@ -47,9 +47,6 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
     private IEmailMessageService emailMessageService;
 
     @Autowired
-    private IEmailMessageSendService emailMessageSendService;
-
-    @Autowired
     private IEmailMessageAttachmentService emailMessageAttachmentService;
 
     @Autowired
@@ -64,8 +61,8 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
     @Autowired
     private Executor syncExecutor;
 
-    List<String> syncEmailMessageList = Collections.synchronizedList(new ArrayList<>(100));
-    List<String> syncMessageAttachmentList = Collections.synchronizedList(new ArrayList<>(100));
+    public static final List<String> syncMessageContentList = Collections.synchronizedList(new ArrayList<>(100));
+    public static final List<String> syncMessageAttachmentList = Collections.synchronizedList(new ArrayList<>(100));
 
     /**
      * 每页获取多少封邮件
@@ -85,6 +82,7 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
 
         List<String> collect = emailMessageService.list(Wrappers.<EmailMessage>lambdaQuery()
                         .select(EmailMessage::getEmail, EmailMessage::getMessageId)
+                        .eq(EmailMessage::getIsShow, true)
                         .eq(EmailMessage::getContentSync, false)
                         .orderByDesc(EmailMessage::getFromDate).last("limit 50"))
                 .stream()
@@ -92,18 +90,19 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
                 .collect(Collectors.toList());
 
         for (String item : collect) {
-            if (!syncEmailMessageList.contains(item)) {
-                syncEmailMessageList.add(item);
+            if (!syncMessageContentList.contains(item)) {
+                syncMessageContentList.add(item);
             }
         }
 
-        while (syncEmailMessageList.size() > 0) {
+        while (syncMessageContentList.size() > 0) {
             String remove = null;
 
             try {
                 synchronized (this) {
+                    ThreadUtil.sleep(1000);
                     log.info("下载正文");
-                    remove = syncEmailMessageList.remove(0);
+                    remove = syncMessageContentList.remove(0);
                     if (ObjectUtils.isEmpty(remove)) {
                         continue;
                     }
@@ -115,17 +114,19 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
                     // 正文内容
                     MessageDetailVo messageDetail = EmailEngineUtil.getMessageDetail(email, messageId);
                     MessageDetailVo.TextDTO text = messageDetail.getText();
+                    String html = "";
                     if (ObjectUtils.isNotEmpty(text)) {
-                        EmailMessageContent emailMessageContent = new EmailMessageContent();
-                        emailMessageContent.setMessageId(messageId);
-                        emailMessageContent.setHtmlContent(text.getHtml());
-                        emailMessageContentService.saveOrUpdate(emailMessageContent);
-
-                        EmailMessage emailMessage = new EmailMessage();
-                        emailMessage.setMessageId(messageId);
-                        emailMessage.setContentSync(true);
-                        emailMessageService.updateById(emailMessage);
+                        html = text.getHtml();
                     }
+                    EmailMessageContent emailMessageContent = new EmailMessageContent();
+                    emailMessageContent.setMessageId(messageId);
+                    emailMessageContent.setHtmlContent(html);
+                    emailMessageContentService.saveOrUpdate(emailMessageContent);
+
+                    EmailMessage emailMessage = new EmailMessage();
+                    emailMessage.setMessageId(messageId);
+                    emailMessage.setContentSync(true);
+                    emailMessageService.updateById(emailMessage);
                     log.info("下载正文成功");
                 }
             } catch (Exception e) {
@@ -159,6 +160,7 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
 
             try {
                 synchronized (this) {
+                    ThreadUtil.sleep(3000);
                     log.info("下载附件");
                     remove = syncMessageAttachmentList.remove(0);
                     if (ObjectUtil.isEmpty(remove)) {
@@ -349,6 +351,7 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
         emailMessage.setSubject(messagesDTO.getSubject());
         emailMessage.setFromDate(messagesDTO.getDate());
         emailMessage.setContentSync(false);
+        emailMessage.setIsShow(true);
 
         // 发件人
         MessageVo.MessagesDTO.ToDTO from = messagesDTO.getFrom();
@@ -396,14 +399,14 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
      */
     private void handleMessageNewEvent(ListenerVo listenerVo) {
         // 查询邮箱
-        String account = listenerVo.getAccount();
+        String email = listenerVo.getAccount();
 
         EmailInfo emailInfo;
         try {
-            emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, account));
+            emailInfo = emailInfoService.getOne(Wrappers.<EmailInfo>lambdaQuery().eq(EmailInfo::getEmail, email));
             Assert.notNull(emailInfo, "未找到邮箱信息");
-        } catch (Exception e) {
-            log.error("查找邮箱失败: {}", account, e);
+        } catch (IllegalArgumentException e) {
+            log.error("查找邮箱失败: {}", email, e);
             return;
         }
 
@@ -415,21 +418,24 @@ public class AccountServiceImpl implements IAccountService, ServletContextAware
         emailMessageService.saveOrUpdate(emailMessage);
 
         // 保存邮箱附件
-        List<EmailMessageAttachment> emailMessageAttachmentList;
+        List<EmailMessageAttachment> emailMessageAttachmentList = new ArrayList<>();
         List<MessageVo.MessagesDTO.AttachmentsDTO> attachments = messagesDTO.getAttachments();
         if (attachments != null && attachments.size() > 0) {
             emailMessageAttachmentList = attachments.stream()
                     .map(attachment -> this.createMessageAttachment(emailMessage, attachment))
                     .collect(Collectors.toList());
             emailMessageAttachmentService.saveOrUpdateBatch(emailMessageAttachmentList);
+        }
 
-            for (EmailMessageAttachment attachment : emailMessageAttachmentList) {
-                String value = attachment.getAttachmentId() + "," + attachment.getEmail() + "," + attachment.getPath();
-                syncMessageAttachmentList.add(0, value);
-            }
+        // 添加正文
+        syncMessageContentList.add(0, emailMessage.getEmail() + "," + emailMessage.getMessageId());
+
+        // 添加附件
+        for (EmailMessageAttachment attachment : emailMessageAttachmentList) {
+            String value = attachment.getAttachmentId() + "," + attachment.getEmail() + "," + attachment.getPath();
+            syncMessageAttachmentList.add(0, value);
         }
 
-        syncEmailMessageList.add(0, emailMessage.getEmail() + "," + emailMessage.getMessageId());
     }
 
     /**

+ 1 - 1
src/main/java/com/fjhx/service/impl/EmailInfoServiceImpl.java

@@ -1,9 +1,9 @@
 package com.fjhx.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.entity.EmailInfo;
 import com.fjhx.mapper.EmailInfoMapper;
 import com.fjhx.service.IEmailInfoService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
 /**

+ 58 - 1
src/main/java/com/fjhx/service/impl/EmailMessageContentServiceImpl.java

@@ -1,11 +1,22 @@
 package com.fjhx.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.config.TaskPoolConfig;
+import com.fjhx.config.exception.ServiceException;
+import com.fjhx.entity.EmailMessage;
 import com.fjhx.entity.EmailMessageContent;
 import com.fjhx.mapper.EmailMessageContentMapper;
 import com.fjhx.service.IEmailMessageContentService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.service.IEmailMessageService;
+import com.fjhx.utils.EmailEngineUtil;
+import com.fjhx.vo.MessageDetailVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import java.util.concurrent.Executor;
+
 /**
  * <p>
  * 邮件正文 服务实现类
@@ -17,4 +28,50 @@ import org.springframework.stereotype.Service;
 @Service
 public class EmailMessageContentServiceImpl extends ServiceImpl<EmailMessageContentMapper, EmailMessageContent> implements IEmailMessageContentService {
 
+    @Qualifier(TaskPoolConfig.EXECUTOR)
+    @Autowired
+    private Executor syncExecutor;
+
+    @Autowired
+    private IEmailMessageService emailMessageService;
+
+    @Override
+    public String getContent(String email, String messageId) {
+        EmailMessageContent content = getById(email);
+
+        try {
+            if (content == null) {
+                // 正文内容
+                MessageDetailVo messageDetail = EmailEngineUtil.getMessageDetail(email, messageId);
+                MessageDetailVo.TextDTO text = messageDetail.getText();
+                String html = "";
+                if (ObjectUtils.isNotEmpty(text)) {
+                    html = text.getHtml();
+                }
+
+                String syncHtml = html;
+                syncExecutor.execute(() -> {
+                    EmailMessageContent emailMessageContent = new EmailMessageContent();
+                    emailMessageContent.setMessageId(messageId);
+                    emailMessageContent.setHtmlContent(syncHtml);
+                    saveOrUpdate(emailMessageContent);
+
+                    EmailMessage emailMessage = new EmailMessage();
+                    emailMessage.setMessageId(messageId);
+                    emailMessage.setContentSync(true);
+                    emailMessageService.updateById(emailMessage);
+
+                    AccountServiceImpl.syncMessageContentList.remove(email + "," + messageId);
+                });
+
+                return html;
+
+            }
+        } catch (Exception e) {
+            throw new ServiceException("获取正文失败");
+        }
+
+
+        return content.getHtmlContent();
+    }
 }

+ 37 - 2
src/main/java/com/fjhx/service/impl/EmailMessageServiceImpl.java

@@ -1,14 +1,20 @@
 package com.fjhx.service.impl;
 
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.entity.EmailMessage;
 import com.fjhx.mapper.EmailMessageMapper;
 import com.fjhx.service.IEmailMessageService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.vo.GetEmailMessagePageVo;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+
 /**
  * <p>
- *  服务实现类
+ * 服务实现类
  * </p>
  *
  * @author zlj
@@ -17,4 +23,33 @@ import org.springframework.stereotype.Service;
 @Service
 public class EmailMessageServiceImpl extends ServiceImpl<EmailMessageMapper, EmailMessage> implements IEmailMessageService {
 
+    @Override
+    public Page<EmailMessage> getPage(GetEmailMessagePageVo vo) {
+
+        String email = vo.getEmail();
+        Assert.notEmpty(email, "邮箱不能为空");
+
+        Date beginTime = vo.getBeginTime();
+        Date endTime = vo.getEndTime();
+        String subject = vo.getSubject();
+        String fromName = vo.getFromName();
+        String fromAddress = vo.getFromAddress();
+
+        return page(vo, q -> q
+                .eq(EmailMessage::getEmail, email)
+                .eq(EmailMessage::getIsShow, true)
+                .between(ObjectUtil.isAllNotEmpty(beginTime, endTime), EmailMessage::getFromDate, beginTime, endTime)
+                .like(ObjectUtil.isNotEmpty(subject), EmailMessage::getSubject, subject)
+                .like(ObjectUtil.isNotEmpty(fromName), EmailMessage::getFromName, fromName)
+                .like(ObjectUtil.isNotEmpty(fromAddress), EmailMessage::getFromAddress, fromAddress)
+                .orderByDesc(EmailMessage::getFromDate)
+        );
+
+    }
+
+    @Override
+    public void delete(String messageId) {
+        update(q -> q.eq(EmailMessage::getMessageId, messageId).set(EmailMessage::getIsShow, false));
+    }
+
 }

+ 54 - 0
src/main/java/com/fjhx/utils/PageWrapper.java

@@ -0,0 +1,54 @@
+package com.fjhx.utils;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.Getter;
+
+import java.util.List;
+
+@Getter
+@SuppressWarnings("unused")
+public class PageWrapper<T> {
+
+    /**
+     * 页数
+     */
+    private final Integer pageNum;
+
+    /**
+     * 每页条数
+     */
+    private final Integer pageSize;
+
+    /**
+     * 总条数
+     */
+    private final Integer total;
+
+    /**
+     * 数据列表
+     */
+    private final List<T> rows;
+
+    /**
+     * 包装page成前端需要的格式
+     */
+    public PageWrapper(IPage<T> page) {
+        this.pageNum = Convert.toInt(page.getPages());
+        this.pageSize = Convert.toInt(page.getSize());
+        this.total = Convert.toInt(page.getTotal());
+        this.rows = page.getRecords();
+    }
+
+    /**
+     * 包装page成前端需要的格式,并把数据列表转成指定实体
+     */
+    public PageWrapper(IPage<?> page, Class<T> cls) {
+        this.pageNum = Convert.toInt(page.getPages());
+        this.pageSize = Convert.toInt(page.getSize());
+        this.total = Convert.toInt(page.getTotal());
+        this.rows = BeanUtil.copyToList(page.getRecords(), cls);
+    }
+
+}

+ 31 - 0
src/main/java/com/fjhx/vo/GetEmailMessagePageVo.java

@@ -0,0 +1,31 @@
+package com.fjhx.vo;
+
+import com.fjhx.base.BaseSelectVo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class GetEmailMessagePageVo extends BaseSelectVo {
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 发送人
+     */
+    private String fromName;
+
+    /**
+     * 发送地址
+     */
+    private String fromAddress;
+
+    /**
+     * 邮件标题
+     */
+    private String subject;
+
+}