From 0c4612ff2f01a0c08e4f96138c5125131aaf05dc Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Tue, 21 May 2024 21:15:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E4=BF=AE=E6=94=B9):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=B8=AD=E5=8C=85=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/service-utils/pom.xml | 11 +- .../common/service/config/Knife4jConfig.java | 2 +- model/pom.xml | 8 ++ module/module-task/pom.xml | 23 ++++ .../cn/bunny/module}/task/TemplateTask.java | 2 +- module/pom.xml | 1 + service/pom.xml | 6 - .../cn/bunny/service/ServiceApplication.java | 2 + .../service/controller/BaseController.java | 59 --------- .../service/controller/IndexController.java | 47 ++----- .../service/controller/LoginController.java | 36 ++++++ .../service/controller/MailController.java | 55 -------- .../service/controller/SysMenuController.java | 18 --- .../service/mapper/AdminPowerMapper.java | 34 +++++ .../bunny/service/mapper/AdminRoleMapper.java | 26 ++++ .../service/mapper/EmailUsersMapper.java | 24 ++++ .../bunny/service/mapper/SysMenuMapper.java | 16 --- .../bunny/service/mapper/SysRoleMapper.java | 7 - .../bunny/service/mapper/SysUserMapper.java | 19 --- .../cn/bunny/service/mapper/UserMapper.java | 25 ++++ .../security/CustomUserDetailsService.java | 51 +++++--- .../bunny/service/service/EmailService.java | 37 ------ .../bunny/service/service/SysMenuService.java | 16 --- .../bunny/service/service/SysRoleService.java | 8 -- .../bunny/service/service/SysUserService.java | 43 ------ .../cn/bunny/service/service/UserService.java | 31 +++++ .../service/impl/EmailServiceImpl.java | 98 -------------- .../service/impl/SysMenuServiceImpl.java | 20 --- .../service/impl/SysRoleServiceImpl.java | 11 -- .../service/impl/SysUserServiceImpl.java | 91 ------------- .../service/service/impl/UserServiceImpl.java | 122 ++++++++++++++++++ service/src/main/resources/application.yml | 3 + .../resources/mapper/AdminPowerMapper.xml | 41 ++++++ .../main/resources/mapper/AdminRoleMapper.xml | 29 +++++ .../resources/mapper/EmailUsersMapper.xml | 30 +++++ .../main/resources/mapper/SysMenuMapper.xml | 26 ---- .../main/resources/mapper/SysRoleMapper.xml | 5 - .../main/resources/mapper/SysUserMapper.xml | 5 - .../src/main/resources/mapper/UserMapper.xml | 39 ++++++ 39 files changed, 524 insertions(+), 603 deletions(-) create mode 100644 module/module-task/pom.xml rename {service/src/main/java/cn/bunny/service => module/module-task/src/main/java/cn/bunny/module}/task/TemplateTask.java (91%) delete mode 100644 service/src/main/java/cn/bunny/service/controller/BaseController.java create mode 100644 service/src/main/java/cn/bunny/service/controller/LoginController.java delete mode 100644 service/src/main/java/cn/bunny/service/controller/MailController.java delete mode 100644 service/src/main/java/cn/bunny/service/controller/SysMenuController.java create mode 100644 service/src/main/java/cn/bunny/service/mapper/AdminPowerMapper.java create mode 100644 service/src/main/java/cn/bunny/service/mapper/AdminRoleMapper.java create mode 100644 service/src/main/java/cn/bunny/service/mapper/EmailUsersMapper.java delete mode 100644 service/src/main/java/cn/bunny/service/mapper/SysMenuMapper.java delete mode 100644 service/src/main/java/cn/bunny/service/mapper/SysRoleMapper.java delete mode 100644 service/src/main/java/cn/bunny/service/mapper/SysUserMapper.java create mode 100644 service/src/main/java/cn/bunny/service/mapper/UserMapper.java delete mode 100644 service/src/main/java/cn/bunny/service/service/EmailService.java delete mode 100644 service/src/main/java/cn/bunny/service/service/SysMenuService.java delete mode 100644 service/src/main/java/cn/bunny/service/service/SysRoleService.java delete mode 100644 service/src/main/java/cn/bunny/service/service/SysUserService.java create mode 100644 service/src/main/java/cn/bunny/service/service/UserService.java delete mode 100644 service/src/main/java/cn/bunny/service/service/impl/EmailServiceImpl.java delete mode 100644 service/src/main/java/cn/bunny/service/service/impl/SysMenuServiceImpl.java delete mode 100644 service/src/main/java/cn/bunny/service/service/impl/SysRoleServiceImpl.java delete mode 100644 service/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java create mode 100644 service/src/main/java/cn/bunny/service/service/impl/UserServiceImpl.java create mode 100644 service/src/main/resources/mapper/AdminPowerMapper.xml create mode 100644 service/src/main/resources/mapper/AdminRoleMapper.xml create mode 100644 service/src/main/resources/mapper/EmailUsersMapper.xml delete mode 100644 service/src/main/resources/mapper/SysMenuMapper.xml delete mode 100644 service/src/main/resources/mapper/SysRoleMapper.xml delete mode 100644 service/src/main/resources/mapper/SysUserMapper.xml create mode 100644 service/src/main/resources/mapper/UserMapper.xml diff --git a/common/service-utils/pom.xml b/common/service-utils/pom.xml index 86666e4..3a326b2 100644 --- a/common/service-utils/pom.xml +++ b/common/service-utils/pom.xml @@ -17,16 +17,17 @@ - - org.apache.httpcomponents - httpclient - 4.5.14 - cn.bunny model 0.0.1-SNAPSHOT + + + org.apache.httpcomponents + httpclient + 4.5.14 + com.github.xiaoymin diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java b/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java index eee1b94..5abefce 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/config/Knife4jConfig.java @@ -26,7 +26,7 @@ public class Knife4jConfig { return new OpenAPI().info(info).externalDocs(new ExternalDocumentation()); } - // 管理员相关分类接口 + // 前台相关分类接口 @Bean public GroupedOpenApi groupedOpenApi() { return GroupedOpenApi.builder().group("前台接口管理").pathsToMatch("/api/**").build(); diff --git a/model/pom.xml b/model/pom.xml index 300ad17..33eccf6 100644 --- a/model/pom.xml +++ b/model/pom.xml @@ -18,10 +18,18 @@ + org.projectlombok lombok + + + + cn.hutool + hutool-all + + com.alibaba.fastjson2 fastjson2 diff --git a/module/module-task/pom.xml b/module/module-task/pom.xml new file mode 100644 index 0000000..3ab04f3 --- /dev/null +++ b/module/module-task/pom.xml @@ -0,0 +1,23 @@ + + 4.0.0 + + cn.bunny + module + 0.0.1-SNAPSHOT + + + module-task + jar + + module-task + https://maven.apache.org + + + UTF-8 + + + + + + diff --git a/service/src/main/java/cn/bunny/service/task/TemplateTask.java b/module/module-task/src/main/java/cn/bunny/module/task/TemplateTask.java similarity index 91% rename from service/src/main/java/cn/bunny/service/task/TemplateTask.java rename to module/module-task/src/main/java/cn/bunny/module/task/TemplateTask.java index d28941b..2dbf0b7 100644 --- a/service/src/main/java/cn/bunny/service/task/TemplateTask.java +++ b/module/module-task/src/main/java/cn/bunny/module/task/TemplateTask.java @@ -1,4 +1,4 @@ -package cn.bunny.service.task; +package cn.bunny.module.task; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; diff --git a/module/pom.xml b/module/pom.xml index ed2c5db..3a479ab 100644 --- a/module/pom.xml +++ b/module/pom.xml @@ -17,6 +17,7 @@ module-mail module-rabbitMQ module-websocket + module-task diff --git a/service/pom.xml b/service/pom.xml index 980dab7..f738218 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -35,12 +35,6 @@ module-minio 0.0.1-SNAPSHOT - - - cn.bunny - service-utils - 0.0.1-SNAPSHOT - junit diff --git a/service/src/main/java/cn/bunny/service/ServiceApplication.java b/service/src/main/java/cn/bunny/service/ServiceApplication.java index 9ad3a84..559b8c6 100644 --- a/service/src/main/java/cn/bunny/service/ServiceApplication.java +++ b/service/src/main/java/cn/bunny/service/ServiceApplication.java @@ -7,11 +7,13 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.ComponentScan; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; @ComponentScan(basePackages = {"cn.bunny"}) @MapperScan("cn.bunny.service.mapper") @EnableScheduling// 定时任务 @EnableCaching// 开启缓存注解 +@EnableTransactionManagement// 开启事务注解 @SpringBootApplication @Slf4j public class ServiceApplication { diff --git a/service/src/main/java/cn/bunny/service/controller/BaseController.java b/service/src/main/java/cn/bunny/service/controller/BaseController.java deleted file mode 100644 index 7847d78..0000000 --- a/service/src/main/java/cn/bunny/service/controller/BaseController.java +++ /dev/null @@ -1,59 +0,0 @@ -package cn.bunny.service.controller; - -import cn.bunny.result.Result; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.session.SessionInformation; -import org.springframework.security.core.session.SessionRegistry; -import org.springframework.security.core.userdetails.User; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@Tag(name = "后台登录管理") -@RestController -@RequestMapping("/") -public class BaseController { - @Autowired - private SessionRegistry sessionRegistry; - - @GetMapping() - public String index() { - return "欢迎访问"; - } - - @Operation(summary = "Security上下文对象", description = "Security上下文对象") - @GetMapping("/test/getSecurityHolder") - public Result getSecurityHolder() { - SecurityContext context = SecurityContextHolder.getContext(); - return Result.success(context); - } - - @Operation(summary = "当前所有登录的用户", description = "当前所有登录的用户") - @GetMapping("/test/getAllUserLogin") - public Result getAllUserLogin() { - return Result.success(sessionRegistry.getAllPrincipals()); - } - - @Operation(summary = "剔除下线", description = "剔除下线") - @GetMapping("/test/killOut") - public Result killOut(String userId) { - List allPrincipals = sessionRegistry.getAllPrincipals(); - for (Object allPrincipal : allPrincipals) { - // 获取当前所有已经登录session会话:未失效的session - List allSessions = sessionRegistry.getAllSessions(allPrincipal, false); - User user = (User) allPrincipals; - - // 如果用户名匹配将这个用户下线 - if (user.getUsername().equals(userId)) { - allSessions.forEach(SessionInformation::expireNow); - } - } - return Result.success(); - } -} diff --git a/service/src/main/java/cn/bunny/service/controller/IndexController.java b/service/src/main/java/cn/bunny/service/controller/IndexController.java index fab2fda..ac07651 100644 --- a/service/src/main/java/cn/bunny/service/controller/IndexController.java +++ b/service/src/main/java/cn/bunny/service/controller/IndexController.java @@ -1,45 +1,18 @@ package cn.bunny.service.controller; -import cn.bunny.result.Result; -import cn.bunny.service.service.SysUserService; -import cn.bunny.vo.system.login.LoginVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; -import java.util.Map; - -/** - *

- * 后台登录登出 - *

- */ -@Tag(name = "后台登录管理") +@Tag(name = "访问首页内容") @RestController -@RequestMapping("/admin/system/index") +@RequestMapping("/") public class IndexController { - @Autowired - private SysUserService sysUserService; - - @Operation(summary = "登录", description = "登录") - @PostMapping("login") - public Result login(@RequestBody LoginVo loginVo) { - Login login = sysUserService.login(loginVo); - return Result.success(login); + @Operation(summary = "访问首页", description = "访问首页") + @GetMapping("") + public String index() { + return "欢迎访问 Bunny Java Template"; } - - @Operation(summary = "获取用户信息", description = "获取用户信息") - @GetMapping("info") - public Result info(HttpServletRequest request) { - SysUserinfo userinfo = sysUserService.getUserinfo(request); - return Result.success(userinfo); - } - - @Operation(summary = "退出", description = "退出") - @GetMapping("logout") - public Result> logout() { - return Result.success(); - } -} \ No newline at end of file +} diff --git a/service/src/main/java/cn/bunny/service/controller/LoginController.java b/service/src/main/java/cn/bunny/service/controller/LoginController.java new file mode 100644 index 0000000..eeb495f --- /dev/null +++ b/service/src/main/java/cn/bunny/service/controller/LoginController.java @@ -0,0 +1,36 @@ +package cn.bunny.service.controller; + + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.result.Result; +import cn.bunny.service.service.UserService; +import cn.bunny.vo.system.login.LoginVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "登录相关接口") +@RestController +@RequestMapping("/admin") +public class LoginController { + @Autowired + private UserService userService; + + @Operation(summary = "登录接口", description = "后台用户登录接口") + @PostMapping("login") + public Result login(@RequestBody LoginDto loginDto) { + LoginVo vo = userService.login(loginDto); + return Result.success(vo); + } + + @Operation(summary = "发送邮箱验证码", description = "发送邮箱验证码") + @PostMapping("noAuth/sendEmail") + public Result sendEmail(String email) { + userService.sendEmail(email); + return Result.success(); + } +} diff --git a/service/src/main/java/cn/bunny/service/controller/MailController.java b/service/src/main/java/cn/bunny/service/controller/MailController.java deleted file mode 100644 index 997d037..0000000 --- a/service/src/main/java/cn/bunny/service/controller/MailController.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.bunny.service.controller; - -import cn.bunny.common.result.Result; -import cn.bunny.entity.email.EmailSend; -import cn.bunny.service.service.EmailService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@Tag(name = "发送邮件") -@RequestMapping("/test/mail") -@Slf4j -public class MailController { - @Autowired - private EmailService emailService; - - @Operation(summary = "发送简单邮件", description = "发送简单邮件") - @PostMapping("/send-text") - public Result sendText(@RequestBody EmailSend emailSend) { - log.info("发送简单邮件"); - emailService.sendSimpleEmail(emailSend); - return Result.success(); - } - - @Operation(summary = "发送带附件邮件", description = "发送带附件邮件") - @PostMapping("send-attachment") - public Result sendAttachment(@RequestBody EmailSend emailSend) { - log.info("发送带附件邮件"); - boolean isSuccess = emailService.sendAttachmentEmail(emailSend); - return isSuccess ? Result.success() : Result.error(); - } - - @Operation(summary = "发送富文本邮件", description = "发送富文本邮件") - @PostMapping("send-rich") - public Result sendRich(@RequestBody EmailSend emailSend) { - log.info("发送富文本邮件"); - - boolean isSuccess = emailService.sendRich(emailSend); - return isSuccess ? Result.success() : Result.error(); - } - - @Operation(summary = "发送带抄送的邮件", description = "发送带抄送的邮件") - @PostMapping("send-cc") - public Result sendCC(@RequestBody EmailSend emailSend) { - log.info("发送带抄送的邮件"); - boolean isSuccess = emailService.sendCC(emailSend); - return isSuccess ? Result.success() : Result.error(); - } -} diff --git a/service/src/main/java/cn/bunny/service/controller/SysMenuController.java b/service/src/main/java/cn/bunny/service/controller/SysMenuController.java deleted file mode 100644 index a596845..0000000 --- a/service/src/main/java/cn/bunny/service/controller/SysMenuController.java +++ /dev/null @@ -1,18 +0,0 @@ -package cn.bunny.service.controller; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 菜单表 前端控制器 - *

- * - * @author Bunny - * @since 2024-05-06 - */ -@RestController -@RequestMapping("/sysMenu") -public class SysMenuController { - -} diff --git a/service/src/main/java/cn/bunny/service/mapper/AdminPowerMapper.java b/service/src/main/java/cn/bunny/service/mapper/AdminPowerMapper.java new file mode 100644 index 0000000..0fc1686 --- /dev/null +++ b/service/src/main/java/cn/bunny/service/mapper/AdminPowerMapper.java @@ -0,0 +1,34 @@ +package cn.bunny.service.mapper; + +import cn.bunny.entity.system.admin.AdminPower; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Mapper +public interface AdminPowerMapper extends BaseMapper { + /** + * 查询用户权限信息 + * + * @param roleIdList 角色id 列表 + * @return 用户对应的权限 + */ + AdminPower[] selectByPowerWithRoleIdList(List roleIdList); + + /** + * 查询用户权限 + * + * @param userId 用户id + * @return 用户权限列表 + */ + List queryByUserIdWithPower(Long userId); +} diff --git a/service/src/main/java/cn/bunny/service/mapper/AdminRoleMapper.java b/service/src/main/java/cn/bunny/service/mapper/AdminRoleMapper.java new file mode 100644 index 0000000..6616caf --- /dev/null +++ b/service/src/main/java/cn/bunny/service/mapper/AdminRoleMapper.java @@ -0,0 +1,26 @@ +package cn.bunny.service.mapper; + +import cn.bunny.entity.system.admin.AdminRole; +import cn.bunny.entity.system.admin.auth.AuthUserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Mapper +public interface AdminRoleMapper extends BaseMapper { + + /** + * 查询用户所有的角色信息 + * + * @param userId 用户id + * @return 用户对应的角色 + */ + AuthUserRole[] selectByRoleWithUserId(Long userId); +} diff --git a/service/src/main/java/cn/bunny/service/mapper/EmailUsersMapper.java b/service/src/main/java/cn/bunny/service/mapper/EmailUsersMapper.java new file mode 100644 index 0000000..ab8b865 --- /dev/null +++ b/service/src/main/java/cn/bunny/service/mapper/EmailUsersMapper.java @@ -0,0 +1,24 @@ +package cn.bunny.service.mapper; + +import cn.bunny.entity.system.email.EmailUsers; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-14 + */ +@Mapper +public interface EmailUsersMapper extends BaseMapper { + + /** + * 彻底删除邮箱用户 + * + * @param id 用户ID + */ + void thoroughDeleteById(Long id); +} diff --git a/service/src/main/java/cn/bunny/service/mapper/SysMenuMapper.java b/service/src/main/java/cn/bunny/service/mapper/SysMenuMapper.java deleted file mode 100644 index 505d0f9..0000000 --- a/service/src/main/java/cn/bunny/service/mapper/SysMenuMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.SysMenu; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 菜单表 Mapper 接口 - *

- * - * @author Bunny - * @since 2024-05-06 - */ -public interface SysMenuMapper extends BaseMapper { - -} diff --git a/service/src/main/java/cn/bunny/service/mapper/SysRoleMapper.java b/service/src/main/java/cn/bunny/service/mapper/SysRoleMapper.java deleted file mode 100644 index c80954c..0000000 --- a/service/src/main/java/cn/bunny/service/mapper/SysRoleMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package cn.bunny.service.mapper; - -import cn.bunny.entity.system.SysRole; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -public interface SysRoleMapper extends BaseMapper { -} diff --git a/service/src/main/java/cn/bunny/service/mapper/SysUserMapper.java b/service/src/main/java/cn/bunny/service/mapper/SysUserMapper.java deleted file mode 100644 index 345d10f..0000000 --- a/service/src/main/java/cn/bunny/service/mapper/SysUserMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package cn.bunny.service.mapper; - - -import cn.bunny.entity.system.SysUser; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; - -/** - *

- * 用户表 Mapper 接口 - *

- * - * @author bunny - * @since 2024-04-22 - */ -@Mapper -public interface SysUserMapper extends BaseMapper { - -} diff --git a/service/src/main/java/cn/bunny/service/mapper/UserMapper.java b/service/src/main/java/cn/bunny/service/mapper/UserMapper.java new file mode 100644 index 0000000..83ac911 --- /dev/null +++ b/service/src/main/java/cn/bunny/service/mapper/UserMapper.java @@ -0,0 +1,25 @@ +package cn.bunny.service.mapper; + +import cn.bunny.entity.system.user.User; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 用户信息 Mapper 接口 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Mapper +public interface UserMapper extends BaseMapper { + /** + * 前台用户登录接口 + * + * @param username 邮箱/昵称 + * @param password 吗,Image + * @return 登录参数 + */ + User login(String username, String password); +} diff --git a/service/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java b/service/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java index b4d248b..b3d7237 100644 --- a/service/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java +++ b/service/src/main/java/cn/bunny/service/security/CustomUserDetailsService.java @@ -1,12 +1,13 @@ package cn.bunny.service.security; -import cn.bunny.common.constant.CommonMessageConstant; -import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.entity.system.SysRole; -import cn.bunny.entity.system.SysUser; +import cn.bunny.dto.user.LoginDto; +import cn.bunny.entity.system.admin.AdminRole; +import cn.bunny.entity.system.user.User; import cn.bunny.security.custom.CustomUser; -import cn.bunny.service.mapper.SysRoleMapper; -import cn.bunny.service.mapper.SysUserMapper; +import cn.bunny.service.mapper.AdminRoleMapper; +import cn.bunny.service.mapper.UserMapper; +import cn.bunny.service.service.UserService; +import cn.bunny.vo.system.login.LoginVo; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; @@ -19,23 +20,35 @@ import java.util.List; @Configuration public class CustomUserDetailsService implements cn.bunny.security.service.CustomUserDetailsService { @Autowired - private SysUserMapper sysUserMapper; + private UserMapper userMapper; @Autowired - private SysRoleMapper sysRoleMapper; + private UserService userService; + @Autowired + private AdminRoleMapper adminRoleMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - SysUser sysUser = sysUserMapper.selectOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - List sysRoleList = sysRoleMapper.selectList(null); - if (sysUser == null) { - throw new UsernameNotFoundException(CommonMessageConstant.USER_DOES_NOT_EXIST); + // 根据邮箱查询用户名 + User user = userMapper.selectOne(Wrappers.lambdaQuery().eq(User::getEmail, username)); + List sysRoleList = adminRoleMapper.selectList(null); + // 都为空抛出异常,用户不存在 + if (user == null) { + throw new UsernameNotFoundException(""); } - if (sysUser.getStatus() == 0) { - throw new BunnyException(CommonMessageConstant.ACCOUNT_LOCKED); - } - - List roleAuthoritieList = sysRoleList.stream().map(SysRole::getRoleCode).toList(); - return new CustomUser(sysUser, AuthorityUtils.createAuthorityList(roleAuthoritieList)); + // 查询所有的角色 + List roleAuthoritieList = sysRoleList.stream().map(AdminRole::getRoleCode).toList(); + return new CustomUser(user, AuthorityUtils.createAuthorityList(roleAuthoritieList)); } -} + + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + @Override + public LoginVo login(LoginDto loginDto) { + return userService.login(loginDto); + } +} \ No newline at end of file diff --git a/service/src/main/java/cn/bunny/service/service/EmailService.java b/service/src/main/java/cn/bunny/service/service/EmailService.java deleted file mode 100644 index afdcd89..0000000 --- a/service/src/main/java/cn/bunny/service/service/EmailService.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.bunny.service.service; - - -import cn.bunny.entity.email.EmailSend; - -public interface EmailService { - /** - * 发送邮件-简单 - * - * @param emailSend 邮件消息 - */ - void sendSimpleEmail(EmailSend emailSend); - - /** - * 发送带附件邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - boolean sendAttachmentEmail(EmailSend emailSend); - - /** - * 发送富文本邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - boolean sendRich(EmailSend emailSend); - - /** - * 发送带抄送的邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - boolean sendCC(EmailSend emailSend); -} diff --git a/service/src/main/java/cn/bunny/service/service/SysMenuService.java b/service/src/main/java/cn/bunny/service/service/SysMenuService.java deleted file mode 100644 index 8e484f8..0000000 --- a/service/src/main/java/cn/bunny/service/service/SysMenuService.java +++ /dev/null @@ -1,16 +0,0 @@ -package cn.bunny.service.service; - -import cn.bunny.entity.system.SysMenu; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 菜单表 服务类 - *

- * - * @author Bunny - * @since 2024-05-06 - */ -public interface SysMenuService extends IService { - -} diff --git a/service/src/main/java/cn/bunny/service/service/SysRoleService.java b/service/src/main/java/cn/bunny/service/service/SysRoleService.java deleted file mode 100644 index 8e5a33c..0000000 --- a/service/src/main/java/cn/bunny/service/service/SysRoleService.java +++ /dev/null @@ -1,8 +0,0 @@ -package cn.bunny.service.service; - -import cn.bunny.entity.system.SysRole; -import com.baomidou.mybatisplus.extension.service.IService; - -public interface SysRoleService extends IService { - -} diff --git a/service/src/main/java/cn/bunny/service/service/SysUserService.java b/service/src/main/java/cn/bunny/service/service/SysUserService.java deleted file mode 100644 index c486a78..0000000 --- a/service/src/main/java/cn/bunny/service/service/SysUserService.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.bunny.service.service; - - -import cn.bunny.entity.system.Login; -import cn.bunny.entity.system.SysUser; -import cn.bunny.entity.system.SysUserinfo; -import cn.bunny.vo.system.LoginVo; -import com.baomidou.mybatisplus.extension.service.IService; -import jakarta.servlet.http.HttpServletRequest; - -/** - *

- * 用户表 服务类 - *

- * - * @author bunny - * @since 2024-04-22 - */ -public interface SysUserService extends IService { - /** - * 登录 - * - * @param vo 登录条件 - * @return 返回token - */ - Login login(LoginVo vo); - - /** - * 获取用户信息 - * - * @param request 请求头 - * @return 用户信息 - */ - SysUserinfo getUserinfo(HttpServletRequest request); - - /** - * 根据用户名查询用户信息 - * - * @param username 用户名 - * @return 用户信息 - */ - SysUser getByUsername(String username); -} diff --git a/service/src/main/java/cn/bunny/service/service/UserService.java b/service/src/main/java/cn/bunny/service/service/UserService.java new file mode 100644 index 0000000..aad4b8e --- /dev/null +++ b/service/src/main/java/cn/bunny/service/service/UserService.java @@ -0,0 +1,31 @@ +package cn.bunny.service.service; + +import cn.bunny.dto.user.LoginDto; +import cn.bunny.entity.system.user.User; +import cn.bunny.vo.system.login.LoginVo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 用户信息 服务类 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +public interface UserService extends IService { + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + LoginVo login(LoginDto loginDto); + + /** + * 发送邮箱验证码 + * + * @param email 邮箱 + */ + void sendEmail(String email); +} diff --git a/service/src/main/java/cn/bunny/service/service/impl/EmailServiceImpl.java b/service/src/main/java/cn/bunny/service/service/impl/EmailServiceImpl.java deleted file mode 100644 index 1c90bec..0000000 --- a/service/src/main/java/cn/bunny/service/service/impl/EmailServiceImpl.java +++ /dev/null @@ -1,98 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.entity.email.EmailSend; -import cn.bunny.entity.email.EmailSendInit; -import cn.bunny.module.mail.utils.MailSenderUtil; -import cn.bunny.service.service.EmailService; -import jakarta.mail.MessagingException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -public class EmailServiceImpl implements EmailService { - - /** - * 发送邮件-简单 - * - * @param emailSend 邮件消息 - */ - @Override - public void sendSimpleEmail(EmailSend emailSend) { - EmailSendInit emailSendInit = new EmailSendInit(); - emailSendInit.setHost("smtp.qq.com"); - emailSendInit.setPort(465); - emailSendInit.setUsername("3324855376@qq.com"); - emailSendInit.setPassword("axyqbvfuxkdqdaai"); - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - mailSenderUtil.sendSimpleEmail(emailSend); - } - - /** - * 发送带附件邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - @Override - public boolean sendAttachmentEmail(EmailSend emailSend) { - try { - EmailSendInit emailSendInit = new EmailSendInit(); - emailSendInit.setHost("smtp.qq.com"); - emailSendInit.setPort(465); - emailSendInit.setUsername("3324855376@qq.com"); - emailSendInit.setPassword("axyqbvfuxkdqdaai"); - - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - mailSenderUtil.sendEmail(emailSend); - return true; - } catch (MessagingException e) { - return false; - } - } - - /** - * 发送富文本邮件 - * - * @param emailSend 邮件消息 - * @return 是否成功 - */ - @Override - public boolean sendRich(EmailSend emailSend) { - try { - EmailSendInit emailSendInit = new EmailSendInit(); - emailSendInit.setHost("smtp.qq.com"); - emailSendInit.setPort(465); - emailSendInit.setUsername("3324855376@qq.com"); - emailSendInit.setPassword("axyqbvfuxkdqdaai"); - - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - mailSenderUtil.sendRichText(emailSend, true); - return true; - } catch (MessagingException e) { - return false; - } - } - - /** - * 发送带抄送的邮件 - * - * @param emailSend 邮件消息 - */ - @Override - public boolean sendCC(EmailSend emailSend) { - try { - EmailSendInit emailSendInit = new EmailSendInit(); - emailSendInit.setHost("smtp.qq.com"); - emailSendInit.setPort(465); - emailSendInit.setUsername("3324855376@qq.com"); - emailSendInit.setPassword("axyqbvfuxkdqdaai"); - - MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); - mailSenderUtil.sendCC(emailSend, true); - return true; - } catch (MessagingException e) { - return false; - } - } -} diff --git a/service/src/main/java/cn/bunny/service/service/impl/SysMenuServiceImpl.java b/service/src/main/java/cn/bunny/service/service/impl/SysMenuServiceImpl.java deleted file mode 100644 index f58f687..0000000 --- a/service/src/main/java/cn/bunny/service/service/impl/SysMenuServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.entity.system.SysMenu; -import cn.bunny.service.mapper.SysMenuMapper; -import cn.bunny.service.service.SysMenuService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -/** - *

- * 菜单表 服务实现类 - *

- * - * @author Bunny - * @since 2024-05-06 - */ -@Service -public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { - -} diff --git a/service/src/main/java/cn/bunny/service/service/impl/SysRoleServiceImpl.java b/service/src/main/java/cn/bunny/service/service/impl/SysRoleServiceImpl.java deleted file mode 100644 index 5dbbb4a..0000000 --- a/service/src/main/java/cn/bunny/service/service/impl/SysRoleServiceImpl.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.entity.system.SysRole; -import cn.bunny.service.mapper.SysRoleMapper; -import cn.bunny.service.service.SysRoleService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -@Service -public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { -} diff --git a/service/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java b/service/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java deleted file mode 100644 index 73897ae..0000000 --- a/service/src/main/java/cn/bunny/service/service/impl/SysUserServiceImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package cn.bunny.service.service.impl; - -import cn.bunny.common.constant.CommonMessageConstant; -import cn.bunny.common.service.exception.BunnyException; -import cn.bunny.common.service.utils.JwtHelper; -import cn.bunny.entity.system.Login; -import cn.bunny.entity.system.SysUser; -import cn.bunny.entity.system.SysUserinfo; -import cn.bunny.service.mapper.SysUserMapper; -import cn.bunny.service.service.SysUserService; -import cn.bunny.vo.system.LoginVo; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Service; -import org.springframework.util.DigestUtils; - -/** - *

- * 用户表 服务实现类 - *

- * - * @author bunny - * @since 2024-04-22 - */ -@Service -public class SysUserServiceImpl extends ServiceImpl implements SysUserService { - @Autowired - private RedisTemplate redisTemplate; - - /** - * 登录 - * - * @param vo 登录条件 - * @return 返回token - */ - @Override - public Login login(LoginVo vo) { - String username = vo.getUsername(); - String password = vo.getPassword(); - // 查询用户信息 - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(SysUser::getUsername, username); - SysUser sysUser = getOne(wrapper); - - // 用户是否存在 - if (sysUser == null) { - throw new BunnyException(CommonMessageConstant.ACCOUNT_NOT_FOUND); - } - - // 判断是否被禁用 - if (sysUser.getStatus() == 0) { - throw new BunnyException(CommonMessageConstant.ACCOUNT_LOCKED); - } - - // 判断密码 - String md5DigestAsHexPassword = DigestUtils.md5DigestAsHex(password.getBytes()); - if (!md5DigestAsHexPassword.equals(sysUser.getPassword())) { - throw new BunnyException(CommonMessageConstant.PASSWORD_ERROR); - } - // 添加token - String token = JwtHelper.createToken(sysUser.getId(), sysUser.getUsername()); - return Login.builder().token(token).build(); - } - - /** - * 获取用户信息 - * - * @param request 请求头 - * @return 用户信息 - */ - @Override - public SysUserinfo getUserinfo(HttpServletRequest request) { - redisTemplate.opsForValue().set("test", "测试"); - return null; - } - - /** - * 根据用户名查询用户信息 - * - * @param username 用户名 - * @return 用户信息 - */ - @Override - public SysUser getByUsername(String username) { - return getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - } -} diff --git a/service/src/main/java/cn/bunny/service/service/impl/UserServiceImpl.java b/service/src/main/java/cn/bunny/service/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..e0cf57c --- /dev/null +++ b/service/src/main/java/cn/bunny/service/service/impl/UserServiceImpl.java @@ -0,0 +1,122 @@ +package cn.bunny.service.service.impl; + +import cn.bunny.common.service.utils.EmptyUtil; +import cn.bunny.common.service.utils.JwtHelper; +import cn.bunny.dto.user.LoginDto; +import cn.bunny.entity.system.admin.AdminPower; +import cn.bunny.entity.system.admin.auth.AuthUserRole; +import cn.bunny.entity.system.email.EmailSend; +import cn.bunny.entity.system.email.EmailSendInit; +import cn.bunny.entity.system.email.EmailUsers; +import cn.bunny.entity.system.user.User; +import cn.bunny.module.mail.utils.MailSenderUtil; +import cn.bunny.result.constant.ExceptionConstant; +import cn.bunny.result.constant.MailMessageConstant; +import cn.bunny.result.constant.RedisUserConstant; +import cn.bunny.service.mapper.AdminPowerMapper; +import cn.bunny.service.mapper.AdminRoleMapper; +import cn.bunny.service.mapper.EmailUsersMapper; +import cn.bunny.service.mapper.UserMapper; +import cn.bunny.service.service.UserService; +import cn.bunny.vo.system.login.LoginVo; +import cn.hutool.captcha.CaptchaUtil; +import cn.hutool.captcha.CircleCaptcha; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; +import org.springframework.util.DigestUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + *

+ * 用户信息 服务实现类 + *

+ * + * @author Bunny + * @since 2024-05-18 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + @Autowired + private AdminRoleMapper roleMapper; + @Autowired + private AdminPowerMapper powerMapper; + @Autowired + private EmailUsersMapper emailUsersMapper; + @Autowired + private RedisTemplate redisTemplate; + + /** + * 前台用户登录接口 + * + * @param loginDto 登录参数 + * @return 登录后结果返回 + */ + @Override + public LoginVo login(LoginDto loginDto) { + // 判断用户和密码是否为空 + String username = loginDto.getUsername(); + EmptyUtil.isEmpty(username, ExceptionConstant.USERNAME_IS_EMPTY_Exception); + // 密码不能为空 + EmptyUtil.isEmpty(loginDto.getPassword(), ExceptionConstant.PASSWORD_NOT_EMPTY_Exception); + String password = DigestUtils.md5DigestAsHex(loginDto.getPassword().getBytes()); + // 查询数据库,用户对应的角色、权限 + User user = baseMapper.login(username, password); + Long userId = user.getId(); + + // 查询用户所有的角色信息 + AuthUserRole[] roleList = roleMapper.selectByRoleWithUserId(userId); + List roleCodeList = Arrays.stream(roleList).map(AuthUserRole::getRoleCode).toList(); + List roleIdList = Arrays.stream(roleList).map(AuthUserRole::getRoleId).toList(); + // 查询用户权限信息 + AdminPower[] adminPowerList = powerMapper.selectByPowerWithRoleIdList(roleIdList); + List powerCodeList = Arrays.stream(adminPowerList).map(AdminPower::getPowerCode).toList(); + + // 设置返回类型 + LoginVo loginVo = new LoginVo(); + BeanUtils.copyProperties(user, loginVo); + String token = JwtHelper.createToken(loginVo.getId(), loginVo.getEmail(), 7); + loginVo.setToken(token); + loginVo.setRoleList(roleCodeList); + loginVo.setPowerList(powerCodeList); + + return loginVo; + } + + /** + * 发送邮箱验证码 + * + * @param email 邮箱 + */ + @Override + public void sendEmail(String email) { + // 从数据库中获取发送邮箱参数 + EmailUsers emailUsers = emailUsersMapper.selectOne(Wrappers.lambdaQuery().eq(EmailUsers::getIsDefault, 1)); + EmailSendInit emailSendInit = new EmailSendInit(); + // 判断发送邮箱邮件是否为空 + EmptyUtil.isEmpty(emailUsers, MailMessageConstant.EMAIL_CONFIG_NOT_FOUND); + BeanUtils.copyProperties(emailUsers, emailSendInit); + emailSendInit.setUsername(emailUsers.getEmail()); + // 生成验证码 + MailSenderUtil mailSenderUtil = new MailSenderUtil(emailSendInit); + CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(150, 48, 4, 2); + // 生成验证码和可以 + String code = captcha.getCode(); + // 发送验证码 + EmailSend emailSend = new EmailSend(); + emailSend.setSubject("邮箱验证码"); + emailSend.setMessage(code); + emailSend.setSendTo(email); + emailSend.setIsRichText(false); + mailSenderUtil.sendSimpleEmail(emailSend); + + // 将验证码保存到Redis中,并设置15分钟过期 + redisTemplate.opsForValue().set(RedisUserConstant.ADMIN_EMAIL_CODE_PREFIX + email, code, 15, TimeUnit.MINUTES); + } +} diff --git a/service/src/main/resources/application.yml b/service/src/main/resources/application.yml index d92e080..fb30ebc 100644 --- a/service/src/main/resources/application.yml +++ b/service/src/main/resources/application.yml @@ -33,6 +33,9 @@ spring: mybatis-plus: mapper-locations: classpath:mapper/*.xml + global-config: + db-config: + logic-delete-field: isDelete configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 查看日志 diff --git a/service/src/main/resources/mapper/AdminPowerMapper.xml b/service/src/main/resources/mapper/AdminPowerMapper.xml new file mode 100644 index 0000000..842029f --- /dev/null +++ b/service/src/main/resources/mapper/AdminPowerMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + id, power_name, power_code, description, create_time, update_time, update_user, is_delete + + + + + + + + diff --git a/service/src/main/resources/mapper/AdminRoleMapper.xml b/service/src/main/resources/mapper/AdminRoleMapper.xml new file mode 100644 index 0000000..8e11472 --- /dev/null +++ b/service/src/main/resources/mapper/AdminRoleMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + id, role_name, description, role_code, create_time, update_time, update_user, is_deleted + + + + + diff --git a/service/src/main/resources/mapper/EmailUsersMapper.xml b/service/src/main/resources/mapper/EmailUsersMapper.xml new file mode 100644 index 0000000..29b04db --- /dev/null +++ b/service/src/main/resources/mapper/EmailUsersMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + id, email, password, host, port, create_time, update_time, update_user, is_delete + + + + + delete + from email_users + where id = #{id} + + + diff --git a/service/src/main/resources/mapper/SysMenuMapper.xml b/service/src/main/resources/mapper/SysMenuMapper.xml deleted file mode 100644 index 9464822..0000000 --- a/service/src/main/resources/mapper/SysMenuMapper.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - id, parent_id, name, type, path, component, perms, icon, sort_value, status, create_time, update_time, is_deleted - - - diff --git a/service/src/main/resources/mapper/SysRoleMapper.xml b/service/src/main/resources/mapper/SysRoleMapper.xml deleted file mode 100644 index 3d5b7e5..0000000 --- a/service/src/main/resources/mapper/SysRoleMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/service/src/main/resources/mapper/SysUserMapper.xml b/service/src/main/resources/mapper/SysUserMapper.xml deleted file mode 100644 index 7134a56..0000000 --- a/service/src/main/resources/mapper/SysUserMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/service/src/main/resources/mapper/UserMapper.xml b/service/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..6ee63e7 --- /dev/null +++ b/service/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, nick_name, email, password, avatar, sex, person_description, join_time, last_login_time, last_login_ip, last_login_ip_address, total_integral, current_integral, status, create_time, update_time, update_user, is_deleted + + + + +