From f3da7da43949bb54b16b73572a979d5a99cd2468 Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Sun, 14 Dec 2025 21:54:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=A2=84=E8=AD=A6=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jeesite/modules/app/Job/mailJob.java | 79 +++ .../modules/app/utils/FileDownloadUtils.java | 162 +++++ .../modules/app/utils/MailReceiveUtils.java | 3 +- .../modules/app/utils/MailSendUtils.java | 164 +++++ .../biz/entity/BizMailAttachments.java | 11 +- .../modules/biz/entity/BizMailReceived.java | 13 +- .../modules/biz/entity/BizMailSent.java | 12 +- .../biz/web/BizMailAttachmentsController.java | 234 ++++--- .../biz/web/BizMailReceivedController.java | 210 +++--- .../biz/web/BizMailSentController.java | 235 ++++--- web-vue/packages/assets/images/docx.png | Bin 0 -> 9927 bytes web-vue/packages/assets/images/file.png | Bin 0 -> 8710 bytes web-vue/packages/assets/images/gz.png | Bin 0 -> 8966 bytes .../packages/assets/images/login-brand.png | Bin 0 -> 59107 bytes web-vue/packages/assets/images/pdf.png | Bin 0 -> 15165 bytes web-vue/packages/assets/images/pptx.png | Bin 0 -> 11499 bytes web-vue/packages/assets/images/py.png | Bin 0 -> 8332 bytes web-vue/packages/assets/images/sql.png | Bin 0 -> 13121 bytes web-vue/packages/assets/images/user.jpg | Bin 0 -> 1205 bytes web-vue/packages/assets/images/wps.png | Bin 0 -> 14271 bytes web-vue/packages/assets/images/xlsx.png | Bin 0 -> 14777 bytes web-vue/packages/assets/images/zip.png | Bin 0 -> 8143 bytes .../packages/biz/api/biz/mailAttachments.ts | 4 + web-vue/packages/biz/api/biz/mailSent.ts | 4 + .../biz/views/biz/mailInfo/account/list.vue | 1 + .../biz/views/biz/mailInfo/account/select.ts | 180 ----- .../views/biz/mailInfo/attachments/list.vue | 41 +- .../biz/views/biz/mailInfo/received/list.vue | 45 +- .../biz/views/biz/mailInfo/received/view.vue | 614 ++++++++++++++++++ .../biz/views/biz/mailInfo/sent/form.vue | 21 +- .../biz/views/biz/mailInfo/sent/list.vue | 36 +- .../biz/views/biz/mailInfo/sent/select.ts | 196 ------ .../src/selectType/bizMailAccountSelect.ts | 181 ++++++ 33 files changed, 1666 insertions(+), 780 deletions(-) create mode 100644 web-api/src/main/java/com/jeesite/modules/app/Job/mailJob.java create mode 100644 web-api/src/main/java/com/jeesite/modules/app/utils/FileDownloadUtils.java create mode 100644 web-api/src/main/java/com/jeesite/modules/app/utils/MailSendUtils.java create mode 100644 web-vue/packages/assets/images/docx.png create mode 100644 web-vue/packages/assets/images/file.png create mode 100644 web-vue/packages/assets/images/gz.png create mode 100644 web-vue/packages/assets/images/login-brand.png create mode 100644 web-vue/packages/assets/images/pdf.png create mode 100644 web-vue/packages/assets/images/pptx.png create mode 100644 web-vue/packages/assets/images/py.png create mode 100644 web-vue/packages/assets/images/sql.png create mode 100644 web-vue/packages/assets/images/user.jpg create mode 100644 web-vue/packages/assets/images/wps.png create mode 100644 web-vue/packages/assets/images/xlsx.png create mode 100644 web-vue/packages/assets/images/zip.png delete mode 100644 web-vue/packages/biz/views/biz/mailInfo/account/select.ts create mode 100644 web-vue/packages/biz/views/biz/mailInfo/received/view.vue delete mode 100644 web-vue/packages/biz/views/biz/mailInfo/sent/select.ts create mode 100644 web-vue/packages/core/components/ListSelect/src/selectType/bizMailAccountSelect.ts diff --git a/web-api/src/main/java/com/jeesite/modules/app/Job/mailJob.java b/web-api/src/main/java/com/jeesite/modules/app/Job/mailJob.java new file mode 100644 index 00000000..16f94f58 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/Job/mailJob.java @@ -0,0 +1,79 @@ +package com.jeesite.modules.app.Job; + +import com.jeesite.common.config.Global; +import com.jeesite.modules.app.dao.MailReceived; +import com.jeesite.modules.app.utils.LoggerUtils; +import com.jeesite.modules.app.utils.MailReceiveUtils; +import com.jeesite.modules.biz.entity.BizMailAccount; +import com.jeesite.modules.biz.entity.BizMailAttachments; +import com.jeesite.modules.biz.entity.BizMailReceived; +import com.jeesite.modules.biz.service.BizMailAccountService; +import com.jeesite.modules.biz.service.BizMailAttachmentsService; +import com.jeesite.modules.biz.service.BizMailReceivedService; +import jakarta.annotation.Resource; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Controller; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +@Controller +public class mailJob { + + + @Resource + private BizMailAccountService bizMailAccountService; + + @Resource + private BizMailReceivedService receivedService; + + @Resource + private BizMailAttachmentsService attachmentsService; + + @Resource(name = "hostMonitorExecutor") + private ThreadPoolTaskExecutor hostMonitorExecutor; + + + private String MAIL_PATH = "/ogsapp/mail"; + + private static final LoggerUtils logger = LoggerUtils.getInstance(); + + private static final boolean CRON_JOB = Boolean.parseBoolean(Global.getConfig("biz.cron.MailJob", "false")); + + @Scheduled(cron = "10 0/15 * * * ?") + public void getMailReceived() { + if (CRON_JOB) { + List accounts = bizMailAccountService.findList(new BizMailAccount()); + List> futures = new ArrayList<>(accounts.size()); + for (BizMailAccount account : accounts) { + CompletableFuture future = CompletableFuture.runAsync(() -> { + try { + List receivedList = MailReceiveUtils.receiveUnreadMails(account, MAIL_PATH); + for (MailReceived mailReceived : receivedList) { + BizMailReceived received = mailReceived.getReceived(); + List attachments = mailReceived.getAttachments(); + for (BizMailAttachments mailAttachments : attachments) { + attachmentsService.insert(mailAttachments); + } + receivedService.save(received); + } + } catch (Exception e) { + logger.error(e.getMessage()); + } + }, hostMonitorExecutor); // 指定使用配置的线程池 + futures.add(future); + } + try { + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .get(60, TimeUnit.SECONDS); // 超时时间可根据业务调整 + } catch (Exception e) { + logger.error(e.getMessage()); + } + } + } + + +} diff --git a/web-api/src/main/java/com/jeesite/modules/app/utils/FileDownloadUtils.java b/web-api/src/main/java/com/jeesite/modules/app/utils/FileDownloadUtils.java new file mode 100644 index 00000000..0c45944b --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/utils/FileDownloadUtils.java @@ -0,0 +1,162 @@ +package com.jeesite.modules.app.utils; + +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.FileCopyUtils; + +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * 文件下载工具类 + * 支持两种方式: + * 1. 基于HttpServletResponse直接输出(适用于传统Servlet/SSM) + * 2. 返回ResponseEntity(适用于SpringBoot) + * 修复点:解决文件名前后加下划线、中文乱码、浏览器兼容性问题 + */ +public class FileDownloadUtils { + + /** + * 私有构造方法,禁止实例化 + */ + private FileDownloadUtils() { + throw new UnsupportedOperationException("工具类禁止实例化"); + } + + /** + * 方式1:通过HttpServletResponse下载文件(推荐SSM/Servlet使用) + * + * @param orgFileName 文件完整路径(例如:D:/files/test.pdf) + * @param fileName 下载时显示的文件名(例如:测试文件.pdf) + * @param response HttpServletResponse对象 + * @throws Exception 文件操作异常 + */ + public static void downloadFile(String orgFileName, String fileName, HttpServletResponse response) throws Exception { + // 1. 构建完整文件路径 + Path fullFilePath = Paths.get(orgFileName); + File file = fullFilePath.toFile(); + + // 2. 校验文件合法性 + validateFile(file); + + // 3. 清理并编码文件名(避免特殊字符导致的解析异常) + String encodedFileName = encodeFileName(fileName); + + // 4. 设置响应头(核心修复:解决下划线/乱码问题) + setDownloadResponseHeader(response, encodedFileName, file.length()); + + // 5. 读取文件并写入响应输出流(try-with-resources自动关闭流) + try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(fullFilePath)); + OutputStream outputStream = new BufferedOutputStream(response.getOutputStream())) { + FileCopyUtils.copy(inputStream, outputStream); + outputStream.flush(); + } catch (IOException e) { + throw new IOException("文件下载失败:" + e.getMessage(), e); + } + } + + /** + * 方式2:返回ResponseEntity(推荐SpringBoot使用) + * + * @param orgFileName 文件完整路径(例如:D:/files/test.pdf) + * @param fileName 下载时显示的文件名(例如:测试文件.pdf) + * @return ResponseEntity 下载响应实体 + * @throws IOException 文件操作异常 + */ + public static ResponseEntity downloadFile(String orgFileName, String fileName) throws IOException { + // 1. 构建完整文件路径 + Path fullFilePath = Paths.get(orgFileName); + File file = fullFilePath.toFile(); + + // 2. 校验文件合法性 + validateFile(file); + + // 3. 读取文件字节数组 + byte[] fileBytes = Files.readAllBytes(fullFilePath); + + // 4. 清理并编码文件名 + String encodedFileName = encodeFileName(fileName); + + HttpHeaders headers = new HttpHeaders(); + // 核心修复:使用RFC 5987标准,移除多余双引号,避免下划线问题 + headers.set(HttpHeaders.CONTENT_DISPOSITION, + String.format("attachment; filename=%s; filename*=UTF-8''%s", + encodedFileName, encodedFileName)); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentLength(fileBytes.length); + // 禁止缓存 + headers.setCacheControl("no-cache, no-store, must-revalidate"); + headers.setPragma("no-cache"); + headers.setExpires(0); + + // 6. 返回响应实体 + return new ResponseEntity<>(fileBytes, headers, HttpStatus.OK); + } + + /** + * 校验文件合法性(存在性、是否为文件、读取权限) + * + * @param file 待校验文件 + * @throws FileNotFoundException 文件不合法异常 + */ + private static void validateFile(File file) throws FileNotFoundException { + if (!file.exists()) { + throw new FileNotFoundException("文件不存在:" + file.getAbsolutePath()); + } + if (file.isDirectory()) { + throw new FileNotFoundException("路径指向目录,不是文件:" + file.getAbsolutePath()); + } + if (!file.canRead()) { + throw new FileNotFoundException("文件无读取权限:" + file.getAbsolutePath()); + } + } + + /** + * 设置下载响应头(核心修复:解决下划线/乱码/浏览器兼容问题) + * + * @param response HttpServletResponse + * @param encodedFileName 编码后的文件名 + * @param fileSize 文件大小 + */ + private static void setDownloadResponseHeader(HttpServletResponse response, String encodedFileName, long fileSize) { + // 设置响应内容类型为二进制流 + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + // 设置字符编码 + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + // 设置内容长度 + response.setContentLengthLong(fileSize); + // 核心修复:使用RFC 5987标准,移除多余双引号,避免浏览器解析出下划线 + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, + String.format("attachment; filename=%s; filename*=UTF-8''%s", + encodedFileName, encodedFileName)); + // 禁止缓存 + response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate"); + response.setHeader(HttpHeaders.PRAGMA, "no-cache"); + response.setDateHeader(HttpHeaders.EXPIRES, 0); + } + + /** + * 编码文件名(解决中文乱码+空格转+号导致的下划线问题) + * + * @param fileName 清理后的文件名 + * @return 编码后的文件名 + */ + private static String encodeFileName(String fileName) { + try { + // 修复:将空格编码为%20而非+,避免浏览器解析为下划线 + return URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()) + .replace("+", "%20"); + } catch (UnsupportedEncodingException e) { + // 理论上UTF-8不会抛出此异常,兜底返回原文件名 + return fileName; + } + } + +} \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/app/utils/MailReceiveUtils.java b/web-api/src/main/java/com/jeesite/modules/app/utils/MailReceiveUtils.java index 867e9684..183aafb2 100644 --- a/web-api/src/main/java/com/jeesite/modules/app/utils/MailReceiveUtils.java +++ b/web-api/src/main/java/com/jeesite/modules/app/utils/MailReceiveUtils.java @@ -598,11 +598,10 @@ public class MailReceiveUtils { attachment.setFileMd5(md5); attachment.setDownloadCount(0); attachment.setIsCompressed(isCompressedFile(originalFileName) ? "1" : "0"); - attachment.setIsEncrypted("N"); + attachment.setIsEncrypted("0"); attachment.setDownloadStartTime(new Date(attachDownloadStartTime)); // 附件下载开始时间 attachment.setDownloadEndTime(new Date(attachDownloadEndTime)); // 附件下载结束时间 attachment.setDownloadCostTime(costTime); // 附件下载耗时(毫秒) - return attachment; } diff --git a/web-api/src/main/java/com/jeesite/modules/app/utils/MailSendUtils.java b/web-api/src/main/java/com/jeesite/modules/app/utils/MailSendUtils.java new file mode 100644 index 00000000..c3130e39 --- /dev/null +++ b/web-api/src/main/java/com/jeesite/modules/app/utils/MailSendUtils.java @@ -0,0 +1,164 @@ +package com.jeesite.modules.app.utils; + +import com.jeesite.modules.biz.entity.BizMailAccount; +import com.jeesite.modules.biz.entity.BizMailSent; +import com.jeesite.modules.file.entity.FileUpload; + +import javax.mail.*; +import javax.mail.internet.*; +import java.io.File; +import java.util.*; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class MailSendUtils { + private static final ExecutorService MAIL_EXECUTOR = Executors.newFixedThreadPool(5); + + private static String FILE_PATH = "/ogsapp/files"; + + /** + * 同步发送HTML格式邮件 + * + * @param mailAccount 邮件账户配置 + * @param mailSent 邮件发送内容信息 + * @return BizMailSent 填充发送结果后的对象 + */ + public static BizMailSent sendHtmlMail(BizMailAccount mailAccount, BizMailSent mailSent, List fileUploads) { + // 初始化发送结果对象 + mailSent.setId(mailSent.getId()); + mailSent.setCreateTime(new Date()); + mailSent.setSendStatus("0"); // 默认失败状态 + // 1. 参数校验 + if (!validateParams(mailAccount, mailSent)) { + mailSent.setErrorMsg("参数校验失败:邮件账户或发送内容不完整"); + return mailSent; + } + + Properties props = new Properties(); + props.put("mail.smtp.host", mailAccount.getHost()); + props.put("mail.smtp.port", mailAccount.getSmtpPort().toString()); + props.put("mail.smtp.auth", "true"); // 开启认证 + props.put("mail.smtp.socketFactory.port", mailAccount.getSmtpPort().toString()); + + // SSL配置 + if (mailAccount.getSslEnable().equals("true")) { + props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); + props.put("mail.smtp.starttls.enable", "true"); + } + + // 3. 创建认证器 + Authenticator authenticator = new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(mailAccount.getUsername(), mailAccount.getPassword()); + } + }; + + // 4. 创建邮件会话 + Session session = Session.getInstance(props, authenticator); + session.setDebug(false); // 生产环境关闭调试 + + try { + // 5. 构建MIME邮件消息 + MimeMessage message = new MimeMessage(session); + + // 设置发件人 + message.setFrom(new InternetAddress(mailAccount.getFromAddress())); + + // 设置收件人 + if (mailSent.getToAddresses() != null && !mailSent.getToAddresses().isEmpty()) { + String[] toArray = mailSent.getToAddresses().split(","); + InternetAddress[] toAddresses = new InternetAddress[toArray.length]; + for (int i = 0; i < toArray.length; i++) { + toAddresses[i] = new InternetAddress(toArray[i].trim()); + } + message.setRecipients(Message.RecipientType.TO, toAddresses); + } + + // 设置抄送人 + if (mailSent.getCcAddresses() != null && !mailSent.getCcAddresses().isEmpty()) { + String[] ccArray = mailSent.getCcAddresses().split(","); + InternetAddress[] ccAddresses = new InternetAddress[ccArray.length]; + for (int i = 0; i < ccArray.length; i++) { + ccAddresses[i] = new InternetAddress(ccArray[i].trim()); + } + message.setRecipients(Message.RecipientType.CC, ccAddresses); + } + // 设置邮件主题 + message.setSubject(mailSent.getSubject(), "UTF-8"); + // 构建邮件内容(支持HTML和附件) + MimeMultipart multipart = new MimeMultipart("mixed"); + // HTML内容部分 + MimeBodyPart contentPart = new MimeBodyPart(); + contentPart.setContent(mailSent.getContent(), "text/html;charset=UTF-8"); + multipart.addBodyPart(contentPart); + if (fileUploads.size() > 0) { + mailSent.setHasAttachment("1"); + for (FileUpload upload : fileUploads) { + MimeBodyPart attachmentPart = new MimeBodyPart(); + File file = new File(FILE_PATH + upload.getFileUrl()); + attachmentPart.attachFile(file); + attachmentPart.setFileName(MimeUtility.encodeText(file.getName(), "UTF-8", "B")); + multipart.addBodyPart(attachmentPart); + } + } + + // 设置邮件内容 + message.setContent(multipart); + // 设置发送时间 + message.setSentDate(new Date()); + // 6. 发送邮件 + Transport.send(message); + // 7. 更新发送结果 + mailSent.setSendTime(new Date()); + mailSent.setSendStatus("1"); + mailSent.setErrorMsg(""); + mailSent.setMessageId(message.getMessageID()); // 邮件服务器消息ID + } catch (Exception e) { + // 捕获所有异常,记录错误信息 + mailSent.setErrorMsg("邮件发送失败:" + e.getMessage()); + mailSent.setSendTime(new Date()); + // 打印异常栈(生产环境建议日志记录) + e.printStackTrace(); + } + + return mailSent; + } + + /** + * 异步发送HTML格式邮件 + * + * @param mailAccount 邮件账户配置 + * @param mailSent 邮件发送内容信息 + */ + public static void sendHtmlMailAsync(BizMailAccount mailAccount, BizMailSent mailSent, List fileUploads) { + MAIL_EXECUTOR.submit(() -> sendHtmlMail(mailAccount, mailSent, fileUploads)); + } + + /** + * 参数校验 + * + * @param mailAccount 邮件账户 + * @param mailSent 邮件内容 + * @return 校验结果 + */ + private static boolean validateParams(BizMailAccount mailAccount, BizMailSent mailSent) { + // 校验账户必填项 + if (mailAccount == null || mailAccount.getHost() == null || mailAccount.getSmtpPort() == null + || mailAccount.getUsername() == null || mailAccount.getPassword() == null + || mailAccount.getFromAddress() == null) { + return false; + } + + // 校验邮件内容必填项 + return mailSent != null && mailSent.getToAddresses() != null && !mailSent.getToAddresses().isEmpty() + && mailSent.getSubject() != null && mailSent.getContent() != null; + } + + /** + * 关闭线程池(应用关闭时调用) + */ + public static void shutdownExecutor() { + MAIL_EXECUTOR.shutdown(); + } +} diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailAttachments.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailAttachments.java index 2cb7c771..e2be720c 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailAttachments.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailAttachments.java @@ -3,15 +3,6 @@ package com.jeesite.modules.biz.entity; import java.io.Serializable; import java.util.Date; -import com.jeesite.common.mybatis.annotation.JoinTable; -import com.jeesite.common.mybatis.annotation.JoinTable.Type; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; - import com.jeesite.common.entity.DataEntity; import com.jeesite.common.mybatis.annotation.Column; import com.jeesite.common.mybatis.annotation.Table; @@ -35,7 +26,7 @@ import java.io.Serial; @Column(name = "create_time", attrName = "createTime", label = "记录时间", isUpdate = false, isUpdateForce = true), @Column(name = "id", attrName = "tid", label = "附件标识", isPK = true), @Column(name = "mail_id", attrName = "mailId", label = "收件标识"), - @Column(name = "message_id", attrName = "messageId", label = "消息标识", isQuery = false), + @Column(name = "message_id", attrName = "messageId", label = "消息标识"), @Column(name = "file_name", attrName = "fileName", label = "附件名称", queryType = QueryType.LIKE), @Column(name = "file_size", attrName = "fileSize", label = "文件大小", isQuery = false), @Column(name = "file_type", attrName = "fileType", label = "文件类型", isQuery = false), diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailReceived.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailReceived.java index 78b0da46..a6f5d349 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailReceived.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailReceived.java @@ -46,6 +46,12 @@ import java.io.Serial; @Column(name = "has_attachment", attrName = "hasAttachment", label = "是否有附件"), @Column(name = "mailbox", attrName = "mailbox", label = "mailbox", isQuery = false), @Column(name = "ustatus", attrName = "ustatus", label = "状态"), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = BizMailAccount.class, attrName = "this", alias = "b", + on = "a.account_id = b.id", + columns = { + @Column(name = "account_name", attrName = "accountName", label = "配置名称"), + }), }, orderBy = "a.id DESC" ) @Data @@ -69,11 +75,12 @@ public class BizMailReceived extends DataEntity implements Seri private String mailbox; // mailbox private String ustatus; // 状态 + private String accountName; + @ExcelFields({ @ExcelField(title = "记录时间", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), - @ExcelField(title = "主键ID", attrName = "id", align = Align.CENTER, sort = 20), - @ExcelField(title = "邮件服务器消息ID", attrName = "messageId", align = Align.CENTER, sort = 30), - @ExcelField(title = "邮件账户标识", attrName = "accountId", align = Align.CENTER, sort = 40), + @ExcelField(title = "主键标识", attrName = "id", align = Align.CENTER, sort = 20), + @ExcelField(title = "配置名称", attrName = "accountName", align = Align.CENTER, sort = 40), @ExcelField(title = "发件人地址", attrName = "fromAddress", align = Align.CENTER, sort = 50), @ExcelField(title = "发件人名称", attrName = "fromName", align = Align.CENTER, sort = 60), @ExcelField(title = "收件人地址", attrName = "toAddresses", align = Align.CENTER, sort = 70), diff --git a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailSent.java b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailSent.java index cdd835b8..3f68652f 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailSent.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/entity/BizMailSent.java @@ -47,6 +47,12 @@ import java.io.Serial; @Column(name = "f_flow_id", attrName = "fflowId", label = "流程id", isUpdate = false, isQuery = false), @Column(name = "f_flow_task_id", attrName = "fflowTaskId", label = "流程任务主键", isUpdate = false, isQuery = false), @Column(name = "f_flow_state", attrName = "fflowState", label = "流程任务状态", isUpdate = false, isQuery = false, isUpdateForce = true), +}, joinTable = { + @JoinTable(type = Type.LEFT_JOIN, entity = BizMailAccount.class, attrName = "this", alias = "b", + on = "a.account_id = b.id", + columns = { + @Column(name = "account_name", attrName = "accountName", label = "配置名称"), + }), }, orderBy = "a.create_time DESC" ) @Data @@ -72,11 +78,12 @@ public class BizMailSent extends DataEntity implements Serializable private String fflowTaskId; // 流程任务主键 private Integer fflowState; // 流程任务状态 + private String accountName; + @ExcelFields({ @ExcelField(title = "记录时间", attrName = "createTime", align = Align.CENTER, sort = 10, dataFormat = "yyyy-MM-dd hh:mm"), @ExcelField(title = "主键标识", attrName = "id", align = Align.CENTER, sort = 20), - @ExcelField(title = "件服务器消息标识", attrName = "messageId", align = Align.CENTER, sort = 30), - @ExcelField(title = "邮件账户标识", attrName = "accountId", align = Align.CENTER, sort = 40), + @ExcelField(title = "服务名称", attrName = "accountName", align = Align.CENTER, sort = 40), @ExcelField(title = "发件人地址", attrName = "fromAddress", align = Align.CENTER, sort = 50), @ExcelField(title = "收件人地址", attrName = "toAddresses", align = Align.CENTER, sort = 60), @ExcelField(title = "抄送人地址", attrName = "ccAddresses", align = Align.CENTER, sort = 70), @@ -95,6 +102,7 @@ public class BizMailSent extends DataEntity implements Serializable public BizMailSent(String id) { super(id); } + public Date getCreateTime_gte() { return sqlMap.getWhere().getValue("create_time", QueryType.GTE); } diff --git a/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailAttachmentsController.java b/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailAttachmentsController.java index 270b9480..c7cb0415 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailAttachmentsController.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailAttachmentsController.java @@ -1,17 +1,18 @@ package com.jeesite.modules.biz.web; +import java.io.File; import java.util.List; + +import com.jeesite.modules.app.utils.FileDownloadUtils; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import com.jeesite.common.config.Global; import com.jeesite.common.collect.ListUtils; @@ -26,6 +27,7 @@ import com.jeesite.modules.biz.service.BizMailAttachmentsService; /** * 邮件附件表Controller + * * @author gaoxq * @version 2025-12-14 */ @@ -33,114 +35,130 @@ import com.jeesite.modules.biz.service.BizMailAttachmentsService; @RequestMapping(value = "${adminPath}/biz/mailAttachments") public class BizMailAttachmentsController extends BaseController { - private final BizMailAttachmentsService bizMailAttachmentsService; + private final BizMailAttachmentsService bizMailAttachmentsService; - public BizMailAttachmentsController(BizMailAttachmentsService bizMailAttachmentsService) { - this.bizMailAttachmentsService = bizMailAttachmentsService; - } - - /** - * 获取数据 - */ - @ModelAttribute - public BizMailAttachments get(Long tid, boolean isNewRecord) { - return bizMailAttachmentsService.get(tid, isNewRecord); - } - - /** - * 查询列表 - */ - @RequiresPermissions("biz:mailAttachments:view") - @RequestMapping(value = {"list", ""}) - public String list(BizMailAttachments bizMailAttachments, Model model) { - model.addAttribute("bizMailAttachments", bizMailAttachments); - return "modules/biz/bizMailAttachmentsList"; - } - - /** - * 查询列表数据 - */ - @RequiresPermissions("biz:mailAttachments:view") - @RequestMapping(value = "listData") - @ResponseBody - public Page listData(BizMailAttachments bizMailAttachments, HttpServletRequest request, HttpServletResponse response) { - bizMailAttachments.setPage(new Page<>(request, response)); - Page page = bizMailAttachmentsService.findPage(bizMailAttachments); - return page; - } + public BizMailAttachmentsController(BizMailAttachmentsService bizMailAttachmentsService) { + this.bizMailAttachmentsService = bizMailAttachmentsService; + } - /** - * 查看编辑表单 - */ - @RequiresPermissions("biz:mailAttachments:view") - @RequestMapping(value = "form") - public String form(BizMailAttachments bizMailAttachments, Model model) { - model.addAttribute("bizMailAttachments", bizMailAttachments); - return "modules/biz/bizMailAttachmentsForm"; - } + /** + * 获取数据 + */ + @ModelAttribute + public BizMailAttachments get(Long tid, boolean isNewRecord) { + return bizMailAttachmentsService.get(tid, isNewRecord); + } - /** - * 保存数据 - */ - @RequiresPermissions("biz:mailAttachments:edit") - @PostMapping(value = "save") - @ResponseBody - public String save(@Validated BizMailAttachments bizMailAttachments) { - bizMailAttachmentsService.save(bizMailAttachments); - return renderResult(Global.TRUE, text("保存邮件附件表成功!")); - } + /** + * 查询列表 + */ + @RequiresPermissions("biz:mailAttachments:view") + @RequestMapping(value = {"list", ""}) + public String list(BizMailAttachments bizMailAttachments, Model model) { + model.addAttribute("bizMailAttachments", bizMailAttachments); + return "modules/biz/bizMailAttachmentsList"; + } - /** - * 导出数据 - */ - @RequiresPermissions("biz:mailAttachments:view") - @RequestMapping(value = "exportData") - public void exportData(BizMailAttachments bizMailAttachments, HttpServletResponse response) { - List list = bizMailAttachmentsService.findList(bizMailAttachments); - String fileName = "邮件附件表" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; - try(ExcelExport ee = new ExcelExport("邮件附件表", BizMailAttachments.class)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表数据 + */ + @RequiresPermissions("biz:mailAttachments:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(BizMailAttachments bizMailAttachments, HttpServletRequest request, HttpServletResponse response) { + bizMailAttachments.setPage(new Page<>(request, response)); + Page page = bizMailAttachmentsService.findPage(bizMailAttachments); + return page; + } - /** - * 下载模板 - */ - @RequiresPermissions("biz:mailAttachments:view") - @RequestMapping(value = "importTemplate") - public void importTemplate(HttpServletResponse response) { - BizMailAttachments bizMailAttachments = new BizMailAttachments(); - List list = ListUtils.newArrayList(bizMailAttachments); - String fileName = "邮件附件表模板.xlsx"; - try(ExcelExport ee = new ExcelExport("邮件附件表", BizMailAttachments.class, Type.IMPORT)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查看编辑表单 + */ + @RequiresPermissions("biz:mailAttachments:view") + @RequestMapping(value = "form") + public String form(BizMailAttachments bizMailAttachments, Model model) { + model.addAttribute("bizMailAttachments", bizMailAttachments); + return "modules/biz/bizMailAttachmentsForm"; + } - /** - * 导入数据 - */ - @ResponseBody - @RequiresPermissions("biz:mailAttachments:edit") - @PostMapping(value = "importData") - public String importData(MultipartFile file) { - try { - String message = bizMailAttachmentsService.importData(file); - return renderResult(Global.TRUE, "posfull:"+message); - } catch (Exception ex) { - return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); - } - } - - /** - * 删除数据 - */ - @RequiresPermissions("biz:mailAttachments:edit") - @RequestMapping(value = "delete") - @ResponseBody - public String delete(BizMailAttachments bizMailAttachments) { - bizMailAttachmentsService.delete(bizMailAttachments); - return renderResult(Global.TRUE, text("删除邮件附件表成功!")); - } - + /** + * 保存数据 + */ + @RequiresPermissions("biz:mailAttachments:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated BizMailAttachments bizMailAttachments) { + bizMailAttachmentsService.save(bizMailAttachments); + return renderResult(Global.TRUE, text("保存邮件附件表成功!")); + } + + /** + * 导出数据 + */ + @RequiresPermissions("biz:mailAttachments:view") + @RequestMapping(value = "exportData") + public void exportData(BizMailAttachments bizMailAttachments, HttpServletResponse response) { + List list = bizMailAttachmentsService.findList(bizMailAttachments); + String fileName = "邮件附件表" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("邮件附件表", BizMailAttachments.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 下载模板 + */ + @RequiresPermissions("biz:mailAttachments:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + BizMailAttachments bizMailAttachments = new BizMailAttachments(); + List list = ListUtils.newArrayList(bizMailAttachments); + String fileName = "邮件附件表模板.xlsx"; + try (ExcelExport ee = new ExcelExport("邮件附件表", BizMailAttachments.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 导入数据 + */ + @ResponseBody + @RequiresPermissions("biz:mailAttachments:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = bizMailAttachmentsService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 删除数据 + */ + @RequiresPermissions("biz:mailAttachments:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(BizMailAttachments bizMailAttachments) { + bizMailAttachmentsService.delete(bizMailAttachments); + return renderResult(Global.TRUE, text("删除邮件附件表成功!")); + } + + @RequestMapping(value = "listAll") + @ResponseBody + public List listAll(BizMailAttachments bizMailAttachments) { + return bizMailAttachmentsService.findList(bizMailAttachments); + } + + + @PostMapping(value = "downloadFile") + public void downloadFile(BizMailAttachments bizMailAttachments, HttpServletResponse response) { + try { + BizMailAttachments attachments = bizMailAttachmentsService.get(bizMailAttachments); + FileDownloadUtils.downloadFile(attachments.getStoragePath(), attachments.getFileName(), response); + } catch (Exception e) { + System.out.print(e.getMessage()); + } + } } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailReceivedController.java b/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailReceivedController.java index 03d2a375..863ab486 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailReceivedController.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailReceivedController.java @@ -1,6 +1,7 @@ package com.jeesite.modules.biz.web; import java.util.List; + import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -26,6 +27,7 @@ import com.jeesite.modules.biz.service.BizMailReceivedService; /** * 收件Controller + * * @author gaoxq * @version 2025-12-14 */ @@ -33,114 +35,114 @@ import com.jeesite.modules.biz.service.BizMailReceivedService; @RequestMapping(value = "${adminPath}/biz/mailReceived") public class BizMailReceivedController extends BaseController { - private final BizMailReceivedService bizMailReceivedService; + private final BizMailReceivedService bizMailReceivedService; - public BizMailReceivedController(BizMailReceivedService bizMailReceivedService) { - this.bizMailReceivedService = bizMailReceivedService; - } - - /** - * 获取数据 - */ - @ModelAttribute - public BizMailReceived get(String id, boolean isNewRecord) { - return bizMailReceivedService.get(id, isNewRecord); - } - - /** - * 查询列表 - */ - @RequiresPermissions("biz:mailReceived:view") - @RequestMapping(value = {"list", ""}) - public String list(BizMailReceived bizMailReceived, Model model) { - model.addAttribute("bizMailReceived", bizMailReceived); - return "modules/biz/bizMailReceivedList"; - } - - /** - * 查询列表数据 - */ - @RequiresPermissions("biz:mailReceived:view") - @RequestMapping(value = "listData") - @ResponseBody - public Page listData(BizMailReceived bizMailReceived, HttpServletRequest request, HttpServletResponse response) { - bizMailReceived.setPage(new Page<>(request, response)); - Page page = bizMailReceivedService.findPage(bizMailReceived); - return page; - } + public BizMailReceivedController(BizMailReceivedService bizMailReceivedService) { + this.bizMailReceivedService = bizMailReceivedService; + } - /** - * 查看编辑表单 - */ - @RequiresPermissions("biz:mailReceived:view") - @RequestMapping(value = "form") - public String form(BizMailReceived bizMailReceived, Model model) { - model.addAttribute("bizMailReceived", bizMailReceived); - return "modules/biz/bizMailReceivedForm"; - } + /** + * 获取数据 + */ + @ModelAttribute + public BizMailReceived get(String id, boolean isNewRecord) { + return bizMailReceivedService.get(id, isNewRecord); + } - /** - * 保存数据 - */ - @RequiresPermissions("biz:mailReceived:edit") - @PostMapping(value = "save") - @ResponseBody - public String save(@Validated BizMailReceived bizMailReceived) { - bizMailReceivedService.save(bizMailReceived); - return renderResult(Global.TRUE, text("保存收件成功!")); - } + /** + * 查询列表 + */ + @RequiresPermissions("biz:mailReceived:view") + @RequestMapping(value = {"list", ""}) + public String list(BizMailReceived bizMailReceived, Model model) { + model.addAttribute("bizMailReceived", bizMailReceived); + return "modules/biz/bizMailReceivedList"; + } - /** - * 导出数据 - */ - @RequiresPermissions("biz:mailReceived:view") - @RequestMapping(value = "exportData") - public void exportData(BizMailReceived bizMailReceived, HttpServletResponse response) { - List list = bizMailReceivedService.findList(bizMailReceived); - String fileName = "收件" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; - try(ExcelExport ee = new ExcelExport("收件", BizMailReceived.class)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表数据 + */ + @RequiresPermissions("biz:mailReceived:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(BizMailReceived bizMailReceived, HttpServletRequest request, HttpServletResponse response) { + bizMailReceived.setPage(new Page<>(request, response)); + Page page = bizMailReceivedService.findPage(bizMailReceived); + return page; + } - /** - * 下载模板 - */ - @RequiresPermissions("biz:mailReceived:view") - @RequestMapping(value = "importTemplate") - public void importTemplate(HttpServletResponse response) { - BizMailReceived bizMailReceived = new BizMailReceived(); - List list = ListUtils.newArrayList(bizMailReceived); - String fileName = "收件模板.xlsx"; - try(ExcelExport ee = new ExcelExport("收件", BizMailReceived.class, Type.IMPORT)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查看编辑表单 + */ + @RequiresPermissions("biz:mailReceived:view") + @RequestMapping(value = "form") + public String form(BizMailReceived bizMailReceived, Model model) { + model.addAttribute("bizMailReceived", bizMailReceived); + return "modules/biz/bizMailReceivedForm"; + } + + /** + * 保存数据 + */ + @RequiresPermissions("biz:mailReceived:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated BizMailReceived bizMailReceived) { + bizMailReceivedService.save(bizMailReceived); + return renderResult(Global.TRUE, text("保存收件成功!")); + } + + /** + * 导出数据 + */ + @RequiresPermissions("biz:mailReceived:view") + @RequestMapping(value = "exportData") + public void exportData(BizMailReceived bizMailReceived, HttpServletResponse response) { + List list = bizMailReceivedService.findList(bizMailReceived); + String fileName = "收件" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("收件", BizMailReceived.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 下载模板 + */ + @RequiresPermissions("biz:mailReceived:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + BizMailReceived bizMailReceived = new BizMailReceived(); + List list = ListUtils.newArrayList(bizMailReceived); + String fileName = "收件模板.xlsx"; + try (ExcelExport ee = new ExcelExport("收件", BizMailReceived.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 导入数据 + */ + @ResponseBody + @RequiresPermissions("biz:mailReceived:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = bizMailReceivedService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 删除数据 + */ + @RequiresPermissions("biz:mailReceived:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(BizMailReceived bizMailReceived) { + bizMailReceivedService.delete(bizMailReceived); + return renderResult(Global.TRUE, text("删除收件成功!")); + } - /** - * 导入数据 - */ - @ResponseBody - @RequiresPermissions("biz:mailReceived:edit") - @PostMapping(value = "importData") - public String importData(MultipartFile file) { - try { - String message = bizMailReceivedService.importData(file); - return renderResult(Global.TRUE, "posfull:"+message); - } catch (Exception ex) { - return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); - } - } - - /** - * 删除数据 - */ - @RequiresPermissions("biz:mailReceived:edit") - @RequestMapping(value = "delete") - @ResponseBody - public String delete(BizMailReceived bizMailReceived) { - bizMailReceivedService.delete(bizMailReceived); - return renderResult(Global.TRUE, text("删除收件成功!")); - } - } \ No newline at end of file diff --git a/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailSentController.java b/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailSentController.java index fef42831..4173d63c 100644 --- a/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailSentController.java +++ b/web-api/src/main/java/com/jeesite/modules/biz/web/BizMailSentController.java @@ -1,6 +1,14 @@ package com.jeesite.modules.biz.web; import java.util.List; + +import com.jeesite.modules.app.utils.MailSendUtils; +import com.jeesite.modules.app.utils.vDate; +import com.jeesite.modules.biz.entity.BizMailAccount; +import com.jeesite.modules.biz.service.BizMailAccountService; +import com.jeesite.modules.file.entity.FileUpload; +import com.jeesite.modules.file.utils.FileUploadUtils; +import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -26,6 +34,7 @@ import com.jeesite.modules.biz.service.BizMailSentService; /** * 发件Controller + * * @author gaoxq * @version 2025-12-14 */ @@ -33,114 +42,132 @@ import com.jeesite.modules.biz.service.BizMailSentService; @RequestMapping(value = "${adminPath}/biz/mailSent") public class BizMailSentController extends BaseController { - private final BizMailSentService bizMailSentService; - public BizMailSentController(BizMailSentService bizMailSentService) { - this.bizMailSentService = bizMailSentService; - } - - /** - * 获取数据 - */ - @ModelAttribute - public BizMailSent get(String id, boolean isNewRecord) { - return bizMailSentService.get(id, isNewRecord); - } - - /** - * 查询列表 - */ - @RequiresPermissions("biz:mailSent:view") - @RequestMapping(value = {"list", ""}) - public String list(BizMailSent bizMailSent, Model model) { - model.addAttribute("bizMailSent", bizMailSent); - return "modules/biz/bizMailSentList"; - } - - /** - * 查询列表数据 - */ - @RequiresPermissions("biz:mailSent:view") - @RequestMapping(value = "listData") - @ResponseBody - public Page listData(BizMailSent bizMailSent, HttpServletRequest request, HttpServletResponse response) { - bizMailSent.setPage(new Page<>(request, response)); - Page page = bizMailSentService.findPage(bizMailSent); - return page; - } + @Resource + private BizMailAccountService accountService; - /** - * 查看编辑表单 - */ - @RequiresPermissions("biz:mailSent:view") - @RequestMapping(value = "form") - public String form(BizMailSent bizMailSent, Model model) { - model.addAttribute("bizMailSent", bizMailSent); - return "modules/biz/bizMailSentForm"; - } + private final BizMailSentService bizMailSentService; - /** - * 保存数据 - */ - @RequiresPermissions("biz:mailSent:edit") - @PostMapping(value = "save") - @ResponseBody - public String save(@Validated BizMailSent bizMailSent) { - bizMailSentService.save(bizMailSent); - return renderResult(Global.TRUE, text("保存发件成功!")); - } + public BizMailSentController(BizMailSentService bizMailSentService) { + this.bizMailSentService = bizMailSentService; + } - /** - * 导出数据 - */ - @RequiresPermissions("biz:mailSent:view") - @RequestMapping(value = "exportData") - public void exportData(BizMailSent bizMailSent, HttpServletResponse response) { - List list = bizMailSentService.findList(bizMailSent); - String fileName = "发件" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; - try(ExcelExport ee = new ExcelExport("发件", BizMailSent.class)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 获取数据 + */ + @ModelAttribute + public BizMailSent get(String id, boolean isNewRecord) { + return bizMailSentService.get(id, isNewRecord); + } - /** - * 下载模板 - */ - @RequiresPermissions("biz:mailSent:view") - @RequestMapping(value = "importTemplate") - public void importTemplate(HttpServletResponse response) { - BizMailSent bizMailSent = new BizMailSent(); - List list = ListUtils.newArrayList(bizMailSent); - String fileName = "发件模板.xlsx"; - try(ExcelExport ee = new ExcelExport("发件", BizMailSent.class, Type.IMPORT)){ - ee.setDataList(list).write(response, fileName); - } - } + /** + * 查询列表 + */ + @RequiresPermissions("biz:mailSent:view") + @RequestMapping(value = {"list", ""}) + public String list(BizMailSent bizMailSent, Model model) { + model.addAttribute("bizMailSent", bizMailSent); + return "modules/biz/bizMailSentList"; + } + + /** + * 查询列表数据 + */ + @RequiresPermissions("biz:mailSent:view") + @RequestMapping(value = "listData") + @ResponseBody + public Page listData(BizMailSent bizMailSent, HttpServletRequest request, HttpServletResponse response) { + bizMailSent.setPage(new Page<>(request, response)); + Page page = bizMailSentService.findPage(bizMailSent); + return page; + } + + /** + * 查看编辑表单 + */ + @RequiresPermissions("biz:mailSent:view") + @RequestMapping(value = "form") + public String form(BizMailSent bizMailSent, Model model) { + model.addAttribute("bizMailSent", bizMailSent); + return "modules/biz/bizMailSentForm"; + } + + /** + * 保存数据 + */ + @RequiresPermissions("biz:mailSent:edit") + @PostMapping(value = "save") + @ResponseBody + public String save(@Validated BizMailSent bizMailSent) { + BizMailAccount account = accountService.get(bizMailSent.getAccountId()); + bizMailSent.setFromAddress(account.getFromAddress()); + bizMailSent.setUpdateTime(vDate.getUpdateTime(bizMailSent.getIsNewRecord())); + bizMailSentService.save(bizMailSent); + return renderResult(Global.TRUE, text("保存发件成功!")); + } + + /** + * 导出数据 + */ + @RequiresPermissions("biz:mailSent:view") + @RequestMapping(value = "exportData") + public void exportData(BizMailSent bizMailSent, HttpServletResponse response) { + List list = bizMailSentService.findList(bizMailSent); + String fileName = "发件" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx"; + try (ExcelExport ee = new ExcelExport("发件", BizMailSent.class)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 下载模板 + */ + @RequiresPermissions("biz:mailSent:view") + @RequestMapping(value = "importTemplate") + public void importTemplate(HttpServletResponse response) { + BizMailSent bizMailSent = new BizMailSent(); + List list = ListUtils.newArrayList(bizMailSent); + String fileName = "发件模板.xlsx"; + try (ExcelExport ee = new ExcelExport("发件", BizMailSent.class, Type.IMPORT)) { + ee.setDataList(list).write(response, fileName); + } + } + + /** + * 导入数据 + */ + @ResponseBody + @RequiresPermissions("biz:mailSent:edit") + @PostMapping(value = "importData") + public String importData(MultipartFile file) { + try { + String message = bizMailSentService.importData(file); + return renderResult(Global.TRUE, "posfull:" + message); + } catch (Exception ex) { + return renderResult(Global.FALSE, "posfull:" + ex.getMessage()); + } + } + + /** + * 删除数据 + */ + @RequiresPermissions("biz:mailSent:edit") + @RequestMapping(value = "delete") + @ResponseBody + public String delete(BizMailSent bizMailSent) { + bizMailSentService.delete(bizMailSent); + return renderResult(Global.TRUE, text("删除发件成功!")); + } + + + @RequestMapping(value = "sent") + @ResponseBody + public String sent(BizMailSent bizMailSent) { + BizMailAccount account = accountService.get(bizMailSent.getAccountId()); + List fileUploads = FileUploadUtils.findFileUpload(bizMailSent.getId(), "bizMailSent_file"); + BizMailSent sent = MailSendUtils.sendHtmlMail(account, bizMailSent, fileUploads); + bizMailSentService.save(sent); + return renderResult(Global.TRUE, text("邮件发件成功!")); + } - /** - * 导入数据 - */ - @ResponseBody - @RequiresPermissions("biz:mailSent:edit") - @PostMapping(value = "importData") - public String importData(MultipartFile file) { - try { - String message = bizMailSentService.importData(file); - return renderResult(Global.TRUE, "posfull:"+message); - } catch (Exception ex) { - return renderResult(Global.FALSE, "posfull:"+ex.getMessage()); - } - } - - /** - * 删除数据 - */ - @RequiresPermissions("biz:mailSent:edit") - @RequestMapping(value = "delete") - @ResponseBody - public String delete(BizMailSent bizMailSent) { - bizMailSentService.delete(bizMailSent); - return renderResult(Global.TRUE, text("删除发件成功!")); - } - } \ No newline at end of file diff --git a/web-vue/packages/assets/images/docx.png b/web-vue/packages/assets/images/docx.png new file mode 100644 index 0000000000000000000000000000000000000000..228719ba9abae1785262fca2942fbcac2ad05cce GIT binary patch literal 9927 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 literal 0 HcmV?d00001 diff --git a/web-vue/packages/assets/images/file.png b/web-vue/packages/assets/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..0f064e6c80e4043ea31a241dcd9c0cb0adae85c3 GIT binary patch literal 8710 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 RzR2}s;XnEh0m}2S{|6XfJbC~C literal 0 HcmV?d00001 diff --git a/web-vue/packages/assets/images/gz.png b/web-vue/packages/assets/images/gz.png new file mode 100644 index 0000000000000000000000000000000000000000..562faf8794fc6c0655f17432bef02cd5990bf4e2 GIT binary patch literal 8966 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 literal 0 HcmV?d00001 diff --git a/web-vue/packages/assets/images/login-brand.png b/web-vue/packages/assets/images/login-brand.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3ee21c85c0e5c2ece2c5772bf0d4e1ecc857f3 GIT binary patch literal 59107 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 literal 0 HcmV?d00001 diff --git a/web-vue/packages/assets/images/pptx.png b/web-vue/packages/assets/images/pptx.png new file mode 100644 index 0000000000000000000000000000000000000000..7052d2948f0fb71069841016405603ceeed8c54a GIT binary patch literal 11499 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 literal 0 HcmV?d00001 diff --git a/web-vue/packages/assets/images/py.png b/web-vue/packages/assets/images/py.png new file mode 100644 index 0000000000000000000000000000000000000000..08415f0fe86e3d893ceb8140d0817dee80a0a488 GIT binary patch literal 8332 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 F{|6|9jV}NI literal 0 HcmV?d00001 diff --git a/web-vue/packages/assets/images/user.jpg b/web-vue/packages/assets/images/user.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b687d73310f265cb2cc2c5e98e77f5a1f955635c GIT binary patch literal 1205 zcmex=~kX3=9lx3_^^|42(b)2um@tg6S|ITN=ua1F|)sYM6j* zVJ3w7%yt&AdZ2+|-~l8-=D=un28Idj3@ktq10zEN#)%L%BhZAlN$d=wK=A`W%&-8e z#?ZikaRJ2i|Nj{nm=-`x*8nPEMq-1sI0id=dIITy%;e(ITm?@TD+MzXhX1!2oEbRS z*x1=vIoR3RIXOAFctm)4xVd>Gg@pMFmiHo@^JG=@bXF+Dat4skqrJHVi4qD&|uJDW>jKe5@ci+Wc+`G zK^ho3Ow5d+Ac6rVRz_wv7IvVd1S12g6ay%rSpMH);9&-86JQnq2JSm$y(Hb-f6GOzmDo+d|GKBk*sus;bY!s zpt-Vw3`~qH%rKXOXeOY?gd7DFA;tooZ_k)^OfNVy<9&~}UXSOO*y;8VjX-_K-ezK8 zWEN61OcW3VyN3y+u}3d7*yZ4QmizUB9)35&9*G@#v|1miTV8;Hk%b8u6mS3x4M9U@ zMFAmU1tX|`*zB2td>9s_%FVc;dCY72>?Kyal79T=oEOBSHsglt4(IZsm2;T-bM+1< zta`>(W;szvbUn~$1z<=4(;JeX7zG&=4Fd%n6AKj@Kf=PwUa|dggvz&RI$5tD9Gj!Q z{stF=4Cjr0pCFkRP4(3z_3N}BLm1K0)d8(6Tz+k1+73akIaUK zWwmVweUIEcn)Xh3J}hjJ0|%JI1Qi1X8Vw6SfOUexRv>Ycm71H3fl?Ds3ird3>I@FI z9iWI&5&)(-P$aU#!WN|2&@oUTaiT)u!i@*vAt2CJzxIV(ScJK*z`j$pOfMKLE-d`B zDB`Ur3uA9y0LIZr$h*S@oldn{yrSQ?KKj_xAj)S65Y@Q)>VJ FCIB8>C*%MC literal 0 HcmV?d00001 diff --git a/web-vue/packages/assets/images/wps.png b/web-vue/packages/assets/images/wps.png new file mode 100644 index 0000000000000000000000000000000000000000..edc9e1261f07bc0d8ad2fb0ba26658cca96a8a0f GIT binary patch literal 14271 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 IbpPr92mHoXivR!s literal 0 HcmV?d00001 diff --git a/web-vue/packages/assets/images/xlsx.png b/web-vue/packages/assets/images/xlsx.png new file mode 100644 index 0000000000000000000000000000000000000000..95cd85ebe896c09a4e3361b3e136efbdc73e0910 GIT binary patch literal 14777 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 Z<#Oyn>9kiF{7?@r{B}|Q?OD4A{|mo(HsJsO literal 0 HcmV?d00001 diff --git a/web-vue/packages/biz/api/biz/mailAttachments.ts b/web-vue/packages/biz/api/biz/mailAttachments.ts index 33d86b7d..f3204ffd 100644 --- a/web-vue/packages/biz/api/biz/mailAttachments.ts +++ b/web-vue/packages/biz/api/biz/mailAttachments.ts @@ -30,6 +30,9 @@ export interface BizMailAttachments extends BasicModel { export const bizMailAttachmentsList = (params?: BizMailAttachments | any) => defHttp.get({ url: adminPath + '/biz/mailAttachments/list', params }); +export const bizMailAttachmentsListAll = (params?: BizMailAttachments | any) => + defHttp.get({ url: adminPath + '/biz/mailAttachments/listAll', params }); + export const bizMailAttachmentsListData = (params?: BizMailAttachments | any) => defHttp.post>({ url: adminPath + '/biz/mailAttachments/listData', params }); @@ -53,3 +56,4 @@ export const bizMailAttachmentsImportData = ( export const bizMailAttachmentsDelete = (params?: BizMailAttachments | any) => defHttp.get({ url: adminPath + '/biz/mailAttachments/delete', params }); + diff --git a/web-vue/packages/biz/api/biz/mailSent.ts b/web-vue/packages/biz/api/biz/mailSent.ts index 1ae7ba23..601383aa 100644 --- a/web-vue/packages/biz/api/biz/mailSent.ts +++ b/web-vue/packages/biz/api/biz/mailSent.ts @@ -58,3 +58,7 @@ export const bizMailSentImportData = ( export const bizMailSentDelete = (params?: BizMailSent | any) => defHttp.get({ url: adminPath + '/biz/mailSent/delete', params }); + + +export const bizMailSent = (params?: BizMailSent | any) => + defHttp.get({ url: adminPath + '/biz/mailSent/sent', params }); \ No newline at end of file diff --git a/web-vue/packages/biz/views/biz/mailInfo/account/list.vue b/web-vue/packages/biz/views/biz/mailInfo/account/list.vue index ca7deeef..27d43d39 100644 --- a/web-vue/packages/biz/views/biz/mailInfo/account/list.vue +++ b/web-vue/packages/biz/views/biz/mailInfo/account/list.vue @@ -236,6 +236,7 @@ confirm: handleDelete.bind(this, record), }, auth: 'biz:mailAccount:edit', + ifShow: record.ustatus == '0' }, { icon: 'ant-design:undo-outlined', diff --git a/web-vue/packages/biz/views/biz/mailInfo/account/select.ts b/web-vue/packages/biz/views/biz/mailInfo/account/select.ts deleted file mode 100644 index 8dc6db2e..00000000 --- a/web-vue/packages/biz/views/biz/mailInfo/account/select.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { useI18n } from '@jeesite/core/hooks/web/useI18n'; -import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table'; -import { bizMailAccountListData } from '@jeesite/biz/api/biz/mailAccount'; - -const { t } = useI18n('biz.mailAccount'); - -const modalProps = { - title: t('邮件信息选择'), -}; - -const searchForm: FormProps = { - baseColProps: { md: 8, lg: 6 }, - labelWidth: 90, - schemas: [ - { - label: t('记录时间起'), - field: 'createTime_gte', - component: 'DatePicker', - componentProps: { - format: 'YYYY-MM-DD HH:mm', - showTime: { format: 'HH:mm' }, - }, - }, - { - label: t('记录时间止'), - field: 'createTime_lte', - component: 'DatePicker', - componentProps: { - format: 'YYYY-MM-DD HH:mm', - showTime: { format: 'HH:mm' }, - }, - }, - { - label: t('服务地址'), - field: 'host', - component: 'Input', - }, - { - label: t('用户名称'), - field: 'username', - component: 'Input', - }, - { - label: t('发件人地址'), - field: 'fromAddress', - component: 'Input', - }, - { - label: t('是否启用SSL'), - field: 'sslEnable', - component: 'Select', - componentProps: { - dictType: 'is_open', - allowClear: true, - }, - }, - { - label: t('状态'), - field: 'status', - component: 'Select', - componentProps: { - dictType: 'ustatus', - allowClear: true, - }, - }, - ], -}; - -const tableColumns: BasicColumn[] = [ - { - title: t('记录时间'), - dataIndex: 'createTime', - key: 'a.create_time', - sorter: true, - width: 230, - align: 'left', - slot: 'firstColumn', - }, - { - title: t('服务地址'), - dataIndex: 'host', - key: 'a.host', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('SMTP端口'), - dataIndex: 'smtpPort', - key: 'a.smtp_port', - sorter: true, - width: 130, - align: 'center', - }, - { - title: t('IMAP端口'), - dataIndex: 'imapPort', - key: 'a.imap_port', - sorter: true, - width: 130, - align: 'center', - }, - { - title: t('用户名称'), - dataIndex: 'username', - key: 'a.username', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('用户密码'), - dataIndex: 'password', - key: 'a.password', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('发件人地址'), - dataIndex: 'fromAddress', - key: 'a.from_address', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('是否启用SSL'), - dataIndex: 'sslEnable', - key: 'a.ssl_enable', - sorter: true, - width: 130, - align: 'center', - dictType: 'is_open', - }, - { - title: t('状态'), - dataIndex: 'status', - key: 'a.status', - sorter: true, - width: 130, - align: 'center', - dictType: 'ustatus', - }, - { - title: t('备注'), - dataIndex: 'remark', - key: 'a.remark', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('更新时间'), - dataIndex: 'updateTime', - key: 'a.update_time', - sorter: true, - width: 130, - align: 'center', - }, -]; - -const tableProps: BasicTableProps = { - api: bizMailAccountListData, - beforeFetch: (params) => { - params['isAll'] = true; - return params; - }, - columns: tableColumns, - formConfig: searchForm, - rowKey: 'id', -}; - -export default { - modalProps, - tableProps, - itemCode: 'id', - itemName: 'id', - isShowCode: false, -}; diff --git a/web-vue/packages/biz/views/biz/mailInfo/attachments/list.vue b/web-vue/packages/biz/views/biz/mailInfo/attachments/list.vue index 5d53fe5d..f1cdc1fd 100644 --- a/web-vue/packages/biz/views/biz/mailInfo/attachments/list.vue +++ b/web-vue/packages/biz/views/biz/mailInfo/attachments/list.vue @@ -68,31 +68,11 @@ showTime: { format: 'HH:mm' }, }, }, - { - label: t('收件标识'), - field: 'mailId', - component: 'Input', - }, { label: t('附件名称'), field: 'fileName', component: 'Input', }, - { - label: t('文件扩展名'), - field: 'fileExt', - component: 'Input', - }, - { - label: t('是否压缩'), - field: 'isCompressed', - component: 'Input', - }, - { - label: t('是否加密'), - field: 'isEncrypted', - component: 'Input', - }, ], }; @@ -104,15 +84,7 @@ sorter: true, width: 180, align: 'left', - slot: 'firstColumn', - }, - { - title: t('收件标识'), - dataIndex: 'mailId', - key: 'a.mail_id', - sorter: true, - width: 130, - align: 'center', + fixed: 'left' }, { title: t('附件名称'), @@ -146,14 +118,6 @@ width: 130, align: 'left', }, - { - title: t('存储路径'), - dataIndex: 'storagePath', - key: 'a.storage_path', - sorter: true, - width: 130, - align: 'left', - }, { title: t('文件MD5'), dataIndex: 'fileMd5', @@ -177,6 +141,7 @@ sorter: true, width: 130, align: 'left', + dictType: 'is_compressed', }, { title: t('是否加密'), @@ -185,11 +150,13 @@ sorter: true, width: 130, align: 'left', + dictType: 'is_encrypted', }, ]; const actionColumn: BasicColumn = { width: 160, + align: 'center', actions: (record: BizMailAttachments) => [ { icon: 'i-ant-design:delete-outlined', diff --git a/web-vue/packages/biz/views/biz/mailInfo/received/list.vue b/web-vue/packages/biz/views/biz/mailInfo/received/list.vue index a0dd1c9b..55dd4834 100644 --- a/web-vue/packages/biz/views/biz/mailInfo/received/list.vue +++ b/web-vue/packages/biz/views/biz/mailInfo/received/list.vue @@ -15,7 +15,13 @@ {{ t('导出') }} + + @@ -34,6 +40,7 @@ import { useModal } from '@jeesite/core/components/Modal'; import { FormProps } from '@jeesite/core/components/Form'; import FormImport from './formImport.vue'; + import ViewModal from './view.vue'; const { t } = useI18n('biz.mailReceived'); const { showMessage } = useMessage(); @@ -71,7 +78,11 @@ { label: t('账号名称'), field: 'accountId', - component: 'Input', + fieldLabel: 'accountName', + component: 'ListSelect', + componentProps: { + selectType: 'bizMailAccountSelect', + }, }, { label: t('发件人名称'), @@ -86,12 +97,20 @@ { label: t('是否有附件'), field: 'hasAttachment', - component: 'Input', + component: 'Select', + componentProps: { + dictType: 'has_attachment', + allowClear: true, + }, }, { label: t('状态'), field: 'ustatus', - component: 'Input', + component: 'Select', + componentProps: { + dictType: 'send_status', + allowClear: true, + }, }, ], }; @@ -107,9 +126,9 @@ fixed: 'left', }, { - title: t('账户标识'), - dataIndex: 'accountId', - key: 'a.account_id', + title: t('服务名称'), + dataIndex: 'accountName', + key: 'b.account_name', sorter: true, width: 130, align: 'left', @@ -122,21 +141,14 @@ width: 130, align: 'left', }, - { - title: t('发件人名称'), - dataIndex: 'fromName', - key: 'a.from_name', - sorter: true, - width: 130, - align: 'left', - }, { title: t('邮件主题'), dataIndex: 'subject', key: 'a.subject', sorter: true, - width: 130, + width: 425, align: 'left', + slot: 'slotBizKey', }, { title: t('接收时间'), @@ -153,6 +165,7 @@ sorter: true, width: 130, align: 'left', + dictType: 'has_attachment', }, ]; @@ -197,6 +210,8 @@ function handleForm(record: Recordable) { openDrawer(true, record); } + + const [registerViewModal, { openModal: openViewModal }] = useModal(); async function handleExport() { loading.value = true; diff --git a/web-vue/packages/biz/views/biz/mailInfo/received/view.vue b/web-vue/packages/biz/views/biz/mailInfo/received/view.vue new file mode 100644 index 00000000..da205621 --- /dev/null +++ b/web-vue/packages/biz/views/biz/mailInfo/received/view.vue @@ -0,0 +1,614 @@ + + + + + \ No newline at end of file diff --git a/web-vue/packages/biz/views/biz/mailInfo/sent/form.vue b/web-vue/packages/biz/views/biz/mailInfo/sent/form.vue index 0445c14f..1c55ef02 100644 --- a/web-vue/packages/biz/views/biz/mailInfo/sent/form.vue +++ b/web-vue/packages/biz/views/biz/mailInfo/sent/form.vue @@ -54,18 +54,10 @@ { label: t('账户名称'), field: 'accountId', - component: 'Input', + fieldLabel: 'accountName', + component: 'ListSelect', componentProps: { - maxlength: 52, - }, - required: true, - }, - { - label: t('发件人地址'), - field: 'fromAddress', - component: 'Input', - componentProps: { - maxlength: 255, + selectType: 'bizMailAccountSelect', }, required: true, }, @@ -74,7 +66,14 @@ field: 'toAddresses', component: 'Input', required: true, + colProps: { md: 24, lg: 24 }, }, + { + label: t('抄送人地址'), + field: 'ccAddresses', + component: 'Input', + colProps: { md: 24, lg: 24 }, + }, { label: t('邮件内容'), field: 'content', diff --git a/web-vue/packages/biz/views/biz/mailInfo/sent/list.vue b/web-vue/packages/biz/views/biz/mailInfo/sent/list.vue index 95d447a4..6e11c024 100644 --- a/web-vue/packages/biz/views/biz/mailInfo/sent/list.vue +++ b/web-vue/packages/biz/views/biz/mailInfo/sent/list.vue @@ -38,7 +38,7 @@ import { Icon } from '@jeesite/core/components/Icon'; import { BasicTable, BasicColumn, useTable } from '@jeesite/core/components/Table'; import { BizMailSent, bizMailSentList } from '@jeesite/biz/api/biz/mailSent'; - import { bizMailSentDelete, bizMailSentListData } from '@jeesite/biz/api/biz/mailSent'; + import { bizMailSentDelete, bizMailSent, bizMailSentListData } from '@jeesite/biz/api/biz/mailSent'; import { useModal } from '@jeesite/core/components/Modal'; import { FormProps } from '@jeesite/core/components/Form'; import InputForm from './form.vue'; @@ -80,7 +80,11 @@ { label: t('账号名称'), field: 'accountId', - component: 'Input', + fieldLabel: 'accountName', + component: 'ListSelect', + componentProps: { + selectType: 'bizMailAccountSelect', + }, }, { label: t('发件地址'), @@ -97,7 +101,7 @@ field: 'sendStatus', component: 'Select', componentProps: { - dictType: '', + dictType: 'send_status', allowClear: true, }, }, @@ -106,7 +110,7 @@ field: 'hasAttachment', component: 'Select', componentProps: { - dictType: '', + dictType: 'has_attachment', allowClear: true, }, }, @@ -121,7 +125,7 @@ sorter: true, width: 180, align: 'left', - slot: 'firstColumn', + fixed: 'left', }, { title: t('发件人地址'), @@ -162,7 +166,7 @@ sorter: true, width: 130, align: 'left', - dictType: '', + dictType: 'send_status', }, { title: t('是否有附件'), @@ -171,7 +175,7 @@ sorter: true, width: 130, align: 'left', - dictType: '', + dictType: 'has_attachment', }, ]; @@ -184,7 +188,7 @@ title: t('编辑'), onClick: handleForm.bind(this, { id: record.id }), auth: 'biz:mailSent:edit', - }, + }, { icon: 'i-ant-design:delete-outlined', color: 'error', @@ -195,6 +199,15 @@ }, auth: 'biz:mailSent:edit', }, + { + icon: 'simple-line-icons:action-redo', + color: 'success', + title: t('发送'), + popConfirm: { + title: t('是否确认发送邮件信息?'), + confirm: handleSent.bind(this, record), + }, + }, ], }; @@ -245,6 +258,13 @@ showMessage(res.message); await handleSuccess(record); } + + async function handleSent(record: Recordable) { + const params = { id: record.id }; + const res = await bizMailSent(params); + showMessage(res.message); + await handleSuccess(record); + } async function handleSuccess(record: Recordable) { await reload({ record }); diff --git a/web-vue/packages/biz/views/biz/mailInfo/sent/select.ts b/web-vue/packages/biz/views/biz/mailInfo/sent/select.ts deleted file mode 100644 index 44e99b55..00000000 --- a/web-vue/packages/biz/views/biz/mailInfo/sent/select.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { useI18n } from '@jeesite/core/hooks/web/useI18n'; -import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table'; -import { bizMailSentListData } from '@jeesite/biz/api/biz/mailSent'; - -const { t } = useI18n('biz.mailSent'); - -const modalProps = { - title: t('发件选择'), -}; - -const searchForm: FormProps = { - baseColProps: { md: 8, lg: 6 }, - labelWidth: 90, - schemas: [ - { - label: t('记录时间起'), - field: 'createTime_gte', - component: 'DatePicker', - componentProps: { - format: 'YYYY-MM-DD HH:mm', - showTime: { format: 'HH:mm' }, - }, - }, - { - label: t('记录时间止'), - field: 'createTime_lte', - component: 'DatePicker', - componentProps: { - format: 'YYYY-MM-DD HH:mm', - showTime: { format: 'HH:mm' }, - }, - }, - { - label: t('邮件账户标识'), - field: 'accountId', - component: 'Input', - }, - { - label: t('发件人地址'), - field: 'fromAddress', - component: 'Input', - }, - { - label: t('邮件主题'), - field: 'subject', - component: 'Input', - }, - { - label: t('发送状态'), - field: 'sendStatus', - component: 'Select', - componentProps: { - dictType: '', - allowClear: true, - }, - }, - { - label: t('是否有附件'), - field: 'hasAttachment', - component: 'Select', - componentProps: { - dictType: '', - allowClear: true, - }, - }, - ], -}; - -const tableColumns: BasicColumn[] = [ - { - title: t('记录时间'), - dataIndex: 'createTime', - key: 'a.create_time', - sorter: true, - width: 230, - align: 'left', - slot: 'firstColumn', - }, - { - title: t('件服务器消息标识'), - dataIndex: 'messageId', - key: 'a.message_id', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('邮件账户标识'), - dataIndex: 'accountId', - key: 'a.account_id', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('发件人地址'), - dataIndex: 'fromAddress', - key: 'a.from_address', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('收件人地址'), - dataIndex: 'toAddresses', - key: 'a.to_addresses', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('抄送人地址'), - dataIndex: 'ccAddresses', - key: 'a.cc_addresses', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('邮件主题'), - dataIndex: 'subject', - key: 'a.subject', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('邮件内容'), - dataIndex: 'content', - key: 'a.content', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('发送时间'), - dataIndex: 'sendTime', - key: 'a.send_time', - sorter: true, - width: 130, - align: 'center', - }, - { - title: t('发送状态'), - dataIndex: 'sendStatus', - key: 'a.send_status', - sorter: true, - width: 130, - align: 'left', - dictType: '', - }, - { - title: t('错误信息'), - dataIndex: 'errorMsg', - key: 'a.error_msg', - sorter: true, - width: 130, - align: 'left', - }, - { - title: t('是否有附件'), - dataIndex: 'hasAttachment', - key: 'a.has_attachment', - sorter: true, - width: 130, - align: 'left', - dictType: '', - }, - { - title: t('更新时间'), - dataIndex: 'updateTime', - key: 'a.update_time', - sorter: true, - width: 130, - align: 'center', - }, -]; - -const tableProps: BasicTableProps = { - api: bizMailSentListData, - beforeFetch: (params) => { - params['isAll'] = true; - return params; - }, - columns: tableColumns, - formConfig: searchForm, - rowKey: 'id', -}; - -export default { - modalProps, - tableProps, - itemCode: 'id', - itemName: 'id', - isShowCode: false, -}; diff --git a/web-vue/packages/core/components/ListSelect/src/selectType/bizMailAccountSelect.ts b/web-vue/packages/core/components/ListSelect/src/selectType/bizMailAccountSelect.ts new file mode 100644 index 00000000..2a7a8438 --- /dev/null +++ b/web-vue/packages/core/components/ListSelect/src/selectType/bizMailAccountSelect.ts @@ -0,0 +1,181 @@ +import { useI18n } from '@jeesite/core/hooks/web/useI18n'; +import { BasicColumn, BasicTableProps, FormProps } from '@jeesite/core/components/Table'; +import { BizMailAccount, bizMailAccountListData } from '@jeesite/biz/api/biz/mailAccount'; + +const { t } = useI18n('biz.mailAccount'); + +const modalProps = { + title: t('邮件账号选择'), +}; + + const searchForm: FormProps = { + baseColProps: { md: 8, lg: 6 }, + labelWidth: 90, + schemas: [ + { + label: t('记录时间起'), + field: 'createTime_gte', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm', + showTime: { format: 'HH:mm' }, + }, + }, + { + label: t('记录时间止'), + field: 'createTime_lte', + component: 'DatePicker', + componentProps: { + format: 'YYYY-MM-DD HH:mm', + showTime: { format: 'HH:mm' }, + }, + }, + { + label: t('SMTP服务'), + field: 'host', + component: 'Input', + }, + { + label: t('用户名称'), + field: 'username', + component: 'Input', + }, + { + label: t('发件地址'), + field: 'fromAddress', + component: 'Input', + }, + { + label: t('启用SSL'), + field: 'sslEnable', + component: 'Select', + componentProps: { + dictType: 'is_open', + allowClear: true, + }, + }, + { + label: t('状态'), + field: 'ustatus', + component: 'Select', + componentProps: { + dictType: 'ustatus', + allowClear: true, + }, + }, + ], + }; + + const tableColumns: BasicColumn[] = [ + { + title: t('记录时间'), + dataIndex: 'createTime', + key: 'a.create_time', + sorter: true, + width: 180, + align: 'left', + fixed: 'left', + }, + { + title: t('配置名称'), + dataIndex: 'accountName', + key: 'a.account_name', + sorter: true, + width: 130, + align: 'left', + slot: 'slotBizKey', + }, + { + title: t('SMTP服务'), + dataIndex: 'host', + key: 'a.host', + sorter: true, + width: 130, + align: 'left', + }, + { + title: t('SMTP端口'), + dataIndex: 'smtpPort', + key: 'a.smtp_port', + sorter: true, + width: 130, + align: 'center', + }, + { + title: t('IMAP服务'), + dataIndex: 'imapHost', + key: 'a.imap_host', + sorter: true, + width: 130, + align: 'left', + }, + { + title: t('IMAP端口'), + dataIndex: 'imapPort', + key: 'a.imap_port', + sorter: true, + width: 130, + align: 'center', + }, + { + title: t('用户名称'), + dataIndex: 'username', + key: 'a.username', + sorter: true, + width: 130, + align: 'left', + }, + { + title: t('发件地址'), + dataIndex: 'fromAddress', + key: 'a.from_address', + sorter: true, + width: 130, + align: 'left', + }, + { + title: t('启用SSL'), + dataIndex: 'sslEnable', + key: 'a.ssl_enable', + sorter: true, + width: 130, + align: 'center', + dictType: 'is_open', + }, + { + title: t('状态'), + dataIndex: 'ustatus', + key: 'a.ustatus', + sorter: true, + width: 130, + align: 'center', + dictType: 'ustatus', + }, + { + title: t('备注'), + dataIndex: 'remark', + key: 'a.remark', + sorter: true, + width: 130, + align: 'left', + }, + ]; + +const tableProps: BasicTableProps = { + api: bizMailAccountListData, + beforeFetch: (params) => { + params['isAll'] = true; + return params; + }, + columns: tableColumns, + formConfig: searchForm, + rowKey: 'id', +}; + +export default { + modalProps, + tableProps, + itemCode: 'id', + itemName: 'accountName', + isShowCode: true, +};