Pu Zhibing
2025-03-26 7f26677ab7f9b83697370fa142dd1686cdf4082a
提交基础版本代码
2个文件已修改
807个文件已添加
342677 ■■■■■ 已修改文件
.gitignore 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mycat/qijisheng_account.schema.json 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mycat/qijisheng_order.schema.json 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mycat/qijisheng_other.schema.json 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
mycat/qijisheng_system.schema.json 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
nacos/nacos_config_export_20250108104030.zip 补丁 | 查看 | 原始文档 | blame | 历史
nacos/nacos_config_export_20250113211329.zip 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 299 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/pom.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/pom.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserClientFallbackFactory.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUser.java 369 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUserBank.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserCancellationLog.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponInfoVo.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/PaymentUserCoupon.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/PaymentUserCouponVo.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/pom.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/factory/OrderClientFallbackFactory.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/factory/RemoteOrderGoodsFallbackFactory.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/feignClient/OrderClient.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/feignClient/RemoteOrderGoodsClient.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/Order.java 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/OrderGood.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ApplyRefundPass.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ConfirmOrder.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ConfirmOrderVo.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/EndOfChargePageInfo.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/MyShoppingCartVo.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderDetailVO.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderGoodsVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderSaleNum.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderVO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/Price.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ReplyEvaluationVO.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/SetGoodsNumber.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ShoppingCartPayment.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/VerifiableShopVo.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/pom.xml 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Agreement.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Banner.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/BaseSetting.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Goods.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsCategory.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsSeckill.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsShop.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Phone.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/PointSetting.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/ReceiverBankChannel.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Region.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/SeckillActivityInfo.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Shop.java 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/SystemConfig.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/IndexConfigSetDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/LogisticsSetDto.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/StartPageSetDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/enums/PointChangeType.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/enums/WithdrawalAuditStatus.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/BaseSettingClientFallbackFactory.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsClientFallbackFactory.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsShopClientFallbackFactory.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/PointSettingClientFallbackFactory.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/RegionClientFallbackFactory.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/SeckillActivityInfoClientFallbackFactory.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/ShopClientFallbackFactory.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/StoreFallbackFactory.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/SystemConfigClientFallbackFactory.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/BaseSettingClient.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsShopClient.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/PointSettingClient.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/RegionClient.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/SeckillActivityInfoClient.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/ShopClient.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/StoreClient.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/SystemConfigClient.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/vo/GetGoodsBargainPrice.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/vo/GetGoodsShopByGoodsIds.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/vo/GetSeckillActivityInfo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/pom.xml 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/config/DataUpdateHandlerConfig.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/config/HttpConfig.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/config/MybatisPlusConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysFile.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLoginLog.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java 435 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysLoginLogFallbackFactory.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysRoleFallbackFactory.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/UserShopClientFallbackFactory.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysLoginLogClient.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysRoleClient.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/UserShopClient.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanyAddSysUserDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanySysUserReq.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanyUserListVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/GetSysRoleByIds.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TAppUserLoginInfo.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TRepairShopAdd.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TRepairShopAddDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/UserShop.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/query/ChangeUserQuery.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/pom.xml 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/form/RegisterBody.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/pom.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/pom.xml 152 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ExpressCompanyMap.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/GenConstants.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/HttpStatus.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/MsgConstants.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ScheduleConstants.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/TokenConstants.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/UserConstants.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/AppGoodQuery.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingOrderGroup.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ExchangeBackDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ExchangeDto.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/MongoChargingOrderQuery.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/PointChangeDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/SteategyPassDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ApproveConfigEnum.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditStateEnum.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditTypeEnum.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CarColorEnum.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CarStateEnum.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ContractStateEnum.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ContractTypeEnum.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DelFlagEnum.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DisabledEnum.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/HandoverStateEnum.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ImportTypeEnum.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/InsureTypeEnum.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/PurchaseStateEnum.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnCarTypeEnum.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnStateEnum.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/UserStatus.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/WarrantyStateEnum.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AdvertisingStatusEnum.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunModeEnum.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunStatusEnum.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/SiteStatusEnum.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/CaptchaException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/CheckedException.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/DemoModeException.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/GlobalException.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/InnerAuthException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/PreAuthorizeException.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/ServiceException.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/UtilException.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotLoginException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotPermissionException.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotRoleException.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/base/BaseException.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileException.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileNameLengthLimitExceededException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileSizeLimitExceededException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileUploadException.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/InvalidExtensionException.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/job/TaskException.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/CaptchaExpireException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserAppletException.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserException.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserPasswordNotMatchException.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/query/TimeRangePageQuery.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/CharsetKit.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/Convert.java 1006 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/StrFormatter.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/CodeGenerateUtils.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java 387 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExceptionUtil.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/FileUploadUtils.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/GeodesyUtil.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java 330 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ImportExcelUtil.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MD5Util.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/OrderCodeUtil.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PageUtils.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PhoneNumberValidator.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java 333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SpringUtils.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java 561 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/WebUtils.java 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileTypeUtils.java 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/MimeTypeUtils.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/EscapeUtil.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java 570 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java 382 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/obs/OBSUtil.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java 1487 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/reflect/ReflectUtils.java 410 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/req/SubmitTempletReq.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sign/Base64.java 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sql/SqlUtil.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/IdUtils.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/QRCodeGenerator.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/Seq.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/UUID.java 484 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/controller/BaseController.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/AjaxResult.java 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseDelete.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseEntity.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseModel.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BasePojo.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/TreeEntity.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/BasePage.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/PageDomain.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/PageInfo.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableDataInfo.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableSupport.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/xss/Xss.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/xss/XssValidator.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-datascope/pom.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-datascope/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-datasource/pom.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-datasource/src/main/java/com/ruoyi/common/datasource/annotation/Master.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-datasource/src/main/java/com/ruoyi/common/datasource/annotation/Slave.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/pom.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/annotation/Log.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/aspect/LogAspect.java 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/BusinessStatus.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/BusinessType.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/OperatorType.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/filter/PropertyPreExcludeFilter.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/service/AsyncLogService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/pom.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/aspectj/DistributedLockAspect.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java 276 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/pom.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableCustomConfig.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableRyFeignClients.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/InnerAuth.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/Logical.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresLogin.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresPermissions.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresRoles.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/InnerAuthAspect.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/PreAuthorizeAspect.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java 373 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/ApplicationConfig.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/WebMvcConfig.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignAutoConfiguration.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/DictUtils.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/MD5Generator.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-swagger/pom.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/annotation/EnableCustomSwagger2.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerAutoConfiguration.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerBeanPostProcessor.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerProperties.java 343 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerWebConfiguration.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/pom.xml 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/AntiShakeProperties.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/HMACSHA1.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/pom.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/pom.xml 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/MinioConfig.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/pom.xml 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/RuoYiGenApplication.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/config/GenConfig.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/controller/GenController.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTable.java 370 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTableColumn.java 374 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableColumnMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableMapper.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableColumnServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java 521 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableColumnService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableService.java 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/GenUtils.java 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityInitializer.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java 402 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/sub-domain.java.vm 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/js/api.js.vm 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm 505 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm 602 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index-tree.vue.vm 474 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm 590 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/readme.txt 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/pom.xml 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/RuoYiJobApplication.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/config/ScheduleConfig.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobController.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobLogController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJob.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJobLog.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobLogMapper.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobMapper.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobLogService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobService.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobLogServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobServiceImpl.java 260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/RyTask.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/AbstractQuartzJob.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/CronUtils.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/JobInvokeUtil.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzDisallowConcurrentExecution.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzJobExecution.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/ScheduleUtils.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/SysJobLogMapper.xml 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/SysJobMapper.xml 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/pom.xml 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GenTableColumnController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GenTableController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysJobController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysJobLogController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLoginLogController.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java 292 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleDeptController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleMenuController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java 755 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserOnlineController.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserPostController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/UserShopController.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java 280 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenus.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AddCompanyUserDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/IndexDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/RoleAddDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/RoleUpdateDto.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/CompanyUserVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RoleInfoVo.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TCompanyToUserVo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TreeSelect.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserRoleVO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ViolationListExportVo.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/dto/UpdatePassword.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/filter/AuthFilter.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLoginLogMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserShopMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/GetSysUserList.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/ShopUserStart.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/SysOperLogQuery.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLoginLogService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserRoleService.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/UserShopService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java 366 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java 225 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLoginLogServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java 584 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java 433 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserRoleServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 603 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserShopServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/banner.txt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/BalanceChangeRecordCopyMapper.xml 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysConfigMapper.xml 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDeptMapper.xml 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDictDataMapper.xml 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDictTypeMapper.xml 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysLoginLogMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysMenuMapper.xml 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysNoticeMapper.xml 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysOperLogMapper.xml 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysPostMapper.xml 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysRoleDeptMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysRoleMenuMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserMapper.xml 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserPostMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserRoleMapper.xml 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/UserShopMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mybatis-config.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/pom.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/pom.xml 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/RuoYiAccountApplication.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/DataUpdateHandlerConfig.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/FileUploadConfig.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/HttpConfig.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/MybatisPlusConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserBankController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java 786 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserCancellationLogController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/AgentQuery.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/BalanceQuery.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/DangerInfoDto.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/RecommendDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/SignBackRDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/UserCancelQuery.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/UserChangeQuery.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/WithQuery.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/WithdrawalRequestsDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/AppUserBankMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/AppUserMapper.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserCancellationLogMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserPointMapper.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserBankService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserService.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/PointSettingService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserCancellationLogService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserBankServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java 611 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/PointSettingServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserCancellationLogServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GeodesyUtil.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/ObsUploadUtil.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SMSUtil.java 178 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/MD5AndKL.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/PaymentUtil.java 292 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/TransferUtil.java 241 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/AccountBalanceQueryResult.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/CloseOrderResult.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/FrpCodeEnum.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/QueryOrderResult.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/QueryRefundResult.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/RefundCallbackResult.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/RefundResult.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePay.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayCallbackResult.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayQueryResult.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayResult.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/UniPayCallbackResult.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/UniPayResult.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/tencentMap/TencentMapUtil.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/AES.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/EnvVersion.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WXCore.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WeChatUtil.java 246 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WxPKCS7Encoder.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/AppletLogin.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/LoginVo.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/MobileLogin.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/NearbyReferrer.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/NearbyReferrerVo.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/RegisterAccount.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/SMSCode.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/TransferPoint.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointDetailVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointStatistics.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserStatistics.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserStatisticsDetail.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatistics.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatisticsDetail.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WithdrawalAuth.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/vip/Level.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/vip/VipLevel.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/AppUserMapper.xml 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserCancellationLogMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserPointMapper.xml 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/resources/mybatis-config.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/test/java/com/ruoyi/order/account/RuoYiAccountApplicationTests.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/pom.xml 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/DataUpdateHandlerConfig.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/HttpConfig.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/MybatisPlusConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/JsapiServiceExample.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java 600 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderGoodController.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/enums/OrderStatus.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/enums/OrderType.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEvent.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEventListener.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/PayEvent.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/PayEventListener.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderGoodMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderMapper.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderGoodService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderGoodServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java 611 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/ExpressDeliveryUtil.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/GeodesyUtil.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/RedisLock.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/MD5AndKL.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/PaymentUtil.java 289 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/TransferUtil.java 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/AccountBalanceQueryResult.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/CloseOrderResult.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/FrpCodeEnum.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/QueryOrderResult.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/QueryRefundResult.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/RefundCallbackResult.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/RefundResult.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePay.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayCallbackResult.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayQueryResult.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayResult.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/UniPayCallbackResult.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/UniPayResult.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/TransferUtil.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/WechatProperty.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/model/InitiateBatchTransfer.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/MapTrackKD100Vo.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100ListVo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100Vo.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/AuthPassStatus.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ConfirmDelivery.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/DeliverGoodsRefundPass.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderExport.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderInfoVo.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageList.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageListVo.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderRefundPassList.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderRefundPassListVo.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderStatistics.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderStatisticsDetail.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/RefundPassInfo.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Contact.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Order.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/OrderKey.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Payer.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Shipping.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderGoodMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mybatis-config.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/order/RuoYiOrderApplicationTests.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/Dockerfile 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/pom.xml 176 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataUpdateHandlerConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/HttpConfig.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/MybatisPlusConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/AgreementController.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BannerController.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BaseSettingController.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsCategoryController.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsSeckillController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsShopController.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/PhoneController.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/PointSettingController.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/RegionController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SeckillActivityInfoController.java 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java 819 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SystemConfigController.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/GoodsAreaDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/PointSettingDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/ShopBalanceDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/VipSetDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAddType.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShopStatus.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianStatus.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/AgreementMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BannerMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BaseSettingMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsCategoryMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsSeckillMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsShopMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PhoneMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PointSettingMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ReceiverBankChannelMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RegionMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SeckillActivityInfoMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopMapper.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SystemConfigMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/AgreementService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BannerService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BaseSettingService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsCategoryService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsSeckillService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsService.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsShopService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/IAgreementService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PhoneService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PointSettingService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ReceiverBankChannelService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RegionService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SeckillActivityInfoService.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SystemConfigService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/AgreementServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BannerServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BaseSettingServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsCategoryServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsSeckillServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java 418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsShopServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PhoneServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PointSettingServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ReceiverBankChannelServicImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RegionServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SystemConfigServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/GeodesyUtil.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/MD5AndKL.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/PaymentUtil.java 292 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/TransferUtil.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/AccountBalanceQueryResult.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/CloseOrderResult.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/FrpCodeEnum.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/QueryOrderResult.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/QueryRefundResult.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/RefundCallbackResult.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/RefundResult.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePay.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayCallbackResult.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayQueryResult.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayResult.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/UniPayCallbackResult.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/UniPayResult.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/tencentMap/TencentMapUtil.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsVO.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/Home.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/NearbyShopVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/RefundPassSettingVo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SaveWithdrawalAccount.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityDetailVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityVO.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopBalanceStatementDetailPage.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopCommission.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopCommissionDetail.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopDetailVO.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopGoodsList.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopGoodsListVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopStatistics.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/WalletChangeVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/logback.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/AgreementMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/CouponInfoMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsAreaMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsBargainPriceMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsMapper.xml 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsSeckillMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsShopMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/SeckillActivityInfoMapper.xml 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShareMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopBalanceStatementMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopMapper.xml 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopPointMapper.xml 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TechnicianMapper.xml 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TechnicianSubscribeMapper.xml 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mybatis-config.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/order/other/RuoYiOtherApplicationTests.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/qijisheng_account.sql 20926 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/qijisheng_order.sql 9173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/qijisheng_other.sql 241160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/qijisheng_system.sql 2421 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
@@ -10,3 +10,12 @@
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
generator
.idea
target
*.yaml
*.yml
*.log
*.iml
README.md
@@ -1,4 +1,73 @@
## gy_jifenshangcheng
## 系统模块
~~~
com.ruoyi
├── ruoyi-ui              // 前端框架 [80]
├── ruoyi-gateway         // 网关模块 [8080]
├── ruoyi-auth            // 认证中心 [9200]
├── ruoyi-api             // 接口模块
│       └── ruoyi-api-system                          // 系统接口
├── ruoyi-common          // 通用模块
│       └── ruoyi-common-core                         // 核心模块
│       └── ruoyi-common-datascope                    // 权限范围
│       └── ruoyi-common-datasource                   // 多数据源
│       └── ruoyi-common-log                          // 日志记录
│       └── ruoyi-common-redis                        // 缓存服务
│       └── ruoyi-common-seata                        // 分布式事务
│       └── ruoyi-common-security                     // 安全模块
│       └── ruoyi-common-swagger                      // 系统接口
├── ruoyi-modules         // 业务模块
│       └── ruoyi-system                              // 系统模块 [9201]
│       └── ruoyi-gen                                 // 代码生成 [9202]
│       └── ruoyi-job                                 // 定时任务 [9203]
│       └── ruoyi-file                                // 文件服务 [9300]
├── ruoyi-visual          // 图形化管理模块
│       └── ruoyi-visual-monitor                      // 监控中心 [9100]
├──pom.xml                // 公共依赖
~~~
## 内置功能
贵阳-积分商城
1.  用户管理:用户是系统操作者,该功能主要完成系统用户配置。
2.  部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
3.  岗位管理:配置系统用户所属担任职务。
4.  菜单管理:配置系统菜单,操作权限,按钮权限标识等。
5.  角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
6.  字典管理:对系统中经常使用的一些较为固定的数据进行维护。
7.  参数管理:对系统动态配置常用参数。
8.  通知公告:系统通知公告信息发布维护。
9.  操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
10. 登录日志:系统登录日志记录查询包含登录异常。
11. 在线用户:当前系统中活跃用户状态监控。
12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。
14. 系统接口:根据业务代码自动生成相关的api接口文档。
15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。
16. 在线构建器:拖动表单元素生成相应的HTML代码。
17. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
~~~
## 账号各方面信息
服务器:122.9.150.46
密码:
MySQL数据库:
    端口:10633
    账号:root 密码:YiXingTong2023@!
    账号:yixingtong 密码:YiXingTong2023@?
RabbitMQ:
    端口:5672
    账号:guest 密码:guest
    服务器启动命令: systemctl start rabbitmq-server
Redis:
    端口:10644
    密码:YiXingTong2023@?
MongoDB:
    端口:27017
    数据库:gps_address
    账号:gps 密码:YiXingTongGPS2023@?
    服务器启动命令: /usr/local/mongodb/mongodb-6.0.5/bin/mongod --dbpath=/usr/local/mongodb/mongodb-6.0.5/data --logpath=/usr/local/mongodb/mongodb-6.0.5/logs/mongodb.log --logappend --port=27017 --fork
    服务器启动命令: service mongod start
    服务器MongoDB登录命令: /usr/local/mongodb/mongodb-6.0.5/bin/mongo(6版本弃用,使用远程连接NoSQLBooster)
mycat/qijisheng_account.schema.json
New file
@@ -0,0 +1,239 @@
{
    "customTables":{},
    "globalTables":{},
    "normalProcedures":{},
    "normalTables":{
        "t_app_user_shop":{
            "createTableSQL":"CREATE TABLE `t_app_user_shop` (\r\n  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n  `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n  `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='门店员工关联表(移动端)'",
            "locality":{
                "schemaName":"qijisheng_account",
                "tableName":"t_app_user_shop",
                "targetName":"prototype"
            }
        }
    },
    "schemaName":"qijisheng_account",
    "shardingTables":{
        "t_user_point":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_point` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`type` int DEFAULT NULL COMMENT '变动类型(1-消费,2-返佣,3-拉新,4-每日分享,5-每日签到,6-使用时长, 7-注册积分, 8-门店业绩,9-门店返佣,14-下级门店返佣,10-技师业绩,11-兑换商品,12-他人赠送,13-赠与他人)',\n\t`historical_point` decimal(10, 2) DEFAULT NULL COMMENT '历史余额',\n\t`variable_point` decimal(10, 2) DEFAULT NULL COMMENT '变动金额',\n\t`balance` decimal(10, 2) DEFAULT NULL COMMENT '变动后金额',\n\t`create_time` datetime DEFAULT NULL COMMENT '变动时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '变动用户id',\n\t`object_id` bigint DEFAULT NULL COMMENT '关联对象id',\n\t`extention` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '拓展字段',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户积分流水'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_user_point_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_user_coupon":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_coupon` (\n\t`id` bigint NOT NULL,\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`use_time` datetime DEFAULT NULL COMMENT '使用时间',\n\t`coupon_id` int DEFAULT NULL COMMENT '优惠劵id',\n\t`start_time` datetime DEFAULT NULL COMMENT '开始时间',\n\t`end_time` datetime DEFAULT NULL COMMENT '结束时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户-优惠劵'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_user_coupon_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_user_sign_record":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_sign_record` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`sign_day` date DEFAULT NULL COMMENT '签到时间',\n\t`red_amount` decimal(10, 2) DEFAULT NULL COMMENT '红包金额',\n\t`point` decimal(10, 2) DEFAULT NULL COMMENT '积分',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户签到记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_user_sign_record_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_withdrawal_requests":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_withdrawal_requests` (\n\t`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`withdrawal_amount` decimal(10, 2) DEFAULT NULL COMMENT '提现金额',\n\t`arrival_amount` decimal(10, 2) DEFAULT NULL COMMENT '到账金额',\n\t`service_charge` decimal(10, 2) DEFAULT NULL COMMENT '手续费',\n\t`withdrawal_method` int DEFAULT NULL COMMENT '1微信2银行卡',\n\t`account_holder` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '开户人',\n\t`bank_card_number` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '银行卡号',\n\t`audit_status` int DEFAULT NULL COMMENT '审核状态 1''待审核'',2''审核通过'',3''审核拒绝'' ',\n\t`status` int DEFAULT NULL COMMENT '状态(1=处理中,2=成功)',\n\t`arrival_time` datetime DEFAULT NULL COMMENT '到账时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '提现申请'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_withdrawal_requests_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_app_user_share":{
            "createTableSQL":"CREATE TABLE `t_app_user_share` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n  `create_time` datetime DEFAULT NULL COMMENT '分享时间',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户每日首次分享记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_app_user_share_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_user_click_log":{
            "createTableSQL":"CREATE TABLE `t_user_click_log` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\r\n  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\r\n  `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n  `vip_id` int DEFAULT NULL COMMENT '会员等级',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='申请点击记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 40",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_user_click_log_${tableIndex}",
                    "tableNum":"40",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_balance_payment":{
            "createTableSQL":"CREATE TABLE `t_balance_payment` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n  `money` decimal(10,2) DEFAULT NULL COMMENT '支付金额',\r\n  `serial_number` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '微信支付流水号',\r\n  `status` int DEFAULT '1' COMMENT '微信支付状态(1=待支付,2=已支付)',\r\n  `payment_time` datetime DEFAULT NULL COMMENT '完成支付时间',\r\n  `balance_change_record_id` bigint DEFAULT NULL COMMENT '余额变更记录id',\r\n  `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='账户余额充值记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 50",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_balance_payment_${tableIndex}",
                    "tableNum":"50",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_user_cancellation_log":{
            "createTableSQL":"CREATE TABLE `t_user_cancellation_log` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\r\n  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\r\n  `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n  `vip_id` int DEFAULT NULL COMMENT '会员等级',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='注销记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_user_cancellation_log_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_agent_application":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_agent_application` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`application_vip_id` int DEFAULT NULL COMMENT '申请类型 对应vip_id',\n\t`application_time` datetime DEFAULT NULL COMMENT '申请时间',\n\t`status` int DEFAULT NULL COMMENT '1''待处理'',2''已处理-同意'',3''已处理-拒绝''',\n\t`shop_point` int DEFAULT NULL COMMENT '用户当前消费积分',\n\t`share_point` int DEFAULT NULL COMMENT '用户当前分佣积分',\n\t`direct_vip_num` int DEFAULT NULL COMMENT '直推用户已达钻石会员数',\n\t`direct_agent_num` int DEFAULT NULL COMMENT '直推用户已成为代理数',\n\t`bind_shop_num` int DEFAULT NULL COMMENT '已绑定门店数',\n\t`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '处理意见',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '会员申请'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_agent_application_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_balance_change_record":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_balance_change_record` (\n\t`id` bigint(20) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`change_type` int DEFAULT NULL COMMENT '1充值2提现3红包4分佣5商城购物6取消订单退款',\n\t`before_amount` decimal(10, 2) DEFAULT NULL COMMENT '变更前金额',\n\t`change_amount` decimal(10, 2) DEFAULT NULL COMMENT '变更金额',\n\t`after_amount` decimal(10, 2) DEFAULT NULL COMMENT '变更后金额',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户余额变更记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_balance_change_record_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_app_user_bank":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_app_user_bank` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`bank_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '开户银行名称',\n\t`bank_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '银行卡号',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户银行卡'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_app_user_bank_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_app_user":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_app_user` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`user_type` int DEFAULT '1' COMMENT '用户类型(1=普通用户,2=门店员工)',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户',\n\t`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '手机号',\n\t`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像',\n\t`vip_id` int DEFAULT NULL COMMENT '会员id',\n\t`wx_openid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '微信openid',\n\t`ali_openid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '支付宝openid',\n\t`status` int DEFAULT '1' COMMENT '状态(1=正常,2=冻结,3=注销)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`del_flag` tinyint(1) UNSIGNED ZEROFILL DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`first_add` int DEFAULT NULL COMMENT '0否1是第一次添加',\n\t`last_login_time` datetime DEFAULT NULL COMMENT '最后一次登录时间',\n\t`top_invite_id` bigint DEFAULT NULL COMMENT '顶级推广人id',\n\t`invite_user_id` bigint DEFAULT NULL COMMENT '推广人id',\n\t`shop_id` int DEFAULT NULL COMMENT '绑定门店id',\n\t`part_point` int DEFAULT '0' COMMENT '合伙人积分数',\n\t`part_grow_point` int DEFAULT '0' COMMENT '合伙人培育积分数',\n\t`last_shop_time` datetime DEFAULT NULL COMMENT '最后消费时间',\n\t`shop_point` int DEFAULT '0' COMMENT '消费积分数',\n\t`share_point` int DEFAULT '0' COMMENT '返佣积分数',\n\t`shop_share_point` int DEFAULT '0' COMMENT '门店返佣积分',\n\t`shop_achievement_point` int DEFAULT '0' COMMENT '门店业绩积分',\n\t`lower_level_share_point` int DEFAULT '0' COMMENT '绑定下级门店分佣积分',\n\t`total_invite_point` int DEFAULT '0' COMMENT '拉新人积分总数',\n\t`total_register_point` int DEFAULT '0' COMMENT '注册积分总数',\n\t`total_performance_point` int DEFAULT '0' COMMENT '业绩积分总数',\n\t`total_share_point` int DEFAULT '0' COMMENT '每日分享积分',\n\t`total_sign_point` int DEFAULT '0' COMMENT '每日签到积分',\n\t`total_hour_point` int DEFAULT '0' COMMENT '使用时长积分',\n\t`lave_point` int DEFAULT '0' COMMENT '剩余积分',\n\t`available_point` int DEFAULT '0' COMMENT '可用积分',\n\t`transferable_point` int DEFAULT '0' COMMENT '可转增积分',\n\t`total_available_point` int DEFAULT '0' COMMENT '可用总积分数',\n\t`total_point` int DEFAULT '0' COMMENT '总积分',\n\t`shop_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '消费总金额',\n\t`withdrawable_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '可提现金额',\n\t`withdrawn_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '已提现金额',\n\t`total_recharge_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '充值总金额',\n\t`total_red_packet_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '红包总金额',\n\t`total_distribution_amount` decimal(10, 2) DEFAULT '0.00' COMMENT '分销总金额',\n\t`shop_service_fee` decimal(10, 2) DEFAULT '0.00' COMMENT '门店服务费(门店核销获得)',\n\t`shop_commission` decimal(10, 2) DEFAULT '0.00' COMMENT '门店返佣金额(绑定用户消费后返佣)',\n\t`balance` decimal(10, 2) DEFAULT '0.00' COMMENT '账户余额',\n\t`change_promoter` int DEFAULT '0' COMMENT '是否可更换推广人(0=否,1=是)',\n\t`longitude` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '经度',\n\t`latitude` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '纬度',\n\t`province` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省',\n\t`province_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省编号',\n\t`city` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市',\n\t`city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市编号',\n\t`district` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区',\n\t`district_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区编号',\n\t`qr_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '推广二维码',\n\t`is_danger` int DEFAULT '0' COMMENT '降级预警(0=否,1=是)',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT 'app用户'\nTBPARTITION BY MOD_HASH(phone) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_app_user_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(phone)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_user_change_log":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_change_log` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`before_vip_id` int DEFAULT NULL COMMENT '变更前等级',\n\t`after_vip_id` int DEFAULT NULL COMMENT '变更后等级',\n\t`change_type` int DEFAULT NULL COMMENT '变更类型(1=升级,2=降级)',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '会员等级变更记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_user_change_log_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_user_address":{
            "createTableSQL":"CREATE TABLE `qijisheng_account`.`t_user_address` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`recieve_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收件人姓名',\n\t`recieve_phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收件人电话',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省',\n\t`province_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省编号',\n\t`city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市',\n\t`city_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市编号',\n\t`district` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区',\n\t`district_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区编号',\n\t`recieve_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收件人地址',\n\t`is_default` int DEFAULT NULL COMMENT '是否默认1是0否',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '用户地址'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_account/t_user_address_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                }
            },
            "shardingIndexTables":{}
        }
    },
    "views":{}
}
mycat/qijisheng_order.schema.json
New file
@@ -0,0 +1,86 @@
{
    "customTables":{},
    "globalTables":{},
    "normalProcedures":{},
    "normalTables":{},
    "schemaName":"qijisheng_order",
    "shardingTables":{
        "t_order_balance_payment":{
            "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_order_balance_payment` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单金额',\n\t`red_packet_amount` decimal(10, 2) DEFAULT NULL COMMENT '红包支付金额',\n\t`distribution_amount` decimal(10, 2) DEFAULT NULL COMMENT '分销金额支付金额',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '余额支付订单明细'\nTBPARTITION BY MOD_HASH(order_id) TBPARTITIONS 50",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_order/t_order_balance_payment_${tableIndex}",
                    "tableNum":"50",
                    "tableMethod":"MOD_HASH(order_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_order_good":{
            "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_order_good` (\n\t`id` bigint NOT NULL AUTO_INCREMENT,\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`good_amount` decimal(10, 2) DEFAULT NULL COMMENT '商品券抵扣金额',\n\t`seckill_json` text COLLATE utf8mb4_bin COMMENT '秒杀活动的json快照',\n\t`good_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '购买商品的json快照',\n\t`num` int DEFAULT NULL COMMENT '数量',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`earn_spending_points` int DEFAULT '0' COMMENT '可获得消费积分',\n\t`superior_subcommission` decimal(10, 2) DEFAULT '0.00' COMMENT '上级获得分佣金额',\n\t`superior_rebate_points` int DEFAULT '0' COMMENT '上级获得返佣积分',\n\t`superior_type` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取返佣积分上级类型(1=直推上级,2=直帮上级)',\n\t`superior_price_type` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取分佣金额上级类型(1=直推上级,2=直帮上级)',\n\t`servuce_shop_charges` decimal(10, 2) DEFAULT '0.00' COMMENT '核销门店可获得服务费',\n\t`servuce_shop_points` int DEFAULT '0' COMMENT '核销门店可获得服务积分',\n\t`technician_points` int DEFAULT '0' COMMENT '技师可获得服务积分',\n\t`bound_shop_charges` decimal(10, 2) DEFAULT '0.00' COMMENT '绑定门店可获得分佣金额',\n\t`bound_shop_points` int DEFAULT NULL COMMENT '绑定门店可获得返佣积分',\n\t`bound_shop_superiors_charges` decimal(10, 2) DEFAULT '0.00' COMMENT '绑定门店上级门店可获得分佣金额',\n\t`bound_shop_superiors_points` int DEFAULT '0' COMMENT '绑定门店上级门店可获得返佣积分',\n\t`type` int DEFAULT NULL COMMENT '购买类型(1=普通商品,2=秒杀商品)',\n\t`cash_payment` int DEFAULT NULL COMMENT '现金支付(0=否,1=是)',\n\t`point_payment` int DEFAULT NULL COMMENT '积分支付(0=否,1=是)',\n\t`selling_price` decimal(10, 2) DEFAULT NULL COMMENT '基础售价',\n\t`integral` int DEFAULT NULL COMMENT '基础积分',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 1062097391416512589 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '订单表—关联商品信息'\nTBPARTITION BY MOD_HASH(order_id) TBPARTITIONS 50",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_order/t_order_good_${tableIndex}",
                    "tableNum":"50",
                    "tableMethod":"MOD_HASH(order_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_refund_pass":{
            "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_refund_pass` (\n\t`id` bigint NOT NULL,\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`status` int DEFAULT NULL COMMENT '1待审核2已完成3已拒绝4待退货5待平台收货',\n\t`refund_method` int DEFAULT NULL COMMENT '1退货退款2仅退款',\n\t`refund_reason` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户申请原因',\n\t`user_remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户申请备注',\n\t`pics` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '申请图片',\n\t`pass_status` int DEFAULT NULL COMMENT '1待审核2同意3拒绝',\n\t`pass_remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '后台审核备注',\n\t`auth_time` datetime DEFAULT NULL COMMENT '审核时间',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收货人姓名',\n\t`phone` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收货人电话',\n\t`address` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收货地址',\n\t`code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '快递单号',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '售后管理'\nTBPARTITION BY MOD_HASH(order_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_order/t_refund_pass_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(order_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_shopping_cart":{
            "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_shopping_cart` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`number` int DEFAULT '1' COMMENT '数量',\n\t`type` int DEFAULT NULL COMMENT '购买类型(1=普通商品,2=秒杀商品)',\n\t`status` int DEFAULT NULL COMMENT '状态(0=临时数据,1=购物车数据)',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '购物车'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 50",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_order/t_shopping_cart_${tableIndex}",
                    "tableNum":"50",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_order":{
            "createTableSQL":"CREATE TABLE `qijisheng_order`.`t_order` (\n\t`id` bigint NOT NULL,\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`num` int NOT NULL COMMENT '商品数量',\n\t`good_pics` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '商品封面(多张逗号隔开,最多三张))',\n\t`good_name` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '商品名称(多个名称逗号隔开))',\n\t`order_type` int DEFAULT NULL COMMENT '订单类型1服务单2商品',\n\t`order_status` int DEFAULT NULL COMMENT '1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价',\n\t`old_order_status` int DEFAULT NULL COMMENT '1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价',\n\t`is_commission` tinyint(1) DEFAULT '0' COMMENT '是否已分佣 0-否 1-是',\n\t`end_time` datetime DEFAULT NULL COMMENT '核销时间',\n\t`canceller_app_user_id` bigint DEFAULT NULL COMMENT '核销人id',\n\t`after_sale_time` datetime DEFAULT NULL COMMENT '售后截止日期',\n\t`technician_id` int DEFAULT NULL COMMENT '技师id',\n\t`order_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单编号',\n\t`total_amount` decimal(10, 2) DEFAULT NULL COMMENT '订单总金额',\n\t`full_reduction_amount` decimal(10, 2) DEFAULT NULL COMMENT '满减金额',\n\t`money_amount` decimal(10, 2) DEFAULT NULL COMMENT '代金券抵扣金额',\n\t`discount_amount` decimal(10, 2) DEFAULT NULL COMMENT '折扣券抵扣金额',\n\t`good_amount` decimal(10, 2) DEFAULT NULL COMMENT '商品券抵扣总金额',\n\t`user_coupon_id` bigint DEFAULT NULL COMMENT '用户优惠券id',\n\t`activity_amount` decimal(10, 2) DEFAULT NULL COMMENT '活动优惠金额',\n\t`discount_total_amount` decimal(10, 2) DEFAULT NULL COMMENT '优惠总金额',\n\t`payment_amount` decimal(10, 2) DEFAULT NULL COMMENT '实际支付价格',\n\t`point` int DEFAULT NULL COMMENT '使用积分',\n\t`pay_method` int DEFAULT NULL COMMENT '1微信,2账户余额,3积分',\n\t`coupon_json` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '使用的优惠劵json',\n\t`activity_json` text COLLATE utf8mb4_bin COMMENT '订单优惠活动的json快照',\n\t`express_amount` decimal(10, 2) DEFAULT NULL COMMENT '运费',\n\t`express_pay_method` int DEFAULT NULL COMMENT '运费支付方式,1微信,2账户余额',\n\t`express_json` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT 'NULL' COMMENT '第三方快递信息',\n\t`express_result` text COLLATE utf8mb4_bin COMMENT '第三方快递结果',\n\t`deliver_province` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货省名称',\n\t`deliver_province_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货省编号',\n\t`deliver_city` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货市名称',\n\t`deliver_city_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货市编号',\n\t`deliver_district` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货区名称',\n\t`deliver_district_code` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '发货区编号',\n\t`share_amount` decimal(10, 2) DEFAULT NULL COMMENT '平台分佣',\n\t`get_point` int DEFAULT NULL COMMENT '本单获取的积分',\n\t`serial_number` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '微信支付号',\n\t`pay_status` int DEFAULT NULL COMMENT '1待支付2已支付',\n\t`shop_id` int DEFAULT NULL COMMENT '对应门店id',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`address_json` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '地址json',\n\t`expected_delivery_time` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '预计提货时间',\n\t`refund_status` int DEFAULT NULL COMMENT '退款状态(1=退款中,2=已退款)',\n\t`refund_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '退款流水号',\n\t`refund_time` datetime DEFAULT NULL COMMENT '退款时间',\n\tPRIMARY KEY USING BTREE (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '订单表'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 50",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_order/t_order_${tableIndex}",
                    "tableNum":"50",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                }
            },
            "shardingIndexTables":{}
        }
    },
    "views":{}
}
mycat/qijisheng_other.schema.json
New file
@@ -0,0 +1,367 @@
{
    "customTables":{},
    "globalTables":{},
    "normalProcedures":{},
    "normalTables":{
        "t_share":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_share` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标题',\n\t`image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片地址',\n\t`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '分享内容',\n\t`audit_status` int DEFAULT '0' COMMENT '审核状态(0=待审核,1=审核通过,2=审核失败)',\n\t`audit_user_id` int DEFAULT NULL COMMENT '审核人id',\n\t`audit_time` datetime DEFAULT NULL COMMENT '审核时间',\n\t`audit_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '审核结果',\n\t`applet_share` int DEFAULT '0' COMMENT '小程序分享(0=否,1=是)',\n\t`del_flag` int DEFAULT '0' COMMENT '删除状态(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`add_type` int DEFAULT NULL COMMENT '添加类型(1=平台添加,2=推广人添加,3=门店添加)',\n\t`object_id` bigint DEFAULT NULL COMMENT '对象id',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '分享'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_share",
                "targetName":"prototype"
            }
        },
        "t_goods_category":{
            "createTableSQL":"CREATE TABLE `t_goods_category` (\r\n  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称',\r\n  `icon` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'icon图片地址',\r\n  `del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\r\n  `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品分类'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_goods_category",
                "targetName":"prototype"
            }
        },
        "t_goods_bargain_price_detail":{
            "createTableSQL":"CREATE TABLE `t_goods_bargain_price_detail` (\r\n  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n  `goods_bargain_price_id` int DEFAULT NULL COMMENT '门店特价申请数据id',\r\n  `vip` int DEFAULT NULL COMMENT '会员级别(1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\r\n  `selling_price` decimal(10,2) DEFAULT NULL COMMENT '基础售价',\r\n  `integral` int DEFAULT NULL COMMENT '基础积分',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='门店特价申请明细数据'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_goods_bargain_price_detail",
                "targetName":"prototype"
            }
        },
        "t_red_packege_set":{
            "createTableSQL":"CREATE TABLE `t_red_packege_set` (\r\n  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n  `del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\r\n  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\r\n  `start_time` datetime DEFAULT NULL COMMENT '开始时间',\r\n  `end_time` datetime DEFAULT NULL COMMENT '结束时间',\r\n  `packege_amount` decimal(10,2) DEFAULT NULL COMMENT '红包金额',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='红包活动设置'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_red_packege_set",
                "targetName":"prototype"
            }
        },
        "t_shop":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_shop` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '门店名称',\n\t`pid` int DEFAULT '0' COMMENT '上级门店id',\n\t`business_date` int DEFAULT NULL COMMENT '营业星期:1-周一到周日 2-周一周五 3-仅周末',\n\t`start_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '开始时间(HH:mm)',\n\t`end_time` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '结束时间(HH:mm)',\n\t`home_picture` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '封面图',\n\t`shop_manager` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '店长姓名',\n\t`details_picture` text COLLATE utf8mb4_bin COMMENT '详情图,多个逗号分隔',\n\t`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '电话',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '店长用户id',\n\t`service_tel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '客户电话(同步到t_phone表)',\n\t`certification` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '资质证书图片',\n\t`longitude` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '经度',\n\t`latitude` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '纬度',\n\t`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '详细地址',\n\t`status` int DEFAULT '1' COMMENT '状态(1=正常,2=冻结)',\n\t`shop_all_point` int DEFAULT '0' COMMENT '门店积分总数',\n\t`lower_level_share_point` int DEFAULT '0' COMMENT '绑定下级门店分佣积分',\n\t`share_point` int DEFAULT '0' COMMENT '门店返佣积分',\n\t`server_point` int DEFAULT '0' COMMENT '门店服务积分',\n\t`use_point` int DEFAULT '0' COMMENT '门店已用积分',\n\t`lave_point` int DEFAULT '0' COMMENT '门店剩余积分',\n\t`giveaway_all_money` decimal(10, 2) DEFAULT '0.00' COMMENT '门店分佣总金额',\n\t`giveaway_money` decimal(10, 2) DEFAULT '0.00' COMMENT '门店分佣金额',\n\t`lower_level_giveaway_money` decimal(10, 2) DEFAULT '0.00' COMMENT '绑定下级门店分佣金额',\n\t`server_giveaway_money` decimal(10, 2) DEFAULT '0.00' COMMENT '门店服务分佣金额',\n\t`can_withdraw_money` decimal(10, 2) DEFAULT '0.00' COMMENT '可提现金额',\n\t`withdraw_money` decimal(10, 2) DEFAULT '0.00' COMMENT '已提现金额',\n\t`balance` decimal(10, 2) DEFAULT '0.00' COMMENT '余额',\n\t`order_number` int DEFAULT '0' COMMENT '门店订单总数',\n\t`server_order_number` int DEFAULT '0' COMMENT '门店服务订单数',\n\t`custom_order_number` int DEFAULT '0' COMMENT '单品自提订单数',\n\t`score` decimal(10, 2) DEFAULT '0.00' COMMENT '总评分',\n\t`score_number` int DEFAULT '0' COMMENT '评分数量',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`tradeMerchantNo` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '报备商户号',\n\t`receiverAccountNoEnc` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收款银行卡号',\n\t`receiverNameEnc` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收款银行卡持卡人名称',\n\t`receiverAccountType` int DEFAULT NULL COMMENT '账户类型(对私账户201,对公账户204)',\n\t`receiverBankChannelNo` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '收款账户联行号',\n\t`province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省',\n\t`province_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省编号',\n\t`city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市',\n\t`city_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市编号',\n\t`district` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区',\n\t`district_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区编号',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 27 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_shop",
                "targetName":"prototype"
            }
        },
        "t_technician":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_technician` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '技师姓名',\n\t`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '电话',\n\t`introduction` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '简介',\n\t`home_picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '技师封面图',\n\t`info_picture` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '技师详情图',\n\t`status` int DEFAULT '1' COMMENT '状态(1=下架,2=上架)',\n\t`subscribe_status` int DEFAULT NULL COMMENT '预约状态(1=可预约,2=不可预约)',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '技师'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_technician",
                "targetName":"prototype"
            }
        },
        "t_goods":{
            "createTableSQL":"CREATE TABLE `t_goods` (\r\n  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称',\r\n  `goods_category_id` int DEFAULT NULL COMMENT '分类id',\r\n  `type` int DEFAULT NULL COMMENT '类型(1=服务商品,2=单品商品)',\r\n  `purchase_limit` int DEFAULT NULL COMMENT '限购数量(-1不限购)',\r\n  `distribution_mode` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '配送方式(1=自提,2=快递,1,2 = 自提+快递)',\r\n  `appoint_store` int DEFAULT '2' COMMENT '指定门店(1=指定,2=所有)',\r\n  `introduction` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品简介',\r\n  `home_page_picture` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '封面图',\r\n  `detail_picture` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '详情图,多个逗号分隔',\r\n  `detail` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '商品详情',\r\n  `operating_cost` decimal(10,2) DEFAULT NULL COMMENT '运营成本',\r\n  `shop_cost` decimal(10,2) DEFAULT NULL COMMENT '门店成本',\r\n  `original_price` decimal(10,2) DEFAULT NULL COMMENT '划线价',\r\n  `cash_payment` int DEFAULT NULL COMMENT '现金支付(0=否,1=是)',\r\n  `point_payment` int DEFAULT NULL COMMENT '积分支付(0=否,1=是)',\r\n  `selling_price` decimal(10,2) DEFAULT NULL COMMENT '基础售价',\r\n  `integral` int DEFAULT NULL COMMENT '基础积分',\r\n  `commodity_authority` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品权限JSON(-1=全部,0=游客,1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\r\n  `del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\r\n  `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n  `status` int DEFAULT NULL COMMENT '状态(1=下架,2=上架)',\r\n  `sale_num` int DEFAULT NULL COMMENT '销量',\r\n  `sort` int DEFAULT NULL COMMENT '排序',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_goods",
                "targetName":"prototype"
            }
        },
        "t_system_config":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_system_config` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`type` int DEFAULT NULL COMMENT '类型(1=启动页管理,2=首页配置,3=订单包邮设置,4=合伙人积分设置会员说明设置)',\n\t`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '配置内容json',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '系统配置'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_system_config",
                "targetName":"prototype"
            }
        },
        "t_phone":{
            "createTableSQL":"CREATE TABLE `t_phone` (\r\n  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n  `type` int DEFAULT NULL COMMENT '类型(1=平台,2=门店)',\r\n  `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n  `phone_one` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '联系电话1',\r\n  `phone_two` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '联系电话2',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='客服电话'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_phone",
                "targetName":"prototype"
            }
        },
        "t_receiver_bank_channel":{
            "createTableSQL":"CREATE TABLE `t_receiver_bank_channel` (\r\n  `id` bigint DEFAULT NULL,\r\n  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,\r\n  `short` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='银行数据'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_receiver_bank_channel",
                "targetName":"prototype"
            }
        },
        "t_banner":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_banner` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`position` int DEFAULT NULL COMMENT '位置(1=首页,2=商城首页)',\n\t`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '名称',\n\t`jump_type` int DEFAULT NULL COMMENT '跳转类型(1=无跳转,2=外部链接,3=商品详情,4=秒杀商品详情,5=领券中心)',\n\t`content_type` int DEFAULT NULL,\n\t`content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '跳转内容',\n\t`image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图片地址',\n\t`video_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '视频地址',\n\t`del_flag` int DEFAULT '0' COMMENT '删除标识(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT 'banner'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_banner",
                "targetName":"prototype"
            }
        },
        "t_coupon_info":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_coupon_info` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`coupon_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '优惠券名称',\n\t`coupon_type` int DEFAULT NULL COMMENT '优惠券类型 1''满减券'',2''代金券'',3''折扣券'',4''商品券''',\n\t`condition_amount` decimal(10, 2) DEFAULT NULL COMMENT '满x元',\n\t`discount_amount` decimal(10, 2) DEFAULT NULL COMMENT '减x元',\n\t`money_amount` decimal(10, 2) DEFAULT NULL COMMENT '代金x元',\n\t`discount` decimal(10, 2) DEFAULT NULL COMMENT '折扣',\n\t`for_good_ids` text COMMENT '适用商品ids,全部-1',\n\t`send_num` int DEFAULT NULL COMMENT '发放数量',\n\t`max_num` int DEFAULT NULL COMMENT '可领数量',\n\t`period_type` int DEFAULT NULL COMMENT '有效期类型 1指定时间内有效 2领取后x天有效',\n\t`period_start_time` datetime DEFAULT NULL COMMENT '有效期开始时间',\n\t`period_end_time` datetime DEFAULT NULL COMMENT '有效期结束时间',\n\t`period_days` int DEFAULT NULL COMMENT '领取后x天有效',\n\t`send_start_time` datetime DEFAULT NULL COMMENT '开始发放时间',\n\t`send_end_time` datetime DEFAULT NULL COMMENT '结束发放时间',\n\t`send_type` int DEFAULT NULL COMMENT '1免费发放2积分兑换',\n\t`need_point` decimal(10, 2) DEFAULT NULL COMMENT '兑换所需积分',\n\t`person_type` int DEFAULT NULL COMMENT '可领用户  1全部 2指定人员 3指定会员 4 新人注册',\n\t`person_ids` text COMMENT '可领取对应的ids,用find_in_set查询',\n\t`shelf_status` int DEFAULT NULL COMMENT '上架状态:0-下架 1-上架',\n\t`vip_ids` varchar(255) DEFAULT NULL COMMENT '指定会员等级,逗号隔开',\n\t`goods_name_json` varchar(255) DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 63 CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '优惠劵'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_coupon_info",
                "targetName":"prototype"
            }
        },
        "t_goods_vip":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_goods_vip` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`vip` int DEFAULT NULL COMMENT '会员级别(1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\n\t`cash_payment` int DEFAULT NULL COMMENT '现金支付(0=否,1=是)',\n\t`point_payment` int DEFAULT NULL COMMENT '积分支付(0=否,1=是)',\n\t`selling_price` decimal(10, 2) DEFAULT NULL COMMENT '基础售价',\n\t`integral` int DEFAULT NULL COMMENT '基础积分',\n\t`earn_spending_points` int DEFAULT NULL COMMENT '可获得消费积分',\n\t`superior_subcommission` decimal(10, 2) DEFAULT NULL COMMENT '上级获得分佣金额',\n\t`superior_rebate_points` int DEFAULT NULL COMMENT '上级获得返佣积分',\n\t`superior_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取返佣积分上级类型(1=直推上级,2=直帮上级)',\n\t`superior_price_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取分佣金额上级类型(1=直推上级,2=直帮上级)',\n\t`servuce_shop_charges` decimal(10, 2) DEFAULT NULL COMMENT '核销门店可获得服务费',\n\t`servuce_shop_points` int DEFAULT NULL COMMENT '核销门店可获得服务积分',\n\t`technician_points` int DEFAULT NULL COMMENT '技师可获得服务积分',\n\t`bound_shop_charges` decimal(10, 2) DEFAULT NULL COMMENT '绑定门店可获得分佣金额',\n\t`bound_shop_points` int DEFAULT NULL COMMENT '绑定门店可获得返佣积分',\n\t`bound_shop_superiors_charges` decimal(10, 2) DEFAULT NULL COMMENT '绑定门店上级门店可获得分佣金额',\n\t`bound_shop_superiors_points` int DEFAULT NULL COMMENT '绑定门店上级门店可获得返佣积分',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '商品会员配置'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_goods_vip",
                "targetName":"prototype"
            }
        },
        "t_seckill_activity_info":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_seckill_activity_info` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`good_id` int DEFAULT NULL COMMENT '商品id',\n\t`max_num` int DEFAULT NULL COMMENT '限购数量',\n\t`vip_ids` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '适用会员类型“,”分隔',\n\t`start_time` datetime DEFAULT NULL COMMENT '活动开始日期',\n\t`end_time` datetime DEFAULT NULL COMMENT '活动结束日期',\n\t`is_shelves` int DEFAULT '1' COMMENT '是否上架:0否 1是',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '商品秒杀活动'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_seckill_activity_info",
                "targetName":"prototype"
            }
        },
        "t_goods_seckill":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_goods_seckill` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`seckill_activity_info_id` int DEFAULT NULL COMMENT '秒杀活动主表',\n\t`vip` int DEFAULT NULL COMMENT '会员级别(0=游客,1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\n\t`cash_payment` int DEFAULT '0' COMMENT '现金支付(0=否,1=是)',\n\t`point_payment` int DEFAULT '0' COMMENT '积分支付(0=否,1=是)',\n\t`selling_price` decimal(10, 2) DEFAULT NULL COMMENT '基础售价',\n\t`integral` int DEFAULT NULL COMMENT '基础积分',\n\t`earn_spending_points` int DEFAULT NULL COMMENT '可获得消费积分',\n\t`superior_subcommission` decimal(10, 2) DEFAULT NULL COMMENT '上级获得分佣金额',\n\t`superior_rebate_points` int DEFAULT NULL COMMENT '上级获得返佣积分',\n\t`superior_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取返佣积分上级类型(1=直推上级,2=直帮上级)',\n\t`superior_price_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取分佣金额上级类型(1=直推上级,2=直帮上级)',\n\t`servuce_shop_charges` decimal(10, 2) DEFAULT NULL COMMENT '核销门店可获得服务费',\n\t`servuce_shop_points` int DEFAULT NULL COMMENT '核销门店可获得服务积分',\n\t`technician_points` int DEFAULT NULL COMMENT '技师可获得服务积分',\n\t`bound_shop_charges` decimal(10, 2) DEFAULT NULL COMMENT '绑定门店可获得分佣金额',\n\t`bound_shop_points` int DEFAULT NULL COMMENT '绑定门店可获得返佣积分',\n\t`bound_shop_superiors_charges` decimal(10, 2) DEFAULT NULL COMMENT '绑定门店上级门店可获得分佣金额',\n\t`bound_shop_superiors_points` int DEFAULT NULL COMMENT '绑定门店上级门店可获得返佣积分',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 127 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '秒杀活动会员配置'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_goods_seckill",
                "targetName":"prototype"
            }
        },
        "t_goods_bargain_price":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_goods_bargain_price` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`audit_status` int DEFAULT '0' COMMENT '审核状态(0=待审核,1=审核通过,2=审核失败)',\n\t`audit_user_id` bigint DEFAULT NULL COMMENT '审核人id',\n\t`audit_time` datetime DEFAULT NULL COMMENT '审核时间',\n\t`audit_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '审核结果',\n\t`del_flag` int DEFAULT NULL COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\t`create_user_id` int DEFAULT NULL COMMENT '添加用户id',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店特价申请数据'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_goods_bargain_price",
                "targetName":"prototype"
            }
        },
        "t_agreement":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_agreement` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`type` int DEFAULT NULL COMMENT '类型(1=用户协议,2=隐私协议,3=技师上门免责声明,4=注销协议,5门店提现免责声明)',\n\t`content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '内容',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '协议'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_agreement",
                "targetName":"prototype"
            }
        },
        "t_recharge_set":{
            "createTableSQL":"CREATE TABLE `t_recharge_set` (\r\n  `id` int NOT NULL,\r\n  `recharge_amount` decimal(10,2) DEFAULT NULL COMMENT '充值金额',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='充值管理'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_recharge_set",
                "targetName":"prototype"
            }
        },
        "t_point_setting":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_point_setting` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '1-7对应会员等级',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`new_point` int DEFAULT NULL COMMENT '拉新人积分',\n\t`every_share_point` int DEFAULT NULL COMMENT '每日分享积分',\n\t`sign_point` int DEFAULT NULL COMMENT '每日签到积分',\n\t`hour_point` int DEFAULT NULL COMMENT '使用一小时积分',\n\t`regis_point` int DEFAULT NULL COMMENT '注册积分',\n\t`buy_point` decimal(10, 2) DEFAULT NULL COMMENT '消费积分可用百分比',\n\t`buy_point_open` int DEFAULT '0' COMMENT '消费积分积分 1开0关',\n\t`buy_point_gift` int DEFAULT '0' COMMENT '消费积分转赠送 1开0关',\n\t`share_point` decimal(10, 2) DEFAULT NULL COMMENT '返佣积分可用百分比',\n\t`share_point_open` int DEFAULT '0' COMMENT '返佣积分 1开0关',\n\t`share_point_gift` int DEFAULT '0' COMMENT '返佣积分转赠送 1开0关',\n\t`shop_share_point` decimal(10, 2) DEFAULT NULL COMMENT '门店返佣积分可用百分比',\n\t`shop_share_point_open` int DEFAULT '0' COMMENT '门店返佣积分 1开0关',\n\t`shop_share_point_gift` int DEFAULT '0' COMMENT '门店返佣积分赠送 1开0关',\n\t`shop_point` decimal(10, 2) DEFAULT NULL COMMENT '门店业绩积分可用百分比',\n\t`shop_point_open` int DEFAULT '0' COMMENT '门店业绩积分 1开0关',\n\t`shop_point_gift` int DEFAULT '0' COMMENT '门店业绩积分转赠送 1开0关',\n\t`person_point` decimal(10, 2) DEFAULT NULL COMMENT '技师业绩积分可用百分比',\n\t`person_point_open` int DEFAULT '0' COMMENT '技师业绩积分 1开0关',\n\t`person_point_gift` int DEFAULT '0' COMMENT '技师积分转赠送 1开0关',\n\t`get_new_point` decimal(10, 2) DEFAULT NULL COMMENT '拉新人积分可用百分比',\n\t`get_new_point_open` int DEFAULT '0' COMMENT '拉新人积分 1开0关',\n\t`get_new_point_gift` int DEFAULT '0' COMMENT '拉新人积分转赠送 1开0关',\n\t`get_regis_point` decimal(10, 2) DEFAULT NULL COMMENT '注册积分可用百分比',\n\t`get_regis_point_open` int DEFAULT '0' COMMENT '注册积分 1开0关',\n\t`get_regis_point_gift` int DEFAULT '0' COMMENT '注册积分转赠送 1开0关',\n\t`work_point` decimal(10, 2) DEFAULT NULL COMMENT '做工积分可用百分比',\n\t`work_point_open` int DEFAULT '0' COMMENT '做工积分 1开0关',\n\t`work_point_gift` int DEFAULT '0' COMMENT '做工积分转赠送 1开0关',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 64 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '积分管理-积分设置'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_point_setting",
                "targetName":"prototype"
            }
        },
        "t_vip_setting":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_vip_setting` (\n\t`id` int NOT NULL COMMENT '1-7对应会员',\n\t`vip_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '会员名称',\n\t`vip_info` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '会员专属权益',\n\t`vip_cancel_day` int DEFAULT NULL COMMENT '1级会员专用 自动解绑推广人天数: 达到设置天数未成为黄金会员自动解绑推广人',\n\t`vip_change_day` int DEFAULT NULL COMMENT '1级会员专用 可更换绑定人天数:用户在达到设置的天数未下单商品,可以更换绑定人',\n\t`vip_withdrawal_role` int DEFAULT '0' COMMENT '钱包提现权限1开0关',\n\t`vip_withdrawal_min_amount` decimal(10, 2) DEFAULT NULL COMMENT '最低提现门槛',\n\t`vip_withdrawal_fee` decimal(10, 2) DEFAULT NULL COMMENT '提现手续费',\n\t`vip_gift_role` int DEFAULT '0' COMMENT '积分转赠权限 1开0关',\n\t`vip_level_up_shop` decimal(10, 2) DEFAULT NULL COMMENT '达成会员等级所需消费积分数量',\n\t`vip_level_up_shop_role` int DEFAULT '0' COMMENT '通过消费积分达成会员等级的开关 1开0关',\n\t`vip_level_up_share` int DEFAULT NULL COMMENT '达成会员等级所需的返佣积分数量',\n\t`vip_level_up_share_role` int DEFAULT '0' COMMENT '通过返佣积分达成会员等级的开关 1开0关',\n\t`vip_agent_level_up_role` int DEFAULT '0' COMMENT '创业者:消费并且返佣升级  1开0关',\n\t`vip_direct_num` int DEFAULT NULL COMMENT '达成会员等级所需的直推人数(包括钻石和代理)',\n\t`vip_team_num` int DEFAULT NULL COMMENT '达成会员等级所需的团队数量',\n\t`vip_level_up_num_role` int DEFAULT NULL COMMENT '通过直推用户或团队数量的方式达成会员等级的开关 1开0关',\n\t`vip_direct_vip_num` int DEFAULT NULL COMMENT '达成会员等级所需准代理数(达成总代和合伙人用到)',\n\t`vip_team_vip_num` int DEFAULT NULL COMMENT '达成会员等级所需总代数量(达成合伙人用到)',\n\t`vip_open_shop_num` int DEFAULT NULL COMMENT '达成会员等级所需开店数量',\n\t`vip_direct_vip_role` int DEFAULT '0' COMMENT '创业者:直推钻石会员开关 1开0关',\n\t`keep_buy_day` int DEFAULT NULL COMMENT '消费积分保级周期(天)',\n\t`keep_buy_point` int DEFAULT NULL COMMENT '消费积分保级的积分阈值(分)',\n\t`keep_share_day` int DEFAULT NULL COMMENT '返佣积分保级的周期(天)',\n\t`keep_share_point` int DEFAULT NULL COMMENT '返佣积分保级的积分阈值(分)',\n\t`keep_shop_day` int DEFAULT NULL COMMENT '门店业绩积分保级的周期(天)',\n\t`keep_shop_point` int DEFAULT NULL COMMENT '门店业绩积分保级的积分阈值(分)',\n\t`vip_level_up_proxy_role` int DEFAULT '0' COMMENT '会员等级是否必须达到代理: 0-否 1-是',\n\t`good_ids` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '指定购买商品升级ids',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '会员权益'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_vip_setting",
                "targetName":"prototype"
            }
        },
        "t_base_setting":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_base_setting` (\n\t`id` int NOT NULL COMMENT '1:合伙人积分设置一,2:合伙人积分设置二,3:会员说明设置,4:活动管理-活动设置 1开0,5:售后设置',\n\t`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '内容',\n\t`withdraw` int DEFAULT NULL,\n\t`withdrawalMinAmount` decimal(10, 2) DEFAULT NULL,\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '基础设置'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_base_setting",
                "targetName":"prototype"
            }
        },
        "t_order_activity_info":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_order_activity_info` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`del_flag` tinyint DEFAULT '0' COMMENT '删除标志(0=否,1=是)',\n\t`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',\n\t`activity_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '活动名称',\n\t`vip_ids` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '适用会员类型\",\"分隔',\n\t`start_time` datetime DEFAULT NULL COMMENT '活动开始日期',\n\t`end_time` datetime DEFAULT NULL COMMENT '活动结束日期',\n\t`condition_amount` decimal(10, 2) DEFAULT NULL COMMENT '满x元',\n\t`discount` decimal(10, 2) DEFAULT NULL COMMENT '折扣',\n\t`is_shelf` int DEFAULT NULL COMMENT '是否上架:0否 1是',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT '订单优惠活动'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_order_activity_info",
                "targetName":"prototype"
            }
        },
        "t_region":{
            "createTableSQL":"CREATE TABLE `t_region` (\r\n  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',\r\n  `name` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '城市名称',\r\n  `code` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,\r\n  `citycode` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL,\r\n  `parent_id` int DEFAULT NULL COMMENT '父级ID',\r\n  `english` varchar(200) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '英文名称',\r\n  PRIMARY KEY (`id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=3537 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT COMMENT='省市区三级联动'",
            "locality":{
                "schemaName":"qijisheng_other",
                "tableName":"t_region",
                "targetName":"prototype"
            }
        }
    },
    "schemaName":"qijisheng_other",
    "shardingTables":{
        "t_goods_app_user":{
            "createTableSQL":"CREATE TABLE `t_goods_app_user` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `goods_id` int DEFAULT NULL COMMENT '商品id',\r\n  `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品指定用户数据' TBPARTITION BY MOD_HASH(goods_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_goods_app_user_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(goods_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_technician_subscribe":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_technician_subscribe` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`technician_id` int DEFAULT NULL COMMENT '技师id',\n\t`subscribe_time` datetime DEFAULT NULL COMMENT '预约时间',\n\t`service_mode` int DEFAULT NULL COMMENT '服务方式(1=上门服务,2=到店服务)',\n\t`user_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户地址JSON对象',\n\t`status` int DEFAULT NULL COMMENT '状态(0=待服务,1=已服务,2=已取消,3=已到期)',\n\t`del_flag` int DEFAULT NULL COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '技师预约记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_technician_subscribe_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_technician_score":{
            "createTableSQL":"CREATE TABLE `t_technician_score` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `app_user_id` bigint DEFAULT NULL COMMENT '用户id',\r\n  `technician_id` int DEFAULT NULL COMMENT '技师id',\r\n  `score` decimal(10,2) DEFAULT NULL COMMENT '评分',\r\n  `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='技师评分记录' TBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_technician_score_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_vip_good":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_vip_good` (\n\t`id` bigint NOT NULL,\n\t`vip_id` int DEFAULT NULL COMMENT '对应会员id',\n\t`good_json` text COLLATE utf8mb4_bin COMMENT '指定购买后升级商品的json快照',\n\tPRIMARY KEY USING BTREE (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '会员等级设置-指定商品(弃用)'\nTBPARTITION BY MOD_HASH(vip_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_vip_good_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(vip_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_goods_evaluate":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_goods_evaluate` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`goods_id` int DEFAULT NULL COMMENT '商品id',\n\t`order_id` bigint DEFAULT NULL COMMENT '订单id',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`grade` decimal(10, 2) DEFAULT NULL COMMENT '评分',\n\t`comment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '评价内容',\n\t`images` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin COMMENT '评价图片',\n\t`status` int DEFAULT '2' COMMENT '状态(1=下架,2=上架)',\n\t`del_flag` int DEFAULT '0' COMMENT '删除(0=否,1=是)',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '商品评价'\nTBPARTITION BY MOD_HASH(goods_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_goods_evaluate_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(goods_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_shop_balance_statement":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_shop_balance_statement` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`type` int DEFAULT NULL COMMENT '变动类型(1=绑定门店分佣,2=下级门店分佣,3=核销门店服务费,4=提现)',\n\t`historical_balance` decimal(10, 2) DEFAULT NULL COMMENT '历史余额',\n\t`variable_amount` decimal(10, 2) DEFAULT NULL COMMENT '变动金额',\n\t`balance` decimal(10, 2) DEFAULT NULL COMMENT '变动后余额',\n\t`create_time` datetime DEFAULT NULL COMMENT '变动时间',\n\t`create_user_id` bigint DEFAULT NULL COMMENT '变动用户id',\n\t`object_id` bigint DEFAULT NULL COMMENT '关联对象id',\n\t`extension` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '拓展字段',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店余额流水'\nTBPARTITION BY MOD_HASH(shop_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_shop_balance_statement_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(shop_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_goods_area":{
            "createTableSQL":"CREATE TABLE `t_goods_area` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `goods_id` int DEFAULT NULL COMMENT '商品id',\r\n  `province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省',\r\n  `province_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '省编号',\r\n  `city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市',\r\n  `city_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '市编号',\r\n  `districts` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区',\r\n  `districts_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '区编号',\r\n  `vip` int DEFAULT NULL COMMENT '会员级别(1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)',\r\n  `cash_payment` int DEFAULT NULL COMMENT '现金支付(0=否,1=是)',\r\n  `point_payment` int DEFAULT NULL COMMENT '积分支付(0=否,1=是)',\r\n  `selling_price` decimal(10,2) DEFAULT NULL COMMENT '基础售价',\r\n  `integral` int DEFAULT NULL COMMENT '基础积分',\r\n  `earn_spending_points` int DEFAULT NULL COMMENT '可获得消费积分',\r\n  `superior_subcommission` decimal(10,2) DEFAULT NULL COMMENT '上级获得分佣金额',\r\n  `superior_rebate_points` int DEFAULT NULL COMMENT '上级获得返佣积分',\r\n  `superior_type` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '获取返佣积分上级类型(1=直推上级,2=直帮上级)',\r\n  `superior_price_type` varchar(255) DEFAULT NULL COMMENT '获取分佣金额上级类型(1=直推上级,2=直帮上级)',\r\n  `servuce_shop_charges` decimal(10,2) DEFAULT NULL COMMENT '核销门店可获得服务费',\r\n  `servuce_shop_points` int DEFAULT NULL COMMENT '核销门店可获得服务积分',\r\n  `technician_points` int DEFAULT NULL COMMENT '技师可获得服务积分',\r\n  `bound_shop_charges` decimal(10,2) DEFAULT NULL COMMENT '绑定门店可获得分佣金额',\r\n  `bound_shop_points` int DEFAULT NULL COMMENT '绑定门店可获得返佣积分',\r\n  `bound_shop_superiors_charges` decimal(10,2) DEFAULT NULL COMMENT '绑定门店上级门店可获得分佣金额',\r\n  `bound_shop_superiors_points` int DEFAULT NULL COMMENT '绑定门店上级门店可获得返佣积分',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品地区配置' TBPARTITION BY MOD_HASH(goods_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_goods_area_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(goods_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_shop_point":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_shop_point` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`type` int DEFAULT NULL COMMENT '变动类型(1=门店业绩,2=门店返佣,3=下级门店返佣,4=门店服务返佣)',\n\t`historical_point` int DEFAULT NULL COMMENT '历史余额',\n\t`variable_point` int DEFAULT NULL COMMENT '变动金额',\n\t`balance` int DEFAULT NULL COMMENT '变动后余额',\n\t`create_time` datetime DEFAULT NULL COMMENT '变动时间',\n\t`create_user_id` bigint DEFAULT NULL COMMENT '变动用户id',\n\t`object_id` bigint DEFAULT NULL COMMENT '关联对象id',\n\t`order_num` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单编号',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店积分流水'\nTBPARTITION BY MOD_HASH(shop_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_shop_point_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(shop_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_shop_withdraw":{
            "createTableSQL":"CREATE TABLE `t_shop_withdraw` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n  `money` decimal(10,2) DEFAULT NULL COMMENT '提现金额',\r\n  `audit_status` int DEFAULT '0' COMMENT '审核状态(0=待审核,1=审核通过,2=审核失败)',\r\n  `audit_user_id` bigint DEFAULT NULL COMMENT '审核人id',\r\n  `audit_time` datetime DEFAULT NULL COMMENT '审核时间',\r\n  `audit_msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '审核结果',\r\n  `status` int DEFAULT NULL COMMENT '状态(1=申请中,2=已到账)',\r\n  `arrival_time` datetime DEFAULT NULL COMMENT '到账时间',\r\n  `del_flag` int DEFAULT NULL COMMENT '删除(0=否,1=是)',\r\n  `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n  `create_user_id` bigint DEFAULT NULL COMMENT '添加用户id',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='门店提现申请' TBPARTITION BY MOD_HASH(shop_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_shop_withdraw_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(shop_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_goods_shop":{
            "createTableSQL":"CREATE TABLE `t_goods_shop` (\r\n  `id` bigint NOT NULL COMMENT '主键',\r\n  `goods_id` int DEFAULT NULL COMMENT '商品id',\r\n  `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n  PRIMARY KEY (`id`)\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='商品指定门店数据' TBPARTITION BY MOD_HASH(goods_id) TBPARTITIONS 10",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_goods_shop_${tableIndex}",
                    "tableNum":"10",
                    "tableMethod":"MOD_HASH(goods_id)",
                    "storeNum":0
                },
                "ranges":{}
            },
            "partition":{
            },
            "shardingIndexTables":{}
        },
        "t_shop_score":{
            "createTableSQL":"CREATE TABLE `qijisheng_other`.`t_shop_score` (\n\t`id` bigint NOT NULL COMMENT '主键',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '用户id',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`score` decimal(10, 1) DEFAULT '5.0' COMMENT '评分',\n\t`create_time` datetime DEFAULT NULL COMMENT '添加时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店评分记录'\nTBPARTITION BY MOD_HASH(app_user_id) TBPARTITIONS 20",
            "function":{
                "properties":{
                    "mappingFormat":"prototype/qijisheng_other/t_shop_score_${tableIndex}",
                    "tableNum":"20",
                    "tableMethod":"MOD_HASH(app_user_id)",
                    "storeNum":0
                }
            },
            "shardingIndexTables":{}
        }
    },
    "views":{}
}
mycat/qijisheng_system.schema.json
New file
@@ -0,0 +1,170 @@
{
    "customTables":{},
    "globalTables":{},
    "normalProcedures":{},
    "normalTables":{
        "sys_job_log":{
            "createTableSQL":"CREATE TABLE `sys_job_log` (\r\n  `job_log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务日志ID',\r\n  `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务名称',\r\n  `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务组名',\r\n  `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串',\r\n  `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '日志信息',\r\n  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '执行状态(0正常 1失败)',\r\n  `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '异常信息',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  PRIMARY KEY (`job_log_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='定时任务调度日志表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_job_log",
                "targetName":"prototype"
            }
        },
        "t_user_shop":{
            "createTableSQL":"CREATE TABLE `qijisheng_system`.`t_user_shop` (\n\t`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\n\t`user_id` int DEFAULT NULL COMMENT '用户id',\n\t`shop_id` int DEFAULT NULL COMMENT '门店id',\n\t`role_type` int DEFAULT NULL COMMENT '角色类型(1=店长,2=店员)',\n\t`role_id` int DEFAULT NULL COMMENT '角色id',\n\t`dept_id` bigint DEFAULT NULL COMMENT '部门ID',\n\t`nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户昵称',\n\t`create_time` datetime DEFAULT NULL COMMENT '创建时间',\n\tPRIMARY KEY (`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARSET = utf8mb4 COLLATE = utf8mb4_bin COMMENT '门店员工关系数据(后台)'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"t_user_shop",
                "targetName":"prototype"
            }
        },
        "sys_dict_type":{
            "createTableSQL":"CREATE TABLE `sys_dict_type` (\r\n  `dict_id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键',\r\n  `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典名称',\r\n  `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型',\r\n  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n  PRIMARY KEY (`dict_id`) USING BTREE,\r\n  UNIQUE KEY `dict_type` (`dict_type`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典类型表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_dict_type",
                "targetName":"prototype"
            }
        },
        "sys_role_menu":{
            "createTableSQL":"CREATE TABLE `sys_role_menu` (\r\n  `role_id` bigint NOT NULL COMMENT '角色ID',\r\n  `menu_id` bigint NOT NULL COMMENT '菜单ID',\r\n  PRIMARY KEY (`role_id`,`menu_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色和菜单关联表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_role_menu",
                "targetName":"prototype"
            }
        },
        "gen_table_column":{
            "createTableSQL":"CREATE TABLE `gen_table_column` (\r\n  `column_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',\r\n  `table_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '归属表编号',\r\n  `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列名称',\r\n  `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列描述',\r\n  `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列类型',\r\n  `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'JAVA类型',\r\n  `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'JAVA字段名',\r\n  `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否主键(1是)',\r\n  `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否自增(1是)',\r\n  `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否必填(1是)',\r\n  `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否为插入字段(1是)',\r\n  `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否编辑字段(1是)',\r\n  `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否列表字段(1是)',\r\n  `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '是否查询字段(1是)',\r\n  `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)',\r\n  `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',\r\n  `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型',\r\n  `sort` int DEFAULT NULL COMMENT '排序',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  PRIMARY KEY (`column_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='代码生成业务表字段'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"gen_table_column",
                "targetName":"prototype"
            }
        },
        "sys_job":{
            "createTableSQL":"CREATE TABLE `sys_job` (\r\n  `job_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID',\r\n  `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '任务名称',\r\n  `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名',\r\n  `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '调用目标字符串',\r\n  `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT 'cron执行表达式',\r\n  `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)',\r\n  `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)',\r\n  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1暂停)',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注信息',\r\n  PRIMARY KEY (`job_id`,`job_name`,`job_group`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='定时任务调度表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_job",
                "targetName":"prototype"
            }
        },
        "gen_table":{
            "createTableSQL":"CREATE TABLE `gen_table` (\r\n  `table_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',\r\n  `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '表名称',\r\n  `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '表描述',\r\n  `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '关联子表的表名',\r\n  `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '子表关联的外键名',\r\n  `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '实体类名称',\r\n  `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)',\r\n  `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成包路径',\r\n  `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成模块名',\r\n  `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成业务名',\r\n  `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成功能名',\r\n  `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '生成功能作者',\r\n  `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)',\r\n  `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '/' COMMENT '生成路径(不填默认项目路径)',\r\n  `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '其它生成选项',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n  PRIMARY KEY (`table_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='代码生成业务表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"gen_table",
                "targetName":"prototype"
            }
        },
        "sys_login_log":{
            "createTableSQL":"CREATE TABLE `sys_login_log` (\r\n  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',\r\n  `user_id` int DEFAULT NULL COMMENT '用户id',\r\n  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '登录账号',\r\n  `ip_address` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '登录IP地址',\r\n  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '登录地址',\r\n  `browser_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '浏览器类型',\r\n  `operating_system` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作系统',\r\n  `login_time` datetime DEFAULT NULL COMMENT '登录时间',\r\n  `login_status` int DEFAULT NULL COMMENT '登录状态(1=成功,2=失败)',\r\n  `message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '提示消息',\r\n  `create_time` datetime DEFAULT NULL COMMENT '添加时间',\r\n  `del_flag` int DEFAULT NULL COMMENT '删除状态(0=否,1=是)',\r\n  PRIMARY KEY (`id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=463 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='登录日志'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_login_log",
                "targetName":"prototype"
            }
        },
        "sys_user_post":{
            "createTableSQL":"CREATE TABLE `sys_user_post` (\r\n  `user_id` bigint NOT NULL COMMENT '用户ID',\r\n  `post_id` bigint NOT NULL COMMENT '岗位ID',\r\n  PRIMARY KEY (`user_id`,`post_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户与岗位关联表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_user_post",
                "targetName":"prototype"
            }
        },
        "sys_dict_data":{
            "createTableSQL":"CREATE TABLE `sys_dict_data` (\r\n  `dict_code` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码',\r\n  `dict_sort` int DEFAULT '0' COMMENT '字典排序',\r\n  `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典标签',\r\n  `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典键值',\r\n  `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '字典类型',\r\n  `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '样式属性(其他样式扩展)',\r\n  `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '表格回显样式',\r\n  `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '是否默认(Y是 N否)',\r\n  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '状态(0正常 1停用)',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n  PRIMARY KEY (`dict_code`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='字典数据表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_dict_data",
                "targetName":"prototype"
            }
        },
        "sys_role_dept":{
            "createTableSQL":"CREATE TABLE `sys_role_dept` (\r\n  `role_id` bigint NOT NULL COMMENT '角色ID',\r\n  `dept_id` bigint NOT NULL COMMENT '部门ID',\r\n  PRIMARY KEY (`role_id`,`dept_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色和部门关联表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_role_dept",
                "targetName":"prototype"
            }
        },
        "sys_role":{
            "createTableSQL":"CREATE TABLE `sys_role` (\r\n  `role_id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID',\r\n  `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称',\r\n  `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '角色权限字符串',\r\n  `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',\r\n  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '角色状态(0正常 1停用)',\r\n  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n  `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n  PRIMARY KEY (`role_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色信息表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_role",
                "targetName":"prototype"
            }
        },
        "sys_oper_log":{
            "createTableSQL":"CREATE TABLE `sys_oper_log` (\r\n  `oper_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',\r\n  `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '模块标题',\r\n  `business_type` int DEFAULT '0' COMMENT '业务类型(0其它 1新增 2修改 3删除)',\r\n  `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '方法名称',\r\n  `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求方式',\r\n  `operator_type` int DEFAULT '0' COMMENT '操作类别(0其它 1后台用户 2手机端用户)',\r\n  `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作人员',\r\n  `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '部门名称',\r\n  `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求URL',\r\n  `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '主机地址',\r\n  `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '操作地点',\r\n  `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '请求参数',\r\n  `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '返回参数',\r\n  `status` int DEFAULT '0' COMMENT '操作状态(0正常 1异常)',\r\n  `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '错误消息',\r\n  `oper_time` datetime DEFAULT NULL COMMENT '操作时间',\r\n  `cost_time` bigint DEFAULT '0' COMMENT '消耗时间',\r\n  PRIMARY KEY (`oper_id`) USING BTREE,\r\n  KEY `idx_sys_oper_log_bt` (`business_type`) USING BTREE,\r\n  KEY `idx_sys_oper_log_s` (`status`) USING BTREE,\r\n  KEY `idx_sys_oper_log_ot` (`oper_time`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='操作日志记录'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_oper_log",
                "targetName":"prototype"
            }
        },
        "sys_user_role":{
            "createTableSQL":"CREATE TABLE `sys_user_role` (\r\n  `user_id` bigint NOT NULL COMMENT '用户ID',\r\n  `role_id` bigint NOT NULL COMMENT '角色ID',\r\n  PRIMARY KEY (`user_id`,`role_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户和角色关联表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_user_role",
                "targetName":"prototype"
            }
        },
        "sys_menu":{
            "createTableSQL":"CREATE TABLE `qijisheng_system`.`sys_menu` (\n\t`menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID',\n\t`menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称',\n\t`parent_id` bigint DEFAULT '0' COMMENT '父菜单ID',\n\t`order_num` int DEFAULT '0' COMMENT '显示顺序',\n\t`path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '路由地址',\n\t`component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '组件路径',\n\t`query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '路由参数',\n\t`is_frame` int DEFAULT '1' COMMENT '是否为外链(0是 1否)',\n\t`is_cache` int DEFAULT '0' COMMENT '是否缓存(0缓存 1不缓存)',\n\t`menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',\n\t`visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)',\n\t`status` tinyint(1) DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',\n\t`perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '权限标识',\n\t`icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '#' COMMENT '菜单图标',\n\t`create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\n\t`create_time` datetime DEFAULT NULL COMMENT '创建时间',\n\t`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\n\t`update_time` datetime DEFAULT NULL COMMENT '更新时间',\n\t`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '备注',\n\t`role_type` int DEFAULT NULL COMMENT '数据类型(1=平台,2=门店)',\n\tPRIMARY KEY USING BTREE (`menu_id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 286 CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT '菜单权限表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_menu",
                "targetName":"prototype"
            }
        },
        "sys_user":{
            "createTableSQL":"CREATE TABLE `qijisheng_system`.`sys_user` (\n\t`user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',\n\t`dept_id` bigint DEFAULT NULL COMMENT '部门ID',\n\t`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号',\n\t`nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户昵称',\n\t`user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '00' COMMENT '用户类型(00系统用户)',\n\t`email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '用户邮箱',\n\t`phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手机号码',\n\t`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',\n\t`avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '头像地址',\n\t`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '密码',\n\t`status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',\n\t`del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',\n\t`login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '最后登录IP',\n\t`login_date` datetime DEFAULT NULL COMMENT '最后登录时间',\n\t`role_type` int DEFAULT '1' COMMENT '角色类型 1=平台 2=门店',\n\t`passWordUpdate` datetime DEFAULT NULL COMMENT '密码修改时间',\n\t`objectId` int DEFAULT '1' COMMENT '对象ID',\n\t`create_by` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\n\t`create_time` datetime DEFAULT NULL COMMENT '创建时间',\n\t`update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\n\t`update_time` datetime DEFAULT NULL COMMENT '更新时间',\n\t`remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\n\t`forbidden_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '禁用账户备注',\n\t`app_user_id` bigint DEFAULT NULL COMMENT '前端用户id',\n\tPRIMARY KEY USING BTREE (`user_id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 49 CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC COMMENT '用户信息表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_user",
                "targetName":"prototype"
            }
        },
        "sys_dept":{
            "createTableSQL":"CREATE TABLE `sys_dept` (\r\n  `dept_id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门id',\r\n  `parent_id` bigint DEFAULT '0' COMMENT '父部门id',\r\n  `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '祖级列表',\r\n  `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '部门名称',\r\n  `order_num` int DEFAULT '0' COMMENT '显示顺序',\r\n  `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '负责人',\r\n  `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '联系电话',\r\n  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '邮箱',\r\n  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '部门状态(0正常 1停用)',\r\n  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `shop_id` int DEFAULT NULL COMMENT '门店id',\r\n  PRIMARY KEY (`dept_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=110 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_dept",
                "targetName":"prototype"
            }
        },
        "sys_post":{
            "createTableSQL":"CREATE TABLE `sys_post` (\r\n  `post_id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID',\r\n  `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码',\r\n  `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称',\r\n  `post_sort` int NOT NULL COMMENT '显示顺序',\r\n  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n  PRIMARY KEY (`post_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='岗位信息表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_post",
                "targetName":"prototype"
            }
        },
        "sys_config":{
            "createTableSQL":"CREATE TABLE `sys_config` (\r\n  `config_id` int NOT NULL AUTO_INCREMENT COMMENT '参数主键',\r\n  `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数名称',\r\n  `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数键名',\r\n  `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '参数键值',\r\n  `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT 'N' COMMENT '系统内置(Y是 N否)',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n  PRIMARY KEY (`config_id`) USING BTREE\r\n) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='参数配置表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_config",
                "targetName":"prototype"
            }
        },
        "sys_notice":{
            "createTableSQL":"CREATE TABLE `sys_notice` (\r\n  `notice_id` int NOT NULL AUTO_INCREMENT COMMENT '公告ID',\r\n  `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题',\r\n  `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告类型(1通知 2公告)',\r\n  `notice_content` longblob COMMENT '公告内容',\r\n  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',\r\n  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '创建者',\r\n  `create_time` datetime DEFAULT NULL COMMENT '创建时间',\r\n  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '更新者',\r\n  `update_time` datetime DEFAULT NULL COMMENT '更新时间',\r\n  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',\r\n  PRIMARY KEY (`notice_id`) USING BTREE\r\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='通知公告表'",
            "locality":{
                "schemaName":"qijisheng_system",
                "tableName":"sys_notice",
                "targetName":"prototype"
            }
        }
    },
    "schemaName":"qijisheng_system",
    "shardingTables":{},
    "views":{}
}
nacos/nacos_config_export_20250108104030.zip
Binary files differ
nacos/nacos_config_export_20250113211329.zip
Binary files differ
pom.xml
New file
@@ -0,0 +1,299 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi</artifactId>
    <version>3.6.2</version>
    <name>ruoyi</name>
    <description>微服务系统</description>
    <properties>
        <ruoyi.version>3.6.2</ruoyi.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-boot.version>2.7.7</spring-boot.version>
        <spring-cloud.version>2021.0.5</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.4.0</spring-cloud-alibaba.version>
        <spring-boot-admin.version>2.7.10</spring-boot-admin.version>
        <swagger.fox.version>3.0.0</swagger.fox.version>
        <swagger.core.version>1.6.2</swagger.core.version>
        <tobato.version>1.27.2</tobato.version>
        <kaptcha.version>2.3.3</kaptcha.version>
        <pagehelper.boot.version>1.4.6</pagehelper.boot.version>
        <druid.version>1.2.16</druid.version>
        <dynamic-ds.version>3.5.2</dynamic-ds.version>
        <commons.io.version>2.11.0</commons.io.version>
        <velocity.version>2.3</velocity.version>
        <fastjson.version>2.0.25</fastjson.version>
        <jjwt.version>0.9.1</jjwt.version>
        <minio.version>8.2.2</minio.version>
        <poi.version>4.1.2</poi.version>
        <transmittable-thread-local.version>2.14.2</transmittable-thread-local.version>
    </properties>
    <!-- 依赖声明 -->
    <dependencyManagement>
        <dependencies>
            <!-- SpringCloud 微服务 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringCloud Alibaba 微服务 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- SpringBoot 依赖配置 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- FastDFS 分布式文件系统 -->
            <dependency>
                <groupId>com.github.tobato</groupId>
                <artifactId>fastdfs-client</artifactId>
                <version>${tobato.version}</version>
            </dependency>
            <!-- Swagger 依赖配置 -->
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-models</artifactId>
                <version>${swagger.core.version}</version>
            </dependency>
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-annotations</artifactId>
                <version>${swagger.core.version}</version>
            </dependency>
            <!-- 验证码 -->
            <dependency>
                <groupId>pro.fessional</groupId>
                <artifactId>kaptcha</artifactId>
                <version>${kaptcha.version}</version>
            </dependency>
            <!-- pagehelper 分页插件 -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.boot.version}</version>
            </dependency>
            <!-- io常用工具类 -->
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commons.io.version}</version>
            </dependency>
            <!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>${poi.version}</version>
            </dependency>
            <!-- 代码生成使用模板 -->
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>${velocity.version}</version>
            </dependency>
            <!-- JSON 解析器和生成器 -->
            <dependency>
                <groupId>com.alibaba.fastjson2</groupId>
                <artifactId>fastjson2</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <!-- JWT -->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jjwt.version}</version>
            </dependency>
            <!-- 线程传递值 -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>transmittable-thread-local</artifactId>
                <version>${transmittable-thread-local.version}</version>
            </dependency>
            <!-- 核心模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-core</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 接口模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-swagger</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 安全模块 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-security</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 权限范围 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-datascope</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 多数据源 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-datasource</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 日志记录 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-log</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 缓存服务 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-common-redis</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 系统接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-system</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 账户接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-account</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 订单接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-order</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
            <!-- 系统其他接口 -->
            <dependency>
                <groupId>com.ruoyi</groupId>
                <artifactId>ruoyi-api-other</artifactId>
                <version>${ruoyi.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <modules>
        <module>ruoyi-auth</module>
        <module>ruoyi-gateway</module>
        <module>ruoyi-modules</module>
        <module>ruoyi-api</module>
        <module>ruoyi-common</module>
        <module>ruoyi-service</module>
    </modules>
    <packaging>pom</packaging>
    <dependencies>
        <!-- bootstrap 启动器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>
ruoyi-api/pom.xml
New file
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>ruoyi-api-system</module>
        <module>ruoyi-api-account</module>
        <module>ruoyi-api-order</module>
        <module>ruoyi-api-other</module>
    </modules>
    <artifactId>ruoyi-api</artifactId>
    <packaging>pom</packaging>
    <description>
        ruoyi-api系统接口
    </description>
</project>
ruoyi-api/ruoyi-api-account/pom.xml
New file
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi-api</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-api-account</artifactId>
    <description>
        ruoyi-api-account账户接口模块
    </description>
    <dependencies>
        <!-- RuoYi Common Core-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-core</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserClientFallbackFactory.java
New file
@@ -0,0 +1,129 @@
package com.ruoyi.account.api.factory;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.Collections;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/11/21 9:52
 */
@Slf4j
public class AppUserClientFallbackFactory implements FallbackFactory<AppUserClient> {
    @Override
    public AppUserClient create(Throwable cause) {
        return new AppUserClient() {
            @Override
            public AppUser getAppUserById(Long id) {
                log.error("根据id获取用户失败:{}", cause.getMessage());
                throw new RuntimeException("根据id获取用户失败");
            }
            @Override
            public R<Void> editAppUserById(AppUser appUser) {
                log.error("编辑用户信息失败:{}", cause.getMessage());
                return R.fail("编辑用户信息失败");
            }
            @Override
            public R<Long> getCouponCount(Long userId, Integer couponId) {
                log.error("获取优惠券数量失败:{}", cause.getMessage());
                throw new RuntimeException("获取优惠券数量失败");
            }
            @Override
            public R<List<AppUser>> getUserAncestorList(Long id) {
                log.error("获取用户祖籍列表失败:{}", cause.getMessage());
                throw new RuntimeException("获取用户祖籍列表失败");
            }
            @Override
            public R<AppUser> getSuperiorLeader(Long id) {
                return R.fail("获取直帮上级用户失败");
            }
            @Override
            public R<List<AppUser>> getTopUsers() {
                log.error("获取用户列表失败:{}", cause.getMessage());
                throw new RuntimeException("获取用户列表失败");
            }
            @Override
            public R<Long> getVipCount(Long userId, Integer vipId) {
                log.error("获取直推会员数失败:{}", cause.getMessage());
                throw new RuntimeException("获取直推会员数失败");
            }
            @Override
            public R<List<AppUser>> getAppUserByName(String name) {
                return R.fail("根据用户名称模糊搜索用户列表失败:" + cause.getMessage());
            }
            @Override
            public R<List<AppUser>> getAppUserByNameNoFilter(String name) {
                return R.fail("根据用户名称模糊搜索用户列表失败:" + cause.getMessage());
            }
            @Override
            public R<List<AppUser>> getAppUserByPhone(String phone) {
                return R.fail("根据用户电话模糊搜索用户列表失败:" + cause.getMessage());
            }
            @Override
            public R<List<AppUser>> getAppUserByPhoneNoFilter(String phone) {
                return R.fail("根据用户电话模糊搜索用户列表失败:" + cause.getMessage());
            }
            @Override
            public R<AppUser> getAppUserByPhone1(String phone) {
                return R.fail("通过手机号查询用户失败");
            }
            @Override
            public R<List<AppUser>> setLowerUserShop(Long userId, Integer shopId) {
                return R.fail();
            }
            @Override
            public List<AppUser> listByIds(List<Long> list) {
                log.error("获取用户失败: "+cause.getMessage());
                return Collections.emptyList();
            }
            @Override
            public void vipUpgrade(Long appUserId) {
                R.fail("检查会员等级变更失败:" + cause.getMessage());
            }
            @Override
            public void vipConsumption(Long appUserId) {
                R.fail("检查会员等级变更失败:" + cause.getMessage());
            }
            @Override
            public void vipDemotion(Long appUserId) {
                R.fail("检查会员等级降级失败:" + cause.getMessage());
            }
            @Override
            public void demotionDetection() {
                R.fail("用户降级检测失败:" + cause.getMessage());
            }
            @Override
            public R clearBindShop(Integer shopId) {
                return R.fail("清空绑定门店的用户门店数据失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
New file
@@ -0,0 +1,134 @@
package com.ruoyi.account.api.feignClient;
import com.ruoyi.account.api.factory.AppUserClientFallbackFactory;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/11/21 9:50
 */
@FeignClient(contextId = "AppUserClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = AppUserClientFallbackFactory.class)
public interface AppUserClient {
    /**
     * 根据id获取用户
     * @param id
     * @return
     */
    @PostMapping("/app-user/getAppUserById")
    AppUser getAppUserById(@RequestParam("id") Long id);
    /**
     * 根据id编辑用户
     */
    @PostMapping("/app-user/editAppUserById")
    R<Void> editAppUserById(@RequestBody AppUser appUser);
    @PostMapping("/app-user/getCouponCount")
    R<Long> getCouponCount(@RequestParam("userId")Long userId, @RequestParam("couponId") Integer couponId );
    /**
     * 根据用户id获取用户的祖籍列表
     */
    @GetMapping("/appletLogin/getUserAncestorList")
    R<List<AppUser>> getUserAncestorList(@RequestParam("id") Long id);
    @PostMapping("/app-user/getSuperiorLeader")
    R<AppUser> getSuperiorLeader(@RequestParam("id") Long id);
    @PostMapping("/app-user/getTopUsers")
    R<List<AppUser>> getTopUsers();
    @PostMapping("/app-user/getVipCount")
    R<Long> getVipCount(@RequestParam("userId")Long userId, @RequestParam("vipId") Integer vipId );
    @PostMapping("/app-user/listByIds")
    List<AppUser> listByIds(@RequestParam("ids") List<Long> list);
    /**
     * 根据用户名称模糊搜索用户列表
     * @param name
     * @return
     */
    @PostMapping("/app-user/getAppUserByName")
    R<List<AppUser>> getAppUserByName(@RequestParam("name") String name);
    @GetMapping("/app-user/getAppUserByNameNoFilter")
    public R<List<AppUser>> getAppUserByNameNoFilter(@RequestParam("name") String name);
    /**
     * 根据用户电话模糊搜索用户列表
     * @param phone
     * @return
     */
    @PostMapping("/app-user/getAppUserByPhone")
    R<List<AppUser>> getAppUserByPhone(@RequestParam("phone") String phone);
    /**
     * 根据用户电话模糊搜索用户列表(包含被删除的用户)
     * @param phone
     * @return
     */
    @GetMapping("/app-user/getAppUserByPhoneNoFilter")
    public R<List<AppUser>> getAppUserByPhoneNoFilter(@RequestParam("phone") String phone);
    @PostMapping("/app-user/getAppUserByPhone1")
    R<AppUser> getAppUserByPhone1(@RequestParam("phone") String phone);
    /**
     * 获得指定用户的下级用户
     * @param userId
     * @return
     */
    @PostMapping("/app-user/setLowerUserShop")
    R<List<AppUser>>  setLowerUserShop(@RequestParam("userId") Long userId,@RequestParam("shopId") Integer shopId);
    /**
     * 检查会员等级变更
     * @param appUserId
     */
    @PostMapping("/app-user/vipUpgrade")
    void vipUpgrade(@RequestParam("appUserId") Long appUserId);
    /**
     * 消费后检查会员等级变更
     */
    @PostMapping("/app-user/vipConsumption")
    void vipConsumption(@RequestParam("appUserId") Long appUserId);
    /**
     * 检查会员降级
     * @param appUserId
     */
    @PostMapping("/app-user/vipDemotion")
    void vipDemotion(@RequestParam("appUserId") Long appUserId);
    /**
     * 用户降级检测
     */
    @PostMapping("/app-user/demotionDetection")
    void demotionDetection();
    /**
     * 清空绑定门店的用户门店数据
     * @param shopId
     * @return
     */
    @PostMapping("/app-user/clearBindShop")
    R clearBindShop(@RequestParam("shopId") Integer shopId);
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUser.java
New file
@@ -0,0 +1,369 @@
package com.ruoyi.account.api.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-21
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_app_user")
@ApiModel(value="AppUser对象", description="")
public class AppUser implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId("id")
    private Long id;
    @ApiModelProperty(value = "用户类型(1-普通用户,2-门店员工)")
    private Integer userType;
    @ApiModelProperty(value = "用户")
    @TableField("name")
    private String name;
    @ApiModelProperty("会员名称")
    @TableField(exist = false)
    private String vipName;
    @ApiModelProperty(value = "手机号")
    @TableField("phone")
    private String phone;
    @ApiModelProperty(value = "头像")
    @TableField("avatar")
    private String avatar;
    @ApiModelProperty(value = "会员id")
    @TableField("vip_id")
    private Integer vipId;
    @ApiModelProperty(value = "微信openid")
    @TableField("wx_openid")
    private String wxOpenid;
    @ApiModelProperty(value = "支付宝openid")
    @TableField("ali_openid")
    private String aliOpenid;
    @ApiModelProperty(value = "状态(1=正常,2=冻结,3=注销)")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "删除(0=否,1=是)")
    @TableField("del_flag")
    private Boolean delFlag;
    @ApiModelProperty(value = "0否1是第一次添加")
    @TableField("first_add")
    private Integer firstAdd;
    @ApiModelProperty(value = "最后一次登录时间")
    @TableField("last_login_time")
    private LocalDateTime lastLoginTime;
    @ApiModelProperty(value = "顶级推广人id")
    @TableField("top_invite_id")
    private Long topInviteId;
    @ApiModelProperty(value = "推广人id")
    @TableField("invite_user_id")
    private Long inviteUserId;
    @ApiModelProperty(value = "推广人姓名")
    @TableField(exist = false)
    private String inviteUserName;
    @ApiModelProperty(value = "指导老师")
    @TableField(exist = false)
    private String teacher;
    @TableField(exist = false)
    private String teacherPhone;
    @ApiModelProperty(value = "绑定门店id")
    @TableField("shop_id")
    private Integer shopId;
    @ApiModelProperty(value = "绑定门店名称")
    @TableField(exist = false)
    private String shopName;
    @ApiModelProperty(value = "绑定门店列表")
    @TableField(exist = false)
    private List<String> shopNames;
    @ApiModelProperty(value = "绑定门店封面")
    @TableField(exist = false)
    private String shopCover;
    @ApiModelProperty(value = "绑定门店地址")
    @TableField(exist = false)
    private String shopAddress;
    @ApiModelProperty(value = "上级人员信息")
    @TableField(exist = false)
    private AppUser topUser;
    @ApiModelProperty(value = "下级人员列表")
    @TableField(exist = false)
    private List<AppUser> bottomUsers;
    @TableField(exist = false)
    private Page<AppUser> bottomUsersPage;
    @ApiModelProperty(value = "合伙人积分数")
    @TableField("part_point")
    private Integer partPoint;
    @ApiModelProperty(value = "合伙人培育积分数")
    @TableField("part_grow_point")
    private Integer partGrowPoint;
    @ApiModelProperty(value = "消费积分数")
    @TableField("shop_point")
    private Integer shopPoint;
    @ApiModelProperty(value = "返佣积分数")
    @TableField("share_point")
    private Integer sharePoint;
    @ApiModelProperty(value = "消费总金额")
    @TableField("shop_amount")
    private BigDecimal shopAmount;
    @ApiModelProperty(value = "最后消费时间")
    @TableField("last_shop_time")
    private LocalDateTime lastShopTime;
    @ApiModelProperty(value = "账户余额")
    @TableField("balance")
    private BigDecimal balance;
    @ApiModelProperty(value = "可提现金额")
    @TableField("withdrawable_amount")
    private BigDecimal withdrawableAmount;
    @ApiModelProperty(value = "已提现金额")
    @TableField("withdrawn_amount")
    private BigDecimal withdrawnAmount;
    @ApiModelProperty(value = "充值总金额")
    @TableField("total_recharge_amount")
    private BigDecimal totalRechargeAmount;
    @ApiModelProperty(value = "红包总金额")
    @TableField("total_red_packet_amount")
    private BigDecimal totalRedPacketAmount;
    @ApiModelProperty(value = "分销总金额")
    @TableField("total_distribution_amount")
    private BigDecimal totalDistributionAmount;
    @ApiModelProperty(value = "冻结分佣金额")
    @TableField("freeze_commission_amount")
    private BigDecimal freezeCommissionAmount;
    @ApiModelProperty(value = "冻结分佣积分")
    @TableField("freeze_commission_point")
    private Integer freezeCommissionPoint;
    @ApiModelProperty(value = "拉新人积分总数")
    @TableField("total_invite_point")
    private Integer totalInvitePoint;
    @ApiModelProperty(value = "注册积分总数")
    @TableField("total_register_point")
    private Integer totalRegisterPoint;
    @ApiModelProperty(value = "绑定下级门店分佣积分")
    @TableField("lower_level_share_point")
    private Integer lowerLevelSharePoint;
    @ApiModelProperty(value = "门店返佣积分")
    @TableField("shop_share_point")
    private Integer shopSharePoint;
    @ApiModelProperty(value = "门店业绩积分")
    @TableField("shop_achievement_point")
    private Integer shopAchievementPoint;
    @ApiModelProperty(value = "门店服务费(门店核销获得)")
    @TableField("shop_service_fee")
    private BigDecimal shopServiceFee;
    @ApiModelProperty(value = "门店返佣金额(绑定用户消费后返佣)")
    @TableField("shop_commission")
    private BigDecimal shopCommission;
//    @ApiModelProperty(value = "做工积分总数")
//    @TableField("total_work_point")
//    private Integer totalWorkPoint;
    @ApiModelProperty(value = "每日分享积分")
    @TableField("total_share_point")
    private Integer totalSharePoint;
    @ApiModelProperty(value = "每日签到积分")
    @TableField("total_sign_point")
    private Integer totalSignPoint;
    @ApiModelProperty(value = "使用时长积分")
    @TableField("total_hour_point")
    private Integer totalHourPoint;
    @ApiModelProperty(value = "技师业绩积分总数")
    @TableField("total_performance_point")
    private Integer totalPerformancePoint;
    @ApiModelProperty(value = "总积分")
    @TableField("total_point")
    private Integer totalPoint;
    @ApiModelProperty(value = "剩余积分")
    @TableField("lave_point")
    private Integer lavePoint;
    @ApiModelProperty(value = "可用积分")
    @TableField("available_point")
    private Integer availablePoint;
    @ApiModelProperty(value = "可用总积分数")
    @TableField("total_available_point")
    private Integer totalAvailablePoint;
    @ApiModelProperty(value = "可转增积分")
    @TableField("transferable_point")
    private Integer transferablePoint;
    @ApiModelProperty(value = "是否可更换推广人(0=否,1=是)")
    @TableField("change_promoter")
    private Integer changePromoter;
    @ApiModelProperty(value = "经度")
    @TableField("longitude")
    private String longitude;
    @ApiModelProperty(value = "纬度")
    @TableField("latitude")
    private String latitude;
    @ApiModelProperty(value = "省")
    @TableField("province")
    private String province;
    @ApiModelProperty(value = "省编号")
    @TableField("province_code")
    private String provinceCode;
    @ApiModelProperty(value = "市")
    @TableField("city")
    private String city;
    @ApiModelProperty(value = "市编号")
    @TableField("city_code")
    private String cityCode;
    @ApiModelProperty(value = "区")
    @TableField("district")
    private String district;
    @ApiModelProperty(value = "区编号")
    @TableField("district_code")
    private String districtCode;
    @ApiModelProperty(value = "区编号")
    @TableField("qr_code")
    private String qrCode;
    @ApiModelProperty("等级1会员数")
    @TableField(exist = false)
    private Long count1;
    @ApiModelProperty("等级2会员数")
    @TableField(exist = false)
    private Long count2;
    @ApiModelProperty("等级3会员数")
    @TableField(exist = false)
    private Long count3;
    @ApiModelProperty("等级4会员数")
    @TableField(exist = false)
    private Long count4;
    @ApiModelProperty("等级5会员数")
    @TableField(exist = false)
    private Long count5;
    @ApiModelProperty("等级6会员数")
    @TableField(exist = false)
    private Long count6;
    @ApiModelProperty("等级7会员数")
    @TableField(exist = false)
    private Long count7;
    @ApiModelProperty("是否签到1是0否")
    @TableField(exist = false)
    private Integer isSign;
    @ApiModelProperty("绑定门店id列表")
    @TableField(exist = false)
    private Set<Integer> shopIds;
    @ApiModelProperty(value = "降级预警(0=否,1=是)")
    @TableField("is_danger")
    private Integer isDanger;
    @ApiModelProperty(value = "最后下单时间")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime lastOrderTime;
    @TableField(exist = false)
    private Set<Long> userIds;
    @TableField(exist = false)
    private Integer excludeStatus;
    public String getIdStr(){
        return String.valueOf(id);
    }
    public Integer getUserTotalPoint(){
        if (totalPoint == null){
            totalPoint = 0;
        }
        if (lowerLevelSharePoint == null){
            lowerLevelSharePoint = 0;
        }
        if (shopSharePoint == null){
            shopSharePoint = 0;
        }
        if (shopAchievementPoint == null){
            shopAchievementPoint = 0;
        }
        return totalPoint - lowerLevelSharePoint - shopSharePoint - shopAchievementPoint;
    }
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUserBank.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.account.api.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/11/25 14:59
 */
@Data
@ApiModel
@TableName("t_app_user_bank")
public class AppUserBank {
    /**
     * 主键
     */
    @TableId("id")
    @ApiModelProperty(value = "数据id")
    private Long id;
    /**
     * 用户id
     */
    @TableField("app_user_id")
    @ApiModelProperty(value = "用户id")
    private Long appUserId;
    /**
     * 开户银行名称
     */
    @TableField("bank_name")
    @ApiModelProperty(value = "开户银行名称", required = true)
    private String bankName;
    /**
     * 银行卡号
     */
    @TableField("bank_number")
    @ApiModelProperty(value = "银行卡号", required = true)
    private String bankNumber;
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserCancellationLog.java
New file
@@ -0,0 +1,57 @@
package com.ruoyi.account.api.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-21
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_user_cancellation_log")
@ApiModel(value="UserCancellationLog对象", description="")
public class UserCancellationLog implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId("id")
    private Long id;
    @ApiModelProperty(value = "删除标志(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "用户id")
    @TableField("app_user_id")
    private Long appUserId;
    @ApiModelProperty(value = "会员等级")
    @TableField("vip_id")
    private Integer vipId;
    @TableField(exist = false)
    private String userName;
    @TableField(exist = false)
    private String userPhone;
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java
New file
@@ -0,0 +1,111 @@
package com.ruoyi.account.api.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-21
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_user_point")
@ApiModel(value="UserPoint对象", description="")
public class UserPoint implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId("id")
    private Long id;
    @ApiModelProperty(value = "变动类型(1-消费,2-返佣,3-拉新,4-每日分享,5-每日签到,6-使用时长, 7-注册积分, 8-门店业绩," +
            "9-门店返佣,14-下级门店返佣,10-技师业绩,11-兑换商品,12-他人赠送,13-赠与他人,15-兑换券)")
    @Excel(name = "变动类型", readConverterExp = "1=消费积分,2=返佣积分,3=拉新人积分,4=每日分享,5=每日签到,6=使用时长,7=注册积分,8=门店业绩,9=门店返佣,14=下级门店返佣,10=技师业绩,11=兑换商品,12=他人赠送,13=赠与他人,15=兑换券")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "历史余额")
    @TableField("historical_point")
    private Integer historicalPoint;
    @ApiModelProperty(value = "变动金额")
    @TableField("variable_point")
    @Excel(name = "变动金额")
    private Integer variablePoint;
    @ApiModelProperty(value = "变动后余额")
    @TableField("balance")
    private Integer balance;
    @ApiModelProperty(value = "变动时间")
    @TableField("create_time")
    @Excel(name = "变动时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "变动用户id")
    @TableField("app_user_id")
    private Long appUserId;
    @ApiModelProperty(value = "关联对象id")
    @TableField("object_id")
    private Long objectId;
    @ApiModelProperty(value = "拓展字段")
    @TableField("extention")
    private String extention;
    @ApiModelProperty(value = "用户名称")
    @Excel(name = "用户名称")
    @TableField(exist = false)
    private String userName;
    @ApiModelProperty(value = "变动类型 0未变化1增加2减少")
    @TableField(exist = false)
    private Integer variableType;
    @ApiModelProperty(value = "联系电话")
    @Excel(name = "联系电话")
    @TableField(exist = false)
    private String phone;
    @ApiModelProperty(value = "开始时间")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
    @TableField(exist = false)
    private List<Long> userIds;
    @TableField(exist = false)
    private Integer pageNum;
    @TableField(exist = false)
    private Integer pageSize;
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponInfoVo.java
New file
@@ -0,0 +1,127 @@
package com.ruoyi.account.api.vo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_coupon_info")
@ApiModel(value="CouponInfo对象", description="")
public class CouponInfoVo implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "删除标志(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "优惠券名称")
    @TableField("coupon_name")
    private String couponName;
    @ApiModelProperty(value = "优惠券类型 1'满减券',2'代金券',3'折扣券',4'商品券'")
    @TableField("coupon_type")
    private Integer couponType;
    @ApiModelProperty(value = "满x元")
    @TableField("condition_amount")
    private BigDecimal conditionAmount;
    @ApiModelProperty(value = "减x元")
    @TableField("discount_amount")
    private BigDecimal discountAmount;
    @ApiModelProperty(value = "代金x元")
    @TableField("money_amount")
    private BigDecimal moneyAmount;
    @ApiModelProperty(value = "折扣")
    @TableField("discount")
    private BigDecimal discount;
    @ApiModelProperty(value = "适用商品ids,全部-1")
    @TableField("for_good_ids")
    private String forGoodIds;
    @ApiModelProperty(value = "发放数量")
    @TableField("send_num")
    private Integer sendNum;
    @ApiModelProperty(value = "可领数量")
    @TableField("max_num")
    private Integer maxNum;
    @ApiModelProperty(value = "有效期类型 1指定时间内有效 2领取后x天有效")
    @TableField("period_type")
    private Integer periodType;
    @ApiModelProperty(value = "有效期开始时间")
    @TableField("period_start_time")
    private LocalDateTime periodStartTime;
    @ApiModelProperty(value = "有效期结束时间")
    @TableField("period_end_time")
    private LocalDateTime periodEndTime;
    @ApiModelProperty(value = "领取后x天有效")
    @TableField("period_days")
    private Integer periodDays;
    @ApiModelProperty(value = "开始发放时间")
    @TableField("send_start_time")
    private LocalDateTime sendStartTime;
    @ApiModelProperty(value = "结束发放时间")
    @TableField("send_end_time")
    private LocalDateTime sendEndTime;
    @ApiModelProperty(value = "1免费发放2积分兑换")
    @TableField("send_type")
    private Integer sendType;
    @ApiModelProperty(value = "兑换所需积分")
    @TableField("need_point")
    private BigDecimal needPoint;
    @ApiModelProperty(value = "可领用户  1全部 2指定人员 3指定会员 4 新人注册")
    @TableField("person_type")
    private Integer personType;
    @ApiModelProperty(value = "可领取对应的ids,用find_in_set查询")
    @TableField("person_ids")
    private String personIds;
    @ApiModelProperty(value = "商品卷对应的商品名称")
    @TableField(exist = false)
    private List<String> goodNames;
    @ApiModelProperty(value = "其他商品名称")
    private String goodsNameJson;
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/PaymentUserCoupon.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.account.api.vo;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2024/11/29 14:32
 */
@Data
public class PaymentUserCoupon {
    /**
     * 用户id
     */
    private Long userId;
    /**
     * 订单金额
     */
    private BigDecimal orderMoney;
    /**
     * 商品类型(1=服务,2=实体商品)
     */
    private Integer type;
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/PaymentUserCouponVo.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.account.api.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/11/29 16:39
 */
@Data
@ApiModel
public class PaymentUserCouponVo {
    @ApiModelProperty("优惠券id")
    private String id;
    @ApiModelProperty("优惠券名称")
    private String name;
    @ApiModelProperty("优惠券类型 1=满减券,2=代金券,3=折扣券,4=商品券")
    private Integer couponType;
    @ApiModelProperty("满x元")
    private BigDecimal conditionAmount;
    @ApiModelProperty("减x元")
    private BigDecimal discountAmount;
    @ApiModelProperty("代金x元")
    private BigDecimal moneyAmount;
    @ApiModelProperty("折扣")
    private BigDecimal discount;
    @ApiModelProperty("有效期开始时间")
    private String periodStartTime;
    @ApiModelProperty("有效期结束时间")
    private String periodEndTime;
    @ApiModelProperty("适用商品id集合,为null表示全部适用")
    private List<String> forGoodIds;
    @ApiModelProperty("是否可用")
    private Boolean available;
}
ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
New file
@@ -0,0 +1,8 @@
com.ruoyi.account.api.factory.AppUserClientFallbackFactory
com.ruoyi.account.api.factory.UserAddressClientFallbackFactory
com.ruoyi.account.api.factory.UserCouponClientFallbackFactory
com.ruoyi.account.api.factory.UserPointFallbackFactory
com.ruoyi.account.api.factory.BalanceChangeRecordClientFallbackFactory
com.ruoyi.account.api.factory.UserChangeLogFallbackFactory
com.ruoyi.account.api.factory.AppUserShopClientFallbackFactory
com.ruoyi.account.api.factory.AppUserGiveawayTemporaryClientFallbackFactory
ruoyi-api/ruoyi-api-order/pom.xml
New file
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi-api</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-api-order</artifactId>
    <description>
        ruoyi-api-order订单接口模块
    </description>
    <dependencies>
        <!-- RuoYi Common Core-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-core</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-other</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/factory/OrderClientFallbackFactory.java
New file
@@ -0,0 +1,64 @@
package com.ruoyi.order.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.feignClient.OrderClient;
import com.ruoyi.order.model.Order;
import com.ruoyi.order.vo.OrderSaleNum;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
import java.util.Set;
/**
 * @author zhibing.pu
 * @date 2025/1/7 14:38
 */
public class OrderClientFallbackFactory implements FallbackFactory<OrderClient> {
    @Override
    public OrderClient create(Throwable cause) {
        return new OrderClient(){
            @Override
            public R<Integer> getGoodsSaleNum(Integer goodsId, Integer type) {
                return R.fail("获取商品销售数量失败:" + cause.getMessage());
            }
            @Override
            public R<Integer> getShopSaleNum(Integer shopId, Integer type) {
                return R.fail("获取门店销售订单数量失败:" + cause.getMessage());
            }
            @Override
            public R<Integer> getShopSaleNumByShopIds(OrderSaleNum orderSaleNum) {
                return R.fail("获取门店销售订单数量失败:" + cause.getMessage());
            }
            @Override
            public R<Set<Long>> getAppUserByShoppingShop(Integer shopId) {
                return R.fail("获取所有在指定门店消费的用户id失败:" + cause.getMessage());
            }
            @Override
            public R<List<Order>> getRedeemedOrdersByShop(Integer shopId) {
                return R.fail("获取已核销的订单失败:" + cause.getMessage());
            }
            @Override
            public R<Order> getOrderById(Long id) {
                return R.fail("根据id获取订单详情失败:" + cause.getMessage());
            }
            @Override
            public R editOrder(Order order) {
                return R.fail("编辑订单详情失败:" + cause.getMessage());
            }
            @Override
            public R<Long> getOrderCountByAppUserId(Long appUserId) {
                return R.fail("获取用户订单数量失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/factory/RemoteOrderGoodsFallbackFactory.java
New file
@@ -0,0 +1,77 @@
package com.ruoyi.order.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.feignClient.RemoteOrderGoodsClient;
import com.ruoyi.order.vo.Price;
import lombok.extern.slf4j.Slf4j;
import com.ruoyi.order.model.Order;
import com.ruoyi.order.model.OrderGood;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
import java.util.Set;
@Slf4j
public class RemoteOrderGoodsFallbackFactory implements FallbackFactory<RemoteOrderGoodsClient> {
    @Override
    public RemoteOrderGoodsClient create(Throwable cause) {
        return new RemoteOrderGoodsClient(){
            @Override
            public R<List<OrderGood>> goodsOrder(List<Long> goodsIds) {
                log.error("获取订单商品失败:{}", cause.getMessage());
                throw new RuntimeException("获取订单商品失败");
            }
            @Override
            public R<List<Order>> getOrderListByIds(List<Long> orderIds) {
                log.error("获取订单列表失败:{}", cause.getMessage());
                throw new RuntimeException("获取订单列表失败");
            }
            @Override
            public R<List<Order>> getOrderListByUserIdAndGoodsId(Long userId, Integer goodsId) {
                return R.fail("获取订单列表失败");
            }
            @Override
            public R<Void> updateOrderStatus(Order order) {
                return R.fail("更新订单状态失败");
            }
            @Override
            public R<Void> subscribe(Long id, Integer technicianId) {
                return R.fail("预约失败");
            }
            @Override
            public R<Price> getGoodsPrice(Long appUserId, Integer goodsId, Integer shopId) {
                return R.fail("获取商品价格失败");
            }
            @Override
            public R<Order> getLastOrder(Long appUserId) {
                return R.fail("获取订单失败");
            }
            @Override
            public R<List<Order>> byUserId(Long appUserId,Integer shopId) {
                return R.fail();
            }
            @Override
            public R<List<Order>> byShopId(Integer shopId) {
                return R.fail();
            }
            @Override
            public R<List<Order>> byShopIdAndUserId(Long userId,Integer shopId) {
                return R.fail("通过门店和用户id查询订单失败");
            }
            @Override
            public R<List<OrderGood>> getUnDistributedOrder(List<Long> appUserIds) {
                return R.fail("获取未分配订单失败");
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/feignClient/OrderClient.java
New file
@@ -0,0 +1,90 @@
package com.ruoyi.order.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.factory.OrderClientFallbackFactory;
import com.ruoyi.order.model.Order;
import com.ruoyi.order.vo.OrderSaleNum;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Set;
/**
 * @author zhibing.pu
 * @date 2025/1/7 14:37
 */
@FeignClient(contextId = "OrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = OrderClientFallbackFactory.class)
public interface OrderClient {
    /**
     * 获取商品销售数量
     * @param goodsId
     * @param type 购买类型(1=普通商品,2=秒杀商品)
     * @return
     */
    @PostMapping("/order/getGoodsSaleNum")
    R<Integer> getGoodsSaleNum(@RequestParam("goodsId") Integer goodsId, @RequestParam("type") Integer type);
    /**
     * 获取门店销售订单数量
     * @param shopId    门店id
     * @param type      1:服务订单,2:单品订单
     * @return
     */
    @PostMapping("/order/getShopSaleNum")
    R<Integer> getShopSaleNum(@RequestParam("shopId") Integer shopId, @RequestParam("type") Integer type);
    @PostMapping("/order/getShopSaleNumByShopIds")
    R<Integer> getShopSaleNumByShopIds(@RequestBody OrderSaleNum orderSaleNum);
    /**
     * 获取所有在指定门店消费的用户id
     * @param shopId
     * @return
     */
    @PostMapping("/order/getAppUserByShoppingShop")
    R<Set<Long>> getAppUserByShoppingShop(@RequestParam("shopId") Integer shopId);
    /**
     * 获取指定门店的核销订单
     */
    @GetMapping("/order/getRedeemedOrdersByShop")
    R<List<Order>> getRedeemedOrdersByShop(@RequestParam("shopId") Integer shopId);
    /**
     * 根据id获取订单详情
     * @param id
     * @return
     */
    @PostMapping("/order/getOrderById")
    R<Order> getOrderById(@RequestParam("id") Long id);
    /**
     * 编辑订单详情
     * @param order
     * @return
     */
    @PostMapping("/order/editOrder")
    R editOrder(@RequestBody Order order);
    /**
     * 获取用户订单数量
     * @param appUserId
     * @return
     */
    @PostMapping("/order/getOrderCountByAppUserId")
    R<Long> getOrderCountByAppUserId(@RequestParam("id") Long appUserId);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/feignClient/RemoteOrderGoodsClient.java
New file
@@ -0,0 +1,71 @@
package com.ruoyi.order.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.factory.RemoteOrderGoodsFallbackFactory;
import com.ruoyi.order.model.Order;
import com.ruoyi.order.model.OrderGood;
import com.ruoyi.order.vo.Price;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Set;
@FeignClient(contextId = "RemoteOrderGoodsClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteOrderGoodsFallbackFactory.class)
public interface RemoteOrderGoodsClient {
    /**
     * 查询指定商品订单
     */
    @PostMapping("/order-good/selectGoodsOrder")
    R<List<OrderGood>> goodsOrder(@RequestBody List<Long> goodsIds);
    /**
     * 根据ids查找订单列表
     */
    @PostMapping("/order/getOrderListByIds")
    R<List<Order>> getOrderListByIds(@RequestBody List<Long> orderIds);
    @PostMapping("/order/byUserId")
    R<List<Order>> byUserId(@RequestParam("appUserId") Long appUserId,@RequestParam("shopId") Integer shopId);
    @PostMapping("/order/byShopId")
    R<List<Order>> byShopId(@RequestParam("shopId") Integer shopId);
    @PostMapping("/order/byShopIdAndUserId")
    R<List<Order>> byShopIdAndUserId(@RequestParam("appUserId") Long appUserId,@RequestParam("shopId") Integer shopId);
    /**
     * 根据用户id和商品id查找订单列表
     */
    @GetMapping("/order-good/getOrderListByUserIdAndGoodsId")
    R<List<Order>> getOrderListByUserIdAndGoodsId(@RequestParam("userId") Long userId, @RequestParam("goodsId") Integer goodsId);
    /**
     * 更新订单状态
     */
    @PostMapping("/order/updateOrderStatus")
    R<Void> updateOrderStatus(@RequestBody Order order);
    /**
     * 预约技师
     */
    @PostMapping("/order/subscribe")
    R<Void> subscribe(@RequestParam(value = "id", required = false) Long id, @RequestParam(value = "technicianId", required = false) Integer technicianId);
    @GetMapping("/shopping-cart/getGoodsPrice")
    R<Price> getGoodsPrice(@RequestParam("appUserId") Long appUserId, @RequestParam("goodsId") Integer goodsId, @RequestParam("shopId") Integer shopId);
    @PostMapping("/order/getLastOrder")
    R<Order> getLastOrder(@RequestParam("appUserId") Long appUserId);
    @PostMapping("/order-good/getUnDistributedOrder")
    R<List<OrderGood>> getUnDistributedOrder(@RequestBody List<Long> appUserIds);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/Order.java
New file
@@ -0,0 +1,231 @@
package com.ruoyi.order.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-21
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_order")
@ApiModel(value="Order对象", description="")
public class Order implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId("id")
    private Long id;
    @ApiModelProperty(value = "用户id")
    @TableField("app_user_id")
    private Long appUserId;
    @ApiModelProperty(value = "订单类型1服务单2商品")
    @TableField("order_type")
    private Integer orderType;
    @ApiModelProperty(value = "1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价")
    @TableField("order_status")
    private Integer orderStatus;
    @ApiModelProperty(value = "1待发货2待收货3待使用4已完成5已取消6已退款7售后中8已评价")
    @TableField("old_order_status")
    private Integer oldOrderStatus;
    @ApiModelProperty(value = "是否已分佣: 0-否 1-普通已拥,2-门店已分佣")
    @TableField("is_commission")
    private Integer isCommission;
    @ApiModelProperty(value = "核销时间")
    @TableField("end_time")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "核销人id")
    @TableField("canceller_app_user_id")
    private Long cancellerAppUserId;
    @ApiModelProperty(value = "售后截止日期")
    @TableField("after_sale_time")
    private LocalDateTime afterSaleTime;
    @ApiModelProperty(value = "技师id")
    @TableField("technician_id")
    private Integer technicianId;
    @ApiModelProperty(value = "订单编号")
    @TableField("order_number")
    private String orderNumber;
    @ApiModelProperty(value = "商品数量")
    @TableField("num")
    private Integer num;
    @ApiModelProperty(value = "商品封面(多张逗号隔开,最多三张))")
    @TableField("good_pics")
    private String goodPics;
    @ApiModelProperty(value = "商品名称(多个名称逗号隔开))")
    @TableField("good_name")
    private String goodName;
    @ApiModelProperty(value = "订单总金额")
    @TableField("total_amount")
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "满减金额")
    @TableField("full_reduction_amount")
    private BigDecimal fullReductionAmount;
    @ApiModelProperty(value = "代金券抵扣金额")
    @TableField("money_amount")
    private BigDecimal moneyAmount;
    @ApiModelProperty(value = "折扣券抵扣金额")
    @TableField("discount_amount")
    private BigDecimal discountAmount;
    @ApiModelProperty(value = "商品券抵扣总金额")
    @TableField("good_amount")
    private BigDecimal goodAmount;
    @ApiModelProperty(value = "用户优惠券id")
    @TableField("user_coupon_id")
    private Long userCouponId;
    @ApiModelProperty(value = "活动优惠金额")
    @TableField("activity_amount")
    private BigDecimal activityAmount;
    @ApiModelProperty(value = "优惠总金额")
    @TableField("discount_total_amount")
    private BigDecimal discountTotalAmount;
    @ApiModelProperty(value = "实际支付价格")
    @TableField("payment_amount")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "使用积分")
    @TableField("point")
    private Integer point;
    @ApiModelProperty(value = "1微信,2账户余额,3积分")
    @TableField("pay_method")
    private Integer payMethod;
    @ApiModelProperty(value = "使用的优惠劵json")
    @TableField("coupon_json")
    private String couponJson;
    @ApiModelProperty(value = "订单优惠活动的json快照")
    @TableField("activity_json")
    private String activityJson;
    @ApiModelProperty(value = "运费")
    @TableField("express_amount")
    private BigDecimal expressAmount;
    @ApiModelProperty(value = "1微信,2账户余额")
    @TableField("express_pay_method")
    private Integer expressPayMethod;
    @ApiModelProperty(value = "配送方式(1=自提,2=快递)")
    @TableField("distribution_mode")
    private Integer distributionMode;
    @ApiModelProperty(value = "第三方快递信息")
    @TableField("express_json")
    private String expressJson;
    @ApiModelProperty(value = "第三方快递结果")
    @TableField("express_result")
    private String expressResult;
    @ApiModelProperty(value = "发货省")
    @TableField("deliver_province")
    private String deliverProvince;
    @ApiModelProperty(value = "发货省编号")
    @TableField("deliver_province_code")
    private String deliverProvinceCode;
    @ApiModelProperty(value = "发货市")
    @TableField("deliver_city")
    private String deliverCity;
    @ApiModelProperty(value = "发货市编号")
    @TableField("deliver_city_code")
    private String deliverCityCode;
    @ApiModelProperty(value = "发货区")
    @TableField("deliver_district")
    private String deliverDistrict;
    @ApiModelProperty(value = "发货区编号")
    @TableField("deliver_district_code")
    private String deliverDistrictCode;
    @ApiModelProperty(value = "收货地址信息")
    @TableField("address_json")
    private String addressJson;
    @ApiModelProperty(value = "平台分佣")
    @TableField("share_amount")
    private BigDecimal shareAmount;
    @ApiModelProperty(value = "本单获取的积分")
    @TableField("get_point")
    private Integer getPoint;
    @ApiModelProperty(value = "微信支付号")
    @TableField("serial_number")
    private String serialNumber;
    @ApiModelProperty(value = "1待支付2已支付")
    @TableField("pay_status")
    private Integer payStatus;
    @ApiModelProperty(value = "对应门店id")
    @TableField("shop_id")
    private Integer shopId;
    @ApiModelProperty(value = "删除标志(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "预计提货时间")
    @TableField("expected_delivery_time")
    private String expectedDeliveryTime;
    @ApiModelProperty("退款状态(1=退款中,2=已退款)")
    @TableField("refund_status")
    private Integer refundStatus;
    @ApiModelProperty("退款流水号")
    @TableField("refund_code")
    private String refundCode;
    @ApiModelProperty("退款时间")
    @TableField("refund_time")
    private LocalDateTime refundTime;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/model/OrderGood.java
New file
@@ -0,0 +1,131 @@
package com.ruoyi.order.model;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-21
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_order_good")
@ApiModel(value="OrderGood对象", description="")
public class OrderGood implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "商品id")
    @TableField("goods_id")
    private Integer goodsId;
    @ApiModelProperty(value = "订单id")
    @TableField("order_id")
    private Long orderId;
    @ApiModelProperty(value = "商品券优惠金额")
    @TableField("good_amount")
    private BigDecimal goodsCouponAmount;
    @ApiModelProperty(value = "购买商品的json快照")
    @TableField("good_json")
    private String goodJson;
    @ApiModelProperty(value = "秒杀活动json快照")
    @TableField("seckill_json")
    private String seckillJson;
    @ApiModelProperty(value = "数量")
    @TableField("num")
    private Integer num;
    @ApiModelProperty(value = "删除标志(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "可获得消费积分")
    @TableField("earn_spending_points")
    private Integer earnSpendingPoints;
    @ApiModelProperty(value = "上级获得分佣金额")
    @TableField("superior_subcommission")
    private BigDecimal superiorSubcommission;
    @ApiModelProperty(value = "上级获得返佣积分")
    @TableField("superior_rebate_points")
    private Integer superiorRebatePoints;
    @ApiModelProperty(value = "获取返佣积分上级类型(1=直推上级,2=直帮上级)")
    @TableField("superior_type")
    private String superiorType;
    @ApiModelProperty(value = "获取分佣金额上级类型(1=直推上级,2=直帮上级)")
    @TableField("superior_price_type")
    private String superiorPriceType;
    @ApiModelProperty(value = "核销门店可获得服务费")
    @TableField("servuce_shop_charges")
    private BigDecimal servuceShopCharges;
    @ApiModelProperty(value = "核销门店可获得服务积分")
    @TableField("servuce_shop_points")
    private Integer servuceShopPoints;
    @ApiModelProperty(value = "技师可获得服务积分")
    @TableField("technician_points")
    private Integer technicianPoints;
    @ApiModelProperty(value = "绑定门店可获得分佣金额")
    @TableField("bound_shop_charges")
    private BigDecimal boundShopCharges;
    @ApiModelProperty(value = "绑定门店可获得返佣积分")
    @TableField("bound_shop_points")
    private Integer boundShopPoints;
    @ApiModelProperty(value = "绑定门店上级门店可获得分佣金额")
    @TableField("bound_shop_superiors_charges")
    private BigDecimal boundShopSuperiorsCharges;
    @ApiModelProperty(value = "绑定门店上级门店可获得返佣积分")
    @TableField("bound_shop_superiors_points")
    private Integer boundShopSuperiorsPoints;
    @ApiModelProperty("购买类型(1=普通商品,2=秒杀商品)")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "现金支付(0=否,1=是)")
    @TableField("cash_payment")
    private Integer cashPayment;
    @ApiModelProperty(value = "积分支付(0=否,1=是)")
    @TableField("point_payment")
    private Integer pointPayment;
    @ApiModelProperty(value = "基础售价")
    @TableField("selling_price")
    private BigDecimal sellingPrice;
    @ApiModelProperty(value = "基础积分")
    @TableField("integral")
    private Integer integral;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ApplyRefundPass.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/12/6 18:30
 */
@Data
@ApiModel
public class ApplyRefundPass {
    @ApiModelProperty(value = "订单id", required = true)
    private Long id;
    @ApiModelProperty(value = "售后类型(1=退货退款,2=仅退款)", required = true)
    private Integer refundMethod;
    @ApiModelProperty(value = "申请原因", required = true)
    private String refundReason;
    @ApiModelProperty(value = "备注", required = true)
    private String userRemark;
    @ApiModelProperty(value = "图片地址,多个逗号分隔", required = true)
    private String pics;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java
New file
@@ -0,0 +1,81 @@
package com.ruoyi.order.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "ChargingOrderListInfoVO对象",description = "充电时段统计列表查看详情VO")
public class ChargingOrderListInfoVO {
    @ApiModelProperty(value = "订单编号")
    private String code;
    @ApiModelProperty(value = "电站名称")
    private String siteName;
    @ApiModelProperty(value = "电站地址")
    private String siteAddress;
    @ApiModelProperty(value = "终端编号")
    private String gunCode;
    @ApiModelProperty(value = "充电终端名称 桩+枪")
    private String terminalName;
    @ApiModelProperty(value = "结束原因 (0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)")
    private Integer endMode;
    @ApiModelProperty(value = "状态(-1=启动失败,取消订单,0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)")
    private Integer status;
    @ApiModelProperty(value = "开始soc")
    private String startSoc;
    @ApiModelProperty(value = "结束soc")
    private String endSoc;
    @ApiModelProperty(value = "充电电流 度")
    private BigDecimal chargingCapacity;
    @ApiModelProperty(value = "电站id")
    private Integer siteId;
    @ApiModelProperty(value = "充电桩id")
    private Integer chargingPileId;
    @ApiModelProperty(value = "用户id")
    private Long appUserId;
    @ApiModelProperty(value = "用户车辆id")
    private Long appUserCarId;
    @ApiModelProperty(value = "充电枪id")
    private Integer chargingGunId;
    @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    private String orderType;
    @ApiModelProperty(value = "充电时间 秒")
    private String chargingSecond;
    @ApiModelProperty(value = "车牌号")
    private String licensePlate;
    @ApiModelProperty(value = "客户手机号")
    private String phone;
    @ApiModelProperty(value = "充电到账金额")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "累计电费")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "累计服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "充电费用(电费加服务费)")
    private BigDecimal total;
    @ApiModelProperty(value = "实收(电费加服务费)-优惠券抵扣 -会员抵扣 - 第三方平台分佣 -平台手续费")
    private BigDecimal realTotal;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "订单id")
    private Long id;
    @ApiModelProperty(value = "订单uid")
    private String uid;
    @ApiModelProperty(value = "费用明细-优惠券优惠金额")
    private BigDecimal couponDiscountAmount;
    @ApiModelProperty(value = "费用明细-会员优惠金额")
    private BigDecimal vipDiscountAmount;
    @ApiModelProperty(value = "费用明细-平台分佣")
    private BigDecimal sharingAmount;
    @ApiModelProperty(value = "费用明细-手续费")
    private BigDecimal commissionAmount;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ConfirmOrder.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/11/25 12:12
 */
@Data
@ApiModel
public class ConfirmOrder {
    @ApiModelProperty(value = "购买方式(1=购物车,2=商品详情)", required = true)
    private Integer position;
    @ApiModelProperty(value = "购物车数据id,数量 JSON[{id:1212,num:2,type:1}]", required = true, notes = "type值取值范围(1=普通商品,2=秒杀商品)")
    private String goodsJson;
    @ApiModelProperty(value = "支付方式(1=现金,2=积分)", required = true)
    private Integer paymentType;
    @ApiModelProperty(value = "核销门店id", required = true)
    private Integer shopId;
    @ApiModelProperty(value = "商品类型(1=服务商品,2=单品商品)", required = true)
    private Integer type;
    @ApiModelProperty("优惠券id")
    private Long couponId;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ConfirmOrderVo.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.order.vo;
import com.ruoyi.account.api.vo.PaymentUserCouponVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/11/25 14:05
 */
@Data
@ApiModel
public class ConfirmOrderVo {
    @ApiModelProperty("商品列表")
    private List<MyShoppingCartVo> goodsList;
    @ApiModelProperty("核销门店")
    private String shopName;
    @ApiModelProperty("核销门店id")
    private Integer shopId;
    @ApiModelProperty("订单金额")
    private BigDecimal orderMoney;
    @ApiModelProperty("优惠活动")
    private String activityName;
    @ApiModelProperty("优惠金额")
    private BigDecimal discountAmount;
    @ApiModelProperty("获得积分")
    private Integer earnPoint;
    @ApiModelProperty("支付金额")
    private BigDecimal payMoney;
    @ApiModelProperty("订单总积分")
    private Integer orderPoint;
    @ApiModelProperty("剩余积分")
    private Integer residualPoint;
    @ApiModelProperty("快递费")
    private BigDecimal expressFee;
    @ApiModelProperty("支付方式(1=现金,2=积分)")
    private Integer paymentType;
    @ApiModelProperty("活动是否可以和优惠券同时使用")
    private Boolean useSimultaneously;
    @ApiModelProperty("优惠券列表")
    private List<PaymentUserCouponVo> coupon;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/EndOfChargePageInfo.java
New file
@@ -0,0 +1,40 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2024/10/12 9:20
 */
@Data
@ApiModel
public class EndOfChargePageInfo {
    @ApiModelProperty("订单id")
    private String id;
    @ApiModelProperty("充电金额")
    private BigDecimal paymentAmount;
    @ApiModelProperty("优惠金额")
    private BigDecimal couponDiscountAmount;
    @ApiModelProperty("积分")
    private Integer integral;
    @ApiModelProperty("订单编号")
    private String code;
    @ApiModelProperty("预充金额")
    private BigDecimal rechargeAmount;
    @ApiModelProperty("退还金额")
    private BigDecimal refundAmount;
    @ApiModelProperty("开始日期")
    private String startDay;
    @ApiModelProperty("开始时间")
    private String startHour;
    @ApiModelProperty("结束日期")
    private String endDay;
    @ApiModelProperty("结束时间")
    private String endHour;
    @ApiModelProperty("充电时长")
    private String duration;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/MyShoppingCartVo.java
New file
@@ -0,0 +1,96 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2024/11/25 11:51
 */
@Data
@ApiModel("购物车")
public class MyShoppingCartVo {
    @ApiModelProperty("数据id")
    private String id;
    @ApiModelProperty("购买类型(1=普通商品,2=秒杀商品)")
    private Integer type;
    @ApiModelProperty("商品id")
    private Integer goodsId;
    @ApiModelProperty("封面图")
    private String homePicture;
    @ApiModelProperty("商品名称")
    private String name;
    @ApiModelProperty("售价现金")
    private BigDecimal cash;
    @ApiModelProperty("售价积分")
    private Integer point;
    @ApiModelProperty("原价")
    private String originalPrice;
    @ApiModelProperty("购买数量")
    private Integer number;
    @ApiModelProperty("结束时间")
    private Long endTime;
    @ApiModelProperty("是否可核销(0=否,1=是)")
    private Boolean verifiable;
    @ApiModelProperty("是否超出限购数量")
    private Boolean purchaseLimit;
    @ApiModelProperty("限购数量")
    private Integer purchaseLimitNum;
    @ApiModelProperty("现金支付")
    private Boolean cashPayment;
    @ApiModelProperty("积分支付")
    private Boolean pointPayment;
    @ApiModelProperty("配送方式(1=自提,2=快递)")
    private String distributionMode;
    /**
     * 可获得消费积分
     */
    private Integer earnSpendingPoints;
    /**
     * 上级获得分佣金额
     */
    private BigDecimal superiorSubcommission;
    /**
     * 上级获得返佣积分
     */
    private Integer superiorRebatePoints;
    /**
     * 获取返佣积分上级类型(1=直推上级,2=直帮上级)
     */
    private String superiorType;
    /**
     * 获取返佣积分上级类型(1=直推上级,2=直帮上级)
     */
    private String superiorPriceType;
    /**
     * 核销门店可获得服务费
     */
    private BigDecimal servuceShopCharges;
    /**
     * 核销门店可获得服务积分
     */
    private Integer servuceShopPoints;
    /**
     * 技师可获得服务积分
     */
    private Integer technicianPoints;
    /**
     * 绑定门店可获得分佣金额
     */
    private BigDecimal boundShopCharges;
    /**
     * 绑定门店可获得返佣积分
     */
    private Integer boundShopPoints;
    /**
     * 绑定门店上级门店可获得分佣金额
     */
    private BigDecimal boundShopSuperiorsCharges;
    /**
     * 绑定门店上级门店可获得返佣积分
     */
    private Integer boundShopSuperiorsPoints;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderDetailVO.java
New file
@@ -0,0 +1,98 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "订单明细")
public class OrderDetailVO {
    @ApiModelProperty(value = "订单id")
    private Long id;
    @ApiModelProperty(value = "订单状态")
    private Integer orderStatus;
    @ApiModelProperty(value = "订单商品")
    private List<OrderGoodsVO> goodsList;
    @ApiModelProperty(value = "使用积分")
    private Integer point;
    @ApiModelProperty(value = "收货地址id")
    private Long addressId;
    @ApiModelProperty(value = "收货联系人")
    private String recieveName;
    @ApiModelProperty(value = "收货联系电话")
    private String recievePhone;
    @ApiModelProperty(value = "收货地址")
    private String recieveAddress;
    @ApiModelProperty(value = "订单编号")
    private String orderNumber;
    @ApiModelProperty("下单时间")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "订单总金额")
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "优惠券名称")
    private String couponName;
    @ApiModelProperty(value = "参与活动名称")
    private String activityName;
    @ApiModelProperty(value = "抵扣金额")
    private BigDecimal couponAmount;
    @ApiModelProperty(value = "快递费")
    private BigDecimal expressAmount;
    @ApiModelProperty(value = "可获得积分")
    private Integer pointAmount;
    @ApiModelProperty(value = "实际支付价格")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "配送方式(1=自提,2=快递)")
    private Integer distributionMode;
    @ApiModelProperty(value = "门店名称")
    private String shopName;
    @ApiModelProperty(value = "门店地址")
    private String shopAddress;
    @ApiModelProperty(value = "经度")
    private String longitude;
    @ApiModelProperty(value = "纬度")
    private String latitude;
    @ApiModelProperty(value = "门店id")
    private Integer shopId;
    @ApiModelProperty(value = "技师名称")
    private String technicianName;
    @ApiModelProperty(value = "技师id")
    private Integer technicianId;
    @ApiModelProperty(value = "预约单id")
    private String technicianSubscribeId;
    @ApiModelProperty("核销码BASE64")
    private String writeOffCode;
    @ApiModelProperty("最新快递信息")
    private String express;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderGoodsVO.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "订单商品")
public class OrderGoodsVO {
    @ApiModelProperty(value = "商品id")
    private Integer goodsId;
    @ApiModelProperty(value = "商品名称")
    private String goodsName;
    @ApiModelProperty(value = "类型(1=服务商品,2=单品商品)")
    private Integer type;
    @ApiModelProperty(value = "数量")
    private Integer num;
    @ApiModelProperty(value = "商品图片")
    private String goodsPic;
    @ApiModelProperty(value = "基础售价")
    private BigDecimal sellingPrice;
    @ApiModelProperty(value = "积分")
    private Integer integral;
    @ApiModelProperty(value = "划线价")
    private BigDecimal originalPrice;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderSaleNum.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.vo;
import lombok.Data;
import java.util.List;
@Data
public class OrderSaleNum {
    private List<Integer> shopIds;
    private Integer type;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/OrderVO.java
New file
@@ -0,0 +1,38 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class OrderVO {
    @ApiModelProperty(value = "订单id")
    private String id;
    @ApiModelProperty(value = "订单编号")
    private String orderNumber;
    @ApiModelProperty(value = "1待发货2待收货3待使用4已完成待评论5已取消6已退款7售后中8已完成已评论")
    private Integer orderStatus;
    @ApiModelProperty(value = "商品封面(多张逗号隔开,最多三张))")
    private String goodPics;
    @ApiModelProperty(value = "商品名称(多个名称逗号隔开))")
    private String goodName;
    @ApiModelProperty(value = "商品数量")
    private Integer num;
    @ApiModelProperty(value = "使用积分")
    private BigDecimal point;
    @ApiModelProperty(value = "实际支付价格")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "快递费")
    private BigDecimal expressAmount;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/Price.java
New file
@@ -0,0 +1,77 @@
package com.ruoyi.order.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Price {
    /**
     * 现金
     */
    private BigDecimal cash;
    /**
     * 积分
     */
    private Integer point;
    /**
     * 获取结束时间
     */
    private Long endTime;
    /**
     * 现金支付
     */
    private Boolean cashPayment;
    /**
     * 积分支付
     */
    private Boolean pointPayment;
    /**
     * 可获得消费积分
     */
    private Integer earnSpendingPoints;
    /**
     * 上级获得分佣金额
     */
    private BigDecimal superiorSubcommission;
    /**
     * 上级获得返佣积分
     */
    private Integer superiorRebatePoints;
    /**
     * 获取返佣积分上级类型(1=直推上级,2=直帮上级)
     */
    private String superiorType;
    /**
     * 获取分佣金额上级类型(1=直推上级,2=直帮上级)
     */
    private String superiorPriceType;
    /**
     * 核销门店可获得服务费
     */
    private BigDecimal servuceShopCharges;
    /**
     * 核销门店可获得服务积分
     */
    private Integer servuceShopPoints;
    /**
     * 技师可获得服务积分
     */
    private Integer technicianPoints;
    /**
     * 绑定门店可获得分佣金额
     */
    private BigDecimal boundShopCharges;
    /**
     * 绑定门店可获得返佣积分
     */
    private Integer boundShopPoints;
    /**
     * 绑定门店上级门店可获得分佣金额
     */
    private BigDecimal boundShopSuperiorsCharges;
    /**
     * 绑定门店上级门店可获得返佣积分
     */
    private Integer boundShopSuperiorsPoints;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ReplyEvaluationVO.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.order.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/10/10 11:40
 */
@Data
public class ReplyEvaluationVO {
    private Long id;
    private String reply;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/SetGoodsNumber.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/11/25 12:04
 */
@Data
@ApiModel
public class SetGoodsNumber {
    @ApiModelProperty(value = "购物车数据id", required = true)
    private Long id;
    @ApiModelProperty(value = "修改数量", required = true)
    private Integer number;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/ShoppingCartPayment.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/11/25 14:33
 */
@Data
@ApiModel
public class ShoppingCartPayment {
    @ApiModelProperty(value = "购物车数据id,数量 JSON[{id:1212,num:2,type:1}]", required = true)
    private String goodsJson;
    @ApiModelProperty(value = "支付方式(1=微信,2=账户余额,3=积分)", required = true)
    private Integer paymentType;
    @ApiModelProperty(value = "运费支付方式(1=微信,2=账户余额)", required = true)
    private Integer freightPaymentType;
    @ApiModelProperty(value = "核销门店id", required = true)
    private Integer shopId;
    @ApiModelProperty(value = "优惠券id", required = false)
    private Long userCouponId;
    @ApiModelProperty(value = "配送方式(1=自提,2=快递)", required = false)
    private Integer distributionMode;
    @ApiModelProperty(value = "配送地址id", required = false)
    private Long userAddressId;
    @ApiModelProperty(value = "预计提货时间", required = false)
    private String expectedDeliveryTime;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/vo/VerifiableShopVo.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/11/25 12:08
 */
@Data
@ApiModel
public class VerifiableShopVo {
    @ApiModelProperty("门店id")
    private Integer id;
    @ApiModelProperty("门店名称")
    private String name;
    @ApiModelProperty("距离")
    private Long distance;
    @ApiModelProperty("地址")
    private String address;
    @ApiModelProperty("图片")
    private String homePicture;
}
ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
New file
@@ -0,0 +1,2 @@
com.ruoyi.order.factory.RemoteOrderGoodsFallbackFactory
com.ruoyi.order.factory.OrderClientFallbackFactory
ruoyi-api/ruoyi-api-other/pom.xml
New file
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi-api</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-api-other</artifactId>
    <description>
        ruoyi-api-other基础接口模块
    </description>
    <dependencies>
        <!-- RuoYi Common Core-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-core</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-account</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Agreement.java
New file
@@ -0,0 +1,48 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_agreement")
@ApiModel(value="Agreement对象", description="")
public class Agreement implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "类型(1=用户协议,2=隐私协议,3=技师上门免责声明,4=注销协议,5门店提现免责声明)")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "内容")
    @TableField("content")
    private String content;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Banner.java
New file
@@ -0,0 +1,69 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_banner")
@ApiModel(value="Banner对象", description="")
public class Banner implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "位置(1=首页,2=商城首页)")
    @TableField("position")
    private Integer position;
    @ApiModelProperty(value = "名称")
    @TableField("name")
    private String name;
    @ApiModelProperty(value = "1图片2视频")
    @TableField("content_type")
    private Integer contentType;
    @ApiModelProperty(value = "跳转类型(1=无跳转,2=外部链接,3=商品详情,4=秒杀商品详情,5=领券中心)")
    @TableField("jump_type")
    private Integer jumpType;
    @ApiModelProperty(value = "跳转内容")
    @TableField("content")
    private String content;
    @ApiModelProperty(value = "图片地址")
    @TableField("image_url")
    private String imageUrl;
    @ApiModelProperty(value = "视频地址")
    @TableField("video_url")
    private String videoUrl;
    @ApiModelProperty(value = "删除标识(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/BaseSetting.java
New file
@@ -0,0 +1,45 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_base_setting")
@ApiModel(value="BaseSetting对象", description="")
public class BaseSetting implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "1:合伙人积分设置一    2:合伙人积分设置二    3:会员说明设置    4:活动管理-活动设置 1开0关  5:售后设置 6:充值设置")
    @TableId("id")
    private Integer id;
    @ApiModelProperty(value = "内容")
    @TableField("content")
    private String content;
    @ApiModelProperty("是否可提现(0=否,1=是)")
    private Integer withdraw;
    @ApiModelProperty("最低提现金额")
    @TableField("withdrawalMinAmount")
    private BigDecimal withdrawalMinAmount;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Goods.java
New file
@@ -0,0 +1,166 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_goods")
@ApiModel(value="Goods对象", description="")
public class Goods extends BasePage implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "名称")
    @TableField("name")
    private String name;
    @ApiModelProperty(value = "分类id")
    @TableField("goods_category_id")
    private Integer goodsCategoryId;
    @ApiModelProperty(value = "类型(1=服务商品,2=单品商品)")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "限购数量(-1不限购)")
    @TableField("purchase_limit")
    private Integer purchaseLimit;
    @ApiModelProperty(value = "配送方式(1=自提,2=快递)")
    @TableField("distribution_mode")
    private String distributionMode;
    @ApiModelProperty(value = "指定门店(1=指定,2=所有)")
    @TableField("appoint_store")
    private Integer appointStore;
    @ApiModelProperty(value = "商品简介")
    @TableField("introduction")
    private String introduction;
    @ApiModelProperty(value = "封面图")
    @TableField("home_page_picture")
    private String homePagePicture;
    @ApiModelProperty(value = "详情图,多个逗号分隔")
    @TableField("detail_picture")
    private String detailPicture;
    @ApiModelProperty(value = "商品详情")
    @TableField("detail")
    private String detail;
    @ApiModelProperty(value = "运营成本")
    @TableField("operating_cost")
    private BigDecimal operatingCost;
    @ApiModelProperty(value = "门店成本")
    @TableField("shop_cost")
    private BigDecimal shopCost;
    @ApiModelProperty(value = "划线价")
    @TableField("original_price")
    private BigDecimal originalPrice;
    @ApiModelProperty(value = "现金支付(0=否,1=是)")
    @TableField("cash_payment")
    private Integer cashPayment;
    @ApiModelProperty(value = "积分支付(0=否,1=是)")
    @TableField("point_payment")
    private Integer pointPayment;
    @ApiModelProperty(value = "基础售价")
    @TableField("selling_price")
    private BigDecimal sellingPrice;
    @ApiModelProperty(value = "基础积分")
    @TableField("integral")
    private Integer integral;
    @ApiModelProperty(value = "销量")
    @TableField("sale_num")
    private Integer saleNum;
    @ApiModelProperty(value = "商品权限 逗号分隔(-1=全部,0=游客,1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)")
    @TableField("commodity_authority")
    private String commodityAuthority;
    @ApiModelProperty(value = "删除(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "状态(1=下架,2=上架)")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "排序")
    @TableField("sort")
    private Integer sort;
    @TableField(exist = false)
    private Integer vipId;
    @TableField(exist = false)
    @ApiModelProperty(value = "指定门店")
    private List<GoodsShop> goodsShopList;
    @TableField(exist = false)
    private String categoryName;
    @TableField(exist = false)
    private Integer showStatus;
    @TableField(exist = false)
    private String payMethod;
    /**
     * 排序字段
     */
    @TableField(exist = false)
    private String orderByColumn;
    /**
     * 排序方式
     */
    @TableField(exist = false)
    private String isAsc;
    @TableField(exist = false)
    private Integer pageNum;
    @TableField(exist = false)
    private Integer pageSize;
    public String getIdStr() {
        return String.valueOf(id);
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsCategory.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_goods_category")
@ApiModel(value="GoodsCategory对象", description="")
public class GoodsCategory implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "名称")
    @TableField("name")
    private String name;
    @ApiModelProperty(value = "icon图片地址")
    @TableField("icon")
    private String icon;
    @ApiModelProperty(value = "删除(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsSeckill.java
New file
@@ -0,0 +1,112 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_goods_seckill")
@ApiModel(value="GoodsSeckill对象", description="")
public class GoodsSeckill implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "秒杀活动主表")
    @TableField("seckill_activity_info_id")
    private Integer seckillActivityInfoId;
    @ApiModelProperty(value = "会员级别(1=普通会员,2=黄金会员,3=钻石会员,4=准代理,5=代理,6=总代,7=合伙人)")
    @TableField("vip")
    private Integer vip;
    @ApiModelProperty(value = "现金支付(0=否,1=是)")
    @TableField("cash_payment")
    private Integer cashPayment;
    @ApiModelProperty(value = "积分支付(0=否,1=是)")
    @TableField("point_payment")
    private Integer pointPayment;
    @ApiModelProperty(value = "基础售价")
    @TableField("selling_price")
    private BigDecimal sellingPrice;
    @ApiModelProperty(value = "基础积分")
    @TableField("integral")
    private Integer integral;
    @ApiModelProperty(value = "可获得消费积分")
    @TableField("earn_spending_points")
    private Integer earnSpendingPoints;
    @ApiModelProperty(value = "上级获得分佣金额")
    @TableField("superior_subcommission")
    private BigDecimal superiorSubcommission;
    @ApiModelProperty(value = "上级获得返佣积分")
    @TableField("superior_rebate_points")
    private Integer superiorRebatePoints;
    @ApiModelProperty(value = "获取返佣积分上级类型(1=直推上级,2=直帮上级)")
    @TableField("superior_type")
    private String superiorType;
    @ApiModelProperty(value = "获取分佣金额上级类型(1=直推上级,2=直帮上级)")
    @TableField("superior_price_type")
    private String superiorPriceType;
    @ApiModelProperty(value = "核销门店可获得服务费")
    @TableField("servuce_shop_charges")
    private BigDecimal servuceShopCharges;
    @ApiModelProperty(value = "核销门店可获得服务积分")
    @TableField("servuce_shop_points")
    private Integer servuceShopPoints;
    @ApiModelProperty(value = "技师可获得服务积分")
    @TableField("technician_points")
    private Integer technicianPoints;
    @ApiModelProperty(value = "绑定门店可获得分佣金额")
    @TableField("bound_shop_charges")
    private BigDecimal boundShopCharges;
    @ApiModelProperty(value = "绑定门店可获得返佣积分")
    @TableField("bound_shop_points")
    private Integer boundShopPoints;
    @ApiModelProperty(value = "绑定门店上级门店可获得分佣金额")
    @TableField("bound_shop_superiors_charges")
    private BigDecimal boundShopSuperiorsCharges;
    @ApiModelProperty(value = "绑定门店上级门店可获得返佣积分")
    @TableField("bound_shop_superiors_points")
    private Integer boundShopSuperiorsPoints;
    @ApiModelProperty(value = "活动结束时间")
    @TableField(exist = false)
    private Long endTime;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsShop.java
New file
@@ -0,0 +1,62 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_goods_shop")
@ApiModel(value="指定门店对象", description="")
public class GoodsShop implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId("id")
    private Long id;
    @ApiModelProperty(value = "商品id")
    @TableField("goods_id")
    private Integer goodsId;
    @ApiModelProperty(value = "门店id")
    @TableField("shop_id")
    private Integer shopId;
    @ApiModelProperty(value = "门店名称")
    @TableField(exist = false)
    private String shopName;
    @ApiModelProperty(value = "店长名称")
    @TableField(exist = false)
    private String ownerName;
    @ApiModelProperty(value = "联系电话")
    @TableField(exist = false)
    private String phone;
    @ApiModelProperty(value = "门店地址")
    @TableField(exist = false)
    private String address;
    public String getIdStr(){
        return String.valueOf(id);
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Phone.java
New file
@@ -0,0 +1,51 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_phone")
@ApiModel(value="Phone对象", description="")
public class Phone implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "类型(1=平台,2=门店)")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "门店id")
    @TableField("shop_id")
    private Integer shopId;
    @ApiModelProperty(value = "联系电话1")
    @TableField("phone_one")
    private String phoneOne;
    @ApiModelProperty(value = "联系电话2")
    @TableField("phone_two")
    private String phoneTwo;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/PointSetting.java
New file
@@ -0,0 +1,158 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_point_setting")
@ApiModel(value="PointSetting对象", description="")
public class PointSetting implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "1-7对应会员等级")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "删除标志(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "拉新人积分")
    @TableField("new_point")
    private Integer newPoint;
    @ApiModelProperty(value = "每日分享积分")
    @TableField("every_share_point")
    private Integer everySharePoint;
    @ApiModelProperty(value = "每日签到积分")
    @TableField("sign_point")
    private Integer signPoint;
    @ApiModelProperty(value = "使用一小时积分")
    @TableField("hour_point")
    private Integer hourPoint;
    @ApiModelProperty(value = "注册积分")
    @TableField("regis_point")
    private Integer regisPoint;
    @ApiModelProperty(value = "消费积分")
    @TableField("buy_point")
    private BigDecimal buyPoint;
    @ApiModelProperty(value = "消费积分积分 1开0关")
    @TableField("buy_point_open")
    private Integer buyPointOpen;
    @ApiModelProperty(value = "消费积分转赠送 1开0关")
    @TableField("buy_point_gift")
    private Integer buyPointGift;
    @ApiModelProperty(value = "返佣积分")
    @TableField("share_point")
    private BigDecimal sharePoint;
    @ApiModelProperty(value = "返佣积分 1开0关")
    @TableField("share_point_open")
    private Integer sharePointOpen;
    @ApiModelProperty(value = "返佣积分转赠送 1开0关")
    @TableField("share_point_gift")
    private Integer sharePointGift;
    @ApiModelProperty(value = "门店返佣积分")
    @TableField("shop_share_point")
    private BigDecimal shopSharePoint;
    @ApiModelProperty(value = "门店返佣积分 1开0关")
    @TableField("shop_share_point_open")
    private Integer shopSharePointOpen;
    @ApiModelProperty(value = "门店返佣积分赠送 1开0关")
    @TableField("shop_share_point_gift")
    private Integer shopSharePointGift;
    @ApiModelProperty(value = "门店业绩积分")
    @TableField("shop_point")
    private BigDecimal shopPoint;
    @ApiModelProperty(value = "门店业绩积分 1开0关")
    @TableField("shop_point_open")
    private Integer shopPointOpen;
    @ApiModelProperty(value = "门店业绩积分转赠送 1开0关")
    @TableField("shop_point_gift")
    private Integer shopPointGift;
    @ApiModelProperty(value = "技师业绩积分")
    @TableField("person_point")
    private BigDecimal personPoint;
    @ApiModelProperty(value = "技师业绩积分 1开0关")
    @TableField("person_point_open")
    private Integer personPointOpen;
    @ApiModelProperty(value = "技师积分转赠送 1开0关")
    @TableField("person_point_gift")
    private Integer personPointGift;
    @ApiModelProperty(value = "拉新人积分")
    @TableField("get_new_point")
    private BigDecimal getNewPoint;
    @ApiModelProperty(value = "拉新人积分 1开0关")
    @TableField("get_new_point_open")
    private Integer getNewPointOpen;
    @ApiModelProperty(value = "拉新人积分转赠送 1开0关")
    @TableField("get_new_point_gift")
    private Integer getNewPointGift;
    @ApiModelProperty(value = "注册积分")
    @TableField("get_regis_point")
    private BigDecimal getRegisPoint;
    @ApiModelProperty(value = "注册积分 1开0关")
    @TableField("get_regis_point_open")
    private Integer getRegisPointOpen;
    @ApiModelProperty(value = "注册积分转赠送 1开0关")
    @TableField("get_regis_point_gift")
    private Integer getRegisPointGift;
    @ApiModelProperty(value = "做工积分")
    @TableField("work_point")
    private BigDecimal workPoint;
    @ApiModelProperty(value = "做工积分 1开0关")
    @TableField("work_point_open")
    private Integer workPointOpen;
    @ApiModelProperty(value = "做工积分转赠送 1开0关")
    @TableField("work_point_gift")
    private Integer workPointGift;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/ReceiverBankChannel.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
 * @author zhibing.pu
 * @date 2025/1/10 18:43
 */
@Data
@TableName("t_receiver_bank_channel")
public class ReceiverBankChannel {
    /**
     * 主键
     */
    @TableField("id")
    private Long id;
    /**
     * 银行名称
     */
    @TableField("name")
    private String name;
    /**
     * 银行简称
     */
    @TableField("short")
    private String shortName;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Region.java
New file
@@ -0,0 +1,36 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_region")
@ApiModel(value="Region对象", description="")
public class Region implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    private String code;
    private String citycode;
    private Long parentId;
    private String english;
    @TableField(exist = false)
    private List<Region> childs;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/SeckillActivityInfo.java
New file
@@ -0,0 +1,78 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_seckill_activity_info")
@ApiModel(value="SeckillActivityInfo对象", description="")
public class SeckillActivityInfo implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "删除标志(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "商品id")
    @TableField("good_id")
    private Integer goodId;
    @ApiModelProperty(value = "限购数量")
    @TableField("max_num")
    private Integer maxNum;
    @ApiModelProperty(value = "适用会员类型")
    @TableField("vip_ids")
    private String vipIds;
    @ApiModelProperty(value = "活动开始日期")
    @TableField("start_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "活动结束日期")
    @TableField("end_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "是否上架:0否 1是")
    @TableField("is_shelves")
    private Integer isShelves;
    private List<GoodsSeckill> goodsSeckills;
    @TableField(exist = false)
    private Goods goods;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Shop.java
New file
@@ -0,0 +1,230 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_shop")
@ApiModel(value="Shop对象", description="")
public class Shop implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "门店名称")
    @TableField("name")
    private String name;
    @ApiModelProperty(value = "上级门店id")
    @TableField("pid")
    private Integer pid;
    @ApiModelProperty(value = "营业星期:1-周一到周日 2-周一周五 3-仅周末")
    @TableField("business_date")
    private Integer businessDate;
    @ApiModelProperty(value = "开始时间(HH:mm)")
    @TableField("start_time")
    private String startTime;
    @ApiModelProperty(value = "结束时间(HH:mm)")
    @TableField("end_time")
    private String endTime;
    @ApiModelProperty(value = "封面图片")
    @TableField("home_picture")
    private String homePicture;
    @ApiModelProperty(value = "详情图,多个逗号分隔")
    @TableField("details_picture")
    private String detailsPicture;
    @ApiModelProperty(value = "店长姓名")
    @TableField("shop_manager")
    private String shopManager;
    @ApiModelProperty(value = "电话")
    @TableField("phone")
    private String phone;
    @ApiModelProperty(value = "店长用户id")
    @TableField("app_user_id")
    private Long appUserId;
    @ApiModelProperty(value = "客户电话(同步到t_phone表)")
    @TableField("service_tel")
    private String serviceTel;
    @ApiModelProperty(value = "资质证书图片")
    @TableField("certification")
    private String certification;
    @ApiModelProperty(value = "经度")
    @TableField("longitude")
    private String longitude;
    @ApiModelProperty(value = "纬度")
    @TableField("latitude")
    private String latitude;
    @ApiModelProperty(value = "详细地址")
    @TableField("address")
    private String address;
    @ApiModelProperty(value = "状态(1=正常,2=冻结)")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "门店积分总数")
    @TableField("shop_all_point")
    private Integer shopAllPoint;
    @ApiModelProperty(value = "绑定下级门店分佣积分")
    @TableField("lower_level_share_point")
    private Integer lowerLevelSharePoint;
    @ApiModelProperty(value = "门店返佣积分")
    @TableField("share_point")
    private Integer sharePoint;
    @ApiModelProperty(value = "门店服务积分")
    @TableField("server_point")
    private Integer serverPoint;
    @ApiModelProperty(value = "门店已用积分")
    @TableField("use_point")
    private Integer usePoint;
    @ApiModelProperty(value = "门店剩余积分")
    @TableField("lave_point")
    private Integer lavePoint;
    @TableField(exist = false)
    private Integer laveUsePoint;
    @ApiModelProperty(value = "门店分佣总金额")
    @TableField("giveaway_all_money")
    private BigDecimal giveawayAllMoney;
    @ApiModelProperty(value = "门店分佣金额")
    @TableField("giveaway_money")
    private BigDecimal giveawayMoney;
    @ApiModelProperty(value = "绑定下级门店分佣金额")
    @TableField("lower_level_giveaway_money")
    private BigDecimal lowerLevelGiveawayMoney;
    @ApiModelProperty(value = "门店服务分佣金额")
    @TableField("server_giveaway_money")
    private BigDecimal serverGiveawayMoney;
    @ApiModelProperty(value = "可提现金额")
    @TableField("can_withdraw_money")
    private BigDecimal canWithdrawMoney;
    @ApiModelProperty(value = "已提现金额")
    @TableField("withdraw_money")
    private BigDecimal withdrawMoney;
    @ApiModelProperty(value = "审核中金额")
    @TableField(exist = false)
    private BigDecimal withdrawAuditMoney;
    @ApiModelProperty(value = "余额")
    @TableField("balance")
    private BigDecimal balance;
    @ApiModelProperty(value = "门店订单总数")
    @TableField("order_number")
    private Integer orderNumber;
    @ApiModelProperty(value = "门店服务订单数")
    @TableField("server_order_number")
    private Integer serverOrderNumber;
    @ApiModelProperty(value = "单品自提订单数")
    @TableField("custom_order_number")
    private Integer customOrderNumber;
    @ApiModelProperty(value = "删除(0=否,1=是)")
    @TableField("del_flag")
    private Integer delFlag;
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty("报备商户号")
    @TableField("tradeMerchantNo")
    private String tradeMerchantNo;
    @ApiModelProperty("收款银行卡号")
    @TableField("receiverAccountNoEnc")
    private String receiverAccountNoEnc;
    @ApiModelProperty("收款银行卡持卡人名称")
    @TableField("receiverNameEnc")
    private String receiverNameEnc;
    @ApiModelProperty("账户类型(对私账户201,对公账户204)")
    @TableField("receiverAccountType")
    private Integer receiverAccountType;
    @ApiModelProperty("收款账户联行号")
    @TableField("receiverBankChannelNo")
    private String receiverBankChannelNo;
    @ApiModelProperty(value = "省")
    @TableField("province")
    private String province;
    @ApiModelProperty(value = "省编号")
    @TableField("province_code")
    private String provinceCode;
    @ApiModelProperty(value = "市")
    @TableField("city")
    private String city;
    @ApiModelProperty(value = "市编号")
    @TableField("city_code")
    private String cityCode;
    @ApiModelProperty(value = "区")
    @TableField("district")
    private String district;
    @ApiModelProperty(value = "区编号")
    @TableField("district_code")
    private String districtCode;
    @TableField(exist = false)
    private Double distance;
    @TableField(exist = false)
    private Double score;
    @ApiModelProperty(value = "自己打分")
    @TableField(exist = false)
    private String myScore;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/SystemConfig.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.other.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-11-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_system_config")
@ApiModel(value="SystemConfig对象", description="")
public class SystemConfig implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "主键")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "类型(1=启动页管理,2=首页配置,3=订单包邮设置)")
    @TableField("type")
    private Integer type;
    @ApiModelProperty(value = "配置内容json")
    @TableField("content")
    private String content;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/IndexConfigSetDto.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.other.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class IndexConfigSetDto {
    @ApiModelProperty("公司理念")
    private String companyWant;
    @ApiModelProperty("宣传图片1")
    private String pic1;
    @ApiModelProperty("跳转类型1 - 1无2外部链接3商品详情4秒杀商品详情5领卷中心")
    private Integer direct1;
    @ApiModelProperty("跳转内容1")
    private String content1;
    @ApiModelProperty("宣传图片2")
    private String pic2;
    @ApiModelProperty("跳转内容2")
    private String content2;
    @ApiModelProperty("跳转类型2 - 1无2外部链接3商品详情4秒杀商品详情5领卷中心")
    private Integer direct2;
    @ApiModelProperty("公司简介")
    private String companyInfo;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/LogisticsSetDto.java
New file
@@ -0,0 +1,41 @@
package com.ruoyi.other.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(description = "物流设置")
public class LogisticsSetDto {
    /**
     * 物流查询时间间隔
     */
    @ApiModelProperty(value = "物流查询时间间隔")
    private Integer waitTime;
    /**
     * 订单运费
     */
    @ApiModelProperty(value = "订单运费")
    private BigDecimal freight;
    /**
     * 包邮订单金额
     */
    @ApiModelProperty(value = "包邮订单金额")
    private BigDecimal freeFreight;
    /**
     * 包邮订单积分
     */
    @ApiModelProperty(value = "包邮订单积分")
    private Integer freeIntegral;
    /**
     * 包邮会员等级要求:1普通会员,2黄金会员,3钻石会员,4准代理,5代理,6总代,7合伙人
     */
    @ApiModelProperty(value = "包邮会员等级要求:0全部 1普通会员,2黄金会员,3钻石会员,4准代理,5代理,6总代,7合伙人")
    private String freeVip;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/StartPageSetDto.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.other.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class StartPageSetDto {
    @ApiModelProperty("启动页倒计时")
    private Integer waitTime;
    @ApiModelProperty("1图片2视频")
    private Integer type;
    @ApiModelProperty("对应文件地址")
    private String url;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/enums/PointChangeType.java
New file
@@ -0,0 +1,38 @@
package com.ruoyi.other.api.enums;
import lombok.Getter;
@Getter
public enum PointChangeType {
// 1-消费,2-返佣,3-拉新,4-每日分享,5-每日签到,6-使用时长, 7-注册积分, 8-门店业绩,9-门店返佣,10-技师业绩,11-兑换商品,12-他人赠送,13-赠与他人
    CONSUME(1, "消费"),
    REBATE(2, "返佣"),
    PULL_NEW(3, "拉新"),
    SHARE(4, "每日分享"),
    SIGN_IN(5, "每日签到"),
    USE_TIME(6, "使用时长"),
    REGISTER(7, "注册积分"),
    SHOP_ACHIEVEMENT(8, "门店业绩"),
    SHOP_REBATE(9, "门店返佣"),
    JUNIOR_SHOP_REBATE(14, "下级门店返佣"),
    TECHNICIAN_ACHIEVEMENT(10, "技师业绩"),
    EXCHANGE_GOODS(11, "兑换商品"),
    OTHER_GIFT(12, "他人赠送"),
    GIFT(13, "赠与他人");
    private final int code;
    private final String description;
    PointChangeType(int code, String description) {
        this.code = code;
        this.description = description;
    }
    public static PointChangeType fromCode(int code) {
        for (PointChangeType type : values()) {
            if (type.getCode() == code) {
                return type;
            }
        }
        throw new IllegalArgumentException("Invalid code: " + code);
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/enums/WithdrawalAuditStatus.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.other.api.enums;
import lombok.Getter;
@Getter
public enum WithdrawalAuditStatus {
    WAIT_AUDIT(1, "待审核"),
    AUDIT_SUCCESS(2, "审核通过"),
    AUDIT_FAIL(3, "审核拒绝");
    private final Integer code;
    private final String desc;
    WithdrawalAuditStatus(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/BaseSettingClientFallbackFactory.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.BaseSetting;
import com.ruoyi.other.api.feignClient.BaseSettingClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
@Slf4j
public class BaseSettingClientFallbackFactory implements FallbackFactory<BaseSettingClient> {
    @Override
    public BaseSettingClient create(Throwable cause) {
        return new BaseSettingClient(){
            @Override
            public R<BaseSetting> getBaseSetting(Integer id) {
                return R.fail("获取基础配置失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsClientFallbackFactory.java
New file
@@ -0,0 +1,54 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.Goods;
import com.ruoyi.other.api.feignClient.GoodsClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/11/27 19:57
 */
@Slf4j
public class GoodsClientFallbackFactory implements FallbackFactory<GoodsClient> {
    @Override
    public GoodsClient create(Throwable cause) {
        return new GoodsClient(){
            @Override
            public R<List<Goods>> getGoodsByType(Integer type) {
                return R.fail("根据类型(1=服务商品,2=单品商品)获取商品数据失败:" + cause.getMessage());
            }
            @Override
            public R<Goods> getGoodsById(Integer id) {
                return R.fail("根据id获取商品详情失败:" + cause.getMessage());
            }
            @Override
            public R<List<Goods>> getGoodsById(String [] ids) {
                return R.fail("根据ids获取商品详情失败:" + cause.getMessage());
            }
            @Override
            public R editGoodsList(List<Goods> goods) {
                return R.fail("编辑商品信息失败:" + cause.getMessage());
            }
            @Override
            public R<Void> editGoodsNum(Integer goodsId, Integer num) {
                return R.fail();
            }
            @Override
            public R<List<Goods>> getAllGoods() {
                return R.fail("获取所有商品失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsShopClientFallbackFactory.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.GoodsShop;
import com.ruoyi.other.api.feignClient.GoodsShopClient;
import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/11/27 20:29
 */
public class GoodsShopClientFallbackFactory implements FallbackFactory<GoodsShopClient> {
    @Override
    public GoodsShopClient create(Throwable cause) {
        return new GoodsShopClient() {
            @Override
            public R<GoodsShop> getGoodsShop(GoodsShop goodsShop) {
                return R.fail("获取商品门店关系数据失败:" + cause.getMessage());
            }
            @Override
            public R<List<GoodsShop>> getGoodsShopByGoodsIds(GetGoodsShopByGoodsIds goodsIds) {
                return R.fail("根据商品id集合和门店id查询数据失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/PointSettingClientFallbackFactory.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.PointSetting;
import com.ruoyi.other.api.feignClient.PointSettingClient;
import org.springframework.cloud.openfeign.FallbackFactory;
public class PointSettingClientFallbackFactory implements FallbackFactory<PointSettingClient> {
    @Override
    public PointSettingClient create(Throwable cause) {
        return new PointSettingClient() {
            @Override
            public R<PointSetting> getPointSetting(Integer id) {
                return R.fail("获取积分配置失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/RegionClientFallbackFactory.java
New file
@@ -0,0 +1,22 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.Region;
import com.ruoyi.other.api.feignClient.RegionClient;
import org.springframework.cloud.openfeign.FallbackFactory;
/**
 * @author zhibing.pu
 * @Date 2024/12/19 10:02
 */
public class RegionClientFallbackFactory implements FallbackFactory<RegionClient>  {
    @Override
    public RegionClient create(Throwable cause) {
        return new RegionClient() {
            @Override
            public R<Region> getRegionBiCode(String code) {
                return R.fail("根据城市编号查询行政区域数据失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/SeckillActivityInfoClientFallbackFactory.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.GoodsSeckill;
import com.ruoyi.other.api.domain.SeckillActivityInfo;
import com.ruoyi.other.api.feignClient.SeckillActivityInfoClient;
import com.ruoyi.other.api.vo.GetSeckillActivityInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
@Slf4j
public class SeckillActivityInfoClientFallbackFactory implements FallbackFactory<SeckillActivityInfoClient> {
    @Override
    public SeckillActivityInfoClient create(Throwable cause) {
        return new SeckillActivityInfoClient(){
            @Override
            public R<GoodsSeckill> getSeckillActivityInfo(GetSeckillActivityInfo info) {
                return R.fail("根据商品id和会员等级获取对应的秒杀活动失败:" + cause.getMessage());
            }
            @Override
            public R<SeckillActivityInfo> getSeckillActivityInfoById(Integer id) {
                return R.fail("根据id获取秒杀活动失败:" + cause.getMessage());
            }
            @Override
            public R<SeckillActivityInfo> getSeckillActivityInfoByGoodsId(Integer goodsId) {
                return R.fail();
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/ShopClientFallbackFactory.java
New file
@@ -0,0 +1,78 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.Shop;
import com.ruoyi.other.api.feignClient.ShopClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.web.bind.annotation.GetMapping;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Slf4j
public class ShopClientFallbackFactory implements FallbackFactory<ShopClient> {
    @Override
    public ShopClient create(Throwable cause) {
        return new ShopClient(){
            @Override
            public R<Shop> getShopById(Integer id) {
                return R.fail("根据id获取门店信息失败:" + cause.getMessage());
            }
            @Override
            public R<List<Shop>> getShopByUserId(Long id) {
                return R.fail("根据用户id集合获取门店数据失败");
            }
            @Override
            public R<Shop> getShopByPhone(String phone) {
                return R.fail("根据店铺管理员电话获取门店数据失败:" + cause.getMessage());
            }
            @Override
            public R<List<Shop>> getShopByUserIds(List<Long> userIds) {
                return R.fail("根据用户id集合获取门店数据失败");
            }
            @Override
            public R<Set<Integer>> getShopIdByName(String shopName) {
                return R.fail("根据门店名称获取门店id失败:" + cause.getMessage());
            }
            @Override
            public R<Set<Long>> getManagerByManagerName(String managerName) {
                return R.fail("根据门店管理员名称获取门店id失败:" + cause.getMessage());
            }
            @Override
            public void updateShop(Shop shop) {
                R.fail("编辑门店失败:" + cause.getMessage());
            }
            @Override
            public R<List<Shop>> getAllShop() {
                return R.fail("获取所有门店失败:" + cause.getMessage());
            }
            @GetMapping("/shop/getShopStatistics")
            @Override
            public R<Map<String, BigDecimal>> getShopStatistics(Integer shopId) {
                return R.fail();
            }
            @Override
            public R<Shop> getServiceProvider(Long appUserId) {
                return R.fail("获取服务商失败");
            }
            @Override
            public R<Shop> getSuperiorServiceProvider(Long appUserId) {
                return R.fail("获取高级服务商失败");
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/StoreFallbackFactory.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.Shop;
import com.ruoyi.other.api.feignClient.StoreClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
 * 充电订单服务降级处理
 *
 * @author ruoyi
 */
@Component
public class StoreFallbackFactory implements FallbackFactory<StoreClient>
{
    private static final Logger log = LoggerFactory.getLogger(StoreFallbackFactory.class);
    @Override
    public StoreClient create(Throwable cause) {
        log.error("商品订单调用失败:{}", cause.getMessage());
        return new StoreClient() {
            @Override
            public R<Shop> getStoreById(Integer id) {
                return R.fail("根据门店id查询详情:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/SystemConfigClientFallbackFactory.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.SystemConfig;
import com.ruoyi.other.api.feignClient.SystemConfigClient;
import org.springframework.cloud.openfeign.FallbackFactory;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2024/11/29 15:58
 */
public class SystemConfigClientFallbackFactory implements FallbackFactory<SystemConfigClient> {
    @Override
    public SystemConfigClient create(Throwable cause) {
        return new SystemConfigClient() {
            @Override
            public R<SystemConfig> getSystemConfig(Integer type) {
                return R.fail("根据类型获取系统配置失败:" + cause.getMessage());
            }
            @Override
            public R<BigDecimal> redPackegeSet() {
                return R.fail("根据红包配置失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/BaseSettingClient.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.BaseSetting;
import com.ruoyi.other.api.factory.BaseSettingClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author zhibing.pu
 * @Date 2024/11/29 11:34
 */
@FeignClient(contextId = "BaseSettingClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = BaseSettingClientFallbackFactory.class)
public interface BaseSettingClient {
    /**
     * 获取基础配置
     * @param id
     * @return
     */
    @GetMapping("/base-setting/getBaseSetting")
    R<BaseSetting> getBaseSetting(@RequestParam("id") Integer id);
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
New file
@@ -0,0 +1,66 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.Goods;
import com.ruoyi.other.api.factory.GoodsClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/11/27 19:56
 */
@FeignClient(contextId = "GoodsClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = GoodsClientFallbackFactory.class)
public interface GoodsClient{
    /**
     * 根据类型(1=服务商品,2=单品商品)获取商品数据
     * @param type
     * @return
     */
    @PostMapping("/goods/getGoodsByType")
    R<List<Goods>> getGoodsByType(@RequestParam("type") Integer type);
    /**
     * 根据id获取商品详情
     * @param id
     * @return
     */
    @PostMapping("/goods/getGoodsById")
    R<Goods> getGoodsById(@RequestParam("id") Integer id);
    @PostMapping("/goods/getGoodsByIds")
    R<List<Goods>> getGoodsById(@RequestParam("ids") String[]  ids);
    /**
     * 编辑商品信息
     * @param goods
     * @return
     */
    @PostMapping("/goods/editGoods")
    R editGoodsList(@RequestBody List<Goods> goods);
    /**
     * 商品销量增加
     */
    @PutMapping("/goods/editGoodsNum")
    R<Void> editGoodsNum(@RequestParam("goodsId") Integer goodsId, @RequestParam("num") Integer num);
    /**
     * 获取所有商品
     * @return
     */
    @PostMapping("/goods/getAllGoods")
    R<List<Goods>> getAllGoods();
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsShopClient.java
New file
@@ -0,0 +1,36 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.GoodsShop;
import com.ruoyi.other.api.factory.GoodsShopClientFallbackFactory;
import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/11/27 20:28
 */
@FeignClient(contextId = "GoodsShopClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = GoodsShopClientFallbackFactory.class)
public interface GoodsShopClient {
    /**
     * 获取商品门店关系数据
     * @param goodsShop
     * @return
     */
    @PostMapping("/goods-shop/getGoodsShop")
    R<GoodsShop> getGoodsShop(@RequestBody GoodsShop goodsShop);
    /**
     * 根据商品id集合和门店id查询数据
     * @param goodsIds
     * @return
     */
    @PostMapping("/goods-shop/getGoodsShopByGoodsIds")
    R<List<GoodsShop>> getGoodsShopByGoodsIds(@RequestBody GetGoodsShopByGoodsIds goodsIds);
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/PointSettingClient.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.PointSetting;
import com.ruoyi.other.api.factory.PointSettingClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(contextId = "PointSettingClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = PointSettingClientFallbackFactory.class)
public interface PointSettingClient {
    @PostMapping("/point-setting/getPointSetting")
    R<PointSetting> getPointSetting(@RequestParam("id") Integer id);
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/RegionClient.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.Region;
import com.ruoyi.other.api.factory.RegionClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author zhibing.pu
 * @Date 2024/12/19 10:01
 */
@FeignClient(contextId = "RegionClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = RegionClientFallbackFactory.class)
public interface RegionClient {
    /**
     * 根据城市编号查询行政区域数据
     * @param code
     * @return
     */
    @PostMapping("/region/getRegionBiCode")
    R<Region> getRegionBiCode(@RequestParam("code") String code);
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/SeckillActivityInfoClient.java
New file
@@ -0,0 +1,42 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.GoodsSeckill;
import com.ruoyi.other.api.domain.SeckillActivityInfo;
import com.ruoyi.other.api.factory.SeckillActivityInfoClientFallbackFactory;
import com.ruoyi.other.api.vo.GetSeckillActivityInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author zhibing.pu
 * @Date 2024/11/28 10:38
 */
@FeignClient(contextId = "SeckillActivityInfoClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = SeckillActivityInfoClientFallbackFactory.class)
public interface SeckillActivityInfoClient {
    /**
     * 根据商品id和会员等级获取对应的秒杀活动
     * @param info
     * @return
     */
    @PostMapping("/seckill-activity-info/getSeckillActivityInfo")
    R<GoodsSeckill> getSeckillActivityInfo(@RequestBody GetSeckillActivityInfo info);
    /**
     * 根据id获取秒杀活动
     * @param id
     * @return
     */
    @PostMapping("/seckill-activity-info/getSeckillActivityInfoById")
    R<SeckillActivityInfo> getSeckillActivityInfoById(@RequestParam("id") Integer id);
    @GetMapping("/seckill-activity-info/getSeckillActivityInfoByGoodsId")
    public R<SeckillActivityInfo> getSeckillActivityInfoByGoodsId(@RequestParam("goodsId") Integer goodsId);
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/ShopClient.java
New file
@@ -0,0 +1,86 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.Shop;
import com.ruoyi.other.api.factory.ShopClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * @author zhibing.pu
 * @Date 2024/11/29 10:28
 */
@FeignClient(contextId = "ShopClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = ShopClientFallbackFactory.class)
public interface ShopClient {
    /**
     * 根据id获取门店信息
     * @param id
     * @return
     */
    @PostMapping("/shop/getShopById")
    R<Shop> getShopById(@RequestParam("id") Integer id);
    @PostMapping("/shop/getShopByUserId")
    R<List<Shop>> getShopByUserId(@RequestParam("id") Long id);
    /**
     * 根据店铺管理员电话获取门店数据
     * @param phone
     * @return
     */
    @PostMapping("/shop/getShopByPhone")
    R<Shop> getShopByPhone(@RequestParam("phone") String phone);
    @PostMapping("/shop/getShopByUserIds")
    R<List<Shop>> getShopByUserIds(@RequestBody List<Long> userIds);
    @PostMapping("/shop/getShopIdByName")
    R<Set<Integer>> getShopIdByName(@RequestParam("shopName") String shopName);
    @PostMapping("/shop/getManagerByManagerName")
    R<Set<Long>> getManagerByManagerName(@RequestParam("managerName") String managerName);
    /**
     * 编辑门店
     * @param shop
     */
    @PostMapping("/shop/updateShop")
    void updateShop(Shop shop);
    /**
     * 获取所有门店
     * @return
     */
    @PostMapping("/shop/getAllShop")
    R<List<Shop>> getAllShop();
    @GetMapping("/shop/getShopStatistics")
    public R<Map<String, BigDecimal>> getShopStatistics(@RequestParam("shopId") Integer shopId);
    /**
     * 获取指定用户的服务商
     */
    @GetMapping("/shop/getServiceProvider")
    R<Shop> getServiceProvider(@RequestParam("appUserId") Long appUserId);
    /**
     * 获取指定用户的高级服务商
     */
    @GetMapping("/shop/getSuperiorServiceProvider")
    public R<Shop> getSuperiorServiceProvider(@RequestParam("appUserId") Long appUserId);
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/StoreClient.java
New file
@@ -0,0 +1,22 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.Shop;
import com.ruoyi.other.api.factory.StoreFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * 后台订单服务
 * @author ruoyi
 */
@FeignClient(contextId = "StoreClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = StoreFallbackFactory.class)
public interface StoreClient {
    @GetMapping(value = "/shop/getDetailById")
    R<Shop> getStoreById(@RequestParam("id") Integer id);
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/SystemConfigClient.java
New file
@@ -0,0 +1,32 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.SystemConfig;
import com.ruoyi.other.api.factory.SystemConfigClientFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
/**
 * @author zhibing.pu
 * @Date 2024/11/29 15:58
 */
@FeignClient(contextId = "SystemConfigClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = SystemConfigClientFallbackFactory.class)
public interface SystemConfigClient {
    /**
     * 根据类型获取系统配置
     * @param type
     * @return
     */
    @PostMapping("/system-config/getSystemConfig")
    R<SystemConfig> getSystemConfig(@RequestParam("type") Integer type);
    @PostMapping("/red-packege-set/get")
    R<BigDecimal> redPackegeSet();
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/vo/GetGoodsBargainPrice.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.other.api.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/11/28 10:47
 */
@Data
public class GetGoodsBargainPrice {
    /**
     * 商品id
     */
    private Integer goodsId;
    /**
     * 会员
     */
    private Integer vip;
    /**
     * 门店id
     */
    private Integer shopId;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/vo/GetGoodsShopByGoodsIds.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.other.api.vo;
import lombok.Data;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/12/2 10:18
 */
@Data
public class GetGoodsShopByGoodsIds {
    /**
     * 门店id
     */
    private Integer shopId;
    /**
     * 商品id集合
     */
    private List<Integer> goodsIds;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/vo/GetSeckillActivityInfo.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.other.api.vo;
import lombok.Data;
/**
 * @author zhibing.pu
 * @Date 2024/11/28 10:33
 */
@Data
public class GetSeckillActivityInfo {
    /**
     * 商品id
     */
    private Integer goodsId;
    /**
     * 会员
     */
    private Integer vip;
}
ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
New file
@@ -0,0 +1,23 @@
com.ruoyi.other.api.factory.GoodsClientFallbackFactory
com.ruoyi.other.api.factory.GoodsShopClientFallbackFactory
com.ruoyi.other.api.factory.GoodsAreaClientFallbackFactory
com.ruoyi.other.api.factory.GoodsVipClientFallbackFactory
com.ruoyi.other.api.factory.SeckillActivityInfoClientFallbackFactory
com.ruoyi.other.api.factory.GoodsBargainPriceClientFallbackFactory
com.ruoyi.other.api.factory.RemoteVipSettingFallbackFactory
com.ruoyi.other.api.factory.ShopClientFallbackFactory
com.ruoyi.other.api.factory.OrderActivityInfoClientFallbackFactory
com.ruoyi.other.api.factory.BaseSettingClientFallbackFactory
com.ruoyi.other.api.factory.CouponInfoClientFallbackFactory
com.ruoyi.other.api.factory.SystemConfigClientFallbackFactory
com.ruoyi.other.api.factory.StoreFallbackFactory
com.ruoyi.other.api.factory.CouponClientFallbackFactory
com.ruoyi.other.api.factory.TechnicianClientFallbackFactory
com.ruoyi.other.api.factory.PointSettingClientFallbackFactory
com.ruoyi.other.api.factory.VipGoodClientFallbackFactory
com.ruoyi.other.api.factory.VipSettingClientFallbackFactory
com.ruoyi.other.api.factory.RegionClientFallbackFactory
com.ruoyi.other.api.factory.ShopBalanceStatementClientFallbackFactory
com.ruoyi.other.api.factory.ShopPointClientFallbackFactory
com.ruoyi.other.api.factory.TechnicianSubscribeClientFallbackFactory
com.ruoyi.other.api.factory.ShopGiveawayTemporaryClientFallbackFactory
ruoyi-api/ruoyi-api-system/pom.xml
New file
@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi-api</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-api-system</artifactId>
    <description>
        ruoyi-api-system系统接口模块
    </description>
    <dependencies>
        <!-- RuoYi Common Core-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-core</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.github.pagehelper</groupId>
                    <artifactId>pagehelper-spring-boot-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteFileService.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.system.api;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysFile;
import com.ruoyi.system.api.factory.RemoteFileFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
/**
 * 文件服务
 *
 * @author ruoyi
 */
@FeignClient(contextId = "remoteFileService", value = ServiceNameConstants.FILE_SERVICE, fallbackFactory = RemoteFileFallbackFactory.class)
public interface RemoteFileService
{
    /**
     * 上传文件
     *
     * @param file 文件信息
     * @return 结果
     */
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public R<SysFile> upload(@RequestPart(value = "file") MultipartFile file);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteLogService.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.api;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysOperLog;
import com.ruoyi.system.api.factory.RemoteLogFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
/**
 * 日志服务
 *
 * @author ruoyi
 */
@FeignClient(contextId = "remoteLogService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteLogFallbackFactory.class)
public interface RemoteLogService
{
    /**
     * 保存系统日志
     *
     * @param sysOperLog 日志实体
     * @param source 请求来源
     * @return 结果
     */
    @PostMapping("/operlog")
    public R<Boolean> saveLog(@RequestBody SysOperLog sysOperLog, @RequestHeader(SecurityConstants.FROM_SOURCE) String source) throws Exception;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/RemoteUserService.java
New file
@@ -0,0 +1,41 @@
package com.ruoyi.system.api;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.factory.RemoteUserFallbackFactory;
import com.ruoyi.system.api.model.LoginUser;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
/**
 * 用户服务
 *
 * @author ruoyi
 */
@FeignClient(contextId = "remoteUserService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)
public interface RemoteUserService
{
    /**
     * 通过用户名查询用户信息
     *
     * @param username 用户名
     * @param source 请求来源
     * @return 结果
     */
    @GetMapping("/user/info/{username}")
    public R<LoginUser> getUserInfo(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    @GetMapping("/user/infoShop/{username}")
    public R<LoginUser> infoShop(@PathVariable("username") String username, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
    /**
     * 注册用户信息
     *
     * @param sysUser 用户信息
     * @param source 请求来源
     * @return 结果
     */
    @PostMapping("/user/register")
    public R<Boolean> registerUserInfo(@RequestBody SysUser sysUser, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/config/DataUpdateHandlerConfig.java
New file
@@ -0,0 +1,36 @@
package com.ruoyi.system.api.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.ruoyi.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import java.util.Date;
/**
 * @author xiaochen
 * @ClassName DataUpdateInterceptor
 * @Description 数据更新操作处理
 * @date 2021-12-15
 * <p>
 * 注意,之前在此处注入了 JwtTokenUtils
 * <p>
 * 造成spring循环依赖,项目支棱不起来
 */
@Slf4j
@Configuration
public class DataUpdateHandlerConfig implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
    }
    @Override
    public void updateFill(MetaObject metaObject) {
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/config/HttpConfig.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.system.api.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
 * http请求工具配置
 *
 * @author: KingKong
 * @create: 2018-11-14 10:47
 **/
@Configuration
public class HttpConfig {
    @Autowired
    private RestTemplateBuilder builder;
    @Bean
    public RestTemplate restTemplate() {
        return builder.build();
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/config/MybatisPlusConfig.java
New file
@@ -0,0 +1,51 @@
package com.ruoyi.system.api.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @author xiaochen
 * @ClassName MybatisPlusConfig
 * @Description MybatisPlus相关配置
 * @date 2020-09-22 11:22、
 * 直接以实现类作为bean的注入(有事务管理的类)
 * @EnableTransactionManagement(proxyTargetClass = true)
 */
@Configuration
public class MybatisPlusConfig {
    private final DataUpdateHandlerConfig dataUpdateHandler;
    @Autowired
    public MybatisPlusConfig(DataUpdateHandlerConfig dataUpdateHandler) {
        this.dataUpdateHandler = dataUpdateHandler;
    }
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
    /**
     * 自动填充功能
     *
     * @return
     */
    @Bean
    public GlobalConfig globalConfig() {
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setMetaObjectHandler(dataUpdateHandler);
        return globalConfig;
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDept.java
New file
@@ -0,0 +1,212 @@
package com.ruoyi.system.api.domain;
import com.ruoyi.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.Email;
import javax.validation.constraints.Size;
import java.util.ArrayList;
import java.util.List;
/**
 * 部门表 sys_dept
 *
 * @author ruoyi
 */
public class SysDept extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** 部门ID */
    private Long deptId;
    /** 父部门ID */
    private Long parentId;
    /** 祖级列表 */
    private String ancestors;
    /** 部门名称 */
    private String deptName;
    /** 显示顺序 */
    private Integer orderNum;
    /** 负责人 */
    private String leader;
    /** 联系电话 */
    private String phone;
    /** 邮箱 */
    private String email;
    /** 部门状态:0正常,1停用 */
    private String status;
    /** 删除标志(0代表存在 2代表删除) */
    private String delFlag;
    /**
     * 门店id
     */
    private Integer shopId;
    /** 父部门名称 */
    private String parentName;
    /** 子部门 */
    private List<SysDept> children = new ArrayList<SysDept>();
    public Long getDeptId()
    {
        return deptId;
    }
    public void setDeptId(Long deptId)
    {
        this.deptId = deptId;
    }
    public Long getParentId()
    {
        return parentId;
    }
    public void setParentId(Long parentId)
    {
        this.parentId = parentId;
    }
    public String getAncestors()
    {
        return ancestors;
    }
    public void setAncestors(String ancestors)
    {
        this.ancestors = ancestors;
    }
    @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
    public String getDeptName()
    {
        return deptName;
    }
    public void setDeptName(String deptName)
    {
        this.deptName = deptName;
    }
    public Integer getOrderNum()
    {
        return orderNum;
    }
    public void setOrderNum(Integer orderNum)
    {
        this.orderNum = orderNum;
    }
    public String getLeader()
    {
        return leader;
    }
    public void setLeader(String leader)
    {
        this.leader = leader;
    }
    @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
    public String getPhone()
    {
        return phone;
    }
    public void setPhone(String phone)
    {
        this.phone = phone;
    }
    @Email(message = "邮箱格式不正确")
    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
    public String getEmail()
    {
        return email;
    }
    public void setEmail(String email)
    {
        this.email = email;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public String getDelFlag()
    {
        return delFlag;
    }
    public void setDelFlag(String delFlag)
    {
        this.delFlag = delFlag;
    }
    public String getParentName()
    {
        return parentName;
    }
    public void setParentName(String parentName)
    {
        this.parentName = parentName;
    }
    public List<SysDept> getChildren()
    {
        return children;
    }
    public void setChildren(List<SysDept> children)
    {
        this.children = children;
    }
    public Integer getShopId() {
        return shopId;
    }
    public void setShopId(Integer shopId) {
        this.shopId = shopId;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("deptId", getDeptId())
            .append("parentId", getParentId())
            .append("ancestors", getAncestors())
            .append("deptName", getDeptName())
            .append("orderNum", getOrderNum())
            .append("leader", getLeader())
            .append("phone", getPhone())
            .append("email", getEmail())
            .append("status", getStatus())
            .append("delFlag", getDelFlag())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .toString();
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictData.java
New file
@@ -0,0 +1,177 @@
package com.ruoyi.system.api.domain;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.annotation.Excel.ColumnType;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
/**
 * 字典数据表 sys_dict_data
 *
 * @author ruoyi
 */
public class SysDictData extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** 字典编码 */
    @Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
    private Long dictCode;
    /** 字典排序 */
    @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
    private Long dictSort;
    /** 字典标签 */
    @Excel(name = "字典标签")
    private String dictLabel;
    /** 字典键值 */
    @Excel(name = "字典键值")
    private String dictValue;
    /** 字典类型 */
    @Excel(name = "字典类型")
    private String dictType;
    /** 样式属性(其他样式扩展) */
    private String cssClass;
    /** 表格字典样式 */
    private String listClass;
    /** 是否默认(Y是 N否) */
    @Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
    private String isDefault;
    /** 状态(0正常 1停用) */
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    public Long getDictCode()
    {
        return dictCode;
    }
    public void setDictCode(Long dictCode)
    {
        this.dictCode = dictCode;
    }
    public Long getDictSort()
    {
        return dictSort;
    }
    public void setDictSort(Long dictSort)
    {
        this.dictSort = dictSort;
    }
    @NotBlank(message = "字典标签不能为空")
    @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
    public String getDictLabel()
    {
        return dictLabel;
    }
    public void setDictLabel(String dictLabel)
    {
        this.dictLabel = dictLabel;
    }
    @NotBlank(message = "字典键值不能为空")
    @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
    public String getDictValue()
    {
        return dictValue;
    }
    public void setDictValue(String dictValue)
    {
        this.dictValue = dictValue;
    }
    @NotBlank(message = "字典类型不能为空")
    @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
    public String getDictType()
    {
        return dictType;
    }
    public void setDictType(String dictType)
    {
        this.dictType = dictType;
    }
    @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
    public String getCssClass()
    {
        return cssClass;
    }
    public void setCssClass(String cssClass)
    {
        this.cssClass = cssClass;
    }
    public String getListClass()
    {
        return listClass;
    }
    public void setListClass(String listClass)
    {
        this.listClass = listClass;
    }
    public boolean getDefault()
    {
        return UserConstants.YES.equals(this.isDefault);
    }
    public String getIsDefault()
    {
        return isDefault;
    }
    public void setIsDefault(String isDefault)
    {
        this.isDefault = isDefault;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("dictCode", getDictCode())
            .append("dictSort", getDictSort())
            .append("dictLabel", getDictLabel())
            .append("dictValue", getDictValue())
            .append("dictType", getDictType())
            .append("cssClass", getCssClass())
            .append("listClass", getListClass())
            .append("isDefault", getIsDefault())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysDictType.java
New file
@@ -0,0 +1,97 @@
package com.ruoyi.system.api.domain;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.annotation.Excel.ColumnType;
import com.ruoyi.common.core.web.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
/**
 * 字典类型表 sys_dict_type
 *
 * @author ruoyi
 */
public class SysDictType extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** 字典主键 */
    @Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
    private Long dictId;
    /** 字典名称 */
    @Excel(name = "字典名称")
    private String dictName;
    /** 字典类型 */
    @Excel(name = "字典类型")
    private String dictType;
    /** 状态(0正常 1停用) */
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    public Long getDictId()
    {
        return dictId;
    }
    public void setDictId(Long dictId)
    {
        this.dictId = dictId;
    }
    @NotBlank(message = "字典名称不能为空")
    @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
    public String getDictName()
    {
        return dictName;
    }
    public void setDictName(String dictName)
    {
        this.dictName = dictName;
    }
    @NotBlank(message = "字典类型不能为空")
    @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
    @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
    public String getDictType()
    {
        return dictType;
    }
    public void setDictType(String dictType)
    {
        this.dictType = dictType;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("dictId", getDictId())
            .append("dictName", getDictName())
            .append("dictType", getDictType())
            .append("status", getStatus())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysFile.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.system.api.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * 文件信息
 *
 * @author ruoyi
 */
public class SysFile
{
    /**
     * 文件名称
     */
    private String name;
    /**
     * 文件地址
     */
    private String url;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getUrl()
    {
        return url;
    }
    public void setUrl(String url)
    {
        this.url = url;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("name", getName())
            .append("url", getUrl())
            .toString();
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLoginLog.java
New file
@@ -0,0 +1,91 @@
package com.ruoyi.system.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * @author zhibing.pu
 * @Date 2024/8/12 15:38
 */
@Data
@TableName("sys_login_log")
@ApiModel
public class SysLoginLog {
    /**
     * 主键
     */
    @ApiModelProperty(value = "数据id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 用户id
     */
    @TableField("user_id")
    private Integer userId;
    /**
     * 登录账号
     */
    @TableField("username")
    @ApiModelProperty(value = "用户账号")
    private String username;
    /**
     * 登录IP地址
     */
    @TableField("ip_address")
    @ApiModelProperty(value = "登录IP地址")
    private String ipAddress;
    /**
     * 登录地址
     */
    @TableField("address")
    @ApiModelProperty(value = "登录地址")
    private String address;
    /**
     * 浏览器类型
     */
    @TableField("browser_type")
    @ApiModelProperty(value = "浏览器类型")
    private String browserType;
    /**
     * 操作系统
     */
    @TableField("operating_system")
    @ApiModelProperty(value = "操作系统")
    private String operatingSystem;
    /**
     * 登录时间
     */
    @TableField("login_time")
    @ApiModelProperty(value = "登录时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime loginTime;
    /**
     * 登录状态(1=成功,2=失败)
     */
    @TableField("login_status")
    private Integer loginStatus;
    /**
     * 提示消息
     */
    @TableField("message")
    private String message;
    /**
     * 添加时间
     */
    @TableField("create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    /**
     * 删除状态(0=否,1=是)
     */
    @TableField("del_flag")
    private Integer delFlag;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysLogininfor.java
New file
@@ -0,0 +1,103 @@
package com.ruoyi.system.api.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.annotation.Excel.ColumnType;
import com.ruoyi.common.core.web.domain.BaseEntity;
import java.util.Date;
/**
 * 系统访问记录表 sys_logininfor
 *
 * @author ruoyi
 */
public class SysLogininfor extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** ID */
    @Excel(name = "序号", cellType = ColumnType.NUMERIC)
    private Long infoId;
    /** 用户账号 */
    @Excel(name = "用户账号")
    private String userName;
    /** 状态 0成功 1失败 */
    @Excel(name = "状态", readConverterExp = "0=成功,1=失败")
    private String status;
    /** 地址 */
    @Excel(name = "地址")
    private String ipaddr;
    /** 描述 */
    @Excel(name = "描述")
    private String msg;
    /** 访问时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date accessTime;
    public Long getInfoId()
    {
        return infoId;
    }
    public void setInfoId(Long infoId)
    {
        this.infoId = infoId;
    }
    public String getUserName()
    {
        return userName;
    }
    public void setUserName(String userName)
    {
        this.userName = userName;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public String getIpaddr()
    {
        return ipaddr;
    }
    public void setIpaddr(String ipaddr)
    {
        this.ipaddr = ipaddr;
    }
    public String getMsg()
    {
        return msg;
    }
    public void setMsg(String msg)
    {
        this.msg = msg;
    }
    public Date getAccessTime()
    {
        return accessTime;
    }
    public void setAccessTime(Date accessTime)
    {
        this.accessTime = accessTime;
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysOperLog.java
New file
@@ -0,0 +1,158 @@
package com.ruoyi.system.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.annotation.Excel.ColumnType;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * 操作日志记录表 oper_log
 *
 * @author ruoyi
 */
@Data
@ApiModel
@TableName("sys_oper_log")
public class SysOperLog {
    private static final long serialVersionUID = 1L;
    /**
     * 日志主键
     */
    @Excel(name = "操作序号", cellType = ColumnType.NUMERIC)
    @ApiModelProperty("数据id")
    @TableId(value = "oper_id", type = IdType.AUTO)
    private Long operId;
    /**
     * 操作模块
     */
    @Excel(name = "操作模块")
    @ApiModelProperty("操作模块")
    private String title;
    /**
     * 业务类型(0其它 1新增 2修改 3删除)
     */
    @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据")
    @ApiModelProperty("0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据")
    @TableField("business_type")
    private Integer businessType;
    /**
     * 业务类型数组
     */
    @TableField(exist = false)
    private Integer[] businessTypes;
    /**
     * 请求方法
     */
    @Excel(name = "请求方法")
    @ApiModelProperty("请求方法")
    private String method;
    /**
     * 请求方式
     */
    @Excel(name = "请求方式")
    @ApiModelProperty("请求方式")
    @TableField("request_method")
    private String requestMethod;
    /**
     * 操作类别(0其它 1后台用户 2手机端用户)
     */
    @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户")
    @ApiModelProperty("0=其它,1=后台用户,2=手机端用户")
    @TableField("operator_type")
    private Integer operatorType;
    /**
     * 操作人员
     */
    @Excel(name = "操作人员")
    @ApiModelProperty("操作人员")
    @TableField("oper_name")
    private String operName;
    /**
     * 部门名称
     */
    @Excel(name = "部门名称")
    @ApiModelProperty("部门名称")
    @TableField("dept_name")
    private String deptName;
    /**
     * 请求url
     */
    @Excel(name = "请求地址")
    @ApiModelProperty("请求地址")
    @TableField("oper_url")
    private String operUrl;
    /**
     * 操作地址
     */
    @Excel(name = "操作地址")
    @ApiModelProperty("操作地址")
    @TableField("oper_ip")
    private String operIp;
    /**
     * 请求参数
     */
    @Excel(name = "请求参数")
    @ApiModelProperty("请求参数")
    @TableField("oper_param")
    private String operParam;
    /**
     * 返回参数
     */
    @Excel(name = "返回参数")
    @ApiModelProperty("返回参数")
    @TableField("json_result")
    private String jsonResult;
    /**
     * 操作状态(0正常 1异常)
     */
    @Excel(name = "状态", readConverterExp = "0=正常,1=异常")
    @ApiModelProperty("0=正常,1=异常")
    private Integer status;
    /**
     * 错误消息
     */
    @Excel(name = "错误消息")
    @ApiModelProperty("错误消息")
    @TableField("error_msg")
    private String errorMsg;
    /**
     * 操作时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("操作时间")
    @TableField("oper_time")
    private Date operTime;
    /**
     * 消耗时间
     */
    @Excel(name = "消耗时间", suffix = "毫秒")
    @ApiModelProperty("消耗时间")
    @TableField("cost_time")
    private Long costTime;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysRole.java
New file
@@ -0,0 +1,246 @@
package com.ruoyi.system.api.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.annotation.Excel.ColumnType;
import com.ruoyi.common.core.web.domain.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.List;
import java.util.Set;
/**
 * 角色表 sys_role
 *
 * @author ruoyi
 */
public class SysRole extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** 角色ID */
    @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
    @TableField("role_id")
    private Long roleId;
    /** 角色名称 */
    @Excel(name = "角色名称")
    @TableField("role_name")
    private String roleName;
    /** 角色权限 */
    @Excel(name = "角色权限")
    @TableField("role_key")
    private String roleKey;
    /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */
    @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
    @TableField("data_scope")
    private String dataScope;
    /** 角色状态(0正常 1停用) */
    @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
    private String status;
    /**
     * 门店id
     */
    @TableField("shop_id")
    private Integer shopId;
    /** 删除标志(0代表存在 2代表删除) */
    @TableField("del_flag")
    private String delFlag;
    /** 用户是否存在此角色标识 默认不存在 */
    @TableField(exist = false)
    private boolean flag = false;
    /** 菜单组 */
    @TableField(exist = false)
    private Long[] menuIds;
    /** 部门组(数据权限) */
    @TableField(exist = false)
    private Long[] deptIds;
    /** 角色菜单权限 */
    @TableField(exist = false)
    private Set<String> permissions;
    @ApiModelProperty(value = "站点名称")
    @TableField(exist = false)
    private List<String> siteNames;
    @TableField(exist = false)
    private Long number;
    public SysRole()
    {
    }
    public SysRole(Long roleId)
    {
        this.roleId = roleId;
    }
    public Long getRoleId()
    {
        return roleId;
    }
    public void setRoleId(Long roleId)
    {
        this.roleId = roleId;
    }
    public boolean isAdmin()
    {
        return isAdmin(this.roleId);
    }
    public static boolean isAdmin(Long roleId)
    {
        return roleId != null && 1L == roleId;
    }
    @NotBlank(message = "角色名称不能为空")
    @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
    public String getRoleName()
    {
        return roleName;
    }
    public void setRoleName(String roleName)
    {
        this.roleName = roleName;
    }
    @NotBlank(message = "权限字符不能为空")
    @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
    public String getRoleKey()
    {
        return roleKey;
    }
    public void setRoleKey(String roleKey)
    {
        this.roleKey = roleKey;
    }
    public String getDataScope()
    {
        return dataScope;
    }
    public void setDataScope(String dataScope)
    {
        this.dataScope = dataScope;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public String getDelFlag()
    {
        return delFlag;
    }
    public void setDelFlag(String delFlag)
    {
        this.delFlag = delFlag;
    }
    public boolean isFlag()
    {
        return flag;
    }
    public void setFlag(boolean flag)
    {
        this.flag = flag;
    }
    public Long[] getMenuIds()
    {
        return menuIds;
    }
    public void setMenuIds(Long[] menuIds)
    {
        this.menuIds = menuIds;
    }
    public Long[] getDeptIds()
    {
        return deptIds;
    }
    public void setDeptIds(Long[] deptIds)
    {
        this.deptIds = deptIds;
    }
    public Set<String> getPermissions()
    {
        return permissions;
    }
    public void setPermissions(Set<String> permissions)
    {
        this.permissions = permissions;
    }
    public List<String> getSiteNames() {
        return siteNames;
    }
    public void setSiteNames(List<String> siteNames) {
        this.siteNames = siteNames;
    }
    public Long getNumber() {
        return number;
    }
    public void setNumber(Long number) {
        this.number = number;
    }
    public Integer getShopId() {
        return shopId;
    }
    public void setShopId(Integer shopId) {
        this.shopId = shopId;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("roleId", getRoleId())
            .append("roleName", getRoleName())
            .append("roleKey", getRoleKey())
            .append("dataScope", getDataScope())
            .append("status", getStatus())
            .append("delFlag", getDelFlag())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .toString();
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
New file
@@ -0,0 +1,435 @@
package com.ruoyi.system.api.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.annotation.Excel.ColumnType;
import com.ruoyi.common.core.annotation.Excel.Type;
import com.ruoyi.common.core.annotation.Excels;
import com.ruoyi.common.core.web.domain.BaseEntity;
import com.ruoyi.common.core.xss.Xss;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Date;
import java.util.List;
/**
 * 用户对象 sys_user
 *
 * @author ruoyi
 */
public class SysUser extends BaseEntity
{
    private static final long serialVersionUID = 1L;
    /** 用户ID */
    @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
    @TableId(value = "user_id", type = IdType.AUTO)
    private Long userId;
    /** 部门ID */
    @Excel(name = "部门编号", type = Type.IMPORT)
    @TableField("dept_id")
    private Long deptId;
    /** 用户账号 */
    @Excel(name = "登录名称")
    @TableField("user_name")
    private String userName;
    /** 用户昵称 */
    @Excel(name = "用户名称")
    @NotBlank(message = "姓名不能为空")
    @TableField("nick_name")
    private String nickName;
    /** 用户邮箱 */
    @Excel(name = "用户邮箱")
    private String email;
    /** 手机号码 */
    @Excel(name = "手机号码")
    @NotBlank(message = "请输入账号")
    private String phonenumber;
    /** 用户性别 */
    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
    private String sex;
    /** 用户头像 */
    private String avatar;
    /** 密码 */
    private String password;
    /** 帐号状态(0正常 1停用) */
    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
    private String status;
    /** 删除标志(0代表存在 2代表删除) */
    @TableField("del_flag")
    private String delFlag;
    /** 最后登录IP */
    @Excel(name = "最后登录IP", type = Type.EXPORT)
    @TableField("login_ip")
    private String loginIp;
    /** 最后登录时间 */
    @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField("login_date")
    private Date loginDate;
    /** 部门对象 */
    @Excels({
        @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
        @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
    })
    @TableField(exist = false)
    private SysDept dept;
    /** 角色对象 */
    @TableField(exist = false)
    private List<SysRole> roles;
    /** 角色组 */
    @TableField(exist = false)
    private Long[] roleIds;
    /** 岗位组 */
    @TableField(exist = false)
    private Long[] postIds;
    /** 角色ID */
    @TableField(exist = false)
    private Long roleId;
    /**
     * 角色类型 1=平台 2=门店
     */
    @ApiModelProperty(value = "角色类型 1=平台 2=门店")
    @TableField("role_type")
    private Integer roleType;
    @Excel(name = "密码修改时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
    private Date passWordUpdate;
    @ApiModelProperty(value = "对象ID")
    @TableField("objectId")
    private Integer objectId;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "禁用账户备注")
    @TableField("forbidden_remark")
    private String forbiddenRemark;
    @ApiModelProperty(value = "前端用户id")
    @TableField("app_user_id")
    private Long appUserId;
    @ApiModelProperty(value = "角色")
    @TableField(exist = false)
    private List<String> roleNames;
    @Override
    public String getRemark() {
        return remark;
    }
    @Override
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public SysUser()
    {
    }
    public SysUser(Long userId)
    {
        this.userId = userId;
    }
    public Integer getRoleType() {
        return roleType;
    }
    public void setRoleType(Integer roleType) {
        this.roleType = roleType;
    }
    public Date getPassWordUpdate() {
        return passWordUpdate;
    }
    public void setPassWordUpdate(Date passWordUpdate) {
        this.passWordUpdate = passWordUpdate;
    }
    public Integer getObjectId() {
        return objectId;
    }
    public void setObjectId(Integer objectId) {
        this.objectId = objectId;
    }
    public Long getUserId()
    {
        return userId;
    }
    public void setUserId(Long userId)
    {
        this.userId = userId;
    }
    public boolean isAdmin()
    {
        return isAdmin(this.userId);
    }
    public static boolean isAdmin(Long userId)
    {
        return userId != null && 1L == userId;
    }
    public Long getDeptId()
    {
        return deptId;
    }
    public void setDeptId(Long deptId)
    {
        this.deptId = deptId;
    }
    @Xss(message = "用户昵称不能包含脚本字符")
    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
    public String getNickName()
    {
        return nickName;
    }
    public void setNickName(String nickName)
    {
        this.nickName = nickName;
    }
    @Xss(message = "用户账号不能包含脚本字符")
    @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
    public String getUserName()
    {
        return userName;
    }
    public void setUserName(String userName)
    {
        this.userName = userName;
    }
    @Email(message = "邮箱格式不正确")
    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
    public String getEmail()
    {
        return email;
    }
    public void setEmail(String email)
    {
        this.email = email;
    }
    @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
    public String getPhonenumber()
    {
        return phonenumber;
    }
    public void setPhonenumber(String phonenumber)
    {
        this.phonenumber = phonenumber;
    }
    public String getSex()
    {
        return sex;
    }
    public void setSex(String sex)
    {
        this.sex = sex;
    }
    public String getAvatar()
    {
        return avatar;
    }
    public void setAvatar(String avatar)
    {
        this.avatar = avatar;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
    public String getDelFlag()
    {
        return delFlag;
    }
    public void setDelFlag(String delFlag)
    {
        this.delFlag = delFlag;
    }
    public String getLoginIp()
    {
        return loginIp;
    }
    public void setLoginIp(String loginIp)
    {
        this.loginIp = loginIp;
    }
    public Date getLoginDate()
    {
        return loginDate;
    }
    public void setLoginDate(Date loginDate)
    {
        this.loginDate = loginDate;
    }
    public SysDept getDept()
    {
        return dept;
    }
    public void setDept(SysDept dept)
    {
        this.dept = dept;
    }
    public List<SysRole> getRoles()
    {
        return roles;
    }
    public void setRoles(List<SysRole> roles)
    {
        this.roles = roles;
    }
    public Long[] getRoleIds()
    {
        return roleIds;
    }
    public void setRoleIds(Long[] roleIds)
    {
        this.roleIds = roleIds;
    }
    public Long[] getPostIds()
    {
        return postIds;
    }
    public void setPostIds(Long[] postIds)
    {
        this.postIds = postIds;
    }
    public Long getRoleId()
    {
        return roleId;
    }
    public void setRoleId(Long roleId)
    {
        this.roleId = roleId;
    }
    public Long getAppUserId() {
        return appUserId;
    }
    public void setAppUserId(Long appUserId) {
        this.appUserId = appUserId;
    }
    public void setRoleNames(List<String> roleNames) {
        this.roleNames = roleNames;
    }
    public String getForbiddenRemark() {
        return forbiddenRemark;
    }
    public void setForbiddenRemark(String forbiddenRemark) {
        this.forbiddenRemark = forbiddenRemark;
    }
    public List<String> getRoleNames() {
        return roleNames;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("userId", getUserId())
            .append("deptId", getDeptId())
            .append("userName", getUserName())
            .append("nickName", getNickName())
            .append("email", getEmail())
            .append("phonenumber", getPhonenumber())
            .append("sex", getSex())
            .append("avatar", getAvatar())
            .append("password", getPassword())
            .append("status", getStatus())
            .append("delFlag", getDelFlag())
            .append("loginIp", getLoginIp())
            .append("loginDate", getLoginDate())
            .append("createBy", getCreateBy())
            .append("createTime", getCreateTime())
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .append("dept", getDept())
            .toString();
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteFileFallbackFactory.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.RemoteFileService;
import com.ruoyi.system.api.domain.SysFile;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
/**
 * 文件服务降级处理
 *
 * @author ruoyi
 */
@Component
public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileService>
{
    private static final Logger log = LoggerFactory.getLogger(RemoteFileFallbackFactory.class);
    @Override
    public RemoteFileService create(Throwable throwable)
    {
        log.error("文件服务调用失败:{}", throwable.getMessage());
        return new RemoteFileService()
        {
            @Override
            public R<SysFile> upload(MultipartFile file)
            {
                return R.fail("上传文件失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteLogFallbackFactory.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.RemoteLogService;
import com.ruoyi.system.api.domain.SysOperLog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
 * 日志服务降级处理
 *
 * @author ruoyi
 */
@Component
public class RemoteLogFallbackFactory implements FallbackFactory<RemoteLogService>
{
    private static final Logger log = LoggerFactory.getLogger(RemoteLogFallbackFactory.class);
    @Override
    public RemoteLogService create(Throwable throwable) {
        log.error("日志服务调用失败:{}", throwable.getMessage());
        return new RemoteLogService()
        {
            @Override
            public R<Boolean> saveLog(SysOperLog sysOperLog, String source)
            {
                return null;
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteUserFallbackFactory.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
 * 用户服务降级处理
 *
 * @author ruoyi
 */
@Component
public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
{
    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
    @Override
    public RemoteUserService create(Throwable throwable)
    {
        log.error("用户服务调用失败:{}", throwable.getMessage());
        return new RemoteUserService()
        {
            @Override
            public R<LoginUser> getUserInfo(String username, String source)
            {
                return R.fail("获取用户失败:" + throwable.getMessage());
            }
            @Override
            public R<LoginUser> infoShop(String username, String source)
            {
                return R.fail("门店登录获取用户失败:" + throwable.getMessage());
            }
            @Override
            public R<Boolean> registerUserInfo(SysUser sysUser, String source)
            {
                return R.fail("注册用户失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysLoginLogFallbackFactory.java
New file
@@ -0,0 +1,22 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysLoginLog;
import com.ruoyi.system.api.feignClient.SysLoginLogClient;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class SysLoginLogFallbackFactory implements FallbackFactory<SysLoginLogClient> {
    @Override
    public SysLoginLogClient create(Throwable cause) {
        return new SysLoginLogClient(){
            @Override
            public R saveLoginLog(SysLoginLog loginLog) {
                return R.fail("添加登录日志失败!" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysRoleFallbackFactory.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.feignClient.SysRoleClient;
import com.ruoyi.system.api.model.GetSysRoleByIds;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author Pu Zhibing
 */
@Component
public class SysRoleFallbackFactory implements FallbackFactory<SysRoleClient> {
    @Override
    public SysRoleClient create(Throwable cause) {
        return new SysRoleClient(){
            @Override
            public R<List<SysRole>> getSysRoleByIds(GetSysRoleByIds ids) {
                return R.fail("获取角色失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
New file
@@ -0,0 +1,99 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class SysUserFallbackFactory implements FallbackFactory<SysUserClient> {
    @Override
    public SysUserClient create(Throwable cause) {
        return new SysUserClient(){
            @Override
            public R<SysUser> getSysUser(Long userId) {
                System.out.println(cause.getMessage());
                return R.fail("获取用户失败:" + cause.getMessage());
            }
            @Override
            public R<Boolean> updateSysUser(SysUser sysUser) {
                return R.fail("更新用户失败:" + cause.getMessage());
            }
            @Override
            public R<List<SysUser>> getUserList(List<Integer> userIds) {
                return R.fail("通过用户id集合查询用户失败:" + cause.getMessage());
            }
            @Override
            public R<Integer> isAdmin(Long userId) {
                return R.fail("获取角色信息失败:" + cause.getMessage());
            }
            @Override
            public R<Boolean> updateUser(SysUser sysUser) {
                return R.fail("修改用户信息失败:" + cause.getMessage());
            }
            @Override
            public R<SysRole> queryRoleByUserId(Long userId) {
                return R.fail("通过用户id查询角色对象失败:" + cause.getMessage());
            }
            @Override
            public R<SysRole> queryRoleByRoleId(Long roleId) {
                return R.fail("通过角色id查询角色对象失败:" + cause.getMessage());
            }
            @Override
            public R<List<SysUser>> queryUserByPhoneList(List<String> phoneList) {
                return R.fail("通过手机号集合查询用户失败:" + cause.getMessage());
            }
            @Override
            public R<SysUser> queryUserByPhone(String phone) {
                return R.fail("通过手机号查询用户失败:" + cause.getMessage());
            }
            @Override
            public R<SysUser> queryUserByUserName(String userName) {
                return R.fail("通过账号查询用户失败:" + cause.getMessage());
            }
            @Override
            public R<SysUser> queryUserByUserNameAndRoleType(String userName, Integer roleType) {
                return R.fail("通过账号和账号权限查询用户失败:" + cause.getMessage());
            }
            @Override
            public R addSysUser(SysUser user) {
                return R.fail("添加用户失败:" + cause.getMessage());
            }
            @Override
            public R resetPassword(SysUser user) {
                return R.fail("重置用户密码失败:" + cause.getMessage());
            }
            @Override
            public R saveShopUser(SysUser user) {
                return R.fail("新增加门店员工账号数据失败:" + cause.getMessage());
            }
            @Override
            public R delShopUser(Integer objectId, Integer roleType) {
                return R.fail("删除门店管理员账号失败:" + cause.getMessage());
            }
            @Override
            public R delSysUserById(Long userId) {
                return R.fail("根据id删除管理员账户失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.feignClient.SysUserRoleClient;
import com.ruoyi.system.api.model.SysUserRoleVo;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class SysUserRoleFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<SysUserRoleClient> {
    @Override
    public SysUserRoleClient create(Throwable cause) {
        return new SysUserRoleClient(){
            @Override
            public R<List<SysUserRoleVo>> getRoleByUserId(Long userId) {
                return R.fail("根据用户id获取角色失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/UserShopClientFallbackFactory.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.feignClient.UserShopClient;
import com.ruoyi.system.api.model.UserShop;
import java.util.List;
/**
 * @author zhibing.pu
 * @date 2025/1/2 18:02
 */
public class UserShopClientFallbackFactory  implements org.springframework.cloud.openfeign.FallbackFactory<UserShopClient> {
    @Override
    public UserShopClient create(Throwable cause) {
        return new UserShopClient(){
            @Override
            public R<List<UserShop>> getUserShop(UserShop userShop) {
                return R.fail("获取用户门店关系数据失败:" + cause.getMessage());
            }
            @Override
            public R saveUserShop(UserShop userShop) {
                return R.fail("保存门店用户关系数据失败:" + cause.getMessage());
            }
            @Override
            public R delUserShop(UserShop userShop) {
                return R.fail("删除后台账号和门店关系数据失败:" + cause.getMessage());
            }
            @Override
            public R delShopAllUserShop(Integer shopId) {
                return R.fail("删除门店所有后台账号和门店关系数据失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysLoginLogClient.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.system.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysLoginLog;
import com.ruoyi.system.api.factory.SysLoginLogFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * @author zhibing.pu
 * @Date 2024/8/12 16:30
 */
@FeignClient(contextId = "SysLoginLogClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysLoginLogFallbackFactory.class)
public interface SysLoginLogClient {
    /**
     * 添加登陆日志
     * @param loginLog
     * @return
     */
    @PostMapping("/sysLoginLog/saveLoginLog")
    R saveLoginLog(@RequestBody SysLoginLog loginLog);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysRoleClient.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.factory.SysRoleFallbackFactory;
import com.ruoyi.system.api.model.GetSysRoleByIds;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/8/7 15:14
 */
@FeignClient(contextId = "SysRoleClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysRoleFallbackFactory.class)
public interface SysRoleClient {
    @PostMapping("/role/getSysRoleByIds")
    public R<List<SysRole>> getSysRoleByIds(GetSysRoleByIds ids);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
New file
@@ -0,0 +1,126 @@
package com.ruoyi.system.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.factory.SysUserFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient(contextId = "sysUserClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserFallbackFactory.class)
public interface SysUserClient {
    @PostMapping("/user/getSysUser")
    R<SysUser> getSysUser(@RequestParam("userId")Long userId);
    @PostMapping("/user/updateSysUser")
    R<Boolean>  updateSysUser(@RequestBody SysUser sysUser);
    @PostMapping("/user/getUserList")
    R<List<SysUser>> getUserList(@RequestBody List<Integer> userIds);
    @PostMapping("/user/isAdmin")
    R<Integer> isAdmin(Long userId);
    @PostMapping("/user/updateUser")
    R<Boolean>  updateUser(@RequestBody SysUser sysUser);
    /**
     * 通过用户id查询角色对象
     * @param userId
     * @return
     */
    @PostMapping("/user/queryRoleByUserId/{userId}")
    R<SysRole>  queryRoleByUserId(@PathVariable("userId") Long userId);
    /**
     * 通过角色id查询角色对象
     * @param roleId
     * @return
     */
    @PostMapping("/user/queryRoleByRoleId/{roleId}")
    R<SysRole>  queryRoleByRoleId(@PathVariable("roleId") Long roleId);
    /**
     * 通过手机号集合查询用户
     * @param phoneList
     * @return
     */
    @PostMapping("/user/queryUserByPhoneList")
    R<List<SysUser>>  queryUserByPhoneList(@RequestBody List<String> phoneList);
    /**
     * 通过手机号查询用户
     * @param phone
     * @return
     */
    @PostMapping("/user/queryUserByPhone")
    R<SysUser>  queryUserByPhone(@RequestBody String phone);
    /**
     * 通过账号查询用户
     * @param userName
     * @return
     */
    @PostMapping("/user/queryUserByUserName")
    R<SysUser>  queryUserByUserName(@RequestBody String userName);
    /**
     * 通过账号和账号权限查询用户
     * @param userName
     * @return
     */
    @PostMapping("/user/queryUserByUserNameAndRoleType")
    R<SysUser>  queryUserByUserNameAndRoleType(@RequestParam("userName") String userName, @RequestParam("roleType") Integer roleType);
    /**
     * 新增加用户信息
     * @param user
     */
    @PostMapping("/user/addSysUser")
    R<Long> addSysUser(@RequestBody SysUser user);
    /**
     * 重置密码
     * @param user
     * @return
     */
    @PostMapping("/user/resetPassword")
    R resetPassword(@RequestBody SysUser user);
    /**
     * 新增加门店员工账号数据
     * @param user
     * @return
     */
    @PostMapping("/user/saveShopUser")
    R<Long> saveShopUser(@RequestBody SysUser user);
    /**
     * 删除门店所有管理员账号
     * @param objectId
     * @param roleType
     * @return
     */
    @PostMapping("/user/user/delShopUser")
    R delShopUser(@RequestParam("objectId") Integer objectId, @RequestParam("roleType") Integer roleType);
    /**
     * 根据id删除管理员账户
     * @param userId
     * @return
     */
    @PostMapping("/user/delSysUserById")
    R delSysUserById(@RequestParam("userId") Long userId);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.factory.SysUserRoleFallbackFactory;
import com.ruoyi.system.api.model.SysUserRoleVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
 * @date 2024/9/4 9:49
 */
@FeignClient(contextId = "SysUserRoleClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserRoleFallbackFactory.class)
public interface SysUserRoleClient {
    /**
     * 根据用户id获取角色
     * @param userId
     * @return
     */
    @PostMapping("/userRole/getRoleByUserId")
    R<List<SysUserRoleVo>> getRoleByUserId(@RequestParam("userId") Long userId);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/UserShopClient.java
New file
@@ -0,0 +1,54 @@
package com.ruoyi.system.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.factory.UserShopClientFallbackFactory;
import com.ruoyi.system.api.model.UserShop;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
 * @date 2025/1/2 18:02
 */
@FeignClient(contextId = "UserShopClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = UserShopClientFallbackFactory.class)
public interface UserShopClient {
    /**
     * 获取用户门店关系数据
     * @param userShop
     * @return
     */
    @PostMapping("/userShop/getUserShop")
    R<List<UserShop>> getUserShop(@RequestBody UserShop userShop);
    /**
     * 保存门店用户关系数据
     * @param userShop
     * @return
     */
    @PostMapping("/userShop/saveUserShop")
    R saveUserShop(@RequestBody UserShop userShop);
    /**
     * 删除后台账号和门店关系数据
     * @param userShop
     * @return
     */
    @PostMapping("/userShop/delUserShop")
    R delUserShop(@RequestBody UserShop userShop);
    /**
     * 删除门店所有后台账号和门店关系数据
     * @param shopId
     * @return
     */
    @PostMapping("/userShop/delShopAllUserShop")
    R delShopAllUserShop(@RequestParam("shopId") Integer shopId);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanyAddSysUserDto.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.system.api.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class CompanyAddSysUserDto {
    List<CompanyUserListVo> list;
    @ApiModelProperty("公司id")
    private Integer companyId;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanySysUserReq.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.api.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanySysUserReq {
    private Integer companyId;
    private String name;
    private List<Integer> userIds;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/CompanyUserListVo.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.system.api.model;
import lombok.Data;
@Data
public class CompanyUserListVo {
    private Long id;
    private String userName;
    private String phoneNumber;
    private String password;
    private String nickName;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/GetSysRoleByIds.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.api.model;
import lombok.Data;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/8/7 15:06
 */
@Data
public class GetSysRoleByIds {
    /**
     * ids
     */
    private List<Integer> ids;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java
New file
@@ -0,0 +1,151 @@
package com.ruoyi.system.api.model;
import com.ruoyi.system.api.domain.SysUser;
import java.io.Serializable;
import java.util.Set;
/**
 * 用户信息
 *
 * @author ruoyi
 */
public class LoginUser implements Serializable
{
    private static final long serialVersionUID = 1L;
    /**
     * 用户唯一标识
     */
    private String token;
    /**
     * 用户名id
     */
    private Long userid;
    /**
     * 用户名
     */
    private String username;
    /**
     * 登录时间
     */
    private Long loginTime;
    /**
     * 过期时间
     */
    private Long expireTime;
    /**
     * 登录IP地址
     */
    private String ipaddr;
    /**
     * 权限列表
     */
    private Set<String> permissions;
    /**
     * 角色列表
     */
    private Set<String> roles;
    /**
     * 用户信息
     */
    private SysUser sysUser;
    public String getToken()
    {
        return token;
    }
    public void setToken(String token)
    {
        this.token = token;
    }
    public Long getUserid()
    {
        return userid;
    }
    public void setUserid(Long userid)
    {
        this.userid = userid;
    }
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public Long getLoginTime()
    {
        return loginTime;
    }
    public void setLoginTime(Long loginTime)
    {
        this.loginTime = loginTime;
    }
    public Long getExpireTime()
    {
        return expireTime;
    }
    public void setExpireTime(Long expireTime)
    {
        this.expireTime = expireTime;
    }
    public String getIpaddr()
    {
        return ipaddr;
    }
    public void setIpaddr(String ipaddr)
    {
        this.ipaddr = ipaddr;
    }
    public Set<String> getPermissions()
    {
        return permissions;
    }
    public void setPermissions(Set<String> permissions)
    {
        this.permissions = permissions;
    }
    public Set<String> getRoles()
    {
        return roles;
    }
    public void setRoles(Set<String> roles)
    {
        this.roles = roles;
    }
    public SysUser getSysUser()
    {
        return sysUser;
    }
    public void setSysUser(SysUser sysUser)
    {
        this.sysUser = sysUser;
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java
New file
@@ -0,0 +1,57 @@
package com.ruoyi.system.api.model;
import lombok.Data;
import java.io.Serializable;
/**
 * 用户信息 小程序登录使用
 *
 * @author 无关风月
 */
@Data
public class LoginUserApplet implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 用户唯一标识
     */
    private String token;
    /**
     * 用户姓名
     */
    private String name;
    /**
     * 用户名id
     */
    private Long userId;
    private String userIdStr;
    /**
     * 用户手机号
     */
    private String phone;
    /**
     * 登录时间
     */
    private Long loginTime;
    /**
     * 过期时间
     */
    private Long expireTime;
    /**
     * 登录IP地址
     */
    private String ipaddr;
    /**
     * 头像
     */
    private String avatar;
    /**
     * 地址
     */
    private String address;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleDTO.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.system.api.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "自动关联修理厂角色DTO")
public class SysUserRoleDTO implements Serializable {
    @ApiModelProperty(value = "用户id")
    private Long userId;
    @ApiModelProperty(value = "角色id")
    private Long roleId;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.system.api.model;
import com.baomidou.mybatisplus.annotation.TableField;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
 * 用户和角色关联 sys_user_role
 *
 * @author ruoyi
 */
public class SysUserRoleVo
{
    /** 用户ID */
    @TableField("user_id")
    private Long userId;
    /** 角色ID */
    @TableField("role_id")
    private Long roleId;
    public Long getUserId()
    {
        return userId;
    }
    public void setUserId(Long userId)
    {
        this.userId = userId;
    }
    public Long getRoleId()
    {
        return roleId;
    }
    public void setRoleId(Long roleId)
    {
        this.roleId = roleId;
    }
    @Override
    public String toString() {
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
            .append("userId", getUserId())
            .append("roleId", getRoleId())
            .toString();
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TAppUserLoginInfo.java
New file
@@ -0,0 +1,77 @@
package com.ruoyi.system.api.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.web.domain.BasePojo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-08-06
 */
@Data
public class TAppUserLoginInfo extends BasePojo {
    private static final long serialVersionUID = 1L;
    private Long id;
    @ApiModelProperty(value = "用户")
    private String name;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "头像")
    private String avatar;
    @ApiModelProperty(value = "会员id")
    private Integer vipId;
    @ApiModelProperty(value = "会员到期时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime vipEndTime;
    @ApiModelProperty(value = "单位id")
    private Integer companyId;
    @ApiModelProperty(value = "身份证号")
    private String idCard;
    @ApiModelProperty(value = "认证状态(0=否,1=是)")
    private Integer authStatus;
    @ApiModelProperty(value = "微信openid")
    private String wxOpenid;
    @ApiModelProperty(value = "支付宝openid")
    private String aliOpenid;
    @ApiModelProperty(value = "积分")
    private Integer points;
    @ApiModelProperty(value = "省名称")
    private String province;
    @ApiModelProperty(value = "省区划代码")
    private String provinceCode;
    @ApiModelProperty(value = "市名称")
    private String city;
    @ApiModelProperty(value = "市区划代码")
    private String cityCode;
    @ApiModelProperty(value = "状态(1=正常,2=冻结,3=注销)")
    private Integer status;
    @ApiModelProperty(value = "最后一次登录时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime lastLoginTime;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TRepairShopAdd.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.api.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class TRepairShopAdd {
    @ApiModelProperty("账号")
    @NotBlank(message = "账号不能为空")
    private String phonenumber;
    @ApiModelProperty("密码")
    @NotBlank(message = "密码不能为空")
    private String pwd;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/TRepairShopAddDto.java
New file
@@ -0,0 +1,14 @@
package com.ruoyi.system.api.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class TRepairShopAddDto {
    private List<TRepairShopAdd> list;
    @ApiModelProperty("修理场id")
    @NotNull(message = "修理厂id不能为空")
    private Integer repairId;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/UserShop.java
New file
@@ -0,0 +1,56 @@
package com.ruoyi.system.api.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.annotation.Excel;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
/**
 * @author zhibing.pu
 * @Date 2024/12/2 9:36
 */
@Data
@TableName("t_user_shop")
public class UserShop {
    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * 用户id
     */
    @TableField("user_id")
    private Long userId;
    /**
     * 门店id
     */
    @TableField("shop_id")
    private Integer shopId;
    /**
     * 角色类型(1=店长,2=店员)
     */
    @TableField("role_type")
    private Integer roleType;
    /**
     * 角色id
     */
    @TableField("role_id")
    private Long roleId;
    /** 部门ID */
    @TableField("dept_id")
    private Long deptId;
    /** 用户昵称 */
    @TableField("nick_name")
    private String nickName;
    @TableField("create_time")
    private LocalDateTime createTime;
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/query/ChangeUserQuery.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.system.api.query;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "用户选择列表Query")
public class ChangeUserQuery extends BasePage {
    @ApiModelProperty(value = "用户名称")
    private String nickName;
    private Integer objectId;
}
ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
New file
@@ -0,0 +1,8 @@
com.ruoyi.system.api.factory.RemoteUserFallbackFactory
com.ruoyi.system.api.factory.RemoteLogFallbackFactory
com.ruoyi.system.api.factory.RemoteFileFallbackFactory
com.ruoyi.system.api.factory.SysUserFallbackFactory
com.ruoyi.system.api.factory.SysRoleFallbackFactory
com.ruoyi.system.api.factory.SysLoginLogFallbackFactory
com.ruoyi.system.api.factory.SysUserRoleFallbackFactory
com.ruoyi.system.api.factory.UserShopClientFallbackFactory
ruoyi-auth/pom.xml
New file
@@ -0,0 +1,110 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-auth</artifactId>
    <description>
        ruoyi-auth认证授权中心
    </description>
    <properties>
        <druid.version>1.1.13</druid.version>
        <hutool.version>5.3.8</hutool.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-other</artifactId>
        </dependency>
        <!-- SpringCloud Alibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- SpringCloud Alibaba Nacos Config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- SpringCloud Alibaba Sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!-- SpringBoot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot Actuator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- RuoYi Common Security-->
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common-security</artifactId>
        </dependency>
        <!-- 引入Druid依赖,阿里巴巴所提供的数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- hutool工具类-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>${hutool.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-crypto</artifactId>
            <version>${hutool.version}</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
ruoyi-auth/src/main/java/com/ruoyi/auth/RuoYiAuthApplication.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.auth;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import com.ruoyi.common.security.annotation.EnableRyFeignClients;
/**
 * 认证授权中心
 *
 * @author ruoyi
 */
@EnableRyFeignClients
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class RuoYiAuthApplication
{
    public static void main(String[] args)
    {
        try {
            SpringApplication.run(RuoYiAuthApplication.class, args);
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("(♥◠‿◠)ノ゙  认证授权中心启动成功   ლ(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
    }
}
ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
New file
@@ -0,0 +1,121 @@
package com.ruoyi.auth.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.system.api.domain.SysRole;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.auth.form.LoginBody;
import com.ruoyi.auth.form.RegisterBody;
import com.ruoyi.auth.service.SysLoginService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.JwtUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.security.auth.AuthUtil;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.model.LoginUser;
import java.util.*;
/**
 * token 控制
 *
 * @author ruoyi
 */
@Slf4j
@RestController
public class TokenController {
    @Autowired
    private TokenService tokenService;
    @Autowired
    private SysLoginService sysLoginService;
    @Resource
    private SysUserClient userClient;
    @PostMapping("login")
    public R<?> login(@RequestBody LoginBody form, HttpServletRequest request) {
        // 用户登录
        LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), request);
        HashMap<String, Object> map = new HashMap<>();
        map.put("token", tokenService.createToken(userInfo));
        List<SysRole> roles = userInfo.getSysUser().getRoles();
        if(CollectionUtils.isEmpty(roles)){
            return R.fail("请关联角色!");
        }
        map.put("roleName",roles.get(0).getRoleName());
        map.put("info", userInfo);
        // 修改用户最后登录时间
        SysUser sysUser = new SysUser();
        sysUser.setUserId(userInfo.getSysUser().getUserId());
        sysUser.setLoginDate(new Date());
        System.out.println("修改用户登录时间" + sysUser);
        userClient.updateSysUser(sysUser);
        return R.ok(map);
    }
    @PostMapping("loginShop")
    public R<?> loginShop(@RequestBody LoginBody form, HttpServletRequest request) {
        // 用户登录
        LoginUser userInfo = sysLoginService.loginShop(form.getUsername(), form.getPassword(), request);
        HashMap<String, Object> map = new HashMap<>();
        map.put("token", tokenService.createToken(userInfo));
        List<SysRole> roles = userInfo.getSysUser().getRoles();
        if(CollectionUtils.isEmpty(roles)){
            return R.fail("请关联角色!");
        }
        map.put("roleName",roles.get(0).getRoleName());
        map.put("info", userInfo);
        // 修改用户最后登录时间
        SysUser sysUser = new SysUser();
        sysUser.setUserId(userInfo.getSysUser().getUserId());
        sysUser.setLoginDate(new Date());
        System.out.println("修改用户登录时间" + sysUser);
        userClient.updateSysUser(sysUser);
        return R.ok(map);
    }
    @DeleteMapping("logout")
    public R<?> logout(HttpServletRequest request) {
        String token = SecurityUtils.getToken(request);
        if (StringUtils.isNotEmpty(token)) {
            String username = JwtUtils.getUserName(token);
            // 删除用户缓存记录
            AuthUtil.logoutByToken(token);
            // 记录用户退出日志
            sysLoginService.logout(username, request);
        }
        return R.ok();
    }
    @PostMapping("refresh")
    public R<?> refresh(HttpServletRequest request) {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser)) {
            // 刷新令牌有效期
            tokenService.refreshToken(loginUser);
            return R.ok();
        }
        return R.ok();
    }
    @PostMapping("register")
    public R<?> register(@RequestBody RegisterBody registerBody, HttpServletRequest request) {
        // 用户注册
        sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request);
        return R.ok();
    }
}
ruoyi-auth/src/main/java/com/ruoyi/auth/form/LoginBody.java
New file
@@ -0,0 +1,51 @@
package com.ruoyi.auth.form;
/**
 * 用户登录对象
 *
 * @author ruoyi
 */
public class LoginBody
{
    /**
     * 用户名
     */
    private String username;
    /**
     * 用户密码
     */
    private String password;
    /**
     * 登录平台类型(1=平台,2=门店)
     */
    private Integer roleType;
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
    public Integer getRoleType() {
        return roleType;
    }
    public void setRoleType(Integer roleType) {
        this.roleType = roleType;
    }
}
ruoyi-auth/src/main/java/com/ruoyi/auth/form/RegisterBody.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.auth.form;
/**
 * 用户注册对象
 *
 * @author ruoyi
 */
public class RegisterBody extends LoginBody
{
}
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
New file
@@ -0,0 +1,200 @@
package com.ruoyi.auth.service;
import com.ruoyi.other.api.domain.Shop;
import com.ruoyi.other.api.feignClient.ShopClient;
import com.ruoyi.system.api.RemoteUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.UserConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.enums.UserStatus;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.ip.IpUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
/**
 * 登录校验方法
 *
 * @author ruoyi
 */
@Component
public class SysLoginService {
    @Resource
    private RemoteUserService remoteUserService;
    @Resource
    private SysPasswordService passwordService;
    @Resource
    private SysRecordLogService recordLogService;
    @Resource
    private RedisService redisService;
    @Resource
    private ShopClient shopClient;
    /**
     * 登录
     */
    public LoginUser login(String username, String password, HttpServletRequest request) {
        username = username.trim();
        // 查询用户信息
        R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
            recordLogService.recordLogininfor(request, null, username, Constants.LOGIN_FAIL_STATUS, "登录用户不存在");
            throw new ServiceException("登录用户:" + username + " 不存在");
        }
        LoginUser userInfo = userResult.getData();
        SysUser user = userResult.getData().getSysUser();
        // 用户名或密码为空 错误
        if (StringUtils.isAnyBlank(username, password)) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户/密码必须填写");
            throw new ServiceException("用户/密码必须填写");
        }
        // 密码如果不在指定范围内 错误
        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户密码不在指定范围");
            throw new ServiceException("用户密码不在指定范围");
        }
        // 用户名不在指定范围内 错误
        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户名不在指定范围");
            throw new ServiceException("用户名不在指定范围");
        }
        // IP黑名单校验
        String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "很遗憾,访问IP已被列入系统黑名单");
            throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
        }
        if (R.FAIL == userResult.getCode()) {
            throw new ServiceException(userResult.getMsg());
        }
        if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "对不起,您的账号已被删除");
            throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
        }
        if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户已停用,请联系管理员");
            throw new ServiceException("您所属门店已被冻结,请联系平台");
        }
        if (user.getRoleType()==2){
            Shop data = shopClient.getShopById(user.getObjectId()).getData();
            if (data==null){
                throw new ServiceException("门店不存在");
            }else{
                if (data.getStatus()==2){
                    throw new ServiceException("您所属门店已被冻结,请联系平台");
                }
            }
        }
        passwordService.validate(user, password, request);
        recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_SUCCESS_STATUS, "登录成功");
        return userInfo;
    }
    public LoginUser loginShop(String username, String password, HttpServletRequest request) {
        username = username.trim();
        // 查询用户信息
        R<LoginUser> userResult = remoteUserService.infoShop(username, SecurityConstants.INNER);
        if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
            recordLogService.recordLogininfor(request, null, username, Constants.LOGIN_FAIL_STATUS, "登录用户不存在");
            throw new ServiceException("登录用户:" + username + " 不存在");
        }
        LoginUser userInfo = userResult.getData();
        SysUser user = userResult.getData().getSysUser();
        // 用户名或密码为空 错误
        if (StringUtils.isAnyBlank(username, password)) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户/密码必须填写");
            throw new ServiceException("用户/密码必须填写");
        }
        // 密码如果不在指定范围内 错误
        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户密码不在指定范围");
            throw new ServiceException("用户密码不在指定范围");
        }
        // 用户名不在指定范围内 错误
        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户名不在指定范围");
            throw new ServiceException("用户名不在指定范围");
        }
        // IP黑名单校验
        String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
        if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "很遗憾,访问IP已被列入系统黑名单");
            throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
        }
        if (R.FAIL == userResult.getCode()) {
            throw new ServiceException(userResult.getMsg());
        }
        if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "对不起,您的账号已被删除");
            throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
        }
        if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, "用户已停用,请联系管理员");
//            throw new ServiceException("对不起,您的账号:" + username + " 已停用");
            throw new ServiceException("您的账号已被禁用,请联系平台");
        }
        passwordService.validate(user, password, request);
        recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_SUCCESS_STATUS, "登录成功");
        return userInfo;
    }
    public void logout(String loginName, HttpServletRequest request) {
        recordLogService.recordLogininfor(request, null, loginName, Constants.LOGIN_SUCCESS_STATUS, "退出成功");
    }
    /**
     * 注册
     */
    public void register(String username, String password, HttpServletRequest request) {
        // 用户名或密码为空 错误
        if (StringUtils.isAnyBlank(username, password)) {
            throw new ServiceException("用户/密码必须填写");
        }
        if (username.length() < UserConstants.USERNAME_MIN_LENGTH
                || username.length() > UserConstants.USERNAME_MAX_LENGTH) {
            throw new ServiceException("账户长度必须在2到20个字符之间");
        }
        if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
                || password.length() > UserConstants.PASSWORD_MAX_LENGTH) {
            throw new ServiceException("密码长度必须在5到20个字符之间");
        }
        // 注册用户信息
        SysUser sysUser = new SysUser();
        sysUser.setUserName(username);
        sysUser.setNickName(username);
        sysUser.setPassword(SecurityUtils.encryptPassword(password));
        R<?> registerResult = remoteUserService.registerUserInfo(sysUser, SecurityConstants.INNER);
        if (R.FAIL == registerResult.getCode()) {
            throw new ServiceException(registerResult.getMsg());
        }
        recordLogService.recordLogininfor(request, sysUser.getUserId().intValue(), username, Constants.LOGIN_SUCCESS_STATUS, "注册成功");
    }
}
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysPasswordService.java
New file
@@ -0,0 +1,82 @@
package com.ruoyi.auth.service;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ruoyi.common.core.constant.CacheConstants;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.domain.SysUser;
import javax.servlet.http.HttpServletRequest;
/**
 * 登录密码方法
 *
 * @author ruoyi
 */
@Component
public class SysPasswordService
{
    @Autowired
    private RedisService redisService;
    private int maxRetryCount = CacheConstants.PASSWORD_MAX_RETRY_COUNT;
    private Long lockTime = CacheConstants.PASSWORD_LOCK_TIME;
    @Autowired
    private SysRecordLogService recordLogService;
    /**
     * 登录账户密码错误次数缓存键名
     *
     * @param username 用户名
     * @return 缓存键key
     */
    private String getCacheKey(String username)
    {
        return CacheConstants.PWD_ERR_CNT_KEY + username;
    }
    public void validate(SysUser user, String password, HttpServletRequest request) {
        String username = user.getUserName();
        Integer retryCount = redisService.getCacheObject(getCacheKey(username));
        if (retryCount == null)
        {
            retryCount = 0;
        }
        if (retryCount >= Integer.valueOf(maxRetryCount).intValue())
        {
            String errMsg = String.format("密码输入错误%s次,帐户锁定%s分钟", maxRetryCount, lockTime);
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS,errMsg);
            throw new ServiceException(errMsg);
        }
        if (!matches(user,password)){
            retryCount = retryCount + 1;
            recordLogService.recordLogininfor(request, user.getUserId().intValue(), username, Constants.LOGIN_FAIL_STATUS, String.format("密码输入错误%s次", retryCount));
            redisService.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES);
            throw new ServiceException("密码错误");
        } else {
            clearLoginRecordCache(username);
        }
    }
    public boolean matches(SysUser user, String rawPassword)
    {
        return SecurityUtils.matchesPassword(rawPassword, user.getPassword());
    }
    public void clearLoginRecordCache(String loginName)
    {
        if (redisService.hasKey(getCacheKey(loginName)))
        {
            redisService.deleteObject(getCacheKey(loginName));
        }
    }
}
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java
New file
@@ -0,0 +1,134 @@
package com.ruoyi.auth.service;
import com.ruoyi.system.api.domain.SysLoginLog;
import com.ruoyi.system.api.feignClient.SysLoginLogClient;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
 * 记录日志方法
 *
 * @author ruoyi
 */
@Component
public class SysRecordLogService {
    @Resource
    private SysLoginLogClient sysLoginLogClient;
    /**
     * 记录登录信息
     *
     * @param username 用户名
     * @param status   状态
     * @param message  消息内容
     * @return
     */
    public void recordLogininfor(HttpServletRequest request, Integer userId, String username, String status, String message) {
        Map<String, String> headerData = getHeaderData(request);
        //添加登录日志
        SysLoginLog loginLog = new SysLoginLog();
        loginLog.setUserId(userId);
        loginLog.setUsername(username);
        loginLog.setIpAddress(headerData.get("ip"));
        loginLog.setAddress("");
        loginLog.setBrowserType(headerData.get("browser"));
        loginLog.setOperatingSystem(headerData.get("os"));
        loginLog.setLoginTime(LocalDateTime.now());
        loginLog.setLoginStatus(Integer.valueOf(status));
        loginLog.setMessage(message);
        sysLoginLogClient.saveLoginLog(loginLog);
    }
    public Map<String, String> getHeaderData(HttpServletRequest request) {
        //Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0
        String browserDetails = request.getHeader("User-Agent");
        String userAgent = browserDetails;
        String user = userAgent.toLowerCase();
        Map<String, String> map = new HashMap<>();
        String os = "";
        String browser = "";
        if (userAgent.toLowerCase().indexOf("windows") >= 0) {
            os = "Windows";
        } else if (userAgent.toLowerCase().indexOf("mac") >= 0) {
            os = "Mac";
        } else if (userAgent.toLowerCase().indexOf("x11") >= 0) {
            os = "Unix";
        } else if (userAgent.toLowerCase().indexOf("android") >= 0) {
            os = "Android";
        } else if (userAgent.toLowerCase().indexOf("iphone") >= 0) {
            os = "IPhone";
        } else {
            os = "UnKnown, More-Info: " + userAgent;
        }
        if (user.contains("edge")) {
            browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
        } else if (user.contains("msie")) {
            String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
            browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1];
        } else if (user.contains("safari") && user.contains("version")) {
            browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]
                    + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
        } else if (user.contains("opr") || user.contains("opera")) {
            if (user.contains("opera")) {
                browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]
                        + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
            } else if (user.contains("opr")) {
                browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
                        .replace("OPR", "Opera");
            }
        } else if (user.contains("chrome")) {
            browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
        } else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1) ||
                (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1) ||
                (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1)) {
            browser = "Netscape-?";
        } else if (user.contains("firefox")) {
            browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
        } else if (user.contains("rv")) {
            String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
            browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1);
        } else {
            browser = "UnKnown, More-Info: " + userAgent;
        }
        String ip = request.getHeader("x-forwarded-for");
        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
            // 多次反向代理后会有多个ip值,第一个ip才是真实ip
            if (ip.indexOf(",") != -1) {
                ip = ip.split(",")[0];
            }
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        map.put("os", os);
        map.put("browser", browser);
        map.put("ip", ip);
        return map;
    }
}
ruoyi-auth/src/main/resources/banner.txt
New file
@@ -0,0 +1,10 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}
                            _                        _    _
                           (_)                      | |  | |
 _ __  _   _   ___   _   _  _  ______   __ _  _   _ | |_ | |__
| '__|| | | | / _ \ | | | || ||______| / _` || | | || __|| '_ \
| |   | |_| || (_) || |_| || |        | (_| || |_| || |_ | | | |
|_|    \__,_| \___/  \__, ||_|         \__,_| \__,_| \__||_| |_|
                      __/ |
                     |___/
ruoyi-auth/src/main/resources/logback.xml
New file
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 日志存放路径 -->
    <property name="log.path" value="/mnt/app/ruoyi-auth" />
   <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 系统模块日志级别控制  -->
    <logger name="com.ruoyi" level="info" />
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn" />
    <root level="info">
        <appender-ref ref="console" />
    </root>
    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
</configuration>
ruoyi-common/pom.xml
New file
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <modules>
        <module>ruoyi-common-log</module>
        <module>ruoyi-common-core</module>
        <module>ruoyi-common-redis</module>
        <module>ruoyi-common-swagger</module>
        <module>ruoyi-common-security</module>
        <module>ruoyi-common-datascope</module>
        <module>ruoyi-common-datasource</module>
    </modules>
    <artifactId>ruoyi-common</artifactId>
    <packaging>pom</packaging>
    <description>
        ruoyi-common通用模块
    </description>
    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.1</version>
        </dependency>
    </dependencies>
</project>
ruoyi-common/ruoyi-common-core/pom.xml
New file
@@ -0,0 +1,152 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.ruoyi</groupId>
        <artifactId>ruoyi-common</artifactId>
        <version>3.6.2</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>ruoyi-common-core</artifactId>
    <description>
        ruoyi-common-core核心模块
    </description>
    <dependencies>
        <!-- SpringCloud Openfeign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- SpringCloud Loadbalancer -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!-- Spring Context Support -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <!-- Spring Web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <!-- Transmittable ThreadLocal -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>transmittable-thread-local</artifactId>
        </dependency>
        <!-- Pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>
        <!-- Hibernate Validator -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <!-- Jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <!-- Alibaba Fastjson -->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
        </dependency>
        <!-- Jwt -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </dependency>
        <!-- Jaxb -->
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
        </dependency>
        <!-- Apache Lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <!-- Commons Io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        <!-- excel工具 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>
        <!-- Java Servlet -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <!-- Swagger -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--华为云的obs-->
        <dependency>
            <groupId>com.huaweicloud</groupId>
            <artifactId>esdk-obs-java</artifactId>
            <version>3.19.5</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.3</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okio</groupId>
            <artifactId>okio</artifactId>
            <version>2.8.0</version>
        </dependency>
        <dependency>
            <groupId>org.gavaghan</groupId>
            <artifactId>geodesy</artifactId>
            <version>1.1.3</version>
        </dependency>
    </dependencies>
</project>
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excel.java
New file
@@ -0,0 +1,182 @@
package com.ruoyi.common.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import com.ruoyi.common.core.utils.poi.ExcelHandlerAdapter;
/**
 * 自定义导出Excel数据注解
 *
 * @author ruoyi
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
    /**
     * 导出时在excel中排序
     */
    public int sort() default Integer.MAX_VALUE;
    /**
     * 导出到Excel中的名字.
     */
    public String name() default "";
    /**
     * 日期格式, 如: yyyy-MM-dd
     */
    public String dateFormat() default "";
    /**
     * 读取内容转表达式 (如: 0=男,1=女,2=未知)
     */
    public String readConverterExp() default "";
    /**
     * 分隔符,读取字符串组内容
     */
    public String separator() default ",";
    /**
     * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
     */
    public int scale() default -1;
    /**
     * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
     */
    public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
    /**
     * 导出时在excel中每个列的高度 单位为字符
     */
    public double height() default 14;
    /**
     * 导出时在excel中每个列的宽 单位为字符
     */
    public double width() default 16;
    /**
     * 文字后缀,如% 90 变成90%
     */
    public String suffix() default "";
    /**
     * 当值为空时,字段的默认值
     */
    public String defaultValue() default "";
    /**
     * 提示信息
     */
    public String prompt() default "";
    /**
     * 设置只能选择不能输入的列内容.
     */
    public String[] combo() default {};
    /**
     * 是否需要纵向合并单元格,应对需求:含有list集合单元格)
     */
    public boolean needMerge() default false;
    /**
     * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
     */
    public boolean isExport() default true;
    /**
     * 另一个类中的属性名称,支持多级获取,以小数点隔开
     */
    public String targetAttr() default "";
    /**
     * 是否自动统计数据,在最后追加一行统计数据总和
     */
    public boolean isStatistics() default false;
    /**
     * 导出类型(0数字 1字符串)
     */
    public ColumnType cellType() default ColumnType.STRING;
    /**
     * 导出列头背景色
     */
    public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
    /**
     * 导出列头字体颜色
     */
    public IndexedColors headerColor() default IndexedColors.WHITE;
    /**
     * 导出单元格背景色
     */
    public IndexedColors backgroundColor() default IndexedColors.WHITE;
    /**
     * 导出单元格字体颜色
     */
    public IndexedColors color() default IndexedColors.BLACK;
    /**
     * 导出字段对齐方式
     */
    public HorizontalAlignment align() default HorizontalAlignment.CENTER;
    /**
     * 自定义数据处理器
     */
    public Class<?> handler() default ExcelHandlerAdapter.class;
    /**
     * 自定义数据处理器参数
     */
    public String[] args() default {};
    /**
     * 字段类型(0:导出导入;1:仅导出;2:仅导入)
     */
    Type type() default Type.ALL;
    public enum Type
    {
        ALL(0), EXPORT(1), IMPORT(2);
        private final int value;
        Type(int value)
        {
            this.value = value;
        }
        public int value()
        {
            return this.value;
        }
    }
    public enum ColumnType
    {
        NUMERIC(0), STRING(1), IMAGE(2);
        private final int value;
        ColumnType(int value)
        {
            this.value = value;
        }
        public int value()
        {
            return this.value;
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/annotation/Excels.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.common.core.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * Excel注解集
 *
 * @author ruoyi
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Excels
{
    Excel[] value();
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/CacheConstants.java
New file
@@ -0,0 +1,60 @@
package com.ruoyi.common.core.constant;
/**
 * 缓存常量信息
 *
 * @author ruoyi
 */
public class CacheConstants
{
    /**
     * 缓存有效期,默认720(分钟)
     */
    public final static long EXPIRATION = 120;
    public final static long EXPIRATION_APPLET = 7*24*60*60;
    /**
     * 缓存刷新时间,默认120(分钟)
     */
    public final static long REFRESH_TIME = 120;
    /**
     * 密码最大错误次数
     */
    public final static int PASSWORD_MAX_RETRY_COUNT = 5;
    /**
     * 密码锁定时间,默认10(分钟)
     */
    public final static long PASSWORD_LOCK_TIME = 10;
    /**
     * 权限缓存前缀
     */
    public final static String LOGIN_TOKEN_KEY = "login_tokens:";
    /**
     * 验证码 redis key
     */
    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
    /**
     * 参数管理 cache key
     */
    public static final String SYS_CONFIG_KEY = "sys_config:";
    /**
     * 字典管理 cache key
     */
    public static final String SYS_DICT_KEY = "sys_dict:";
    /**
     * 登录账户密码错误次数 redis key
     */
    public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
    /**
     * 登录IP黑名单 cache key
     */
    public static final String SYS_LOGIN_BLACKIPLIST = SYS_CONFIG_KEY + "sys.login.blackIPList";
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
New file
@@ -0,0 +1,143 @@
package com.ruoyi.common.core.constant;
/**
 * 通用常量信息
 *
 * @author ruoyi
 */
public class Constants
{
    /**
     * UTF-8 字符集
     */
    public static final String UTF8 = "UTF-8";
    /**
     * GBK 字符集
     */
    public static final String GBK = "GBK";
    /**
     * www主域
     */
    public static final String WWW = "www.";
    /**
     * RMI 远程方法调用
     */
    public static final String LOOKUP_RMI = "rmi:";
    /**
     * LDAP 远程方法调用
     */
    public static final String LOOKUP_LDAP = "ldap:";
    /**
     * LDAPS 远程方法调用
     */
    public static final String LOOKUP_LDAPS = "ldaps:";
    /**
     * http请求
     */
    public static final String HTTP = "http://";
    /**
     * https请求
     */
    public static final String HTTPS = "https://";
    /**
     * 成功标记
     */
    public static final Integer SUCCESS = 200;
    /**
     * 失败标记
     */
    public static final Integer FAIL = 500;
    /**
     * 登录成功状态
     */
    public static final String LOGIN_SUCCESS_STATUS = "1";
    /**
     * 登录失败状态
     */
    public static final String LOGIN_FAIL_STATUS = "2";
    /**
     * 登录成功
     */
    public static final String LOGIN_SUCCESS = "Success";
    /**
     * 注销
     */
    public static final String LOGOUT = "Logout";
    /**
     * 注册
     */
    public static final String REGISTER = "Register";
    /**
     * 登录失败
     */
    public static final String LOGIN_FAIL = "Error";
    /**
     * 当前记录起始索引
     */
    public static final String PAGE_NUM = "pageNum";
    /**
     * 每页显示记录数
     */
    public static final String PAGE_SIZE = "pageSize";
    /**
     * 排序列
     */
    public static final String ORDER_BY_COLUMN = "orderByColumn";
    /**
     * 排序的方向 "desc" 或者 "asc".
     */
    public static final String IS_ASC = "isAsc";
    /**
     * 验证码有效期(分钟)
     */
    public static final long CAPTCHA_EXPIRATION = 2;
    /**
     * 资源映射路径 前缀
     */
    public static final String RESOURCE_PREFIX = "/profile";
    /**
     * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
     */
    public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
    /**
     * 时间格式化
     */
    public static final String DATE_FORMATTER_TIME = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_FORMATTER_DATE = "yyyy-MM-dd";
    /**
     * 修改手机号后缀
     */
    public static final String UPDATE_PHONE = "_updatePhone";
    /**
     * 申请建桩后缀
     */
    public static final String APPLY_CHARGING = "_applyCharging";
    /**
     * 定时任务违规的字符
     */
    public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
            "org.springframework", "org.apache", "com.ruoyi.common.core.utils.file" };
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ExpressCompanyMap.java
New file
@@ -0,0 +1,47 @@
package com.ruoyi.common.core.constant;
import java.util.HashMap;
import java.util.Map;
public class ExpressCompanyMap {
    public static final Map<String, String> EXPRESS_COMPANY_MAP = new HashMap<>();
    static {
        // 初始化快递公司信息
        EXPRESS_COMPANY_MAP.put("shunfeng", "顺丰");
        EXPRESS_COMPANY_MAP.put("zhongtong", "中通");
        EXPRESS_COMPANY_MAP.put("yuantong", "圆通");
        EXPRESS_COMPANY_MAP.put("huitongkuaidi", "汇通快递");
        EXPRESS_COMPANY_MAP.put("shentong", "申通");
        EXPRESS_COMPANY_MAP.put("yunda", "韵达");
        EXPRESS_COMPANY_MAP.put("ems", "EMS");
        EXPRESS_COMPANY_MAP.put("jd", "京东快递");
        EXPRESS_COMPANY_MAP.put("zhaijisong", "宅急送");
        EXPRESS_COMPANY_MAP.put("debangkuaidi", "德邦快递");
        EXPRESS_COMPANY_MAP.put("shansong", "闪送");
        EXPRESS_COMPANY_MAP.put("kfw", "快分网");
    }
    /**
     * 根据编码获取快递公司名称
     *
     * @param code 快递公司编码
     * @return 快递公司名称,如果编码不存在则返回 null
     */
    public static String getCompanyNameByCode(String code) {
        return EXPRESS_COMPANY_MAP.get(code);
    }
    /**
     * 根据快递公司名称获取编码
     */
    public static String getCodeByCompanyName(String companyName) {
        for (Map.Entry<String, String> entry : EXPRESS_COMPANY_MAP.entrySet()) {
            if (entry.getValue().equals(companyName)) {
                return entry.getKey();
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/GenConstants.java
New file
@@ -0,0 +1,117 @@
package com.ruoyi.common.core.constant;
/**
 * 代码生成通用常量
 *
 * @author ruoyi
 */
public class GenConstants
{
    /** 单表(增删改查) */
    public static final String TPL_CRUD = "crud";
    /** 树表(增删改查) */
    public static final String TPL_TREE = "tree";
    /** 主子表(增删改查) */
    public static final String TPL_SUB = "sub";
    /** 树编码字段 */
    public static final String TREE_CODE = "treeCode";
    /** 树父编码字段 */
    public static final String TREE_PARENT_CODE = "treeParentCode";
    /** 树名称字段 */
    public static final String TREE_NAME = "treeName";
    /** 上级菜单ID字段 */
    public static final String PARENT_MENU_ID = "parentMenuId";
    /** 上级菜单名称字段 */
    public static final String PARENT_MENU_NAME = "parentMenuName";
    /** 数据库字符串类型 */
    public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" };
    /** 数据库文本类型 */
    public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" };
    /** 数据库时间类型 */
    public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" };
    /** 数据库数字类型 */
    public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
            "bigint", "float", "double", "decimal" };
    /** 页面不需要编辑字段 */
    public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
    /** 页面不需要显示的列表字段 */
    public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by",
            "update_time" };
    /** 页面不需要查询字段 */
    public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by",
            "update_time", "remark" };
    /** Entity基类字段 */
    public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" };
    /** Tree基类字段 */
    public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors" };
    /** 文本框 */
    public static final String HTML_INPUT = "input";
    /** 文本域 */
    public static final String HTML_TEXTAREA = "textarea";
    /** 下拉框 */
    public static final String HTML_SELECT = "select";
    /** 单选框 */
    public static final String HTML_RADIO = "radio";
    /** 复选框 */
    public static final String HTML_CHECKBOX = "checkbox";
    /** 日期控件 */
    public static final String HTML_DATETIME = "datetime";
    /** 图片上传控件 */
    public static final String HTML_IMAGE_UPLOAD = "imageUpload";
    /** 文件上传控件 */
    public static final String HTML_FILE_UPLOAD = "fileUpload";
    /** 富文本控件 */
    public static final String HTML_EDITOR = "editor";
    /** 字符串类型 */
    public static final String TYPE_STRING = "String";
    /** 整型 */
    public static final String TYPE_INTEGER = "Integer";
    /** 长整型 */
    public static final String TYPE_LONG = "Long";
    /** 浮点型 */
    public static final String TYPE_DOUBLE = "Double";
    /** 高精度计算类型 */
    public static final String TYPE_BIGDECIMAL = "BigDecimal";
    /** 时间类型 */
    public static final String TYPE_DATE = "Date";
    /** 模糊查询 */
    public static final String QUERY_LIKE = "LIKE";
    /** 相等查询 */
    public static final String QUERY_EQ = "EQ";
    /** 需要 */
    public static final String REQUIRE = "1";
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/HttpStatus.java
New file
@@ -0,0 +1,94 @@
package com.ruoyi.common.core.constant;
/**
 * 返回状态码
 *
 * @author ruoyi
 */
public class HttpStatus
{
    /**
     * 操作成功
     */
    public static final int SUCCESS = 200;
    /**
     * 对象创建成功
     */
    public static final int CREATED = 201;
    /**
     * 请求已经被接受
     */
    public static final int ACCEPTED = 202;
    /**
     * 操作已经执行成功,但是没有返回数据
     */
    public static final int NO_CONTENT = 204;
    /**
     * 资源已被移除
     */
    public static final int MOVED_PERM = 301;
    /**
     * 重定向
     */
    public static final int SEE_OTHER = 303;
    /**
     * 资源没有被修改
     */
    public static final int NOT_MODIFIED = 304;
    /**
     * 参数列表错误(缺少,格式不匹配)
     */
    public static final int BAD_REQUEST = 400;
    /**
     * 未授权
     */
    public static final int UNAUTHORIZED = 401;
    /**
     * 访问受限,授权过期
     */
    public static final int FORBIDDEN = 403;
    /**
     * 资源,服务未找到
     */
    public static final int NOT_FOUND = 404;
    /**
     * 不允许的http方法
     */
    public static final int BAD_METHOD = 405;
    /**
     * 资源冲突,或者资源被锁
     */
    public static final int CONFLICT = 409;
    /**
     * 不支持的数据,媒体类型
     */
    public static final int UNSUPPORTED_TYPE = 415;
    /**
     * 系统内部错误
     */
    public static final int ERROR = 500;
    /**
     * 接口未实现
     */
    public static final int NOT_IMPLEMENTED = 501;
    /**
     * 系统警告消息
     */
    public static final int WARN = 601;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/MsgConstants.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.common.core.constant;
/**
 * 短信常量
 *
 * @author ruoyi
 */
public class MsgConstants
{
    /** 短信发送地址 */
    public static final String SEND_URL = "http://112.35.1.155:1992/sms/tmpsubmit";
    /** 更换手机号短信验证码 TEMPLATE_ID */
    public static final String CODE_TEMPLATE_ID = "5bf3949463e54c03a25c6fce3ad48139";
    /** 建桩申请短信验证码 TEMPLATE_ID */
    public static final String APPLY_TEMPLATE_ID = "44ac24b86a9f4dd6bee41577e2703472";
    /** 停车占位提醒 TEMPLATE_ID */
    public static final String STOP_TEMPLATE_ID = "4940ce98a3f94f67aa9f5cd2d4e05cbd";
    /** 充电结束 TEMPLATE_ID */
    public static final String CHARGE_TEMPLATE_ID = "47b2eb376cfa436faae041a6f2f22688";
    /** 桩故障(自动/手动) TEMPLATE_ID */
    public static final String FAULT_TEMPLATE_ID = "37956469a14a47e484a747a1e7e462de";
    /** 更换手机号短信验证码 AP_ID */
    public static final String CODE_AP_ID = "GH123";
    /** 建桩短信验证码 AP_ID */
    public static final String APPLY_AP_ID = "JZ123";
    /** 停车占位提醒 AP_ID */
    public static final String STOP_AP_ID = "TC123";
    /** 充电结束 AP_ID */
    public static final String CHARGE_AP_ID = "CD123";
    /** 桩故障(自动/手动) AP_ID */
    public static final String FAULT_AP_ID = "GZ123";
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ScheduleConstants.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.common.core.constant;
/**
 * 任务调度通用常量
 *
 * @author ruoyi
 */
public class ScheduleConstants
{
    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
    /** 执行目标key */
    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
    /** 默认 */
    public static final String MISFIRE_DEFAULT = "0";
    /** 立即触发执行 */
    public static final String MISFIRE_IGNORE_MISFIRES = "1";
    /** 触发一次执行 */
    public static final String MISFIRE_FIRE_AND_PROCEED = "2";
    /** 不触发立即执行 */
    public static final String MISFIRE_DO_NOTHING = "3";
    public enum Status
    {
        /**
         * 正常
         */
        NORMAL("0"),
        /**
         * 暂停
         */
        PAUSE("1");
        private String value;
        private Status(String value)
        {
            this.value = value;
        }
        public String getValue()
        {
            return value;
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
New file
@@ -0,0 +1,63 @@
package com.ruoyi.common.core.constant;
/**
 * 权限相关通用常量
 *
 * @author ruoyi
 */
public class SecurityConstants
{
    /**
     * 用户ID字段
     */
    public static final String DETAILS_USER_ID = "user_id";
    /**
     * 用户名字段
     */
    public static final String DETAILS_USERNAME = "username";
    /**
     * 授权信息字段
     */
    public static final String AUTHORIZATION_HEADER = "Authorization";
    /**
     * 请求来源
     */
    public static final String FROM_SOURCE = "from-source";
    /**
     * 内部请求
     */
    public static final String INNER = "inner";
    /**
     * 用户标识
     */
    public static final String USER_KEY = "user_key";
    /**
     * 用户类型(system/applet)
     */
    public static final String USER_TYPE = "user_type";
    /**
     * 小程序登录用户标识
     */
    public static final String USER_APPLET_KEY = "user_applet_key";
    /**
     * 登录用户
     */
    public static final String LOGIN_USER = "login_user";
    /**
     * 角色权限
     */
    public static final String ROLE_PERMISSION = "role_permission";
    /**
     * 过期时间
     */
    public static final String EXPIRATION_TIME = "expiration_time";
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.common.core.constant;
/**
 * 服务名称
 *
 * @author ruoyi
 */
public class ServiceNameConstants
{
    /**
     * 认证服务的serviceid
     */
    public static final String AUTH_SERVICE = "ruoyi-auth";
    /**
     * 系统模块的serviceid
     */
    public static final String SYSTEM_SERVICE = "ruoyi-system";
    /**
     * 文件服务的serviceid
     */
    public static final String FILE_SERVICE = "ruoyi-file";
    public static final String ACCOUNT_SERVICE = "ruoyi-account";
    public static final String OTHER_SERVICE = "ruoyi-other";
    public static final String ORDER_SERVICE = "ruoyi-order";
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/TokenConstants.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.common.core.constant;
/**
 * Token的Key常量
 *
 * @author ruoyi
 */
public class TokenConstants
{
    /**
     * 令牌自定义标识
     */
    public static final String AUTHENTICATION = "Authorization";
    /**
     * 令牌前缀
     */
    public static final String PREFIX = "Bearer ";
    /**
     * 令牌秘钥
     */
    public final static String SECRET = "abcdefghijklmnopqrstuvwxyz";
    /**
     * 参数签名
     */
    public static final String SIGN = "sign";
    /**
     * 参数随机字符串
     */
    public static final String NONCE_STR = "nonce_str";
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/UserConstants.java
New file
@@ -0,0 +1,80 @@
package com.ruoyi.common.core.constant;
/**
 * 用户常量信息
 *
 * @author ruoyi
 */
public class UserConstants
{
    /**
     * 平台内系统用户的唯一标志
     */
    public static final String SYS_USER = "SYS_USER";
    /** 正常状态 */
    public static final String NORMAL = "0";
    /** 异常状态 */
    public static final String EXCEPTION = "1";
    /** 用户封禁状态 */
    public static final String USER_DISABLE = "1";
    /** 角色封禁状态 */
    public static final String ROLE_DISABLE = "1";
    /** 部门正常状态 */
    public static final String DEPT_NORMAL = "0";
    /** 部门停用状态 */
    public static final String DEPT_DISABLE = "1";
    /** 字典正常状态 */
    public static final String DICT_NORMAL = "0";
    /** 是否为系统默认(是) */
    public static final String YES = "Y";
    /** 是否菜单外链(是) */
    public static final String YES_FRAME = "0";
    /** 是否菜单外链(否) */
    public static final String NO_FRAME = "1";
    /** 菜单类型(目录) */
    public static final String TYPE_DIR = "M";
    /** 菜单类型(菜单) */
    public static final String TYPE_MENU = "C";
    /** 菜单类型(按钮) */
    public static final String TYPE_BUTTON = "F";
    /** Layout组件标识 */
    public final static String LAYOUT = "Layout";
    /** ParentView组件标识 */
    public final static String PARENT_VIEW = "ParentView";
    /** InnerLink组件标识 */
    public final static String INNER_LINK = "InnerLink";
    /** 校验是否唯一的返回标识 */
    public final static boolean UNIQUE = true;
    public final static boolean NOT_UNIQUE = false;
    /**
     * 用户名长度限制
     */
    public static final int USERNAME_MIN_LENGTH = 2;
    public static final int USERNAME_MAX_LENGTH = 20;
    /**
     * 密码长度限制
     */
    public static final int PASSWORD_MIN_LENGTH = 5;
    public static final int PASSWORD_MAX_LENGTH = 40;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/context/SecurityContextHolder.java
New file
@@ -0,0 +1,98 @@
package com.ruoyi.common.core.context;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.core.utils.StringUtils;
/**
 * 获取当前线程变量中的 用户id、用户名称、Token等信息
 * 注意: 必须在网关通过请求头的方法传入,同时在HeaderInterceptor拦截器设置值。 否则这里无法获取
 *
 * @author ruoyi
 */
public class SecurityContextHolder
{
    private static final TransmittableThreadLocal<Map<String, Object>> THREAD_LOCAL = new TransmittableThreadLocal<>();
    public static void set(String key, Object value)
    {
        Map<String, Object> map = getLocalMap();
        map.put(key, value == null ? StringUtils.EMPTY : value);
    }
    public static String get(String key)
    {
        Map<String, Object> map = getLocalMap();
        return Convert.toStr(map.getOrDefault(key, StringUtils.EMPTY));
    }
    public static <T> T get(String key, Class<T> clazz)
    {
        Map<String, Object> map = getLocalMap();
        return StringUtils.cast(map.getOrDefault(key, null));
    }
    public static Map<String, Object> getLocalMap()
    {
        Map<String, Object> map = THREAD_LOCAL.get();
        if (map == null)
        {
            map = new ConcurrentHashMap<String, Object>();
            THREAD_LOCAL.set(map);
        }
        return map;
    }
    public static void setLocalMap(Map<String, Object> threadLocalMap)
    {
        THREAD_LOCAL.set(threadLocalMap);
    }
    public static Long getUserId()
    {
        return Convert.toLong(get(SecurityConstants.DETAILS_USER_ID), 0L);
    }
    public static void setUserId(String account)
    {
        set(SecurityConstants.DETAILS_USER_ID, account);
    }
    public static String getUserName()
    {
        return get(SecurityConstants.DETAILS_USERNAME);
    }
    public static void setUserName(String username)
    {
        set(SecurityConstants.DETAILS_USERNAME, username);
    }
    public static String getUserKey()
    {
        return get(SecurityConstants.USER_KEY);
    }
    public static void setUserKey(String userKey)
    {
        set(SecurityConstants.USER_KEY, userKey);
    }
    public static String getPermission()
    {
        return get(SecurityConstants.ROLE_PERMISSION);
    }
    public static void setPermission(String permissions)
    {
        set(SecurityConstants.ROLE_PERMISSION, permissions);
    }
    public static void remove()
    {
        THREAD_LOCAL.remove();
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/domain/R.java
New file
@@ -0,0 +1,115 @@
package com.ruoyi.common.core.domain;
import java.io.Serializable;
import com.ruoyi.common.core.constant.Constants;
/**
 * 响应信息主体
 *
 * @author ruoyi
 */
public class R<T> implements Serializable
{
    private static final long serialVersionUID = 1L;
    /** 成功 */
    public static final int SUCCESS = Constants.SUCCESS;
    /** 失败 */
    public static final int FAIL = Constants.FAIL;
    private int code;
    private String msg;
    private T data;
    public static <T> R<T> ok()
    {
        return restResult(null, SUCCESS, null);
    }
    public static <T> R<T> ok(T data)
    {
        return restResult(data, SUCCESS, null);
    }
    public static <T> R<T> ok(T data, String msg)
    {
        return restResult(data, SUCCESS, msg);
    }
    public static <T> R<T> fail()
    {
        return restResult(null, FAIL, null);
    }
    public static <T> R<T> fail(String msg)
    {
        return restResult(null, FAIL, msg);
    }
    public static <T> R<T> fail(T data)
    {
        return restResult(data, FAIL, null);
    }
    public static <T> R<T> fail(T data, String msg)
    {
        return restResult(data, FAIL, msg);
    }
    public static <T> R<T> fail(int code, String msg)
    {
        return restResult(null, code, msg);
    }
    private static <T> R<T> restResult(T data, int code, String msg)
    {
        R<T> apiResult = new R<>();
        apiResult.setCode(code);
        apiResult.setData(data);
        apiResult.setMsg(msg);
        return apiResult;
    }
    public int getCode()
    {
        return code;
    }
    public void setCode(int code)
    {
        this.code = code;
    }
    public String getMsg()
    {
        return msg;
    }
    public void setMsg(String msg)
    {
        this.msg = msg;
    }
    public T getData()
    {
        return data;
    }
    public void setData(T data)
    {
        this.data = data;
    }
    public static <T> Boolean isError(R<T> ret)
    {
        return !isSuccess(ret);
    }
    public static <T> Boolean isSuccess(R<T> ret)
    {
        return R.SUCCESS == ret.getCode();
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/AppGoodQuery.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.common.core.dto;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class AppGoodQuery extends BasePage {
    @ApiModelProperty("1=购买商品,2=兑换商品")
    private Integer type;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingOrderGroup.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.common.core.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ChargingOrderGroup {
    @ApiModelProperty("充电量")
    BigDecimal chargingCapacity;
    @ApiModelProperty("站点")
    Integer siteId;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.common.core.dto;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class ChargingPercentProvinceDto {
    String provinceCode;
    LocalDate date1;
    LocalDate date2;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ExchangeBackDto.java
New file
@@ -0,0 +1,9 @@
package com.ruoyi.common.core.dto;
import lombok.Data;
@Data
public class ExchangeBackDto {
    private Long id;
    private String code;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ExchangeDto.java
New file
@@ -0,0 +1,45 @@
package com.ruoyi.common.core.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ExchangeDto {
    @ApiModelProperty("商品id")
    Integer goodId;
    @ApiModelProperty("地址id")
    Long addressId;
    @ApiModelProperty("备注")
    String remark;
    @ApiModelProperty(hidden = true)
    Long userId;
    @ApiModelProperty("1商品2优惠卷")
    Integer goodType;
    @ApiModelProperty(hidden = true)
    Integer point;
    @ApiModelProperty("购买数量")
    Integer num;
    @ApiModelProperty("优惠卷id")
    Long couponId;
    @ApiModelProperty("1微信2支付宝")
    Integer payMethod;
    @ApiModelProperty(hidden =true)
    BigDecimal orderPrice;
    @ApiModelProperty(hidden =true)
    BigDecimal payPrice;
    @ApiModelProperty(hidden =true)
    BigDecimal discountPrice;
    @ApiModelProperty(hidden =true)
    BigDecimal vipDiscount;
    @ApiModelProperty(hidden =true)
    String title;
    @ApiModelProperty(hidden =true)
    String phone;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/MongoChargingOrderQuery.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.common.core.dto;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "ChargingOrderQuery充电桩订单查询对象",description = "管理后台充电桩订单查询对象")
public class MongoChargingOrderQuery extends BasePage {
    @ApiModelProperty(value = "订单编号")
    private String code;
    @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    private Integer orderType;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)")
    private Integer status;
    @ApiModelProperty(value = "站点id")
    private Integer siteId;
    @ApiModelProperty(value = "充电桩code ")
    private String chargingPileCode;
    @ApiModelProperty(value = "充电枪code ")
    private String chargingGunCode;
    @ApiModelProperty(value = "开始时间2020-01-01 00:00:00 - 2021-01-01 23:59:59")
    private String createTime;
    @ApiModelProperty(value = "结束时间2020-01-01 00:00:00 - 2021-01-01 23:59:59")
    private String lastTime;
    @ApiModelProperty(value = "订单来源 1明星 2快电 3新电途")
    private Integer orderSource;
    @ApiModelProperty(value = "用户ids 前端忽略")
    private List<Long> userIds;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/PointChangeDto.java
New file
@@ -0,0 +1,12 @@
package com.ruoyi.common.core.dto;
import lombok.Data;
import org.springframework.web.bind.annotation.RequestParam;
@Data
public class PointChangeDto {
    private Long userId;
    private Integer points;
    private String remark;
    private Integer type;
    private String code;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/SteategyPassDto.java
New file
@@ -0,0 +1,14 @@
package com.ruoyi.common.core.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class SteategyPassDto {
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("1通过2拒绝")
    private Integer pass;
    @ApiModelProperty("ID")
    private Integer id;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ApproveConfigEnum.java
New file
@@ -0,0 +1,47 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum ApproveConfigEnum {
    /*审批类型 1=交车审批、2=续约审批、3=退车审批*/
    DELIVERY_APPROVAL(1, "交车审批"),
    RENEWAL_APPROVAL(2, "续约审批"),
    RETURN_APPROVAL(3, "退车审批");
    @Getter
    private String desc;
    @Getter
    private int code;
    ApproveConfigEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static ApproveConfigEnum fromCode(Integer code) {
        ApproveConfigEnum[] resultTypes = ApproveConfigEnum.values();
        for (ApproveConfigEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditStateEnum.java
New file
@@ -0,0 +1,48 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum AuditStateEnum {
    /*审核状态 0待审批 1通过 2驳回 3已撤回*/
    PENDING_APPROVAL(0, "待审批"),
    APPROVED(1, "审批通过"),
    APPROVAL_REJECTION(2, "审批驳回"),
    WITHDRAWN(3, "已撤回");
    @Getter
    private String desc;
    @Getter
    private int code;
    AuditStateEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static AuditStateEnum fromCode(Integer code) {
        AuditStateEnum[] resultTypes = AuditStateEnum.values();
        for (AuditStateEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/AuditTypeEnum.java
New file
@@ -0,0 +1,48 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum AuditTypeEnum {
    /*审核类型 1交车申请 2续约申请 3退车申请  4事故账单申请*/
    DELIVERY_APPLICATION(1, "交车申请"),
    RENEWAL_APPLICATION(2, "续约申请"),
    RETURN_APPLICATION(3, "退车申请"),
    ACCIDENT_BILL_APPLICATION(4, "事故账单申请");
    @Getter
    private String desc;
    @Getter
    private int code;
    AuditTypeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static AuditTypeEnum fromCode(Integer code) {
        AuditTypeEnum[] resultTypes = AuditTypeEnum.values();
        for (AuditTypeEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CarColorEnum.java
New file
@@ -0,0 +1,56 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum CarColorEnum {
    /*1=白色、2=黑色、3=银色、4=灰色、5=红色、6=蓝色、7=绿色、8=黄色、9=金色、10=紫色、11=橙色、12=其他*/
    WHITE(1, "白色"),
    BLACK(2, "黑色"),
    SILVERY(3, "银色"),
    GREY(4, "灰色"),
    RED(5, "红色"),
    BLUE(6, "蓝色"),
    GREEN(7, "绿色"),
    YELLOW(8, "黄色"),
    GOLDEN(9, "金色"),
    PURPLE(10, "紫色"),
    ORANGE(11, "橙色"),
    OTHER(12, "其他");
    @Getter
    private String desc;
    @Getter
    private int code;
    CarColorEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static CarColorEnum fromCode(Integer code) {
        CarColorEnum[] resultTypes = CarColorEnum.values();
        for (CarColorEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/CarStateEnum.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum CarStateEnum {
    /*状态1= 待上户、2=待办证、3=待整备、4=待租、5=已租、6=已处置*/
    PENDING_REGISTRATION(1, "待上户"),
    PENDING_CERTIFICATE(2, "待办证"),
    TO_BE_PREPARED(3, "待整备"),
    FOR_RENT(4, "待租"),
    RENTED(5, "已租"),
    DISPOSED(6, "已处置");
    @Getter
    private String desc;
    @Getter
    private int code;
    CarStateEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static CarStateEnum fromCode(Integer code) {
        CarStateEnum[] resultTypes = CarStateEnum.values();
        for (CarStateEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ContractStateEnum.java
New file
@@ -0,0 +1,55 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum ContractStateEnum {
    /*合同状态 1签约中 2审批拒绝 3续约中 4待执行 5执行中 6结算中 7已结束 8已作废 9即将到期 10已到期 11已撤销*/
    SIGNING(1, "签约中"),
    APPROVAL_REJECTION(2, "审批拒绝"),
    UNDER_RENEWAL(3, "续约中"),
    TO_BE_EXECUTED(4, "待执行"),
    UNDER_EXECUTION(5, "执行中"),
    SETTLEMENT_PROGRESS(6, "结算中"),
    ENDED(7, "已结束"),
    VOIDED(8, "已作废"),
    DUE(9, "即将到期"),
    EXPIRED(10, "已到期"),
    REVOKED(11, "已撤销");
    @Getter
    private String desc;
    @Getter
    private int code;
    ContractStateEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static ContractStateEnum fromCode(Integer code) {
        ContractStateEnum[] resultTypes = ContractStateEnum.values();
        for (ContractStateEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ContractTypeEnum.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum ContractTypeEnum {
    /*合同类型 1=纯租 2=以租代购 3=打工模式*/
    PURE_RENT(1, "纯租"),
    CAR_LEASE(2, "以租代购"),
    WORKING_MODE(3, "打工模式");
    @Getter
    private String desc;
    @Getter
    private int code;
    ContractTypeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static ContractTypeEnum fromCode(Integer code) {
        ContractTypeEnum[] resultTypes = ContractTypeEnum.values();
        for (ContractTypeEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DelFlagEnum.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @author xiaochen
 * @ClassName Disable
 * @Description
 * @date 2022-06-08 16:55
 */
public enum DelFlagEnum {
    NO(0, "否"),
    YES(1, "是");
    @Getter
    private String desc;
    @Getter
    private int code;
    DelFlagEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static DelFlagEnum fromCode(Integer code) {
        DelFlagEnum[] resultTypes = DelFlagEnum.values();
        for (DelFlagEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/DisabledEnum.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @author xiaochen
 * @ClassName Disable
 * @Description
 * @date 2022-06-08 16:55
 */
public enum DisabledEnum {
    NO(0, "否"),
    YES(1, "是");
    @Getter
    private String desc;
    @Getter
    private int code;
    DisabledEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static DisabledEnum fromCode(Integer code) {
        DisabledEnum[] resultTypes = DisabledEnum.values();
        for (DisabledEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/HandoverStateEnum.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum HandoverStateEnum {
    /*交车状态 1待交车 2待审批 3已交车 4审批拒绝*/
    VEHICLE_DELIVERED(1, "待交车"),
    PENDING_APPROVAL(2, "待审批"),
    DELIVERED(3, "已交车"),
    APPROVAL_REJECTION(4, "审批拒绝"),
    REVOKED(5, "已撤销");
    @Getter
    private String desc;
    @Getter
    private int code;
    HandoverStateEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static HandoverStateEnum fromCode(Integer code) {
        HandoverStateEnum[] resultTypes = HandoverStateEnum.values();
        for (HandoverStateEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ImportTypeEnum.java
New file
@@ -0,0 +1,56 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum ImportTypeEnum {
    /*1=新车车辆导入 、2=已有车辆导入、3=上户导入、4=设备导入、5=违章导入、6=违章图片导入、7=保养记录导入、8=保单导入、9=合同导入*/
    NEW_CAR(1, "新车车辆导入"),
    EXIST_CAR(2, "已有车辆导入"),
    WEALTHY(3, "上户导入"),
    DEVICE(4, "设备导入"),
    VIOLATION(5, "违章导入"),
    VIOLATION_PICTURE(6, "违章图片导入"),
    SERVICE(7, "保养记录导入"),
    WARRANTY(8, "保单导入"),
    CONTRACT(9, "合同导入"),
    CERTIFICATE(10, "办证导入"),
    INSPECTANNUALLY(11, "车辆年检导入"),
    MAINTENANCE(12, "车辆维修导入");
    @Getter
    private String desc;
    @Getter
    private int code;
    ImportTypeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static ImportTypeEnum fromCode(Integer code) {
        ImportTypeEnum[] resultTypes = ImportTypeEnum.values();
        for (ImportTypeEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/InsureTypeEnum.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum InsureTypeEnum {
    /*保险类型 1=商业险、2=交强险、3=承运人责任险、4=客伤险、5=盗抢险*/
    COMMERCIAL_INSURANCE(1, "商业险"),
    COMPULSORY_INSURANCE(2, "交强险"),
    CARRIER_LIABILITY_INSURANCE(3, "承运人责任险"),
    CUSTOMER_INJURY_INSURANCE(4, "客伤险"),
    THEFT_INSURANCE(5, "盗抢险");
    @Getter
    private String desc;
    @Getter
    private int code;
    InsureTypeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static InsureTypeEnum fromCode(Integer code) {
        InsureTypeEnum[] resultTypes = InsureTypeEnum.values();
        for (InsureTypeEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/PurchaseStateEnum.java
New file
@@ -0,0 +1,48 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum PurchaseStateEnum {
    /*购买状态 1在保 2停保 3复保 4脱保*/
    UNDER_PROTECTION(1, "在保"),
    SUSPENSION_MAINTENANCE(2, "停保"),
    REINSURANCE(3, "复保"),
    DELISTING(4, "脱保");
    @Getter
    private String desc;
    @Getter
    private int code;
    PurchaseStateEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static PurchaseStateEnum fromCode(Integer code) {
        PurchaseStateEnum[] resultTypes = PurchaseStateEnum.values();
        for (PurchaseStateEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnCarTypeEnum.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum ReturnCarTypeEnum {
    /*合同类型 合同到期、提前退车、强制收车*/
    EXPIRE(1, "合同到期"),
    EARLY_WITHDRAWAL(2, "提前退车"),
    COMPULSORY_COLLECTION(3, "强制收车");
    @Getter
    private String desc;
    @Getter
    private int code;
    ReturnCarTypeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static ReturnCarTypeEnum fromCode(Integer code) {
        ReturnCarTypeEnum[] resultTypes = ReturnCarTypeEnum.values();
        for (ReturnCarTypeEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/ReturnStateEnum.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum ReturnStateEnum {
    /*退车状态 1=待验车 2=待生成账单 3=待审批 4=已退车 5=审批拒绝*/
    VEHICLE_INSPECTED(1, "待验车"),
    PENDING_BILL_GENERATION(2, "待生成账单"),
    PENDING_APPROVAL(3, "待审批"),
    RETURNED_VEHICLE(4, "已退车"),
    APPROVAL_REJECTION(5, "审批拒绝"),
    REVOKED(6, "已撤销");
    @Getter
    private String desc;
    @Getter
    private int code;
    ReturnStateEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static ReturnStateEnum fromCode(Integer code) {
        ReturnStateEnum[] resultTypes = ReturnStateEnum.values();
        for (ReturnStateEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/UserStatus.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.common.core.enums;
/**
 * 用户状态
 *
 * @author ruoyi
 */
public enum UserStatus
{
    OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除");
    private final String code;
    private final String info;
    UserStatus(String code, String info)
    {
        this.code = code;
        this.info = info;
    }
    public String getCode()
    {
        return code;
    }
    public String getInfo()
    {
        return info;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/WarrantyStateEnum.java
New file
@@ -0,0 +1,49 @@
package com.ruoyi.common.core.enums;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum WarrantyStateEnum {
    /*保单状态 1正常 2已脱保 3已停保 4即将到期 5建议停保*/
    NORMAL(1, "正常"),
    DELISTED(2, "已脱保"),
    DISCONTINUED_WARRANTY(3, "已停保"),
    DUE(4, "即将到期"),
    SUGGEST_DISCONTINUING_MAINTENANCE(5, "建议停保");
    @Getter
    private String desc;
    @Getter
    private int code;
    WarrantyStateEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static WarrantyStateEnum fromCode(Integer code) {
        WarrantyStateEnum[] resultTypes = WarrantyStateEnum.values();
        for (WarrantyStateEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AdvertisingStatusEnum.java
New file
@@ -0,0 +1,45 @@
package com.ruoyi.common.core.enums.status;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum AdvertisingStatusEnum {
    NO(0, "否"),
    YES(1, "是");
    @Getter
    private String desc;
    @Getter
    private int code;
    AdvertisingStatusEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static AdvertisingStatusEnum fromCode(Integer code) {
        AdvertisingStatusEnum[] resultTypes = AdvertisingStatusEnum.values();
        for (AdvertisingStatusEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.common.core.enums.status;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum AppUserStatusEnum {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结"),
    LOGOFF(3, "注销");
    @Getter
    private String desc;
    @Getter
    private int code;
    AppUserStatusEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static AppUserStatusEnum fromCode(Integer code) {
        AppUserStatusEnum[] resultTypes = AppUserStatusEnum.values();
        for (AppUserStatusEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunModeEnum.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.common.core.enums.status;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum ChargingGunModeEnum {
    SUPER_SUFFICIENT(1, "超级快充"),
    FAST_SUFFICIENT(2, "快充"),
    SLOW_SUFFICIENT(3, "慢充");
    @Getter
    private String desc;
    @Getter
    private int code;
    ChargingGunModeEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static ChargingGunModeEnum fromCode(Integer code) {
        ChargingGunModeEnum[] resultTypes = ChargingGunModeEnum.values();
        for (ChargingGunModeEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/ChargingGunStatusEnum.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.common.core.enums.status;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum ChargingGunStatusEnum {
    OFFLINE(1, "离线"),
    IDLE(2, "空闲"),
    OCCUPATION_UNCHARGED(3, "占用(未充电)"),
    OCCUPATION_CHARGING(4, "占用(充电中)"),
    OCCUPATION_FULL(5, "占用(已充满)"),
    OCCUPATION_LOCK(6, "占用(预约锁定)"),
    FAULT(7, "故障");
    @Getter
    private String desc;
    @Getter
    private int code;
    ChargingGunStatusEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static ChargingGunStatusEnum fromCode(Integer code) {
        ChargingGunStatusEnum[] resultTypes = ChargingGunStatusEnum.values();
        for (ChargingGunStatusEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/SiteStatusEnum.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.common.core.enums.status;
import lombok.Getter;
/**
 * @Description
 * @Author xiaochen
 * @Date 2023/6/8 16:42
 */
public enum SiteStatusEnum {
    NORMAL_USE(1, "正常使用"),
    IN_MAINTENANCE(2, "维修中"),
    CLOSE_OFFLINE(3, "关闭下线");
    @Getter
    private String desc;
    @Getter
    private int code;
    SiteStatusEnum(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
    /**
     * 通过code获取枚举
     *
     * @param code
     * @return
     */
    public static SiteStatusEnum fromCode(Integer code) {
        SiteStatusEnum[] resultTypes = SiteStatusEnum.values();
        for (SiteStatusEnum resultType : resultTypes) {
            if (code.equals(resultType.getCode())) {
                return resultType;
            }
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/CaptchaException.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.common.core.exception;
/**
 * 验证码错误异常类
 *
 * @author ruoyi
 */
public class CaptchaException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    public CaptchaException(String msg)
    {
        super(msg);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/CheckedException.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.common.core.exception;
/**
 * 检查异常
 *
 * @author ruoyi
 */
public class CheckedException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    public CheckedException(String message)
    {
        super(message);
    }
    public CheckedException(Throwable cause)
    {
        super(cause);
    }
    public CheckedException(String message, Throwable cause)
    {
        super(message, cause);
    }
    public CheckedException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
    {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/DemoModeException.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.common.core.exception;
/**
 * 演示模式异常
 *
 * @author ruoyi
 */
public class DemoModeException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    public DemoModeException()
    {
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/GlobalException.java
New file
@@ -0,0 +1,58 @@
package com.ruoyi.common.core.exception;
/**
 * 全局异常
 *
 * @author ruoyi
 */
public class GlobalException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    /**
     * 错误提示
     */
    private String message;
    /**
     * 错误明细,内部调试错误
     *
     * 和 {@link CommonResult#getDetailMessage()} 一致的设计
     */
    private String detailMessage;
    /**
     * 空构造方法,避免反序列化问题
     */
    public GlobalException()
    {
    }
    public GlobalException(String message)
    {
        this.message = message;
    }
    public String getDetailMessage()
    {
        return detailMessage;
    }
    public GlobalException setDetailMessage(String detailMessage)
    {
        this.detailMessage = detailMessage;
        return this;
    }
    @Override
    public String getMessage()
    {
        return message;
    }
    public GlobalException setMessage(String message)
    {
        this.message = message;
        return this;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/InnerAuthException.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.common.core.exception;
/**
 * 内部认证异常
 *
 * @author ruoyi
 */
public class InnerAuthException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    public InnerAuthException(String message)
    {
        super(message);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/PreAuthorizeException.java
New file
@@ -0,0 +1,15 @@
package com.ruoyi.common.core.exception;
/**
 * 权限异常
 *
 * @author ruoyi
 */
public class PreAuthorizeException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    public PreAuthorizeException()
    {
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/ServiceException.java
New file
@@ -0,0 +1,74 @@
package com.ruoyi.common.core.exception;
/**
 * 业务异常
 *
 * @author ruoyi
 */
public final class ServiceException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    /**
     * 错误码
     */
    private Integer code;
    /**
     * 错误提示
     */
    private String message;
    /**
     * 错误明细,内部调试错误
     *
     * 和 {@link CommonResult#getDetailMessage()} 一致的设计
     */
    private String detailMessage;
    /**
     * 空构造方法,避免反序列化问题
     */
    public ServiceException()
    {
    }
    public ServiceException(String message)
    {
        this.message = message;
    }
    public ServiceException(String message, Integer code)
    {
        this.message = message;
        this.code = code;
    }
    public String getDetailMessage()
    {
        return detailMessage;
    }
    @Override
    public String getMessage()
    {
        return message;
    }
    public Integer getCode()
    {
        return code;
    }
    public ServiceException setMessage(String message)
    {
        this.message = message;
        return this;
    }
    public ServiceException setDetailMessage(String detailMessage)
    {
        this.detailMessage = detailMessage;
        return this;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/UtilException.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.common.core.exception;
/**
 * 工具类异常
 *
 * @author ruoyi
 */
public class UtilException extends RuntimeException
{
    private static final long serialVersionUID = 8247610319171014183L;
    public UtilException(Throwable e)
    {
        super(e.getMessage(), e);
    }
    public UtilException(String message)
    {
        super(message);
    }
    public UtilException(String message, Throwable throwable)
    {
        super(message, throwable);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotLoginException.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.common.core.exception.auth;
/**
 * 未能通过的登录认证异常
 *
 * @author ruoyi
 */
public class NotLoginException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    public NotLoginException(String message)
    {
        super(message);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotPermissionException.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.common.core.exception.auth;
import org.apache.commons.lang3.StringUtils;
/**
 * 未能通过的权限认证异常
 *
 * @author ruoyi
 */
public class NotPermissionException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    public NotPermissionException(String permission)
    {
        super(permission);
    }
    public NotPermissionException(String[] permissions)
    {
        super(StringUtils.join(permissions, ","));
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/auth/NotRoleException.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.common.core.exception.auth;
import org.apache.commons.lang3.StringUtils;
/**
 * 未能通过的角色认证异常
 *
 * @author ruoyi
 */
public class NotRoleException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    public NotRoleException(String role)
    {
        super(role);
    }
    public NotRoleException(String[] roles)
    {
        super(StringUtils.join(roles, ","));
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/base/BaseException.java
New file
@@ -0,0 +1,79 @@
package com.ruoyi.common.core.exception.base;
/**
 * 基础异常
 *
 * @author ruoyi
 */
public class BaseException extends RuntimeException
{
    private static final long serialVersionUID = 1L;
    /**
     * 所属模块
     */
    private String module;
    /**
     * 错误码
     */
    private String code;
    /**
     * 错误码对应的参数
     */
    private Object[] args;
    /**
     * 错误消息
     */
    private String defaultMessage;
    public BaseException(String module, String code, Object[] args, String defaultMessage)
    {
        this.module = module;
        this.code = code;
        this.args = args;
        this.defaultMessage = defaultMessage;
    }
    public BaseException(String module, String code, Object[] args)
    {
        this(module, code, args, null);
    }
    public BaseException(String module, String defaultMessage)
    {
        this(module, null, null, defaultMessage);
    }
    public BaseException(String code, Object[] args)
    {
        this(null, code, args, null);
    }
    public BaseException(String defaultMessage)
    {
        this(null, null, null, defaultMessage);
    }
    public String getModule()
    {
        return module;
    }
    public String getCode()
    {
        return code;
    }
    public Object[] getArgs()
    {
        return args;
    }
    public String getDefaultMessage()
    {
        return defaultMessage;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileException.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.common.core.exception.file;
import com.ruoyi.common.core.exception.base.BaseException;
/**
 * 文件信息异常类
 *
 * @author ruoyi
 */
public class FileException extends BaseException
{
    private static final long serialVersionUID = 1L;
    public FileException(String code, Object[] args, String msg)
    {
        super("file", code, args, msg);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileNameLengthLimitExceededException.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.common.core.exception.file;
/**
 * 文件名称超长限制异常类
 *
 * @author ruoyi
 */
public class FileNameLengthLimitExceededException extends FileException
{
    private static final long serialVersionUID = 1L;
    public FileNameLengthLimitExceededException(int defaultFileNameLength)
    {
        super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }, "the filename is too long");
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileSizeLimitExceededException.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.common.core.exception.file;
/**
 * 文件名大小限制异常类
 *
 * @author ruoyi
 */
public class FileSizeLimitExceededException extends FileException
{
    private static final long serialVersionUID = 1L;
    public FileSizeLimitExceededException(long defaultMaxSize)
    {
        super("upload.exceed.maxSize", new Object[] { defaultMaxSize }, "the filesize is too large");
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/FileUploadException.java
New file
@@ -0,0 +1,61 @@
package com.ruoyi.common.core.exception.file;
import java.io.PrintStream;
import java.io.PrintWriter;
/**
 * 文件上传异常类
 *
 * @author ruoyi
 */
public class FileUploadException extends Exception
{
    private static final long serialVersionUID = 1L;
    private final Throwable cause;
    public FileUploadException()
    {
        this(null, null);
    }
    public FileUploadException(final String msg)
    {
        this(msg, null);
    }
    public FileUploadException(String msg, Throwable cause)
    {
        super(msg);
        this.cause = cause;
    }
    @Override
    public void printStackTrace(PrintStream stream)
    {
        super.printStackTrace(stream);
        if (cause != null)
        {
            stream.println("Caused by:");
            cause.printStackTrace(stream);
        }
    }
    @Override
    public void printStackTrace(PrintWriter writer)
    {
        super.printStackTrace(writer);
        if (cause != null)
        {
            writer.println("Caused by:");
            cause.printStackTrace(writer);
        }
    }
    @Override
    public Throwable getCause()
    {
        return cause;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/file/InvalidExtensionException.java
New file
@@ -0,0 +1,80 @@
package com.ruoyi.common.core.exception.file;
import java.util.Arrays;
/**
 * 文件上传 误异常类
 *
 * @author ruoyi
 */
public class InvalidExtensionException extends FileUploadException
{
    private static final long serialVersionUID = 1L;
    private String[] allowedExtension;
    private String extension;
    private String filename;
    public InvalidExtensionException(String[] allowedExtension, String extension, String filename)
    {
        super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]");
        this.allowedExtension = allowedExtension;
        this.extension = extension;
        this.filename = filename;
    }
    public String[] getAllowedExtension()
    {
        return allowedExtension;
    }
    public String getExtension()
    {
        return extension;
    }
    public String getFilename()
    {
        return filename;
    }
    public static class InvalidImageExtensionException extends InvalidExtensionException
    {
        private static final long serialVersionUID = 1L;
        public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename)
        {
            super(allowedExtension, extension, filename);
        }
    }
    public static class InvalidFlashExtensionException extends InvalidExtensionException
    {
        private static final long serialVersionUID = 1L;
        public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename)
        {
            super(allowedExtension, extension, filename);
        }
    }
    public static class InvalidMediaExtensionException extends InvalidExtensionException
    {
        private static final long serialVersionUID = 1L;
        public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename)
        {
            super(allowedExtension, extension, filename);
        }
    }
    public static class InvalidVideoExtensionException extends InvalidExtensionException
    {
        private static final long serialVersionUID = 1L;
        public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename)
        {
            super(allowedExtension, extension, filename);
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/job/TaskException.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.common.core.exception.job;
/**
 * 计划策略异常
 *
 * @author ruoyi
 */
public class TaskException extends Exception
{
    private static final long serialVersionUID = 1L;
    private Code code;
    public TaskException(String msg, Code code)
    {
        this(msg, code, null);
    }
    public TaskException(String msg, Code code, Exception nestedEx)
    {
        super(msg, nestedEx);
        this.code = code;
    }
    public Code getCode()
    {
        return code;
    }
    public enum Code
    {
        TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/CaptchaExpireException.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.common.core.exception.user;
/**
 * 验证码失效异常类
 *
 * @author ruoyi
 */
public class CaptchaExpireException extends UserException
{
    private static final long serialVersionUID = 1L;
    public CaptchaExpireException()
    {
        super("user.jcaptcha.expire", null);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserAppletException.java
New file
@@ -0,0 +1,48 @@
package com.ruoyi.common.core.exception.user;
/**
 * 学生端登录异常信息
 *
 * @author HJL
 * @version 1.0
 * @since 2024-05-24 11:35
 */
public class UserAppletException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    /**
     * 错误提示
     */
    private String message;
    /**
     * 错误码
     */
    private int code;
    public UserAppletException() {
    }
    public UserAppletException(String message, Integer code) {
        this.message = message;
        this.code = code;
    }
    @Override
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserException.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.common.core.exception.user;
import com.ruoyi.common.core.exception.base.BaseException;
/**
 * 用户信息异常类
 *
 * @author ruoyi
 */
public class UserException extends BaseException
{
    private static final long serialVersionUID = 1L;
    public UserException(String code, Object[] args)
    {
        super("user", code, args, null);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/exception/user/UserPasswordNotMatchException.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.common.core.exception.user;
/**
 * 用户密码不正确或不符合规范异常类
 *
 * @author ruoyi
 */
public class UserPasswordNotMatchException extends UserException
{
    private static final long serialVersionUID = 1L;
    public UserPasswordNotMatchException()
    {
        super("user.password.not.match", null);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/query/TimeRangePageQuery.java
New file
@@ -0,0 +1,52 @@
package com.ruoyi.common.core.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.TableDataInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;
/**
 * @author xiaochen
 * @ClassName TimeRangePageDTO
 * @Description
 * @date 2023-06-4 14:42
 */
@ApiModel("时间范围分页dto")
public class TimeRangePageQuery extends BasePage {
    @ApiModelProperty("开始时间 格式 yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date startTime;
    @ApiModelProperty("结束时间 格式 yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date endTime;
    public String getStartTime() {
        if (Objects.nonNull(startTime)) {
            return new SimpleDateFormat("yyyy-MM-dd").format(startTime) + " 00:00:00";
        }
        return null;
    }
    public void setStartTime(Date startTime) {
        this.startTime = startTime;
    }
    public String getEndTime() {
        if (Objects.nonNull(endTime)) {
            return new SimpleDateFormat("yyyy-MM-dd").format(endTime) + " 23:59:59";
        }
        return null;
    }
    public void setEndTime(Date endTime) {
        this.endTime = endTime;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/CharsetKit.java
New file
@@ -0,0 +1,86 @@
package com.ruoyi.common.core.text;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import com.ruoyi.common.core.utils.StringUtils;
/**
 * 字符集工具类
 *
 * @author ruoyi
 */
public class CharsetKit
{
    /** ISO-8859-1 */
    public static final String ISO_8859_1 = "ISO-8859-1";
    /** UTF-8 */
    public static final String UTF_8 = "UTF-8";
    /** GBK */
    public static final String GBK = "GBK";
    /** ISO-8859-1 */
    public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
    /** UTF-8 */
    public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
    /** GBK */
    public static final Charset CHARSET_GBK = Charset.forName(GBK);
    /**
     * 转换为Charset对象
     *
     * @param charset 字符集,为空则返回默认字符集
     * @return Charset
     */
    public static Charset charset(String charset)
    {
        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
    }
    /**
     * 转换字符串的字符集编码
     *
     * @param source 字符串
     * @param srcCharset 源字符集,默认ISO-8859-1
     * @param destCharset 目标字符集,默认UTF-8
     * @return 转换后的字符集
     */
    public static String convert(String source, String srcCharset, String destCharset)
    {
        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
    }
    /**
     * 转换字符串的字符集编码
     *
     * @param source 字符串
     * @param srcCharset 源字符集,默认ISO-8859-1
     * @param destCharset 目标字符集,默认UTF-8
     * @return 转换后的字符集
     */
    public static String convert(String source, Charset srcCharset, Charset destCharset)
    {
        if (null == srcCharset)
        {
            srcCharset = StandardCharsets.ISO_8859_1;
        }
        if (null == destCharset)
        {
            destCharset = StandardCharsets.UTF_8;
        }
        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
        {
            return source;
        }
        return new String(source.getBytes(srcCharset), destCharset);
    }
    /**
     * @return 系统字符集编码
     */
    public static String systemCharset()
    {
        return Charset.defaultCharset().name();
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/Convert.java
New file
@@ -0,0 +1,1006 @@
package com.ruoyi.common.core.text;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.text.NumberFormat;
import java.util.Set;
import com.ruoyi.common.core.utils.StringUtils;
/**
 * 类型转换器
 *
 * @author ruoyi
 */
public class Convert
{
    /**
     * 转换为字符串<br>
     * 如果给定的值为null,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static String toStr(Object value, String defaultValue)
    {
        if (null == value)
        {
            return defaultValue;
        }
        if (value instanceof String)
        {
            return (String) value;
        }
        return value.toString();
    }
    /**
     * 转换为字符串<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static String toStr(Object value)
    {
        return toStr(value, null);
    }
    /**
     * 转换为字符<br>
     * 如果给定的值为null,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Character toChar(Object value, Character defaultValue)
    {
        if (null == value)
        {
            return defaultValue;
        }
        if (value instanceof Character)
        {
            return (Character) value;
        }
        final String valueStr = toStr(value, null);
        return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0);
    }
    /**
     * 转换为字符<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Character toChar(Object value)
    {
        return toChar(value, null);
    }
    /**
     * 转换为byte<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Byte toByte(Object value, Byte defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Byte)
        {
            return (Byte) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).byteValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Byte.parseByte(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为byte<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Byte toByte(Object value)
    {
        return toByte(value, null);
    }
    /**
     * 转换为Short<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Short toShort(Object value, Short defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Short)
        {
            return (Short) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).shortValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Short.parseShort(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为Short<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Short toShort(Object value)
    {
        return toShort(value, null);
    }
    /**
     * 转换为Number<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Number toNumber(Object value, Number defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Number)
        {
            return (Number) value;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return NumberFormat.getInstance().parse(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为Number<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Number toNumber(Object value)
    {
        return toNumber(value, null);
    }
    /**
     * 转换为int<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Integer toInt(Object value, Integer defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Integer)
        {
            return (Integer) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).intValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Integer.parseInt(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为int<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Integer toInt(Object value)
    {
        return toInt(value, null);
    }
    /**
     * 转换为Integer数组<br>
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static Integer[] toIntArray(String str)
    {
        return toIntArray(",", str);
    }
    /**
     * 转换为Long数组<br>
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String str)
    {
        return toLongArray(",", str);
    }
    /**
     * 转换为Integer数组<br>
     *
     * @param split 分隔符
     * @param str 被转换的值
     * @return 结果
     */
    public static Integer[] toIntArray(String split, String str)
    {
        if (StringUtils.isEmpty(str))
        {
            return new Integer[] {};
        }
        String[] arr = str.split(split);
        final Integer[] ints = new Integer[arr.length];
        for (int i = 0; i < arr.length; i++)
        {
            final Integer v = toInt(arr[i], 0);
            ints[i] = v;
        }
        return ints;
    }
    /**
     * 转换为Long数组<br>
     *
     * @param split 分隔符
     * @param str 被转换的值
     * @return 结果
     */
    public static Long[] toLongArray(String split, String str)
    {
        if (StringUtils.isEmpty(str))
        {
            return new Long[] {};
        }
        String[] arr = str.split(split);
        final Long[] longs = new Long[arr.length];
        for (int i = 0; i < arr.length; i++)
        {
            final Long v = toLong(arr[i], null);
            longs[i] = v;
        }
        return longs;
    }
    /**
     * 转换为String数组<br>
     *
     * @param str 被转换的值
     * @return 结果
     */
    public static String[] toStrArray(String str)
    {
        return toStrArray(",", str);
    }
    /**
     * 转换为String数组<br>
     *
     * @param split 分隔符
     * @param str 被转换的值
     * @return 结果
     */
    public static String[] toStrArray(String split, String str)
    {
        return str.split(split);
    }
    /**
     * 转换为long<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Long toLong(Object value, Long defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Long)
        {
            return (Long) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).longValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            // 支持科学计数法
            return new BigDecimal(valueStr.trim()).longValue();
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为long<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Long toLong(Object value)
    {
        return toLong(value, null);
    }
    /**
     * 转换为double<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Double toDouble(Object value, Double defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Double)
        {
            return (Double) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).doubleValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            // 支持科学计数法
            return new BigDecimal(valueStr.trim()).doubleValue();
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为double<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Double toDouble(Object value)
    {
        return toDouble(value, null);
    }
    /**
     * 转换为Float<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Float toFloat(Object value, Float defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Float)
        {
            return (Float) value;
        }
        if (value instanceof Number)
        {
            return ((Number) value).floatValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Float.parseFloat(valueStr.trim());
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为Float<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Float toFloat(Object value)
    {
        return toFloat(value, null);
    }
    /**
     * 转换为boolean<br>
     * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Boolean toBool(Object value, Boolean defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof Boolean)
        {
            return (Boolean) value;
        }
        String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        valueStr = valueStr.trim().toLowerCase();
        switch (valueStr)
        {
            case "true":
            case "yes":
            case "ok":
            case "1":
                return true;
            case "false":
            case "no":
            case "0":
                return false;
            default:
                return defaultValue;
        }
    }
    /**
     * 转换为boolean<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Boolean toBool(Object value)
    {
        return toBool(value, null);
    }
    /**
     * 转换为Enum对象<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     *
     * @param clazz Enum的Class
     * @param value 值
     * @param defaultValue 默认值
     * @return Enum
     */
    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value, E defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (clazz.isAssignableFrom(value.getClass()))
        {
            @SuppressWarnings("unchecked")
            E myE = (E) value;
            return myE;
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return Enum.valueOf(clazz, valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为Enum对象<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     *
     * @param clazz Enum的Class
     * @param value 值
     * @return Enum
     */
    public static <E extends Enum<E>> E toEnum(Class<E> clazz, Object value)
    {
        return toEnum(clazz, value, null);
    }
    /**
     * 转换为BigInteger<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static BigInteger toBigInteger(Object value, BigInteger defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof BigInteger)
        {
            return (BigInteger) value;
        }
        if (value instanceof Long)
        {
            return BigInteger.valueOf((Long) value);
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return new BigInteger(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为BigInteger<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static BigInteger toBigInteger(Object value)
    {
        return toBigInteger(value, null);
    }
    /**
     * 转换为BigDecimal<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
        if (value instanceof BigDecimal)
        {
            return (BigDecimal) value;
        }
        if (value instanceof Long)
        {
            return new BigDecimal((Long) value);
        }
        if (value instanceof Double)
        {
            return BigDecimal.valueOf((Double) value);
        }
        if (value instanceof Integer)
        {
            return new BigDecimal((Integer) value);
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr))
        {
            return defaultValue;
        }
        try
        {
            return new BigDecimal(valueStr);
        }
        catch (Exception e)
        {
            return defaultValue;
        }
    }
    /**
     * 转换为BigDecimal<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static BigDecimal toBigDecimal(Object value)
    {
        return toBigDecimal(value, null);
    }
    /**
     * 将对象转为字符串<br>
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
     *
     * @param obj 对象
     * @return 字符串
     */
    public static String utf8Str(Object obj)
    {
        return str(obj, CharsetKit.CHARSET_UTF_8);
    }
    /**
     * 将对象转为字符串<br>
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
     *
     * @param obj 对象
     * @param charsetName 字符集
     * @return 字符串
     */
    public static String str(Object obj, String charsetName)
    {
        return str(obj, Charset.forName(charsetName));
    }
    /**
     * 将对象转为字符串<br>
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
     *
     * @param obj 对象
     * @param charset 字符集
     * @return 字符串
     */
    public static String str(Object obj, Charset charset)
    {
        if (null == obj)
        {
            return null;
        }
        if (obj instanceof String)
        {
            return (String) obj;
        }
        else if (obj instanceof byte[] || obj instanceof Byte[])
        {
            if (obj instanceof byte[])
            {
                return str((byte[]) obj, charset);
            }
            else
            {
                Byte[] bytes = (Byte[]) obj;
                int length = bytes.length;
                byte[] dest = new byte[length];
                for (int i = 0; i < length; i++)
                {
                    dest[i] = bytes[i];
                }
                return str(dest, charset);
            }
        }
        else if (obj instanceof ByteBuffer)
        {
            return str((ByteBuffer) obj, charset);
        }
        return obj.toString();
    }
    /**
     * 将byte数组转为字符串
     *
     * @param bytes byte数组
     * @param charset 字符集
     * @return 字符串
     */
    public static String str(byte[] bytes, String charset)
    {
        return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset));
    }
    /**
     * 解码字节码
     *
     * @param data 字符串
     * @param charset 字符集,如果此字段为空,则解码的结果取决于平台
     * @return 解码后的字符串
     */
    public static String str(byte[] data, Charset charset)
    {
        if (data == null)
        {
            return null;
        }
        if (null == charset)
        {
            return new String(data);
        }
        return new String(data, charset);
    }
    /**
     * 将编码的byteBuffer数据转换为字符串
     *
     * @param data 数据
     * @param charset 字符集,如果为空使用当前系统字符集
     * @return 字符串
     */
    public static String str(ByteBuffer data, String charset)
    {
        if (data == null)
        {
            return null;
        }
        return str(data, Charset.forName(charset));
    }
    /**
     * 将编码的byteBuffer数据转换为字符串
     *
     * @param data 数据
     * @param charset 字符集,如果为空使用当前系统字符集
     * @return 字符串
     */
    public static String str(ByteBuffer data, Charset charset)
    {
        if (null == charset)
        {
            charset = Charset.defaultCharset();
        }
        return charset.decode(data).toString();
    }
    // ----------------------------------------------------------------------- 全角半角转换
    /**
     * 半角转全角
     *
     * @param input String.
     * @return 全角字符串.
     */
    public static String toSBC(String input)
    {
        return toSBC(input, null);
    }
    /**
     * 半角转全角
     *
     * @param input String
     * @param notConvertSet 不替换的字符集合
     * @return 全角字符串.
     */
    public static String toSBC(String input, Set<Character> notConvertSet)
    {
        char[] c = input.toCharArray();
        for (int i = 0; i < c.length; i++)
        {
            if (null != notConvertSet && notConvertSet.contains(c[i]))
            {
                // 跳过不替换的字符
                continue;
            }
            if (c[i] == ' ')
            {
                c[i] = '\u3000';
            }
            else if (c[i] < '\177')
            {
                c[i] = (char) (c[i] + 65248);
            }
        }
        return new String(c);
    }
    /**
     * 全角转半角
     *
     * @param input String.
     * @return 半角字符串
     */
    public static String toDBC(String input)
    {
        return toDBC(input, null);
    }
    /**
     * 替换全角为半角
     *
     * @param text 文本
     * @param notConvertSet 不替换的字符集合
     * @return 替换后的字符
     */
    public static String toDBC(String text, Set<Character> notConvertSet)
    {
        char[] c = text.toCharArray();
        for (int i = 0; i < c.length; i++)
        {
            if (null != notConvertSet && notConvertSet.contains(c[i]))
            {
                // 跳过不替换的字符
                continue;
            }
            if (c[i] == '\u3000')
            {
                c[i] = ' ';
            }
            else if (c[i] > '\uFF00' && c[i] < '\uFF5F')
            {
                c[i] = (char) (c[i] - 65248);
            }
        }
        return new String(c);
    }
    /**
     * 数字金额大写转换 先写个完整的然后将如零拾替换成零
     *
     * @param n 数字
     * @return 中文大写数字
     */
    public static String digitUppercase(double n)
    {
        String[] fraction = { "角", "分" };
        String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
        String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } };
        String head = n < 0 ? "负" : "";
        n = Math.abs(n);
        String s = "";
        for (int i = 0; i < fraction.length; i++)
        {
            s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", "");
        }
        if (s.length() < 1)
        {
            s = "整";
        }
        int integerPart = (int) Math.floor(n);
        for (int i = 0; i < unit[0].length && integerPart > 0; i++)
        {
            String p = "";
            for (int j = 0; j < unit[1].length && n > 0; j++)
            {
                p = digit[integerPart % 10] + unit[1][j] + p;
                integerPart = integerPart / 10;
            }
            s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s;
        }
        return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整");
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/text/StrFormatter.java
New file
@@ -0,0 +1,92 @@
package com.ruoyi.common.core.text;
import com.ruoyi.common.core.utils.StringUtils;
/**
 * 字符串格式化
 *
 * @author ruoyi
 */
public class StrFormatter
{
    public static final String EMPTY_JSON = "{}";
    public static final char C_BACKSLASH = '\\';
    public static final char C_DELIM_START = '{';
    public static final char C_DELIM_END = '}';
    /**
     * 格式化字符串<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例:<br>
     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
     *
     * @param strPattern 字符串模板
     * @param argArray 参数列表
     * @return 结果
     */
    public static String format(final String strPattern, final Object... argArray)
    {
        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
        {
            return strPattern;
        }
        final int strPatternLength = strPattern.length();
        // 初始化定义好的长度以获得更好的性能
        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
        int handledPosition = 0;
        int delimIndex;// 占位符所在位置
        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
        {
            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
            if (delimIndex == -1)
            {
                if (handledPosition == 0)
                {
                    return strPattern;
                }
                else
                { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
                    sbuf.append(strPattern, handledPosition, strPatternLength);
                    return sbuf.toString();
                }
            }
            else
            {
                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
                {
                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
                    {
                        // 转义符之前还有一个转义符,占位符依旧有效
                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
                        handledPosition = delimIndex + 2;
                    }
                    else
                    {
                        // 占位符被转义
                        argIndex--;
                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
                        sbuf.append(C_DELIM_START);
                        handledPosition = delimIndex + 1;
                    }
                }
                else
                {
                    // 正常占位符
                    sbuf.append(strPattern, handledPosition, delimIndex);
                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
                    handledPosition = delimIndex + 2;
                }
            }
        }
        // 加入最后一个占位符后所有的字符
        sbuf.append(strPattern, handledPosition, strPattern.length());
        return sbuf.toString();
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/CodeGenerateUtils.java
New file
@@ -0,0 +1,106 @@
package com.ruoyi.common.core.utils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
 * @Description 活动订单操作
 * @Author xiaochen
 * @Date 2021/7/28 10:26
 */
public class CodeGenerateUtils {
    /**
     * @return
     * @Description 获取商品编码
     * 商品编码规则:nanoTime(后5位)*5位随机数(10000~99999)
     * @Author xiaochen
     */
    public static String generateProductCode() {
        long nanoPart = System.nanoTime() % 100000L;
        if (nanoPart < 10000L) {
            nanoPart += 10000L;
        }
        long randomPart = (long) (Math.random() * (90000) + 10000);
        String code = "0" + String.valueOf((new BigDecimal(nanoPart).multiply(new BigDecimal(randomPart))));
        return code.substring(code.length() - 10);
    }
    /**
     * @param id: 用户id
     * @return
     * @Description 生成订单编号
     * 订单编号规则:(10位):(年末尾*月,取后2位)+(用户ID%3.33*日取整后2位)+(timestamp*10000以内随机数,取后6位)
     * @Author xiaochen
     */
    public static String generateOrderSn(long id) {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        year = year % 10;
        if (year == 0) year = 10;
        int month = calendar.get(Calendar.MONTH) + 1;
        int yearMonth = year * month;
        String yearMonthPart = "0" + yearMonth;
        yearMonthPart = yearMonthPart.substring(yearMonthPart.length() - 2);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        int dayNum = (int) ((id % 3.33) * day);
        String dayPart = "0" + dayNum;
        dayPart = dayPart.substring(dayPart.length() - 2);
        String timestampPart = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000);
        timestampPart = timestampPart.replace(".", "").replace("E", "");
        timestampPart = timestampPart.substring(0, 6);
        return yearMonthPart + dayPart + timestampPart;
    }
    /**
     * @return
     * @Description 生成统一支付单号  规则:年(2)月(2)日(2)时(2)分(2)+timestamp*5位随机整数取后5位
     * @Author xiaochen
     */
    public static String generateVolumeSn() {
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
        String dateTime = dateFormat.format(calendar.getTime());
        dateTime = dateTime.substring(2);
        String timestampPart = "" + (Math.random() * 10000) * (System.currentTimeMillis() / 10000);
        timestampPart = timestampPart.replace(".", "").replace("E", "");
        timestampPart = timestampPart.substring(0, 5);
        return dateTime + timestampPart;
    }
    public static void main(String[] args) {
        for (long i = 0; i < 20; i++) {
            //String timestampPart = ""+(Math.random() * 10000) * (System.currentTimeMillis()/10000);
            //System.out.println(timestampPart);
            //System.out.println(generateOrderSn(i));
            long l = System.currentTimeMillis() * Long.valueOf(CodeGenerateUtils.generateProductCode().substring(0, 5));
            System.out.println(String.valueOf(l).substring(0,10));
        }
    }
    /**
     * @description  id补0生成编号
     * @author  jqs
     * @date    2024/4/17 14:19
     * @param totalLength
     * @param id
     * @return  String
     */
    public static String toFillZeroCode(int totalLength, Long id) {
        String idStr = id.toString();
        int length = idStr.length();
        if(totalLength <= length){
            return idStr;
        }
        int fillLength = totalLength - length;
        StringBuilder idsbs = new StringBuilder();
        for (int i = 0; i < fillLength; i++) {
            idsbs.append("0");
        }
        return idsbs.append(idStr).toString();
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
New file
@@ -0,0 +1,387 @@
package com.ruoyi.common.core.utils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.poi.ss.usermodel.DateUtil;
import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.*;
/**
 * 时间工具类
 *
 * @author ruoyi
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils
{
    private static TimeZone tz = TimeZone.getTimeZone("GMT+8");
    public static String YYYY = "yyyy";
    public static String YYYY_MM = "yyyy-MM";
    public static String YYYY_MM_DD = "yyyy-MM-dd";
    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
    /**
     * 获取当前Date型日期
     *
     * @return Date() 当前日期
     */
    public static Date getNowDate()
    {
        return new Date();
    }
    /**
     * 获取当前日期, 默认格式为yyyy-MM-dd
     *
     * @return String
     */
    public static String getDate()
    {
        return dateTimeNow(YYYY_MM_DD);
    }
    public static final String getTime()
    {
        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
    }
    public static final String dateTimeNow()
    {
        return dateTimeNow(YYYYMMDDHHMMSS);
    }
    public static final String dateTimeNow(final String format)
    {
        return parseDateToStr(format, new Date());
    }
    public static final String dateTime(final Date date)
    {
        return parseDateToStr(YYYY_MM_DD, date);
    }
    public static final String parseDateToStr(final String format, final Date date)
    {
        return new SimpleDateFormat(format).format(date);
    }
    public static final Date dateTime(final String format, final String ts)
    {
        try
        {
            return new SimpleDateFormat(format).parse(ts);
        }
        catch (ParseException e)
        {
            throw new RuntimeException(e);
        }
    }
    /**
     * 日期路径 即年/月/日 如2018/08/08
     */
    public static final String datePath()
    {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyy/MM/dd");
    }
    /**
     * 日期路径 即年/月/日 如20180808
     */
    public static final String dateTime()
    {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyyMMdd");
    }
    /**
     * 日期型字符串转化为日期 格式
     */
    public static Date parseDate(Object str)
    {
        if (str == null)
        {
            return null;
        }
        try
        {
            return parseDate(str.toString(), parsePatterns);
        }
        catch (ParseException e)
        {
            return null;
        }
    }
    /**
     * 获取服务器启动时间
     */
    public static Date getServerStartDate()
    {
        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
        return new Date(time);
    }
    /**
     * 计算时间差
     *
     * @param endTime 最后时间
     * @param startTime 开始时间
     * @return 时间差(天/小时/分钟)
     */
    public static String timeDistance(Date endTime, Date startTime)
    {
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        // long ns = 1000;
        // 获得两个时间的毫秒时间差异
        long diff = endTime.getTime() - startTime.getTime();
        // 计算差多少天
        long day = diff / nd;
        // 计算差多少小时
        long hour = diff % nd / nh;
        // 计算差多少分钟
        long min = diff % nd % nh / nm;
        // 计算差多少秒//输出结果
        // long sec = diff % nd % nh % nm / ns;
        return day + "天" + hour + "小时" + min + "分钟";
    }
    /**
     * 增加 LocalDateTime ==> Date
     */
    public static Date toDate(LocalDateTime temporalAccessor)
    {
        ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }
    /**
     * 增加 LocalDate ==> Date
     */
    public static Date toDate(LocalDate temporalAccessor)
    {
        LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
        ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }
    /**
     * 计算两个日期之间相差的天数
     *
     * @param smdate 较小的时间
     * @param bdate  较大的时间
     * @return 相差天数
     */
    public static int daysBetween(Date smdate, Date bdate) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(smdate);
        long time1 = cal.getTimeInMillis();
        cal.setTime(bdate);
        long time2 = cal.getTimeInMillis();
        long days = (time2 - time1) / (1000 * 3600 * 24);
        return Integer.parseInt(String.valueOf(days));
    }
    /**
     * 得到系统日期
     *
     * @return
     */
    public static Date getDateTime() {
        TimeZone.setDefault(tz);
        return new Date();
    }
    /**
     * 字符串日期转Date yyyy-MM-dd HH:mm:ss
     *
     * @param dateStr
     * @return
     */
    public static Date getDate_str3(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(tz);
        if ("".equals(dateStr)) {
            dateStr = sdf.format(DateUtils.getDateTime());
        }
        Date date = null;
        try {
            date = sdf.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    /**
     * 指定日期所在周的周一和周日时间
     *
     * @return 结果集
     */
    public static Map<String, Date> getWeekDate(Date date) {
        Map<String, Date> map = new HashMap<>(2);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        // 获得当前日期是一个星期的第几天
        int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
        if (dayWeek == 1) {
            dayWeek = 8;
        }
        // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
        cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - dayWeek);
        Date mondayDate = cal.getTime();
        cal.add(Calendar.DATE, 4 + cal.getFirstDayOfWeek());
        Date sundayDate = cal.getTime();
        map.put("first", mondayDate);
        map.put("last", sundayDate);
        return map;
    }
    /**
     * 指定日期所在月的第一天/最后一天时间
     *
     * @return 结果集
     */
    public static Map<String, Date> getMonthDate(Date date) {
        Map<String, Date> map = new HashMap<>(2);
        Calendar cal = Calendar.getInstance();
        //设置指定日期
        cal.setTime(date);
        //获取当月第一天日期
        int first = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, first);
        Date firstDay = cal.getTime();
        map.put("first", firstDay);
        //获取当月最后一天日期
        int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DAY_OF_MONTH, last);
        Date lastDay = cal.getTime();
        map.put("last", lastDay);
        return map;
    }
    /**
     * 指定日期所在年的第一天/最后一天时间
     *
     * @return 结果集
     */
    public static Map<String, Date> getYearDate(Date date) {
        Map<String, Date> map = new HashMap<>(2);
        Calendar cal = Calendar.getInstance();
        //设置指定日期
        cal.setTime(date);
        //获取本年第一天日期
        int first = cal.getActualMinimum(Calendar.DAY_OF_YEAR);
        cal.set(Calendar.DAY_OF_YEAR, first);
        Date firstDay = cal.getTime();
        map.put("first", firstDay);
        //获取本年最后一天日期
        int last = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
        cal.set(Calendar.DAY_OF_YEAR, last);
        Date lastDay = cal.getTime();
        map.put("last", lastDay);
        return map;
    }
    /**
     * 分别获取日期中的年月日
     *
     * @param date 需要获取的日期
     * @return 结果集合
     */
    public static Map<String, String> getYearMonthDay(Date date) {
        String year = String.format("%tY", date);
        String month = String.format("%tm", date);
        String day = String.format("%td", date);
        Map<String, String> result = new HashMap<>(3);
        result.put("year", year);
        result.put("month", month);
        result.put("day", day);
        result.put("time", String.valueOf(date.getTime()));
        return result;
    }
    /**
     * Date转为LocalDateTime
     *
     * @param date 日期
     * @return LocalDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        return instant.atZone(zoneId).toLocalDateTime();
    }
    /**
     * LocalDateTime转Date
     *
     * @param dateTime 日期
     * @return Date
     */
    public static Date localDateTimeToDate(LocalDateTime dateTime) {
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zdt = dateTime.atZone(zoneId);
        return Date.from(zdt.toInstant());
    }
    /**
     * 获取当天的00:00:00
     *
     * @return
     */
    public static LocalDateTime getDayStart(LocalDateTime time) {
        return time.with(LocalTime.MIN);
    }
    /**
     * 获取当天的23:59:59
     *
     * @return
     */
    public static LocalDateTime getDayEnd(LocalDateTime time) {
        return time.with(LocalTime.MAX);
    }
    /**
     * string转LocalTime
     *
     * @return
     */
    public static LocalTime string2LocalTime(String time) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        return LocalTime.parse(time, formatter);
    }
    /**
     * localdatetime转为字符串
     *
     * @param time localdatetime
     * @return 字符串
     */
    public static String localDateTimeToString(LocalDateTime time) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return df.format(time);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExceptionUtil.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.common.core.utils;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.apache.commons.lang3.exception.ExceptionUtils;
/**
 * 错误信息处理类。
 *
 * @author ruoyi
 */
public class ExceptionUtil
{
    /**
     * 获取exception的详细错误信息。
     */
    public static String getExceptionMessage(Throwable e)
    {
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw, true));
        return sw.toString();
    }
    public static String getRootErrorMessage(Exception e)
    {
        Throwable root = ExceptionUtils.getRootCause(e);
        root = (root == null ? e : root);
        if (root == null)
        {
            return "";
        }
        String msg = root.getMessage();
        if (msg == null)
        {
            return "null";
        }
        return StringUtils.defaultString(msg);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/FileUploadUtils.java
New file
@@ -0,0 +1,183 @@
package com.ruoyi.common.core.utils;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Objects;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.core.exception.file.FileException;
import com.ruoyi.common.core.exception.file.FileNameLengthLimitExceededException;
import com.ruoyi.common.core.exception.file.FileSizeLimitExceededException;
import com.ruoyi.common.core.exception.file.InvalidExtensionException;
import com.ruoyi.common.core.utils.file.FileTypeUtils;
import com.ruoyi.common.core.utils.file.MimeTypeUtils;
import com.ruoyi.common.core.utils.uuid.Seq;
/**
 * 文件上传工具类
 *
 * @author ruoyi
 */
public class FileUploadUtils
{
    /**
     * 默认大小 50M
     */
    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
    /**
     * 默认的文件名最大长度 100
     */
    public static final int DEFAULT_FILE_NAME_LENGTH = 100;
    /**
     * 根据文件路径上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @return 文件名称
     * @throws IOException
     */
    public static final String upload(String baseDir, MultipartFile file) throws IOException
    {
        try
        {
            return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        }
        catch (FileException fe)
        {
            throw new IOException(fe.getDefaultMessage(), fe);
        }
        catch (Exception e)
        {
            throw new IOException(e.getMessage(), e);
        }
    }
    /**
     * 文件上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @param allowedExtension 上传文件类型
     * @return 返回上传成功的文件名
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws FileNameLengthLimitExceededException 文件名太长
     * @throws IOException 比如读写文件出错时
     * @throws InvalidExtensionException 文件校验异常
     */
    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException
    {
        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
        {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }
        assertAllowed(file, allowedExtension);
        String fileName = extractFilename(file);
        String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
        file.transferTo(Paths.get(absPath));
        return getPathFileName(fileName);
    }
    /**
     * 编码文件名
     */
    public static final String extractFilename(MultipartFile file)
    {
        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
                FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file));
    }
    private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
    {
        File desc = new File(uploadDir + File.separator + fileName);
        if (!desc.exists())
        {
            if (!desc.getParentFile().exists())
            {
                desc.getParentFile().mkdirs();
            }
        }
        return desc.isAbsolute() ? desc : desc.getAbsoluteFile();
    }
    private static final String getPathFileName(String fileName) throws IOException
    {
        String pathFileName = "/" + fileName;
        return pathFileName;
    }
    /**
     * 文件大小校验
     *
     * @param file 上传的文件
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws InvalidExtensionException 文件校验异常
     */
    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, InvalidExtensionException
    {
        long size = file.getSize();
        if (size > DEFAULT_MAX_SIZE)
        {
            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
        }
        String fileName = file.getOriginalFilename();
        String extension = FileTypeUtils.getExtension(file);
        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
        {
            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
                        fileName);
            }
            else
            {
                throw new InvalidExtensionException(allowedExtension, extension, fileName);
            }
        }
    }
    /**
     * 判断MIME类型是否是允许的MIME类型
     *
     * @param extension 上传文件类型
     * @param allowedExtension 允许上传文件类型
     * @return true/false
     */
    public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
    {
        for (String str : allowedExtension)
        {
            if (str.equalsIgnoreCase(extension))
            {
                return true;
            }
        }
        return false;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/GeodesyUtil.java
New file
@@ -0,0 +1,73 @@
package com.ruoyi.common.core.utils;
import org.gavaghan.geodesy.Ellipsoid;
import org.gavaghan.geodesy.GeodeticCalculator;
import org.gavaghan.geodesy.GeodeticCurve;
import org.gavaghan.geodesy.GlobalCoordinates;
import java.util.HashMap;
import java.util.Map;
/**
 * 计算两个金纬度坐标之间的直线距离
 */
public class GeodesyUtil {
    /**
     * 获取直线距离
     * @param fromLonLat
     * @param toLonLat
     * @return
     */
    public static Map<String, Double> getDistance(String fromLonLat, String toLonLat){
        Map<String, Double> map = null;
        if(StringUtils.isNotEmpty(fromLonLat) && StringUtils.isNotEmpty(toLonLat)){
            map = new HashMap<>();
            String[] from = fromLonLat.split(",");
            String[] to = toLonLat.split(",");
            GlobalCoordinates source = new GlobalCoordinates(Double.valueOf(from[1]), Double.valueOf(from[0]));
            GlobalCoordinates target = new GlobalCoordinates(Double.valueOf(to[1]), Double.valueOf(to[0]));
            double Sphere = getDistanceMeter(source, target, Ellipsoid.Sphere);
            double WGS84 = getDistanceMeter(source, target, Ellipsoid.WGS84);
            double GRS80 = getDistanceMeter(source, target, Ellipsoid.GRS80);
            double GRS67 = getDistanceMeter(source, target, Ellipsoid.GRS67);
            double ANS = getDistanceMeter(source, target, Ellipsoid.ANS);
            double WGS72 = getDistanceMeter(source, target, Ellipsoid.WGS72);
            double Clarke1858 = getDistanceMeter(source, target, Ellipsoid.Clarke1858);
            double Clarke1880 = getDistanceMeter(source, target, Ellipsoid.Clarke1880);
            System.out.println("Sphere坐标系计算结果:"+Sphere + "米");
            System.out.println("WGS84坐标系计算结果:"+WGS84 + "米");
            System.out.println("GRS80坐标系计算结果:"+GRS80 + "米");
            System.out.println("GRS67坐标系计算结果:"+GRS67 + "米");
            System.out.println("ANS坐标系计算结果:"+ANS + "米");
            System.out.println("WGS72坐标系计算结果:"+WGS72 + "米");
            System.out.println("Clarke1858坐标系计算结果:"+Clarke1858 + "米");
            System.out.println("Clarke1880坐标系计算结果:"+Clarke1880 + "米");
            map.put("Sphere", Sphere);
            map.put("WGS84", WGS84);
            map.put("GRS80", GRS80);
            map.put("GRS67", GRS67);
            map.put("ANS", ANS);
            map.put("WGS72", WGS72);
            map.put("Clarke1858", Clarke1858);
            map.put("Clarke1880", Clarke1880);
        }
        return map;
    }
    private static double getDistanceMeter(GlobalCoordinates gpsFrom, GlobalCoordinates gpsTo, Ellipsoid ellipsoid){
        //创建GeodeticCalculator,调用计算方法,传入坐标系、经纬度用于计算距离
        GeodeticCurve geoCurve = new GeodeticCalculator().calculateGeodeticCurve(ellipsoid, gpsFrom, gpsTo);
        return geoCurve.getEllipsoidalDistance();
    }
    public static void main(String[] ages){
        GeodesyUtil geodesyUtil = new GeodesyUtil();
        Map<String, Double> distance = geodesyUtil.getDistance("106.6664549,29.4158471", "104.0908333,30.4414610");
        System.err.println(distance);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java
New file
@@ -0,0 +1,330 @@
package com.ruoyi.common.core.utils;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.exception.ServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.*;
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
/**
 * 通用http发送方法
 *
 * @author ruoyi
 */
public class HttpUtils
{
    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
    /**
     * 向指定 URL 发送GET方法的请求
     *
     * @param url 发送请求的 URL
     * @return 所代表远程资源的响应结果
     */
    public static String sendGet(String url)
    {
        return sendGet(url, StringUtils.EMPTY);
    }
    /**
     * 向指定 URL 发送GET方法的请求
     *
     * @param url 发送请求的 URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param)
    {
        return sendGet(url, param, Constants.UTF8);
    }
    /**
     * 向指定 URL 发送GET方法的请求
     *
     * @param url 发送请求的 URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @param contentType 编码类型
     * @return 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param, String contentType)
    {
        StringBuilder result = new StringBuilder();
        BufferedReader in = null;
        try
        {
            String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url;
            log.info("sendGet - {}", urlNameString);
            URL realUrl = new URL(urlNameString);
            URLConnection connection = realUrl.openConnection();
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.connect();
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType));
            String line;
            while ((line = in.readLine()) != null)
            {
                result.append(line);
            }
            log.info("recv - {}", result);
        }
        catch (ConnectException e)
        {
            log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);
        }
        catch (SocketTimeoutException e)
        {
            log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);
        }
        catch (IOException e)
        {
            log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);
        }
        catch (Exception e)
        {
            log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);
        }
        finally
        {
            try
            {
                if (in != null)
                {
                    in.close();
                }
            }
            catch (Exception ex)
            {
                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
            }
        }
        return result.toString();
    }
    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url 发送请求的 URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param)
    {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        try
        {
            log.info("sendPost - {}", url);
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("contentType", "utf-8");
            conn.setDoOutput(true);
            conn.setDoInput(true);
            out = new PrintWriter(conn.getOutputStream());
            out.print(param);
            out.flush();
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
            String line;
            while ((line = in.readLine()) != null)
            {
                result.append(line);
            }
            log.info("recv - {}", result);
        }
        catch (ConnectException e)
        {
            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
        }
        catch (SocketTimeoutException e)
        {
            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
        }
        catch (IOException e)
        {
            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
        }
        catch (Exception e)
        {
            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
        }
        finally
        {
            try
            {
                if (out != null)
                {
                    out.close();
                }
                if (in != null)
                {
                    in.close();
                }
            }
            catch (IOException ex)
            {
                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
            }
        }
        return result.toString();
    }
    public static String sendSSLPost(String url, String param)
    {
        StringBuilder result = new StringBuilder();
        String urlNameString = url + "?" + param;
        try
        {
            log.info("sendSSLPost - {}", urlNameString);
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());
            URL console = new URL(urlNameString);
            HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("contentType", "utf-8");
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setSSLSocketFactory(sc.getSocketFactory());
            conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String ret = "";
            while ((ret = br.readLine()) != null)
            {
                if (ret != null && !"".equals(ret.trim()))
                {
                    result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
                }
            }
            log.info("recv - {}", result);
            conn.disconnect();
            br.close();
        }
        catch (ConnectException e)
        {
            log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
        }
        catch (SocketTimeoutException e)
        {
            log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
        }
        catch (IOException e)
        {
            log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
        }
        catch (Exception e)
        {
            log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
        }
        return result.toString();
    }
    public static void main(String[] args) {
        // 获取当前时间,并指定时区偏移为 +08:00
        OffsetDateTime now = OffsetDateTime.now(ZoneOffset.of("+08:00"));
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSxxx");
        // 将时间格式化为字符串
        String formattedDateTime = now.format(formatter);
        // 输出结果
        System.out.println(formattedDateTime);
    }
    public static String post(String strURL, String params) {
        String result = "";
        BufferedReader reader = null;
        try {
            URL url = new URL(strURL);// 创建连接
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setInstanceFollowRedirects(true);
            connection.setRequestMethod("POST"); // 设置请求方式
            connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式
            connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式
            connection.connect();
            if (params != null && !StringUtils.isEmpty(params)) {
                byte[] writebytes = params.getBytes();
                // 设置文件长度
                //   connection.setRequestProperty("Content-Length", String.valueOf(writebytes.length));
                OutputStream outwritestream = connection.getOutputStream();
                outwritestream.write(params.getBytes());
                outwritestream.flush();
                outwritestream.close();
                // Log.d("hlhupload", "doJsonPost: conn"+connection.getResponseCode());
            }
            if (connection.getResponseCode() == 200) {
                log.info("<<<<<<<<<<<<<请求响应:{}", connection.getResponseMessage());
                reader = new BufferedReader(
                        new InputStreamReader(connection.getInputStream()));
                result = reader.readLine();
                log.info("<<<<<<<<<<<<<请求响应:{}", result);
            } else {
                throw new ServiceException(connection.getResponseMessage());
            }
        } catch (Exception e) {
            throw new ServiceException("http的post请求异常!" + e.getMessage());
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }
    private static class TrustAnyTrustManager implements X509TrustManager
    {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType)
        {
        }
        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType)
        {
        }
        @Override
        public X509Certificate[] getAcceptedIssuers()
        {
            return new X509Certificate[] {};
        }
    }
    private static class TrustAnyHostnameVerifier implements HostnameVerifier
    {
        @Override
        public boolean verify(String hostname, SSLSession session)
        {
            return true;
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ImportExcelUtil.java
New file
@@ -0,0 +1,41 @@
package com.ruoyi.common.core.utils;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.List;
/**
 * 导出返回信息
 */
@Slf4j
public class ImportExcelUtil {
    /**
     * @param errorLines   错误行数
     * @param successLines 成功行数
     * @param errorMessage 错误信息
     * @return
     * @throws IOException
     */
    public static R<String > importReturnMsg(int errorLines, int successLines, List<String> errorMessage) throws IOException {
        if (errorLines == 0) {
            return R.ok("共" + successLines + "行数据全部导入成功!");
        } else {
            JSONObject result = new JSONObject(5);
            int totalCount = successLines + errorLines;
            result.put("totalCount", totalCount);
            result.put("errorCount", errorLines);
            result.put("errorMessage", errorMessage);
            result.put("successCount", successLines);
            result.put("msg", "总上传行数:" + totalCount + ",已导入行数:" + successLines + ",错误行数:" + errorLines);
            return R.ok(JSON.toJSONString(result));
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java
New file
@@ -0,0 +1,160 @@
package com.ruoyi.common.core.utils;
import java.util.Map;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.TokenConstants;
import com.ruoyi.common.core.text.Convert;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
/**
 * Jwt工具类
 *
 * @author ruoyi
 */
public class JwtUtils
{
    public static String secret = TokenConstants.SECRET;
    /**
     * 从数据声明生成令牌
     *
     * @param claims 数据声明
     * @return 令牌
     */
    public static String createToken(Map<String, Object> claims)
    {
        String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact();
        return token;
    }
    /**
     * 从令牌中获取数据声明
     *
     * @param token 令牌
     * @return 数据声明
     */
    public static Claims parseToken(String token)
    {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }
    /**
     * 根据令牌获取用户标识
     *
     * @param token 令牌
     * @return 用户ID
     */
    public static String getUserKey(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.USER_KEY);
    }
    /**
     * 根据令牌获取用户标识
     *
     * @param claims 身份信息
     * @return 用户ID
     */
    public static String getUserKey(Claims claims)
    {
        return getValue(claims, SecurityConstants.USER_KEY);
    }
    /**
     * 根据令牌获取用户类型
     *
     * @param token 令牌
     * @return 用户类型
     */
    public static String getUserType(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.USER_TYPE);
    }
    /**
     * 根据令牌获取用户类型
     *
     * @param claims 身份信息
     * @return 用户类型
     */
    public static String getUserType(Claims claims)
    {
        return getValue(claims, SecurityConstants.USER_TYPE);
    }
    /**
     * 小程序根据令牌获取用户标识
     *
     * @param token 令牌
     * @return 用户ID
     */
    public static String getUserKeyApplet(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.USER_APPLET_KEY);
    }
    /**
     * 根据令牌获取用户ID
     *
     * @param token 令牌
     * @return 用户ID
     */
    public static String getUserId(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.DETAILS_USER_ID);
    }
    /**
     * 根据身份信息获取用户ID
     *
     * @param claims 身份信息
     * @return 用户ID
     */
    public static String getUserId(Claims claims)
    {
        return getValue(claims, SecurityConstants.DETAILS_USER_ID);
    }
    /**
     * 根据令牌获取用户名
     *
     * @param token 令牌
     * @return 用户名
     */
    public static String getUserName(String token)
    {
        Claims claims = parseToken(token);
        return getValue(claims, SecurityConstants.DETAILS_USERNAME);
    }
    /**
     * 根据身份信息获取用户名
     *
     * @param claims 身份信息
     * @return 用户名
     */
    public static String getUserName(Claims claims)
    {
        return getValue(claims, SecurityConstants.DETAILS_USERNAME);
    }
    /**
     * 根据身份信息获取键值
     *
     * @param claims 身份信息
     * @param key 键
     * @return 值
     */
    public static String getValue(Claims claims, String key)
    {
        return Convert.toStr(claims.get(key), "");
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MD5Util.java
New file
@@ -0,0 +1,76 @@
package com.ruoyi.common.core.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
 /**
     * 给指定字符串按照md5算法去加密
     *
     * @param psd 需要加密的密码   加盐处理
     *
     * @return md5后的字符串
     */
    public static String encoder(String psd) {
        try {
            //加盐处理
            psd = psd + "mobilesafe";
            //1,指定加密算法类型
            MessageDigest digest = MessageDigest.getInstance("MD5");
            //2,将需要加密的字符串中转换成byte类型的数组,然后进行随机哈希过程
            byte[] bs = digest.digest(psd.getBytes());
//          System.out.println(bs.length);
            //3,循环遍历bs,然后让其生成32位字符串,固定写法
            //4,拼接字符串过程
            StringBuffer stringBuffer = new StringBuffer();
            for (byte b : bs) {
                int i = b & 0xff;
                //int类型的i需要转换成16机制字符
                String hexString = Integer.toHexString(i);
//              System.out.println(hexString);
                if (hexString.length() < 2) {
                    hexString = "0" + hexString;
                }
                stringBuffer.append(hexString);
            }
            //5,打印测试
            System.out.println(stringBuffer.toString());
            return stringBuffer.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
    /**
     * MD5加密字符串
     *
     * @param str
     * @return
     */
    public static String getMD5(String str) {
        if (StringUtils.isNotEmpty(str)) {
            try {
                // 创建MD5加密实例
                MessageDigest md = MessageDigest.getInstance("MD5");
                // 执行加密操作
                byte[] messageDigest = md.digest(str.getBytes());
                // 将得到的散列值转换为十六进制
                StringBuilder sb = new StringBuilder();
                for (byte b : messageDigest) {
                    sb.append(String.format("%02x", b));
                }
                // 返回MD5散列值
                return sb.toString();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }
        }
        return "";
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
New file
@@ -0,0 +1,197 @@
package com.ruoyi.common.core.utils;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.core.constant.MsgConstants;
import com.ruoyi.common.core.utils.req.SubmitTempletReq;
import org.apache.commons.codec.binary.Base64;
import java.util.concurrent.ThreadLocalRandom;
public class MsgUtil {
    public final static String ecName= "";
    public final static String secretKey= "";
    public final static String sign= "";
    /**
     * 更换手机号:【签名】验证码:XXX,用于更换手机号。请勿转发。
     * @param phone 手机号
     * @param code 验证码
     * @return
     */
    public static String codeMsg(String phone,String code){
        SubmitTempletReq submitReq = new SubmitTempletReq();
        String[] paramss = {code};
        submitReq.setApId(MsgConstants.CODE_AP_ID);
        submitReq.setEcName(ecName);
        submitReq.setSecretKey(secretKey);
        submitReq.setParams(JSON.toJSONString(paramss));
        submitReq.setMobiles(phone);
        submitReq.setAddSerial("");
        submitReq.setSign(sign);
        submitReq.setTemplateId(MsgConstants.CODE_TEMPLATE_ID);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(submitReq.getEcName());
        stringBuffer.append(submitReq.getApId());
        stringBuffer.append(submitReq.getSecretKey());
        stringBuffer.append(submitReq.getTemplateId());
        stringBuffer.append(submitReq.getMobiles());
        stringBuffer.append(submitReq.getParams());
        stringBuffer.append(submitReq.getSign());
        stringBuffer.append(submitReq.getAddSerial());
        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
        String reqText = JSON.toJSONString(submitReq);
        //加密
        String encode = Base64.encodeBase64String(reqText.getBytes());
        System.err.println(encode);
        return encode;
    }
    /**
     * 更换手机号:【签名】验证码:XXX,用于更换手机号。请勿转发。
     * @param phone 手机号
     * @param code 验证码
     * @return
     */
    public static String applyCodeMsg(String phone,String code){
        SubmitTempletReq submitReq = new SubmitTempletReq();
        String[] paramss = {code};
        submitReq.setApId(MsgConstants.APPLY_AP_ID);
        submitReq.setEcName(ecName);
        submitReq.setSecretKey(secretKey);
        submitReq.setParams(JSON.toJSONString(paramss));
        submitReq.setMobiles(phone);
        submitReq.setAddSerial("");
        submitReq.setSign(sign);
        submitReq.setTemplateId(MsgConstants.APPLY_TEMPLATE_ID);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(submitReq.getEcName());
        stringBuffer.append(submitReq.getApId());
        stringBuffer.append(submitReq.getSecretKey());
        stringBuffer.append(submitReq.getTemplateId());
        stringBuffer.append(submitReq.getMobiles());
        stringBuffer.append(submitReq.getParams());
        stringBuffer.append(submitReq.getSign());
        stringBuffer.append(submitReq.getAddSerial());
        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
        String reqText = JSON.toJSONString(submitReq);
        //加密
        String encode = Base64.encodeBase64String(reqText.getBytes());
        System.err.println(encode);
        return encode;
    }
    /**
     * 停车占位提醒:车辆已在3小时前完成充电,请及时取车,避免长时间占用充电资源。
     * @param phone 手机号
     * @return
     */
    public static String stopMsg(String phone){
        SubmitTempletReq submitReq = new SubmitTempletReq();
        submitReq.setTemplateId(MsgConstants.STOP_TEMPLATE_ID);
        submitReq.setApId(MsgConstants.STOP_AP_ID);
        submitReq.setEcName(ecName);
        submitReq.setSecretKey(secretKey);
        submitReq.setMobiles(phone);
        submitReq.setAddSerial("");
        submitReq.setSign(sign);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(submitReq.getEcName());
        stringBuffer.append(submitReq.getApId());
        stringBuffer.append(submitReq.getSecretKey());
        stringBuffer.append(submitReq.getTemplateId());
        stringBuffer.append(submitReq.getMobiles());
        stringBuffer.append(submitReq.getParams());
        stringBuffer.append(submitReq.getSign());
        stringBuffer.append(submitReq.getAddSerial());
        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
        String reqText = JSON.toJSONString(submitReq);
        //加密
        String encode = Base64.encodeBase64String(reqText.getBytes());
        System.err.println(encode);
        return encode;
    }
    /**
     * 充电结束:车辆充电结束,请及时取车。
     * @param phone 手机号
     * @return
     */
    public static String chargeStopMsg(String phone){
        SubmitTempletReq submitReq = new SubmitTempletReq();
        submitReq.setTemplateId(MsgConstants.CHARGE_TEMPLATE_ID);
        submitReq.setApId(MsgConstants.CHARGE_AP_ID);
        submitReq.setEcName(ecName);
        submitReq.setSecretKey(secretKey);
        submitReq.setMobiles(phone);
        submitReq.setAddSerial("");
        submitReq.setSign(sign);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(submitReq.getEcName());
        stringBuffer.append(submitReq.getApId());
        stringBuffer.append(submitReq.getSecretKey());
        stringBuffer.append(submitReq.getTemplateId());
        stringBuffer.append(submitReq.getMobiles());
        stringBuffer.append(submitReq.getParams());
        stringBuffer.append(submitReq.getSign());
        stringBuffer.append(submitReq.getAddSerial());
        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
        String reqText = JSON.toJSONString(submitReq);
        //加密
        String encode = Base64.encodeBase64String(reqText.getBytes());
        System.err.println(encode);
        return encode;
    }
    /**  phone  单词可拼接5000个号码
     * 桩故障(自动/手动):检测到【电站1】【编号】号桩设备离线,请及时查看处理!
     * @param phone 手机号
     * @param site 站点名称
     * @param chargeGun 桩编号
     * @return
     */
    public static String faultMsg(String phone,String site,String chargeGun){
        SubmitTempletReq submitReq = new SubmitTempletReq();
        if(site.length()<=10){
            String[] paramss = {site,chargeGun};
            submitReq.setParams(JSON.toJSONString(paramss));
        }else{
            String work1 = site.substring(0,10);
            String[] paramss = {work1,chargeGun};
            submitReq.setParams(JSON.toJSONString(paramss));
        }
        submitReq.setTemplateId(MsgConstants.FAULT_TEMPLATE_ID);
        submitReq.setApId(MsgConstants.FAULT_AP_ID);
        submitReq.setEcName(ecName);
        submitReq.setSecretKey(secretKey);
        submitReq.setMobiles(phone);
        submitReq.setAddSerial("");
        submitReq.setSign(sign);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(submitReq.getEcName());
        stringBuffer.append(submitReq.getApId());
        stringBuffer.append(submitReq.getSecretKey());
        stringBuffer.append(submitReq.getTemplateId());
        stringBuffer.append(submitReq.getMobiles());
        stringBuffer.append(submitReq.getParams());
        stringBuffer.append(submitReq.getSign());
        stringBuffer.append(submitReq.getAddSerial());
        submitReq.setMac(MD5Util.getMD5(stringBuffer.toString()));
        String reqText = JSON.toJSONString(submitReq);
        //加密
        String encode = Base64.encodeBase64String(reqText.getBytes());
        System.err.println(encode);
        return encode;
    }
    /**
     * 生成验证码
     * @return
     */
    public static String createCode(){
        return String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999));
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/OrderCodeUtil.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.common.core.utils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
public class OrderCodeUtil {
    public static String getOrderCode(String code){
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        String formattedDate = now.format(formatter);
        // 四位随机数
        Random random = new Random();
        int randomNumber = random.nextInt(9999); // 生成0-9998之间的随机数
        String formattedRandomNumber = String.format("%04d", randomNumber); // 补齐到4位
        // 拼接日期和随机数
        return code+formattedDate + formattedRandomNumber;
    }
    public static void main(String[] args) {
        // 测试方法
        System.out.println(getOrderCode("DH"));
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PageUtils.java
New file
@@ -0,0 +1,42 @@
package com.ruoyi.common.core.utils;
import com.github.pagehelper.PageHelper;
import com.ruoyi.common.core.utils.sql.SqlUtil;
import com.ruoyi.common.core.web.page.PageDomain;
import com.ruoyi.common.core.web.page.TableSupport;
/**
 * 分页工具类
 *
 * @author ruoyi
 */
public class PageUtils extends PageHelper
{
    /**
     * 设置请求分页数据
     */
    public static void startPage()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }
    public static void startPage(Integer pageNum,Integer pageSize){
        PageDomain pageDomain = TableSupport.buildPageRequest();
        String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
        Boolean reasonable = pageDomain.getReasonable();
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }
    /**
     * 清理分页的线程变量
     */
    public static void clearPage()
    {
        PageHelper.clearPage();
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PhoneNumberValidator.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.common.core.utils;
public class PhoneNumberValidator {
    // 定义一个匹配中国手机号的正则表达式
    private static final String CHINA_PHONE_REGEX = "^1[3-9]\\d{9}$";
    /**
     * 验证给定的字符串是否符合中国手机号的格式.
     *
     * @param phoneNumber 要验证的手机号
     * @return 如果手机号格式正确返回true,否则返回false
     */
    public static boolean isValidChinaPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.isEmpty()) {
            return false;
        }
        return phoneNumber.matches(CHINA_PHONE_REGEX);
    }
    public static void main(String[] args) {
        // 测试几个号码
        String[] phoneNumbers = {"13800138000", "15912345678", "18612345678", "110", "12345678901", "19912345678"};
        for (String phoneNumber : phoneNumbers) {
            System.out.println("Phone number: " + phoneNumber + " is valid: " + isValidChinaPhoneNumber(phoneNumber));
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ServletUtils.java
New file
@@ -0,0 +1,333 @@
package com.ruoyi.common.core.utils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.util.LinkedCaseInsensitiveMap;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.text.Convert;
import reactor.core.publisher.Mono;
/**
 * 客户端工具类
 *
 * @author ruoyi
 */
public class ServletUtils
{
    /**
     * 获取String参数
     */
    public static String getParameter(String name)
    {
        return getRequest().getParameter(name);
    }
    /**
     * 获取String参数
     */
    public static String getParameter(String name, String defaultValue)
    {
        return Convert.toStr(getRequest().getParameter(name), defaultValue);
    }
    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name)
    {
        return Convert.toInt(getRequest().getParameter(name));
    }
    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name, Integer defaultValue)
    {
        return Convert.toInt(getRequest().getParameter(name), defaultValue);
    }
    /**
     * 获取Boolean参数
     */
    public static Boolean getParameterToBool(String name)
    {
        return Convert.toBool(getRequest().getParameter(name));
    }
    /**
     * 获取Boolean参数
     */
    public static Boolean getParameterToBool(String name, Boolean defaultValue)
    {
        return Convert.toBool(getRequest().getParameter(name), defaultValue);
    }
    /**
     * 获得所有请求参数
     *
     * @param request 请求对象{@link ServletRequest}
     * @return Map
     */
    public static Map<String, String[]> getParams(ServletRequest request)
    {
        final Map<String, String[]> map = request.getParameterMap();
        return Collections.unmodifiableMap(map);
    }
    /**
     * 获得所有请求参数
     *
     * @param request 请求对象{@link ServletRequest}
     * @return Map
     */
    public static Map<String, String> getParamMap(ServletRequest request)
    {
        Map<String, String> params = new HashMap<>();
        for (Map.Entry<String, String[]> entry : getParams(request).entrySet())
        {
            params.put(entry.getKey(), StringUtils.join(entry.getValue(), ","));
        }
        return params;
    }
    /**
     * 获取request
     */
    public static HttpServletRequest getRequest()
    {
        try
        {
            return getRequestAttributes().getRequest();
        }
        catch (Exception e)
        {
            return null;
        }
    }
    /**
     * 获取response
     */
    public static HttpServletResponse getResponse()
    {
        try
        {
            return getRequestAttributes().getResponse();
        }
        catch (Exception e)
        {
            return null;
        }
    }
    /**
     * 获取session
     */
    public static HttpSession getSession()
    {
        return getRequest().getSession();
    }
    public static ServletRequestAttributes getRequestAttributes()
    {
        try
        {
            RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
            return (ServletRequestAttributes) attributes;
        }
        catch (Exception e)
        {
            return null;
        }
    }
    public static String getHeader(HttpServletRequest request, String name)
    {
        String value = request.getHeader(name);
        if (StringUtils.isEmpty(value))
        {
            return StringUtils.EMPTY;
        }
        return urlDecode(value);
    }
    public static Map<String, String> getHeaders(HttpServletRequest request)
    {
        Map<String, String> map = new LinkedCaseInsensitiveMap<>();
        Enumeration<String> enumeration = request.getHeaderNames();
        if (enumeration != null)
        {
            while (enumeration.hasMoreElements())
            {
                String key = enumeration.nextElement();
                String value = request.getHeader(key);
                map.put(key, value);
            }
        }
        return map;
    }
    /**
     * 将字符串渲染到客户端
     *
     * @param response 渲染对象
     * @param string 待渲染的字符串
     */
    public static void renderString(HttpServletResponse response, String string)
    {
        try
        {
            response.setStatus(200);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    /**
     * 是否是Ajax异步请求
     *
     * @param request
     */
    public static boolean isAjaxRequest(HttpServletRequest request)
    {
        String accept = request.getHeader("accept");
        if (accept != null && accept.contains("application/json"))
        {
            return true;
        }
        String xRequestedWith = request.getHeader("X-Requested-With");
        if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest"))
        {
            return true;
        }
        String uri = request.getRequestURI();
        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml"))
        {
            return true;
        }
        String ajax = request.getParameter("__ajax");
        return StringUtils.inStringIgnoreCase(ajax, "json", "xml");
    }
    /**
     * 内容编码
     *
     * @param str 内容
     * @return 编码后的内容
     */
    public static String urlEncode(String str)
    {
        try
        {
            return URLEncoder.encode(str, Constants.UTF8);
        }
        catch (UnsupportedEncodingException e)
        {
            return StringUtils.EMPTY;
        }
    }
    /**
     * 内容解码
     *
     * @param str 内容
     * @return 解码后的内容
     */
    public static String urlDecode(String str)
    {
        try
        {
            return URLDecoder.decode(str, Constants.UTF8);
        }
        catch (UnsupportedEncodingException e)
        {
            return StringUtils.EMPTY;
        }
    }
    /**
     * 设置webflux模型响应
     *
     * @param response ServerHttpResponse
     * @param value 响应内容
     * @return Mono<Void>
     */
    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value)
    {
        return webFluxResponseWriter(response, HttpStatus.OK, value, R.FAIL);
    }
    /**
     * 设置webflux模型响应
     *
     * @param response ServerHttpResponse
     * @param code 响应状态码
     * @param value 响应内容
     * @return Mono<Void>
     */
    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, Object value, int code)
    {
        return webFluxResponseWriter(response, HttpStatus.OK, value, code);
    }
    /**
     * 设置webflux模型响应
     *
     * @param response ServerHttpResponse
     * @param status http状态码
     * @param code 响应状态码
     * @param value 响应内容
     * @return Mono<Void>
     */
    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, HttpStatus status, Object value, int code)
    {
        return webFluxResponseWriter(response, MediaType.APPLICATION_JSON_VALUE, status, value, code);
    }
    /**
     * 设置webflux模型响应
     *
     * @param response ServerHttpResponse
     * @param contentType content-type
     * @param status http状态码
     * @param code 响应状态码
     * @param value 响应内容
     * @return Mono<Void>
     */
    public static Mono<Void> webFluxResponseWriter(ServerHttpResponse response, String contentType, HttpStatus status, Object value, int code)
    {
        response.setStatusCode(status);
        response.getHeaders().add(HttpHeaders.CONTENT_TYPE, contentType);
        R<?> result = R.fail(code, value.toString());
        DataBuffer dataBuffer = response.bufferFactory().wrap(JSON.toJSONString(result).getBytes());
        return response.writeWith(Mono.just(dataBuffer));
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/SpringUtils.java
New file
@@ -0,0 +1,114 @@
package com.ruoyi.common.core.utils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;
/**
 * spring工具类 方便在非spring管理环境中获取bean
 *
 * @author ruoyi
 */
@Component
public final class SpringUtils implements BeanFactoryPostProcessor
{
    /** Spring应用上下文环境 */
    private static ConfigurableListableBeanFactory beanFactory;
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException
    {
        SpringUtils.beanFactory = beanFactory;
    }
    /**
     * 获取对象
     *
     * @param name
     * @return Object 一个以所给名字注册的bean的实例
     * @throws org.springframework.beans.BeansException
     *
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException
    {
        return (T) beanFactory.getBean(name);
    }
    /**
     * 获取类型为requiredType的对象
     *
     * @param clz
     * @return
     * @throws org.springframework.beans.BeansException
     *
     */
    public static <T> T getBean(Class<T> clz) throws BeansException
    {
        T result = (T) beanFactory.getBean(clz);
        return result;
    }
    /**
     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
     *
     * @param name
     * @return boolean
     */
    public static boolean containsBean(String name)
    {
        return beanFactory.containsBean(name);
    }
    /**
     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
     *
     * @param name
     * @return boolean
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     *
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.isSingleton(name);
    }
    /**
     * @param name
     * @return Class 注册对象的类型
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     *
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.getType(name);
    }
    /**
     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
     *
     * @param name
     * @return
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     *
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException
    {
        return beanFactory.getAliases(name);
    }
    /**
     * 获取aop代理对象
     *
     * @param invoker
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T getAopProxy(T invoker)
    {
        return (T) AopContext.currentProxy();
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StringUtils.java
New file
@@ -0,0 +1,561 @@
package com.ruoyi.common.core.utils;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.springframework.util.AntPathMatcher;
import com.ruoyi.common.core.constant.Constants;
import com.ruoyi.common.core.text.StrFormatter;
/**
 * 字符串工具类
 *
 * @author ruoyi
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils
{
    /** 空字符串 */
    private static final String NULLSTR = "";
    /** 下划线 */
    private static final char SEPARATOR = '_';
    /**
     * 获取参数不为空值
     *
     * @param value defaultValue 要判断的value
     * @return value 返回值
     */
    public static <T> T nvl(T value, T defaultValue)
    {
        return value != null ? value : defaultValue;
    }
    /**
     * * 判断一个Collection是否为空, 包含List,Set,Queue
     *
     * @param coll 要判断的Collection
     * @return true:为空 false:非空
     */
    public static boolean isEmpty(Collection<?> coll)
    {
        return isNull(coll) || coll.isEmpty();
    }
    /**
     * * 判断一个Collection是否非空,包含List,Set,Queue
     *
     * @param coll 要判断的Collection
     * @return true:非空 false:空
     */
    public static boolean isNotEmpty(Collection<?> coll)
    {
        return !isEmpty(coll);
    }
    /**
     * * 判断一个对象数组是否为空
     *
     * @param objects 要判断的对象数组
     ** @return true:为空 false:非空
     */
    public static boolean isEmpty(Object[] objects)
    {
        return isNull(objects) || (objects.length == 0);
    }
    /**
     * * 判断一个对象数组是否非空
     *
     * @param objects 要判断的对象数组
     * @return true:非空 false:空
     */
    public static boolean isNotEmpty(Object[] objects)
    {
        return !isEmpty(objects);
    }
    /**
     * * 判断一个Map是否为空
     *
     * @param map 要判断的Map
     * @return true:为空 false:非空
     */
    public static boolean isEmpty(Map<?, ?> map)
    {
        return isNull(map) || map.isEmpty();
    }
    /**
     * * 判断一个Map是否为空
     *
     * @param map 要判断的Map
     * @return true:非空 false:空
     */
    public static boolean isNotEmpty(Map<?, ?> map)
    {
        return !isEmpty(map);
    }
    /**
     * * 判断一个字符串是否为空串
     *
     * @param str String
     * @return true:为空 false:非空
     */
    public static boolean isEmpty(String str)
    {
        return isNull(str) || NULLSTR.equals(str.trim());
    }
    /**
     * * 判断一个字符串是否为非空串
     *
     * @param str String
     * @return true:非空串 false:空串
     */
    public static boolean isNotEmpty(String str)
    {
        return !isEmpty(str);
    }
    /**
     * * 判断一个对象是否为空
     *
     * @param object Object
     * @return true:为空 false:非空
     */
    public static boolean isNull(Object object)
    {
        return object == null;
    }
    /**
     * * 判断一个对象是否非空
     *
     * @param object Object
     * @return true:非空 false:空
     */
    public static boolean isNotNull(Object object)
    {
        return !isNull(object);
    }
    /**
     * * 判断一个对象是否是数组类型(Java基本型别的数组)
     *
     * @param object 对象
     * @return true:是数组 false:不是数组
     */
    public static boolean isArray(Object object)
    {
        return isNotNull(object) && object.getClass().isArray();
    }
    /**
     * 去空格
     */
    public static String trim(String str)
    {
        return (str == null ? "" : str.trim());
    }
    /**
     * 截取字符串
     *
     * @param str 字符串
     * @param start 开始
     * @return 结果
     */
    public static String substring(final String str, int start)
    {
        if (str == null)
        {
            return NULLSTR;
        }
        if (start < 0)
        {
            start = str.length() + start;
        }
        if (start < 0)
        {
            start = 0;
        }
        if (start > str.length())
        {
            return NULLSTR;
        }
        return str.substring(start);
    }
    /**
     * 截取字符串
     *
     * @param str 字符串
     * @param start 开始
     * @param end 结束
     * @return 结果
     */
    public static String substring(final String str, int start, int end)
    {
        if (str == null)
        {
            return NULLSTR;
        }
        if (end < 0)
        {
            end = str.length() + end;
        }
        if (start < 0)
        {
            start = str.length() + start;
        }
        if (end > str.length())
        {
            end = str.length();
        }
        if (start > end)
        {
            return NULLSTR;
        }
        if (start < 0)
        {
            start = 0;
        }
        if (end < 0)
        {
            end = 0;
        }
        return str.substring(start, end);
    }
    /**
     * 判断是否为空,并且不是空白字符
     *
     * @param str 要判断的value
     * @return 结果
     */
    public static boolean hasText(String str)
    {
        return (str != null && !str.isEmpty() && containsText(str));
    }
    private static boolean containsText(CharSequence str)
    {
        int strLen = str.length();
        for (int i = 0; i < strLen; i++)
        {
            if (!Character.isWhitespace(str.charAt(i)))
            {
                return true;
            }
        }
        return false;
    }
    /**
     * 格式化文本, {} 表示占位符<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例:<br>
     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
     *
     * @param template 文本模板,被替换的部分用 {} 表示
     * @param params 参数值
     * @return 格式化后的文本
     */
    public static String format(String template, Object... params)
    {
        if (isEmpty(params) || isEmpty(template))
        {
            return template;
        }
        return StrFormatter.format(template, params);
    }
    /**
     * 是否为http(s)://开头
     *
     * @param link 链接
     * @return 结果
     */
    public static boolean ishttp(String link)
    {
        return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS);
    }
    /**
     * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value
     *
     * @param collection 给定的集合
     * @param array 给定的数组
     * @return boolean 结果
     */
    public static boolean containsAny(Collection<String> collection, String... array)
    {
        if (isEmpty(collection) || isEmpty(array))
        {
            return false;
        }
        else
        {
            for (String str : array)
            {
                if (collection.contains(str))
                {
                    return true;
                }
            }
            return false;
        }
    }
    /**
     * 驼峰转下划线命名
     */
    public static String toUnderScoreCase(String str)
    {
        if (str == null)
        {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        // 前置字符是否大写
        boolean preCharIsUpperCase = true;
        // 当前字符是否大写
        boolean curreCharIsUpperCase = true;
        // 下一字符是否大写
        boolean nexteCharIsUpperCase = true;
        for (int i = 0; i < str.length(); i++)
        {
            char c = str.charAt(i);
            if (i > 0)
            {
                preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1));
            }
            else
            {
                preCharIsUpperCase = false;
            }
            curreCharIsUpperCase = Character.isUpperCase(c);
            if (i < (str.length() - 1))
            {
                nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1));
            }
            if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase)
            {
                sb.append(SEPARATOR);
            }
            else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase)
            {
                sb.append(SEPARATOR);
            }
            sb.append(Character.toLowerCase(c));
        }
        return sb.toString();
    }
    /**
     * 是否包含字符串
     *
     * @param str 验证字符串
     * @param strs 字符串组
     * @return 包含返回true
     */
    public static boolean inStringIgnoreCase(String str, String... strs)
    {
        if (str != null && strs != null)
        {
            for (String s : strs)
            {
                if (str.equalsIgnoreCase(trim(s)))
                {
                    return true;
                }
            }
        }
        return false;
    }
    /**
     * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld
     *
     * @param name 转换前的下划线大写方式命名的字符串
     * @return 转换后的驼峰式命名的字符串
     */
    public static String convertToCamelCase(String name)
    {
        StringBuilder result = new StringBuilder();
        // 快速检查
        if (name == null || name.isEmpty())
        {
            // 没必要转换
            return "";
        }
        else if (!name.contains("_"))
        {
            // 不含下划线,仅将首字母大写
            return name.substring(0, 1).toUpperCase() + name.substring(1);
        }
        // 用下划线将原始字符串分割
        String[] camels = name.split("_");
        for (String camel : camels)
        {
            // 跳过原始字符串中开头、结尾的下换线或双重下划线
            if (camel.isEmpty())
            {
                continue;
            }
            // 首字母大写
            result.append(camel.substring(0, 1).toUpperCase());
            result.append(camel.substring(1).toLowerCase());
        }
        return result.toString();
    }
    /**
     * 驼峰式命名法
     * 例如:user_name->userName
     */
    public static String toCamelCase(String s)
    {
        if (s == null)
        {
            return null;
        }
        if (s.indexOf(SEPARATOR) == -1)
        {
            return s;
        }
        s = s.toLowerCase();
        StringBuilder sb = new StringBuilder(s.length());
        boolean upperCase = false;
        for (int i = 0; i < s.length(); i++)
        {
            char c = s.charAt(i);
            if (c == SEPARATOR)
            {
                upperCase = true;
            }
            else if (upperCase)
            {
                sb.append(Character.toUpperCase(c));
                upperCase = false;
            }
            else
            {
                sb.append(c);
            }
        }
        return sb.toString();
    }
    /**
     * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串
     *
     * @param str 指定字符串
     * @param strs 需要检查的字符串数组
     * @return 是否匹配
     */
    public static boolean matches(String str, List<String> strs)
    {
        if (isEmpty(str) || isEmpty(strs))
        {
            return false;
        }
        for (String pattern : strs)
        {
            if (isMatch(pattern, str))
            {
                return true;
            }
        }
        return false;
    }
    /**
     * 判断url是否与规则配置:
     * ? 表示单个字符;
     * * 表示一层路径内的任意字符串,不可跨层级;
     * ** 表示任意层路径;
     *
     * @param pattern 匹配规则
     * @param url 需要匹配的url
     * @return
     */
    public static boolean isMatch(String pattern, String url)
    {
        AntPathMatcher matcher = new AntPathMatcher();
        return matcher.match(pattern, url);
    }
    @SuppressWarnings("unchecked")
    public static <T> T cast(Object obj)
    {
        return (T) obj;
    }
    /**
     * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。
     *
     * @param num 数字对象
     * @param size 字符串指定长度
     * @return 返回数字的字符串格式,该字符串为指定长度。
     */
    public static final String padl(final Number num, final int size)
    {
        return padl(num.toString(), size, '0');
    }
    /**
     * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。
     *
     * @param s 原始字符串
     * @param size 字符串指定长度
     * @param c 用于补齐的字符
     * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。
     */
    public static final String padl(final String s, final int size, final char c)
    {
        final StringBuilder sb = new StringBuilder(size);
        if (s != null)
        {
            final int len = s.length();
            if (s.length() <= size)
            {
                for (int i = size - len; i > 0; i--)
                {
                    sb.append(c);
                }
                sb.append(s);
            }
            else
            {
                return s.substring(len - size, len);
            }
        }
        else
        {
            for (int i = size; i > 0; i--)
            {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/WebUtils.java
New file
@@ -0,0 +1,169 @@
package com.ruoyi.common.core.utils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
/**
 * web工具类
 *
 * @author liheng
 */
public final class WebUtils extends org.springframework.web.util.WebUtils {
    /**
     * 当前请求
     */
    public static HttpServletRequest request() {
        return contextHolder() == null ? null : contextHolder().getRequest();
    }
    /**
     * 当前响应
     */
    public static HttpServletResponse response() {
        return contextHolder() == null ? null : contextHolder().getResponse();
    }
    /**
     * 当前session
     */
    public static HttpSession session() {
        return request() == null ? null : request().getSession();
    }
    /**
     * 当前ServletRequest
     */
    public static ServletRequestAttributes contextHolder() {
        return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    }
    /**
     * 判断请求是否为 AJAX
     *
     * @param request 当前请求
     */
    public static boolean isAjax(HttpServletRequest request) {
        return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
    }
    /**
     * 获取操作系统,浏览器及浏览器版本信息
     *
     * @param request
     * @return
     */
    public static Map<String, String> getOsAndBrowserInfo(HttpServletRequest request) {
        Map<String, String> map = new HashMap<>(2);
        String browserDetails = request.getHeader("User-Agent");
        String userAgent = browserDetails;
        String user = userAgent.toLowerCase();
        String os = "";
        String browser = "";
        //=================OS Info=======================
        if (userAgent.toLowerCase().contains("windows")) {
            os = "Windows";
        } else if (userAgent.toLowerCase().contains("mac")) {
            os = "Mac";
        } else if (userAgent.toLowerCase().contains("x11")) {
            os = "Unix";
        } else if (userAgent.toLowerCase().contains("android")) {
            os = "Android";
        } else if (userAgent.toLowerCase().contains("iphone")) {
            os = "IPhone";
        } else {
            os = "UnKnown, More-Info: " + userAgent;
        }
        //===============Browser===========================
        if (user.contains("edge")) {
            browser = (userAgent.substring(userAgent.indexOf("Edge")).split(" ")[0]).replace("/", "-");
        } else if (user.contains("msie")) {
            String substring = userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0];
            browser = substring.split(" ")[0].replace("MSIE", "IE") + "-" + substring.split(" ")[1];
        } else if (user.contains("safari") && user.contains("version")) {
            browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]
                    + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
        } else if (user.contains("opr") || user.contains("opera")) {
            if (user.contains("opera")) {
                browser = (userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]
                        + "-" + (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1];
            } else if (user.contains("opr")) {
                browser = ((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-"))
                        .replace("OPR", "Opera");
            }
        } else if (user.contains("chrome")) {
            browser = (userAgent.substring(userAgent.indexOf("Chrome")).split(" ")[0]).replace("/", "-");
        } else if ((user.contains("mozilla/7.0")) || (user.contains("netscape6")) ||
                (user.contains("mozilla/4.7")) || (user.contains("mozilla/4.78")) ||
                (user.contains("mozilla/4.08")) || (user.contains("mozilla/3"))) {
            browser = "Netscape-?";
        } else if (user.contains("firefox")) {
            browser = (userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-");
        } else if (user.contains("rv")) {
            String IEVersion = (userAgent.substring(userAgent.indexOf("rv")).split(" ")[0]).replace("rv:", "-");
            browser = "IE" + IEVersion.substring(0, IEVersion.length() - 1);
        } else {
            browser = "UnKnown, More-Info: " + userAgent;
        }
        map.put("os", os);
        map.put("browser", browser);
        return map;
    }
    /**
     * 读取cookie
     *
     * @param name cookie name
     * @return cookie value
     */
    public String getCookieVal(String name) {
        return getCookieVal(request(), name);
    }
    /**
     * 读取cookie
     *
     * @param request HttpServletRequest
     * @param name    cookie name
     * @return cookie value
     */
    public String getCookieVal(HttpServletRequest request, String name) {
        Cookie cookie = getCookie(request, name);
        return cookie != null ? cookie.getValue() : null;
    }
    /**
     * 清除 某个指定的cookie
     *
     * @param response HttpServletResponse
     * @param key      cookie key
     */
    public void removeCookie(HttpServletResponse response, String key) {
        setCookie(response, key, null, 0);
    }
    /**
     * 设置cookie
     *
     * @param response        HttpServletResponse
     * @param name            cookie name
     * @param value           cookie value
     * @param maxAgeInSeconds maxage
     */
    public void setCookie(HttpServletResponse response, String name, String value, int maxAgeInSeconds) {
        Cookie cookie = new Cookie(name, value);
        cookie.setPath("/");
        cookie.setMaxAge(maxAgeInSeconds);
        //cookie.setHttpOnly(true);
        response.addCookie(cookie);
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanUtils.java
New file
@@ -0,0 +1,110 @@
package com.ruoyi.common.core.utils.bean;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * Bean 工具类
 *
 * @author ruoyi
 */
public class BeanUtils extends org.springframework.beans.BeanUtils
{
    /** Bean方法名中属性名开始的下标 */
    private static final int BEAN_METHOD_PROP_INDEX = 3;
    /** * 匹配getter方法的正则表达式 */
    private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)");
    /** * 匹配setter方法的正则表达式 */
    private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)");
    /**
     * Bean属性复制工具方法。
     *
     * @param dest 目标对象
     * @param src 源对象
     */
    public static void copyBeanProp(Object dest, Object src)
    {
        try
        {
            copyProperties(src, dest);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    /**
     * 获取对象的setter方法。
     *
     * @param obj 对象
     * @return 对象的setter方法列表
     */
    public static List<Method> getSetterMethods(Object obj)
    {
        // setter方法列表
        List<Method> setterMethods = new ArrayList<Method>();
        // 获取所有方法
        Method[] methods = obj.getClass().getMethods();
        // 查找setter方法
        for (Method method : methods)
        {
            Matcher m = SET_PATTERN.matcher(method.getName());
            if (m.matches() && (method.getParameterTypes().length == 1))
            {
                setterMethods.add(method);
            }
        }
        // 返回setter方法列表
        return setterMethods;
    }
    /**
     * 获取对象的getter方法。
     *
     * @param obj 对象
     * @return 对象的getter方法列表
     */
    public static List<Method> getGetterMethods(Object obj)
    {
        // getter方法列表
        List<Method> getterMethods = new ArrayList<Method>();
        // 获取所有方法
        Method[] methods = obj.getClass().getMethods();
        // 查找getter方法
        for (Method method : methods)
        {
            Matcher m = GET_PATTERN.matcher(method.getName());
            if (m.matches() && (method.getParameterTypes().length == 0))
            {
                getterMethods.add(method);
            }
        }
        // 返回getter方法列表
        return getterMethods;
    }
    /**
     * 检查Bean方法名中的属性名是否相等。<br>
     * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。
     *
     * @param m1 方法名1
     * @param m2 方法名2
     * @return 属性名一样返回true,否则返回false
     */
    public static boolean isMethodPropEquals(String m1, String m2)
    {
        return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX));
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/bean/BeanValidators.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.common.core.utils.bean;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Validator;
/**
 * bean对象属性验证
 *
 * @author ruoyi
 */
public class BeanValidators
{
    public static void validateWithException(Validator validator, Object object, Class<?>... groups)
            throws ConstraintViolationException
    {
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
        if (!constraintViolations.isEmpty())
        {
            throw new ConstraintViolationException(constraintViolations);
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileTypeUtils.java
New file
@@ -0,0 +1,95 @@
package com.ruoyi.common.core.utils.file;
import java.io.File;
import java.util.Objects;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
/**
 * 文件类型工具类
 *
 * @author ruoyi
 */
public class FileTypeUtils
{
    /**
     * 获取文件类型
     * <p>
     * 例如: ruoyi.txt, 返回: txt
     *
     * @param file 文件名
     * @return 后缀(不含".")
     */
    public static String getFileType(File file)
    {
        if (null == file)
        {
            return StringUtils.EMPTY;
        }
        return getFileType(file.getName());
    }
    /**
     * 获取文件类型
     * <p>
     * 例如: ruoyi.txt, 返回: txt
     *
     * @param fileName 文件名
     * @return 后缀(不含".")
     */
    public static String getFileType(String fileName)
    {
        int separatorIndex = fileName.lastIndexOf(".");
        if (separatorIndex < 0)
        {
            return "";
        }
        return fileName.substring(separatorIndex + 1).toLowerCase();
    }
    /**
     * 获取文件名的后缀
     *
     * @param file 表单文件
     * @return 后缀名
     */
    public static final String getExtension(MultipartFile file)
    {
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        if (StringUtils.isEmpty(extension))
        {
            extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
        }
        return extension;
    }
    /**
     * 获取文件类型
     *
     * @param photoByte 文件字节码
     * @return 后缀(不含".")
     */
    public static String getFileExtendName(byte[] photoByte)
    {
        String strFileExtendName = "JPG";
        if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
                && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
        {
            strFileExtendName = "GIF";
        }
        else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
        {
            strFileExtendName = "JPG";
        }
        else if ((photoByte[0] == 66) && (photoByte[1] == 77))
        {
            strFileExtendName = "BMP";
        }
        else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
        {
            strFileExtendName = "PNG";
        }
        return strFileExtendName;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java
New file
@@ -0,0 +1,253 @@
package com.ruoyi.common.core.utils.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import com.ruoyi.common.core.utils.StringUtils;
/**
 * 文件处理工具类
 *
 * @author ruoyi
 */
public class FileUtils
{
    /** 字符常量:斜杠 {@code '/'} */
    public static final char SLASH = '/';
    /** 字符常量:反斜杠 {@code '\\'} */
    public static final char BACKSLASH = '\\';
    public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
    /**
     * 输出指定文件的byte数组
     *
     * @param filePath 文件路径
     * @param os 输出流
     * @return
     */
    public static void writeBytes(String filePath, OutputStream os) throws IOException
    {
        FileInputStream fis = null;
        try
        {
            File file = new File(filePath);
            if (!file.exists())
            {
                throw new FileNotFoundException(filePath);
            }
            fis = new FileInputStream(file);
            byte[] b = new byte[1024];
            int length;
            while ((length = fis.read(b)) > 0)
            {
                os.write(b, 0, length);
            }
        }
        catch (IOException e)
        {
            throw e;
        }
        finally
        {
            if (os != null)
            {
                try
                {
                    os.close();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
            }
            if (fis != null)
            {
                try
                {
                    fis.close();
                }
                catch (IOException e1)
                {
                    e1.printStackTrace();
                }
            }
        }
    }
    /**
     * 删除文件
     *
     * @param filePath 文件
     * @return
     */
    public static boolean deleteFile(String filePath)
    {
        boolean flag = false;
        File file = new File(filePath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists())
        {
            flag = file.delete();
        }
        return flag;
    }
    /**
     * 文件名称验证
     *
     * @param filename 文件名称
     * @return true 正常 false 非法
     */
    public static boolean isValidFilename(String filename)
    {
        return filename.matches(FILENAME_PATTERN);
    }
    /**
     * 检查文件是否可下载
     *
     * @param resource 需要下载的文件
     * @return true 正常 false 非法
     */
    public static boolean checkAllowDownload(String resource)
    {
        // 禁止目录上跳级别
        if (StringUtils.contains(resource, ".."))
        {
            return false;
        }
        // 判断是否在允许下载的文件规则内
        return ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource));
    }
    /**
     * 下载文件名重新编码
     *
     * @param request 请求对象
     * @param fileName 文件名
     * @return 编码后的文件名
     */
    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
    {
        final String agent = request.getHeader("USER-AGENT");
        String filename = fileName;
        if (agent.contains("MSIE"))
        {
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        }
        else if (agent.contains("Firefox"))
        {
            // 火狐浏览器
            filename = new String(fileName.getBytes(), "ISO8859-1");
        }
        else if (agent.contains("Chrome"))
        {
            // google浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        else
        {
            // 其它浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }
    /**
     * 返回文件名
     *
     * @param filePath 文件
     * @return 文件名
     */
    public static String getName(String filePath)
    {
        if (null == filePath)
        {
            return null;
        }
        int len = filePath.length();
        if (0 == len)
        {
            return filePath;
        }
        if (isFileSeparator(filePath.charAt(len - 1)))
        {
            // 以分隔符结尾的去掉结尾分隔符
            len--;
        }
        int begin = 0;
        char c;
        for (int i = len - 1; i > -1; i--)
        {
            c = filePath.charAt(i);
            if (isFileSeparator(c))
            {
                // 查找最后一个路径分隔符(/或者\)
                begin = i + 1;
                break;
            }
        }
        return filePath.substring(begin, len);
    }
    /**
     * 是否为Windows或者Linux(Unix)文件分隔符<br>
     * Windows平台下分隔符为\,Linux(Unix)为/
     *
     * @param c 字符
     * @return 是否为Windows或者Linux(Unix)文件分隔符
     */
    public static boolean isFileSeparator(char c)
    {
        return SLASH == c || BACKSLASH == c;
    }
    /**
     * 下载文件名重新编码
     *
     * @param response 响应对象
     * @param realFileName 真实文件名
     * @return
     */
    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException
    {
        String percentEncodedFileName = percentEncode(realFileName);
        StringBuilder contentDispositionValue = new StringBuilder();
        contentDispositionValue.append("attachment; filename=")
                .append(percentEncodedFileName)
                .append(";")
                .append("filename*=")
                .append("utf-8''")
                .append(percentEncodedFileName);
        response.setHeader("Content-disposition", contentDispositionValue.toString());
        response.setHeader("download-filename", percentEncodedFileName);
    }
    /**
     * 百分号编码工具方法
     *
     * @param s 需要百分号编码的字符串
     * @return 百分号编码后的字符串
     */
    public static String percentEncode(String s) throws UnsupportedEncodingException
    {
        String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
        return encode.replaceAll("\\+", "%20");
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/ImageUtils.java
New file
@@ -0,0 +1,84 @@
package com.ruoyi.common.core.utils.file;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * 图片处理工具类
 *
 * @author ruoyi
 */
public class ImageUtils
{
    private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
    public static byte[] getImage(String imagePath)
    {
        InputStream is = getFile(imagePath);
        try
        {
            return IOUtils.toByteArray(is);
        }
        catch (Exception e)
        {
            log.error("图片加载异常 {}", e);
            return null;
        }
        finally
        {
            IOUtils.closeQuietly(is);
        }
    }
    public static InputStream getFile(String imagePath)
    {
        try
        {
            byte[] result = readFile(imagePath);
            result = Arrays.copyOf(result, result.length);
            return new ByteArrayInputStream(result);
        }
        catch (Exception e)
        {
            log.error("获取图片异常 {}", e);
        }
        return null;
    }
    /**
     * 读取文件为字节数据
     *
     * @param url 地址
     * @return 字节数据
     */
    public static byte[] readFile(String url)
    {
        InputStream in = null;
        try
        {
            // 网络地址
            URL urlObj = new URL(url);
            URLConnection urlConnection = urlObj.openConnection();
            urlConnection.setConnectTimeout(30 * 1000);
            urlConnection.setReadTimeout(60 * 1000);
            urlConnection.setDoInput(true);
            in = urlConnection.getInputStream();
            return IOUtils.toByteArray(in);
        }
        catch (Exception e)
        {
            log.error("访问文件异常 {}", e);
            return null;
        }
        finally
        {
            IOUtils.closeQuietly(in);
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/MimeTypeUtils.java
New file
@@ -0,0 +1,59 @@
package com.ruoyi.common.core.utils.file;
/**
 * 媒体类型工具类
 *
 * @author ruoyi
 */
public class MimeTypeUtils
{
    public static final String IMAGE_PNG = "image/png";
    public static final String IMAGE_JPG = "image/jpg";
    public static final String IMAGE_JPEG = "image/jpeg";
    public static final String IMAGE_BMP = "image/bmp";
    public static final String IMAGE_GIF = "image/gif";
    public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };
    public static final String[] FLASH_EXTENSION = { "swf", "flv" };
    public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
            "asf", "rm", "rmvb" };
    public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" };
    public static final String[] DEFAULT_ALLOWED_EXTENSION = {
            // 图片
            "bmp", "gif", "jpg", "jpeg", "png",
            // word excel powerpoint
            "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
            // 压缩文件
            "rar", "zip", "gz", "bz2",
            // 视频格式
            "mp4", "avi", "rmvb",
            // pdf
            "pdf" };
    public static String getExtension(String prefix)
    {
        switch (prefix)
        {
            case IMAGE_PNG:
                return "png";
            case IMAGE_JPG:
                return "jpg";
            case IMAGE_JPEG:
                return "jpeg";
            case IMAGE_BMP:
                return "bmp";
            case IMAGE_GIF:
                return "gif";
            default:
                return "";
        }
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/EscapeUtil.java
New file
@@ -0,0 +1,167 @@
package com.ruoyi.common.core.utils.html;
import com.ruoyi.common.core.utils.StringUtils;
/**
 * 转义和反转义工具类
 *
 * @author ruoyi
 */
public class EscapeUtil
{
    public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
    private static final char[][] TEXT = new char[64][];
    static
    {
        for (int i = 0; i < 64; i++)
        {
            TEXT[i] = new char[] { (char) i };
        }
        // special HTML characters
        TEXT['\''] = "&#039;".toCharArray(); // 单引号
        TEXT['"'] = "&#34;".toCharArray(); // 双引号
        TEXT['&'] = "&#38;".toCharArray(); // &符
        TEXT['<'] = "&#60;".toCharArray(); // 小于号
        TEXT['>'] = "&#62;".toCharArray(); // 大于号
    }
    /**
     * 转义文本中的HTML字符为安全的字符
     *
     * @param text 被转义的文本
     * @return 转义后的文本
     */
    public static String escape(String text)
    {
        return encode(text);
    }
    /**
     * 还原被转义的HTML特殊字符
     *
     * @param content 包含转义符的HTML内容
     * @return 转换后的字符串
     */
    public static String unescape(String content)
    {
        return decode(content);
    }
    /**
     * 清除所有HTML标签,但是不删除标签内的内容
     *
     * @param content 文本
     * @return 清除标签后的文本
     */
    public static String clean(String content)
    {
        return new HTMLFilter().filter(content);
    }
    /**
     * Escape编码
     *
     * @param text 被编码的文本
     * @return 编码后的字符
     */
    private static String encode(String text)
    {
        if (StringUtils.isEmpty(text))
        {
            return StringUtils.EMPTY;
        }
        final StringBuilder tmp = new StringBuilder(text.length() * 6);
        char c;
        for (int i = 0; i < text.length(); i++)
        {
            c = text.charAt(i);
            if (c < 256)
            {
                tmp.append("%");
                if (c < 16)
                {
                    tmp.append("0");
                }
                tmp.append(Integer.toString(c, 16));
            }
            else
            {
                tmp.append("%u");
                if (c <= 0xfff)
                {
                    // issue#I49JU8@Gitee
                    tmp.append("0");
                }
                tmp.append(Integer.toString(c, 16));
            }
        }
        return tmp.toString();
    }
    /**
     * Escape解码
     *
     * @param content 被转义的内容
     * @return 解码后的字符串
     */
    public static String decode(String content)
    {
        if (StringUtils.isEmpty(content))
        {
            return content;
        }
        StringBuilder tmp = new StringBuilder(content.length());
        int lastPos = 0, pos = 0;
        char ch;
        while (lastPos < content.length())
        {
            pos = content.indexOf("%", lastPos);
            if (pos == lastPos)
            {
                if (content.charAt(pos + 1) == 'u')
                {
                    ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
                    tmp.append(ch);
                    lastPos = pos + 6;
                }
                else
                {
                    ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
                    tmp.append(ch);
                    lastPos = pos + 3;
                }
            }
            else
            {
                if (pos == -1)
                {
                    tmp.append(content.substring(lastPos));
                    lastPos = content.length();
                }
                else
                {
                    tmp.append(content.substring(lastPos, pos));
                    lastPos = pos;
                }
            }
        }
        return tmp.toString();
    }
    public static void main(String[] args)
    {
        String html = "<script>alert(1);</script>";
        String escape = EscapeUtil.escape(html);
        // String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>";
        // String html = "<123";
        // String html = "123>";
        System.out.println("clean: " + EscapeUtil.clean(html));
        System.out.println("escape: " + escape);
        System.out.println("unescape: " + EscapeUtil.unescape(escape));
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/html/HTMLFilter.java
New file
@@ -0,0 +1,570 @@
package com.ruoyi.common.core.utils.html;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * HTML过滤器,用于去除XSS漏洞隐患。
 *
 * @author ruoyi
 */
public final class HTMLFilter
{
    /**
     * regex flag union representing /si modifiers in php
     **/
    private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
    private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);
    private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);
    private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);
    private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);
    private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);
    private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);
    private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);
    private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);
    private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");
    private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");
    private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");
    private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");
    private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);
    private static final Pattern P_END_ARROW = Pattern.compile("^>");
    private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");
    private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");
    private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");
    private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");
    private static final Pattern P_AMP = Pattern.compile("&");
    private static final Pattern P_QUOTE = Pattern.compile("\"");
    private static final Pattern P_LEFT_ARROW = Pattern.compile("<");
    private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");
    private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");
    // @xxx could grow large... maybe use sesat's ReferenceMap
    private static final ConcurrentMap<String, Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>();
    private static final ConcurrentMap<String, Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>();
    /**
     * set of allowed html elements, along with allowed attributes for each element
     **/
    private final Map<String, List<String>> vAllowed;
    /**
     * counts of open tags for each (allowable) html element
     **/
    private final Map<String, Integer> vTagCounts = new HashMap<>();
    /**
     * html elements which must always be self-closing (e.g. "<img />")
     **/
    private final String[] vSelfClosingTags;
    /**
     * html elements which must always have separate opening and closing tags (e.g. "<b></b>")
     **/
    private final String[] vNeedClosingTags;
    /**
     * set of disallowed html elements
     **/
    private final String[] vDisallowed;
    /**
     * attributes which should be checked for valid protocols
     **/
    private final String[] vProtocolAtts;
    /**
     * allowed protocols
     **/
    private final String[] vAllowedProtocols;
    /**
     * tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />")
     **/
    private final String[] vRemoveBlanks;
    /**
     * entities allowed within html markup
     **/
    private final String[] vAllowedEntities;
    /**
     * flag determining whether comments are allowed in input String.
     */
    private final boolean stripComment;
    private final boolean encodeQuotes;
    /**
     * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "<b text </b>"
     * becomes "<b> text </b>"). If set to false, unbalanced angle brackets will be html escaped.
     */
    private final boolean alwaysMakeTags;
    /**
     * Default constructor.
     */
    public HTMLFilter()
    {
        vAllowed = new HashMap<>();
        final ArrayList<String> a_atts = new ArrayList<>();
        a_atts.add("href");
        a_atts.add("target");
        vAllowed.put("a", a_atts);
        final ArrayList<String> img_atts = new ArrayList<>();
        img_atts.add("src");
        img_atts.add("width");
        img_atts.add("height");
        img_atts.add("alt");
        vAllowed.put("img", img_atts);
        final ArrayList<String> no_atts = new ArrayList<>();
        vAllowed.put("b", no_atts);
        vAllowed.put("strong", no_atts);
        vAllowed.put("i", no_atts);
        vAllowed.put("em", no_atts);
        vSelfClosingTags = new String[] { "img" };
        vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" };
        vDisallowed = new String[] {};
        vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp.
        vProtocolAtts = new String[] { "src", "href" };
        vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" };
        vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" };
        stripComment = true;
        encodeQuotes = true;
        alwaysMakeTags = false;
    }
    /**
     * Map-parameter configurable constructor.
     *
     * @param conf map containing configuration. keys match field names.
     */
    @SuppressWarnings("unchecked")
    public HTMLFilter(final Map<String, Object> conf)
    {
        assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
        assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
        assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";
        assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";
        assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";
        assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";
        assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";
        assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";
        vAllowed = Collections.unmodifiableMap((HashMap<String, List<String>>) conf.get("vAllowed"));
        vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");
        vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");
        vDisallowed = (String[]) conf.get("vDisallowed");
        vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");
        vProtocolAtts = (String[]) conf.get("vProtocolAtts");
        vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");
        vAllowedEntities = (String[]) conf.get("vAllowedEntities");
        stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;
        encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;
        alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
    }
    private void reset()
    {
        vTagCounts.clear();
    }
    // ---------------------------------------------------------------
    // my versions of some PHP library functions
    public static String chr(final int decimal)
    {
        return String.valueOf((char) decimal);
    }
    public static String htmlSpecialChars(final String s)
    {
        String result = s;
        result = regexReplace(P_AMP, "&amp;", result);
        result = regexReplace(P_QUOTE, "&quot;", result);
        result = regexReplace(P_LEFT_ARROW, "&lt;", result);
        result = regexReplace(P_RIGHT_ARROW, "&gt;", result);
        return result;
    }
    // ---------------------------------------------------------------
    /**
     * given a user submitted input String, filter out any invalid or restricted html.
     *
     * @param input text (i.e. submitted by a user) than may contain html
     * @return "clean" version of input, with only valid, whitelisted html elements allowed
     */
    public String filter(final String input)
    {
        reset();
        String s = input;
        s = escapeComments(s);
        s = balanceHTML(s);
        s = checkTags(s);
        s = processRemoveBlanks(s);
        // s = validateEntities(s);
        return s;
    }
    public boolean isAlwaysMakeTags()
    {
        return alwaysMakeTags;
    }
    public boolean isStripComments()
    {
        return stripComment;
    }
    private String escapeComments(final String s)
    {
        final Matcher m = P_COMMENTS.matcher(s);
        final StringBuffer buf = new StringBuffer();
        if (m.find())
        {
            final String match = m.group(1); // (.*?)
            m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));
        }
        m.appendTail(buf);
        return buf.toString();
    }
    private String balanceHTML(String s)
    {
        if (alwaysMakeTags)
        {
            //
            // try and form html
            //
            s = regexReplace(P_END_ARROW, "", s);
            // 不追加结束标签
            s = regexReplace(P_BODY_TO_END, "<$1>", s);
            s = regexReplace(P_XML_CONTENT, "$1<$2", s);
        }
        else
        {
            //
            // escape stray brackets
            //
            s = regexReplace(P_STRAY_LEFT_ARROW, "&lt;$1", s);
            s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2&gt;<", s);
            //
            // the last regexp causes '<>' entities to appear
            // (we need to do a lookahead assertion so that the last bracket can
            // be used in the next pass of the regexp)
            //
            s = regexReplace(P_BOTH_ARROWS, "", s);
        }
        return s;
    }
    private String checkTags(String s)
    {
        Matcher m = P_TAGS.matcher(s);
        final StringBuffer buf = new StringBuffer();
        while (m.find())
        {
            String replaceStr = m.group(1);
            replaceStr = processTag(replaceStr);
            m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
        }
        m.appendTail(buf);
        // these get tallied in processTag
        // (remember to reset before subsequent calls to filter method)
        final StringBuilder sBuilder = new StringBuilder(buf.toString());
        for (String key : vTagCounts.keySet())
        {
            for (int ii = 0; ii < vTagCounts.get(key); ii++)
            {
                sBuilder.append("</").append(key).append(">");
            }
        }
        s = sBuilder.toString();
        return s;
    }
    private String processRemoveBlanks(final String s)
    {
        String result = s;
        for (String tag : vRemoveBlanks)
        {
            if (!P_REMOVE_PAIR_BLANKS.containsKey(tag))
            {
                P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));
            }
            result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
            if (!P_REMOVE_SELF_BLANKS.containsKey(tag))
            {
                P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
            }
            result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
        }
        return result;
    }
    private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s)
    {
        Matcher m = regex_pattern.matcher(s);
        return m.replaceAll(replacement);
    }
    private String processTag(final String s)
    {
        // ending tags
        Matcher m = P_END_TAG.matcher(s);
        if (m.find())
        {
            final String name = m.group(1).toLowerCase();
            if (allowed(name))
            {
                if (!inArray(name, vSelfClosingTags))
                {
                    if (vTagCounts.containsKey(name))
                    {
                        vTagCounts.put(name, vTagCounts.get(name) - 1);
                        return "</" + name + ">";
                    }
                }
            }
        }
        // starting tags
        m = P_START_TAG.matcher(s);
        if (m.find())
        {
            final String name = m.group(1).toLowerCase();
            final String body = m.group(2);
            String ending = m.group(3);
            // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
            if (allowed(name))
            {
                final StringBuilder params = new StringBuilder();
                final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
                final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
                final List<String> paramNames = new ArrayList<>();
                final List<String> paramValues = new ArrayList<>();
                while (m2.find())
                {
                    paramNames.add(m2.group(1)); // ([a-z0-9]+)
                    paramValues.add(m2.group(3)); // (.*?)
                }
                while (m3.find())
                {
                    paramNames.add(m3.group(1)); // ([a-z0-9]+)
                    paramValues.add(m3.group(3)); // ([^\"\\s']+)
                }
                String paramName, paramValue;
                for (int ii = 0; ii < paramNames.size(); ii++)
                {
                    paramName = paramNames.get(ii).toLowerCase();
                    paramValue = paramValues.get(ii);
                    // debug( "paramName='" + paramName + "'" );
                    // debug( "paramValue='" + paramValue + "'" );
                    // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );
                    if (allowedAttribute(name, paramName))
                    {
                        if (inArray(paramName, vProtocolAtts))
                        {
                            paramValue = processParamProtocol(paramValue);
                        }
                        params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\"");
                    }
                }
                if (inArray(name, vSelfClosingTags))
                {
                    ending = " /";
                }
                if (inArray(name, vNeedClosingTags))
                {
                    ending = "";
                }
                if (ending == null || ending.length() < 1)
                {
                    if (vTagCounts.containsKey(name))
                    {
                        vTagCounts.put(name, vTagCounts.get(name) + 1);
                    }
                    else
                    {
                        vTagCounts.put(name, 1);
                    }
                }
                else
                {
                    ending = " /";
                }
                return "<" + name + params + ending + ">";
            }
            else
            {
                return "";
            }
        }
        // comments
        m = P_COMMENT.matcher(s);
        if (!stripComment && m.find())
        {
            return "<" + m.group() + ">";
        }
        return "";
    }
    private String processParamProtocol(String s)
    {
        s = decodeEntities(s);
        final Matcher m = P_PROTOCOL.matcher(s);
        if (m.find())
        {
            final String protocol = m.group(1);
            if (!inArray(protocol, vAllowedProtocols))
            {
                // bad protocol, turn into local anchor link instead
                s = "#" + s.substring(protocol.length() + 1);
                if (s.startsWith("#//"))
                {
                    s = "#" + s.substring(3);
                }
            }
        }
        return s;
    }
    private String decodeEntities(String s)
    {
        StringBuffer buf = new StringBuffer();
        Matcher m = P_ENTITY.matcher(s);
        while (m.find())
        {
            final String match = m.group(1);
            final int decimal = Integer.decode(match).intValue();
            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
        }
        m.appendTail(buf);
        s = buf.toString();
        buf = new StringBuffer();
        m = P_ENTITY_UNICODE.matcher(s);
        while (m.find())
        {
            final String match = m.group(1);
            final int decimal = Integer.valueOf(match, 16).intValue();
            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
        }
        m.appendTail(buf);
        s = buf.toString();
        buf = new StringBuffer();
        m = P_ENCODE.matcher(s);
        while (m.find())
        {
            final String match = m.group(1);
            final int decimal = Integer.valueOf(match, 16).intValue();
            m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
        }
        m.appendTail(buf);
        s = buf.toString();
        s = validateEntities(s);
        return s;
    }
    private String validateEntities(final String s)
    {
        StringBuffer buf = new StringBuffer();
        // validate entities throughout the string
        Matcher m = P_VALID_ENTITIES.matcher(s);
        while (m.find())
        {
            final String one = m.group(1); // ([^&;]*)
            final String two = m.group(2); // (?=(;|&|$))
            m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
        }
        m.appendTail(buf);
        return encodeQuotes(buf.toString());
    }
    private String encodeQuotes(final String s)
    {
        if (encodeQuotes)
        {
            StringBuffer buf = new StringBuffer();
            Matcher m = P_VALID_QUOTES.matcher(s);
            while (m.find())
            {
                final String one = m.group(1); // (>|^)
                final String two = m.group(2); // ([^<]+?)
                final String three = m.group(3); // (<|$)
                // 不替换双引号为&quot;,防止json格式无效 regexReplace(P_QUOTE, "&quot;", two)
                m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three));
            }
            m.appendTail(buf);
            return buf.toString();
        }
        else
        {
            return s;
        }
    }
    private String checkEntity(final String preamble, final String term)
    {
        return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&amp;" + preamble;
    }
    private boolean isValidEntity(final String entity)
    {
        return inArray(entity, vAllowedEntities);
    }
    private static boolean inArray(final String s, final String[] array)
    {
        for (String item : array)
        {
            if (item != null && item.equals(s))
            {
                return true;
            }
        }
        return false;
    }
    private boolean allowed(final String name)
    {
        return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
    }
    private boolean allowedAttribute(final String name, final String paramName)
    {
        return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ip/IpUtils.java
New file
@@ -0,0 +1,382 @@
package com.ruoyi.common.core.utils.ip;
import java.net.InetAddress;
import java.net.UnknownHostException;
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
/**
 * 获取IP方法
 *
 * @author ruoyi
 */
public class IpUtils
{
    public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
    // 匹配 ip
    public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")";
    public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))";
    // 匹配网段
    public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")";
    /**
     * 获取客户端IP
     *
     * @return IP地址
     */
    public static String getIpAddr()
    {
        return getIpAddr(ServletUtils.getRequest());
    }
    /**
     * 获取客户端IP
     *
     * @param request 请求对象
     * @return IP地址
     */
    public static String getIpAddr(HttpServletRequest request)
    {
        if (request == null)
        {
            return "unknown";
        }
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getHeader("X-Real-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
        {
            ip = request.getRemoteAddr();
        }
        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
    }
    /**
     * 检查是否为内部IP地址
     *
     * @param ip IP地址
     * @return 结果
     */
    public static boolean internalIp(String ip)
    {
        byte[] addr = textToNumericFormatV4(ip);
        return internalIp(addr) || "127.0.0.1".equals(ip);
    }
    /**
     * 检查是否为内部IP地址
     *
     * @param addr byte地址
     * @return 结果
     */
    private static boolean internalIp(byte[] addr)
    {
        if (StringUtils.isNull(addr) || addr.length < 2)
        {
            return true;
        }
        final byte b0 = addr[0];
        final byte b1 = addr[1];
        // 10.x.x.x/8
        final byte SECTION_1 = 0x0A;
        // 172.16.x.x/12
        final byte SECTION_2 = (byte) 0xAC;
        final byte SECTION_3 = (byte) 0x10;
        final byte SECTION_4 = (byte) 0x1F;
        // 192.168.x.x/16
        final byte SECTION_5 = (byte) 0xC0;
        final byte SECTION_6 = (byte) 0xA8;
        switch (b0)
        {
            case SECTION_1:
                return true;
            case SECTION_2:
                if (b1 >= SECTION_3 && b1 <= SECTION_4)
                {
                    return true;
                }
            case SECTION_5:
                switch (b1)
                {
                    case SECTION_6:
                        return true;
                }
            default:
                return false;
        }
    }
    /**
     * 将IPv4地址转换成字节
     *
     * @param text IPv4地址
     * @return byte 字节
     */
    public static byte[] textToNumericFormatV4(String text)
    {
        if (text.length() == 0)
        {
            return null;
        }
        byte[] bytes = new byte[4];
        String[] elements = text.split("\\.", -1);
        try
        {
            long l;
            int i;
            switch (elements.length)
            {
                case 1:
                    l = Long.parseLong(elements[0]);
                    if ((l < 0L) || (l > 4294967295L))
                    {
                        return null;
                    }
                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 2:
                    l = Integer.parseInt(elements[0]);
                    if ((l < 0L) || (l > 255L))
                    {
                        return null;
                    }
                    bytes[0] = (byte) (int) (l & 0xFF);
                    l = Integer.parseInt(elements[1]);
                    if ((l < 0L) || (l > 16777215L))
                    {
                        return null;
                    }
                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 3:
                    for (i = 0; i < 2; ++i)
                    {
                        l = Integer.parseInt(elements[i]);
                        if ((l < 0L) || (l > 255L))
                        {
                            return null;
                        }
                        bytes[i] = (byte) (int) (l & 0xFF);
                    }
                    l = Integer.parseInt(elements[2]);
                    if ((l < 0L) || (l > 65535L))
                    {
                        return null;
                    }
                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 4:
                    for (i = 0; i < 4; ++i)
                    {
                        l = Integer.parseInt(elements[i]);
                        if ((l < 0L) || (l > 255L))
                        {
                            return null;
                        }
                        bytes[i] = (byte) (int) (l & 0xFF);
                    }
                    break;
                default:
                    return null;
            }
        }
        catch (NumberFormatException e)
        {
            return null;
        }
        return bytes;
    }
    /**
     * 获取IP地址
     *
     * @return 本地IP地址
     */
    public static String getHostIp()
    {
        try
        {
            return InetAddress.getLocalHost().getHostAddress();
        }
        catch (UnknownHostException e)
        {
        }
        return "127.0.0.1";
    }
    /**
     * 获取主机名
     *
     * @return 本地主机名
     */
    public static String getHostName()
    {
        try
        {
            return InetAddress.getLocalHost().getHostName();
        }
        catch (UnknownHostException e)
        {
        }
        return "未知";
    }
    /**
     * 从多级反向代理中获得第一个非unknown IP地址
     *
     * @param ip 获得的IP地址
     * @return 第一个非unknown IP地址
     */
    public static String getMultistageReverseProxyIp(String ip)
    {
        // 多级反向代理检测
        if (ip != null && ip.indexOf(",") > 0)
        {
            final String[] ips = ip.trim().split(",");
            for (String subIp : ips)
            {
                if (false == isUnknown(subIp))
                {
                    ip = subIp;
                    break;
                }
            }
        }
        return StringUtils.substring(ip, 0, 255);
    }
    /**
     * 检测给定字符串是否为未知,多用于检测HTTP请求相关
     *
     * @param checkString 被检测的字符串
     * @return 是否未知
     */
    public static boolean isUnknown(String checkString)
    {
        return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
    }
    /**
     * 是否为IP
     */
    public static boolean isIP(String ip)
    {
        return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
    }
    /**
     * 是否为IP,或 *为间隔的通配符地址
     */
    public static boolean isIpWildCard(String ip)
    {
        return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
    }
    /**
     * 检测参数是否在ip通配符里
     */
    public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip)
    {
        String[] s1 = ipWildCard.split("\\.");
        String[] s2 = ip.split("\\.");
        boolean isMatchedSeg = true;
        for (int i = 0; i < s1.length && !s1[i].equals("*"); i++)
        {
            if (!s1[i].equals(s2[i]))
            {
                isMatchedSeg = false;
                break;
            }
        }
        return isMatchedSeg;
    }
    /**
     * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串
     */
    public static boolean isIPSegment(String ipSeg)
    {
        return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
    }
    /**
     * 判断ip是否在指定网段中
     */
    public static boolean ipIsInNetNoCheck(String iparea, String ip)
    {
        int idx = iparea.indexOf('-');
        String[] sips = iparea.substring(0, idx).split("\\.");
        String[] sipe = iparea.substring(idx + 1).split("\\.");
        String[] sipt = ip.split("\\.");
        long ips = 0L, ipe = 0L, ipt = 0L;
        for (int i = 0; i < 4; ++i)
        {
            ips = ips << 8 | Integer.parseInt(sips[i]);
            ipe = ipe << 8 | Integer.parseInt(sipe[i]);
            ipt = ipt << 8 | Integer.parseInt(sipt[i]);
        }
        if (ips > ipe)
        {
            long t = ips;
            ips = ipe;
            ipe = t;
        }
        return ips <= ipt && ipt <= ipe;
    }
    /**
     * 校验ip是否符合过滤串规则
     *
     * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99`
     * @param ip 校验IP地址
     * @return boolean 结果
     */
    public static boolean isMatchedIp(String filter, String ip)
    {
        if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip))
        {
            return false;
        }
        String[] ips = filter.split(";");
        for (String iStr : ips)
        {
            if (isIP(iStr) && iStr.equals(ip))
            {
                return true;
            }
            else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip))
            {
                return true;
            }
            else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip))
            {
                return true;
            }
        }
        return false;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/obs/OBSUtil.java
New file
@@ -0,0 +1,43 @@
package com.ruoyi.common.core.utils.obs;
import com.obs.services.ObsClient;
import com.obs.services.model.PutObjectRequest;
import com.obs.services.model.PutObjectResult;
import java.io.InputStream;
/**
 * 对象存储上传
 * @author zhibing.pu
 * @date 2023/3/15 11:32
 */
public class OBSUtil {
    public static String endPoint = "https://obs.cn-southwest-2.myhuaweicloud.com";
    public static String ak = "ONCVMOIXDX55ADAU5MFS";
    public static String sk = "3uuS3p3rcw2WYSpFVPveIGm7wVvx5OtoCNhbBv3n";
    public static String bucketname = "yixingtong";
    /**
     * 上传文件
     * @param inputStream
     * @param objectKey
     * @return
     */
    public static String  putObjectToBucket(InputStream inputStream, String objectKey) {
        try {
            // 创建ObsClient实例
            ObsClient obsClient = new ObsClient(ak, sk, endPoint);
            // 待上传的本地文件路径,需要指定到具体的文件名
            PutObjectRequest request = new PutObjectRequest();
            request.setBucketName(bucketname);
            request.setObjectKey(objectKey);
            request.setInput(inputStream);
            PutObjectResult putObjectResult = obsClient.putObject(request);
            return putObjectResult.getObjectUrl();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelHandlerAdapter.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.common.core.utils.poi;
/**
 * Excel数据格式处理适配器
 *
 * @author ruoyi
 */
public interface ExcelHandlerAdapter
{
    /**
     * 格式化
     *
     * @param value 单元格数据值
     * @param args excel注解args参数组
     *
     * @return 处理后的值
     */
    Object format(Object value, String[] args);
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java
New file
@@ -0,0 +1,1487 @@
package com.ruoyi.common.core.utils.poi;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.annotation.Excel.ColumnType;
import com.ruoyi.common.core.annotation.Excel.Type;
import com.ruoyi.common.core.annotation.Excels;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.file.FileTypeUtils;
import com.ruoyi.common.core.utils.file.ImageUtils;
import com.ruoyi.common.core.utils.reflect.ReflectUtils;
/**
 * Excel相关处理
 *
 * @author ruoyi
 */
public class ExcelUtil<T>
{
    private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
    public static final String FORMULA_REGEX_STR = "=|-|\\+|@";
    public static final String[] FORMULA_STR = { "=", "-", "+", "@" };
    /**
     * Excel sheet最大行数,默认65536
     */
    public static final int sheetSize = 65536;
    /**
     * 工作表名称
     */
    private String sheetName;
    /**
     * 导出类型(EXPORT:导出数据;IMPORT:导入模板)
     */
    private Type type;
    /**
     * 工作薄对象
     */
    private Workbook wb;
    /**
     * 工作表对象
     */
    private Sheet sheet;
    /**
     * 样式列表
     */
    private Map<String, CellStyle> styles;
    /**
     * 导入导出数据列表
     */
    private List<T> list;
    /**
     * 注解列表
     */
    private List<Object[]> fields;
    /**
     * 当前行号
     */
    private int rownum;
    /**
     * 标题
     */
    private String title;
    /**
     * 最大高度
     */
    private short maxHeight;
    /**
     * 合并后最后行数
     */
    private int subMergedLastRowNum = 0;
    /**
     * 合并后开始行数
     */
    private int subMergedFirstRowNum = 1;
    /**
     * 对象的子列表方法
     */
    private Method subMethod;
    /**
     * 对象的子列表属性
     */
    private List<Field> subFields;
    /**
     * 统计列表
     */
    private Map<Integer, Double> statistics = new HashMap<Integer, Double>();
    /**
     * 数字格式
     */
    private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00");
    /**
     * 实体对象
     */
    public Class<T> clazz;
    /**
     * 需要排除列属性
     */
    public String[] excludeFields;
    public ExcelUtil(Class<T> clazz)
    {
        this.clazz = clazz;
    }
    /**
     * 隐藏Excel中列属性
     *
     * @param fields 列属性名 示例[单个"name"/多个"id","name"]
     * @throws Exception
     */
    public void hideColumn(String... fields)
    {
        this.excludeFields = fields;
    }
    public void init(List<T> list, String sheetName, String title, Type type)
    {
        if (list == null)
        {
            list = new ArrayList<T>();
        }
        this.list = list;
        this.sheetName = sheetName;
        this.type = type;
        this.title = title;
        createExcelField();
        createWorkbook();
        createTitle();
        createSubHead();
    }
    /**
     * 创建excel第一行标题
     */
    public void createTitle()
    {
        if (StringUtils.isNotEmpty(title))
        {
            subMergedFirstRowNum++;
            subMergedLastRowNum++;
            int titleLastCol = this.fields.size() - 1;
            if (isSubList())
            {
                titleLastCol = titleLastCol + subFields.size() - 1;
            }
            Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0);
            titleRow.setHeightInPoints(30);
            Cell titleCell = titleRow.createCell(0);
            titleCell.setCellStyle(styles.get("title"));
            titleCell.setCellValue(title);
            sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), titleLastCol));
        }
    }
    /**
     * 创建对象的子列表名称
     */
    public void createSubHead()
    {
        if (isSubList())
        {
            subMergedFirstRowNum++;
            subMergedLastRowNum++;
            Row subRow = sheet.createRow(rownum);
            int excelNum = 0;
            for (Object[] objects : fields)
            {
                Excel attr = (Excel) objects[1];
                Cell headCell1 = subRow.createCell(excelNum);
                headCell1.setCellValue(attr.name());
                headCell1.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor())));
                excelNum++;
            }
            int headFirstRow = excelNum - 1;
            int headLastRow = headFirstRow + subFields.size() - 1;
            if (headLastRow > headFirstRow)
            {
                sheet.addMergedRegion(new CellRangeAddress(rownum, rownum, headFirstRow, headLastRow));
            }
            rownum++;
        }
    }
    /**
     * 对excel表单默认第一个索引名转换成list
     *
     * @param is 输入流
     * @return 转换后集合
     */
    public List<T> importExcel(InputStream is) throws Exception
    {
        return importExcel(is, 0);
    }
    /**
     * 对excel表单默认第一个索引名转换成list
     *
     * @param is 输入流
     * @param titleNum 标题占用行数
     * @return 转换后集合
     */
    public List<T> importExcel(InputStream is, int titleNum) throws Exception
    {
        return importExcel(StringUtils.EMPTY, is, titleNum);
    }
    /**
     * 对excel表单指定表格索引名转换成list
     *
     * @param sheetName 表格索引名
     * @param titleNum 标题占用行数
     * @param is 输入流
     * @return 转换后集合
     */
    public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception
    {
        this.type = Type.IMPORT;
        this.wb = WorkbookFactory.create(is);
        List<T> list = new ArrayList<T>();
        // 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet
        Sheet sheet = StringUtils.isNotEmpty(sheetName) ? wb.getSheet(sheetName) : wb.getSheetAt(0);
        if (sheet == null)
        {
            throw new IOException("文件sheet不存在");
        }
        // 获取最后一个非空行的行下标,比如总行数为n,则返回的为n-1
        int rows = sheet.getLastRowNum();
        if (rows > 0)
        {
            // 定义一个map用于存放excel列的序号和field.
            Map<String, Integer> cellMap = new HashMap<String, Integer>();
            // 获取表头
            Row heard = sheet.getRow(titleNum);
            for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++)
            {
                Cell cell = heard.getCell(i);
                if (StringUtils.isNotNull(cell))
                {
                    String value = this.getCellValue(heard, i).toString();
                    cellMap.put(value, i);
                }
                else
                {
                    cellMap.put(null, i);
                }
            }
            // 有数据时才处理 得到类的所有field.
            List<Object[]> fields = this.getFields();
            Map<Integer, Object[]> fieldsMap = new HashMap<Integer, Object[]>();
            for (Object[] objects : fields)
            {
                Excel attr = (Excel) objects[1];
                Integer column = cellMap.get(attr.name());
                if (column != null)
                {
                    fieldsMap.put(column, objects);
                }
            }
            for (int i = titleNum + 1; i <= rows; i++)
            {
                // 从第2行开始取数据,默认第一行是表头.
                Row row = sheet.getRow(i);
                // 判断当前行是否是空行
                if (isRowEmpty(row))
                {
                    continue;
                }
                T entity = null;
                for (Map.Entry<Integer, Object[]> entry : fieldsMap.entrySet())
                {
                    Object val = this.getCellValue(row, entry.getKey());
                    // 如果不存在实例则新建.
                    entity = (entity == null ? clazz.newInstance() : entity);
                    // 从map中得到对应列的field.
                    Field field = (Field) entry.getValue()[0];
                    Excel attr = (Excel) entry.getValue()[1];
                    // 取得类型,并根据对象类型设置值.
                    Class<?> fieldType = field.getType();
                    if (String.class == fieldType)
                    {
                        String s = Convert.toStr(val);
                        if (StringUtils.endsWith(s, ".0"))
                        {
                            val = StringUtils.substringBefore(s, ".0");
                        }
                        else
                        {
                            String dateFormat = field.getAnnotation(Excel.class).dateFormat();
                            if (StringUtils.isNotEmpty(dateFormat))
                            {
                                val = parseDateToStr(dateFormat, val);
                            }
                            else
                            {
                                val = Convert.toStr(val);
                            }
                        }
                    }
                    else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val)))
                    {
                        val = Convert.toInt(val);
                    }
                    else if ((Long.TYPE == fieldType || Long.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val)))
                    {
                        val = Convert.toLong(val);
                    }
                    else if (Double.TYPE == fieldType || Double.class == fieldType)
                    {
                        val = Convert.toDouble(val);
                    }
                    else if (Float.TYPE == fieldType || Float.class == fieldType)
                    {
                        val = Convert.toFloat(val);
                    }
                    else if (BigDecimal.class == fieldType)
                    {
                        val = Convert.toBigDecimal(val);
                    }
                    else if (Date.class == fieldType)
                    {
                        if (val instanceof String)
                        {
                            val = DateUtils.parseDate(val);
                        }
                        else if (val instanceof Double)
                        {
                            val = DateUtil.getJavaDate((Double) val);
                        }
                    }
                    else if (Boolean.TYPE == fieldType || Boolean.class == fieldType)
                    {
                        val = Convert.toBool(val, false);
                    }
                    if (StringUtils.isNotNull(fieldType))
                    {
                        String propertyName = field.getName();
                        if (StringUtils.isNotEmpty(attr.targetAttr()))
                        {
                            propertyName = field.getName() + "." + attr.targetAttr();
                        }
                        else if (StringUtils.isNotEmpty(attr.readConverterExp()))
                        {
                            val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator());
                        }
                        else if (!attr.handler().equals(ExcelHandlerAdapter.class))
                        {
                            val = dataFormatHandlerAdapter(val, attr);
                        }
                        ReflectUtils.invokeSetter(entity, propertyName, val);
                    }
                }
                list.add(entity);
            }
        }
        return list;
    }
    /**
     * 对list数据源将其里面的数据导入到excel表单
     *
     * @param response 返回数据
     * @param list 导出数据集合
     * @param sheetName 工作表的名称
     * @return 结果
     */
    public void exportExcel(HttpServletResponse response, List<T> list, String sheetName)
    {
        exportExcel(response, list, sheetName, StringUtils.EMPTY);
    }
    /**
     * 对list数据源将其里面的数据导入到excel表单
     *
     * @param response 返回数据
     * @param list 导出数据集合
     * @param sheetName 工作表的名称
     * @param title 标题
     * @return 结果
     */
    public void exportExcel(HttpServletResponse response, List<T> list, String sheetName, String title)
    {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        this.init(list, sheetName, title, Type.EXPORT);
        exportExcel(response);
    }
    /**
     * 对list数据源将其里面的数据导入到excel表单
     *
     * @param sheetName 工作表的名称
     * @return 结果
     */
    public void importTemplateExcel(HttpServletResponse response, String sheetName)
    {
        importTemplateExcel(response, sheetName, StringUtils.EMPTY);
    }
    /**
     * 对list数据源将其里面的数据导入到excel表单
     *
     * @param sheetName 工作表的名称
     * @param title 标题
     * @return 结果
     */
    public void importTemplateExcel(HttpServletResponse response, String sheetName, String title)
    {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        this.init(null, sheetName, title, Type.IMPORT);
        exportExcel(response);
    }
    /**
     * 对list数据源将其里面的数据导入到excel表单
     *
     * @return 结果
     */
    public void exportExcel(HttpServletResponse response)
    {
        try
        {
            writeSheet();
            wb.write(response.getOutputStream());
        }
        catch (Exception e)
        {
            log.error("导出Excel异常{}", e.getMessage());
        }
        finally
        {
            IOUtils.closeQuietly(wb);
        }
    }
    /**
     * 创建写入数据到Sheet
     */
    public void writeSheet()
    {
        // 取出一共有多少个sheet.
        int sheetNo = Math.max(1, (int) Math.ceil(list.size() * 1.0 / sheetSize));
        for (int index = 0; index < sheetNo; index++)
        {
            createSheet(sheetNo, index);
            // 产生一行
            Row row = sheet.createRow(rownum);
            int column = 0;
            // 写入各个字段的列头名称
            for (Object[] os : fields)
            {
                Field field = (Field) os[0];
                Excel excel = (Excel) os[1];
                if (Collection.class.isAssignableFrom(field.getType()))
                {
                    for (Field subField : subFields)
                    {
                        Excel subExcel = subField.getAnnotation(Excel.class);
                        this.createHeadCell(subExcel, row, column++);
                    }
                }
                else
                {
                    this.createHeadCell(excel, row, column++);
                }
            }
            if (Type.EXPORT.equals(type))
            {
                fillExcelData(index, row);
                addStatisticsRow();
            }
        }
    }
    /**
     * 填充excel数据
     *
     * @param index 序号
     * @param row 单元格行
     */
    @SuppressWarnings("unchecked")
    public void fillExcelData(int index, Row row)
    {
        int startNo = index * sheetSize;
        int endNo = Math.min(startNo + sheetSize, list.size());
        int rowNo = (1 + rownum) - startNo;
        for (int i = startNo; i < endNo; i++)
        {
            rowNo = isSubList() ? (i > 1 ? rowNo + 1 : rowNo + i) : i + 1 + rownum - startNo;
            row = sheet.createRow(rowNo);
            // 得到导出对象.
            T vo = (T) list.get(i);
            Collection<?> subList = null;
            if (isSubList())
            {
                if (isSubListValue(vo))
                {
                    subList = getListCellValue(vo);
                    subMergedLastRowNum = subMergedLastRowNum + subList.size();
                }
                else
                {
                    subMergedFirstRowNum++;
                    subMergedLastRowNum++;
                }
            }
            int column = 0;
            for (Object[] os : fields)
            {
                Field field = (Field) os[0];
                Excel excel = (Excel) os[1];
                if (Collection.class.isAssignableFrom(field.getType()) && StringUtils.isNotNull(subList))
                {
                    boolean subFirst = false;
                    for (Object obj : subList)
                    {
                        if (subFirst)
                        {
                            rowNo++;
                            row = sheet.createRow(rowNo);
                        }
                        List<Field> subFields = FieldUtils.getFieldsListWithAnnotation(obj.getClass(), Excel.class);
                        int subIndex = 0;
                        for (Field subField : subFields)
                        {
                            if (subField.isAnnotationPresent(Excel.class))
                            {
                                subField.setAccessible(true);
                                Excel attr = subField.getAnnotation(Excel.class);
                                this.addCell(attr, row, (T) obj, subField, column + subIndex);
                            }
                            subIndex++;
                        }
                        subFirst = true;
                    }
                    this.subMergedFirstRowNum = this.subMergedFirstRowNum + subList.size();
                }
                else
                {
                    this.addCell(excel, row, vo, field, column++);
                }
            }
        }
    }
    /**
     * 创建表格样式
     *
     * @param wb 工作薄对象
     * @return 样式列表
     */
    private Map<String, CellStyle> createStyles(Workbook wb)
    {
        // 写入各条记录,每条记录对应excel表中的一行
        Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
        CellStyle style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        Font titleFont = wb.createFont();
        titleFont.setFontName("Arial");
        titleFont.setFontHeightInPoints((short) 16);
        titleFont.setBold(true);
        style.setFont(titleFont);
        styles.put("title", style);
        style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        style.setBorderRight(BorderStyle.THIN);
        style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
        style.setBorderLeft(BorderStyle.THIN);
        style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
        style.setBorderTop(BorderStyle.THIN);
        style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
        style.setBorderBottom(BorderStyle.THIN);
        style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
        Font dataFont = wb.createFont();
        dataFont.setFontName("Arial");
        dataFont.setFontHeightInPoints((short) 10);
        style.setFont(dataFont);
        styles.put("data", style);
        style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        Font totalFont = wb.createFont();
        totalFont.setFontName("Arial");
        totalFont.setFontHeightInPoints((short) 10);
        style.setFont(totalFont);
        styles.put("total", style);
        styles.putAll(annotationHeaderStyles(wb, styles));
        styles.putAll(annotationDataStyles(wb));
        return styles;
    }
    /**
     * 根据Excel注解创建表格头样式
     *
     * @param wb 工作薄对象
     * @return 自定义样式列表
     */
    private Map<String, CellStyle> annotationHeaderStyles(Workbook wb, Map<String, CellStyle> styles)
    {
        Map<String, CellStyle> headerStyles = new HashMap<String, CellStyle>();
        for (Object[] os : fields)
        {
            Excel excel = (Excel) os[1];
            String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor());
            if (!headerStyles.containsKey(key))
            {
                CellStyle style = wb.createCellStyle();
                style.cloneStyleFrom(styles.get("data"));
                style.setAlignment(HorizontalAlignment.CENTER);
                style.setVerticalAlignment(VerticalAlignment.CENTER);
                style.setFillForegroundColor(excel.headerBackgroundColor().index);
                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                Font headerFont = wb.createFont();
                headerFont.setFontName("Arial");
                headerFont.setFontHeightInPoints((short) 10);
                headerFont.setBold(true);
                headerFont.setColor(excel.headerColor().index);
                style.setFont(headerFont);
                headerStyles.put(key, style);
            }
        }
        return headerStyles;
    }
    /**
     * 根据Excel注解创建表格列样式
     *
     * @param wb 工作薄对象
     * @return 自定义样式列表
     */
    private Map<String, CellStyle> annotationDataStyles(Workbook wb)
    {
        Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
        for (Object[] os : fields)
        {
            Excel excel = (Excel) os[1];
            String key = StringUtils.format("data_{}_{}_{}", excel.align(), excel.color(), excel.backgroundColor());
            if (!styles.containsKey(key))
            {
                CellStyle style = wb.createCellStyle();
                style.setAlignment(excel.align());
                style.setVerticalAlignment(VerticalAlignment.CENTER);
                style.setBorderRight(BorderStyle.THIN);
                style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
                style.setBorderLeft(BorderStyle.THIN);
                style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
                style.setBorderTop(BorderStyle.THIN);
                style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
                style.setBorderBottom(BorderStyle.THIN);
                style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
                style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                style.setFillForegroundColor(excel.backgroundColor().getIndex());
                Font dataFont = wb.createFont();
                dataFont.setFontName("Arial");
                dataFont.setFontHeightInPoints((short) 10);
                dataFont.setColor(excel.color().index);
                style.setFont(dataFont);
                styles.put(key, style);
            }
        }
        return styles;
    }
    /**
     * 创建单元格
     */
    public Cell createHeadCell(Excel attr, Row row, int column)
    {
        // 创建列
        Cell cell = row.createCell(column);
        // 写入列信息
        cell.setCellValue(attr.name());
        setDataValidation(attr, row, column);
        cell.setCellStyle(styles.get(StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor())));
        if (isSubList())
        {
            // 填充默认样式,防止合并单元格样式失效
            sheet.setDefaultColumnStyle(column, styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor())));
            if (attr.needMerge())
            {
                sheet.addMergedRegion(new CellRangeAddress(rownum - 1, rownum, column, column));
            }
        }
        return cell;
    }
    /**
     * 设置单元格信息
     *
     * @param value 单元格值
     * @param attr 注解相关
     * @param cell 单元格信息
     */
    public void setCellVo(Object value, Excel attr, Cell cell)
    {
        if (ColumnType.STRING == attr.cellType())
        {
            String cellValue = Convert.toStr(value);
            // 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。
            if (StringUtils.startsWithAny(cellValue, FORMULA_STR))
            {
                cellValue = RegExUtils.replaceFirst(cellValue, FORMULA_REGEX_STR, "\t$0");
            }
            if (value instanceof Collection && StringUtils.equals("[]", cellValue))
            {
                cellValue = StringUtils.EMPTY;
            }
            cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix());
        }
        else if (ColumnType.NUMERIC == attr.cellType())
        {
            if (StringUtils.isNotNull(value))
            {
                cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value));
            }
        }
        else if (ColumnType.IMAGE == attr.cellType())
        {
            ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1);
            String imagePath = Convert.toStr(value);
            if (StringUtils.isNotEmpty(imagePath))
            {
                byte[] data = ImageUtils.getImage(imagePath);
                getDrawingPatriarch(cell.getSheet()).createPicture(anchor,
                        cell.getSheet().getWorkbook().addPicture(data, getImageType(data)));
            }
        }
    }
    /**
     * 获取画布
     */
    public static Drawing<?> getDrawingPatriarch(Sheet sheet)
    {
        if (sheet.getDrawingPatriarch() == null)
        {
            sheet.createDrawingPatriarch();
        }
        return sheet.getDrawingPatriarch();
    }
    /**
     * 获取图片类型,设置图片插入类型
     */
    public int getImageType(byte[] value)
    {
        String type = FileTypeUtils.getFileExtendName(value);
        if ("JPG".equalsIgnoreCase(type))
        {
            return Workbook.PICTURE_TYPE_JPEG;
        }
        else if ("PNG".equalsIgnoreCase(type))
        {
            return Workbook.PICTURE_TYPE_PNG;
        }
        return Workbook.PICTURE_TYPE_JPEG;
    }
    /**
     * 创建表格样式
     */
    public void setDataValidation(Excel attr, Row row, int column)
    {
        if (attr.name().indexOf("注:") >= 0)
        {
            sheet.setColumnWidth(column, 6000);
        }
        else
        {
            // 设置列宽
            sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256));
        }
        if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0)
        {
            if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255)
            {
                // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到
                setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column);
            }
            else
            {
                // 提示信息或只能选择不能输入的列内容.
                setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column);
            }
        }
    }
    /**
     * 添加单元格
     */
    public Cell addCell(Excel attr, Row row, T vo, Field field, int column)
    {
        Cell cell = null;
        try
        {
            // 设置行高
            row.setHeight(maxHeight);
            // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列.
            if (attr.isExport())
            {
                // 创建cell
                cell = row.createCell(column);
                if (isSubListValue(vo) && getListCellValue(vo).size() > 1 && attr.needMerge())
                {
                    CellRangeAddress cellAddress = new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column);
                    sheet.addMergedRegion(cellAddress);
                }
                cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor())));
                // 用于读取对象中的属性
                Object value = getTargetValue(vo, field, attr);
                String dateFormat = attr.dateFormat();
                String readConverterExp = attr.readConverterExp();
                String separator = attr.separator();
                if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value))
                {
                    cell.setCellValue(parseDateToStr(dateFormat, value));
                }
                else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
                {
                    cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator));
                }
                else if (value instanceof BigDecimal && -1 != attr.scale())
                {
                    cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue());
                }
                else if (!attr.handler().equals(ExcelHandlerAdapter.class))
                {
                    cell.setCellValue(dataFormatHandlerAdapter(value, attr));
                }
                else
                {
                    // 设置列类型
                    setCellVo(value, attr, cell);
                }
                addStatisticsData(column, Convert.toStr(value), attr);
            }
        }
        catch (Exception e)
        {
            log.error("导出Excel失败{}", e);
        }
        return cell;
    }
    /**
     * 设置 POI XSSFSheet 单元格提示或选择框
     *
     * @param sheet 表单
     * @param textlist 下拉框显示的内容
     * @param promptContent 提示内容
     * @param firstRow 开始行
     * @param endRow 结束行
     * @param firstCol 开始列
     * @param endCol 结束列
     */
    public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow,
            int firstCol, int endCol)
    {
        DataValidationHelper helper = sheet.getDataValidationHelper();
        DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1");
        CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
        DataValidation dataValidation = helper.createValidation(constraint, regions);
        if (StringUtils.isNotEmpty(promptContent))
        {
            // 如果设置了提示信息则鼠标放上去提示
            dataValidation.createPromptBox("", promptContent);
            dataValidation.setShowPromptBox(true);
        }
        // 处理Excel兼容性问题
        if (dataValidation instanceof XSSFDataValidation)
        {
            dataValidation.setSuppressDropDownArrow(true);
            dataValidation.setShowErrorBox(true);
        }
        else
        {
            dataValidation.setSuppressDropDownArrow(false);
        }
        sheet.addValidationData(dataValidation);
    }
    /**
     * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框).
     *
     * @param sheet 要设置的sheet.
     * @param textlist 下拉框显示的内容
     * @param promptContent 提示内容
     * @param firstRow 开始行
     * @param endRow 结束行
     * @param firstCol 开始列
     * @param endCol 结束列
     */
    public void setXSSFValidationWithHidden(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, int firstCol, int endCol)
    {
        String hideSheetName = "combo_" + firstCol + "_" + endCol;
        Sheet hideSheet = wb.createSheet(hideSheetName); // 用于存储 下拉菜单数据
        for (int i = 0; i < textlist.length; i++)
        {
            hideSheet.createRow(i).createCell(0).setCellValue(textlist[i]);
        }
        // 创建名称,可被其他单元格引用
        Name name = wb.createName();
        name.setNameName(hideSheetName + "_data");
        name.setRefersToFormula(hideSheetName + "!$A$1:$A$" + textlist.length);
        DataValidationHelper helper = sheet.getDataValidationHelper();
        // 加载下拉列表内容
        DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data");
        // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
        CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
        // 数据有效性对象
        DataValidation dataValidation = helper.createValidation(constraint, regions);
        if (StringUtils.isNotEmpty(promptContent))
        {
            // 如果设置了提示信息则鼠标放上去提示
            dataValidation.createPromptBox("", promptContent);
            dataValidation.setShowPromptBox(true);
        }
        // 处理Excel兼容性问题
        if (dataValidation instanceof XSSFDataValidation)
        {
            dataValidation.setSuppressDropDownArrow(true);
            dataValidation.setShowErrorBox(true);
        }
        else
        {
            dataValidation.setSuppressDropDownArrow(false);
        }
        sheet.addValidationData(dataValidation);
        // 设置hiddenSheet隐藏
        wb.setSheetHidden(wb.getSheetIndex(hideSheet), true);
    }
    /**
     * 解析导出值 0=男,1=女,2=未知
     *
     * @param propertyValue 参数值
     * @param converterExp 翻译注解
     * @param separator 分隔符
     * @return 解析后值
     */
    public static String convertByExp(String propertyValue, String converterExp, String separator)
    {
        StringBuilder propertyString = new StringBuilder();
        String[] convertSource = converterExp.split(",");
        for (String item : convertSource)
        {
            String[] itemArray = item.split("=");
            if (StringUtils.containsAny(propertyValue, separator))
            {
                for (String value : propertyValue.split(separator))
                {
                    if (itemArray[0].equals(value))
                    {
                        propertyString.append(itemArray[1] + separator);
                        break;
                    }
                }
            }
            else
            {
                if (itemArray[0].equals(propertyValue))
                {
                    return itemArray[1];
                }
            }
        }
        return StringUtils.stripEnd(propertyString.toString(), separator);
    }
    /**
     * 反向解析值 男=0,女=1,未知=2
     *
     * @param propertyValue 参数值
     * @param converterExp 翻译注解
     * @param separator 分隔符
     * @return 解析后值
     */
    public static String reverseByExp(String propertyValue, String converterExp, String separator)
    {
        StringBuilder propertyString = new StringBuilder();
        String[] convertSource = converterExp.split(",");
        for (String item : convertSource)
        {
            String[] itemArray = item.split("=");
            if (StringUtils.containsAny(propertyValue, separator))
            {
                for (String value : propertyValue.split(separator))
                {
                    if (itemArray[1].equals(value))
                    {
                        propertyString.append(itemArray[0] + separator);
                        break;
                    }
                }
            }
            else
            {
                if (itemArray[1].equals(propertyValue))
                {
                    return itemArray[0];
                }
            }
        }
        return StringUtils.stripEnd(propertyString.toString(), separator);
    }
    /**
     * 数据处理器
     *
     * @param value 数据值
     * @param excel 数据注解
     * @return
     */
    public String dataFormatHandlerAdapter(Object value, Excel excel)
    {
        try
        {
            Object instance = excel.handler().newInstance();
            Method formatMethod = excel.handler().getMethod("format", new Class[] { Object.class, String[].class });
            value = formatMethod.invoke(instance, value, excel.args());
        }
        catch (Exception e)
        {
            log.error("不能格式化数据 " + excel.handler(), e.getMessage());
        }
        return Convert.toStr(value);
    }
    /**
     * 合计统计信息
     */
    private void addStatisticsData(Integer index, String text, Excel entity)
    {
        if (entity != null && entity.isStatistics())
        {
            Double temp = 0D;
            if (!statistics.containsKey(index))
            {
                statistics.put(index, temp);
            }
            try
            {
                temp = Double.valueOf(text);
            }
            catch (NumberFormatException e)
            {
            }
            statistics.put(index, statistics.get(index) + temp);
        }
    }
    /**
     * 创建统计行
     */
    public void addStatisticsRow()
    {
        if (statistics.size() > 0)
        {
            Row row = sheet.createRow(sheet.getLastRowNum() + 1);
            Set<Integer> keys = statistics.keySet();
            Cell cell = row.createCell(0);
            cell.setCellStyle(styles.get("total"));
            cell.setCellValue("合计");
            for (Integer key : keys)
            {
                cell = row.createCell(key);
                cell.setCellStyle(styles.get("total"));
                cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key)));
            }
            statistics.clear();
        }
    }
    /**
     * 获取bean中的属性值
     *
     * @param vo 实体对象
     * @param field 字段
     * @param excel 注解
     * @return 最终的属性值
     * @throws Exception
     */
    private Object getTargetValue(T vo, Field field, Excel excel) throws Exception
    {
        Object o = field.get(vo);
        if (StringUtils.isNotEmpty(excel.targetAttr()))
        {
            String target = excel.targetAttr();
            if (target.contains("."))
            {
                String[] targets = target.split("[.]");
                for (String name : targets)
                {
                    o = getValue(o, name);
                }
            }
            else
            {
                o = getValue(o, target);
            }
        }
        return o;
    }
    /**
     * 以类的属性的get方法方法形式获取值
     *
     * @param o
     * @param name
     * @return value
     * @throws Exception
     */
    private Object getValue(Object o, String name) throws Exception
    {
        if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name))
        {
            Class<?> clazz = o.getClass();
            Field field = clazz.getDeclaredField(name);
            field.setAccessible(true);
            o = field.get(o);
        }
        return o;
    }
    /**
     * 得到所有定义字段
     */
    private void createExcelField()
    {
        this.fields = getFields();
        this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList());
        this.maxHeight = getRowHeight();
    }
    /**
     * 获取字段注解信息
     */
    public List<Object[]> getFields()
    {
        List<Object[]> fields = new ArrayList<Object[]>();
        List<Field> tempFields = new ArrayList<>();
        tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));
        tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
        for (Field field : tempFields)
        {
            if (!ArrayUtils.contains(this.excludeFields, field.getName()))
            {
                // 单注解
                if (field.isAnnotationPresent(Excel.class))
                {
                    Excel attr = field.getAnnotation(Excel.class);
                    if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
                    {
                        field.setAccessible(true);
                        fields.add(new Object[] { field, attr });
                    }
                    if (Collection.class.isAssignableFrom(field.getType()))
                    {
                        subMethod = getSubMethod(field.getName(), clazz);
                        ParameterizedType pt = (ParameterizedType) field.getGenericType();
                        Class<?> subClass = (Class<?>) pt.getActualTypeArguments()[0];
                        this.subFields = FieldUtils.getFieldsListWithAnnotation(subClass, Excel.class);
                    }
                }
                // 多注解
                if (field.isAnnotationPresent(Excels.class))
                {
                    Excels attrs = field.getAnnotation(Excels.class);
                    Excel[] excels = attrs.value();
                    for (Excel attr : excels)
                    {
                        if (!ArrayUtils.contains(this.excludeFields, field.getName() + "." + attr.targetAttr())
                                && (attr != null && (attr.type() == Type.ALL || attr.type() == type)))
                        {
                            field.setAccessible(true);
                            fields.add(new Object[] { field, attr });
                        }
                    }
                }
            }
        }
        return fields;
    }
    /**
     * 根据注解获取最大行高
     */
    public short getRowHeight()
    {
        double maxHeight = 0;
        for (Object[] os : this.fields)
        {
            Excel excel = (Excel) os[1];
            maxHeight = Math.max(maxHeight, excel.height());
        }
        return (short) (maxHeight * 20);
    }
    /**
     * 创建一个工作簿
     */
    public void createWorkbook()
    {
        this.wb = new SXSSFWorkbook(500);
        this.sheet = wb.createSheet();
        wb.setSheetName(0, sheetName);
        this.styles = createStyles(wb);
    }
    /**
     * 创建工作表
     *
     * @param sheetNo sheet数量
     * @param index 序号
     */
    public void createSheet(int sheetNo, int index)
    {
        // 设置工作表的名称.
        if (sheetNo > 1 && index > 0)
        {
            this.sheet = wb.createSheet();
            this.createTitle();
            wb.setSheetName(index, sheetName + index);
        }
    }
    /**
     * 获取单元格值
     *
     * @param row 获取的行
     * @param column 获取单元格列号
     * @return 单元格值
     */
    public Object getCellValue(Row row, int column)
    {
        if (row == null)
        {
            return row;
        }
        Object val = "";
        try
        {
            Cell cell = row.getCell(column);
            if (StringUtils.isNotNull(cell))
            {
                if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA)
                {
                    val = cell.getNumericCellValue();
                    if (DateUtil.isCellDateFormatted(cell))
                    {
                        val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换
                    }
                    else
                    {
                        if ((Double) val % 1 != 0)
                        {
                            val = new BigDecimal(val.toString());
                        }
                        else
                        {
                            val = new DecimalFormat("0").format(val);
                        }
                    }
                }
                else if (cell.getCellType() == CellType.STRING)
                {
                    val = cell.getStringCellValue();
                }
                else if (cell.getCellType() == CellType.BOOLEAN)
                {
                    val = cell.getBooleanCellValue();
                }
                else if (cell.getCellType() == CellType.ERROR)
                {
                    val = cell.getErrorCellValue();
                }
            }
        }
        catch (Exception e)
        {
            return val;
        }
        return val;
    }
    /**
     * 判断是否是空行
     *
     * @param row 判断的行
     * @return
     */
    private boolean isRowEmpty(Row row)
    {
        if (row == null)
        {
            return true;
        }
        for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++)
        {
            Cell cell = row.getCell(i);
            if (cell != null && cell.getCellType() != CellType.BLANK)
            {
                return false;
            }
        }
        return true;
    }
    /**
     * 格式化不同类型的日期对象
     *
     * @param dateFormat 日期格式
     * @param val 被格式化的日期对象
     * @return 格式化后的日期字符
     */
    public String parseDateToStr(String dateFormat, Object val)
    {
        if (val == null)
        {
            return "";
        }
        String str;
        if (val instanceof Date)
        {
            str = DateUtils.parseDateToStr(dateFormat, (Date) val);
        }
        else if (val instanceof LocalDateTime)
        {
            str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDateTime) val));
        }
        else if (val instanceof LocalDate)
        {
            str = DateUtils.parseDateToStr(dateFormat, DateUtils.toDate((LocalDate) val));
        }
        else
        {
            str = val.toString();
        }
        return str;
    }
    /**
     * 是否有对象的子列表
     */
    public boolean isSubList()
    {
        return StringUtils.isNotNull(subFields) && subFields.size() > 0;
    }
    /**
     * 是否有对象的子列表,集合不为空
     */
    public boolean isSubListValue(T vo)
    {
        return StringUtils.isNotNull(subFields) && subFields.size() > 0 && StringUtils.isNotNull(getListCellValue(vo)) && getListCellValue(vo).size() > 0;
    }
    /**
     * 获取集合的值
     */
    public Collection<?> getListCellValue(Object obj)
    {
        Object value;
        try
        {
            value = subMethod.invoke(obj, new Object[] {});
        }
        catch (Exception e)
        {
            return new ArrayList<Object>();
        }
        return (Collection<?>) value;
    }
    /**
     * 获取对象的子列表方法
     *
     * @param name 名称
     * @param pojoClass 类对象
     * @return 子列表方法
     */
    public Method getSubMethod(String name, Class<?> pojoClass)
    {
        StringBuffer getMethodName = new StringBuffer("get");
        getMethodName.append(name.substring(0, 1).toUpperCase());
        getMethodName.append(name.substring(1));
        Method method = null;
        try
        {
            method = pojoClass.getMethod(getMethodName.toString(), new Class[] {});
        }
        catch (Exception e)
        {
            log.error("获取对象异常{}", e.getMessage());
        }
        return method;
    }
}
Diff truncated after the above file
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/reflect/ReflectUtils.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/req/SubmitTempletReq.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sign/Base64.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/sql/SqlUtil.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/IdUtils.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/QRCodeGenerator.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/Seq.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/uuid/UUID.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/controller/BaseController.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/AjaxResult.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseDelete.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseEntity.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BaseModel.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/BasePojo.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/TreeEntity.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/BasePage.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/PageDomain.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/PageInfo.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableDataInfo.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/page/TableSupport.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/xss/Xss.java ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/xss/XssValidator.java ruoyi-common/ruoyi-common-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ruoyi-common/ruoyi-common-datascope/pom.xml ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/annotation/DataScope.java ruoyi-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java ruoyi-common/ruoyi-common-datascope/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ruoyi-common/ruoyi-common-datasource/pom.xml ruoyi-common/ruoyi-common-datasource/src/main/java/com/ruoyi/common/datasource/annotation/Master.java ruoyi-common/ruoyi-common-datasource/src/main/java/com/ruoyi/common/datasource/annotation/Slave.java ruoyi-common/ruoyi-common-log/pom.xml ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/annotation/Log.java ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/aspect/LogAspect.java ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/BusinessStatus.java ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/BusinessType.java ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/enums/OperatorType.java ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/filter/PropertyPreExcludeFilter.java ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/service/AsyncLogService.java ruoyi-common/ruoyi-common-log/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ruoyi-common/ruoyi-common-redis/pom.xml ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/annotation/DistributedLock.java ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/aspectj/DistributedLockAspect.java ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/FastJson2JsonRedisSerializer.java ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/configure/RedisConfig.java ruoyi-common/ruoyi-common-redis/src/main/java/com/ruoyi/common/redis/service/RedisService.java ruoyi-common/ruoyi-common-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ruoyi-common/ruoyi-common-security/pom.xml ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableCustomConfig.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/EnableRyFeignClients.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/InnerAuth.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/Logical.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresLogin.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresPermissions.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/annotation/RequiresRoles.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/InnerAuthAspect.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/aspect/PreAuthorizeAspect.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthLogic.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/auth/AuthUtil.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/ApplicationConfig.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/config/WebMvcConfig.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignAutoConfiguration.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/feign/FeignRequestInterceptor.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/interceptor/HeaderInterceptor.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/DictUtils.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/MD5Generator.java ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/SecurityUtils.java ruoyi-common/ruoyi-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ruoyi-common/ruoyi-common-swagger/pom.xml ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/annotation/EnableCustomSwagger2.java ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerAutoConfiguration.java ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerBeanPostProcessor.java ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerProperties.java ruoyi-common/ruoyi-common-swagger/src/main/java/com/ruoyi/common/swagger/config/SwaggerWebConfiguration.java ruoyi-common/ruoyi-common-swagger/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports ruoyi-gateway/pom.xml ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/AntiShakeProperties.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/HMACSHA1.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java ruoyi-gateway/src/main/resources/banner.txt ruoyi-gateway/src/main/resources/logback.xml ruoyi-modules/pom.xml ruoyi-modules/ruoyi-file/pom.xml ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/RuoYiFileApplication.java ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/MinioConfig.java ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/config/ResourcesConfig.java ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/MinioSysFileServiceImpl.java ruoyi-modules/ruoyi-file/src/main/resources/banner.txt ruoyi-modules/ruoyi-file/src/main/resources/logback.xml ruoyi-modules/ruoyi-gen/pom.xml ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/RuoYiGenApplication.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/config/GenConfig.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/controller/GenController.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTable.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/domain/GenTableColumn.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableColumnMapper.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/mapper/GenTableMapper.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableColumnServiceImpl.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/GenTableServiceImpl.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableColumnService.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/service/IGenTableService.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/GenUtils.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityInitializer.java ruoyi-modules/ruoyi-gen/src/main/java/com/ruoyi/gen/util/VelocityUtils.java ruoyi-modules/ruoyi-gen/src/main/resources/banner.txt ruoyi-modules/ruoyi-gen/src/main/resources/logback.xml ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/controller.java.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/domain.java.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/mapper.java.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/service.java.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/serviceImpl.java.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/java/sub-domain.java.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/js/api.js.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index-tree.vue.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/index.vue.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index-tree.vue.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/index.vue.vm ruoyi-modules/ruoyi-gen/src/main/resources/vm/vue/v3/readme.txt ruoyi-modules/ruoyi-gen/src/main/resources/vm/xml/mapper.xml.vm ruoyi-modules/ruoyi-job/pom.xml ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/RuoYiJobApplication.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/config/ScheduleConfig.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobController.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/controller/SysJobLogController.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJob.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/domain/SysJobLog.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobLogMapper.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/mapper/SysJobMapper.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobLogService.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/ISysJobService.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobLogServiceImpl.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/service/SysJobServiceImpl.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/RyTask.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/AbstractQuartzJob.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/CronUtils.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/JobInvokeUtil.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzDisallowConcurrentExecution.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/QuartzJobExecution.java ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/util/ScheduleUtils.java ruoyi-modules/ruoyi-job/src/main/resources/banner.txt ruoyi-modules/ruoyi-job/src/main/resources/logback.xml ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/SysJobLogMapper.xml ruoyi-modules/ruoyi-job/src/main/resources/mapper/job/SysJobMapper.xml ruoyi-modules/ruoyi-system/pom.xml ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GenTableColumnController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/GenTableController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysConfigController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDeptController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictDataController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysDictTypeController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysJobController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysJobLogController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysLoginLogController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysMenuController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysNoticeController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysOperlogController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysPostController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysProfileController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleDeptController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysRoleMenuController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserOnlineController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserPostController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/UserShopController.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysConfig.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenu.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMenus.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysNotice.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysPost.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleDept.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysRoleMenu.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserOnline.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserPost.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/SysUserRole.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/AddCompanyUserDto.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/IndexDto.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/RoleAddDto.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/RoleUpdateDto.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/CompanyUserVo.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MetaVo.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RoleInfoVo.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/RouterVo.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TCompanyToUserVo.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/TreeSelect.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/UserRoleVO.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ViolationListExportVo.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/dto/UpdatePassword.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/filter/AuthFilter.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysConfigMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDeptMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictDataMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysDictTypeMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLoginLogMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysNoticeMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysOperLogMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysPostMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleDeptMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMenuMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserPostMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserRoleMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserShopMapper.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/GetSysUserList.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/ShopUserStart.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/query/SysOperLogQuery.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysConfigService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDeptService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictDataService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDictTypeService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysLoginLogService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMenuService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysNoticeService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOperLogService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPermissionService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysPostService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserOnlineService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserRoleService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/UserShopService.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysConfigServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictTypeServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLoginLogServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysNoticeServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOperLogServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPermissionServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysPostServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserOnlineServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserRoleServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserShopServiceImpl.java ruoyi-modules/ruoyi-system/src/main/resources/banner.txt ruoyi-modules/ruoyi-system/src/main/resources/logback.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/BalanceChangeRecordCopyMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysConfigMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDeptMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDictDataMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysDictTypeMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysLoginLogMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysMenuMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysNoticeMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysOperLogMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysPostMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysRoleDeptMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysRoleMenuMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserPostMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/SysUserRoleMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/UserShopMapper.xml ruoyi-modules/ruoyi-system/src/main/resources/mybatis-config.xml ruoyi-service/pom.xml ruoyi-service/ruoyi-account/pom.xml ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/RuoYiAccountApplication.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/DataUpdateHandlerConfig.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/FileUploadConfig.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/HttpConfig.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/config/MybatisPlusConfig.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserBankController.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserCancellationLogController.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/AgentQuery.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/BalanceQuery.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/DangerInfoDto.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/RecommendDto.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/SignBackRDto.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/UserCancelQuery.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/UserChangeQuery.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/WithQuery.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/dto/WithdrawalRequestsDTO.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/AppUserBankMapper.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/AppUserMapper.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserCancellationLogMapper.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/UserPointMapper.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserBankService.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserService.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/PointSettingService.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserCancellationLogService.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserBankServiceImpl.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/PointSettingServiceImpl.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserCancellationLogServiceImpl.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GeodesyUtil.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/ObsUploadUtil.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SMSUtil.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/MD5AndKL.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/PaymentUtil.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/TransferUtil.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/AccountBalanceQueryResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/CloseOrderResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/FrpCodeEnum.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/QueryOrderResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/QueryRefundResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/RefundCallbackResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/RefundResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePay.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayCallbackResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayQueryResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/SinglePayResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/UniPayCallbackResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/payment/model/UniPayResult.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/tencentMap/TencentMapUtil.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/AES.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/EnvVersion.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WXCore.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WeChatUtil.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WxPKCS7Encoder.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/AppletLogin.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/LoginVo.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/MobileLogin.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/NearbyReferrer.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/NearbyReferrerVo.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/RegisterAccount.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/SMSCode.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/TransferPoint.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointDetailVO.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointStatistics.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserStatistics.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserStatisticsDetail.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatistics.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletStatisticsDetail.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletVO.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WithdrawalAuth.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/vip/Level.java ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/vip/VipLevel.java ruoyi-service/ruoyi-account/src/main/resources/logback.xml ruoyi-service/ruoyi-account/src/main/resources/mapper/account/AppUserMapper.xml ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserCancellationLogMapper.xml ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserPointMapper.xml ruoyi-service/ruoyi-account/src/main/resources/mybatis-config.xml ruoyi-service/ruoyi-account/src/test/java/com/ruoyi/order/account/RuoYiAccountApplicationTests.java ruoyi-service/ruoyi-order/pom.xml ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/DataUpdateHandlerConfig.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/HttpConfig.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/config/MybatisPlusConfig.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/JsapiServiceExample.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderGoodController.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/enums/OrderStatus.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/enums/OrderType.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEvent.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/ConfirmDeliveryEventListener.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/PayEvent.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/event/PayEventListener.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderGoodMapper.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/OrderMapper.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderGoodService.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderGoodServiceImpl.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/ExpressDeliveryUtil.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/GeodesyUtil.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/RedisLock.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/MD5AndKL.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/PaymentUtil.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/TransferUtil.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/AccountBalanceQueryResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/CloseOrderResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/FrpCodeEnum.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/QueryOrderResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/QueryRefundResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/RefundCallbackResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/RefundResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePay.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayCallbackResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayQueryResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/SinglePayResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/UniPayCallbackResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/model/UniPayResult.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/TransferUtil.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/WechatProperty.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/payment/wechat/model/InitiateBatchTransfer.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/MapTrackKD100Vo.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100ListVo.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/vo/QueryKD100Vo.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/AuthPassStatus.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ConfirmDelivery.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/DeliverGoodsRefundPass.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderExport.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderInfoVo.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageList.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderPageListVo.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderRefundPassList.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderRefundPassListVo.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderStatistics.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderStatisticsDetail.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/RefundPassInfo.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Contact.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Order.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/OrderKey.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Payer.java ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/delivery/Shipping.java ruoyi-service/ruoyi-order/src/main/resources/logback.xml ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderGoodMapper.xml ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml ruoyi-service/ruoyi-order/src/main/resources/mybatis-config.xml ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/order/RuoYiOrderApplicationTests.java ruoyi-service/ruoyi-other/Dockerfile ruoyi-service/ruoyi-other/pom.xml ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataUpdateHandlerConfig.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/HttpConfig.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/MybatisPlusConfig.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/AgreementController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BannerController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BaseSettingController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsCategoryController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsSeckillController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsShopController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/PhoneController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/PointSettingController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/RegionController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SeckillActivityInfoController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SystemConfigController.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/GoodsAreaDto.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/PointSettingDto.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/ShopBalanceDto.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/dto/VipSetDto.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/GoodsStatus.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/PhoneType.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAddType.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShareAuditStatus.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/ShopStatus.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianErrorCode.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianStatus.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/AgreementMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BannerMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/BaseSettingMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsCategoryMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsSeckillMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/GoodsShopMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PhoneMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/PointSettingMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ReceiverBankChannelMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/RegionMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SeckillActivityInfoMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/SystemConfigMapper.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/AgreementService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BannerService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/BaseSettingService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsCategoryService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsSeckillService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/GoodsShopService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/IAgreementService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PhoneService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/PointSettingService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ReceiverBankChannelService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/RegionService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SeckillActivityInfoService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/ShopService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/SystemConfigService.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/AgreementServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BannerServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/BaseSettingServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsCategoryServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsSeckillServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsShopServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PhoneServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/PointSettingServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ReceiverBankChannelServicImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/RegionServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/ShopServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SystemConfigServiceImpl.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/GeodesyUtil.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/MD5AndKL.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/PaymentUtil.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/TransferUtil.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/AccountBalanceQueryResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/CloseOrderResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/FrpCodeEnum.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/QueryOrderResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/QueryRefundResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/RefundCallbackResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/RefundResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePay.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayCallbackResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayQueryResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/SinglePayResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/UniPayCallbackResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/payment/model/UniPayResult.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/util/tencentMap/TencentMapUtil.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/GoodsVO.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/Home.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/NearbyShopVO.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/RefundPassSettingVo.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SaveWithdrawalAccount.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityDetailVO.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/SeckillActivityVO.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopBalanceStatementDetailPage.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopCommission.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopCommissionDetail.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopDetailVO.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopGoodsList.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopGoodsListVo.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/ShopStatistics.java ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/vo/WalletChangeVO.java ruoyi-service/ruoyi-other/src/main/resources/logback.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/AgreementMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/CouponInfoMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsAreaMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsBargainPriceMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsSeckillMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/GoodsShopMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/SeckillActivityInfoMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShareMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopBalanceStatementMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/ShopPointMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TechnicianMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TechnicianSubscribeMapper.xml ruoyi-service/ruoyi-other/src/main/resources/mybatis-config.xml ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/order/other/RuoYiOtherApplicationTests.java sql/qijisheng_account.sql sql/qijisheng_order.sql sql/qijisheng_other.sql sql/qijisheng_system.sql