From ec36a45f348e68b4d4fee29d82bacfc5ef9bb030 Mon Sep 17 00:00:00 2001 From: Bunny <1319900154@qq.com> Date: Sat, 23 Nov 2024 23:11:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=B6=E5=85=A5=E5=92=8C=E6=94=AF?= =?UTF-8?q?=E5=87=BA=E5=9B=BE=E8=A1=A8=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/exception/BunnyException.java | 3 ++ .../bunny/common/service/utils/EmptyUtil.java | 21 --------- .../financial/bill/ExpendWithIncomeDto.java | 35 ++++++++++++++ .../bunny/dao/pojo/result/ResultCodeEnum.java | 6 +-- .../user/expendAndIncome/CategoryAmount.java | 22 +++++++++ .../expendAndIncome/ExpendWithIncome.java | 47 +++++++++++++++++++ .../ExpendWithIncomeListVo.java | 24 ++++++++++ .../controller/financial/BillController.java | 9 ++++ .../services/factory/UserLoginLogFactory.java | 34 -------------- .../services/mapper/financial/BillMapper.java | 10 ++++ .../security/config/WebSecurityConfig.java | 14 +++--- .../custom/CustomAuthenticationException.java | 22 +++++++++ .../SecurityAuthenticationEntryPoint.java | 15 ++---- ...CustomAuthorizationManagerServiceImpl.java | 13 ++--- .../service/financial/BillService.java | 10 ++++ .../financial/impl/BillServiceImpl.java | 40 ++++++++++++++++ .../system/impl/RolePowerServiceImpl.java | 1 + .../system/impl/UserLoginLogServiceImpl.java | 18 ++++--- .../service/system/impl/UserServiceImpl.java | 2 +- .../src/main/resources/application-dev.yml | 6 +-- .../resources/mapper/financial/BillMapper.xml | 18 +++++++ 21 files changed, 279 insertions(+), 91 deletions(-) delete mode 100644 common/service-utils/src/main/java/cn/bunny/common/service/utils/EmptyUtil.java create mode 100644 dao/src/main/java/cn/bunny/dao/dto/financial/bill/ExpendWithIncomeDto.java create mode 100644 dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/CategoryAmount.java create mode 100644 dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/ExpendWithIncome.java create mode 100644 dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/ExpendWithIncomeListVo.java delete mode 100644 service/src/main/java/cn/bunny/services/factory/UserLoginLogFactory.java create mode 100644 service/src/main/java/cn/bunny/services/security/custom/CustomAuthenticationException.java diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/exception/BunnyException.java b/common/service-utils/src/main/java/cn/bunny/common/service/exception/BunnyException.java index d300d33..8be833a 100644 --- a/common/service-utils/src/main/java/cn/bunny/common/service/exception/BunnyException.java +++ b/common/service-utils/src/main/java/cn/bunny/common/service/exception/BunnyException.java @@ -13,6 +13,8 @@ import lombok.extern.slf4j.Slf4j; public class BunnyException extends RuntimeException { Integer code;// 状态码 String message;// 描述信息 + ResultCodeEnum resultCodeEnum; + public BunnyException(Integer code, String message) { super(message); @@ -29,5 +31,6 @@ public class BunnyException extends RuntimeException { super(codeEnum.getMessage()); this.code = codeEnum.getCode(); this.message = codeEnum.getMessage(); + this.resultCodeEnum = codeEnum; } } diff --git a/common/service-utils/src/main/java/cn/bunny/common/service/utils/EmptyUtil.java b/common/service-utils/src/main/java/cn/bunny/common/service/utils/EmptyUtil.java deleted file mode 100644 index 9cbfe0c..0000000 --- a/common/service-utils/src/main/java/cn/bunny/common/service/utils/EmptyUtil.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.bunny.common.service.utils; - -import cn.bunny.common.service.exception.BunnyException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.StringUtils; - -@Slf4j -public class EmptyUtil { - /** - * 是否为空 - * - * @param value 判断值 - * @param message 错误消息 - */ - public static void isEmpty(Object value, String message) { - if (value == null || !StringUtils.hasText(value.toString())) { - log.error("为空对象错误:{},{}", value, message); - throw new BunnyException(message); - } - } -} diff --git a/dao/src/main/java/cn/bunny/dao/dto/financial/bill/ExpendWithIncomeDto.java b/dao/src/main/java/cn/bunny/dao/dto/financial/bill/ExpendWithIncomeDto.java new file mode 100644 index 0000000..5477f8f --- /dev/null +++ b/dao/src/main/java/cn/bunny/dao/dto/financial/bill/ExpendWithIncomeDto.java @@ -0,0 +1,35 @@ +package cn.bunny.dao.dto.financial.bill; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "ExpendWithIncomeDto对象", title = "账单收入和支出查询表单", description = "账单收入和支出查询表单") +public class ExpendWithIncomeDto { + + @Schema(name = "userId", title = "绑定的用户id") + private Long userId; + + @Schema(name = "type", title = "类型") + private Byte type; + + @Schema(name = "startDate", title = "开始日期") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") + @NotNull(message = "日期不能为空") + private LocalDate startDate; + + @Schema(name = "endDate", title = "结束日期") + @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd") + @NotNull(message = "日期不能为空") + private LocalDate endDate; +} diff --git a/dao/src/main/java/cn/bunny/dao/pojo/result/ResultCodeEnum.java b/dao/src/main/java/cn/bunny/dao/pojo/result/ResultCodeEnum.java index cf2503d..c3b7450 100644 --- a/dao/src/main/java/cn/bunny/dao/pojo/result/ResultCodeEnum.java +++ b/dao/src/main/java/cn/bunny/dao/pojo/result/ResultCodeEnum.java @@ -48,7 +48,7 @@ public enum ResultCodeEnum { FILE_NOT_EXIST(206, "文件不存在"), NEW_PASSWORD_SAME_OLD_PASSWORD(206, "新密码不能和旧密码相同"), MISSING_TEMPLATE_FILES(206, "缺少模板文件"), - THE_MAXIMUM_BAR_CODE(206, "最大条码为50"), + THE_MAXIMUM_BAR_CODE(206, "超过最大上限"), // 身份过期 208 LOGIN_AUTH(208, "请先登陆"), @@ -65,15 +65,13 @@ public enum ResultCodeEnum { ILLEGAL_DATA_REQUEST(219, "非法数据请求"), CLASS_NOT_FOUND(219, "类名不存在"), ADMIN_ROLE_CAN_NOT_DELETED(219, "无法删除admin角色"), + ROUTER_RANK_NEED_LARGER_THAN_THE_PARENT(219, "设置路由等级需要大于或等于父级的路由等级"), // 无权访问 403 - FAIL_REQUEST_NOT_AUTH(403, "用户未认证"), FAIL_NO_ACCESS_DENIED(403, "无权访问"), FAIL_NO_ACCESS_DENIED_USER_OFFLINE(403, "用户强制下线"), - LOGGED_IN_FROM_ANOTHER_DEVICE(403, "没有权限访问"), TOKEN_PARSING_FAILED(403, "token解析失败"), FAIL_NO_ACCESS_DENIED_USER_LOCKED(403, "该账户已封禁"), - ROUTER_RANK_NEED_LARGER_THAN_THE_PARENT(219, "设置路由等级需要大于或等于父级的路由等级"), // 系统错误 500 UNKNOWN_EXCEPTION(500, "服务异常"), diff --git a/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/CategoryAmount.java b/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/CategoryAmount.java new file mode 100644 index 0000000..ee4ed12 --- /dev/null +++ b/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/CategoryAmount.java @@ -0,0 +1,22 @@ +package cn.bunny.dao.vo.financial.user.expendAndIncome; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "ExpendWithIncomeVo对象", title = "账单收入和支出", description = "账单收入和支出") +public class CategoryAmount { + + @Schema(name = "amount", title = "金额") + private Number amount; + + @Schema(name = "categoryName", title = "分类名称") + private String categoryName; + +} diff --git a/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/ExpendWithIncome.java b/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/ExpendWithIncome.java new file mode 100644 index 0000000..995294f --- /dev/null +++ b/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/ExpendWithIncome.java @@ -0,0 +1,47 @@ +package cn.bunny.dao.vo.financial.user.expendAndIncome; + +import cn.bunny.dao.common.vo.BaseVo; +import com.alibaba.fastjson2.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@EqualsAndHashCode(callSuper = true) +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "ExpendWithIncomeVo对象", title = "账单收入和支出", description = "账单收入和支出") +public class ExpendWithIncome extends BaseVo { + + @Schema(name = "username", title = "类型:1 - 收入,-1 - 支出") + private Byte type; + + @Schema(name = "amount", title = "金额") + private BigDecimal amount; + + @Schema(name = "description", title = "描述") + private String description; + + @Schema(name = "categoryId", title = "分类Id") + @JsonFormat(shape = JsonFormat.Shape.STRING) + @JSONField(serializeUsing = ToStringSerializer.class) + private String categoryId; + + @Schema(name = "categoryName", title = "分类名称") + private String categoryName; + + @Schema(name = "transactionDate", title = "交易日期") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime transactionDate; +} diff --git a/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/ExpendWithIncomeListVo.java b/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/ExpendWithIncomeListVo.java new file mode 100644 index 0000000..c44df9c --- /dev/null +++ b/dao/src/main/java/cn/bunny/dao/vo/financial/user/expendAndIncome/ExpendWithIncomeListVo.java @@ -0,0 +1,24 @@ +package cn.bunny.dao.vo.financial.user.expendAndIncome; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Schema(name = "ExpendWithIncomeVo对象", title = "账单收入和支出", description = "账单收入和支出") +public class ExpendWithIncomeListVo { + + @Schema(name = "list", title = "基础列表") + private List list; + + @Schema(name = "categoryList", title = "分类列表") + private List categoryAmounts; + +} diff --git a/service/src/main/java/cn/bunny/services/controller/financial/BillController.java b/service/src/main/java/cn/bunny/services/controller/financial/BillController.java index d8ac91e..bda3e6c 100644 --- a/service/src/main/java/cn/bunny/services/controller/financial/BillController.java +++ b/service/src/main/java/cn/bunny/services/controller/financial/BillController.java @@ -1,6 +1,7 @@ package cn.bunny.services.controller.financial; import cn.bunny.dao.dto.financial.bill.BillDto; +import cn.bunny.dao.dto.financial.bill.ExpendWithIncomeDto; import cn.bunny.dao.dto.financial.bill.admin.BillAddDto; import cn.bunny.dao.dto.financial.bill.admin.BillUpdateDto; import cn.bunny.dao.dto.financial.bill.user.BillAddUserDto; @@ -11,6 +12,7 @@ import cn.bunny.dao.pojo.result.Result; import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.vo.financial.admin.BillVo; import cn.bunny.dao.vo.financial.user.BillUserVo; +import cn.bunny.dao.vo.financial.user.expendAndIncome.ExpendWithIncomeListVo; import cn.bunny.services.service.financial.BillService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; @@ -65,6 +67,13 @@ public class BillController { return Mono.just(Result.success(pageResult)); } + @Operation(summary = "账单收入和支出", description = "账单收入和支出") + @GetMapping("noManage/getExpendOrIncome") + public Mono> getExpendOrIncome(ExpendWithIncomeDto dto) { + ExpendWithIncomeListVo vo = billService.getExpendOrIncome(dto); + return Mono.just(Result.success(vo)); + } + @Operation(summary = "添加账单信息", description = "添加账单信息") @PostMapping("addBill") public Mono> addBill(@Valid @RequestBody BillAddDto dto) { diff --git a/service/src/main/java/cn/bunny/services/factory/UserLoginLogFactory.java b/service/src/main/java/cn/bunny/services/factory/UserLoginLogFactory.java deleted file mode 100644 index baded06..0000000 --- a/service/src/main/java/cn/bunny/services/factory/UserLoginLogFactory.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.bunny.services.factory; - -import cn.bunny.dao.pojo.result.PageResult; -import cn.bunny.dao.vo.log.UserLoginLogVo; -import com.baomidou.mybatisplus.core.metadata.IPage; -import org.springframework.beans.BeanUtils; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class UserLoginLogFactory { - - /** - * 用户登录日志分页查询通用方法 - * - * @param page 分页结果 - * @return 分页用户登录日志 - */ - public PageResult getUserLoginLogVoPageResult(IPage page) { - List voList = page.getRecords().stream().map(userLoginLog -> { - UserLoginLogVo userLoginLogVo = new UserLoginLogVo(); - BeanUtils.copyProperties(userLoginLog, userLoginLogVo); - return userLoginLogVo; - }).toList(); - - return PageResult.builder() - .list(voList) - .pageNo(page.getCurrent()) - .pageSize(page.getSize()) - .total(page.getTotal()) - .build(); - } -} diff --git a/service/src/main/java/cn/bunny/services/mapper/financial/BillMapper.java b/service/src/main/java/cn/bunny/services/mapper/financial/BillMapper.java index be9f9b5..6a7e4a2 100644 --- a/service/src/main/java/cn/bunny/services/mapper/financial/BillMapper.java +++ b/service/src/main/java/cn/bunny/services/mapper/financial/BillMapper.java @@ -1,8 +1,10 @@ package cn.bunny.services.mapper.financial; import cn.bunny.dao.dto.financial.bill.BillDto; +import cn.bunny.dao.dto.financial.bill.ExpendWithIncomeDto; import cn.bunny.dao.entity.financial.Bill; import cn.bunny.dao.vo.financial.admin.BillVo; +import cn.bunny.dao.vo.financial.user.expendAndIncome.ExpendWithIncome; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -37,4 +39,12 @@ public interface BillMapper extends BaseMapper { * @return 账单信息分页结果 */ IPage selectListByPage(@Param("page") Page pageParams, @Param("dto") BillDto dto); + + /** + * 账单收入和支出 + * + * @param dto 请求表单 + * @return 账单收入和支出 + */ + List selectListByExpendWithIncomeDto(@Param("dto") ExpendWithIncomeDto dto); } diff --git a/service/src/main/java/cn/bunny/services/security/config/WebSecurityConfig.java b/service/src/main/java/cn/bunny/services/security/config/WebSecurityConfig.java index ec247a8..0bdf10b 100644 --- a/service/src/main/java/cn/bunny/services/security/config/WebSecurityConfig.java +++ b/service/src/main/java/cn/bunny/services/security/config/WebSecurityConfig.java @@ -23,6 +23,14 @@ import org.springframework.security.web.util.matcher.RegexRequestMatcher; @EnableWebSecurity @EnableMethodSecurity public class WebSecurityConfig { + + public static String[] annotations = { + "/", "/ws/**", + "/*/*/noAuth/**", "/*/noAuth/**", "/noAuth/**", + "/media.ico", "/favicon.ico", "*.html", "/webjars/**", "/v3/api-docs/**", "/swagger-ui/**", + "/error", "/*/i18n/getI18n", + }; + @Autowired private RedisTemplate redisTemplate; @@ -40,12 +48,6 @@ public class WebSecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { - String[] annotations = { - "/", "/ws/**", - "/*/*/noAuth/**", "/*/noAuth/**", "/noAuth/**", - "/media.ico", "/favicon.ico", "*.html", "/webjars/**", "/v3/api-docs/**", "swagger-ui/**", - "/error", "/*/i18n/getI18n", - }; httpSecurity // 前端段分离不需要---禁用明文验证 .httpBasic(AbstractHttpConfigurer::disable) diff --git a/service/src/main/java/cn/bunny/services/security/custom/CustomAuthenticationException.java b/service/src/main/java/cn/bunny/services/security/custom/CustomAuthenticationException.java new file mode 100644 index 0000000..f2f4c9f --- /dev/null +++ b/service/src/main/java/cn/bunny/services/security/custom/CustomAuthenticationException.java @@ -0,0 +1,22 @@ +package cn.bunny.services.security.custom; + +import cn.bunny.dao.pojo.result.ResultCodeEnum; +import lombok.Getter; +import lombok.ToString; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.AuthenticationException; + +/** + * 处理与认证相关的异常 + */ +@Getter +@ToString +@Slf4j +public class CustomAuthenticationException extends AuthenticationException { + ResultCodeEnum resultCodeEnum; + + public CustomAuthenticationException(ResultCodeEnum codeEnum) { + super(codeEnum.getMessage()); + this.resultCodeEnum = codeEnum; + } +} diff --git a/service/src/main/java/cn/bunny/services/security/handelr/SecurityAuthenticationEntryPoint.java b/service/src/main/java/cn/bunny/services/security/handelr/SecurityAuthenticationEntryPoint.java index b45d885..c983cd3 100644 --- a/service/src/main/java/cn/bunny/services/security/handelr/SecurityAuthenticationEntryPoint.java +++ b/service/src/main/java/cn/bunny/services/security/handelr/SecurityAuthenticationEntryPoint.java @@ -3,6 +3,7 @@ package cn.bunny.services.security.handelr; import cn.bunny.common.service.utils.ResponseUtil; import cn.bunny.dao.pojo.result.Result; import cn.bunny.dao.pojo.result.ResultCodeEnum; +import cn.bunny.services.security.custom.CustomAuthenticationException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -10,26 +11,20 @@ import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; /** - * 请求未认证接口 + * 自定义请求未认证接口异常 */ @Slf4j public class SecurityAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) { - String token = request.getHeader("token"); - String message = authException.getMessage(); - // 创建结果对象 Result result; - if (token == null) { - result = Result.error(ResultCodeEnum.LOGIN_AUTH); - log.info("请求未登录接口:{},用户id:{}", message, null); + if (authException instanceof CustomAuthenticationException customException) { + result = Result.error(customException.getResultCodeEnum()); } else { - result = Result.error(ResultCodeEnum.LOGGED_IN_FROM_ANOTHER_DEVICE); - log.info("请求未授权接口:{},用户id:{}", message, token); + result = Result.error(ResultCodeEnum.FAIL_NO_ACCESS_DENIED); } - // 返回响应 ResponseUtil.out(response, result); } } diff --git a/service/src/main/java/cn/bunny/services/security/service/impl/CustomAuthorizationManagerServiceImpl.java b/service/src/main/java/cn/bunny/services/security/service/impl/CustomAuthorizationManagerServiceImpl.java index f1769ff..2fffe65 100644 --- a/service/src/main/java/cn/bunny/services/security/service/impl/CustomAuthorizationManagerServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/security/service/impl/CustomAuthorizationManagerServiceImpl.java @@ -5,13 +5,14 @@ import cn.bunny.common.service.utils.JwtHelper; import cn.bunny.dao.entity.system.Power; import cn.bunny.dao.entity.system.Role; import cn.bunny.dao.pojo.constant.RedisUserConstant; +import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.vo.system.user.LoginVo; import cn.bunny.services.mapper.system.PowerMapper; import cn.bunny.services.mapper.system.RoleMapper; +import cn.bunny.services.security.custom.CustomAuthenticationException; import cn.bunny.services.security.custom.CustomCheckIsAdmin; import com.alibaba.fastjson2.JSON; import jakarta.servlet.http.HttpServletRequest; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -44,21 +45,21 @@ public class CustomAuthorizationManagerServiceImpl implements AuthorizationManag @Autowired private RedisTemplate redisTemplate; - @SneakyThrows @Override public AuthorizationDecision check(Supplier authentication, RequestAuthorizationContext context) { + // 用户的token和用户id、请求Url HttpServletRequest request = context.getRequest(); // 判断是否有 token String token = request.getHeader("token"); if (token == null) { - return new AuthorizationDecision(false); + throw new CustomAuthenticationException(ResultCodeEnum.LOGIN_AUTH); } // 判断 token 是否过期 if (JwtHelper.isExpired(token)) { - return new AuthorizationDecision(false); + throw new CustomAuthenticationException(ResultCodeEnum.AUTHENTICATION_EXPIRED); } // 解析JWT中的用户名 @@ -71,12 +72,12 @@ public class CustomAuthorizationManagerServiceImpl implements AuthorizationManag // 登录信息为空 if (loginVo == null) { - return new AuthorizationDecision(false); + throw new CustomAuthenticationException(ResultCodeEnum.LOGIN_AUTH); } // 判断用户是否禁用 if (loginVo.getStatus()) { - return new AuthorizationDecision(false); + throw new CustomAuthenticationException(ResultCodeEnum.FAIL_NO_ACCESS_DENIED_USER_LOCKED); } // 设置用户信息 diff --git a/service/src/main/java/cn/bunny/services/service/financial/BillService.java b/service/src/main/java/cn/bunny/services/service/financial/BillService.java index ce56f96..3af1a81 100644 --- a/service/src/main/java/cn/bunny/services/service/financial/BillService.java +++ b/service/src/main/java/cn/bunny/services/service/financial/BillService.java @@ -1,6 +1,7 @@ package cn.bunny.services.service.financial; import cn.bunny.dao.dto.financial.bill.BillDto; +import cn.bunny.dao.dto.financial.bill.ExpendWithIncomeDto; import cn.bunny.dao.dto.financial.bill.admin.BillAddDto; import cn.bunny.dao.dto.financial.bill.admin.BillUpdateDto; import cn.bunny.dao.dto.financial.bill.user.BillAddUserDto; @@ -9,6 +10,7 @@ import cn.bunny.dao.entity.financial.Bill; import cn.bunny.dao.pojo.result.PageResult; import cn.bunny.dao.vo.financial.admin.BillVo; import cn.bunny.dao.vo.financial.user.BillUserVo; +import cn.bunny.dao.vo.financial.user.expendAndIncome.ExpendWithIncomeListVo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; @@ -79,4 +81,12 @@ public interface BillService extends IService { * @param dto 更新表单 */ void updateUserBill(BillUpdateUserDto dto); + + /** + * 账单收入和支出 + * + * @param dto 请求表单 + * @return 账单收入和支出 + */ + ExpendWithIncomeListVo getExpendOrIncome(ExpendWithIncomeDto dto); } diff --git a/service/src/main/java/cn/bunny/services/service/financial/impl/BillServiceImpl.java b/service/src/main/java/cn/bunny/services/service/financial/impl/BillServiceImpl.java index 6966bda..f42a6f1 100644 --- a/service/src/main/java/cn/bunny/services/service/financial/impl/BillServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/financial/impl/BillServiceImpl.java @@ -3,6 +3,7 @@ package cn.bunny.services.service.financial.impl; import cn.bunny.common.service.context.BaseContext; import cn.bunny.common.service.exception.BunnyException; import cn.bunny.dao.dto.financial.bill.BillDto; +import cn.bunny.dao.dto.financial.bill.ExpendWithIncomeDto; import cn.bunny.dao.dto.financial.bill.admin.BillAddDto; import cn.bunny.dao.dto.financial.bill.admin.BillUpdateDto; import cn.bunny.dao.dto.financial.bill.user.BillAddUserDto; @@ -12,6 +13,9 @@ import cn.bunny.dao.pojo.result.PageResult; import cn.bunny.dao.pojo.result.ResultCodeEnum; import cn.bunny.dao.vo.financial.admin.BillVo; import cn.bunny.dao.vo.financial.user.BillUserVo; +import cn.bunny.dao.vo.financial.user.expendAndIncome.CategoryAmount; +import cn.bunny.dao.vo.financial.user.expendAndIncome.ExpendWithIncome; +import cn.bunny.dao.vo.financial.user.expendAndIncome.ExpendWithIncomeListVo; import cn.bunny.services.mapper.financial.BillMapper; import cn.bunny.services.service.financial.BillService; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -22,6 +26,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; /** *

@@ -144,6 +149,41 @@ public class BillServiceImpl extends ServiceImpl implements Bi updateById(bill); } + /** + * 账单收入和支出 + * + * @param dto 请求表单 + * @return 账单收入和支出 + */ + @Override + public ExpendWithIncomeListVo getExpendOrIncome(ExpendWithIncomeDto dto) { + // 判断请求用户id是否为空 + if (dto.getUserId() == null) { + dto.setUserId(BaseContext.getUserId()); + } + + // 查询收入和支出 + List expendWithIncomeList = baseMapper.selectListByExpendWithIncomeDto(dto); + + // 分类列表 + List categoryAmountList = expendWithIncomeList.stream() + .filter(expendWithIncome -> dto.getType() != null && expendWithIncome.getType().equals(dto.getType())) + .collect(Collectors.groupingBy(ExpendWithIncome::getCategoryName, + Collectors.summingDouble(expend -> expend.getAmount().doubleValue())) + ).entrySet() + .stream().map(expendWithIncome -> { + CategoryAmount categoryAmount = new CategoryAmount(); + categoryAmount.setCategoryName(expendWithIncome.getKey()); + categoryAmount.setAmount(expendWithIncome.getValue()); + return categoryAmount; + }).toList(); + + return ExpendWithIncomeListVo.builder() + .categoryAmounts(categoryAmountList) + .list(expendWithIncomeList) + .build(); + } + /** * 删除|批量删除账单信息 * diff --git a/service/src/main/java/cn/bunny/services/service/system/impl/RolePowerServiceImpl.java b/service/src/main/java/cn/bunny/services/service/system/impl/RolePowerServiceImpl.java index 81d384e..0f030a6 100644 --- a/service/src/main/java/cn/bunny/services/service/system/impl/RolePowerServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/system/impl/RolePowerServiceImpl.java @@ -34,6 +34,7 @@ public class RolePowerServiceImpl extends ServiceImpl implements UserLoginLogService { - @Autowired - private UserLoginLogFactory factory; - /** * * 用户登录日志 服务实现类 * @@ -45,7 +40,18 @@ public class UserLoginLogServiceImpl extends ServiceImpl getUserLoginLogList(Page pageParams, UserLoginLogDto dto) { IPage page = baseMapper.selectListByPage(pageParams, dto); - return factory.getUserLoginLogVoPageResult(page); + List voList = page.getRecords().stream().map(userLoginLog -> { + UserLoginLogVo userLoginLogVo = new UserLoginLogVo(); + BeanUtils.copyProperties(userLoginLog, userLoginLogVo); + return userLoginLogVo; + }).toList(); + + return PageResult.builder() + .list(voList) + .pageNo(page.getCurrent()) + .pageSize(page.getSize()) + .total(page.getTotal()) + .build(); } /** diff --git a/service/src/main/java/cn/bunny/services/service/system/impl/UserServiceImpl.java b/service/src/main/java/cn/bunny/services/service/system/impl/UserServiceImpl.java index 74b958b..ba1efd3 100644 --- a/service/src/main/java/cn/bunny/services/service/system/impl/UserServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/system/impl/UserServiceImpl.java @@ -130,7 +130,7 @@ public class UserServiceImpl extends ServiceImpl implemen Long userId = JwtHelper.getUserId(dto.getRefreshToken()); AdminUser adminUser = getOne(Wrappers.lambdaQuery().eq(AdminUser::getId, userId)); - if (adminUser == null) throw new BunnyException(ResultCodeEnum.FAIL_REQUEST_NOT_AUTH); + if (adminUser == null) throw new BunnyException(ResultCodeEnum.USER_IS_EMPTY); if (adminUser.getStatus()) throw new BunnyException(ResultCodeEnum.FAIL_NO_ACCESS_DENIED_USER_LOCKED); LoginVo buildUserVo = userFactory.buildLoginUserVo(adminUser, dto.getReadMeDay()); diff --git a/service/src/main/resources/application-dev.yml b/service/src/main/resources/application-dev.yml index 44504ac..fcd67ad 100644 --- a/service/src/main/resources/application-dev.yml +++ b/service/src/main/resources/application-dev.yml @@ -16,20 +16,20 @@ logging: bunny: master: - host: 192.168.3.98 + host: 192.168.3.129 port: 3304 database: family_financial username: root password: "02120212" redis: - host: 192.168.3.98 + host: 192.168.3.129 port: 6379 database: 6 password: "123456" minio: - endpointUrl: "http://192.168.3.98:9000" + endpointUrl: "http://192.168.3.129:9000" accessKey: bunny secretKey: "02120212" bucket-name: financial diff --git a/service/src/main/resources/mapper/financial/BillMapper.xml b/service/src/main/resources/mapper/financial/BillMapper.xml index 53ca0b5..9cd0db6 100644 --- a/service/src/main/resources/mapper/financial/BillMapper.xml +++ b/service/src/main/resources/mapper/financial/BillMapper.xml @@ -53,6 +53,24 @@ + + + delete