├── env ├── redis │ └── conf ├── mysql │ └── conf └── docker-compose.yml ├── src ├── main │ ├── resources │ │ ├── mapper │ │ │ ├── WechatUser │ │ │ ├── CommonLogMapper.xml │ │ │ ├── RecordBookMapper.xml │ │ │ ├── RecordSysCategoryMapper.xml │ │ │ ├── RecordUserCategoryMapper.xml │ │ │ ├── UserRoleMapper.xml │ │ │ ├── RoleMenuMapper.xml │ │ │ ├── RecordAccountMapper.xml │ │ │ ├── MenuMapper.xml │ │ │ ├── UserMapper.xml │ │ │ └── RoleMapper.xml │ │ ├── application-prod.yml │ │ ├── application.yml │ │ ├── application-dev.yml │ │ └── log4j2.xml │ └── java │ │ └── cn │ │ └── jackbin │ │ └── SimpleRecord │ │ ├── common │ │ ├── aspect │ │ │ └── ResultAspect.java │ │ ├── anotations │ │ │ ├── HandleDict.java │ │ │ ├── LoginRequired.java │ │ │ ├── DictValue.java │ │ │ └── CommonLog.java │ │ ├── enums │ │ │ ├── BusinessStatus.java │ │ │ └── BusinessType.java │ │ ├── LocalUserId.java │ │ ├── LocalUser.java │ │ ├── config │ │ │ ├── datasource │ │ │ │ ├── MybatisConfig.java │ │ │ │ ├── MyMetaObjectHandler.java │ │ │ │ ├── method │ │ │ │ │ ├── DelById.java │ │ │ │ │ ├── SelectOneWithoutLogicDel.java │ │ │ │ │ ├── SelectPageWithoutLogicDel.java │ │ │ │ │ ├── LogicDelWithFillStatus.java │ │ │ │ │ ├── UpdateByIdWithoutLogicDel.java │ │ │ │ │ ├── MethodConstant.java │ │ │ │ │ └── AbstractMethodWrapper.java │ │ │ │ ├── MySqlInjector.java │ │ │ │ └── MyBaseMapper.java │ │ │ ├── interceptor │ │ │ │ └── RemoveThreadLocalInterceptor.java │ │ │ ├── sercurity │ │ │ │ ├── WebMvcConfig.java │ │ │ │ ├── UserDetailsServiceImpl.java │ │ │ │ ├── JWTUser.java │ │ │ │ └── JWTConfig.java │ │ │ ├── redis │ │ │ │ └── RedisConfig.java │ │ │ ├── thread │ │ │ │ └── ThreadPoolConfig.java │ │ │ ├── SwaggerConfiguration.java │ │ │ └── GlobalExceptionHandler.java │ │ └── manager │ │ │ ├── ShutdownManager.java │ │ │ ├── factory │ │ │ └── AsyncFactory.java │ │ │ └── AsyncManager.java │ │ ├── dto │ │ ├── RecordDetailBookSumDTO.java │ │ ├── RecordBookAnalysisDTO.java │ │ ├── SpendCategoryTotalDTO.java │ │ ├── MonthRecordAnalysisDTO.java │ │ ├── RecordAccountAnalysisDTO.java │ │ ├── SpendMonthDetailDTO.java │ │ ├── RoleMenuDTO.java │ │ ├── RecordDetailDTO.java │ │ └── UserRoleDTO.java │ │ ├── service │ │ ├── LoginService.java │ │ ├── CommonLogService.java │ │ ├── RecordSysCategoryService.java │ │ ├── UserRoleService.java │ │ ├── impl │ │ │ ├── CommonLogServiceImpl.java │ │ │ ├── RecordSysCategoryServiceImpl.java │ │ │ ├── UserRoleServiceImpl.java │ │ │ ├── IncomeRecordDetail.java │ │ │ ├── RoleMenuServiceImpl.java │ │ │ ├── RoleServiceImpl.java │ │ │ └── DictItemServiceImpl.java │ │ ├── DictService.java │ │ ├── RecordUserCategoryService.java │ │ ├── RoleMenuService.java │ │ ├── RecordDetailFactory.java │ │ ├── RoleService.java │ │ ├── DictItemService.java │ │ ├── WechatAuthService.java │ │ ├── RecordDetailHandler.java │ │ ├── RecordAccountService.java │ │ ├── UserService.java │ │ ├── MenuService.java │ │ ├── RecordBookService.java │ │ └── RecordDetailService.java │ │ ├── constant │ │ ├── RedisKey.java │ │ ├── SexConstant.java │ │ ├── RoleConstant.java │ │ ├── PermissionConstant.java │ │ ├── Constants.java │ │ ├── UrlConstant.java │ │ ├── CommonConstants.java │ │ ├── MenuConstants.java │ │ ├── RecordConstant.java │ │ └── CodeMsg.java │ │ ├── mapper │ │ ├── CommonLogMapper.java │ │ ├── RecordSysCategoryMapper.java │ │ ├── DictMapper.java │ │ ├── UserRoleMapper.java │ │ ├── RecordBookMapper.java │ │ ├── WechatUserMapper.java │ │ ├── RecordUserCategoryMapper.java │ │ ├── DictItemMapper.java │ │ ├── RoleMenuMapper.java │ │ ├── RecordAccountMapper.java │ │ ├── UserMapper.java │ │ ├── MenuMapper.java │ │ ├── RoleMapper.java │ │ └── RecordDetailMapper.java │ │ ├── vo │ │ ├── GetRecordCategoryVO.java │ │ ├── GetDictItemVO.java │ │ ├── AccountBaseSettingVO.java │ │ ├── QrcodeAuthorizationVO.java │ │ ├── GetDictVO.java │ │ ├── RecordCategoryVO.java │ │ ├── AddRoleVO.java │ │ ├── RoleMenuVO.java │ │ ├── AddDictVO.java │ │ ├── RecordAccountVO.java │ │ ├── AddRecordBookVO.java │ │ ├── AddDictItemVO.java │ │ ├── LoginVO.java │ │ ├── AddUserVO.java │ │ ├── EditRecordBookVO.java │ │ ├── EditDictItemVO.java │ │ ├── EditDictVO.java │ │ ├── EditRoleVO.java │ │ ├── GetMenusVO.java │ │ ├── PageVO.java │ │ ├── AddMenuVO.java │ │ ├── LoginSuccessVO.java │ │ ├── EditUserVO.java │ │ ├── GetUsersVO.java │ │ ├── EditMenuVO.java │ │ ├── GetSixMonthRecordsVO.java │ │ ├── RegisterVO.java │ │ ├── WechatUserVO.java │ │ ├── GetRolesVO.java │ │ ├── GetRecordsByMonthVO.java │ │ ├── RecordDetailVO.java │ │ └── Result.java │ │ ├── bo │ │ ├── QrCodeInfoBO.java │ │ ├── UserMenuBO.java │ │ ├── PageBO.java │ │ ├── RecordDetailBO.java │ │ └── MenuBO.java │ │ ├── SpringbootSimpleRecordApplication.java │ │ ├── controller │ │ ├── basic │ │ │ ├── CommonLogController.java │ │ │ ├── LoginController.java │ │ │ ├── AccountController.java │ │ │ ├── RegisterController.java │ │ │ └── DictItemController.java │ │ ├── auth │ │ │ └── WechatAuthController.java │ │ └── record │ │ │ ├── HomeController.java │ │ │ └── AnalysisController.java │ │ ├── exception │ │ ├── BaseException.java │ │ ├── NotFoundException.java │ │ ├── BusinessException.java │ │ └── ParameterException.java │ │ ├── utils │ │ ├── IDUtil.java │ │ ├── PasswordUtil.java │ │ ├── AddressUtil.java │ │ ├── SpringContextUtil.java │ │ ├── ClassUtil.java │ │ └── ThreadUtil.java │ │ └── entity │ │ ├── WechatUserDO.java │ │ ├── RoleDO.java │ │ ├── RoleMenuDO.java │ │ ├── UserRoleDO.java │ │ ├── DictDO.java │ │ ├── BaseDO.java │ │ ├── DictItemDO.java │ │ ├── SpendCategoryDO.java │ │ ├── RecordBookDO.java │ │ ├── MenuDO.java │ │ ├── RecordAccountDO.java │ │ ├── UserDO.java │ │ ├── RecordSysCategoryDO.java │ │ ├── RecordUserCategoryDO.java │ │ ├── CommonLogDO.java │ │ └── RecordDetailDO.java └── test │ └── java │ └── cn │ └── jackbin │ └── SimpleRecord │ ├── SpringBootSimpleRecordApplicationTest.java │ └── utils │ └── TestUtil.java ├── .gitignore ├── readme.md └── LICENSE /env/redis/conf: -------------------------------------------------------------------------------- 1 | requirepass TEST1234 2 | protected-mode no -------------------------------------------------------------------------------- /env/mysql/conf: -------------------------------------------------------------------------------- 1 | # 设置mysql8的密码认证方式为 2 | default-authentication-plugin=mysql_native_password 3 | lower-case-table-names=1 -------------------------------------------------------------------------------- /src/main/resources/mapper/WechatUser: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/CommonLogMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/RecordBookMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/resources/mapper/RecordSysCategoryMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/aspect/ResultAspect.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.aspect; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: 封装所有请求返回结果的切面类 7 | * @date: 2020/7/23 20:54 8 | **/ 9 | public class ResultAspect { 10 | } 11 | -------------------------------------------------------------------------------- /src/main/resources/mapper/RecordUserCategoryMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/RecordDetailBookSumDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 账本金额合计 7 | */ 8 | @Data 9 | public class RecordDetailBookSumDTO { 10 | private Integer recordBookId; 11 | 12 | private Double amountTotal; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/LoginService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.service 7 | * @date: 2021/4/19 22:22 8 | **/ 9 | public interface LoginService { 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/application-prod.yml: -------------------------------------------------------------------------------- 1 | # 生产环境配置 2 | # 服务端口 3 | server: 4 | port: 5000 5 | # 数据源配置,请修改为你项目的实际配置 6 | spring: 7 | datasource: 8 | url: jdbc:mysql://localhost:3306/jianzhang?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF8 9 | username: root 10 | password: root 11 | driver-class-name: com.mysql.cj.jdbc.Drivere 12 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/RedisKey.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2021/4/22 22:03 8 | **/ 9 | public class RedisKey { 10 | public final static String WECHAT_ACCESS_TOKEN = "wechatAccessToken"; 11 | } 12 | -------------------------------------------------------------------------------- /src/test/java/cn/jackbin/SimpleRecord/SpringBootSimpleRecordApplicationTest.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | public class SpringBootSimpleRecordApplicationTest { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/SexConstant.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2020/8/31 20:24 8 | **/ 9 | public class SexConstant { 10 | public static final int MAN = 1; 11 | 12 | public static final int WOMAN = 2; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/resources/mapper/UserRoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | delete from tb_user_role where user_id = #{userId} 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/RoleConstant.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2021/3/2 20:41 8 | **/ 9 | public class RoleConstant { 10 | public static final String ROOT = "root"; 11 | 12 | public static final String DEFAULT = "default"; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/anotations/HandleDict.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.anotations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: 处理字典 9 | * @date: 2021/8/30 20:32 10 | **/ 11 | @Retention(RetentionPolicy.RUNTIME) 12 | @Target(ElementType.METHOD) 13 | @Documented 14 | public @interface HandleDict { 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/PermissionConstant.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2020/8/20 20:21 8 | **/ 9 | public class PermissionConstant { 10 | 11 | /** 12 | * 权限标识 13 | */ 14 | public static final String PermissionSign = "permissions"; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/CommonLogMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.CommonLogDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | *

8 | * Mapper 接口 9 | *

10 | * 11 | * @author jackbin 12 | * @since 2020-07-21 13 | */ 14 | public interface CommonLogMapper extends BaseMapper { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/CommonLogService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.entity.CommonLogDO; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | /** 7 | *

8 | * 服务类 9 | *

10 | * 11 | * @author jackbin 12 | * @since 2020-07-21 13 | */ 14 | public interface CommonLogService extends IService { 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/anotations/LoginRequired.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.anotations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: 登录校验 9 | * @date: 2020/7/28 20:02 10 | **/ 11 | @Target({ElementType.METHOD}) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Documented 14 | public @interface LoginRequired { 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/GetRecordCategoryVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | /** 7 | * @author: create by bin 8 | * @version: v1.0 9 | * @description: cn.jackbin.SimpleRecord.vo 10 | * @date: 2021/12/29 20:37 11 | **/ 12 | @EqualsAndHashCode(callSuper = true) 13 | @Data 14 | public class GetRecordCategoryVO extends PageVO { 15 | private String recordTypeCode; 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/anotations/DictValue.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.anotations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: 字典注解 9 | * @date: 2021/8/30 19:42 10 | **/ 11 | 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Target(ElementType.FIELD) 14 | @Documented 15 | public @interface DictValue { 16 | 17 | String code(); // 默认值为fieldName 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/RecordBookAnalysisDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RecordBookDO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | @EqualsAndHashCode(callSuper = true) 8 | @Data 9 | public class RecordBookAnalysisDTO extends RecordBookDO { 10 | 11 | // 收入 12 | private Double incomeTotal = 0.0; 13 | 14 | // 收入 15 | private Double expendTotal = 0.0; 16 | } 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/** 5 | !**/src/test/** 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | 30 | ### VS Code ### 31 | .vscode/ 32 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/RecordSysCategoryMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RecordSysCategoryDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | 6 | /** 7 | * @author: create by bin 8 | * @version: v1.0 9 | * @description: cn.jackbin.SimpleRecord.mapper 10 | * @date: 2021/7/13 21:59 11 | **/ 12 | public interface RecordSysCategoryMapper extends BaseMapper { 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/Constants.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2021/4/8 21:39 8 | **/ 9 | public class Constants { 10 | /** 11 | * UTF-8 字符集 12 | */ 13 | public static final String UTF8 = "UTF-8"; 14 | 15 | /** 16 | * GBK 字符集 17 | */ 18 | public static final String GBK = "GBK"; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RecordSysCategoryService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RecordSysCategoryDO; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.service 11 | * @date: 2020/11/23 21:35 12 | **/ 13 | public interface RecordSysCategoryService extends IService { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/UserRoleService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.entity.UserRoleDO; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | *

10 | * 服务类 11 | *

12 | * 13 | * @author jackbin 14 | * @since 2020-07-21 15 | */ 16 | public interface UserRoleService extends IService { 17 | void edit(Integer userId, List roleIds); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/GetDictItemVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.Positive; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.vo 11 | * @date: 2021/8/16 20:22 12 | **/ 13 | @Data 14 | public class GetDictItemVO extends PageVO { 15 | 16 | @Positive(message = "字典Id需为正数") 17 | private Integer dictId; 18 | 19 | private Integer status; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/DictMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.common.config.datasource.MyBaseMapper; 4 | import cn.jackbin.SimpleRecord.entity.DictDO; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.mapper 11 | * @date: 2021/7/20 20:08 12 | **/ 13 | @Repository 14 | public interface DictMapper extends MyBaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/UserRoleMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.UserRoleDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | *

9 | * Mapper 接口 10 | *

11 | * 12 | * @author jackbin 13 | * @since 2020-07-21 14 | */ 15 | @Repository 16 | public interface UserRoleMapper extends BaseMapper { 17 | int deleteByUserId(int userId); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/RecordBookMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RecordBookDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.mapper 11 | * @date: 2021/7/13 21:59 12 | **/ 13 | @Repository 14 | public interface RecordBookMapper extends BaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/WechatUserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.WechatUserDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.mapper 11 | * @date: 2020/11/3 21:31 12 | **/ 13 | @Repository 14 | public interface WechatUserMapper extends BaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/AccountBaseSettingVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.vo 11 | * @date: 2021/3/8 20:27 12 | **/ 13 | @Data 14 | public class AccountBaseSettingVO { 15 | @NotNull(message = "昵称不能为空") 16 | private String nickname; 17 | 18 | @NotNull(message = "性别不能为空") 19 | private Integer sex; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/resources/mapper/RoleMenuMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | delete from tb_role_menu where id in 7 | 8 | #{id} 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/QrcodeAuthorizationVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.vo 11 | * @date: 2021/4/21 20:21 12 | **/ 13 | @Data 14 | public class QrcodeAuthorizationVO { 15 | @NotNull(message = "uuid不能为空") 16 | private String uuid; 17 | 18 | @NotNull(message = "token不能为空") 19 | private String token; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/bo/QrCodeInfoBO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.bo; 2 | 3 | import lombok.Data; 4 | 5 | 6 | /** 7 | * @author: create by bin 8 | * @version: v1.0 9 | * @description: 二维码信息 10 | * @date: 2021/4/19 22:23 11 | **/ 12 | @Data 13 | public class QrCodeInfoBO { 14 | 15 | // 是否已扫描 16 | private Boolean isScanned = false; 17 | 18 | // 是否过期 19 | private Boolean isExpired = false; 20 | 21 | // 扫码登录时间 22 | private String scannedTime; 23 | 24 | // token字符 25 | private String token; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/RecordUserCategoryMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RecordUserCategoryDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.mapper 11 | * @date: 2021/7/13 22:00 12 | **/ 13 | @Repository 14 | public interface RecordUserCategoryMapper extends BaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/SpendCategoryTotalDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import lombok.Builder; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: 花费类别的总额 11 | * @date: 2020/10/15 21:31 12 | **/ 13 | @Data 14 | @Builder 15 | public class SpendCategoryTotalDTO { 16 | 17 | /** 18 | * 花费类别名称 19 | */ 20 | private String recordCategory; 21 | 22 | /** 23 | * 花费总额 24 | */ 25 | private Double total; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/SpringbootSimpleRecordApplication.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord; 2 | 3 | import org.mybatis.spring.annotation.MapperScan; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @SpringBootApplication 8 | @MapperScan("cn.jackbin.SimpleRecord.mapper") 9 | public class SpringbootSimpleRecordApplication { 10 | 11 | public static void main(String[] args) { 12 | SpringApplication.run(SpringbootSimpleRecordApplication.class, args); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/GetDictVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: cn.jackbin.SimpleRecord.vo 9 | * @date: 2021/7/19 21:39 10 | **/ 11 | @Data 12 | public class GetDictVO extends PageVO { 13 | /** 14 | * 字典名称 15 | */ 16 | private String name; 17 | 18 | /** 19 | * 字典编码 20 | */ 21 | private String code; 22 | 23 | /** 24 | * 状态(0:正常,1:停用) 25 | */ 26 | private Integer status; 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/RecordCategoryVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.vo 11 | * @date: 2021/12/29 21:09 12 | **/ 13 | @Data 14 | public class RecordCategoryVO { 15 | @NotBlank(message = "类别编码不能为空") 16 | private String recordTypeCode; 17 | 18 | @NotBlank(message = "类别名称不能为空") 19 | private String name; 20 | 21 | private Integer orderNo; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/controller/basic/CommonLogController.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.controller.basic; 2 | 3 | 4 | import io.swagger.annotations.Api; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | /** 10 | *

11 | * 前端控制器 12 | *

13 | * 14 | * @author jackbin 15 | * @since 2020-07-21 16 | */ 17 | @Api(value = "CommonLogController", tags = { "日志相关接口" }) 18 | @RestController 19 | @RequestMapping("/log") 20 | public class CommonLogController { 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/exception/BaseException.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.exception; 2 | 3 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: cn.jackbin.SimpleRecord.exception 9 | * @date: 2020/7/27 21:16 10 | **/ 11 | public class BaseException extends RuntimeException{ 12 | protected CodeMsg codeMsg; 13 | 14 | public BaseException(String message) { 15 | super(message); 16 | } 17 | 18 | public CodeMsg getCodeMsg() { 19 | return codeMsg; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/DictItemMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.common.config.datasource.MyBaseMapper; 4 | import cn.jackbin.SimpleRecord.entity.DictItemDO; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | import org.springframework.stereotype.Repository; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.mapper 12 | * @date: 2021/8/4 20:09 13 | **/ 14 | @Repository 15 | public interface DictItemMapper extends MyBaseMapper { 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/MonthRecordAnalysisDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.Date; 8 | 9 | /** 10 | * @author: create by bin 11 | * @version: v1.0 12 | * @description: cn.jackbin.SimpleRecord.vo 13 | * @date: 2020/10/28 20:50 14 | **/ 15 | @Data 16 | @NoArgsConstructor 17 | public class MonthRecordAnalysisDTO { 18 | // 月份 19 | private String occurMonth; 20 | 21 | // 总额 22 | private Double total = 0.0; 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/AddRoleVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import lombok.Data; 5 | 6 | import javax.validation.constraints.NotNull; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.vo 12 | * @date: 2020/12/10 20:01 13 | **/ 14 | @ApiModel(value="AddRoleVO对象", description="添加角色对象") 15 | @Data 16 | public class AddRoleVO { 17 | @NotNull(message = "名称不能为空") 18 | public String name; 19 | 20 | @NotNull(message = "描述不能为空") 21 | public String info; 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/RecordAccountAnalysisDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RecordAccountDO; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.NoArgsConstructor; 7 | 8 | @EqualsAndHashCode(callSuper = true) 9 | @Data 10 | @NoArgsConstructor 11 | public class RecordAccountAnalysisDTO extends RecordAccountDO { 12 | 13 | private static final long serialVersionUID = 4810168723585415780L; 14 | // 流入 15 | private Double inflow = 0.0; 16 | 17 | // 流出 18 | private Double outflow = 0.0; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/enums/BusinessStatus.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.enums; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.common.enums 7 | * @date: 2021/4/7 22:37 8 | **/ 9 | public enum BusinessStatus { 10 | /** 11 | * 成功 12 | */ 13 | SUCCESS(0), 14 | 15 | /** 16 | * 失败 17 | */ 18 | FAIL(-1), 19 | ; 20 | 21 | private int code; 22 | 23 | BusinessStatus(int code) { 24 | this.code = code; 25 | } 26 | 27 | public int getCode() { 28 | return code; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/SpendMonthDetailDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | 5 | import java.util.Date; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: 花费月份详情 11 | * @date: 2020/10/27 22:01 12 | **/ 13 | public class SpendMonthDetailDTO { 14 | 15 | @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") 16 | private Date month; 17 | 18 | /** 19 | * 支出总额 20 | */ 21 | private Double expendTotal; 22 | 23 | /** 24 | * 收入总额 25 | */ 26 | private Double incomeTotal; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/UrlConstant.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2020/11/2 20:51 8 | **/ 9 | public class UrlConstant { 10 | public static final String wechatOpenIdUrl = "https://api.weixin.qq.com/sns/jscode2session"; 11 | 12 | public static final String wechatAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token"; 13 | 14 | public static final String wechatMiniAppQrcodeUnlimitedUrl = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/RoleMenuMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RoleDO; 4 | import cn.jackbin.SimpleRecord.entity.RoleMenuDO; 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import java.util.Date; 9 | import java.util.List; 10 | 11 | /** 12 | *

13 | * Mapper 接口 14 | *

15 | * 16 | * @author jackbin 17 | * @since 2020-07-21 18 | */ 19 | @Repository 20 | public interface RoleMenuMapper extends BaseMapper { 21 | 22 | int deleteBatch(List ids); 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/bo/UserMenuBO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.bo; 2 | 3 | import cn.jackbin.SimpleRecord.entity.MenuDO; 4 | import cn.jackbin.SimpleRecord.entity.UserDO; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: user的视图类 14 | * @date: 2020/8/3 20:33 15 | **/ 16 | @Data 17 | @AllArgsConstructor 18 | public class UserMenuBO { 19 | 20 | /** 21 | * 用户类 22 | */ 23 | private UserDO userDO; 24 | 25 | /** 26 | * 权限列表 27 | */ 28 | private List menuDOList; 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/RoleMenuDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | import java.awt.*; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.dto 12 | * @date: 2020/11/24 20:18 13 | **/ 14 | @Data 15 | @NoArgsConstructor 16 | public class RoleMenuDTO { 17 | 18 | /** 19 | * 角色Id 20 | */ 21 | private Long id; 22 | 23 | /** 24 | * 角色名 25 | */ 26 | private String name; 27 | 28 | /** 29 | * 角色信息 30 | */ 31 | private String info; 32 | 33 | private Menu menu; 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/RoleMenuVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import cn.jackbin.SimpleRecord.bo.MenuBO; 4 | import cn.jackbin.SimpleRecord.entity.RoleDO; 5 | import cn.jackbin.SimpleRecord.entity.UserDO; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Data; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.vo 15 | * @date: 2020/11/24 20:41 16 | **/ 17 | @Data 18 | @AllArgsConstructor 19 | public class RoleMenuVO { 20 | private UserDO user; 21 | 22 | private List roles; 23 | 24 | private List menus; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/impl/CommonLogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service.impl; 2 | 3 | import cn.jackbin.SimpleRecord.entity.CommonLogDO; 4 | import cn.jackbin.SimpleRecord.mapper.CommonLogMapper; 5 | import cn.jackbin.SimpleRecord.service.CommonLogService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *

11 | * 服务实现类 12 | *

13 | * 14 | * @author jackbin 15 | * @since 2020-07-21 16 | */ 17 | @Service 18 | public class CommonLogServiceImpl extends ServiceImpl implements CommonLogService { 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/AddDictVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.vo 11 | * @date: 2021/7/21 21:37 12 | **/ 13 | @Data 14 | public class AddDictVO { 15 | /** 16 | * 字典名称 17 | */ 18 | @NotBlank(message = "字典名称不能为空") 19 | private String name; 20 | 21 | /** 22 | * 字典编码 23 | */ 24 | @NotBlank(message = "字典编码不能为空") 25 | private String code; 26 | 27 | private Integer orderNo; 28 | 29 | private String remark; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/exception/NotFoundException.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.exception; 2 | 3 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: cn.jackbin.SimpleRecord.exception 9 | * @date: 2020/7/27 21:08 10 | **/ 11 | public class NotFoundException extends BaseException { 12 | public NotFoundException(String message) { 13 | super(message); 14 | super.codeMsg = CodeMsg.NOT_FIND_DATA; 15 | } 16 | 17 | public NotFoundException(CodeMsg codeMsg,String message) { 18 | super(message); 19 | super.codeMsg = codeMsg; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/RecordAccountVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | import javax.validation.constraints.Positive; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.vo 12 | * @date: 2021/8/25 21:02 13 | **/ 14 | @Data 15 | public class RecordAccountVO { 16 | @Positive(message = "记账账户类型需为正数") 17 | private Integer type; 18 | 19 | @NotNull(message = "名称不能为空") 20 | private String name; 21 | 22 | @NotNull(message = "是否属于尽资产必填") 23 | private Boolean inNetAssets; 24 | 25 | private Integer orderNo; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/RecordDetailDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RecordDetailDO; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.vo 11 | * @date: 2020/10/14 23:02 12 | **/ 13 | @Data 14 | @NoArgsConstructor 15 | public class RecordDetailDTO extends RecordDetailDO { 16 | 17 | private static final long serialVersionUID = -1400861529425999732L; 18 | 19 | private String recordAccountName; 20 | 21 | private String sourceAccountName; 22 | 23 | private String targetAccountName; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/CommonConstants.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2021/7/21 21:42 8 | **/ 9 | public class CommonConstants { 10 | 11 | /** 12 | * 正常 13 | */ 14 | public static final int STATUS_NORMAL = 0; 15 | 16 | /** 17 | * 已删除 18 | */ 19 | public static final int STATUS_DEL = 1; 20 | 21 | /** 22 | * 非系统内置 23 | */ 24 | public static final int NOT_SYS_DEFAULT = 0; 25 | 26 | /** 27 | * 系统内置 28 | */ 29 | public static final int SYS_DEFAULT = 1; 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/AddRecordBookVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import lombok.*; 5 | 6 | import javax.validation.constraints.NotNull; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.vo 12 | * @date: 2021/9/8 19:25 13 | **/ 14 | @Data 15 | public class AddRecordBookVO { 16 | 17 | /** 18 | * 账本名称 19 | */ 20 | @NotNull(message = "账本名称不能为空") 21 | private String name; 22 | 23 | /** 24 | * 备注 25 | */ 26 | private String remark; 27 | 28 | /** 29 | * 排序 30 | */ 31 | private Integer orderNo; 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/RecordAccountMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.common.config.datasource.MyBaseMapper; 4 | import cn.jackbin.SimpleRecord.dto.RecordAccountAnalysisDTO; 5 | import cn.jackbin.SimpleRecord.entity.RecordAccountDO; 6 | import org.springframework.stereotype.Repository; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: cn.jackbin.SimpleRecord.mapper 14 | * @date: 2021/7/13 21:54 15 | **/ 16 | @Repository 17 | public interface RecordAccountMapper extends MyBaseMapper { 18 | List queryInAndOutTotal(Integer userId); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/AddDictItemVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | import javax.validation.constraints.Positive; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.vo 12 | * @date: 2021/8/18 21:16 13 | **/ 14 | @Data 15 | public class AddDictItemVO { 16 | 17 | @Positive(message = "字典ID为整数") 18 | private Integer dictId; 19 | 20 | @NotBlank(message = "字典项文本内容不能为空") 21 | private String text; 22 | 23 | @NotBlank(message = "字典项值不能为空") 24 | private String value; 25 | 26 | private Integer orderNo; 27 | 28 | private String remark; 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.UserDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * Mapper 接口 13 | *

14 | * 15 | * @author jackbin 16 | * @since 2020-07-21 17 | */ 18 | @Repository 19 | public interface UserMapper extends BaseMapper { 20 | int queryTotal(String username, Boolean deleted, Date date); 21 | 22 | List queryByPage(String username, Boolean deleted, Date date, int begin, int end); 23 | 24 | void notDelete(Long id); 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/MenuConstants.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2020/11/25 20:37 8 | **/ 9 | public class MenuConstants { 10 | 11 | /** 12 | * 目录 13 | */ 14 | public static final String M = "M"; 15 | 16 | /** 17 | * 菜单 18 | */ 19 | public static final String C = "C"; 20 | 21 | /** 22 | * 按钮 23 | */ 24 | public static final String F ="F"; 25 | 26 | /** 27 | * 外链 28 | */ 29 | public static final Integer OC = 1; 30 | 31 | /** 32 | * 外链 33 | */ 34 | public static final Integer notOC = 0; 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/LoginVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: cn.jackbin.SimpleRecord.dto 14 | * @date: 2020/7/23 20:58 15 | **/ 16 | @ApiModel(value="LoginDTO对象", description="用户登录对象") 17 | @Data 18 | public class LoginVO { 19 | 20 | @ApiModelProperty(required = true, value = "用户名") 21 | private String username; 22 | 23 | @ApiModelProperty(required = true, value = "密码") 24 | private String password; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/MenuMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.MenuDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: cn.jackbin.SimpleRecord.mapper 14 | * @date: 2020/11/23 21:30 15 | **/ 16 | @Repository 17 | public interface MenuMapper extends BaseMapper { 18 | List queryUserMenus(Long userId); 19 | 20 | List queryAllMenus(); 21 | 22 | List queryRoleMenus(Long roleId); 23 | 24 | void notDelete(Long id); 25 | } 26 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | > 简账的后端 2 | > 基于SpringBoot的Restful风格的接口 3 | > 欢迎Star或者Fork,如有问题可以给我提Issue 4 | 5 | ## 预览 6 | 线上预览地址:[简账](http://jz.jackbin.cn) (账号:root,密码:Abcd1234) 7 | 数据库设计文档(有道云):[数据库设计](http://note.youdao.com/noteshare?id=09422f09d4a680fcd7b179bea4c7ce78&sub=2B6B7FAA29F440548DE6AF68358610D5) 8 | 9 | ## 简账系列教程 10 | - CSDN:[简账系列文章](https://blog.csdn.net/weixin_38500202/category_11027299.html) 11 | - 掘金:[简账系列文章](https://juejin.cn/column/6960993522958729224) 12 | 13 | ## 环境 14 | - JDK:openJDK 11 15 | - SpringBoot:2.3.x 16 | - SpringSecurity:5.3.x 17 | - MySQL:8.0 18 | - JJWT:0.7.0 19 | - mybatisPlus:3.3.x 20 | - knife4j(在线文档):knife4j 21 | 22 | 23 | ## 运行 24 | ```shell 25 | Run SpringbootSimpleRecordApplication 26 | ``` 27 | 28 | ## LICENSE 29 | [MIT](LICENSE) 30 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/AddUserVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | import java.util.List; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.vo 12 | * @date: 2021/2/27 19:22 13 | **/ 14 | @Data 15 | public class AddUserVO { 16 | @NotNull(message = "用户名不能为空") 17 | private String username; 18 | 19 | @NotNull(message = "昵称不能为空") 20 | private String nickname; 21 | 22 | @NotNull(message = "性别不能为空") 23 | private Integer sex; 24 | 25 | private String email; 26 | 27 | @NotNull(message = "密码不能为空") 28 | private String credential; 29 | 30 | private List roles; 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/RoleMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RoleDO; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * Mapper 接口 13 | *

14 | * 15 | * @author jackbin 16 | * @since 2020-07-21 17 | */ 18 | @Repository 19 | public interface RoleMapper extends BaseMapper { 20 | List queryByUserId(Long userId); 21 | 22 | int queryTotal(String name, Boolean deleted, Date date); 23 | 24 | List queryByPage(String name, Boolean deleted, Date date, int begin, int end); 25 | 26 | void notDelete(Long id); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/EditRecordBookVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.vo 11 | * @date: 2021/9/8 19:43 12 | **/ 13 | @Data 14 | public class EditRecordBookVO { 15 | 16 | /** 17 | * 账本名称 18 | */ 19 | @NotNull(message = "账本名称不能为空") 20 | private String name; 21 | 22 | /** 23 | * 备注 24 | */ 25 | private String remark; 26 | 27 | /** 28 | * 是否为用户默认 29 | */ 30 | @NotNull(message = "是否默认账本不能为空") 31 | private Boolean isUserDefault; 32 | 33 | /** 34 | * 排序 35 | */ 36 | private Integer orderNo; 37 | } 38 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | # 主配置文件 2 | # 激活环境配置 3 | spring: 4 | profiles: 5 | active: dev 6 | # 统一请求前缀 7 | server: 8 | servlet: 9 | context-path: /api 10 | tomcat: 11 | max-http-header-size: 8192 12 | 13 | # 日志配置文件(日志配置文件) 14 | logging: 15 | config: classpath:log4j2.xml 16 | 17 | 18 | # jwt相关配置 19 | jwt: 20 | secret: abcdefg1234567 # 加密密钥 21 | expire: 6 # token有效时长(h) 22 | header: token # header 名称 23 | 24 | #mybatis-plus 25 | mybatis-plus: 26 | mapper-locations: classpath:mapper/*.xml 27 | configuration: 28 | log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印将执行的sql语句 29 | global-config: 30 | db-config: 31 | logic-delete-field: delete_time 32 | logic-delete-value: now() # 逻辑已删除值 33 | logic-not-delete-value: 'null' # 逻辑未删除值 34 | 35 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/anotations/CommonLog.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.anotations; 2 | 3 | import cn.jackbin.SimpleRecord.common.enums.BusinessType; 4 | 5 | import java.lang.annotation.*; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: 自定义操作日志记录注解 11 | * @date: 2021/4/3 15:14 12 | **/ 13 | @Target({ ElementType.PARAMETER, ElementType.METHOD }) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | @Documented 16 | public @interface CommonLog { 17 | /** 18 | * 模块 19 | */ 20 | String title() default ""; 21 | 22 | /** 23 | * 业务 24 | */ 25 | BusinessType businessType() default BusinessType.OTHER; 26 | 27 | /** 28 | * 是否保存请求的参数 29 | */ 30 | boolean isSaveRequestData() default true; 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/EditDictItemVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | import javax.validation.constraints.Positive; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.vo 12 | * @date: 2021/8/18 21:26 13 | **/ 14 | @Data 15 | public class EditDictItemVO { 16 | @Positive(message = "主键ID为整数") 17 | private Integer id; 18 | 19 | @Positive(message = "字典ID为整数") 20 | private Integer dictId; 21 | 22 | @NotBlank(message = "字典项文本内容不能为空") 23 | private String text; 24 | 25 | @NotBlank(message = "字典项值不能为空") 26 | private String value; 27 | 28 | private String remark; 29 | 30 | private Integer orderNo; 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/exception/BusinessException.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.exception; 2 | 3 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: cn.jackbin.SimpleRecord.exception 9 | * @date: 2020/8/31 19:41 10 | **/ 11 | public class BusinessException extends BaseException { 12 | public BusinessException(String message) { 13 | super(message); 14 | super.codeMsg = CodeMsg.BUSINESS_ERROR; 15 | } 16 | 17 | public BusinessException(CodeMsg codeMsg,String message) { 18 | super(message); 19 | super.codeMsg = codeMsg; 20 | } 21 | 22 | public BusinessException(CodeMsg codeMsg) { 23 | super(codeMsg.getMessage()); 24 | super.codeMsg = codeMsg; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/exception/ParameterException.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.exception; 2 | 3 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: cn.jackbin.SimpleRecord.exception 9 | * @date: 2020/7/28 19:41 10 | **/ 11 | public class ParameterException extends BaseException { 12 | public ParameterException(String message) { 13 | super(message); 14 | super.codeMsg = CodeMsg.PARAMETER_ILLEGAL; 15 | } 16 | 17 | public ParameterException(CodeMsg codeMsg, String message) { 18 | super(message); 19 | super.codeMsg = codeMsg; 20 | } 21 | 22 | public ParameterException(CodeMsg codeMsg) { 23 | super(codeMsg.getMessage()); 24 | super.codeMsg = codeMsg; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/EditDictVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotNull; 6 | import javax.validation.constraints.Positive; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.vo 12 | * @date: 2021/8/3 20:05 13 | **/ 14 | @Data 15 | public class EditDictVO { 16 | 17 | @Positive(message = "ID为整数") 18 | private Integer id; 19 | 20 | /** 21 | * 字典名称 22 | */ 23 | @NotNull(message = "名称不能为空") 24 | private String name; 25 | 26 | /** 27 | * 字典编码 28 | */ 29 | @NotNull(message = "编码不能为空") 30 | private String code; 31 | 32 | @Positive(message = "排序值需大于0") 33 | private Integer orderNo; 34 | 35 | private String remark; 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/bo/PageBO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.bo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author: create by bin 11 | * @version: v1.0 12 | * @description: 分页返回封装类 13 | * @date: 2020/12/7 20:45 14 | **/ 15 | @Data 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | public class PageBO { 19 | 20 | public PageBO(int pageNo, int pageSize) { 21 | this.pageNo = pageNo; 22 | this.pageSize = pageSize; 23 | } 24 | 25 | List list; 26 | 27 | // 页数 28 | int pageNo; 29 | 30 | // 分页大小 31 | int pageSize; 32 | 33 | // 总数 34 | int total; 35 | 36 | public int beginPosition() { 37 | return (pageNo -1) * pageSize; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/LocalUserId.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.common 7 | * @date: 2020/11/23 20:21 8 | **/ 9 | public class LocalUserId { 10 | private static final ThreadLocal local = new ThreadLocal<>(); 11 | 12 | /** 13 | * 得到当前登录用户Id 14 | * 15 | * @return userId | null 16 | */ 17 | public static Long get() { 18 | return LocalUserId.local.get(); 19 | } 20 | 21 | /** 22 | * 设置登录用户Id 23 | */ 24 | public static void set(Long userId) { 25 | LocalUserId.local.set(userId); 26 | } 27 | 28 | /** 29 | * 清理当前用户Id 30 | */ 31 | public static void clear() { 32 | LocalUserId.local.remove(); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/utils/IDUtil.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.utils; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: cn.jackbin.SimpleRecord.utils 9 | * @date: 2021/4/26 23:38 10 | **/ 11 | public class IDUtil { 12 | /** 13 | * 32位不带"-" 14 | */ 15 | public static String randomUUID(){ 16 | // 生成36位带-uuid 17 | String uuidOld = UUID.randomUUID().toString(); 18 | // 去掉- 19 | String uuid = 20 | (uuidOld.substring(0,8)) + 21 | (uuidOld.substring(9,13)) + 22 | (uuidOld.substring(14,18)) + 23 | (uuidOld.substring(19,23)) + 24 | (uuidOld.substring(24,36)); 25 | return uuid; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | # 开发环境配置 2 | # 服务端口 3 | server: 4 | port: 5000 5 | # 数据源配置,请修改为你项目的实际配置 6 | spring: 7 | datasource: 8 | url: jdbc:mysql://localhost:3306/jianzhang?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=UTF8 9 | username: root 10 | password: root 11 | driver-class-name: com.mysql.cj.jdbc.Driver 12 | type: com.alibaba.druid.pool.DruidDataSource 13 | 14 | #配置redis 15 | redis: 16 | database: 0 # Redis数据库索引(默认为0) 17 | host: localhost 18 | port: 6379 19 | password: TEST1234 20 | lettuce: 21 | pool: 22 | max-active: 8 # 连接池最大连接数(使用负值表示没有限制) 默认 8 23 | max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1 24 | max-idle: 0 # 连接池中的最小空闲连接 默认 0 25 | min-idle: 0 # 连接池中的最小空闲连接 默认 0 26 | 27 | wechat: 28 | appId: wx34xxxasdf123 29 | appSecret: sdaf1234234saffgd -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/EditRoleVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Positive; 9 | import java.util.List; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.vo 15 | * @date: 2020/12/16 20:17 16 | **/ 17 | @ApiModel(value="EditRoleVO对象", description="编辑角色对象") 18 | @Data 19 | @NoArgsConstructor 20 | public class EditRoleVO { 21 | 22 | @Positive(message = "角色Id为正数") 23 | private Long id; 24 | 25 | @NotNull(message = "角色名不能为空") 26 | private String name; 27 | 28 | @NotNull(message = "角色信息不能为空") 29 | private String info; 30 | 31 | List menuIds; 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/DictService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.bo.PageBO; 4 | import cn.jackbin.SimpleRecord.entity.DictDO; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.service 11 | * @date: 2021/7/20 20:06 12 | **/ 13 | public interface DictService extends IService { 14 | void getByPage(String name, String code, Integer status, PageBO pageBO); 15 | 16 | void add(String name, String code, Integer orderNo, String remark); 17 | 18 | void edit(Integer id, String name, String code, Integer orderNo, String remark); 19 | 20 | DictDO getByCode(String code); 21 | 22 | boolean removeById(Long id); 23 | 24 | void reset(Integer id); 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/impl/RecordSysCategoryServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service.impl; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RecordSysCategoryDO; 4 | import cn.jackbin.SimpleRecord.mapper.RecordSysCategoryMapper; 5 | import cn.jackbin.SimpleRecord.service.RecordSysCategoryService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * @author: create by bin 14 | * @version: v1.0 15 | * @description: cn.jackbin.SimpleRecord.service.impl 16 | * @date: 2021/7/13 22:04 17 | **/ 18 | @Service 19 | public class RecordSysCategoryServiceImpl extends ServiceImpl implements RecordSysCategoryService { 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/GetMenusVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | 8 | import java.util.Date; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: cn.jackbin.SimpleRecord.vo 14 | * @date: 2020/12/24 20:36 15 | **/ 16 | @ApiModel(value="GetMenusVO对象", description="分页获取菜单列表对象") 17 | @Data 18 | public class GetMenusVO { 19 | @ApiModelProperty(value = "标题") 20 | private String title; 21 | 22 | @ApiModelProperty(value = "状态") 23 | private Boolean deleted; 24 | 25 | @ApiModelProperty(required = true, value = "年月日(yyyy-MM-dd)") 26 | @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") 27 | private Date date; 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/LocalUser.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common; 2 | 3 | import cn.jackbin.SimpleRecord.entity.UserDO; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: 线程安全的当前登录用户,如果用户为登录,则得到 null 9 | * @date: 2020/7/28 21:17 10 | **/ 11 | public class LocalUser { 12 | private static final ThreadLocal local = new ThreadLocal<>(); 13 | 14 | /** 15 | * 得到当前登录用户 16 | * 17 | * @return user | null 18 | */ 19 | public static UserDO get() { 20 | return LocalUser.local.get(); 21 | } 22 | 23 | /** 24 | * 设置登录用户 25 | */ 26 | public static void set(UserDO user) { 27 | LocalUser.local.set(user); 28 | } 29 | 30 | /** 31 | * 清理当前用户 32 | */ 33 | public static void clear() { 34 | LocalUser.local.remove(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RecordUserCategoryService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.bo.PageBO; 4 | import cn.jackbin.SimpleRecord.entity.RecordUserCategoryDO; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author: create by bin 11 | * @version: v1.0 12 | * @description: cn.jackbin.SimpleRecord.service 13 | * @date: 2020/11/23 21:35 14 | **/ 15 | public interface RecordUserCategoryService extends IService { 16 | 17 | List getList(Integer userId); 18 | 19 | void getByPage(Integer userId, String recordTypeCode, PageBO pageBO); 20 | 21 | void reset(Integer userId); 22 | 23 | void saveOrUpdate(Long id, Integer userId, String recordTypeCode, String name, Integer orderNo); 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/PageVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | import javax.validation.constraints.Positive; 8 | import javax.validation.constraints.PositiveOrZero; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: cn.jackbin.SimpleRecord.dto 14 | * @date: 2020/9/8 20:41 15 | **/ 16 | @ApiModel(value="PageVO对象", description="分页对象") 17 | @Data 18 | public class PageVO { 19 | /** 20 | * 分页的索引 21 | */ 22 | @ApiModelProperty(required = true, value = "分页的索引") 23 | @Positive(message = "当前页数须为正数") 24 | int pageNo; 25 | 26 | /** 27 | * 分页的大小 28 | */ 29 | @ApiModelProperty(required = true, value = "分页的大小") 30 | @Positive(message = "分页的大小须为正数") 31 | int pageSize; 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/bo/RecordDetailBO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.bo; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | import java.util.Date; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.bo 12 | * @date: 2021/10/26 21:32 13 | **/ 14 | @Data 15 | @NoArgsConstructor 16 | public class RecordDetailBO { 17 | private Long id; 18 | 19 | private Integer sourceAccountId; 20 | 21 | private Integer targetAccountId; 22 | 23 | private Integer recordBookId; 24 | 25 | private String recordTypeCode; 26 | 27 | private Integer recordTypeId; 28 | 29 | private String recordCategory; 30 | 31 | private Double amount; 32 | 33 | private Date occurTime; 34 | 35 | private Integer recoverableStatus; 36 | 37 | private String tag; 38 | 39 | private String remark; 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/AddMenuVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | import javax.validation.constraints.NotNull; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.vo 12 | * @date: 2020/12/29 20:02 13 | **/ 14 | @Data 15 | @NoArgsConstructor 16 | public class AddMenuVO { 17 | 18 | @NotNull(message = "菜单标题不能为空") 19 | private String menuTitle; 20 | 21 | @NotNull(message = "菜单名称不能为空") 22 | private String menuName; 23 | 24 | private Integer parentId; 25 | 26 | private Integer orderNo; 27 | 28 | private String path; 29 | 30 | private String component; 31 | 32 | private Boolean isOuterChain; 33 | 34 | private String menuType; 35 | 36 | private String permissionSign; 37 | 38 | private String iconName; 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RoleMenuService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RoleMenuDO; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import org.springframework.transaction.annotation.Transactional; 6 | 7 | import java.io.Serializable; 8 | import java.util.Collection; 9 | import java.util.List; 10 | 11 | /** 12 | *

13 | * 服务类 14 | *

15 | * 16 | * @author jackbin 17 | * @since 2020-07-21 18 | */ 19 | public interface RoleMenuService extends IService { 20 | List getByRoleId(int id); 21 | 22 | /** 23 | * 删除角色权限 24 | */ 25 | void removeByRoleId(Integer roleId); 26 | 27 | /** 28 | * 批量删除 29 | */ 30 | int removeByIds(List ids); 31 | 32 | /** 33 | * 编辑角色的菜单 34 | */ 35 | void edit(Integer roleId, List menuIds); 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/LoginSuccessVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author: create by bin 7 | * @version: v1.0 8 | * @description: cn.jackbin.SimpleRecord.dto 9 | * @date: 2020/9/14 21:43 10 | **/ 11 | @Data 12 | public class LoginSuccessVO { 13 | 14 | private Long id; 15 | 16 | /** 17 | * 用户名,唯一 18 | */ 19 | private String username; 20 | 21 | /** 22 | * 用户昵称 23 | */ 24 | private String nickname; 25 | 26 | /** 27 | * 性别 28 | */ 29 | private Integer sex; 30 | 31 | /** 32 | * 头像url 33 | */ 34 | private String avatarUrl; 35 | 36 | /** 37 | * 邮箱 38 | */ 39 | private String email; 40 | 41 | /** 42 | * token字符串 43 | */ 44 | private String token; 45 | 46 | /** 47 | * 微信登录的openId 48 | */ 49 | private String openId; 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/WechatUserDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.*; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.entity 12 | * @date: 2020/11/3 21:32 13 | **/ 14 | @Data 15 | @Builder 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | @EqualsAndHashCode(callSuper = false) 19 | @TableName("tb_wechat_user") 20 | public class WechatUserDO { 21 | private static final long serialVersionUID = 1L; 22 | 23 | @TableId(value = "id", type = IdType.AUTO) 24 | private Long id; 25 | 26 | /** 27 | * 用户id 28 | */ 29 | private Long userId; 30 | 31 | /** 32 | * 微信openId 33 | */ 34 | private String openId; 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/EditUserVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.validation.constraints.NotNull; 8 | import javax.validation.constraints.Positive; 9 | import java.util.List; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.vo 15 | * @date: 2021/2/19 20:24 16 | **/ 17 | @ApiModel(value="EditUserVO对象", description="编辑用户对象") 18 | @Data 19 | @NoArgsConstructor 20 | public class EditUserVO { 21 | @Positive(message = "用户Id为正数") 22 | private Integer id; 23 | 24 | @NotNull(message = "昵称不能为空") 25 | private String nickname; 26 | 27 | @NotNull(message = "性别不能为空") 28 | private Integer sex; 29 | 30 | @NotNull(message = "邮箱不能为空") 31 | private String email; 32 | 33 | private List roles; 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RecordDetailFactory.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.beans.factory.annotation.Qualifier; 5 | import org.springframework.stereotype.Component; 6 | 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: cn.jackbin.SimpleRecord.service 14 | * @date: 2021/10/8 21:09 15 | **/ 16 | @Component 17 | public class RecordDetailFactory { 18 | 19 | static Map map = new HashMap<>(); // 容器池子 20 | 21 | /** 22 | * 获取记账的处理类 23 | */ 24 | public RecordDetailHandler getHandler(String code) { 25 | return map.get(code); 26 | } 27 | 28 | public void addHandler(String code, RecordDetailHandler handler) { 29 | map.put(code, handler); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/GetUsersVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | 8 | import javax.validation.constraints.Positive; 9 | import java.util.Date; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.vo 15 | * @date: 2020/12/7 21:00 16 | **/ 17 | @ApiModel(value="GetUserVO对象", description="分页获取用户列表对象") 18 | @Data 19 | public class GetUsersVO extends PageVO { 20 | 21 | @ApiModelProperty(value = "用户名") 22 | private String username; 23 | 24 | @ApiModelProperty(value = "状态") 25 | private Boolean deleted; 26 | 27 | @ApiModelProperty(required = true, value = "年月日(yyyy-MM-dd)") 28 | @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") 29 | private Date date; 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/dto/UserRoleDTO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.dto; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RoleDO; 4 | import cn.jackbin.SimpleRecord.entity.UserRoleDO; 5 | import lombok.Data; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author: create by bin 11 | * @version: v1.0 12 | * @description: cn.jackbin.SimpleRecord.dto 13 | * @date: 2021/2/4 20:33 14 | **/ 15 | @Data 16 | public class UserRoleDTO { 17 | private Long id; 18 | 19 | /** 20 | * 用户名,唯一 21 | */ 22 | private String username; 23 | 24 | /** 25 | * 用户昵称 26 | */ 27 | private String nickname; 28 | 29 | /** 30 | * 性别 31 | */ 32 | private Integer sex; 33 | 34 | /** 35 | * 头像url 36 | */ 37 | private String avatarUrl; 38 | 39 | /** 40 | * 邮箱 41 | */ 42 | private String email; 43 | 44 | List ownedRoles; 45 | 46 | List allRoles; 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RoleService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.bo.PageBO; 4 | import cn.jackbin.SimpleRecord.entity.RoleDO; 5 | import cn.jackbin.SimpleRecord.vo.EditRoleVO; 6 | import com.baomidou.mybatisplus.extension.service.IService; 7 | 8 | import java.util.Date; 9 | import java.util.List; 10 | 11 | /** 12 | *

13 | * 服务类 14 | *

15 | * 16 | * @author jackbin 17 | * @since 2020-07-21 18 | */ 19 | public interface RoleService extends IService { 20 | 21 | List getByUserId(Long userId); 22 | 23 | List getRoles(); 24 | 25 | void getByPage(String name, Boolean deleted, Date date, PageBO pageBO); 26 | 27 | boolean add(String name, String info); 28 | 29 | void edit(Long id, String name, String info, List menuIds); 30 | 31 | void reset(Integer id); 32 | 33 | RoleDO getByName(String name); 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/RoleDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.baomidou.mybatisplus.annotation.IdType; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import com.baomidou.mybatisplus.annotation.TableName; 8 | import lombok.*; 9 | 10 | /** 11 | *

12 | * 13 | *

14 | * 15 | * @author jackbin 16 | * @since 2020-07-21 17 | */ 18 | @Data 19 | @Builder 20 | @NoArgsConstructor 21 | @AllArgsConstructor 22 | @EqualsAndHashCode(callSuper = false) 23 | @TableName("tb_role") 24 | public class RoleDO extends BaseDO implements Serializable { 25 | 26 | private static final long serialVersionUID = 1L; 27 | 28 | @TableId(value = "id", type = IdType.AUTO) 29 | private Long id; 30 | 31 | /** 32 | * 角色名称,例如:root 33 | */ 34 | private String name; 35 | 36 | /** 37 | * 角色信息:例如:超级用户 38 | */ 39 | private String info; 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/DictItemService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.bo.PageBO; 4 | import cn.jackbin.SimpleRecord.entity.DictItemDO; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author: create by bin 11 | * @version: v1.0 12 | * @description: cn.jackbin.SimpleRecord.service 13 | * @date: 2021/8/4 20:07 14 | **/ 15 | public interface DictItemService extends IService { 16 | List getDictItemsByDictId(Integer dictId); 17 | 18 | void getByPage(Integer dictId, PageBO pageBO); 19 | 20 | void add(Integer dictId, String text, String value, Integer orderNo, String remark); 21 | 22 | void edit(Integer id, String text, String value, Integer orderNo, String remark); 23 | 24 | void removeById(Long id); 25 | 26 | DictItemDO getByValue(Integer dictId, String value); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/WechatAuthService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.entity.WechatUserDO; 4 | import cn.jackbin.SimpleRecord.vo.LoginSuccessVO; 5 | import cn.jackbin.SimpleRecord.vo.WechatUserVO; 6 | import com.baomidou.mybatisplus.extension.service.IService; 7 | 8 | import java.awt.image.BufferedImage; 9 | import java.io.IOException; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.service 15 | * @date: 2020/11/3 21:33 16 | **/ 17 | public interface WechatAuthService extends IService { 18 | 19 | WechatUserDO getByOpenId(String openId); 20 | 21 | LoginSuccessVO wechatLogin(WechatUserVO vo); 22 | 23 | /** 24 | * 获取接口凭证 25 | */ 26 | String getAccessToken(); 27 | 28 | /** 29 | * 获取小程序码 30 | */ 31 | byte[] getMiniAppQrcode(String accessToken, String scene, String pagePath) throws IOException; 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/MybatisConfig.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.transaction.annotation.EnableTransactionManagement; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.common.config 12 | * @date: 2020/7/21 21:15 13 | **/ 14 | @EnableTransactionManagement 15 | @Configuration 16 | public class MybatisConfig { 17 | /**mybatis-plus 分页插件*/ 18 | @Bean 19 | public PaginationInterceptor paginationInterceptor() { 20 | return new PaginationInterceptor(); 21 | } 22 | 23 | /** 24 | * 自定义sql注入器 25 | */ 26 | @Bean 27 | public MySqlInjector mySqlInjector(){ 28 | return new MySqlInjector(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/controller/basic/LoginController.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.controller.basic; 2 | 3 | import cn.jackbin.SimpleRecord.vo.LoginVO; 4 | import cn.jackbin.SimpleRecord.vo.Result; 5 | import io.swagger.annotations.Api; 6 | import io.swagger.annotations.ApiOperation; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.web.bind.annotation.PostMapping; 9 | import org.springframework.web.bind.annotation.RequestBody; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | 12 | /** 13 | * @author: create by bin 14 | * @version: v1.0 15 | * @description: 此类仅用于生成Swagger接口信息,并无实际用处 16 | * @date: 2021/2/1 20:48 17 | **/ 18 | @Api(value = "LoginController", tags = { "用户登录接口" }) 19 | @RequestMapping(value = "/") 20 | public class LoginController { 21 | 22 | @ApiOperation(value = "用户登录") 23 | @PostMapping("user/login") 24 | public Result userLogin(@RequestBody LoginVO dto) { 25 | return Result.success(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/EditMenuVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | import javax.validation.constraints.NotNull; 7 | import javax.validation.constraints.Positive; 8 | 9 | /** 10 | * @author: create by bin 11 | * @version: v1.0 12 | * @description: cn.jackbin.SimpleRecord.vo 13 | * @date: 2020/12/29 20:02 14 | **/ 15 | @Data 16 | @NoArgsConstructor 17 | public class EditMenuVO { 18 | 19 | @Positive(message = "id为正数") 20 | private Integer id; 21 | 22 | @NotNull(message = "菜单标题不能为空") 23 | private String menuTitle; 24 | 25 | @NotNull(message = "菜单名称不能为空") 26 | private String menuName; 27 | 28 | private Integer parentId; 29 | 30 | private Integer orderNo; 31 | 32 | private String path; 33 | 34 | private String component; 35 | 36 | private Boolean isOuterChain; 37 | 38 | private String menuType; 39 | 40 | private String permissionSign; 41 | 42 | private String iconName; 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/interceptor/RemoveThreadLocalInterceptor.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.interceptor; 2 | 3 | import cn.jackbin.SimpleRecord.common.LocalUser; 4 | import cn.jackbin.SimpleRecord.common.LocalUserId; 5 | import org.springframework.web.method.HandlerMethod; 6 | import org.springframework.web.servlet.AsyncHandlerInterceptor; 7 | 8 | import javax.servlet.http.HttpServletRequest; 9 | import javax.servlet.http.HttpServletResponse; 10 | 11 | /** 12 | * 拦截器:用于异步移除存储在ThreadLocal中的值 13 | */ 14 | public class RemoveThreadLocalInterceptor implements AsyncHandlerInterceptor 15 | { 16 | @Override 17 | public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 18 | { 19 | // do nothing 20 | return true; 21 | } 22 | 23 | @Override 24 | public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { 25 | LocalUser.clear(); 26 | LocalUserId.clear(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RecordDetailHandler.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.bo.RecordDetailBO; 4 | import cn.jackbin.SimpleRecord.entity.RecordDetailDO; 5 | import org.springframework.transaction.annotation.Transactional; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: 记账处理 11 | * @date: 2021/9/29 23:06 12 | **/ 13 | public interface RecordDetailHandler { 14 | 15 | String EXPEND_TYPE = "expendType"; // 支出 16 | String INCOME_TYPE = "incomeType"; // 收入 17 | String TRANSFER_TYPE = "transferType"; // 转账 18 | String LOAN_TYPE = "loanType"; // 借贷 19 | 20 | /** 21 | * 记一笔 22 | */ 23 | void handleAdd(Integer userId, RecordDetailBO recordDetailBO); 24 | 25 | /** 26 | * 更新记账记录 27 | */ 28 | void handleUpdate(RecordDetailBO recordDetailBO); 29 | 30 | /** 31 | * 删除一条记录 32 | */ 33 | void handleDel(RecordDetailDO recordDetailDO); 34 | 35 | void check(Integer userId, RecordDetailBO recordDetailBO); 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/MyMetaObjectHandler.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource; 2 | 3 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.ibatis.reflection.MetaObject; 6 | import org.springframework.stereotype.Component; 7 | import java.util.Date; 8 | 9 | /** 10 | * @author: create by bin 11 | * @version: v1.0 12 | * @description: cn.jackbin.SimpleRecord.common.config 13 | * @date: 2020/9/9 19:46 14 | **/ 15 | @Slf4j 16 | @Component 17 | public class MyMetaObjectHandler implements MetaObjectHandler { 18 | @Override 19 | public void insertFill(MetaObject metaObject) { 20 | log.info("start insert fill ...."); 21 | this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); 22 | } 23 | 24 | @Override 25 | public void updateFill(MetaObject metaObject) { 26 | log.info("start update fill ...."); 27 | this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/manager/ShutdownManager.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.manager; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.stereotype.Component; 5 | 6 | import javax.annotation.PreDestroy; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.common.manager 12 | * @date: 2021/4/8 21:31 13 | **/ 14 | @Slf4j 15 | @Component 16 | public class ShutdownManager { 17 | 18 | /** 19 | * 实例在容器销毁前调用 20 | */ 21 | @PreDestroy 22 | public void destroy() 23 | { 24 | shutdownAsyncManager(); 25 | } 26 | 27 | /** 28 | * 停止异步执行任务 29 | */ 30 | private void shutdownAsyncManager() 31 | { 32 | try 33 | { 34 | log.info("====关闭后台任务任务线程池===="); 35 | if (AsyncManager.me() != null) { 36 | AsyncManager.me().shutdown(); 37 | } 38 | } 39 | catch (Exception e) 40 | { 41 | log.error(e.getMessage(), e); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/sercurity/WebMvcConfig.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.sercurity; 2 | 3 | import cn.jackbin.SimpleRecord.common.config.interceptor.RemoveThreadLocalInterceptor; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.web.servlet.config.annotation.InterceptorRegistry; 6 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: 拦截器配置 12 | * @date: 2022/2/23 21:45 13 | **/ 14 | @Configuration 15 | public class WebMvcConfig implements WebMvcConfigurer { 16 | /** 不需要拦截地址 */ 17 | public static final String[] excludeUrls = { "/login/**", "/register/**", "/qrcode/**", "/wx/**"}; 18 | 19 | @Override 20 | public void addInterceptors(InterceptorRegistry registry) { 21 | registry.addInterceptor(new RemoveThreadLocalInterceptor()) 22 | .addPathPatterns("/**") 23 | .excludePathPatterns(excludeUrls) 24 | .order(-10); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/manager/factory/AsyncFactory.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.manager.factory; 2 | 3 | import cn.jackbin.SimpleRecord.entity.CommonLogDO; 4 | import cn.jackbin.SimpleRecord.service.CommonLogService; 5 | import cn.jackbin.SimpleRecord.utils.AddressUtil; 6 | import cn.jackbin.SimpleRecord.utils.SpringContextUtil; 7 | 8 | import java.util.TimerTask; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: 异步工厂类 14 | * @date: 2021/4/8 21:33 15 | **/ 16 | public class AsyncFactory { 17 | 18 | /** 19 | * 操作日志记录 20 | * @param logDO 日志信息 21 | * @return 任务task 22 | */ 23 | public static TimerTask recordCommonLog(final CommonLogDO logDO) { 24 | return new TimerTask() { 25 | @Override 26 | public void run() { 27 | // 远程查询操作地点 28 | logDO.setOperAddress(AddressUtil.getRealAddressByIP(logDO.getOperIp())); 29 | SpringContextUtil.getBean(CommonLogService.class).save(logDO); 30 | } 31 | }; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /env/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | # redis容器 4 | redis: 5 | image: redis:5.0 6 | container_name: redis 7 | restart: always 8 | # 以配置文件的方式启动 redis.conf 9 | command: redis-server /etc/redis/redis.conf 10 | ports: 11 | - 6379:6379 12 | volumes: 13 | - ./redis/data:/data 14 | - ./redis/conf:/etc/redis/redis.conf 15 | - ./redis/logs:/logs 16 | 17 | # mysql容器 18 | mysql: 19 | image: mysql:8.0 20 | container_name: mysql 21 | command: 22 | # MySQL8的密码验证方式默认是 caching_sha2_password,但是很多的连接工具还不支持该方式 23 | # 就需要手动设置下mysql的密码认证方式为以前的 mysql_native_password 方式 24 | --default-authentication-plugin=mysql_native_password 25 | --character-set-server=utf8mb4 26 | --collation-server=utf8mb4_general_ci 27 | # docker的重启策略 28 | restart: always 29 | environment: 30 | MYSQL_ROOT_PASSWORD: root # root用户的密码 31 | ports: 32 | - 3306:3306 33 | volumes: 34 | - ./mysql/data:/var/lib/mysql 35 | # 数据库还原目录 36 | - ./mysql/source:/docker-entrypoint-initdb.d 37 | - ./mysql/logs:/logs -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/RoleMenuDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.baomidou.mybatisplus.annotation.IdType; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import com.baomidou.mybatisplus.annotation.TableName; 8 | import lombok.*; 9 | 10 | /** 11 | *

12 | * 13 | *

14 | * 15 | * @author jackbin 16 | * @since 2020-07-21 17 | */ 18 | @Data 19 | @Builder 20 | @NoArgsConstructor 21 | @AllArgsConstructor 22 | @EqualsAndHashCode(callSuper = false) 23 | @TableName("tb_role_menu") 24 | public class RoleMenuDO extends BaseDO implements Serializable { 25 | 26 | private static final long serialVersionUID = 1L; 27 | 28 | @TableId(value = "id", type = IdType.AUTO) 29 | private Long id; 30 | 31 | /** 32 | * 角色id 33 | */ 34 | private Integer roleId; 35 | 36 | /** 37 | * 菜单id 38 | */ 39 | private Integer menuId; 40 | 41 | public RoleMenuDO(Integer roleId, Integer menuId) { 42 | this.roleId = roleId; 43 | this.menuId = menuId; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/UserRoleDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.baomidou.mybatisplus.annotation.IdType; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import com.baomidou.mybatisplus.annotation.TableName; 8 | import lombok.*; 9 | 10 | /** 11 | *

12 | * 13 | *

14 | * 15 | * @author jackbin 16 | * @since 2020-07-21 17 | */ 18 | @Data 19 | @Builder 20 | @NoArgsConstructor 21 | @AllArgsConstructor 22 | @EqualsAndHashCode(callSuper = false) 23 | @TableName("tb_user_role") 24 | public class UserRoleDO extends BaseDO implements Serializable { 25 | 26 | private static final long serialVersionUID = 1L; 27 | 28 | public UserRoleDO(Integer userId, Integer roleId) { 29 | this.userId = userId; 30 | this.roleId = roleId; 31 | } 32 | 33 | @TableId(value = "id", type = IdType.AUTO) 34 | private Long id; 35 | 36 | /** 37 | * 用户id 38 | */ 39 | private Integer userId; 40 | 41 | /** 42 | * 角色id 43 | */ 44 | private Integer roleId; 45 | 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RecordAccountService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.dto.RecordAccountAnalysisDTO; 4 | import cn.jackbin.SimpleRecord.entity.RecordAccountDO; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author: create by bin 11 | * @version: v1.0 12 | * @description: cn.jackbin.SimpleRecord.service 13 | * @date: 2020/11/23 21:35 14 | **/ 15 | public interface RecordAccountService extends IService { 16 | 17 | List getListByUserId(Integer userId); 18 | 19 | void add(Integer userId, Integer type, String name, Integer inNetAssets, Integer orderNo); 20 | 21 | void update(Long id, Integer type, String name, Integer inNetAssets, Integer orderNo); 22 | 23 | /** 24 | * 获取各账户的流入流出金额 25 | */ 26 | List analysisAccounts(Integer userId); 27 | 28 | RecordAccountDO getByName(Integer userId, String name); 29 | 30 | /** 31 | * 记账账户初始化 32 | */ 33 | void init(Integer userId); 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/method/DelById.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource.method; 2 | 3 | import com.baomidou.mybatisplus.core.enums.SqlMethod; 4 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 5 | import org.apache.ibatis.mapping.MappedStatement; 6 | import org.apache.ibatis.mapping.SqlSource; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.common.config.datasource.method 12 | * @date: 2021/8/18 21:33 13 | **/ 14 | public class DelById extends AbstractMethodWrapper { 15 | @Override 16 | public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { 17 | String sql = String.format(MethodConstant.DEL_BY_ID.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(), 18 | tableInfo.getKeyProperty()); 19 | SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class); 20 | return this.addDeleteMappedStatement(mapperClass, MethodConstant.DEL_BY_ID.getMethod(), sqlSource); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 BinBinWang 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/GetSixMonthRecordsVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotNull; 10 | import javax.validation.constraints.Positive; 11 | import javax.validation.constraints.PositiveOrZero; 12 | import java.util.Date; 13 | 14 | /** 15 | * @author: create by bin 16 | * @version: v1.0 17 | * @description: cn.jackbin.SimpleRecord.dto 18 | * @date: 2020/10/14 23:14 19 | **/ 20 | @ApiModel(value="GetSixMonthRecordsVO对象", description="获取记账记录对象") 21 | @Data 22 | @NoArgsConstructor 23 | public class GetSixMonthRecordsVO { 24 | 25 | @ApiModelProperty(required = true, value = "年月(yyyy-MM)") 26 | @JsonFormat(pattern="yyyy-MM",timezone = "GMT+8") 27 | private Date beginDate; 28 | 29 | @ApiModelProperty(required = true, value = "记录类型编码(支出:expendType;收入:incomeType)") 30 | @NotNull(message = "记录类型编码不能为空") 31 | private String recordTypeCode; 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/DictDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.*; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: 字典表 12 | * @date: 2021/7/13 20:35 13 | **/ 14 | @Data 15 | @Builder 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | @EqualsAndHashCode(callSuper = false) 19 | @TableName("tb_dict") 20 | public class DictDO extends BaseDO implements Serializable { 21 | 22 | private static final long serialVersionUID = 3248158042590482689L; 23 | 24 | @TableId(value = "id", type = IdType.AUTO) 25 | private Long id; 26 | 27 | /** 28 | * 字典名称 29 | */ 30 | private String name; 31 | 32 | /** 33 | * 字典编码 34 | */ 35 | private String code; 36 | 37 | /** 38 | * 状态(0:正常,1:停用) 39 | */ 40 | private Integer status; 41 | 42 | /** 43 | * 是否系统内置 44 | */ 45 | private Integer isSysDefault; 46 | 47 | /** 48 | * 排序 49 | */ 50 | private Integer orderNo; 51 | 52 | private String remark; 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/BaseDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.FieldFill; 4 | import com.baomidou.mybatisplus.annotation.FieldStrategy; 5 | import com.baomidou.mybatisplus.annotation.TableField; 6 | import com.baomidou.mybatisplus.annotation.TableLogic; 7 | import com.fasterxml.jackson.annotation.JsonFormat; 8 | import com.fasterxml.jackson.annotation.JsonIgnore; 9 | import lombok.Data; 10 | 11 | import java.util.Date; 12 | 13 | /** 14 | * @author: create by bin 15 | * @version: v1.0 16 | * @description: cn.jackbin.SimpleRecord.entity 17 | * @date: 2020/8/19 19:40 18 | **/ 19 | @Data 20 | public class BaseDO { 21 | @TableField(value = "create_time", fill = FieldFill.INSERT) 22 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 23 | @JsonIgnore 24 | private Date createTime; 25 | 26 | @TableField(value = "update_time",fill = FieldFill.UPDATE) 27 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 28 | private Date updateTime; 29 | 30 | @TableLogic 31 | @TableField(updateStrategy = FieldStrategy.IGNORED) 32 | private Date deleteTime; 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/DictItemDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.*; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: 字典项表 14 | * @date: 2021/7/13 20:57 15 | **/ 16 | @Data 17 | @Builder 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | @EqualsAndHashCode(callSuper = false) 21 | @TableName("tb_dict_item") 22 | public class DictItemDO extends BaseDO implements Serializable { 23 | 24 | private static final long serialVersionUID = 8957367407235942454L; 25 | 26 | @TableId(value = "id", type = IdType.AUTO) 27 | private Long id; 28 | 29 | /** 30 | * 字典Id 31 | */ 32 | private Integer dictId; 33 | 34 | /** 35 | * 字典项文本内容 36 | */ 37 | private String text; 38 | 39 | /** 40 | * 字典项值 41 | */ 42 | private String value; 43 | 44 | /** 45 | * 备注 46 | */ 47 | private String remark; 48 | 49 | private Integer orderNo; 50 | 51 | private Integer status; 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/SpendCategoryDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.*; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: 花费类别 14 | * @date: 2020/9/16 22:20 15 | **/ 16 | @Data 17 | @Builder 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | @EqualsAndHashCode(callSuper = false) 21 | @TableName("tb_spend_category") 22 | public class SpendCategoryDO extends BaseDO implements Serializable { 23 | private static final long serialVersionUID1 = 1L; 24 | 25 | @TableId(value = "id", type = IdType.AUTO) 26 | private Long id; 27 | 28 | /** 29 | * 分类编码 30 | */ 31 | private String code; 32 | 33 | /** 34 | * 分类名 35 | */ 36 | private String name; 37 | 38 | /** 39 | * 记账类型Id 40 | */ 41 | private Integer recordTypeId; 42 | 43 | /** 44 | * 排序 45 | */ 46 | private Integer orderNo; 47 | 48 | /** 49 | * 备注 50 | */ 51 | private String remark; 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/UserService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.bo.PageBO; 4 | import cn.jackbin.SimpleRecord.entity.UserDO; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | 7 | import java.util.Date; 8 | import java.util.List; 9 | 10 | /** 11 | *

12 | * 服务类 13 | *

14 | * 15 | * @author jackbin 16 | * @since 2020-07-21 17 | */ 18 | public interface UserService extends IService { 19 | 20 | /** 21 | * 根据用户名获取用户 22 | */ 23 | UserDO getByName(String userName); 24 | 25 | /** 26 | * 根据Id获取指定用户 27 | */ 28 | UserDO getById(Long id); 29 | 30 | /** 31 | * 获取所有用户 32 | */ 33 | List getUsers(); 34 | 35 | /** 36 | * 分页获取用户 37 | */ 38 | void getByPage(String username, Boolean deleted, Date date, PageBO pageBO); 39 | 40 | void edit(Integer id, String nickname, Integer sex, String email); 41 | 42 | void add(String username, String nickname, Integer sex, String email, String credential); 43 | 44 | void reset(Integer id); 45 | 46 | /** 47 | * 保存用户并添加默认角色 48 | */ 49 | void saveWithDefaultRole(UserDO userDO); 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/enums/BusinessType.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.enums; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: 业务类型 7 | * @date: 2021/4/7 21:14 8 | **/ 9 | public enum BusinessType { 10 | /** 11 | * 其它 12 | */ 13 | OTHER("other", "其他"), 14 | 15 | QUERY("query", "查询"), 16 | 17 | /** 18 | * 新增 19 | */ 20 | INSERT("insert", "新增"), 21 | 22 | /** 23 | * 修改 24 | */ 25 | UPDATE("update", "修改"), 26 | 27 | /** 28 | * 删除 29 | */ 30 | DELETE("del", "修改"), 31 | 32 | /** 33 | * 授权 34 | */ 35 | GRANT("grant", "授权"), 36 | 37 | /** 38 | * 导出 39 | */ 40 | EXPORT("exprot", "导出"), 41 | 42 | /** 43 | * 导入 44 | */ 45 | IMPORT("import", "导入"), 46 | 47 | /** 48 | * 清空 49 | */ 50 | CLEAN("clean", "清空"), 51 | ; 52 | private String code; 53 | private String name; 54 | 55 | BusinessType(String code, String name) { 56 | this.code = code; 57 | this.name = name; 58 | } 59 | 60 | public String getCode() { 61 | return code; 62 | } 63 | 64 | public String getName() { 65 | return name; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/RecordBookDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.*; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: 账单表 14 | * @date: 2021/7/13 21:05 15 | **/ 16 | @Data 17 | @Builder 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | @EqualsAndHashCode(callSuper = false) 21 | @TableName("tb_record_book") 22 | public class RecordBookDO extends BaseDO implements Serializable { 23 | 24 | private static final long serialVersionUID = -8088393864369379823L; 25 | 26 | @TableId(value = "id", type = IdType.AUTO) 27 | private Long id; 28 | 29 | /** 30 | * 用户Id 31 | */ 32 | private Integer userId; 33 | 34 | /** 35 | * 账本名称 36 | */ 37 | private String name; 38 | 39 | /** 40 | * 备注 41 | */ 42 | private String remark; 43 | 44 | /** 45 | * 是否为用户默认 46 | */ 47 | private Integer isUserDefault; 48 | 49 | /** 50 | * 排序 51 | */ 52 | private Integer orderNo; 53 | 54 | private Integer status; 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/method/SelectOneWithoutLogicDel.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource.method; 2 | 3 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 4 | import org.apache.ibatis.mapping.MappedStatement; 5 | import org.apache.ibatis.mapping.SqlSource; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: 查询某个值,排除逻辑删除字段 11 | * @date: 2021/8/5 19:54 12 | **/ 13 | public class SelectOneWithoutLogicDel extends AbstractMethodWrapper { 14 | @Override 15 | public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { 16 | MethodConstant sqlMethod = MethodConstant.SELECT_ONE_WITHOUT_LOGIC_DEL; 17 | // 构建sql 18 | String sql = String.format(sqlMethod.getSql(), sqlFirst(), 19 | sqlSelectColumns(tableInfo, true), 20 | tableInfo.getTableName(), 21 | sqlWhereEntityWrapperWithoutLogicDel(true, tableInfo), sqlComment() 22 | ); 23 | SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); 24 | return this.addSelectMappedStatementForTable(mapperClass, sqlMethod.getMethod(), sqlSource, tableInfo); 25 | } 26 | 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/method/SelectPageWithoutLogicDel.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource.method; 2 | 3 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 4 | import org.apache.ibatis.mapping.MappedStatement; 5 | import org.apache.ibatis.mapping.SqlSource; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.common.config.datasource.method 11 | * @date: 2021/8/17 23:02 12 | **/ 13 | public class SelectPageWithoutLogicDel extends AbstractMethodWrapper { 14 | @Override 15 | public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { 16 | String sql = String.format(MethodConstant.SELECT_PAGE_WITHOUT_LOGIC_DEL.getSql(), sqlFirst(), 17 | sqlSelectColumns(tableInfo, true), 18 | tableInfo.getTableName(), 19 | sqlWhereEntityWrapperWithoutLogicDel(true, tableInfo), 20 | sqlComment()); 21 | SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); 22 | return this.addSelectMappedStatementForTable(mapperClass, MethodConstant.SELECT_PAGE_WITHOUT_LOGIC_DEL.getMethod(), sqlSource, tableInfo); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/RegisterVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import lombok.Data; 6 | 7 | import javax.validation.constraints.Email; 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.dto 15 | * @date: 2020/8/31 19:38 16 | **/ 17 | @ApiModel(value="RegisterDTO对象", description="用户注册对象") 18 | @Data 19 | public class RegisterVO { 20 | 21 | @ApiModelProperty(required = true, value = "用户名") 22 | @NotBlank(message = "用户名不能为空") 23 | private String username; 24 | 25 | @ApiModelProperty(required = true, value = "用户昵称") 26 | @NotBlank(message = "用户昵称不能为空") 27 | private String nickname; 28 | 29 | @ApiModelProperty(required = true, value = "性别(男:1;女:2)") 30 | @NotNull(message = "性别不能为空") 31 | private Integer sex; 32 | 33 | @ApiModelProperty(required = true, value = "邮箱") 34 | @Email(message = "邮箱格式不正确") 35 | private String email; 36 | 37 | @ApiModelProperty(required = true, value = "密码") 38 | @NotBlank(message = "密码不能为空") 39 | private String password; 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/MenuService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.bo.MenuBO; 4 | import cn.jackbin.SimpleRecord.bo.PageBO; 5 | import cn.jackbin.SimpleRecord.entity.MenuDO; 6 | import com.baomidou.mybatisplus.extension.service.IService; 7 | 8 | import java.util.Date; 9 | import java.util.List; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.service 15 | * @date: 2020/11/23 21:35 16 | **/ 17 | public interface MenuService extends IService { 18 | 19 | /** 20 | * 获取指定用户的权限 21 | */ 22 | List getUserMenus(Long userId); 23 | 24 | /** 25 | * 通过id查找指定的权限 26 | */ 27 | MenuDO getById(Long id); 28 | 29 | /** 30 | * 分页获取权限 31 | */ 32 | List getTreeList(); 33 | 34 | List getList(); 35 | 36 | /** 37 | * 获取所有的菜单权限 38 | */ 39 | List getAll(); 40 | 41 | /** 42 | * 获取角色权限 43 | */ 44 | List getRoleMenus(Long roleId); 45 | 46 | List copyFromMenuDos(List menuDOS); 47 | 48 | /** 49 | * 生成菜单树 50 | */ 51 | List generatorMenuTree(List boList); 52 | 53 | void reset(Integer id); 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/method/LogicDelWithFillStatus.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource.method; 2 | 3 | import com.baomidou.mybatisplus.core.injector.AbstractMethod; 4 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 5 | import org.apache.ibatis.mapping.MappedStatement; 6 | import org.apache.ibatis.mapping.SqlSource; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: 逻辑删除自动填充status 12 | * @date: 2021/8/16 19:31 13 | **/ 14 | public class LogicDelWithFillStatus extends AbstractMethodWrapper { 15 | @Override 16 | public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { 17 | // fixed this sql fragment 18 | String sqlSet = "SET status=1,delete_time=now()"; 19 | String sql = String.format(MethodConstant.DEL_BY_ID_WITH_FILL_STATUS.getSql(), tableInfo.getTableName(), sqlSet, tableInfo.getKeyColumn(), 20 | tableInfo.getKeyProperty(), tableInfo.getLogicDeleteSql(true, true)); 21 | SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); 22 | return addUpdateMappedStatement(mapperClass, modelClass, MethodConstant.DEL_BY_ID_WITH_FILL_STATUS.getMethod(), sqlSource); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/MenuDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.*; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: 菜单表 14 | * @date: 2020/11/23 21:16 15 | **/ 16 | @Data 17 | @Builder 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | @EqualsAndHashCode(callSuper = false) 21 | @TableName("tb_menu") 22 | public class MenuDO extends BaseDO implements Serializable { 23 | 24 | private static final long serialVersionUID = 4652175773392266928L; 25 | 26 | @TableId(value = "id", type = IdType.AUTO) 27 | private Long id; 28 | 29 | private String menuTitle; 30 | 31 | private String menuName; 32 | 33 | private Integer parentId; 34 | 35 | private Integer orderNo; 36 | 37 | private String path; 38 | 39 | private String component; 40 | 41 | /** 42 | * 是否为外链(0是 1否) 43 | */ 44 | private Integer outerChain; 45 | 46 | /** 47 | * 菜单类型(M目录 C菜单 F按钮) 48 | */ 49 | private String menuType; 50 | 51 | private String permissionSign; 52 | 53 | private String iconName; 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/RecordAccountDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import cn.jackbin.SimpleRecord.common.anotations.DictValue; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.*; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: 账户表 15 | * @date: 2021/7/13 21:01 16 | **/ 17 | @Data 18 | @Builder 19 | @NoArgsConstructor 20 | @AllArgsConstructor 21 | @EqualsAndHashCode(callSuper = false) 22 | @TableName("tb_record_account") 23 | public class RecordAccountDO extends BaseDO implements Serializable { 24 | 25 | private static final long serialVersionUID = -7198600840110284750L; 26 | 27 | @TableId(value = "id", type = IdType.AUTO) 28 | private Long id; 29 | 30 | private Integer userId; 31 | 32 | /** 33 | * 账户类型(数据字典维护) 34 | */ 35 | @DictValue(code = "accountType") 36 | private Integer type; 37 | 38 | /** 39 | * 账户名 40 | */ 41 | private String name; 42 | 43 | /** 44 | * 是否属于净资产(1:属于,2:不属于) 45 | */ 46 | private Integer inNetAssets; 47 | 48 | private Integer orderNo; 49 | 50 | private Integer status; 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/WechatUserVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | import io.swagger.annotations.ApiOperation; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import javax.validation.constraints.NotBlank; 10 | import javax.validation.constraints.NotNull; 11 | 12 | /** 13 | * @author: create by bin 14 | * @version: v1.0 15 | * @description: cn.jackbin.SimpleRecord.vo 16 | * @date: 2020/11/3 20:59 17 | **/ 18 | @ApiModel(value="WechatUserVO对象", description="微信登录对象") 19 | @Data 20 | @NoArgsConstructor 21 | public class WechatUserVO { 22 | @ApiModelProperty(required = true,value = "微信的用户OpenId") 23 | @NotBlank(message = "openId不能为空") 24 | private String openId; 25 | 26 | @ApiModelProperty(required = true, value = "用户名") 27 | @NotBlank(message = "用户名不能为空") 28 | private String username; 29 | 30 | @ApiModelProperty(required = true, value = "用户昵称") 31 | @NotBlank(message = "用户昵称不能为空") 32 | private String nickname; 33 | 34 | @ApiModelProperty(required = true, value = "性别(男:1;女:2)") 35 | @NotNull(message = "性别不能为空") 36 | private Integer sex; 37 | 38 | @ApiModelProperty(required = true, value = "头像地址") 39 | private String avatarUrl; 40 | } 41 | -------------------------------------------------------------------------------- /src/main/resources/mapper/RecordAccountMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 28 | 29 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/UserDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.baomidou.mybatisplus.annotation.IdType; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import com.baomidou.mybatisplus.annotation.TableName; 8 | import com.fasterxml.jackson.annotation.JsonIgnore; 9 | import lombok.*; 10 | 11 | /** 12 | *

13 | * 14 | *

15 | * 16 | * @author jackbin 17 | * @since 2020-07-21 18 | */ 19 | @Data 20 | @Builder 21 | @NoArgsConstructor 22 | @AllArgsConstructor 23 | @EqualsAndHashCode(callSuper = false) 24 | @TableName("tb_user") 25 | public class UserDO extends BaseDO implements Serializable { 26 | 27 | private static final long serialVersionUID = 1L; 28 | 29 | @TableId(value = "id", type = IdType.AUTO) 30 | private Long id; 31 | 32 | /** 33 | * 用户名,唯一 34 | */ 35 | private String username; 36 | 37 | /** 38 | * 用户昵称 39 | */ 40 | private String nickname; 41 | 42 | /** 43 | * 性别 44 | */ 45 | private Integer sex; 46 | 47 | /** 48 | * 用户凭证 49 | */ 50 | @JsonIgnore 51 | private String credential; 52 | 53 | /** 54 | * 头像url 55 | */ 56 | private String avatarUrl; 57 | 58 | /** 59 | * 邮箱 60 | */ 61 | private String email; 62 | 63 | 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/MySqlInjector.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource; 2 | 3 | import cn.jackbin.SimpleRecord.common.config.datasource.method.LogicDelWithFillStatus; 4 | import cn.jackbin.SimpleRecord.common.config.datasource.method.SelectOneWithoutLogicDel; 5 | import cn.jackbin.SimpleRecord.common.config.datasource.method.SelectPageWithoutLogicDel; 6 | import cn.jackbin.SimpleRecord.common.config.datasource.method.UpdateByIdWithoutLogicDel; 7 | import com.baomidou.mybatisplus.core.injector.AbstractMethod; 8 | import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * @author: create by bin 14 | * @version: v1.0 15 | * @description: cn.jackbin.SimpleRecord.common.config.datasource 16 | * @date: 2021/8/5 19:48 17 | **/ 18 | public class MySqlInjector extends DefaultSqlInjector { 19 | 20 | @Override 21 | public List getMethodList(Class mapperClass) { 22 | List methodList = super.getMethodList(mapperClass); 23 | methodList.add(new SelectOneWithoutLogicDel()); 24 | methodList.add(new LogicDelWithFillStatus()); 25 | methodList.add(new SelectPageWithoutLogicDel()); 26 | methodList.add(new UpdateByIdWithoutLogicDel()); 27 | return methodList; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/GetRolesVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import lombok.Data; 7 | 8 | import javax.validation.constraints.NotNull; 9 | import javax.validation.constraints.Positive; 10 | import javax.validation.constraints.PositiveOrZero; 11 | import java.util.Date; 12 | 13 | /** 14 | * @author: create by bin 15 | * @version: v1.0 16 | * @description: cn.jackbin.SimpleRecord.vo 17 | * @date: 2020/12/7 21:00 18 | **/ 19 | @ApiModel(value="GetRolesVO对象", description="分页获取角色列表对象") 20 | @Data 21 | public class GetRolesVO { 22 | 23 | @ApiModelProperty(value = "角色名") 24 | private String name; 25 | 26 | @ApiModelProperty(value = "状态") 27 | private Boolean deleted; 28 | 29 | @ApiModelProperty(required = true, value = "年月日(yyyy-MM-dd)") 30 | @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") 31 | private Date date; 32 | 33 | /** 34 | * 分页的索引 35 | */ 36 | @ApiModelProperty(required = true, value = "分页的索引") 37 | @Positive(message = "当前页数须为正数") 38 | int pageNo; 39 | 40 | /** 41 | * 分页的大小 42 | */ 43 | @ApiModelProperty(required = true, value = "分页的大小") 44 | @Positive(message = "分页的大小须为正数") 45 | int pageSize; 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/RecordSysCategoryDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.*; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: 系统内置类别表 14 | * @date: 2021/7/13 21:07 15 | **/ 16 | @Data 17 | @Builder 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | @EqualsAndHashCode(callSuper = false) 21 | @TableName("tb_record_sys_category") 22 | public class RecordSysCategoryDO extends BaseDO implements Serializable { 23 | 24 | private static final long serialVersionUID = -358045672217191501L; 25 | 26 | @TableId(value = "id", type = IdType.AUTO) 27 | private Long id; 28 | 29 | /** 30 | * 记账类型 31 | */ 32 | private Integer type; 33 | 34 | /** 35 | * 类别名称 36 | */ 37 | private String name; 38 | 39 | /** 40 | * 类别Key 41 | */ 42 | private String code; 43 | 44 | /** 45 | * 排序 46 | */ 47 | private Integer orderNo; 48 | 49 | /** 50 | * 图标 51 | */ 52 | private String icon; 53 | 54 | /** 55 | * 是否系统内置 56 | */ 57 | private Integer isSysDefault; 58 | 59 | private String remark; 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/method/UpdateByIdWithoutLogicDel.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource.method; 2 | 3 | import com.baomidou.mybatisplus.core.enums.SqlMethod; 4 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 5 | import org.apache.ibatis.mapping.MappedStatement; 6 | import org.apache.ibatis.mapping.SqlSource; 7 | 8 | /** 9 | * @author: create by bin 10 | * @version: v1.0 11 | * @description: cn.jackbin.SimpleRecord.common.config.datasource.method 12 | * @date: 2021/8/18 19:48 13 | **/ 14 | public class UpdateByIdWithoutLogicDel extends AbstractMethodWrapper { 15 | @Override 16 | public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { 17 | boolean logicDelete = tableInfo.isLogicDelete(); 18 | String sql = String.format(MethodConstant.UPDATE_BY_ID_WITHOUT_LOGIC_DEL.getSql(), 19 | tableInfo.getTableName(), 20 | sqlSet(logicDelete, false, tableInfo, false, ENTITY, ENTITY_DOT), 21 | tableInfo.getKeyColumn(), ENTITY_DOT + tableInfo.getKeyProperty()); 22 | SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); 23 | return addUpdateMappedStatement(mapperClass, modelClass, MethodConstant.UPDATE_BY_ID_WITHOUT_LOGIC_DEL.getMethod(), sqlSource); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RecordBookService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.bo.PageBO; 4 | import cn.jackbin.SimpleRecord.dto.RecordBookAnalysisDTO; 5 | import cn.jackbin.SimpleRecord.entity.RecordBookDO; 6 | import com.baomidou.mybatisplus.extension.service.IService; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: cn.jackbin.SimpleRecord.service 14 | * @date: 2020/11/23 21:35 15 | **/ 16 | public interface RecordBookService extends IService { 17 | 18 | void getByPage(Integer userId, PageBO pageBO); 19 | 20 | void add(Integer userId, String name, String remark, Integer orderNo); 21 | 22 | RecordBookDO getByName(Integer userId, String name); 23 | 24 | /** 25 | * 获取用户默认账本 26 | */ 27 | RecordBookDO getDefaultBook(Integer userId); 28 | 29 | void edit(Long id, Integer userId, String name, String remark, Integer orderNo, Integer isUserDefault); 30 | 31 | /** 32 | * 更新为默认账单 33 | */ 34 | void updateDefault(Long defaultId, Long sourceId, Integer userId, String name, String remark, Integer orderNo, Integer isUserDefault); 35 | 36 | /** 37 | * 获取用户的所有账本 38 | */ 39 | List getList(Integer userId); 40 | 41 | /** 42 | * 初始化账单 43 | */ 44 | void init(Integer userId); 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/MyBaseMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.Wrapper; 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import com.baomidou.mybatisplus.core.metadata.IPage; 6 | import com.baomidou.mybatisplus.core.toolkit.Constants; 7 | import org.apache.ibatis.annotations.Param; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: 自定义通用mapper 15 | * @date: 2021/8/5 19:50 16 | **/ 17 | public interface MyBaseMapper extends BaseMapper { 18 | 19 | T selectOneWithoutLogicDel(@Param(Constants.WRAPPER) Wrapper queryWrapper); 20 | 21 | int logicDelByIdFillStatus(Serializable id); 22 | 23 | int delByIdFillStatus(Serializable id); 24 | 25 | /** 26 | * 根据 entity 条件,分页查询记录(无逻辑删除条件限制) 27 | * 28 | * @param page 分页查询条件(可以为 RowBounds.DEFAULT) 29 | * @param queryWrapper 实体对象封装操作类(可以为 null) 30 | */ 31 | > E selectPageWithoutLogicDel(E page, @Param(Constants.WRAPPER) Wrapper queryWrapper); 32 | 33 | /** 34 | * 根据 ID 修改(无逻辑删除条件限制) 35 | * 36 | * @param entity 实体对象 37 | */ 38 | int updateByIdWithoutLogicDel(@Param(Constants.ENTITY) T entity); 39 | 40 | /** 41 | * 根据 ID 删除 42 | * 43 | * @param id 主键ID 44 | */ 45 | int delById(Serializable id); 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/GetRecordsByMonthVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import io.swagger.annotations.ApiModel; 5 | import io.swagger.annotations.ApiModelProperty; 6 | import io.swagger.annotations.ApiParam; 7 | import io.swagger.models.auth.In; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.NoArgsConstructor; 11 | import org.springframework.format.annotation.DateTimeFormat; 12 | 13 | import javax.validation.constraints.NotNull; 14 | import javax.validation.constraints.Positive; 15 | import javax.validation.constraints.PositiveOrZero; 16 | import java.util.Date; 17 | 18 | /** 19 | * @author: create by bin 20 | * @version: v1.0 21 | * @description: cn.jackbin.SimpleRecord.dto 22 | * @date: 2020/10/14 23:14 23 | **/ 24 | @ApiModel(value="GetRecordsByMonthVO对象", description="获取记账记录对象") 25 | @EqualsAndHashCode(callSuper = true) 26 | @Data 27 | @NoArgsConstructor 28 | public class GetRecordsByMonthVO extends PageVO{ 29 | 30 | private Integer recordBookId; 31 | 32 | private Integer recordAccountId; 33 | 34 | @ApiModelProperty(required = true, value = "年月(yyyy-MM)") 35 | @JsonFormat(pattern="yyyy-MM",timezone = "GMT+8") 36 | @NotNull 37 | private Date month; 38 | 39 | @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") 40 | private Date occurTime; 41 | 42 | /** 43 | * 关键词 44 | */ 45 | private String keyWord; 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/impl/UserRoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service.impl; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RoleDO; 4 | import cn.jackbin.SimpleRecord.entity.UserRoleDO; 5 | import cn.jackbin.SimpleRecord.mapper.UserRoleMapper; 6 | import cn.jackbin.SimpleRecord.service.UserRoleService; 7 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | import org.springframework.transaction.annotation.Transactional; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | /** 16 | *

17 | * 服务实现类 18 | *

19 | * 20 | * @author jackbin 21 | * @since 2020-07-21 22 | */ 23 | @Service 24 | public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { 25 | @Autowired 26 | private UserRoleMapper userRoleMapper; 27 | 28 | @Transactional 29 | @Override 30 | public void edit(Integer userId, List roleIds) { 31 | // 删除用户的所有角色 32 | userRoleMapper.deleteByUserId(userId); 33 | // 更新 34 | List list = new ArrayList<>(); 35 | roleIds.forEach(n -> { 36 | UserRoleDO userRoleDO = new UserRoleDO(); 37 | userRoleDO.setUserId(userId); 38 | userRoleDO.setRoleId(n); 39 | list.add(userRoleDO); 40 | }); 41 | saveBatch(list); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/RecordDetailVO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | import org.springframework.format.annotation.DateTimeFormat; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | import javax.validation.constraints.Positive; 11 | import java.util.Date; 12 | 13 | /** 14 | * @author: create by bin 15 | * @version: v1.0 16 | * @description: cn.jackbin.SimpleRecord.vo 17 | * @date: 2020/10/15 21:49 18 | **/ 19 | @Data 20 | @NoArgsConstructor 21 | public class RecordDetailVO { 22 | private Long id; 23 | 24 | @Positive(message = "来源账户须为整数") 25 | private Integer sourceAccountId; 26 | 27 | @Positive(message = "目标账户须为整数") 28 | private Integer targetAccountId; 29 | 30 | @Positive(message = "账单Id为整数") 31 | private Integer recordBookId; 32 | 33 | @NotNull(message = "记账类型不能为空") 34 | private String recordTypeCode; 35 | 36 | @NotBlank(message = "记账类别不能为空") 37 | private String recordCategory; 38 | 39 | @NotNull(message = "金额不能为空") 40 | private Double amount; 41 | 42 | @NotNull(message = "日期不能为空") 43 | @DateTimeFormat(pattern="yyyy-MM-dd") 44 | @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") 45 | private Date occurTime; 46 | 47 | // 是否报销 48 | private Integer recoverableStatus; 49 | 50 | private String tag; 51 | 52 | private String remark; 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/RecordConstant.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.constant 7 | * @date: 2020/10/12 21:51 8 | **/ 9 | public class RecordConstant { 10 | public static final String EXPEND_RECORD_TYPE = "expendType"; 11 | 12 | public static final String INCOME_RECORD_TYPE = "incomeType"; 13 | 14 | public static final String RECORD_TYPE = "recordType"; 15 | 16 | public static final String ACCOUNT_TYPE = "accountType"; 17 | 18 | public static final String PAYMENT_ACCOUNT = "payment"; // 应收应付账户类型 19 | 20 | public static final String BXK = "报销款"; 21 | 22 | /** 23 | * 用户默认 24 | */ 25 | public static final int USER_DEFAULT = 1; 26 | 27 | /** 28 | * 非用户默认 29 | */ 30 | public static final int NOT_USER_DEFAULT = 2; 31 | 32 | /** 33 | * 属于 34 | */ 35 | public static final int BUSINESS_YES = 1; 36 | 37 | /** 38 | * 不属于 39 | */ 40 | public static final int BUSINESS_NOT = 2; 41 | 42 | /** 43 | * 非报销 44 | */ 45 | public static final int NOT_RECOVERABLE = 1; 46 | 47 | /** 48 | * 待报销 49 | */ 50 | public static final int TO_RECOVERABLE = 2; 51 | 52 | /** 53 | * 已报销 54 | */ 55 | public static final int IS_RECOVERABLE = 3; 56 | 57 | /** 58 | * 默认账单名称 59 | */ 60 | public static final String DEFAULT_RECORD_BOOK_NAME = "默认账单"; 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/method/MethodConstant.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource.method; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.common.config.datasource.method 7 | * @date: 2021/8/5 19:57 8 | **/ 9 | public enum MethodConstant { 10 | SELECT_ONE_WITHOUT_LOGIC_DEL("selectOneWithoutLogicDel", "查询满足条件一条数据(无逻辑删除条件限制)", ""), 11 | DEL_BY_ID_WITH_FILL_STATUS("delByIdFillStatus", "逻辑删除自动填充status字段", ""), 12 | SELECT_PAGE_WITHOUT_LOGIC_DEL("selectPageWithoutLogicDel", "分页查询满足条件所有数据(无逻辑删除条件限制)", ""), 13 | UPDATE_BY_ID_WITHOUT_LOGIC_DEL("updateByIdWithoutLogicDel", "根据ID 选择修改数据(无逻辑删除条件限制)", ""), 14 | DEL_BY_ID("delById", "根据ID 删除一条数据", ""), 15 | ; 16 | 17 | private final String method; 18 | private final String desc; 19 | private final String sql; 20 | 21 | MethodConstant(String method, String desc, String sql) { 22 | this.method = method; 23 | this.desc = desc; 24 | this.sql = sql; 25 | } 26 | 27 | public String getMethod() { 28 | return method; 29 | } 30 | 31 | public String getDesc() { 32 | return desc; 33 | } 34 | 35 | public String getSql() { 36 | return sql; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/sercurity/UserDetailsServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.sercurity; 2 | 3 | import cn.jackbin.SimpleRecord.entity.MenuDO; 4 | import cn.jackbin.SimpleRecord.entity.UserDO; 5 | import cn.jackbin.SimpleRecord.service.MenuService; 6 | import cn.jackbin.SimpleRecord.service.UserService; 7 | import cn.jackbin.SimpleRecord.bo.UserMenuBO; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.security.core.userdetails.UserDetails; 10 | import org.springframework.security.core.userdetails.UserDetailsService; 11 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 12 | import org.springframework.stereotype.Component; 13 | 14 | import java.util.List; 15 | 16 | /** 17 | * @author: create by bin 18 | * @version: v1.0 19 | * @description: cn.jackbin.SimpleRecord.common.config.sercurity 20 | * @date: 2020/8/3 20:15 21 | **/ 22 | @Component 23 | public class UserDetailsServiceImpl implements UserDetailsService { 24 | @Autowired 25 | private UserService userService; 26 | @Autowired 27 | private MenuService menuService; 28 | 29 | @Override 30 | public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { 31 | UserDO userDO = userService.getByName(s); 32 | List menuDOList = menuService.getUserMenus(userDO.getId()); 33 | UserMenuBO userPermissionBO = new UserMenuBO(userDO, menuDOList); 34 | return new JWTUser(userPermissionBO); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/bo/MenuBO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.bo; 2 | 3 | import com.fasterxml.jackson.annotation.JsonFormat; 4 | import com.fasterxml.jackson.annotation.JsonInclude; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.util.Date; 10 | import java.util.List; 11 | 12 | /** 13 | * @author: create by bin 14 | * @version: v1.0 15 | * @description: 菜单业务类 16 | * @date: 2020/12/1 19:54 17 | **/ 18 | @Data 19 | @AllArgsConstructor 20 | @Builder 21 | public class MenuBO { 22 | 23 | private Integer id; 24 | 25 | /** 26 | * 父节点Id 27 | */ 28 | private Integer parentId; 29 | 30 | /** 31 | * 菜单标题 32 | */ 33 | private String menuTitle; 34 | 35 | /** 36 | * 菜单名 37 | */ 38 | private String menuName; 39 | 40 | /** 41 | * 路径 42 | */ 43 | private String path; 44 | 45 | /** 46 | * 组件路径 47 | */ 48 | private String component; 49 | 50 | /** 51 | * 是否为外链 52 | */ 53 | private boolean isOuterChain; 54 | 55 | private String menuType; 56 | 57 | private String iconName; 58 | 59 | private String permissionSign; 60 | 61 | private Integer orderNo; 62 | 63 | /** 64 | * 是否拥有 65 | */ 66 | private boolean owned; 67 | 68 | @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 69 | private Date deleteTime; 70 | 71 | @JsonInclude(JsonInclude.Include.NON_EMPTY) 72 | List children; 73 | 74 | public MenuBO() { 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/RecordUserCategoryDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import cn.jackbin.SimpleRecord.common.anotations.DictValue; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import lombok.*; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: 用户类别表 15 | * @date: 2021/7/13 21:07 16 | **/ 17 | @Data 18 | @Builder 19 | @NoArgsConstructor 20 | @AllArgsConstructor 21 | @EqualsAndHashCode(callSuper = false) 22 | @TableName("tb_record_user_category") 23 | public class RecordUserCategoryDO extends BaseDO implements Serializable { 24 | 25 | private static final long serialVersionUID = -6983888926685534590L; 26 | 27 | @TableId(value = "id", type = IdType.AUTO) 28 | private Long id; 29 | 30 | /** 31 | * 用户Id 32 | */ 33 | private Integer userId; 34 | 35 | /** 36 | * 记账类型 37 | */ 38 | @DictValue(code = "recordType") 39 | private Integer type; 40 | 41 | /** 42 | * 类别名称 43 | */ 44 | private String name; 45 | 46 | /** 47 | * 类别编码 48 | */ 49 | private String code; 50 | 51 | /** 52 | * 排序 53 | */ 54 | private Integer orderNo; 55 | 56 | /** 57 | * 图标 58 | */ 59 | private String icon; 60 | 61 | /** 62 | * 是否系统内置 63 | */ 64 | private Integer isSysDefault; 65 | 66 | private String remark; 67 | } 68 | -------------------------------------------------------------------------------- /src/main/resources/mapper/MenuMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 25 | 26 | 30 | 31 | 40 | 41 | 42 | update tb_menu set delete_time = null where id = #{id} 43 | 44 | 45 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/utils/PasswordUtil.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.utils; 2 | 3 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 4 | 5 | import java.util.regex.Pattern; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: cn.jackbin.SimpleRecord.util 11 | * @date: 2020/8/31 20:20 12 | **/ 13 | public class PasswordUtil { 14 | private static final Pattern BCRYPT_PATTERN = Pattern.compile("^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$"); 15 | private static BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); 16 | 17 | public static boolean check(String psw) { 18 | return BCRYPT_PATTERN.matcher(psw).matches(); 19 | } 20 | 21 | public static String encoder(String psw) { 22 | return encoder.encode(psw); 23 | } 24 | 25 | /** 26 | * 生成随机的8为字符(含大小写及数字) 27 | */ 28 | public static String randomPsw() { 29 | StringBuilder result = new StringBuilder(); 30 | for (int j = 0; j < 8; j++) { 31 | double rand = Math.random(); 32 | double randTri = Math.random() * 3; 33 | if (randTri >= 0 && randTri < 1) { 34 | result.append((char) (rand * ('9' - '0') + '0')); 35 | } else if (randTri >= 1 && randTri < 2) { 36 | result.append((char) (rand * ('Z' - 'A') + 'A')); 37 | } else { 38 | result.append((char) (rand * ('z' - 'a') + 'a')); 39 | } 40 | } 41 | return result.toString(); 42 | } 43 | 44 | public static void main(String[] args) { 45 | System.out.println(PasswordUtil.randomPsw()); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/utils/AddressUtil.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.utils; 2 | 3 | import cn.jackbin.SimpleRecord.constant.Constants; 4 | import com.alibaba.fastjson.JSONObject; 5 | import lombok.extern.slf4j.Slf4j; 6 | 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | 10 | /** 11 | * @author: create by bin 12 | * @version: v1.0 13 | * @description: cn.jackbin.SimpleRecord.utils 14 | * @date: 2021/4/8 21:36 15 | **/ 16 | @Slf4j 17 | public class AddressUtil { 18 | 19 | // IP地址查询 20 | public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; 21 | 22 | // 未知地址 23 | public static final String UNKNOWN = "XX XX"; 24 | 25 | public static String getRealAddressByIP(String ip) 26 | { 27 | String address = UNKNOWN; 28 | // 内网不查询 29 | if (IpUtil.internalIp(ip)) 30 | { 31 | return "内网IP"; 32 | } 33 | try 34 | { 35 | Map map = new HashMap<>(); 36 | map.put("ip", ip); 37 | map.put("json", "true"); 38 | String rspStr = HttpUtil.doGet(IP_URL, map); 39 | if (StringUtil.isEmpty(rspStr)) 40 | { 41 | log.error("获取地理位置异常 {}", ip); 42 | return UNKNOWN; 43 | } 44 | JSONObject obj = JSONObject.parseObject(rspStr); 45 | String region = obj.getString("pro"); 46 | String city = obj.getString("city"); 47 | return String.format("%s %s", region, city); 48 | } 49 | catch (Exception e) 50 | { 51 | log.error("获取地理位置异常 {}", e.getMessage()); 52 | } 53 | return address; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/controller/basic/AccountController.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.controller.basic; 2 | 3 | import cn.jackbin.SimpleRecord.common.LocalUser; 4 | import cn.jackbin.SimpleRecord.common.anotations.LoginRequired; 5 | import cn.jackbin.SimpleRecord.entity.UserDO; 6 | import cn.jackbin.SimpleRecord.service.UserService; 7 | import cn.jackbin.SimpleRecord.vo.AccountBaseSettingVO; 8 | import cn.jackbin.SimpleRecord.vo.Result; 9 | import io.swagger.annotations.Api; 10 | import io.swagger.annotations.ApiOperation; 11 | import lombok.extern.slf4j.Slf4j; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.validation.annotation.Validated; 14 | import org.springframework.web.bind.annotation.PutMapping; 15 | import org.springframework.web.bind.annotation.RequestBody; 16 | import org.springframework.web.bind.annotation.RequestMapping; 17 | import org.springframework.web.bind.annotation.RestController; 18 | 19 | /** 20 | * @author: create by bin 21 | * @version: v1.0 22 | * @description: 账户相关 23 | * @date: 2021/3/8 20:25 24 | **/ 25 | @Api(value = "AccountController", tags = { "账户设置接口" }) 26 | @RestController 27 | @RequestMapping(value = "/account") 28 | public class AccountController { 29 | @Autowired 30 | private UserService userService; 31 | 32 | @ApiOperation(value = "账户基本设置") 33 | @LoginRequired 34 | @PutMapping(value = "/baseSetting") 35 | public Result saveInfo(@RequestBody @Validated AccountBaseSettingVO vo) { 36 | UserDO user = LocalUser.get(); 37 | user.setNickname(vo.getNickname()); 38 | user.setSex(vo.getSex()); 39 | userService.updateById(user); 40 | return Result.success(); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/redis/RedisConfig.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.redis; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.data.redis.connection.RedisConnectionFactory; 6 | import org.springframework.data.redis.core.RedisTemplate; 7 | import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; 8 | import org.springframework.data.redis.serializer.RedisSerializer; 9 | import org.springframework.data.redis.serializer.StringRedisSerializer; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.common.config.redis 15 | * @date: 2021/4/20 20:32 16 | **/ 17 | @Configuration 18 | public class RedisConfig { 19 | @Bean 20 | public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){ 21 | 22 | RedisTemplate redisTemplate = new RedisTemplate<>(); 23 | // 参照StringRedisTemplate内部实现指定序列化器 24 | redisTemplate.setConnectionFactory(redisConnectionFactory); 25 | // 设置key的序列化器 26 | redisTemplate.setKeySerializer(keySerializer()); 27 | redisTemplate.setHashKeySerializer(keySerializer()); 28 | // 设置value的序列化器 29 | redisTemplate.setValueSerializer(valueSerializer()); 30 | redisTemplate.setHashValueSerializer(valueSerializer()); 31 | return redisTemplate; 32 | } 33 | 34 | private RedisSerializer keySerializer(){ 35 | return new StringRedisSerializer(); 36 | } 37 | 38 | //使用Jackson序列化器 39 | private RedisSerializer valueSerializer(){ 40 | return new GenericJackson2JsonRedisSerializer(); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/test/java/cn/jackbin/SimpleRecord/utils/TestUtil.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.utils; 2 | 3 | /** 4 | * @author: create by bin 5 | * @version: v1.0 6 | * @description: cn.jackbin.SimpleRecord.util 7 | * @date: 2020/7/5 20:17 8 | **/ 9 | public class TestUtil { 10 | public static void main(String[] args) { 11 | int[] arr = {1,2,2,2,2,2}; 12 | //int result = search(arr,2); 13 | int r = searchByRecursion(arr, 2,0,arr.length-1); 14 | System.out.println(r); 15 | } 16 | 17 | // 非递归的方式实现二分查找(找到最小的下标) 18 | public static int search(int[] arr,int n) { 19 | int low = 0; // 查找的下标 20 | int high = arr.length-1; // 查找的上标 21 | while(low <= high) { 22 | int mid = (low+high)/2; 23 | if(arr[mid]n) { 26 | high=mid-1; 27 | } else if(arr[mid]==n) { 28 | if (mid == low) { 29 | // 此时返回mid标志 30 | return mid; 31 | } 32 | // 如果相等则继续向前半部分寻找 33 | high=mid-1; 34 | } 35 | } 36 | return -1; 37 | } 38 | 39 | // 递归() 40 | public static int searchByRecursion(int[] arr,int target,int begin,int end) { 41 | int mid=(begin+end)/2; 42 | if(targetarr[end]) { 43 | return -1; 44 | } 45 | if(arr[mid] < target) { 46 | return searchByRecursion(arr,target,mid+1,end); 47 | } else if(arr[mid] > target) { 48 | return searchByRecursion(arr,target,begin,mid-1); 49 | } else { 50 | if (begin == mid) { 51 | return mid; 52 | } 53 | // 如果相等,则继续往前半部分寻找 54 | return searchByRecursion(arr,target,begin,mid-1); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/vo/Result.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.vo; 2 | 3 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 4 | 5 | import java.io.Serializable; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: com.ssm.dto 11 | * @date:2019/8/5 12 | **/ 13 | public class Result implements Serializable { 14 | 15 | private static final long serialVersionUID = -4274097396250944384L; 16 | 17 | private String message; 18 | private int retCode; 19 | private T data; 20 | private Result(T data) { 21 | this.retCode = CodeMsg.SUCCESS.getRetCode(); 22 | this.message = CodeMsg.SUCCESS.getMessage(); 23 | this.data = data; 24 | } 25 | private Result(CodeMsg cm) { 26 | if(cm == null){ 27 | return; 28 | } 29 | this.retCode = cm.getRetCode(); 30 | this.message = cm.getMessage(); 31 | } 32 | /** 33 | * 成功时候的调用 34 | * @return 35 | */ 36 | public static Result success(T data){ 37 | return new Result(data); 38 | } 39 | /** 40 | * 成功,不需要传入参数 41 | * @return 42 | */ 43 | @SuppressWarnings("unchecked") 44 | public static Result success(){ 45 | return (Result) success(""); 46 | } 47 | /** 48 | * 失败时候的调用 49 | * @return 50 | */ 51 | public static Result error(CodeMsg cm){ 52 | return new Result(cm); 53 | } 54 | /** 55 | * 失败时候的调用,扩展消息参数 56 | * @param cm 57 | * @param msg 58 | * @return 59 | */ 60 | public static Result error(CodeMsg cm,String msg){ 61 | cm.setMessage(msg); 62 | return new Result(cm); 63 | } 64 | public T getData() { 65 | return data; 66 | } 67 | public String getMessage() { 68 | return message; 69 | } 70 | public int getRetCode() { 71 | return retCode; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | logs 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/datasource/method/AbstractMethodWrapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.datasource.method; 2 | 3 | import com.baomidou.mybatisplus.core.injector.AbstractMethod; 4 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 5 | import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: 抽象方法封装类 11 | * @date: 2021/8/17 23:08 12 | **/ 13 | public abstract class AbstractMethodWrapper extends AbstractMethod { 14 | 15 | /** 16 | * EntityWrapper方式获取select where(无逻辑删除) 17 | * 18 | * @param newLine 是否提到下一行 19 | * @param table 表信息 20 | * @return String 21 | */ 22 | protected String sqlWhereEntityWrapperWithoutLogicDel(boolean newLine, TableInfo table) { 23 | String sqlScript = table.getAllSqlWhere(false, true, WRAPPER_ENTITY_DOT); 24 | sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", WRAPPER_ENTITY), true); 25 | sqlScript += NEWLINE; 26 | sqlScript += SqlScriptUtils.convertIf(String.format(SqlScriptUtils.convertIf(" AND", String.format("%s and %s", WRAPPER_NONEMPTYOFENTITY, WRAPPER_NONEMPTYOFNORMAL), false) + " ${%s}", WRAPPER_SQLSEGMENT), 27 | String.format("%s != null and %s != '' and %s", WRAPPER_SQLSEGMENT, WRAPPER_SQLSEGMENT, 28 | WRAPPER_NONEMPTYOFWHERE), true); 29 | sqlScript = SqlScriptUtils.convertWhere(sqlScript) + NEWLINE; 30 | sqlScript += SqlScriptUtils.convertIf(String.format(" ${%s}", WRAPPER_SQLSEGMENT), 31 | String.format("%s != null and %s != '' and %s", WRAPPER_SQLSEGMENT, WRAPPER_SQLSEGMENT, 32 | WRAPPER_EMPTYOFWHERE), true); 33 | sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", WRAPPER), true); 34 | return newLine ? NEWLINE + sqlScript : sqlScript; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/CommonLogDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import java.io.Serializable; 4 | 5 | import com.baomidou.mybatisplus.annotation.IdType; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import com.baomidou.mybatisplus.annotation.TableName; 8 | import lombok.*; 9 | 10 | /** 11 | *

12 | * 13 | *

14 | * 15 | * @author jackbin 16 | * @since 2020-07-21 17 | */ 18 | @Data 19 | @Builder 20 | @NoArgsConstructor 21 | @AllArgsConstructor 22 | @EqualsAndHashCode(callSuper = false) 23 | @TableName("tb_common_log") 24 | public class CommonLogDO extends BaseDO implements Serializable { 25 | 26 | private static final long serialVersionUID = 959898899499281387L; 27 | 28 | @TableId(value = "id", type = IdType.AUTO) 29 | private Long id; 30 | 31 | private String title; 32 | 33 | /** 34 | * 业务类型编码 35 | */ 36 | private String businessTypeCode; 37 | 38 | /** 39 | * 业务类型名 40 | */ 41 | private String businessTypeName; 42 | 43 | /** 44 | * Java中调用的方法 45 | */ 46 | private String method; 47 | 48 | /** 49 | * 请求方法 50 | */ 51 | private String requestMethod; 52 | 53 | /** 54 | * 请求Url 55 | */ 56 | private String requestUrl; 57 | 58 | /** 59 | * 请求参数 60 | */ 61 | private String requestParam; 62 | 63 | /** 64 | * 操作人平台 65 | */ 66 | private String operPlatform; 67 | 68 | /** 69 | * 操作人IP 70 | */ 71 | private String operIp; 72 | 73 | /** 74 | * 操作人地址 75 | */ 76 | private String operAddress; 77 | 78 | /** 79 | * 操作人Id 80 | */ 81 | private Integer operId; 82 | 83 | /** 84 | * 返回结果 85 | */ 86 | private String jsonResult; 87 | 88 | /** 89 | * 状态 90 | */ 91 | private Integer status; 92 | 93 | /** 94 | * 错误信息 95 | */ 96 | private String errorMsg; 97 | 98 | } 99 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/utils/SpringContextUtil.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.utils; 2 | 3 | import org.springframework.beans.BeansException; 4 | import org.springframework.context.ApplicationContext; 5 | import org.springframework.context.ApplicationContextAware; 6 | import org.springframework.core.env.Environment; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.Arrays; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: Spring获取上下文的工具类 15 | * @date: 2020/8/4 19:33 16 | **/ 17 | @Component 18 | public class SpringContextUtil implements ApplicationContextAware { 19 | private static ApplicationContext applicationContext; 20 | 21 | public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 22 | SpringContextUtil.applicationContext = applicationContext; 23 | } 24 | 25 | @SuppressWarnings("unchecked") 26 | public static T getBean(String name) { 27 | return (T) applicationContext.getBean(name); 28 | } 29 | public static T getBean(Class clazz){ 30 | return applicationContext.getBean(clazz); 31 | } 32 | 33 | public static T getBean(String name, Class requiredType) { 34 | return applicationContext.getBean(name, requiredType); 35 | } 36 | 37 | public static boolean containsBean(String name) { 38 | return applicationContext.containsBean(name); 39 | } 40 | 41 | public static boolean isSingleton(String name) { 42 | return applicationContext.isSingleton(name); 43 | } 44 | 45 | public static Class getType(String name) { 46 | return applicationContext.getType(name); 47 | } 48 | 49 | // 获取当前的环境 50 | public boolean isProEnv() { 51 | Environment env = applicationContext.getEnvironment(); 52 | String envStr = Arrays.stream(env.getActiveProfiles()).filter("prod"::equals).findAny().orElse(null); 53 | return envStr != null; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/thread/ThreadPoolConfig.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.thread; 2 | 3 | import cn.jackbin.SimpleRecord.utils.ThreadUtil; 4 | import org.apache.commons.lang3.concurrent.BasicThreadFactory; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; 8 | 9 | import java.util.concurrent.*; 10 | 11 | /** 12 | * @author: create by bin 13 | * @version: v1.0 14 | * @description: cn.jackbin.SimpleRecord.common.config.thread 15 | * @date: 2021/4/12 20:45 16 | **/ 17 | @Configuration 18 | public class ThreadPoolConfig { 19 | // 核心线程池大小 20 | private final int corePoolSize = 50; 21 | 22 | // 最大可创建的线程数 23 | private final int maxPoolSize = 200; 24 | 25 | // 队列最大长度 26 | private final int queueCapacity = 1000; 27 | 28 | // 线程池维护线程所允许的空闲时间 29 | private final int keepAliveSeconds = 60; 30 | 31 | @Bean(name = "threadPoolExecutor") 32 | public ThreadPoolExecutor threadPoolExecutor() 33 | { 34 | ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveSeconds, 35 | TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(queueCapacity), new ThreadPoolExecutor.CallerRunsPolicy()); 36 | return executor; 37 | } 38 | 39 | /** 40 | * 执行周期性或定时任务 41 | */ 42 | @Bean(name = "scheduledExecutorService") 43 | protected ScheduledExecutorService scheduledExecutorService() 44 | { 45 | return new ScheduledThreadPoolExecutor(corePoolSize, 46 | new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) 47 | { 48 | @Override 49 | protected void afterExecute(Runnable r, Throwable t) 50 | { 51 | super.afterExecute(r, t); 52 | ThreadUtil.printException(r, t); 53 | } 54 | }; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/resources/mapper/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 28 | 29 | 52 | 53 | 54 | update tb_user set delete_time = null where id = #{id} 55 | 56 | 57 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/entity/RecordDetailDO.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.entity; 2 | 3 | import cn.jackbin.SimpleRecord.common.anotations.DictValue; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import com.fasterxml.jackson.annotation.JsonFormat; 8 | import lombok.*; 9 | 10 | import java.io.Serializable; 11 | import java.util.Date; 12 | 13 | /** 14 | * @author: create by bin 15 | * @version: v1.0 16 | * @description: 记账详情表 17 | * @date: 2020/9/16 22:19 18 | **/ 19 | @Data 20 | @Builder 21 | @NoArgsConstructor 22 | @AllArgsConstructor 23 | @EqualsAndHashCode(callSuper = false) 24 | @TableName("tb_record_detail") 25 | public class RecordDetailDO extends BaseDO implements Serializable { 26 | 27 | private static final long serialVersionUID = 2546476382250156336L; 28 | 29 | @TableId(value = "id", type = IdType.AUTO) 30 | private Long id; 31 | 32 | /** 33 | * 记账人 34 | */ 35 | private Integer userId; 36 | 37 | /** 38 | * 账户Id 39 | */ 40 | private Integer recordAccountId; 41 | 42 | /** 43 | * 账本Id 44 | */ 45 | private Integer recordBookId; 46 | 47 | /** 48 | * 记账类型 49 | */ 50 | @DictValue(code = "recordType") 51 | private Integer recordType; 52 | 53 | /** 54 | * 记账类别 55 | */ 56 | private String recordCategory; 57 | 58 | /** 59 | * 流入账户 60 | */ 61 | private Integer sourceAccountId; 62 | 63 | /** 64 | * 流出账户 65 | */ 66 | private Integer targetAccountId; 67 | 68 | /** 69 | * 关联记录Id 70 | */ 71 | private Integer relationRecordId; 72 | 73 | /** 74 | * 金额 75 | */ 76 | private Double amount; 77 | 78 | @JsonFormat(pattern ="yyyy-MM-dd",timezone ="GMT+8") 79 | private Date occurTime; 80 | 81 | private String tag; 82 | 83 | /** 84 | * 备注 85 | */ 86 | private String remark; 87 | 88 | private Integer status; 89 | 90 | /** 91 | * 报销状态 92 | */ 93 | private Integer recoverableStatus; 94 | } 95 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/controller/basic/RegisterController.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.controller.basic; 2 | 3 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 4 | import cn.jackbin.SimpleRecord.constant.SexConstant; 5 | import cn.jackbin.SimpleRecord.entity.UserDO; 6 | import cn.jackbin.SimpleRecord.service.UserService; 7 | import cn.jackbin.SimpleRecord.utils.PasswordUtil; 8 | import cn.jackbin.SimpleRecord.vo.RegisterVO; 9 | import cn.jackbin.SimpleRecord.vo.Result; 10 | import io.swagger.annotations.Api; 11 | import io.swagger.annotations.ApiOperation; 12 | import org.springframework.beans.BeanUtils; 13 | import org.springframework.beans.factory.annotation.Autowired; 14 | import org.springframework.validation.annotation.Validated; 15 | import org.springframework.web.bind.annotation.PostMapping; 16 | import org.springframework.web.bind.annotation.RequestBody; 17 | import org.springframework.web.bind.annotation.RequestMapping; 18 | import org.springframework.web.bind.annotation.RestController; 19 | 20 | /** 21 | * @author: create by bin 22 | * @version: v1.0 23 | * @description: cn.jackbin.SimpleRecord.controller.basic 24 | * @date: 2021/2/1 20:48 25 | **/ 26 | @Api(value = "LoginController", tags = { "用户注册接口" }) 27 | @RestController 28 | @RequestMapping(value = "/register") 29 | public class RegisterController { 30 | @Autowired 31 | private UserService userService; 32 | 33 | @ApiOperation(value = "注册用户") 34 | @PostMapping 35 | public Result register(@RequestBody @Validated RegisterVO vo) { 36 | if (userService.getByName(vo.getUsername()) != null) { 37 | return Result.error(CodeMsg.USERNAME_EXIST); 38 | } 39 | if (!PasswordUtil.check(vo.getPassword())) { 40 | return Result.error(CodeMsg.PSW_FORMAT_ERROR); 41 | } 42 | if (SexConstant.MAN !=vo.getSex() && SexConstant.WOMAN != vo.getSex()) { 43 | return Result.error(CodeMsg.SEX_FORMAT_ERROR); 44 | } 45 | UserDO userDO = new UserDO(); 46 | BeanUtils.copyProperties(vo, userDO); 47 | userDO.setCredential(PasswordUtil.encoder(vo.getPassword())); 48 | userService.saveWithDefaultRole(userDO); 49 | return Result.success(); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/controller/basic/DictItemController.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.controller.basic; 2 | 3 | import cn.jackbin.SimpleRecord.entity.DictItemDO; 4 | import cn.jackbin.SimpleRecord.service.DictItemService; 5 | import cn.jackbin.SimpleRecord.service.DictService; 6 | import cn.jackbin.SimpleRecord.vo.AddDictItemVO; 7 | import cn.jackbin.SimpleRecord.vo.EditDictItemVO; 8 | import cn.jackbin.SimpleRecord.vo.Result; 9 | import io.swagger.annotations.Api; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.validation.annotation.Validated; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | import javax.validation.constraints.Positive; 15 | 16 | import static cn.jackbin.SimpleRecord.controller.basic.DictController.checkDict; 17 | 18 | /** 19 | * @author: create by bin 20 | * @version: v1.0 21 | * @description: cn.jackbin.SimpleRecord.controller.basic 22 | * @date: 2021/8/12 20:37 23 | **/ 24 | @Api(value = "DictItemController", tags = { "字典项相关接口" }) 25 | @RestController 26 | @RequestMapping("/dictItem") 27 | public class DictItemController { 28 | @Autowired 29 | private DictItemService dictItemService; 30 | @Autowired 31 | private DictService dictService; 32 | 33 | @PostMapping("/add") 34 | public Result addDictItem(@RequestBody @Validated AddDictItemVO vo) { 35 | checkDict( dictService.getById(vo.getDictId())); 36 | dictItemService.add(vo.getDictId(), vo.getText(), vo.getValue(), vo.getOrderNo(), vo.getRemark()); 37 | return Result.success(); 38 | } 39 | 40 | @PutMapping("/edit") 41 | public Result editDictItem(@RequestBody @Validated EditDictItemVO vo) { 42 | checkDict( dictService.getById(vo.getDictId())); 43 | dictItemService.edit(vo.getId(), vo.getText(), vo.getValue(), vo.getOrderNo(), vo.getRemark()); 44 | return Result.success(); 45 | } 46 | 47 | @DeleteMapping("/{id}") 48 | public Result delDictItem(@PathVariable @Validated @Positive(message = "Id需为正数") Integer id) { 49 | DictItemDO dictItemDO = dictItemService.getById(id); 50 | checkDict( dictService.getById(dictItemDO.getDictId())); 51 | dictItemService.removeById(id); 52 | return Result.success(); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/manager/AsyncManager.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.manager; 2 | 3 | import cn.jackbin.SimpleRecord.utils.SpringContextUtil; 4 | import cn.jackbin.SimpleRecord.utils.ThreadUtil; 5 | 6 | import java.util.TimerTask; 7 | import java.util.concurrent.Future; 8 | import java.util.concurrent.ScheduledExecutorService; 9 | import java.util.concurrent.ThreadPoolExecutor; 10 | import java.util.concurrent.TimeUnit; 11 | 12 | /** 13 | * @author: create by bin 14 | * @version: v1.0 15 | * @description: 异步任务管理器 16 | * @date: 2021/4/8 21:25 17 | **/ 18 | public class AsyncManager { 19 | /** 20 | * 操作延迟10毫秒 21 | */ 22 | private final int OPERATE_DELAY_TIME = 10; 23 | 24 | /** 25 | * 异步延时任务调度线程池 26 | */ 27 | private final ScheduledExecutorService scheduledExecutorService = SpringContextUtil.getBean("scheduledExecutorService"); 28 | 29 | private final ThreadPoolExecutor poolExecutor = SpringContextUtil.getBean("threadPoolExecutor"); 30 | 31 | /** 32 | * 单例模式 33 | */ 34 | private AsyncManager(){} 35 | 36 | private static final AsyncManager me = new AsyncManager(); 37 | 38 | public static AsyncManager me() 39 | { 40 | return me; 41 | } 42 | 43 | /** 44 | * 执行延时任务 45 | * 46 | * @param task 任务 47 | */ 48 | public void schedule(TimerTask task) 49 | { 50 | scheduledExecutorService.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); 51 | } 52 | 53 | /** 54 | * 执行延时任务 55 | * 56 | * @param task 任务 57 | */ 58 | public void schedule(TimerTask task, long delay) 59 | { 60 | scheduledExecutorService.schedule(task, delay, TimeUnit.MILLISECONDS); 61 | } 62 | 63 | /** 64 | * 异步执行任务 65 | */ 66 | public void execute(Runnable task) { 67 | poolExecutor.execute(task); 68 | } 69 | 70 | /** 71 | * 异步提交任务 72 | */ 73 | public Future submit(Runnable task) { 74 | return poolExecutor.submit(task); 75 | } 76 | 77 | /** 78 | * 停止任务线程池 79 | */ 80 | public void shutdown() 81 | { 82 | ThreadUtil.shutdownAndAwaitTermination(scheduledExecutorService); 83 | ThreadUtil.shutdownAndAwaitTermination(poolExecutor); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/utils/ClassUtil.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.utils; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnore; 4 | 5 | import java.beans.BeanInfo; 6 | import java.beans.IntrospectionException; 7 | import java.beans.Introspector; 8 | import java.beans.PropertyDescriptor; 9 | import java.lang.reflect.Field; 10 | import java.lang.reflect.InvocationTargetException; 11 | import java.lang.reflect.Method; 12 | import java.util.HashMap; 13 | import java.util.Map; 14 | 15 | /** 16 | * @author: create by bin 17 | * @version: v1.0 18 | * @description: cn.jackbin.SimpleRecord.utils 19 | * @date: 2021/9/1 21:02 20 | **/ 21 | public class ClassUtil { 22 | /** 23 | * 获取属性值 24 | */ 25 | public static Object getProperty(Field field, Object instance) { 26 | try { 27 | field.setAccessible(true); 28 | PropertyDescriptor pd = new PropertyDescriptor(field.getName(), instance.getClass()); 29 | Method readMethod = pd.getReadMethod(); 30 | return readMethod.invoke(instance); 31 | } catch (InvocationTargetException | IllegalAccessException | IntrospectionException e) { 32 | e.printStackTrace(); 33 | } 34 | return null; 35 | } 36 | 37 | /** 38 | * Bean转为Map 39 | * @param bean 40 | * @return 41 | * @throws Exception 42 | */ 43 | public static Map bean2map(Object bean) { 44 | Map map = new HashMap<>(); 45 | try { 46 | // 获取JavaBean的描述器 47 | BeanInfo b = Introspector.getBeanInfo(bean.getClass(),Object.class); 48 | //获取属性描述器 49 | PropertyDescriptor[] pds = b.getPropertyDescriptors(); 50 | //对属性迭代 51 | for (PropertyDescriptor pd : pds) { 52 | //属性名称 53 | String propertyName = pd.getName(); 54 | //属性值,用getter方法获取 55 | Method m = pd.getReadMethod(); 56 | Object properValue = m.invoke(bean);//用对象执行getter方法获得属性值 57 | //把属性名-属性值 存到Map中 58 | map.put(propertyName, properValue); 59 | } 60 | } catch (IntrospectionException | IllegalAccessException | InvocationTargetException e) { 61 | e.printStackTrace(); 62 | } 63 | return map; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/resources/mapper/RoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 12 | 13 | 35 | 36 | 59 | 60 | 61 | update tb_role set delete_time = null where id = #{id} 62 | 63 | 64 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/mapper/RecordDetailMapper.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.mapper; 2 | 3 | import cn.jackbin.SimpleRecord.dto.MonthRecordAnalysisDTO; 4 | import cn.jackbin.SimpleRecord.dto.RecordDetailBookSumDTO; 5 | import cn.jackbin.SimpleRecord.dto.SpendCategoryTotalDTO; 6 | import cn.jackbin.SimpleRecord.entity.RecordDetailDO; 7 | import cn.jackbin.SimpleRecord.dto.RecordDetailDTO; 8 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 9 | import com.baomidou.mybatisplus.core.metadata.IPage; 10 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 11 | import org.springframework.stereotype.Repository; 12 | 13 | import java.util.Date; 14 | import java.util.List; 15 | 16 | /** 17 | * @author: create by bin 18 | * @version: v1.0 19 | * @description: cn.jackbin.SimpleRecord.mapper 20 | * @date: 2020/9/16 22:30 21 | **/ 22 | @Repository 23 | public interface RecordDetailMapper extends BaseMapper { 24 | 25 | /** 26 | * 根据月份查询总额 27 | * @param userId 用户Id 28 | * @param recordType 记录类型Id 29 | * @param date 时间 30 | * @return List 31 | */ 32 | Double queryTotalByMonth(Integer userId, Integer recordType, Date date); 33 | 34 | /** 35 | * 获取花费类别的消费总额 36 | * @param userId 用户Id 37 | * @param recordTypeCode 记账类型Code 38 | * @param date 时间 39 | * @param begin 索引 40 | * @param end 索引 41 | * @return 42 | */ 43 | List querySpendSpendCategoryTotalByMonth(Integer userId, Integer recordType, Date date, int begin, int end); 44 | 45 | List querySpendSpendCategoryTotalByYear(Integer userId, Integer recordType, Date date); 46 | 47 | /** 48 | * 查询用户某个月内的记账记录 49 | */ 50 | IPage queryByMonthAndBook(Page page, Integer recordBookId, Integer userId, Date date, Date occurTime, String keyWord); 51 | 52 | IPage queryByMonthAndAccount(Page page, Integer recordAccountId, Integer userId, Date date, Date occurTime, String keyWord); 53 | 54 | /** 55 | * 查询报销记录 56 | */ 57 | IPage queryRecoverableList(Page page, Integer userId, Integer recoverableStatus); 58 | 59 | List queryByInterval(Integer userId, Integer recordType, Date beginDate, Date endDate); 60 | 61 | /** 62 | * 获取账本的总计 63 | */ 64 | List querySumByRecordBookIds(Integer recordTypeId, List recordBookIds); 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/controller/auth/WechatAuthController.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.controller.auth; 2 | 3 | import cn.jackbin.SimpleRecord.common.anotations.CommonLog; 4 | import cn.jackbin.SimpleRecord.common.enums.BusinessType; 5 | import cn.jackbin.SimpleRecord.constant.UrlConstant; 6 | import cn.jackbin.SimpleRecord.service.WechatAuthService; 7 | import cn.jackbin.SimpleRecord.utils.HttpUtil; 8 | import cn.jackbin.SimpleRecord.vo.LoginSuccessVO; 9 | import cn.jackbin.SimpleRecord.vo.Result; 10 | import cn.jackbin.SimpleRecord.vo.WechatUserVO; 11 | import com.alibaba.fastjson.JSON; 12 | import io.swagger.annotations.Api; 13 | import io.swagger.annotations.ApiOperation; 14 | import org.springframework.beans.factory.annotation.Autowired; 15 | import org.springframework.beans.factory.annotation.Value; 16 | import org.springframework.validation.annotation.Validated; 17 | import org.springframework.web.bind.annotation.*; 18 | 19 | import javax.validation.constraints.NotNull; 20 | import java.util.HashMap; 21 | import java.util.Map; 22 | 23 | /** 24 | * @author: create by bin 25 | * @version: v1.0 26 | * @description: cn.jackbin.SimpleRecord.controller.auth 27 | * @date: 2020/11/2 20:45 28 | **/ 29 | @Api(value = "WechatAuthController", tags = { "微信授权接口" }) 30 | @RestController 31 | @RequestMapping("/wx") 32 | public class WechatAuthController { 33 | @Value("${wechat.appId}") 34 | private String appId; 35 | @Value("${wechat.appSecret}") 36 | private String appSecret; 37 | 38 | @Autowired 39 | private WechatAuthService wechatAuthService; 40 | 41 | @CommonLog(title = "获取微信openId", businessType = BusinessType.GRANT) 42 | @ApiOperation(value = "获取微信openId") 43 | @GetMapping("/openId/{code}") 44 | public Result getOpenId(@Validated @NotNull(message = "code不能为空") @PathVariable("code") String code) { 45 | Map map = new HashMap<>(); 46 | map.put("appid", appId); 47 | map.put("secret", appSecret); 48 | map.put("js_code", code); 49 | map.put("grant_type", "authorization_code"); 50 | String result = HttpUtil.doGet(UrlConstant.wechatOpenIdUrl, map); 51 | return Result.success(JSON.parse(result)); 52 | } 53 | 54 | @CommonLog(title = "微信登录授权", businessType = BusinessType.GRANT) 55 | @ApiOperation(value = "微信登录授权") 56 | @PostMapping("/login") 57 | public Result wechatLogin(@RequestBody @Validated WechatUserVO vo) { 58 | LoginSuccessVO successVO = wechatAuthService.wechatLogin(vo); 59 | return Result.success(successVO); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/utils/ThreadUtil.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.utils; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | import java.util.concurrent.*; 6 | 7 | /** 8 | * @author: create by bin 9 | * @version: v1.0 10 | * @description: 线程相关工具类 11 | * @date: 2021/4/8 21:29 12 | **/ 13 | @Slf4j 14 | public class ThreadUtil { 15 | /** 16 | * sleep等待,单位为毫秒 17 | */ 18 | public static void sleep(long milliseconds) 19 | { 20 | try 21 | { 22 | Thread.sleep(milliseconds); 23 | } 24 | catch (InterruptedException e) 25 | { 26 | return; 27 | } 28 | } 29 | 30 | /** 31 | * 停止线程池 32 | * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. 33 | * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. 34 | * 如果仍人超時,則強制退出. 35 | * 另对在shutdown时线程本身被调用中断做了处理. 36 | */ 37 | public static void shutdownAndAwaitTermination(ExecutorService pool) 38 | { 39 | if (pool != null && !pool.isShutdown()) 40 | { 41 | pool.shutdown(); 42 | try 43 | { 44 | if (!pool.awaitTermination(120, TimeUnit.SECONDS)) 45 | { 46 | pool.shutdownNow(); 47 | if (!pool.awaitTermination(120, TimeUnit.SECONDS)) 48 | { 49 | log.info("Pool did not terminate"); 50 | } 51 | } 52 | } 53 | catch (InterruptedException ie) 54 | { 55 | pool.shutdownNow(); 56 | Thread.currentThread().interrupt(); 57 | } 58 | } 59 | } 60 | 61 | /** 62 | * 打印线程异常信息 63 | */ 64 | public static void printException(Runnable r, Throwable t) 65 | { 66 | if (t == null && r instanceof Future) 67 | { 68 | try 69 | { 70 | Future future = (Future) r; 71 | if (future.isDone()) 72 | { 73 | future.get(); 74 | } 75 | } 76 | catch (CancellationException ce) 77 | { 78 | t = ce; 79 | } 80 | catch (ExecutionException ee) 81 | { 82 | t = ee.getCause(); 83 | } 84 | catch (InterruptedException ie) 85 | { 86 | Thread.currentThread().interrupt(); 87 | } 88 | } 89 | if (t != null) 90 | { 91 | log.error(t.getMessage(), t); 92 | } 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/impl/IncomeRecordDetail.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service.impl; 2 | 3 | import cn.jackbin.SimpleRecord.bo.RecordDetailBO; 4 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 5 | import cn.jackbin.SimpleRecord.constant.RecordConstant; 6 | import cn.jackbin.SimpleRecord.entity.RecordAccountDO; 7 | import cn.jackbin.SimpleRecord.entity.RecordDetailDO; 8 | import cn.jackbin.SimpleRecord.exception.BusinessException; 9 | import cn.jackbin.SimpleRecord.service.*; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.stereotype.Component; 12 | 13 | import javax.annotation.PostConstruct; 14 | 15 | /** 16 | * @author: create by bin 17 | * @version: v1.0 18 | * @description: 收入记账策略 19 | * @date: 2021/10/8 20:59 20 | **/ 21 | @Component 22 | public class IncomeRecordDetail implements RecordDetailHandler { 23 | 24 | @Autowired 25 | private RecordDetailFactory factory; 26 | @Autowired 27 | private RecordDetailService recordDetailService; 28 | 29 | @Autowired 30 | private RecordAccountService recordAccountService; 31 | 32 | @Autowired 33 | private DictItemService dictItemService; 34 | 35 | @PostConstruct 36 | public void init(){ 37 | factory.addHandler(INCOME_TYPE, this); 38 | } 39 | 40 | @Override 41 | public void handleAdd(Integer userId, RecordDetailBO bo) { 42 | recordDetailService.add(userId, bo.getTargetAccountId(), bo.getRecordBookId(), bo.getRecordTypeId(), bo.getRecordCategory(), 43 | bo.getAmount(), bo.getOccurTime(), bo.getTag(), bo.getRemark(), null); 44 | } 45 | 46 | @Override 47 | public void handleUpdate(RecordDetailBO bo) { 48 | recordDetailService.update(bo.getId(), bo.getTargetAccountId(), bo.getRecordBookId(), bo.getRecordTypeId(), bo.getRecordCategory(), 49 | bo.getAmount(), bo.getOccurTime(), bo.getTag(), bo.getRemark(), null); 50 | } 51 | 52 | @Override 53 | public void handleDel(RecordDetailDO recordDetailDO) { 54 | recordDetailService.removeById(recordDetailDO.getId()); 55 | } 56 | 57 | @Override 58 | public void check(Integer userId, RecordDetailBO recordDetailBO) { 59 | // 目标账户不能为应收/应付账户 60 | RecordAccountDO targetAccount = recordAccountService.getById(recordDetailBO.getTargetAccountId()); 61 | String accountType = dictItemService.getById(targetAccount.getType()).getValue(); 62 | if (RecordConstant.PAYMENT_ACCOUNT.equals(accountType)){ 63 | throw new BusinessException(CodeMsg.TARGET_RECORD_ACCOUNT_NOT_PAYMENT); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/impl/RoleMenuServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service.impl; 2 | 3 | import cn.jackbin.SimpleRecord.entity.RoleMenuDO; 4 | import cn.jackbin.SimpleRecord.mapper.RoleMenuMapper; 5 | import cn.jackbin.SimpleRecord.service.RoleMenuService; 6 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 7 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Service; 10 | import org.springframework.transaction.annotation.Transactional; 11 | 12 | import java.util.ArrayList; 13 | import java.util.Iterator; 14 | import java.util.List; 15 | 16 | /** 17 | *

18 | * 服务实现类 19 | *

20 | * 21 | * @author jackbin 22 | * @since 2020-07-21 23 | */ 24 | @Service 25 | public class RoleMenuServiceImpl extends ServiceImpl implements RoleMenuService { 26 | @Autowired 27 | private RoleMenuMapper roleMenuMapper; 28 | 29 | @Override 30 | public List getByRoleId(int id) { 31 | QueryWrapper queryWrapper = new QueryWrapper<>(); 32 | queryWrapper.eq("role_id",id); 33 | return list(queryWrapper); 34 | } 35 | 36 | @Override 37 | public void removeByRoleId(Integer roleId) { 38 | QueryWrapper queryWrapper = new QueryWrapper<>(); 39 | queryWrapper.eq("role_id", roleId); 40 | roleMenuMapper.delete(queryWrapper); 41 | } 42 | 43 | @Override 44 | public int removeByIds(List ids) { 45 | return roleMenuMapper.deleteBatch(ids); 46 | } 47 | 48 | @Transactional 49 | @Override 50 | public void edit(Integer roleId, List menuIds) { 51 | // 查询该角色的所有的菜单权限 52 | List existedRDs = getByRoleId(roleId); 53 | Iterator iterator = existedRDs.iterator(); 54 | while (iterator.hasNext()) { 55 | RoleMenuDO temp = iterator.next(); 56 | if (menuIds.contains(temp.getMenuId())) { 57 | menuIds.remove(temp.getMenuId()); 58 | iterator.remove(); 59 | } 60 | } 61 | List delIds = new ArrayList<>(); 62 | existedRDs.forEach(n -> delIds.add(n.getId())); 63 | // 删除菜单权限 64 | if (delIds.size() > 0) { 65 | removeByIds(delIds); 66 | } 67 | // 添加该角色的菜单权限 68 | List list = new ArrayList<>(); 69 | for (Integer i : menuIds) { 70 | list.add(new RoleMenuDO(roleId, i)); 71 | } 72 | saveBatch(list); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/controller/record/HomeController.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.controller.record; 2 | 3 | import cn.jackbin.SimpleRecord.common.LocalUser; 4 | import cn.jackbin.SimpleRecord.common.LocalUserId; 5 | import cn.jackbin.SimpleRecord.common.anotations.CommonLog; 6 | import cn.jackbin.SimpleRecord.common.anotations.LoginRequired; 7 | import cn.jackbin.SimpleRecord.common.enums.BusinessType; 8 | import cn.jackbin.SimpleRecord.constant.RecordConstant; 9 | import cn.jackbin.SimpleRecord.dto.SpendCategoryTotalDTO; 10 | import cn.jackbin.SimpleRecord.entity.UserDO; 11 | import cn.jackbin.SimpleRecord.service.RecordDetailService; 12 | import cn.jackbin.SimpleRecord.vo.Result; 13 | import io.swagger.annotations.Api; 14 | import io.swagger.annotations.ApiOperation; 15 | import io.swagger.annotations.ApiParam; 16 | import org.springframework.beans.factory.annotation.Autowired; 17 | import org.springframework.format.annotation.DateTimeFormat; 18 | import org.springframework.validation.annotation.Validated; 19 | import org.springframework.web.bind.annotation.*; 20 | 21 | import java.util.Date; 22 | import java.util.List; 23 | 24 | /** 25 | * @author: create by bin 26 | * @version: v1.0 27 | * @description: cn.jackbin.SimpleRecord.controller.record 28 | * @date: 2021/3/16 20:00 29 | **/ 30 | @Api(value = "AnalysisController", tags = { "主页访问接口" }) 31 | @RestController 32 | @RequestMapping("/home") 33 | public class HomeController { 34 | @Autowired 35 | private RecordDetailService recordDetailService; 36 | 37 | @CommonLog(title = "获取某个月份的支出和收入", businessType = BusinessType.QUERY) 38 | @ApiOperation(value = "获取某个月份的支出和收入") 39 | @GetMapping("/spendTotalInMonth/{date}") 40 | public Result getSpendTotalInMonth(@ApiParam(required = true, value = "年月(yyyy-MM)") @Validated 41 | @DateTimeFormat(pattern="yyyy-MM") @PathVariable(value = "date") Date date) { 42 | Long userId = LocalUserId.get(); 43 | List list = recordDetailService.getSpendTotalByMonth(userId.intValue(), date); 44 | return Result.success(list); 45 | } 46 | 47 | @CommonLog(title = "获取某个月份前三消费类别", businessType = BusinessType.QUERY) 48 | @ApiOperation(value = "获取某个月份前三消费类别") 49 | @GetMapping("/topThreeSpendCategoryTotal/{date}") 50 | public Result getTopThreeSpendTotal(@ApiParam(required = true, value = "年月(yyyy-MM)") @Validated 51 | @DateTimeFormat(pattern="yyyy-MM") @PathVariable(value = "date")Date date) { 52 | Long userId = LocalUserId.get(); 53 | List list = recordDetailService.getSpendTotalBySpendCategory(userId.intValue(), RecordConstant.EXPEND_RECORD_TYPE, 54 | date, 0, 3); 55 | return Result.success(list); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/constant/CodeMsg.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.constant; 2 | 3 | /** 4 | * 全局错误码 5 | **/ 6 | public enum CodeMsg { 7 | 8 | // 按照模块定义CodeMsg 9 | // 成功 10 | SUCCESS(0,"success"), 11 | // 通用异常 12 | ERROR(-1,"接口调用异常"), 13 | FAILED(100,"接口调用失败"), 14 | SERVER_EXCEPTION(101,"服务端异常"), 15 | JWT_EXCEPTION(102,"JWT校验异常"), 16 | WITHOUT_PERMISSION(103, "权限不足,请联系管理员"), 17 | TOKEN_EXPIRED(104, "token失效"), 18 | 19 | 20 | 21 | // 通用业务 格式500 xxx 22 | BUSINESS_ERROR(500000,"业务异常"), 23 | ONLINE_USER_OVER(500003,"在线用户数超出允许登录的最大用户限制。"), 24 | NOT_FIND_DATA(500005,"查找不到对应数据"), 25 | VERIFY_CODE_ERROR(500006,"验证码错误"), 26 | PARAMETER_ISNULL(500007,"参数为空"), 27 | PARAMETER_ILLEGAL(500008,"参数不合法"), 28 | UPLOAD_IMAGE_ILLEGAL(500009,"上传的图片不能为空"), 29 | EMPTY_PAGE_SIZE_OR_PAGE_INDEX(500010,"分页大小或页码为空"), 30 | ADD_DATA_ERROR(500011,"添加数据失败"), 31 | EDIT_DATA_ERROR(500012,"编辑数据失败"), 32 | OPERATE_FAILED(500013,"本次操作失败"), 33 | CANT_OPERATE_SYS_DATA(500014,"系统内置数据不可操作"), 34 | 35 | 36 | // 系统相关 格式600 xxx 37 | LOGIN_ERROR(600001,"用户名或密码错误,请重新登录"), 38 | USERNAME_EXIST(600002,"用户名重复"), 39 | PSW_FORMAT_ERROR(600003,"密码是由8至16位的数字和字母组成,请重新输入"), 40 | SEX_FORMAT_ERROR(600003,"性别未识别"), 41 | ROLE_NAME_EXIST(600004, "角色名重复"), 42 | ROLE_EDIT_NOT_ALLOWED(600005, "系统内置角色请勿删除或改名"), 43 | DICT_CODE_EXIST(600006, "字典编码重复"), 44 | 45 | // 记账相关 格式700 xxx 46 | INSERT_RECORD_ERROR(700001,"新增记账记录失败"), 47 | UPDATE_RECORD_ERROR(700002,"更新记账记录失败"), 48 | OPERATE_RECORD_FORBIDDEN(700003,"禁止操作他人记账记录"), 49 | DEL_RECORD_ERROR(700004,"删除记账记录失败"), 50 | RECORD_TYPE_CODE_ERROR(700005,"记账类型编码错误"), 51 | RECORD_ACCOUNT_SIZE_TOO_MUCH(700006,"记账账户请勿过多"), 52 | DEL_RECORD_BOOK_ERROR(700007,"删除账单失败"), 53 | ONE_DEFAULT_RECORD_BOOK(700008,"默认账单有且仅有一个"), 54 | OPERATE_RECORD_ACCOUNT_FORBIDDEN(700009,"禁止操作他人记账账户"), 55 | SOURCE_ACCOUNT_NOT_NULL(700010,"源账户不能为空"), 56 | SOURCE_CANT_EQUAL_TARGET_ACCOUNT(700011,"转出与转入账户不能相同"), 57 | OPERATE_RECORD_BOOK_FORBIDDEN(7000012,"禁止操作他人记账账单"), 58 | TARGET_RECORD_ACCOUNT_NOT_PAYMENT(700013, "目标账户不能为应收应付类型"), 59 | SOURCE_RECORD_ACCOUNT_PAYMENT_ONLY(700014, "源账户只能为应收应付类型"), 60 | SOURCE_RECORD_ACCOUNT_NOT_PAYMENT(700015, "源账户不能为应收应付类型"), 61 | TARGET_RECORD_ACCOUNT_PAYMENT_ONLY(700016, "目标账户只能为应收应付类型"), 62 | RECORD_CATEGORY_ERROR(700017, "记账类别错误"), 63 | RECORD_BOOK_NAME_REPEAT(700018, "记账账本名称不可重复"), 64 | RECORD_BOOK_RELATED(700019, "账户仍有记账记录关联"), 65 | RECORD_ACCOUNT_RELATED(700019, "账户仍有记账记录关联"), 66 | RECORD_ACCOUNT_NAME_REPEAT(700020, "记账账户名称不可重复"), 67 | ; 68 | 69 | private final int retCode; 70 | private String message; 71 | 72 | CodeMsg(int retCode, String message) { 73 | this.retCode = retCode; 74 | this.message = message; 75 | } 76 | public int getRetCode() { 77 | return retCode; 78 | } 79 | public String getMessage() { 80 | return message; 81 | } 82 | public void setMessage(String message) { 83 | this.message = message; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/impl/RoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service.impl; 2 | 3 | import cn.jackbin.SimpleRecord.bo.PageBO; 4 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 5 | import cn.jackbin.SimpleRecord.entity.RoleDO; 6 | import cn.jackbin.SimpleRecord.exception.BusinessException; 7 | import cn.jackbin.SimpleRecord.mapper.RoleMapper; 8 | import cn.jackbin.SimpleRecord.service.RoleMenuService; 9 | import cn.jackbin.SimpleRecord.service.RoleService; 10 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 11 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.stereotype.Service; 14 | import org.springframework.transaction.annotation.Transactional; 15 | 16 | import java.util.*; 17 | 18 | /** 19 | *

20 | * 服务实现类 21 | *

22 | * 23 | * @author jackbin 24 | * @since 2020-07-21 25 | */ 26 | @Service 27 | public class RoleServiceImpl extends ServiceImpl implements RoleService { 28 | @Autowired 29 | private RoleMapper roleMapper; 30 | @Autowired 31 | private RoleMenuService roleMenuService; 32 | 33 | @Override 34 | public List getByUserId(Long userId) { 35 | return roleMapper.queryByUserId(userId); 36 | } 37 | 38 | @Override 39 | public List getRoles() { 40 | return roleMapper.selectList(new QueryWrapper<>()); 41 | } 42 | 43 | @Override 44 | public void getByPage(String name, Boolean deleted, Date date, PageBO pageBO) { 45 | int total = roleMapper.queryTotal(name, deleted, date); 46 | List list = roleMapper.queryByPage(name, deleted, date, pageBO.beginPosition(), pageBO.getPageSize()); 47 | pageBO.setTotal(total); 48 | pageBO.setList(list); 49 | } 50 | 51 | @Override 52 | public boolean add(String name, String info) { 53 | RoleDO roleDO = new RoleDO(); 54 | roleDO.setName(name); 55 | roleDO.setInfo(info); 56 | return roleMapper.insert(roleDO) > 0; 57 | } 58 | 59 | @Transactional 60 | @Override 61 | public void edit(Long id, String name, String info, List menuIds) { 62 | QueryWrapper queryWrapper = new QueryWrapper<>(); 63 | queryWrapper.ne("id", id); 64 | queryWrapper.eq("name", name); 65 | if (roleMapper.selectOne(queryWrapper) != null) { 66 | throw new BusinessException(CodeMsg.ROLE_NAME_EXIST); 67 | } 68 | RoleDO roleDO = new RoleDO(id, name, info); 69 | roleMapper.updateById(roleDO); 70 | if (menuIds.size() != 0) { 71 | roleMenuService.edit(id.intValue(), menuIds); 72 | } 73 | } 74 | 75 | @Override 76 | public void reset(Integer id) { 77 | roleMapper.notDelete(Long.valueOf(id)); 78 | } 79 | 80 | @Override 81 | public RoleDO getByName(String name) { 82 | QueryWrapper queryWrapper = new QueryWrapper<>(); 83 | queryWrapper.eq("name", name); 84 | return roleMapper.selectOne(queryWrapper); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/sercurity/JWTUser.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.sercurity; 2 | 3 | import cn.jackbin.SimpleRecord.bo.UserMenuBO; 4 | import cn.jackbin.SimpleRecord.constant.MenuConstants; 5 | import com.alibaba.fastjson.JSON; 6 | import org.apache.commons.lang3.StringUtils; 7 | import org.springframework.security.core.GrantedAuthority; 8 | import org.springframework.security.core.authority.SimpleGrantedAuthority; 9 | import org.springframework.security.core.userdetails.UserDetails; 10 | 11 | import java.util.ArrayList; 12 | import java.util.Collection; 13 | import java.util.List; 14 | 15 | /** 16 | * @author: create by bin 17 | * @version: v1.0 18 | * @description: cn.jackbin.SimpleRecord.common.config.sercurity 19 | * @date: 2020/8/3 20:16 20 | **/ 21 | public class JWTUser implements UserDetails { 22 | 23 | private final Long id; 24 | private final String username; 25 | private final String password; 26 | private final Collection authorities; 27 | 28 | public JWTUser(UserMenuBO userPermissionBO) { 29 | this.id = userPermissionBO.getUserDO().getId(); 30 | this.username = userPermissionBO.getUserDO().getUsername(); 31 | this.password = userPermissionBO.getUserDO().getCredential(); 32 | // 设置当前用户的权限集合 33 | List list = new ArrayList<>(); 34 | userPermissionBO.getMenuDOList().stream() 35 | // 跳过空权限字符(注:菜单和目录没有权限字符) 36 | .filter(n -> StringUtils.isNoneBlank(n.getPermissionSign())) 37 | .forEach(n-> list.add(new SimpleGrantedAuthority(n.getPermissionSign()))); 38 | this.authorities = list; 39 | } 40 | 41 | /** 42 | * 获取鉴权用户的角色 43 | * @return 44 | */ 45 | @Override 46 | public Collection getAuthorities() { 47 | return this.authorities; 48 | } 49 | 50 | @Override 51 | public String getPassword() { 52 | return this.password; 53 | } 54 | 55 | @Override 56 | public String getUsername() { 57 | return this.username; 58 | } 59 | 60 | /** 61 | * 获取账户是否过期 62 | * @return true 默认为true 63 | */ 64 | @Override 65 | public boolean isAccountNonExpired() { 66 | return true; 67 | } 68 | 69 | /** 70 | * 账户是否锁定 71 | * @return true 默认为true 72 | */ 73 | @Override 74 | public boolean isAccountNonLocked() { 75 | return true; 76 | } 77 | 78 | /** 79 | * 账户凭证是否过期 80 | * @return true 默认为true 81 | */ 82 | @Override 83 | public boolean isCredentialsNonExpired() { 84 | return true; 85 | } 86 | 87 | /** 88 | * 账号是否禁用 89 | * @return true 默认为true 90 | */ 91 | @Override 92 | public boolean isEnabled() { 93 | return true; 94 | } 95 | 96 | public Long getId() { 97 | return this.id; 98 | } 99 | 100 | @Override 101 | public String toString() { 102 | return JSON.toJSONString(this); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/SwaggerConfiguration.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config; 2 | 3 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 4 | import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.context.annotation.Import; 8 | import org.springframework.web.bind.annotation.RequestMethod; 9 | import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; 10 | import springfox.documentation.builders.ApiInfoBuilder; 11 | import springfox.documentation.builders.PathSelectors; 12 | import springfox.documentation.builders.RequestHandlerSelectors; 13 | import springfox.documentation.builders.ResponseMessageBuilder; 14 | import springfox.documentation.schema.ModelRef; 15 | import springfox.documentation.service.ApiInfo; 16 | import springfox.documentation.service.Contact; 17 | import springfox.documentation.spi.DocumentationType; 18 | import springfox.documentation.spring.web.plugins.Docket; 19 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 20 | 21 | import java.util.ArrayList; 22 | import java.util.List; 23 | 24 | /** 25 | * @author: create by bin 26 | * @version: v1.0 27 | * @description: cn.jackbin.SimpleRecord.common.config 28 | * @date: 2020/9/1 19:08 29 | **/ 30 | @Configuration 31 | @EnableSwagger2 32 | @EnableKnife4j 33 | @Import(BeanValidatorPluginsConfiguration.class) 34 | public class SwaggerConfiguration { 35 | private static List list = new ArrayList<>(); 36 | static { 37 | list.add(CodeMsg.JWT_EXCEPTION); 38 | list.add(CodeMsg.TOKEN_EXPIRED); 39 | } 40 | 41 | @Bean(value = "defaultApi2") 42 | public Docket defaultApi2() { 43 | List responseMessageList = new ArrayList<>(); 44 | list.forEach(n -> responseMessageList.add( 45 | new ResponseMessageBuilder().code(n.getRetCode()).message(n.getMessage()) 46 | .responseModel(new ModelRef(n.getMessage())).build())); 47 | return new Docket(DocumentationType.SWAGGER_2) 48 | .apiInfo(apiInfo()) 49 | //分组名称 50 | .groupName("2.X版本") 51 | .select() 52 | //这里指定Controller扫描包路径 53 | .apis(RequestHandlerSelectors.basePackage("cn.jackbin.SimpleRecord.controller")) 54 | .paths(PathSelectors.any()) 55 | .build() 56 | .globalResponseMessage(RequestMethod.GET, responseMessageList) 57 | .globalResponseMessage(RequestMethod.POST, responseMessageList) 58 | .globalResponseMessage(RequestMethod.PUT, responseMessageList) 59 | .globalResponseMessage(RequestMethod.DELETE, responseMessageList); 60 | } 61 | 62 | private ApiInfo apiInfo() { 63 | return new ApiInfoBuilder() 64 | .title("简账接口文档") 65 | .description("服务相关接口") 66 | .contact(new Contact("bin",null,"itsbintnt@163.com")) 67 | .version("1.0") 68 | .build(); 69 | } 70 | 71 | 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/impl/DictItemServiceImpl.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service.impl; 2 | 3 | import cn.jackbin.SimpleRecord.bo.PageBO; 4 | import cn.jackbin.SimpleRecord.constant.CommonConstants; 5 | import cn.jackbin.SimpleRecord.entity.DictItemDO; 6 | import cn.jackbin.SimpleRecord.mapper.DictItemMapper; 7 | import cn.jackbin.SimpleRecord.service.DictItemService; 8 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 9 | import com.baomidou.mybatisplus.core.metadata.IPage; 10 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 11 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.stereotype.Service; 14 | 15 | import java.util.List; 16 | 17 | /** 18 | * @author: create by bin 19 | * @version: v1.0 20 | * @description: cn.jackbin.SimpleRecord.service.impl 21 | * @date: 2021/8/4 20:08 22 | **/ 23 | @Service 24 | public class DictItemServiceImpl extends ServiceImpl implements DictItemService { 25 | @Autowired 26 | private DictItemMapper dictItemMapper; 27 | 28 | @Override 29 | public List getDictItemsByDictId(Integer dictId) { 30 | QueryWrapper queryWrapper = new QueryWrapper<>(); 31 | queryWrapper.eq("dict_id", dictId); 32 | queryWrapper.orderByAsc("order_no"); 33 | return dictItemMapper.selectList(queryWrapper); 34 | } 35 | 36 | @Override 37 | public void getByPage(Integer dictId, PageBO pageBO) { 38 | IPage page = new Page<>(pageBO.getPageNo(), pageBO.getPageSize()); 39 | QueryWrapper queryWrapper = new QueryWrapper<>(); 40 | queryWrapper.eq("dict_id", dictId); 41 | queryWrapper.orderByAsc("order_no"); 42 | page = dictItemMapper.selectPage(page, queryWrapper); 43 | pageBO.setTotal((int) page.getTotal()); 44 | pageBO.setList(page.getRecords()); 45 | } 46 | 47 | @Override 48 | public void add(Integer dictId, String text, String value, Integer orderNo, String remark) { 49 | DictItemDO dictItemDO = new DictItemDO(); 50 | dictItemDO.setDictId(dictId); 51 | dictItemDO.setText(text); 52 | dictItemDO.setValue(value); 53 | dictItemDO.setOrderNo(orderNo); 54 | dictItemDO.setRemark(remark); 55 | dictItemDO.setStatus(CommonConstants.STATUS_NORMAL); 56 | dictItemMapper.insert(dictItemDO); 57 | } 58 | 59 | @Override 60 | public void edit(Integer id, String text, String value, Integer orderNo, String remark) { 61 | DictItemDO dictItemDO = new DictItemDO(); 62 | dictItemDO.setId(Long.valueOf(id)); 63 | dictItemDO.setText(text); 64 | dictItemDO.setValue(value); 65 | dictItemDO.setOrderNo(orderNo); 66 | dictItemDO.setRemark(remark); 67 | dictItemMapper.updateById(dictItemDO); 68 | } 69 | 70 | @Override 71 | public void removeById(Long id) { 72 | dictItemMapper.delById(id); 73 | } 74 | 75 | @Override 76 | public DictItemDO getByValue(Integer dictId, String value) { 77 | QueryWrapper queryWrapper = new QueryWrapper<>(); 78 | queryWrapper.eq("dict_id", dictId); 79 | queryWrapper.eq("value", value); 80 | return dictItemMapper.selectOne(queryWrapper); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/GlobalExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config; 2 | 3 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 4 | import cn.jackbin.SimpleRecord.vo.Result; 5 | import cn.jackbin.SimpleRecord.exception.BaseException; 6 | import io.jsonwebtoken.JwtException; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.security.access.AccessDeniedException; 9 | import org.springframework.validation.BindException; 10 | import org.springframework.validation.ObjectError; 11 | import org.springframework.web.bind.MethodArgumentNotValidException; 12 | import org.springframework.web.bind.annotation.ExceptionHandler; 13 | import org.springframework.web.bind.annotation.RestControllerAdvice; 14 | 15 | import javax.validation.ConstraintViolationException; 16 | 17 | /** 18 | * @author: create by bin 19 | * @version: v1.0 20 | * @description: cn.jackbin.SimpleRecord.common.config 21 | * @date: 2020/7/27 20:10 22 | **/ 23 | @RestControllerAdvice 24 | @Slf4j 25 | public class GlobalExceptionHandler { 26 | 27 | /** 28 | *@description: 默认异常处理 29 | *@params: [e] 30 | *@return: cn.jackbin.SimpleRecord.vo.Result 31 | *@createTime: 2020/7/27 20:24 32 | *@author: edit by bin 33 | */ 34 | @ExceptionHandler(Exception.class) 35 | public Result handleException(Exception e){ 36 | log.error(e.getMessage()); 37 | return Result.error(CodeMsg.ERROR); 38 | } 39 | 40 | @ExceptionHandler(JwtException.class) 41 | public Result handleJwtException(JwtException e) { 42 | log.error(e.getMessage()); 43 | return Result.error(CodeMsg.JWT_EXCEPTION,e.getMessage()); 44 | } 45 | 46 | /** 47 | *@description: 参数校验不合法异常 48 | *@params: [e] 49 | *@return: cn.jackbin.SimpleRecord.vo.Result 50 | *@createTime: 2020/7/27 20:23 51 | *@author: edit by bin 52 | */ 53 | @ExceptionHandler(MethodArgumentNotValidException.class) 54 | public Result handleValidationBodyException(MethodArgumentNotValidException e){ 55 | log.error(e.getMessage()); 56 | for (ObjectError s : e.getBindingResult().getAllErrors()) { 57 | return Result.error(CodeMsg.FAILED, s.getDefaultMessage()); 58 | } 59 | return Result.error(CodeMsg.FAILED,e.getMessage()); 60 | } 61 | 62 | @ExceptionHandler(ConstraintViolationException.class) 63 | public Result handleConstraintViolationException(ConstraintViolationException e) { 64 | log.error(e.getMessage()); 65 | return Result.error(CodeMsg.FAILED,e.getMessage()); 66 | } 67 | 68 | @ExceptionHandler(AccessDeniedException.class) 69 | public Result handleAccessDeniedException(AccessDeniedException e) { 70 | log.error(e.getMessage()); 71 | return Result.error(CodeMsg.WITHOUT_PERMISSION); 72 | } 73 | 74 | @ExceptionHandler(BindException.class) 75 | public Result handleBindException(BindException e) { 76 | log.error(e.getMessage()); 77 | return Result.error(CodeMsg.PARAMETER_ILLEGAL); 78 | } 79 | 80 | /** 81 | *@description: 业务异常统一处理 82 | *@params: [e] 83 | *@return: cn.jackbin.SimpleRecord.vo.Result 84 | *@createTime: 2020/7/27 21:18 85 | *@author: edit by bin 86 | */ 87 | @ExceptionHandler(BaseException.class) 88 | public Result handleBusinessException(BaseException e){ 89 | log.error(e.getMessage()); 90 | return Result.error(e.getCodeMsg(),e.getMessage()); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/service/RecordDetailService.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.service; 2 | 3 | import cn.jackbin.SimpleRecord.dto.MonthRecordAnalysisDTO; 4 | import cn.jackbin.SimpleRecord.bo.PageBO; 5 | import cn.jackbin.SimpleRecord.dto.RecordDetailDTO; 6 | import cn.jackbin.SimpleRecord.dto.RecordDetailBookSumDTO; 7 | import cn.jackbin.SimpleRecord.dto.SpendCategoryTotalDTO; 8 | import cn.jackbin.SimpleRecord.entity.RecordDetailDO; 9 | import com.baomidou.mybatisplus.extension.service.IService; 10 | 11 | import java.util.Date; 12 | import java.util.List; 13 | 14 | /** 15 | *

16 | * 服务类 17 | *

18 | * 19 | * @author jackbin 20 | * @since 2020-07-21 21 | */ 22 | public interface RecordDetailService extends IService { 23 | 24 | int add(Integer userId, Integer recordAccountId, Integer recordBookId, Integer recordTypeId, String recordCategory, Double amount, 25 | Date occurTime, String tag, String remark, Integer recoverableStatus); 26 | 27 | int add(Integer userId, Integer recordAccountId, Integer sourceAccountId, Integer targetAccountId, Integer recordBookId, Integer relationRecordId, Integer recordTypeId, 28 | String recordCategory, Double amount, Date occurTime, String tag, String remark, Integer recoverableStatus); 29 | 30 | void update(Long id, Integer recordAccountId, Integer recordBookId, Integer recordTypeId, String recordCategory, Double amount, 31 | Date occurTime, String tag, String remark, Integer recoverableStatus 32 | ); 33 | 34 | void update(Long id, Integer recordBookId, Double amount, Date occurTime, String tag, String remark); 35 | 36 | /** 37 | * 找到关联记录 38 | * @param rid 关联id 39 | * @return 40 | */ 41 | RecordDetailDO getByRId(Integer rid); 42 | /** 43 | * 更新关联id 44 | * @param id 45 | * @param rid 46 | */ 47 | void updateRId(Long id, Integer rid); 48 | 49 | void removeByRId(Long rid); 50 | 51 | /** 52 | * 获取支出 53 | */ 54 | List getSpendTotalByMonth(Integer userId, Date date); 55 | 56 | /** 57 | * 获取某个月前三消费额 58 | */ 59 | List getSpendTotalBySpendCategory(Integer userId, String recordTypeCode, Date date, int begin, int end); 60 | 61 | List getSpendSpendCategoryTotalByYear(Integer userId, String recordTypeCode, Date date); 62 | 63 | /** 64 | * 查询用户某个月内的记账记录 65 | */ 66 | void getMonthBookRecords(Integer recordBookId, Integer userId, Date date, Date occurTime, String keyWord, PageBO pageBO); 67 | 68 | /** 69 | * 查询某个月内的账户流水 70 | */ 71 | void getMonthAccountRecords(Integer recordAccountId, Integer userId, Date date, Date occurTime, String keyWord, PageBO pageBO); 72 | 73 | void getRecoverableList(Integer userId, Integer recoverableStatus, PageBO pageBO); 74 | 75 | /** 76 | * 查询用户六个月内的记账记录 77 | */ 78 | List getLatestSixMonthList(Integer userId, String recordTypeCode, Date beginDate, Date endDate); 79 | 80 | List getSumByRecordBookIds(Integer recordTypeId, List recordBookIds); 81 | 82 | /** 83 | * 分页获取账本记账记录 84 | */ 85 | void getListByRecordBookId(Integer userId, Integer recordBookId, PageBO pageBO); 86 | 87 | /** 88 | * 分页获取账户记账记录 89 | */ 90 | void getListByRecordAccountId(Integer userId, Integer recordAccountId, PageBO pageBO); 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/common/config/sercurity/JWTConfig.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.common.config.sercurity; 2 | 3 | import cn.jackbin.SimpleRecord.constant.PermissionConstant; 4 | import io.jsonwebtoken.Claims; 5 | import io.jsonwebtoken.Jwts; 6 | import io.jsonwebtoken.SignatureAlgorithm; 7 | import org.springframework.beans.factory.annotation.Value; 8 | import org.springframework.stereotype.Component; 9 | 10 | import java.util.*; 11 | 12 | /** 13 | * @author: create by bin 14 | * @version: v1.0 15 | * @description: cn.jackbin.SimpleRecord.common.config 16 | * @date: 2020/7/22 21:46 17 | **/ 18 | @Component 19 | public class JWTConfig { 20 | 21 | @Value("${jwt.secret}") 22 | private String secret; 23 | 24 | @Value("${jwt.expire}") 25 | private long expire; 26 | 27 | @Value("${jwt.header}") 28 | private String header; 29 | 30 | /** 31 | * 生成token 32 | * @param subject 33 | * @return 34 | */ 35 | /** 36 | * 生成Token 37 | * @param userName 38 | * @param permissionList 39 | * @return 40 | */ 41 | public String createToken (String userName, List permissionList){ 42 | Date nowDate = new Date(); 43 | Date expireDate = new Date(nowDate.getTime() + expire * 1000 * 3600);//过期时间 44 | Map map = new HashMap<>(); 45 | map.put(PermissionConstant.PermissionSign,permissionList); 46 | return Jwts.builder() 47 | .setHeaderParam("typ", "JWT") 48 | .setClaims(map) 49 | .setSubject(userName) 50 | .setIssuedAt(nowDate) 51 | .setExpiration(expireDate) 52 | .signWith(SignatureAlgorithm.HS512, secret) 53 | .compact(); 54 | } 55 | /** 56 | * 获取token中注册信息 57 | * @param token 58 | * @return 59 | */ 60 | public Claims getTokenClaim (String token) { 61 | try { 62 | return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); 63 | }catch (Exception e){ 64 | // e.printStackTrace(); 65 | return null; 66 | } 67 | } 68 | /** 69 | * 验证token是否过期失效 70 | * @param claims 71 | * @return 72 | */ 73 | public boolean isTokenExpired (Claims claims) { 74 | return claims.getExpiration().before(new Date()); 75 | } 76 | 77 | /** 78 | * 获取用户名从token中 79 | */ 80 | public String getUserIdFromToken(Claims claims) { 81 | return claims.getSubject(); 82 | } 83 | 84 | /** 85 | * 获取用户权限列表 86 | */ 87 | @SuppressWarnings("unchecked") 88 | public List getPermissions(Claims claims) { 89 | return (List)claims.get(PermissionConstant.PermissionSign); 90 | } 91 | 92 | /** 93 | * 获取jwt发布时间 94 | */ 95 | public Date getIssuedAtDateFromToken(Claims claims) { 96 | return claims.getIssuedAt(); 97 | } 98 | 99 | // --------------------- getter & setter --------------------- 100 | 101 | public String getSecret() { 102 | return secret; 103 | } 104 | public void setSecret(String secret) { 105 | this.secret = secret; 106 | } 107 | public long getExpire() { 108 | return expire; 109 | } 110 | public void setExpire(long expire) { 111 | this.expire = expire; 112 | } 113 | public String getHeader() { 114 | return header; 115 | } 116 | public void setHeader(String header) { 117 | this.header = header; 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/main/java/cn/jackbin/SimpleRecord/controller/record/AnalysisController.java: -------------------------------------------------------------------------------- 1 | package cn.jackbin.SimpleRecord.controller.record; 2 | 3 | import cn.jackbin.SimpleRecord.dto.MonthRecordAnalysisDTO; 4 | import cn.jackbin.SimpleRecord.common.LocalUserId; 5 | import cn.jackbin.SimpleRecord.common.anotations.CommonLog; 6 | import cn.jackbin.SimpleRecord.common.enums.BusinessType; 7 | import cn.jackbin.SimpleRecord.constant.CodeMsg; 8 | import cn.jackbin.SimpleRecord.constant.RecordConstant; 9 | import cn.jackbin.SimpleRecord.dto.SpendCategoryTotalDTO; 10 | import cn.jackbin.SimpleRecord.service.RecordDetailService; 11 | import cn.jackbin.SimpleRecord.utils.DateUtil; 12 | import cn.jackbin.SimpleRecord.vo.GetSixMonthRecordsVO; 13 | import cn.jackbin.SimpleRecord.vo.Result; 14 | import io.swagger.annotations.Api; 15 | import io.swagger.annotations.ApiOperation; 16 | import io.swagger.annotations.ApiParam; 17 | import org.springframework.beans.factory.annotation.Autowired; 18 | import org.springframework.format.annotation.DateTimeFormat; 19 | import org.springframework.security.access.prepost.PreAuthorize; 20 | import org.springframework.validation.annotation.Validated; 21 | import org.springframework.web.bind.annotation.*; 22 | 23 | import javax.validation.constraints.NotNull; 24 | import java.util.Date; 25 | import java.util.List; 26 | 27 | /** 28 | * @author: create by bin 29 | * @version: v1.0 30 | * @description: cn.jackbin.SimpleRecord.controller.record 31 | * @date: 2021/3/16 21:05 32 | **/ 33 | @Api(value = "AnalysisController", tags = { "分析访问接口" }) 34 | @RestController 35 | @RequestMapping("/analysis") 36 | public class AnalysisController { 37 | @Autowired 38 | private RecordDetailService recordDetailService; 39 | 40 | @CommonLog(title = "获取某年所有消费类别的总额", businessType = BusinessType.QUERY) 41 | @ApiOperation(value = "获取某年所有消费类别的总额") 42 | @PreAuthorize("hasAuthority('record:analysis:spendCategoryTotal')") 43 | @GetMapping("/spendCategoryTotal/{year}/{recordType}") 44 | public Result getSpendCategoryTotalInYear(@ApiParam(required = true, value = "年(yyyy)") @Validated 45 | @DateTimeFormat(pattern="yyyy") @PathVariable(value = "year") Date date, 46 | @NotNull(message = "记账类型编码不能为空") @PathVariable(value = "recordType")String recordType) { 47 | if (!recordType.equals(RecordConstant.EXPEND_RECORD_TYPE) && !recordType.equals(RecordConstant.INCOME_RECORD_TYPE)) { 48 | return Result.error(CodeMsg.RECORD_TYPE_CODE_ERROR); 49 | } 50 | Long userId = LocalUserId.get(); 51 | List list = recordDetailService.getSpendSpendCategoryTotalByYear(userId.intValue(), recordType, 52 | date); 53 | return Result.success(list); 54 | } 55 | 56 | @CommonLog(title = "获取最近六个月的支出和收入", businessType = BusinessType.QUERY) 57 | @ApiOperation(value = "获取最近六个月的支出和收入") 58 | @PreAuthorize("hasAuthority('record:analysis:latestSixMonthList')") 59 | @PostMapping("/latestSixMonthList") 60 | public Result getLatestSixMonthList(@RequestBody @Validated GetSixMonthRecordsVO vo) { 61 | if (!vo.getRecordTypeCode().equals(RecordConstant.EXPEND_RECORD_TYPE) && !vo.getRecordTypeCode().equals(RecordConstant.INCOME_RECORD_TYPE)) { 62 | return Result.error(CodeMsg.RECORD_TYPE_CODE_ERROR); 63 | } 64 | Long userId = LocalUserId.get(); 65 | List list = recordDetailService.getLatestSixMonthList(userId.intValue(), vo.getRecordTypeCode(), 66 | vo.getBeginDate(), DateUtil.addMonth(vo.getBeginDate(), 6)); 67 | return Result.success(list); 68 | } 69 | } 70 | --------------------------------------------------------------------------------