feat(system): 邮箱管理

feature/community-center
yang 2025-05-06 10:28:32 +08:00
parent b3340340bd
commit ed6a00a312
9 changed files with 325 additions and 3 deletions

View File

@ -0,0 +1,103 @@
package com.mcwl.web.controller.email;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mcwl.common.constant.HttpStatus;
import com.mcwl.common.core.domain.R;
import com.mcwl.system.domain.SysEmail;
import com.mcwl.system.domain.dto.AddEmailRes;
import com.mcwl.system.domain.dto.EditEmailRes;
import com.mcwl.system.domain.vo.EmailVo;
import com.mcwl.system.service.ISysEmailService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
/***
*
*/
@RestController
@RequestMapping("email")
@RequiredArgsConstructor
@Api(tags = "邮箱")
public class EmailController {
private final ISysEmailService sysEmailService;
/**
*
*/
@GetMapping("listEmail")
@ApiOperation(value = "查询邮箱列表")
public R<List<EmailVo>> listEmail() {
List<SysEmail> sysEmailList = sysEmailService.list(new LambdaQueryWrapper<SysEmail>().orderByDesc(SysEmail::getCreateTime));
return R.ok(BeanUtil.copyToList(sysEmailList, EmailVo.class));
}
@GetMapping("getEmail")
@ApiOperation(value = "查询邮箱")
public R<EmailVo> getEmail(@Valid @NotNull(message = "邮箱id不能为空") Long emailId) {
SysEmail sysEmail = sysEmailService.getById(emailId);
return R.ok(BeanUtil.toBean(sysEmail, EmailVo.class));
}
/**
*
*/
@PostMapping("createEmail")
@ApiOperation(value = "新建邮箱")
public R<Object> createEmail(@RequestBody AddEmailRes addEmailRes) {
sysEmailService.save(BeanUtil.toBean(addEmailRes, SysEmail.class));
return R.ok();
}
/**
*
*/
@GetMapping("deleteEmail")
@ApiOperation(value = "删除邮箱")
public R<Object> deleteEmail(@Valid @NotNull(message = "邮箱id不能为空") Long emailId) {
List<SysEmail> sysEmailList = sysEmailService.list();
if (sysEmailList.size() == 1) {
return R.fail(HttpStatus.SHOW_ERROR_MSG, "至少需要一个邮箱");
}
SysEmail sysEmail = sysEmailService.getById(emailId);
if (Objects.isNull(sysEmail)) {
return R.fail(HttpStatus.SHOW_ERROR_MSG, "邮箱不存在");
}
sysEmailService.removeById(emailId);
return R.ok();
}
@PostMapping("updateEmail")
@ApiOperation(value = "修改邮箱")
public R<Object> updateEmail(@RequestBody EditEmailRes editEmailRes) {
SysEmail sysEmail = sysEmailService.getById(editEmailRes.getId());
if (Objects.isNull(sysEmail)) {
return R.fail(HttpStatus.SHOW_ERROR_MSG, "邮箱不存在");
}
sysEmailService.updateById(BeanUtil.toBean(editEmailRes, SysEmail.class));
return R.ok();
}
}

View File

@ -42,8 +42,10 @@ import com.mcwl.pay.domain.OrderTradeDto;
import com.mcwl.pay.domain.vo.PayVo; import com.mcwl.pay.domain.vo.PayVo;
import com.mcwl.pay.service.AliPayService; import com.mcwl.pay.service.AliPayService;
import com.mcwl.pay.service.OrderTradeService; import com.mcwl.pay.service.OrderTradeService;
import com.mcwl.system.domain.SysEmail;
import com.mcwl.system.domain.SysUserPayAccount; import com.mcwl.system.domain.SysUserPayAccount;
import com.mcwl.system.domain.SysUserPayAccountLog; import com.mcwl.system.domain.SysUserPayAccountLog;
import com.mcwl.system.service.ISysEmailService;
import com.mcwl.system.service.ISysUserPayAccountLogService; import com.mcwl.system.service.ISysUserPayAccountLogService;
import com.mcwl.system.service.ISysUserPayAccountService; import com.mcwl.system.service.ISysUserPayAccountService;
import com.mcwl.system.service.ISysUserService; import com.mcwl.system.service.ISysUserService;
@ -99,6 +101,9 @@ public class AliPayServiceImpl implements AliPayService {
@Autowired @Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor; private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Autowired
private ISysEmailService sysEmailService;
private final int MAX_RETRY = 3; // 最大重试次数 private final int MAX_RETRY = 3; // 最大重试次数
@ -360,10 +365,16 @@ public class AliPayServiceImpl implements AliPayService {
} }
if (response.getSubCode().equals("BALANCE_IS_NOT_ENOUGH")) { if (response.getSubCode().equals("BALANCE_IS_NOT_ENOUGH")) {
// 账户余额不足,发送邮件通知
ArrayList<String> tos = CollUtil.newArrayList("2119157836@qq.com");
String content = String.format("账户余额不足:用户%s提现%s", sysUser.getNickName(), amount); ArrayList<String> tos = new ArrayList<>();
for (SysEmail sysEmail : sysEmailService.list()) {
tos.add(sysEmail.getRecipientEmail());
}
// 账户余额不足,发送邮件通知
// ArrayList<String> tos = CollUtil.newArrayList("2119157836@qq.com");
String content = String.format("账户余额不足:用户%s提现%s", sysUser.getNickName(), amount);
MailUtil.send(tos, "魔创未来", content, false); MailUtil.send(tos, "魔创未来", content, false);
throw new ServiceException("网络异常,请稍后再试", HttpStatus.SHOW_ERROR_MSG); throw new ServiceException("网络异常,请稍后再试", HttpStatus.SHOW_ERROR_MSG);
} }

View File

@ -0,0 +1,28 @@
package com.mcwl.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.mcwl.common.core.domain.BaseEntity;
import lombok.*;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("sys_email")
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SysEmail extends BaseEntity {
/**
* id
*/
@TableId
private Long id;
/**
*
*/
private String recipientEmail;
}

View File

@ -0,0 +1,34 @@
package com.mcwl.system.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(value = "新建邮箱请求对象")
public class AddEmailRes {
/**
*
*/
@ApiModelProperty(value = "收件人邮箱")
@Pattern(regexp = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", message = "邮箱格式不正确")
@NotBlank(message = "邮箱不能为空")
private String recipientEmail;
/**
*
*/
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@ -0,0 +1,39 @@
package com.mcwl.system.domain.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(value = "修改邮箱请求对象")
public class EditEmailRes {
@ApiModelProperty(value = "邮箱id")
@NotNull(message = "邮箱id不能为空")
private Long id;
/**
*
*/
@ApiModelProperty(value = "收件人邮箱")
@Pattern(regexp = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", message = "邮箱格式不正确")
@NotBlank(message = "邮箱不能为空")
private String recipientEmail;
/**
*
*/
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@ -0,0 +1,49 @@
package com.mcwl.system.domain.vo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ApiModel(value = "邮箱数据返回对象")
public class EmailVo {
/**
* id
*/
@ApiModelProperty(value = "邮件id")
private Long id;
/**
*
*/
@ApiModelProperty(value = "收件人邮箱")
private String recipientEmail;
/**
*
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
*
*/
@ApiModelProperty(value = "备注")
private String remark;
}

View File

@ -0,0 +1,14 @@
package com.mcwl.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mcwl.system.domain.SysEmail;
import com.mcwl.system.domain.SysUserPayAccountLog;
import org.apache.ibatis.annotations.Mapper;
/**
*
*/
@Mapper
public interface SysEmailMapper extends BaseMapper<SysEmail> {
}

View File

@ -0,0 +1,17 @@
package com.mcwl.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mcwl.common.core.page.TableDataInfo;
import com.mcwl.system.domain.SysEmail;
import com.mcwl.system.domain.SysUserPayAccountLog;
import com.mcwl.system.domain.dto.WithdrawalPageRes;
/**
*
*
* @author mcwl
*/
public interface ISysEmailService extends IService<SysEmail> {
}

View File

@ -0,0 +1,27 @@
package com.mcwl.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mcwl.common.constant.HttpStatus;
import com.mcwl.common.core.page.TableDataInfo;
import com.mcwl.common.utils.SecurityUtils;
import com.mcwl.system.domain.SysEmail;
import com.mcwl.system.domain.SysUserPayAccountLog;
import com.mcwl.system.domain.dto.WithdrawalPageRes;
import com.mcwl.system.mapper.SysEmailMapper;
import com.mcwl.system.mapper.SysUserPayAccountLogMapper;
import com.mcwl.system.service.ISysEmailService;
import com.mcwl.system.service.ISysUserPayAccountLogService;
import org.springframework.stereotype.Service;
import java.util.Objects;
/**
*
*/
@Service
public class SysEmailServiceImpl extends ServiceImpl<SysEmailMapper, SysEmail> implements ISysEmailService {
}