diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar old mode 100644 new mode 100755 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/doc/OrganizeInternalOA-ConfigTableConfig.md b/doc/OrganizeInternalOA-ConfigTableConfig.md old mode 100644 new mode 100755 diff --git a/doc/OrganizeInternalOA-SQL.md b/doc/OrganizeInternalOA-SQL.md old mode 100644 new mode 100755 diff --git a/mysql/organize_oa.sql b/mysql/organize_oa.sql old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml old mode 100644 new mode 100755 index 32fe857..7c6fe34 --- a/pom.xml +++ b/pom.xml @@ -98,11 +98,19 @@ spring-boot-starter-test test + + + redis.clients + jedis + 3.8.0 + + org.springframework.boot spring-boot-starter-data-redis + org.jetbrains annotations @@ -119,6 +127,11 @@ com.google.code.gson gson + + + org.springframework.boot + spring-boot-starter-thymeleaf + diff --git a/src/main/java/com/jsl/oa/JslOrganizeInternalOaApplication.java b/src/main/java/com/jsl/oa/JslOrganizeInternalOaApplication.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/aspect/UserControllerAspect.java b/src/main/java/com/jsl/oa/aspect/UserControllerAspect.java old mode 100644 new mode 100755 index 5b28865..c40cbae --- a/src/main/java/com/jsl/oa/aspect/UserControllerAspect.java +++ b/src/main/java/com/jsl/oa/aspect/UserControllerAspect.java @@ -5,6 +5,7 @@ import com.jsl.oa.utils.ResultUtil; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; +import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -59,7 +60,7 @@ public class UserControllerAspect { * @param request HttpServletRequest对象 * @return {@link Boolean} */ - public Boolean checkTimestamp(HttpServletRequest request) { + public Boolean checkTimestamp(@NotNull HttpServletRequest request) { // 获取请求头中的时间戳 String getTimestamp = request.getHeader("Timestamp"); // 判断是否为空 diff --git a/src/main/java/com/jsl/oa/common/constant/BusinessConstants.java b/src/main/java/com/jsl/oa/common/constant/BusinessConstants.java new file mode 100644 index 0000000..b824ad0 --- /dev/null +++ b/src/main/java/com/jsl/oa/common/constant/BusinessConstants.java @@ -0,0 +1,19 @@ +package com.jsl.oa.common.constant; + +import lombok.Getter; + +/** + * + */ +@Getter +public enum BusinessConstants { + BUSINESS_LOGIN("login:", "登陆实现"); + + private final String value; + private final String description; + + BusinessConstants(String value, String description) { + this.value = value; + this.description = description; + } +} diff --git a/src/main/java/com/jsl/oa/common/constant/RedisConstant.java b/src/main/java/com/jsl/oa/common/constant/RedisConstant.java new file mode 100755 index 0000000..86fbf18 --- /dev/null +++ b/src/main/java/com/jsl/oa/common/constant/RedisConstant.java @@ -0,0 +1,27 @@ +package com.jsl.oa.common.constant; + +import com.jsl.oa.utils.EmailRedisUtil; + +/** + * Redis常量类 + * + * 用于存放Redis常量 + * + * @version v1.1.0 + * @since v1.1.0 + * @see EmailRedisUtil + * @author 筱锋xiao_lfeng + */ +public class RedisConstant { + /* + * 类型分类 + */ + public static final String TYPE_USER = "user:"; // 用户相关 + public static final String TYPE_EMAIL = "mail:"; // 邮件相关 + + /* + * 表分类 + */ + public static final String TABLE_USER = "user:"; // 用户表 + public static final String TABLE_EMAIL = "code:"; // 邮箱验证码 +} diff --git a/src/main/java/com/jsl/oa/config/JwtFilter.java b/src/main/java/com/jsl/oa/config/JwtFilter.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/config/MailConfiguration.java b/src/main/java/com/jsl/oa/config/MailConfiguration.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/config/redis/RedisConfiguration.java b/src/main/java/com/jsl/oa/config/redis/RedisConfiguration.java new file mode 100755 index 0000000..be2569e --- /dev/null +++ b/src/main/java/com/jsl/oa/config/redis/RedisConfiguration.java @@ -0,0 +1,46 @@ +package com.jsl.oa.config.redis; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; +import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * Redis配置类 + * + * 用于配置Redis + * + * @author 筱锋xiao_lfeng + * @version v1.1.0 + * @since v1.1.0 + */ +@Configuration +public class RedisConfiguration { + @Bean + public JedisConnectionFactory jedisConnectionFactory() { + RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("localhost"); + return new JedisConnectionFactory(config); + } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(connectionFactory); + + // 配置Redis编码格式 + RedisSerializer stringSerializer = new StringRedisSerializer(); + RedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(); + + redisTemplate.setKeySerializer(stringSerializer); + redisTemplate.setValueSerializer(jsonSerializer); + redisTemplate.setHashKeySerializer(stringSerializer); + redisTemplate.setHashValueSerializer(jsonSerializer); + + return redisTemplate; + } +} diff --git a/src/main/java/com/jsl/oa/config/redis/RedisOperating.java b/src/main/java/com/jsl/oa/config/redis/RedisOperating.java new file mode 100644 index 0000000..d0bb78a --- /dev/null +++ b/src/main/java/com/jsl/oa/config/redis/RedisOperating.java @@ -0,0 +1,59 @@ +package com.jsl.oa.config.redis; + +import com.jsl.oa.common.constant.BusinessConstants; +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; + +import java.util.concurrent.TimeUnit; + +@RequiredArgsConstructor +public abstract class RedisOperating { + protected final RedisTemplate redisTemplate; + protected final StringRedisTemplate stringRedisTemplate; + + public abstract Long getExpiredAt(BusinessConstants businessConstants, String field); + public abstract Boolean delData(BusinessConstants businessConstants, String field); + public abstract R getData(BusinessConstants businessConstants, String field); + public abstract Boolean setData(BusinessConstants businessConstants, String field, R value, Integer time); + + /** + * 获取Redis中元素过期时间 + * + * 基础方法,用于添加String元素到Redis + * + * @param key 索引 + * @return 返回过期时间 + */ + public Long getExpiredAt(String key) { + return redisTemplate.getExpire(key); + } + + /** + * 基础添加String元素到Redis + * + * 基础方法,用于添加String元素到Redis + * 默认处理时间,单位时间秒 + * + * @param key 键 + * @param value 值 + */ + public void set(String key, String value, Integer time) { + stringRedisTemplate.opsForValue().set(key, value); + stringRedisTemplate.expire(key, time, TimeUnit.SECONDS); + } + + /** + * 基础添加元素到Redis + * + * 基础方法,用于添加元素元素到Redis + * 默认处理时间,单位时间秒 + * + * @param key 键 + * @param value 值 + */ + public void set(String key, R value, Integer time) { + redisTemplate.opsForValue().set(key, value); + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } +} \ No newline at end of file diff --git a/src/main/java/com/jsl/oa/config/shiro/MyRealm.java b/src/main/java/com/jsl/oa/config/shiro/MyRealm.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/config/shiro/ShiroConfiguration.java b/src/main/java/com/jsl/oa/config/shiro/ShiroConfiguration.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/controllers/AuthController.java b/src/main/java/com/jsl/oa/controllers/AuthController.java old mode 100644 new mode 100755 index cfbd6fd..3c2eb0d --- a/src/main/java/com/jsl/oa/controllers/AuthController.java +++ b/src/main/java/com/jsl/oa/controllers/AuthController.java @@ -84,11 +84,24 @@ public class AuthController { * @author 筱锋xiao_lfeng * @since v1.1.0 */ - @GetMapping("/auth/login/email") - public BaseResponse authLoginByEmail(@RequestParam String email) { + @GetMapping("/auth/login/email/code") + public BaseResponse authLoginSendEmailCode(@RequestParam String email) { if (email != null) { if (Pattern.matches("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", email)) { - return authService.authLoginByEmail(email); + return authService.authLoginSendEmailCode(email); + } else { + return ResultUtil.error(ErrorCode.PARAMETER_ERROR); + } + } else { + return ResultUtil.error(ErrorCode.PARAMETER_ERROR); + } + } + + @GetMapping("/auth/login/email") + public BaseResponse authLoginByEmail(@RequestParam String email, @RequestParam Integer code) { + if (email != null && code != null) { + if (Pattern.matches("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", email)) { + return authService.authLoginByEmail(email, code); } else { return ResultUtil.error(ErrorCode.PARAMETER_ERROR); } diff --git a/src/main/java/com/jsl/oa/controllers/CustomController.java b/src/main/java/com/jsl/oa/controllers/CustomController.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/controllers/InfoController.java b/src/main/java/com/jsl/oa/controllers/InfoController.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/controllers/PermissionController.java b/src/main/java/com/jsl/oa/controllers/PermissionController.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/controllers/ProjectController.java b/src/main/java/com/jsl/oa/controllers/ProjectController.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/controllers/RoleController.java b/src/main/java/com/jsl/oa/controllers/RoleController.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/dao/UserDAO.java b/src/main/java/com/jsl/oa/dao/UserDAO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/exception/BusinessException.java b/src/main/java/com/jsl/oa/exception/BusinessException.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/exception/ProcessException.java b/src/main/java/com/jsl/oa/exception/ProcessException.java old mode 100644 new mode 100755 index 950e305..cc2e854 --- a/src/main/java/com/jsl/oa/exception/ProcessException.java +++ b/src/main/java/com/jsl/oa/exception/ProcessException.java @@ -14,6 +14,12 @@ import java.util.regex.Pattern; @ControllerAdvice public class ProcessException { + @ExceptionHandler(value = Exception.class) + public ResponseEntity businessException(@NotNull Exception e) { + e.printStackTrace(); + return ResultUtil.error("Exception", 500, "服务器异常"); + } + @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class) public ResponseEntity businessMethodNotAllowedException() { return ResultUtil.error("MethodNotAllowed", 405, "请求方法错误"); diff --git a/src/main/java/com/jsl/oa/mapper/UserMapper.java b/src/main/java/com/jsl/oa/mapper/UserMapper.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/ConfigDO.java b/src/main/java/com/jsl/oa/model/doData/ConfigDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/PermissionDO.java b/src/main/java/com/jsl/oa/model/doData/PermissionDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/ProjectCuttingDO.java b/src/main/java/com/jsl/oa/model/doData/ProjectCuttingDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/ProjectDO.java b/src/main/java/com/jsl/oa/model/doData/ProjectDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/ProjectTypeDO.java b/src/main/java/com/jsl/oa/model/doData/ProjectTypeDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/ProjectUserDO.java b/src/main/java/com/jsl/oa/model/doData/ProjectUserDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/RoleDO.java b/src/main/java/com/jsl/oa/model/doData/RoleDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/RolePermissionDO.java b/src/main/java/com/jsl/oa/model/doData/RolePermissionDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/RoleUserDO.java b/src/main/java/com/jsl/oa/model/doData/RoleUserDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/doData/UserDO.java b/src/main/java/com/jsl/oa/model/doData/UserDO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/voData/UserDeleteVO.java b/src/main/java/com/jsl/oa/model/voData/UserDeleteVO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/voData/UserLockVO.java b/src/main/java/com/jsl/oa/model/voData/UserLockVO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/voData/UserLoginVO.java b/src/main/java/com/jsl/oa/model/voData/UserLoginVO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/voData/UserRegisterVO.java b/src/main/java/com/jsl/oa/model/voData/UserRegisterVO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/model/voData/UserReturnBackVO.java b/src/main/java/com/jsl/oa/model/voData/UserReturnBackVO.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/services/AuthService.java b/src/main/java/com/jsl/oa/services/AuthService.java old mode 100644 new mode 100755 index 6b4fb1c..152033a --- a/src/main/java/com/jsl/oa/services/AuthService.java +++ b/src/main/java/com/jsl/oa/services/AuthService.java @@ -36,13 +36,23 @@ public interface AuthService { BaseResponse authLogin(UserLoginVO userLoginVO); /** - * 用户登出 + * 邮箱登陆 * - * 用户登出服务类操作 + * 用户邮箱登陆服务类操作 * - * @param email 用户邮箱 + * @param email 邮箱 + * @param code 验证码 * @return {@link BaseResponse} - * @author 筱锋xiao_lfeng */ - BaseResponse authLoginByEmail(String email); + BaseResponse authLoginByEmail(String email, Integer code); + + /** + * 发送邮箱验证码 + * + * 用户邮箱登陆服务类操作 + * + * @param email 邮箱 + * @return {@link BaseResponse} + */ + BaseResponse authLoginSendEmailCode(String email); } diff --git a/src/main/java/com/jsl/oa/services/MailService.java b/src/main/java/com/jsl/oa/services/MailService.java old mode 100644 new mode 100755 index 36e8153..a1c3c20 --- a/src/main/java/com/jsl/oa/services/MailService.java +++ b/src/main/java/com/jsl/oa/services/MailService.java @@ -1,8 +1,47 @@ package com.jsl.oa.services; -import javax.mail.MessagingException; - +/** + * 邮件服务接口 + * + * 用于发送邮件 + * + * @author 筱锋xiao_lfeng + * @version v1.1.0 + * @since v1.1.0 + */ public interface MailService { - void sendMail() throws MessagingException; + /** + * 发送邮件通用模板 + * + * 更为广泛的内容发送,用于发送普通文本邮件 + * + * @param sendTo 收件人 + * @param subject 主题 + * @param text 内容 + * @return 是否发送成功 + */ + boolean sendMail(String sendTo, String subject, String text); + + /** + * 发送邮件通用模板 + * + * 发送邮件通用模板,用于发送具有模板HTML邮件 + * + * @param sendTo 收件人 + * @param model 模板 + * @return 是否发送成功 + */ + boolean sendMail(String sendTo, String model); + + /** + * 邮件登陆模块 + * + * 用于发送用户登陆邮件 + * + * @param email 邮箱 + * @param code 验证码 + * @return 是否发送成功 + */ + boolean sendMailAboutUserLogin(String email, Integer code); } diff --git a/src/main/java/com/jsl/oa/services/UserService.java b/src/main/java/com/jsl/oa/services/UserService.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/services/impl/AuthServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/AuthServiceImpl.java old mode 100644 new mode 100755 index 80bc3db..8243957 --- a/src/main/java/com/jsl/oa/services/impl/AuthServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/AuthServiceImpl.java @@ -1,34 +1,40 @@ package com.jsl.oa.services.impl; -import com.jsl.oa.model.doData.UserDO; -import com.jsl.oa.model.voData.UserLoginVO; -import com.jsl.oa.model.voData.UserReturnBackVO; -import com.jsl.oa.model.voData.UserRegisterVO; +import com.jsl.oa.common.constant.BusinessConstants; import com.jsl.oa.exception.BusinessException; import com.jsl.oa.mapper.UserMapper; +import com.jsl.oa.model.doData.UserDO; +import com.jsl.oa.model.voData.UserLoginVO; +import com.jsl.oa.model.voData.UserRegisterVO; +import com.jsl.oa.model.voData.UserReturnBackVO; import com.jsl.oa.services.AuthService; +import com.jsl.oa.services.MailService; import com.jsl.oa.utils.*; import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.NotNull; import org.mindrot.jbcrypt.BCrypt; import org.springframework.stereotype.Service; +import java.util.regex.Pattern; + /** * 用户认证服务实现类 * * 用户认证服务实现类,包含用户注册、用户登录、用户登出接口 * - * @since v1.0.0 * @version v1.1.0 * @see AuthService + * @since v1.0.0 */ @Service @RequiredArgsConstructor public class AuthServiceImpl implements AuthService { private final UserMapper userMapper; + private final MailService mailService; + private final EmailRedisUtil emailRedisUtil; @Override - public BaseResponse authRegister(UserRegisterVO userRegisterVO) { + public BaseResponse authRegister(@NotNull UserRegisterVO userRegisterVO) { // 检查用户说是否存在 UserDO getUserByUsername = userMapper.getUserInfoByUsername(userRegisterVO.getUsername()); // 用户名已存在 @@ -63,7 +69,20 @@ public class AuthServiceImpl implements AuthService { @Override public BaseResponse authLogin(@NotNull UserLoginVO userLoginVO) { // 检查用户是否存在 - UserDO userDO = userMapper.getUserInfoByUsername(userLoginVO.getUser()); + UserDO userDO; + if (Pattern.matches("^[0-9A-Za-z_]{3,40}$", userLoginVO.getUser())) { + // 是否为用户名 + userDO = userMapper.getUserInfoByUsername(userLoginVO.getUser()); + } else if (Pattern.matches("^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$", userLoginVO.getUser())) { + // 是否为手机号 + userDO = userMapper.getUserInfoByPhone(userLoginVO.getUser()); + } else if (Pattern.matches("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$", userLoginVO.getUser())) { + // 是否为邮箱 + return ResultUtil.error(ErrorCode.EMAIL_LOGIN_NOT_SUPPORT); + } else { + // 工号 + userDO = userMapper.getUserByJobId(userLoginVO.getUser()); + } if (userDO != null) { // 获取用户并登陆 if (BCrypt.checkpw(userLoginVO.getPassword(), userDO.getPassword())) { @@ -88,8 +107,55 @@ public class AuthServiceImpl implements AuthService { } @Override - public BaseResponse authLoginByEmail(String email) { - return null; + public BaseResponse authLoginByEmail(String email, Integer code) { + // 获取验证码是否有效 + Integer redisCode = emailRedisUtil.getData(BusinessConstants.BUSINESS_LOGIN, email); + if (redisCode != null) { + if (redisCode.equals(code)) { + // 删除验证码 + if (emailRedisUtil.delData(BusinessConstants.BUSINESS_LOGIN, email)) { + // 邮箱获取用户 + UserDO userDO = userMapper.getUserInfoByEmail(email); + // 授权 Token + String token = JwtUtil.generateToken(userDO.getUsername()); + UserReturnBackVO userReturnBackVO = new UserReturnBackVO(); + userReturnBackVO.setAddress(userDO.getAddress()) + .setAge(userDO.getAge()) + .setEmail(userDO.getEmail()) + .setJobId(userDO.getJobId()) + .setPhone(userDO.getPhone()) + .setSex(userDO.getSex()) + .setUsername(userDO.getUsername()) + .setToken(token); + return ResultUtil.success("登陆成功", userReturnBackVO); + } else { + return ResultUtil.error(ErrorCode.DATABASE_DELETE_ERROR); + } + } + } + return ResultUtil.error(ErrorCode.VERIFICATION_INVALID); } -} \ No newline at end of file + @Override + public BaseResponse authLoginSendEmailCode(String email) { + // 获取用户信息 + UserDO userDO = userMapper.getUserInfoByEmail(email); + if (userDO != null) { + // 生成验证码 + Integer code = Processing.createCode(); + // 存储验证码 + if (emailRedisUtil.setData(BusinessConstants.BUSINESS_LOGIN, email, code, 5)) { + // 发送邮件 + if (mailService.sendMailAboutUserLogin(email, code)) { + return ResultUtil.success("验证码已发送"); + } else { + return ResultUtil.error(ErrorCode.EMAIL_LOGIN_NOT_SUPPORT); + } + } else { + return ResultUtil.error(ErrorCode.DATABASE_INSERT_ERROR); + } + } else { + return ResultUtil.error(ErrorCode.USER_NOT_EXIST); + } + } +} diff --git a/src/main/java/com/jsl/oa/services/impl/MailServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/MailServiceImpl.java old mode 100644 new mode 100755 index 51b5515..5cd7904 --- a/src/main/java/com/jsl/oa/services/impl/MailServiceImpl.java +++ b/src/main/java/com/jsl/oa/services/impl/MailServiceImpl.java @@ -6,42 +6,80 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; +import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; +/** + * 邮件服务实现类 + * + * 用于发送邮件 + * + * @since v1.1.0 + * @version v1.1.0 + * @author 筱锋xiao_lfeng + * @see MailService + * @see JavaMailSender + * @see MimeMessageHelper + */ @Service @RequiredArgsConstructor public class MailServiceImpl implements MailService { private final JavaMailSender javaMailSender; + private final TemplateEngine templateEngine; @Value("${spring.mail.username}") private String from; - @Override - public void sendMail() { + public boolean sendMail(String sendTo, String subject, String text) { //发送多媒体邮件 try { MimeMessage message = javaMailSender.createMimeMessage(); - //第二个参数控制着附件上传 MimeMessageHelper helper = new MimeMessageHelper(message, true); - helper.setFrom(from); - String to = "lfengzeng@vip.qq.com"; - helper.setTo(to); - String subject = "springboot测试邮件"; + helper.setTo(sendTo); helper.setSubject(subject); - - //第二个参数表示以 html 语法解析文本 - String text = "你好:这是一封测试邮件。请坚持下去。加油!"; helper.setText(text, true); javaMailSender.send(message); - - } catch (Exception e) { + return true; + } catch (MessagingException e) { //TODO: 10001-发送邮件失败处理 + return false; } } + + @Override + public boolean sendMail(String sendTo, String model) { + return false; + } + + @Override + public boolean sendMailAboutUserLogin(String email, Integer code) { + // 发送邮件带HTML模块部分 + try { + MimeMessage message = javaMailSender.createMimeMessage(); + + MimeMessageHelper mimeMessage = new MimeMessageHelper(message, true); + mimeMessage.setFrom(from); + mimeMessage.setTo(email); + mimeMessage.setSubject("用户登陆邮件"); + Context context = new Context(); + context.setVariable("code", code); + context.setVariable("email", email); + String emailContent = templateEngine.process("/mail/user-login.html", context); + mimeMessage.setText(emailContent, true); + + javaMailSender.send(message); + return true; + } catch (MessagingException e) { + //TODO: 10001-发送邮件失败处理 + return false; + } + } } diff --git a/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java b/src/main/java/com/jsl/oa/services/impl/UserServiceImpl.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/utils/BaseResponse.java b/src/main/java/com/jsl/oa/utils/BaseResponse.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/utils/EmailRedisUtil.java b/src/main/java/com/jsl/oa/utils/EmailRedisUtil.java new file mode 100755 index 0000000..91d9e94 --- /dev/null +++ b/src/main/java/com/jsl/oa/utils/EmailRedisUtil.java @@ -0,0 +1,92 @@ +package com.jsl.oa.utils; + +import com.jsl.oa.common.constant.BusinessConstants; +import com.jsl.oa.common.constant.RedisConstant; +import com.jsl.oa.config.redis.RedisConfiguration; +import com.jsl.oa.config.redis.RedisOperating; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * Redis工具类 + * + * 用于操作Redis + * + * @author 筱锋xiao_lfeng + * @version v1.1.0 + * @see RedisConfiguration + * @see com.jsl.oa.common.constant.RedisConstant + * @since v1.1.0 + */ +@Component +public class EmailRedisUtil extends RedisOperating { + + public EmailRedisUtil(RedisTemplate redisTemplate, StringRedisTemplate stringRedisTemplate) { + super(redisTemplate, stringRedisTemplate); + } + + /** + * 获取邮箱验证码过期时间 + * + * 用于 AuthController 中的 authLoginByEmail 方法 + * 用于获取邮箱验证码过期时间 + * + * @param email 邮箱 + * @return 返回邮箱验证码过期时间戳 + */ + @Override + public Long getExpiredAt(@NotNull BusinessConstants businessConstants, String email) { + String key = RedisConstant.TYPE_EMAIL + RedisConstant.TABLE_EMAIL + businessConstants.getValue() + email; + return redisTemplate.getExpire(key); + } + + /** + * 删除邮箱验证码 + * + * 用于 AuthController 中的 authLoginByEmail 方法 + * 用于删除邮箱验证码 + * + * @param email 邮箱 + * @return 返回是否删除成功 + */ + public Boolean delData(@NotNull BusinessConstants businessConstants, String email) { + String key = RedisConstant.TYPE_EMAIL + RedisConstant.TABLE_EMAIL + businessConstants.getValue() + email; + return redisTemplate.delete(key); + } + + /** + * 获取邮箱验证码 + * + * 用于 AuthController 中的 authLoginByEmail 方法 + * 用于获取邮箱验证码 + * + * @param email 邮箱 + * @return 返回邮箱验证码 + */ + public R getData(@NotNull BusinessConstants businessConstants, String email) { + String key = RedisConstant.TYPE_EMAIL + RedisConstant.TABLE_EMAIL + businessConstants.getValue() + email; + return redisTemplate.opsForValue().get(key); + } + + /** + * 设置邮箱验证码 + * + * 用于 AuthController 中的 authLoginByEmail 方法 + * 用于设置邮箱验证码 + * + * @param email 邮箱 + * @param value 验证码 + * @return 返回是否添加成功 + */ + public Boolean setData(@NotNull BusinessConstants businessConstants, String email, R value, Integer time) { + // 处理数据 + String key = RedisConstant.TYPE_EMAIL + RedisConstant.TABLE_EMAIL + businessConstants.getValue() + email; + redisTemplate.opsForValue().set(key, value); + redisTemplate.expire(key, time, TimeUnit.MINUTES); + return true; + } +} diff --git a/src/main/java/com/jsl/oa/utils/ErrorCode.java b/src/main/java/com/jsl/oa/utils/ErrorCode.java old mode 100644 new mode 100755 index 1cb31de..eeea469 --- a/src/main/java/com/jsl/oa/utils/ErrorCode.java +++ b/src/main/java/com/jsl/oa/utils/ErrorCode.java @@ -12,6 +12,8 @@ public enum ErrorCode { USER_NOT_EXIST("UserNotExist", 40015, "用户不存在"), UNAUTHORIZED("Unauthorized", 40100, "未授权"), TOKEN_EXPIRED("TokenExpired", 40101, "Token已过期"), + VERIFICATION_INVALID("VerificationInvalid", 40102, "验证码无效"), + EMAIL_LOGIN_NOT_SUPPORT("EmailLoginNotSupport", 40300, "请使用邮箱登陆"), DATABASE_INSERT_ERROR("DatabaseInsertError", 50010, "数据库插入错误"), DATABASE_UPDATE_ERROR("DatabaseUpdateError", 50011, "数据库更新错误"), DATABASE_DELETE_ERROR("DatabaseDeleteError", 50012, "数据库删除错误"); diff --git a/src/main/java/com/jsl/oa/utils/JwtUtil.java b/src/main/java/com/jsl/oa/utils/JwtUtil.java old mode 100644 new mode 100755 diff --git a/src/main/java/com/jsl/oa/utils/Processing.java b/src/main/java/com/jsl/oa/utils/Processing.java old mode 100644 new mode 100755 index a90dc8b..c36487e --- a/src/main/java/com/jsl/oa/utils/Processing.java +++ b/src/main/java/com/jsl/oa/utils/Processing.java @@ -77,13 +77,13 @@ public class Processing { /** * */ - public static @NotNull String createCode() { + public static @NotNull Integer createCode() { StringBuilder stringBuilder = new StringBuilder(); // 生成验证码 Random random = new Random(); for (int i = 0; i < 6; i++) { stringBuilder.append(random.nextInt(10)); } - return stringBuilder.toString(); + return Integer.valueOf(stringBuilder.toString()); } } diff --git a/src/main/java/com/jsl/oa/utils/ResultUtil.java b/src/main/java/com/jsl/oa/utils/ResultUtil.java old mode 100644 new mode 100755 diff --git a/src/main/resources/.gitkeep b/src/main/resources/.gitkeep old mode 100644 new mode 100755 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/com/jsl/oa/mapper/UserMapper.xml b/src/main/resources/com/jsl/oa/mapper/UserMapper.xml old mode 100644 new mode 100755 diff --git a/src/main/resources/templates/mail/user-login.html b/src/main/resources/templates/mail/user-login.html new file mode 100755 index 0000000..aab3d8f --- /dev/null +++ b/src/main/resources/templates/mail/user-login.html @@ -0,0 +1,90 @@ + + + + 登录邮件模板 + + + + + + + 测试 + + + + 登录您的账户 + + 你好,[收件人], + + 使用以下验证码登录您的账户: + + 000000 + + 如果您未请求此验证码,请忽略此邮件。 + + 感谢您使用我们的服务。 + + + + + + + diff --git a/src/test/java/com/jsl/oa/JslOrganizeInternalOaApplicationTests.java b/src/test/java/com/jsl/oa/JslOrganizeInternalOaApplicationTests.java old mode 100644 new mode 100755
+ 你好,[收件人], + + 使用以下验证码登录您的账户: +
+ 如果您未请求此验证码,请忽略此邮件。 + + 感谢您使用我们的服务。 +