完成基础邮件发送功能

This commit is contained in:
AlanScipio
2024-03-01 13:46:33 +08:00
parent f9f895c518
commit 1e35045f67
19 changed files with 815 additions and 70 deletions

View File

@@ -64,6 +64,16 @@
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- Java邮件实现者 -->
<dependency>
<groupId>org.eclipse.angus</groupId>
<artifactId>jakarta.mail</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.angus</groupId>
<artifactId>angus-activation</artifactId>
</dependency>
<!-- RuoYi Common DataSource -->
<dependency>
<groupId>com.ruoyi</groupId>

View File

@@ -0,0 +1,64 @@
package com.ruoyi.system.config;
import com.ruoyi.common.core.mail.MailSendAccount;
import com.ruoyi.common.core.mail.MailSender;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.security.utils.SysConfigUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 邮件配置
*
* @author Alan Scipio
* created on 2024/2/29
*/
@Slf4j
@Configuration
public class MailConfig {
@Value("${spring.mail.host:#{null}}")
private String host;
@Value("${spring.mail.port:#{null}}")
private Integer port;
@Value("${spring.mail.username:#{null}}")
private String username;
@Value("${spring.mail.password:#{null}}")
private String password;
@Bean
public MailSender mailSender() {
MailSendAccount account = new MailSendAccount();
// 加载配置文件中的邮件配置
account.setHost(host);
account.setPort(port);
account.setUsername(username);
account.setPassword(password);
// 加载数据库中的邮件配置会缓存到redis中并覆盖前面的配置
String hostCache = SysConfigUtils.getConfigCache("sys.mail.smtpHost");
String portCache = SysConfigUtils.getConfigCache("sys.mail.smtpPort");
String usernameCache = SysConfigUtils.getConfigCache("sys.mail.username");
String passwordCache = SysConfigUtils.getConfigCache("sys.mail.password");
if (StringUtils.isNotBlank(hostCache) && StringUtils.isNotBlank(portCache)) {
account.setHost(hostCache);
account.setPort(Integer.parseInt(portCache));
if (StringUtils.isNotBlank(usernameCache)) {
account.setUsername(usernameCache);
}
if (StringUtils.isNotBlank(passwordCache)) {
account.setPassword(passwordCache);
}
} else {
log.warn("Mail configuration from database table 'sys_config' is empty. Use the configuration from application.yaml instead.");
}
account.setSslFlag(account.getPassword() != null && !account.getPassword().isEmpty());
log.info("Mail configuration has been initialized. smtpHost: [{}], smtpPort: [{}], username: [{}]", account.getHost(), account.getPort(), account.getUsername());
return MailSender.build(account, true);
}
}

View File

@@ -1,6 +1,7 @@
package com.ruoyi.system.mapper;
import com.ruoyi.system.domain.SysConfig;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -34,6 +35,14 @@ public interface SysConfigMapper {
*/
List<SysConfig> selectConfigList(SysConfig config);
/**
* 查询参数配置列表
*
* @param configKeyList 参数键名集合
* @return 参数配置集合
*/
List<SysConfig> selectConfigListByKeys(@Param("configKeyList") List<String> configKeyList);
/**
* 根据键名查询参数配置信息
*

View File

@@ -34,6 +34,14 @@ public interface ISysConfigService {
*/
List<SysConfig> selectConfigList(SysConfig config);
/**
* 根据键名查询参数配置信息
*
* @param configKeyList 参数键名集合
* @return 参数配置集合
*/
List<SysConfig> selectConfigListByKeys(List<String> configKeyList);
/**
* 新增参数配置
*

View File

@@ -83,6 +83,11 @@ public class SysConfigServiceImpl implements ISysConfigService {
return configMapper.selectConfigList(config);
}
@Override
public List<SysConfig> selectConfigListByKeys(List<String> configKeyList) {
return configMapper.selectConfigListByKeys(configKeyList);
}
/**
* 新增参数配置
*

View File

@@ -1,110 +1,101 @@
package com.ruoyi.system.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.security.utils.DictUtils;
import com.ruoyi.system.api.domain.SysDictData;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.service.ISysDictDataService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 字典 业务层处理
*
*
* @author ruoyi
*/
@Service
public class SysDictDataServiceImpl implements ISysDictDataService
{
@Autowired
public class SysDictDataServiceImpl implements ISysDictDataService {
@Resource
private SysDictDataMapper dictDataMapper;
/**
* 根据条件分页查询字典数据
*
*
* @param dictData 字典数据信息
* @return 字典数据集合信息
*/
@Override
public List<SysDictData> selectDictDataList(SysDictData dictData)
{
public List<SysDictData> selectDictDataList(SysDictData dictData) {
return dictDataMapper.selectDictDataList(dictData);
}
/**
* 根据字典类型和字典键值查询字典数据信息
*
* @param dictType 字典类型
*
* @param dictType 字典类型
* @param dictValue 字典键值
* @return 字典标签
*/
@Override
public String selectDictLabel(String dictType, String dictValue)
{
public String selectDictLabel(String dictType, String dictValue) {
return dictDataMapper.selectDictLabel(dictType, dictValue);
}
/**
* 根据字典数据ID查询信息
*
*
* @param dictCode 字典数据ID
* @return 字典数据
*/
@Override
public SysDictData selectDictDataById(Long dictCode)
{
public SysDictData selectDictDataById(Long dictCode) {
return dictDataMapper.selectDictDataById(dictCode);
}
/**
* 批量删除字典数据信息
*
*
* @param dictCodes 需要删除的字典数据ID
*/
@Override
public void deleteDictDataByIds(Long[] dictCodes)
{
for (Long dictCode : dictCodes)
{
public void deleteDictDataByIds(Long[] dictCodes) {
for (Long dictCode : dictCodes) {
SysDictData data = selectDictDataById(dictCode);
dictDataMapper.deleteDictDataById(dictCode);
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictDatas);
List<SysDictData> dictData = dictDataMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictData);
}
}
/**
* 新增保存字典数据信息
*
*
* @param data 字典数据信息
* @return 结果
*/
@Override
public int insertDictData(SysDictData data)
{
public int insertDictData(SysDictData data) {
int row = dictDataMapper.insertDictData(data);
if (row > 0)
{
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictDatas);
if (row > 0) {
List<SysDictData> dictData = dictDataMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictData);
}
return row;
}
/**
* 修改保存字典数据信息
*
*
* @param data 字典数据信息
* @return 结果
*/
@Override
public int updateDictData(SysDictData data)
{
public int updateDictData(SysDictData data) {
int row = dictDataMapper.updateDictData(data);
if (row > 0)
{
List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictDatas);
if (row > 0) {
List<SysDictData> dictData = dictDataMapper.selectDictDataByType(data.getDictType());
DictUtils.setDictCache(data.getDictType(), dictData);
}
return row;
}

View File

@@ -78,6 +78,18 @@
where config_key = #{configKey} limit 1
</select>
<select id="selectConfigListByKeys" resultType="com.ruoyi.system.domain.SysConfig">
<include refid="selectConfigVo"/>
<where>
<if test="configKeyList != null and configKeyList.size > 0">
and config_key in
<foreach collection="configKeyList" item="configKey" open="(" separator="," close=")">
#{configKey}
</foreach>
</if>
</where>
</select>
<insert id="insertConfig" parameterType="com.ruoyi.system.domain.SysConfig">
insert into sys_config (
<if test="configName != null and configName != '' ">config_name,</if>

View File

@@ -74,7 +74,7 @@
</foreach>
</delete>
<update id="updateDictType" parameterType="com.ruoyi.system.api.domain.SysDictTypeSysDictType">
<update id="updateDictType" parameterType="com.ruoyi.system.api.domain.SysDictType">
update sys_dict_type
<set>
<if test="dictName != null and dictName != ''">dict_name = #{dictName},</if>
@@ -87,7 +87,7 @@
where dict_id = #{dictId}
</update>
<insert id="insertDictType" parameterType="com.ruoyi.system.api.domain.SysDictTypeSysDictType">
<insert id="insertDictType" parameterType="com.ruoyi.system.api.domain.SysDictType">
insert into sys_dict_type(
<if test="dictName != null and dictName != ''">dict_name,</if>
<if test="dictType != null and dictType != ''">dict_type,</if>