From 19612940a7bd3b711b76af684f45dff1b0c67733 Mon Sep 17 00:00:00 2001 From: liyangzhen Date: Mon, 2 Dec 2024 20:37:46 +0800 Subject: [PATCH] =?UTF-8?q?modify=20code:=201.=E5=A2=9E=E5=8A=A0=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E6=9F=A5=E8=AF=A2=E7=99=BB=E5=BD=95=E7=99=BB=E5=87=BA?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BF=A1=E6=81=AF=202.=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=BF=9E=E6=8E=A5=E6=B1=A0staff=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++-- .../auth/AuthenticationController.java | 2 +- .../controller/staff/StaffInfoController.java | 44 ++++++++++---- .../{StaffInfoVO.java => StaffInfoApiVO.java} | 2 +- ...oginLogVO.java => StaffLoginLogApiVO.java} | 2 +- ...outLogVO.java => StaffLogoutLogApiVO.java} | 2 +- .../src/main/resources/static/favicon.ico | Bin 0 -> 29426 bytes .../cloud/common/feign/bo/RemotePage.java | 5 +- .../cloud/common/feign/result/PageResult.java | 7 +++ .../cloud/common/feign/result/Result.java | 7 +++ .../staff/runner/HikariPoolInitRunner.java | 32 ++++++++++ .../staff/dto/log/StaffLogPageDTO.java | 23 ++++++++ .../staff/feign/StaffInfoFeignService.java | 18 +++++- .../info/StaffInfoVO.java} | 4 +- .../log/StaffLoginLogVO.java} | 6 +- .../log/StaffLogoutLogVO.java} | 6 +- .../role/StaffRoleVO.java} | 4 +- .../role/SystemAuthorityVO.java} | 4 +- .../role/SystemRoleAuthorityVO.java} | 4 +- .../role/SystemRoleVO.java} | 4 +- .../controller/info/StaffInfoController.java | 55 ++++++++++++++++-- 21 files changed, 192 insertions(+), 49 deletions(-) rename cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/{StaffInfoVO.java => StaffInfoApiVO.java} (95%) rename cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/{StaffLoginLogVO.java => StaffLoginLogApiVO.java} (93%) rename cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/{StaffLogoutLogVO.java => StaffLogoutLogApiVO.java} (93%) create mode 100644 cloud-api/cloud-api-staff/src/main/resources/static/favicon.ico create mode 100644 cloud-service/cloud-service-staff/staff-biz/src/main/java/com/liyz/cloud/service/staff/runner/HikariPoolInitRunner.java create mode 100644 cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/dto/log/StaffLogPageDTO.java rename cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/{bo/info/StaffInfoBO.java => vo/info/StaffInfoVO.java} (91%) rename cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/{bo/log/StaffLoginLogBO.java => vo/log/StaffLoginLogVO.java} (76%) rename cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/{bo/log/StaffLogoutLogBO.java => vo/log/StaffLogoutLogVO.java} (76%) rename cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/{bo/role/StaffRoleBO.java => vo/role/StaffRoleVO.java} (82%) rename cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/{bo/role/SystemAuthorityBO.java => vo/role/SystemAuthorityVO.java} (87%) rename cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/{bo/role/SystemRoleAuthorityBO.java => vo/role/SystemRoleAuthorityVO.java} (81%) rename cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/{bo/role/SystemRoleBO.java => vo/role/SystemRoleVO.java} (84%) diff --git a/README.md b/README.md index 230f570..e7b3d76 100644 --- a/README.md +++ b/README.md @@ -14,14 +14,12 @@ 这是一个基于Jdk21,框架是SpringCloud + Springboot3 + Mybatis-plus的脚手架。 -- 主框架基于:Spring Cloud、Spring Boot、Mybatis-plus +- 主框架基于:Spring Cloud、Spring Boot +- 数据ORM基于:Mybatis-plus - 注册中心基于:Eureka - 监控中心基于:Spring Admin -- 登陆安全基于:Spring Security、jjwt、redisson -- 接口文档基于:Swagger-knife4j -- 限流基于:Google-guava -- 分布式定时任务基于:Elastic-job -- 推送聊天基于:Netty +- 登陆安全基于:Spring Security、jjwt +- 接口文档基于:knife4j - 分库分表读写分离基于:Sharding-jdbc diff --git a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/controller/auth/AuthenticationController.java b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/controller/auth/AuthenticationController.java index 140461e..9f68453 100644 --- a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/controller/auth/AuthenticationController.java +++ b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/controller/auth/AuthenticationController.java @@ -34,7 +34,7 @@ * @version 1.0.0 * @date 2024/5/9 15:10 */ -@Tag(name = "员工信息") +@Tag(name = "鉴权相关") @ApiResponses(value = { @ApiResponse(responseCode = "0", description = "成功"), @ApiResponse(responseCode = "1", description = "失败") diff --git a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/controller/staff/StaffInfoController.java b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/controller/staff/StaffInfoController.java index 2de8bab..284423d 100644 --- a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/controller/staff/StaffInfoController.java +++ b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/controller/staff/StaffInfoController.java @@ -1,21 +1,24 @@ package com.liyz.cloud.api.staff.controller.staff; -import com.liyz.cloud.api.staff.vo.staff.StaffInfoVO; +import com.liyz.cloud.api.staff.vo.staff.StaffInfoApiVO; import com.liyz.cloud.common.api.context.AuthContext; import com.liyz.cloud.common.base.util.BeanUtil; -import com.liyz.cloud.common.exception.CommonExceptionCodeEnum; import com.liyz.cloud.common.feign.bo.RemotePage; import com.liyz.cloud.common.feign.bo.auth.AuthUserBO; import com.liyz.cloud.common.feign.dto.PageDTO; import com.liyz.cloud.common.feign.result.PageResult; import com.liyz.cloud.common.feign.result.Result; -import com.liyz.cloud.service.staff.bo.info.StaffInfoBO; +import com.liyz.cloud.service.staff.dto.log.StaffLogPageDTO; import com.liyz.cloud.service.staff.feign.StaffInfoFeignService; +import com.liyz.cloud.service.staff.vo.info.StaffInfoVO; +import com.liyz.cloud.service.staff.vo.log.StaffLoginLogVO; +import com.liyz.cloud.service.staff.vo.log.StaffLogoutLogVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -43,19 +46,36 @@ public class StaffInfoController { @Operation(summary = "查询当前登录员工信息") @GetMapping("/current") - public Result userInfo() { + public Result userInfo() { AuthUserBO authUser = AuthContext.getAuthUser(); - Result result = staffInfoFeignService.getByStaffId(authUser.getAuthId()); - return Result.success(BeanUtil.copyProperties(result.getData(), StaffInfoVO::new)); + Result result = staffInfoFeignService.getByStaffId(authUser.getAuthId()); + return Result.result(result, BeanUtil.copyProperties(result.getData(), StaffInfoApiVO::new)); } @Operation(summary = "分页查询员工信息") @GetMapping("/page") - public PageResult page(PageDTO page) { - Result> pageResult = staffInfoFeignService.page(page); - if (CommonExceptionCodeEnum.SUCCESS.getCode().equals(pageResult.getCode())) { - return PageResult.success(BeanUtil.copyRemotePage(pageResult.getData(), StaffInfoVO::new)); - } - return PageResult.error(pageResult.getCode(), pageResult.getMessage()); + public PageResult page(PageDTO page) { + Result> pageResult = staffInfoFeignService.page(page); + return PageResult.result(pageResult, BeanUtil.copyRemotePage(pageResult.getData(), StaffInfoApiVO::new)); + } + + @Operation(summary = "分页查询员工登录信息") + @GetMapping("/login/page") + public PageResult loginPage(@Valid PageDTO page) { + StaffLogPageDTO pageDTO = BeanUtil.copyProperties(page, StaffLogPageDTO::new, (s, t) -> { + t.setStaffId(AuthContext.getAuthUser().getAuthId()); + }); + Result> pageResult = staffInfoFeignService.loginPage(pageDTO); + return PageResult.result(pageResult, pageResult.getData()); + } + + @Operation(summary = "分页查询员工登出信息") + @GetMapping("/logout/page") + public PageResult logoutPage(@Valid PageDTO page) { + StaffLogPageDTO pageDTO = BeanUtil.copyProperties(page, StaffLogPageDTO::new, (s, t) -> { + t.setStaffId(AuthContext.getAuthUser().getAuthId()); + }); + Result> pageResult = staffInfoFeignService.logoutPage(pageDTO); + return PageResult.result(pageResult, pageResult.getData()); } } diff --git a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffInfoVO.java b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffInfoApiVO.java similarity index 95% rename from cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffInfoVO.java rename to cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffInfoApiVO.java index 21af51b..f93f401 100644 --- a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffInfoVO.java +++ b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffInfoApiVO.java @@ -20,7 +20,7 @@ */ @Getter @Setter -public class StaffInfoVO implements Serializable { +public class StaffInfoApiVO implements Serializable { @Serial private static final long serialVersionUID = 3401036150852744531L; diff --git a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLoginLogVO.java b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLoginLogApiVO.java similarity index 93% rename from cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLoginLogVO.java rename to cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLoginLogApiVO.java index 2f53436..c01848d 100644 --- a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLoginLogVO.java +++ b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLoginLogApiVO.java @@ -18,7 +18,7 @@ */ @Getter @Setter -public class StaffLoginLogVO implements Serializable { +public class StaffLoginLogApiVO implements Serializable { @Serial private static final long serialVersionUID = 378737454967076747L; diff --git a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLogoutLogVO.java b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLogoutLogApiVO.java similarity index 93% rename from cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLogoutLogVO.java rename to cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLogoutLogApiVO.java index 1201087..3587601 100644 --- a/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLogoutLogVO.java +++ b/cloud-api/cloud-api-staff/src/main/java/com/liyz/cloud/api/staff/vo/staff/StaffLogoutLogApiVO.java @@ -18,7 +18,7 @@ */ @Getter @Setter -public class StaffLogoutLogVO implements Serializable { +public class StaffLogoutLogApiVO implements Serializable { @Serial private static final long serialVersionUID = 787994069214271291L; diff --git a/cloud-api/cloud-api-staff/src/main/resources/static/favicon.ico b/cloud-api/cloud-api-staff/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6fd5bd60c27f91ec572c4e65ae49b7007e37aca6 GIT binary patch literal 29426 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 RXVkg+Pf_mg=TSdL{|_XI0i*x` literal 0 HcmV?d00001 diff --git a/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/bo/RemotePage.java b/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/bo/RemotePage.java index 0cc4f40..514be6c 100644 --- a/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/bo/RemotePage.java +++ b/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/bo/RemotePage.java @@ -15,6 +15,7 @@ * @version 1.0.0 * @date 2023/11/13 10:30 */ +@Getter public class RemotePage implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -29,21 +30,17 @@ public RemotePage(List list, long total, long pageNum, long pageSize) { this.pageSize = pageSize; } - @Getter @Setter @Schema(description = "结果集") private List list; - @Getter @Setter @Schema(description = "总记录数") private long total; - @Getter @Schema(description = "当前页") private long pageNum; - @Getter @Schema(description = "每页的数量") private long pageSize; diff --git a/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/result/PageResult.java b/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/result/PageResult.java index b308d55..8847119 100644 --- a/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/result/PageResult.java +++ b/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/result/PageResult.java @@ -75,6 +75,13 @@ public static PageResult error(IExceptionService codeEnum) { return new PageResult<>(codeEnum); } + public static PageResult result(Result> result, RemotePage data) { + if (CommonExceptionCodeEnum.SUCCESS.getCode().equals(result.getCode())) { + return success(data); + } + return error(result.getCode(), result.getMessage()); + } + public void setPageNum(long pageNum) { this.pageNum = Math.max(1L, pageNum); } diff --git a/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/result/Result.java b/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/result/Result.java index 78db713..0772d9b 100644 --- a/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/result/Result.java +++ b/cloud-common/cloud-common-feign/src/main/java/com/liyz/cloud/common/feign/result/Result.java @@ -61,4 +61,11 @@ public static Result error(IExceptionService codeEnum) { public static Result error(String code, String message) { return new Result<>(code, message); } + + public static Result result(Result result, E data) { + if (CommonExceptionCodeEnum.SUCCESS.getCode().equals(result.getCode())) { + return success(data); + } + return error(result.getCode(), result.getMessage()); + } } diff --git a/cloud-service/cloud-service-staff/staff-biz/src/main/java/com/liyz/cloud/service/staff/runner/HikariPoolInitRunner.java b/cloud-service/cloud-service-staff/staff-biz/src/main/java/com/liyz/cloud/service/staff/runner/HikariPoolInitRunner.java new file mode 100644 index 0000000..e76dd2a --- /dev/null +++ b/cloud-service/cloud-service-staff/staff-biz/src/main/java/com/liyz/cloud/service/staff/runner/HikariPoolInitRunner.java @@ -0,0 +1,32 @@ +package com.liyz.cloud.service.staff.runner; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.liyz.cloud.service.staff.model.StaffLoginLogDO; +import com.liyz.cloud.service.staff.service.StaffLoginLogService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +/** + * Desc:数据库连接池初始化 + * + * @author lyz + * @version 1.0.0 + * @date 2023/3/14 9:19 + */ +@Slf4j +@Component +public class HikariPoolInitRunner implements ApplicationRunner { + + @Resource + private StaffLoginLogService staffLoginLogService; + + @Override + public void run(ApplicationArguments args) throws Exception { + StaffLoginLogDO staffLoginLogDO = staffLoginLogService.getOne( + Wrappers.lambdaQuery(StaffLoginLogDO.builder().staffId(1L).build()), false); + log.info("hikari pool init success"); + } +} diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/dto/log/StaffLogPageDTO.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/dto/log/StaffLogPageDTO.java new file mode 100644 index 0000000..bfe57e5 --- /dev/null +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/dto/log/StaffLogPageDTO.java @@ -0,0 +1,23 @@ +package com.liyz.cloud.service.staff.dto.log; + +import com.liyz.cloud.common.feign.dto.PageDTO; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * Desc: + * + * @author lyz + * @version 1.0.0 + * @date 2024/10/30 15:23 + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class StaffLogPageDTO extends PageDTO { + + @Schema(description = "用户ID") + @NotNull(message = "用户ID不能为空") + private Long staffId; +} diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/feign/StaffInfoFeignService.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/feign/StaffInfoFeignService.java index 96fe5c7..3e026a6 100644 --- a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/feign/StaffInfoFeignService.java +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/feign/StaffInfoFeignService.java @@ -3,9 +3,13 @@ import com.liyz.cloud.common.feign.bo.RemotePage; import com.liyz.cloud.common.feign.dto.PageDTO; import com.liyz.cloud.common.feign.result.Result; -import com.liyz.cloud.service.staff.bo.info.StaffInfoBO; import com.liyz.cloud.service.staff.constants.StaffConstants; +import com.liyz.cloud.service.staff.dto.log.StaffLogPageDTO; +import com.liyz.cloud.service.staff.vo.info.StaffInfoVO; +import com.liyz.cloud.service.staff.vo.log.StaffLoginLogVO; +import com.liyz.cloud.service.staff.vo.log.StaffLogoutLogVO; import io.swagger.v3.oas.annotations.Operation; +import jakarta.validation.Valid; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -25,9 +29,17 @@ public interface StaffInfoFeignService { @Operation(summary = "根据staffId获取用户信息") @GetMapping( "/getByStaffId") - Result getByStaffId(@RequestParam("staffId") Long staffId); + Result getByStaffId(@RequestParam("staffId") Long staffId); @Operation(summary = "分页查询员工信息") @PostMapping("/page") - Result> page(@RequestBody PageDTO pageDTO); + Result> page(@RequestBody PageDTO pageDTO); + + @Operation(summary = "分页查询员工登录信息") + @PostMapping("/login/page") + Result> loginPage(@Valid @RequestBody StaffLogPageDTO pageDTO); + + @Operation(summary = "分页查询员工登出信息") + @PostMapping("/logout/page") + Result> logoutPage(@Valid @RequestBody StaffLogPageDTO pageDTO); } diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/info/StaffInfoBO.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/info/StaffInfoVO.java similarity index 91% rename from cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/info/StaffInfoBO.java rename to cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/info/StaffInfoVO.java index 4534ee2..89b0726 100644 --- a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/info/StaffInfoBO.java +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/info/StaffInfoVO.java @@ -1,4 +1,4 @@ -package com.liyz.cloud.service.staff.bo.info; +package com.liyz.cloud.service.staff.vo.info; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; @@ -18,7 +18,7 @@ */ @Getter @Setter -public class StaffInfoBO implements Serializable { +public class StaffInfoVO implements Serializable { @Serial private static final long serialVersionUID = 477985923412638468L; diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/log/StaffLoginLogBO.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/log/StaffLoginLogVO.java similarity index 76% rename from cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/log/StaffLoginLogBO.java rename to cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/log/StaffLoginLogVO.java index 27dbce8..35add38 100644 --- a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/log/StaffLoginLogBO.java +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/log/StaffLoginLogVO.java @@ -1,5 +1,6 @@ -package com.liyz.cloud.service.staff.bo.log; +package com.liyz.cloud.service.staff.vo.log; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -17,7 +18,7 @@ */ @Getter @Setter -public class StaffLoginLogBO implements Serializable { +public class StaffLoginLogVO implements Serializable { @Serial private static final long serialVersionUID = -8978119199629210583L; @@ -30,6 +31,7 @@ public class StaffLoginLogBO implements Serializable { @Schema(description = "用户设备") private Integer device; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Schema(description = "用户登录时间") private Date loginTime; diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/log/StaffLogoutLogBO.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/log/StaffLogoutLogVO.java similarity index 76% rename from cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/log/StaffLogoutLogBO.java rename to cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/log/StaffLogoutLogVO.java index 02e9318..d6ce363 100644 --- a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/log/StaffLogoutLogBO.java +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/log/StaffLogoutLogVO.java @@ -1,5 +1,6 @@ -package com.liyz.cloud.service.staff.bo.log; +package com.liyz.cloud.service.staff.vo.log; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -17,7 +18,7 @@ */ @Getter @Setter -public class StaffLogoutLogBO implements Serializable { +public class StaffLogoutLogVO implements Serializable { @Serial private static final long serialVersionUID = 3070437801653890936L; @@ -30,6 +31,7 @@ public class StaffLogoutLogBO implements Serializable { @Schema(description = "用户设备") private Integer device; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Schema(description = "用户登录时间") private Date logoutTime; diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/StaffRoleBO.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/StaffRoleVO.java similarity index 82% rename from cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/StaffRoleBO.java rename to cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/StaffRoleVO.java index ef0baaf..ecb7cb9 100644 --- a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/StaffRoleBO.java +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/StaffRoleVO.java @@ -1,4 +1,4 @@ -package com.liyz.cloud.service.staff.bo.role; +package com.liyz.cloud.service.staff.vo.role; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; @@ -16,7 +16,7 @@ */ @Getter @Setter -public class StaffRoleBO implements Serializable { +public class StaffRoleVO implements Serializable { @Serial private static final long serialVersionUID = -5019855188001537438L; diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemAuthorityBO.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemAuthorityVO.java similarity index 87% rename from cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemAuthorityBO.java rename to cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemAuthorityVO.java index f3ad14d..6505fe0 100644 --- a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemAuthorityBO.java +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemAuthorityVO.java @@ -1,4 +1,4 @@ -package com.liyz.cloud.service.staff.bo.role; +package com.liyz.cloud.service.staff.vo.role; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; @@ -16,7 +16,7 @@ */ @Getter @Setter -public class SystemAuthorityBO implements Serializable { +public class SystemAuthorityVO implements Serializable { @Serial private static final long serialVersionUID = -6116744036977982899L; diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemRoleAuthorityBO.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemRoleAuthorityVO.java similarity index 81% rename from cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemRoleAuthorityBO.java rename to cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemRoleAuthorityVO.java index e8af059..e0825fc 100644 --- a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemRoleAuthorityBO.java +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemRoleAuthorityVO.java @@ -1,4 +1,4 @@ -package com.liyz.cloud.service.staff.bo.role; +package com.liyz.cloud.service.staff.vo.role; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; @@ -16,7 +16,7 @@ */ @Getter @Setter -public class SystemRoleAuthorityBO implements Serializable { +public class SystemRoleAuthorityVO implements Serializable { @Serial private static final long serialVersionUID = 8328113920009535585L; diff --git a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemRoleBO.java b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemRoleVO.java similarity index 84% rename from cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemRoleBO.java rename to cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemRoleVO.java index 8bce957..988fd87 100644 --- a/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/bo/role/SystemRoleBO.java +++ b/cloud-service/cloud-service-staff/staff-feign/src/main/java/com/liyz/cloud/service/staff/vo/role/SystemRoleVO.java @@ -1,4 +1,4 @@ -package com.liyz.cloud.service.staff.bo.role; +package com.liyz.cloud.service.staff.vo.role; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; @@ -16,7 +16,7 @@ */ @Getter @Setter -public class SystemRoleBO implements Serializable { +public class SystemRoleVO implements Serializable { @Serial private static final long serialVersionUID = 2197798732348814224L; diff --git a/cloud-service/cloud-service-staff/staff-web/src/main/java/com/liyz/cloud/service/staff/controller/info/StaffInfoController.java b/cloud-service/cloud-service-staff/staff-web/src/main/java/com/liyz/cloud/service/staff/controller/info/StaffInfoController.java index 3bb1f75..0bd7388 100644 --- a/cloud-service/cloud-service-staff/staff-web/src/main/java/com/liyz/cloud/service/staff/controller/info/StaffInfoController.java +++ b/cloud-service/cloud-service-staff/staff-web/src/main/java/com/liyz/cloud/service/staff/controller/info/StaffInfoController.java @@ -1,17 +1,26 @@ package com.liyz.cloud.service.staff.controller.info; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.liyz.cloud.common.base.util.BeanUtil; import com.liyz.cloud.common.feign.bo.RemotePage; import com.liyz.cloud.common.feign.dto.PageDTO; import com.liyz.cloud.common.feign.result.Result; -import com.liyz.cloud.service.staff.bo.info.StaffInfoBO; import com.liyz.cloud.service.staff.constants.StaffConstants; +import com.liyz.cloud.service.staff.dto.log.StaffLogPageDTO; import com.liyz.cloud.service.staff.model.StaffInfoDO; +import com.liyz.cloud.service.staff.model.StaffLoginLogDO; +import com.liyz.cloud.service.staff.model.StaffLogoutLogDO; import com.liyz.cloud.service.staff.service.StaffInfoService; +import com.liyz.cloud.service.staff.service.StaffLoginLogService; +import com.liyz.cloud.service.staff.service.StaffLogoutLogService; +import com.liyz.cloud.service.staff.vo.info.StaffInfoVO; +import com.liyz.cloud.service.staff.vo.log.StaffLoginLogVO; +import com.liyz.cloud.service.staff.vo.log.StaffLogoutLogVO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; +import jakarta.validation.Valid; import org.springframework.web.bind.annotation.*; /** @@ -28,19 +37,53 @@ public class StaffInfoController { @Resource private StaffInfoService staffInfoService; + @Resource + private StaffLoginLogService staffLoginLogService; + @Resource + private StaffLogoutLogService staffLogoutLogService; @Operation(summary = "根据staffId获取用户信息") @GetMapping("/getByStaffId") - public Result getByStaffId(@RequestParam("staffId") Long staffId) { - return Result.success(BeanUtil.copyProperties(staffInfoService.getById(staffId), StaffInfoBO::new)); + public Result getByStaffId(@RequestParam("staffId") Long staffId) { + return Result.success(BeanUtil.copyProperties(staffInfoService.getById(staffId), StaffInfoVO::new)); } @Operation(summary = "分页查询员工信息") @PostMapping("/page") - public Result> page(@RequestBody PageDTO pageDTO) { + public Result> page(@RequestBody PageDTO pageDTO) { Page page = staffInfoService.page(Page.of(pageDTO.getPageNum(), pageDTO.getPageSize())); - RemotePage remotePage = RemotePage.of( - BeanUtil.copyList(page.getRecords(), StaffInfoBO::new), + RemotePage remotePage = RemotePage.of( + BeanUtil.copyList(page.getRecords(), StaffInfoVO::new), + page.getTotal(), + pageDTO.getPageNum(), + pageDTO.getPageSize() + ); + return Result.success(remotePage); + } + + @Operation(summary = "分页查询员工登录信息") + @PostMapping("/login/page") + public Result> loginPage(@Valid @RequestBody StaffLogPageDTO pageDTO) { + Page page = staffLoginLogService.page(Page.of(pageDTO.getPageNum(), pageDTO.getPageSize()), + Wrappers.lambdaQuery(StaffLoginLogDO.builder().staffId(pageDTO.getStaffId()).build()) + .orderByDesc(StaffLoginLogDO::getId)); + RemotePage remotePage = RemotePage.of( + BeanUtil.copyList(page.getRecords(), StaffLoginLogVO::new), + page.getTotal(), + pageDTO.getPageNum(), + pageDTO.getPageSize() + ); + return Result.success(remotePage); + } + + @Operation(summary = "分页查询员工登出信息") + @PostMapping("/logout/page") + public Result> logoutPage(@Valid @RequestBody StaffLogPageDTO pageDTO) { + Page page = staffLogoutLogService.page(Page.of(pageDTO.getPageNum(), pageDTO.getPageSize()), + Wrappers.lambdaQuery(StaffLogoutLogDO.builder().staffId(pageDTO.getStaffId()).build()) + .orderByDesc(StaffLogoutLogDO::getId)); + RemotePage remotePage = RemotePage.of( + BeanUtil.copyList(page.getRecords(), StaffLogoutLogVO::new), page.getTotal(), pageDTO.getPageNum(), pageDTO.getPageSize()