Showing preview only (440K chars total). Download the full file or copy to clipboard to get everything.
Repository: gnanquanmama/tropical-fish
Branch: master
Commit: c06be7a4398c
Files: 198
Total size: 357.2 KB
Directory structure:
gitextract_d6am_5fj/
├── .gitignore
├── LICENSE
├── README.md
├── _docs/
│ └── fish_mysql.sql
├── applet/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── mcoding/
│ │ └── applet/
│ │ ├── AppletApplication.java
│ │ ├── auth/
│ │ │ ├── AppAuthController.java
│ │ │ ├── WechatAuthController.java
│ │ │ ├── base/
│ │ │ │ ├── LoginRequired.java
│ │ │ │ ├── LoginRequiredArgumentResolver.java
│ │ │ │ └── config/
│ │ │ │ ├── AuthConfig.java
│ │ │ │ ├── AuthInterceptor.java
│ │ │ │ └── LoginRequiredConfig.java
│ │ │ ├── business/
│ │ │ │ ├── RegisterBo.java
│ │ │ │ ├── UserInfoBo.java
│ │ │ │ └── resp/
│ │ │ │ ├── AccessTokenRespEntity.java
│ │ │ │ ├── JsCode2SessionRespEntity.java
│ │ │ │ └── WxCodeUnlimitedResponse.java
│ │ │ ├── dao/
│ │ │ │ └── BaseUserTokenMapper.java
│ │ │ ├── dto/
│ │ │ │ ├── BindingStoreDto.java
│ │ │ │ ├── CreateUserDto.java
│ │ │ │ ├── PhoneNumberDto.java
│ │ │ │ └── RegisterDto.java
│ │ │ ├── entity/
│ │ │ │ └── BaseUserToken.java
│ │ │ ├── manager/
│ │ │ │ ├── WechatClient.java
│ │ │ │ └── impl/
│ │ │ │ └── WechatClientImpl.java
│ │ │ ├── service/
│ │ │ │ ├── BaseUserTokenService.java
│ │ │ │ ├── WechatAuthService.java
│ │ │ │ └── impl/
│ │ │ │ ├── BaseUserTokenServiceImpl.java
│ │ │ │ └── WechatAuthServiceImpl.java
│ │ │ └── util/
│ │ │ └── LoginUserUtils.java
│ │ └── order/
│ │ └── component/
│ │ ├── ActivityCodeController.java
│ │ ├── ActivityOrderBizCodeGenerator.java
│ │ └── TargetCodeEnum.java
│ └── resources/
│ ├── application-dev.properties
│ ├── application-prd.properties
│ ├── application.properties
│ ├── logback-spring.xml
│ └── prop/
│ └── redisson-dev.yaml
├── backend/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── mcoding/
│ │ ├── BackendApplication.java
│ │ └── modular/
│ │ ├── auth/
│ │ │ ├── config/
│ │ │ │ ├── AuthConfig.java
│ │ │ │ ├── AuthInterceptor.java
│ │ │ │ └── LoginRequiredConfig.java
│ │ │ ├── controller/
│ │ │ │ └── AppAuthController.java
│ │ │ └── support/
│ │ │ ├── LoginRequired.java
│ │ │ ├── LoginRequiredArgumentResolver.java
│ │ │ └── LoginUserUtils.java
│ │ ├── biz/
│ │ │ └── user/
│ │ │ └── controller/
│ │ │ ├── BizUserController.java
│ │ │ └── UserDataListener.java
│ │ ├── rule/
│ │ │ ├── ACmp.java
│ │ │ ├── BCmp.java
│ │ │ ├── BizFlow.java
│ │ │ ├── CCmp.java
│ │ │ └── RuleFlowController.java
│ │ ├── search/
│ │ │ ├── controller/
│ │ │ │ └── ProductSpuController.java
│ │ │ ├── dao/
│ │ │ │ └── ProductSpuMapper.java
│ │ │ ├── entity/
│ │ │ │ └── ProductSpu.java
│ │ │ └── service/
│ │ │ ├── ProductSpuService.java
│ │ │ └── impl/
│ │ │ └── ProductSpuServiceImpl.java
│ │ ├── system/
│ │ │ └── user/
│ │ │ ├── controller/
│ │ │ │ └── SysUserController.java
│ │ │ ├── dao/
│ │ │ │ └── SysUserMapper.java
│ │ │ ├── entity/
│ │ │ │ └── SysUser.java
│ │ │ └── service/
│ │ │ ├── SysUserService.java
│ │ │ └── impl/
│ │ │ └── SysUserServiceImpl.java
│ │ └── tech/
│ │ └── job/
│ │ ├── ActivityStatusUpdateJob.java
│ │ └── config/
│ │ ├── XxlJobConfig.java
│ │ └── XxlJobPropertiesConfig.java
│ └── resources/
│ ├── application-dev.properties
│ ├── application.properties
│ ├── config/
│ │ └── flow.el.xml
│ ├── logback-spring.xml
│ ├── prop/
│ │ └── redisson-dev.yaml
│ └── template/
│ └── UserTemplate.ftl
├── base-common/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── mcoding/
│ └── base/
│ └── common/
│ ├── exception/
│ │ ├── BizException.java
│ │ ├── CommonException.java
│ │ └── SysException.java
│ ├── pattern/
│ │ ├── command/
│ │ │ ├── CommandInvoker.java
│ │ │ ├── ICommand.java
│ │ │ └── ICommandInvoker.java
│ │ ├── filterchain/
│ │ │ ├── Filter.java
│ │ │ ├── FilterContext.java
│ │ │ └── Target.java
│ │ └── pipeline/
│ │ ├── Pipeline.java
│ │ ├── StandardPipeline.java
│ │ └── Value.java
│ └── util/
│ ├── Assert.java
│ ├── bean/
│ │ └── BeanMapperUtils.java
│ ├── collection/
│ │ └── MapUtils.java
│ ├── constant/
│ │ ├── MdcConstants.java
│ │ └── SysConstants.java
│ ├── date/
│ │ ├── DateTimeUtils.java
│ │ ├── DateUtils.java
│ │ └── DateValidator.java
│ ├── encryption/
│ │ └── Md5Utils.java
│ ├── excel/
│ │ ├── ExcelProperty.java
│ │ ├── ExcelUtils.java
│ │ ├── TitleAndModelKey.java
│ │ └── converter/
│ │ ├── BigDecimalConverter.java
│ │ ├── ConverterFactory.java
│ │ ├── DateConverter.java
│ │ ├── IntegerConverter.java
│ │ ├── LongConverter.java
│ │ ├── ObjToStrConverter.java
│ │ ├── StrToObjConverter.java
│ │ └── YesOrNoIntegerConverter.java
│ ├── id/
│ │ ├── IdGenerator.java
│ │ └── RandomIdGenerator.java
│ ├── image/
│ │ ├── ImageUtils.java
│ │ └── ImageWatermarkUtils.java
│ ├── math/
│ │ ├── BigDecimalUtils.java
│ │ ├── BigDecimalWrapper.java
│ │ ├── NumberMoneyConvertUtil.java
│ │ └── RMBUtil.java
│ ├── pdf/
│ │ └── FtlToPdfUtil.java
│ ├── reflect/
│ │ └── ReflectUtils.java
│ └── wechat/
│ ├── AES.java
│ ├── WXBizDataCrypt.java
│ ├── WxUserInfo.java
│ └── WxWaterMark.java
├── base-core/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── mcoding/
│ └── base/
│ └── core/
│ ├── cache/
│ │ ├── RCacheAspect.java
│ │ ├── RCacheEvict.java
│ │ └── RCacheable.java
│ ├── config/
│ │ ├── ControllerConfig.java
│ │ ├── EsClientConfig.java
│ │ ├── FilterConfig.java
│ │ ├── JavaSimonConfig.java
│ │ ├── MybatisPlusConfig.java
│ │ └── SwaggerConfig.java
│ ├── doc/
│ │ ├── EventNode.java
│ │ ├── EventNodeContainer.java
│ │ ├── EventNodeStack.java
│ │ ├── EventTraceAspect.java
│ │ ├── Phase.java
│ │ ├── Process.java
│ │ ├── Step.java
│ │ ├── controller/
│ │ │ ├── DocumentController.java
│ │ │ ├── TreeBuilder.java
│ │ │ └── dto/
│ │ │ └── TreeNode.java
│ │ └── filter/
│ │ └── MethodInvokeTreeFiler.java
│ ├── http/
│ │ └── HttpComponentConfig.java
│ ├── log/
│ │ ├── MdcAspect.java
│ │ ├── MdcLog.java
│ │ ├── MybatisLogImpl.java
│ │ ├── TraceRequestFiler.java
│ │ └── WebLogAspect.java
│ ├── orm/
│ │ ├── DslParser.java
│ │ ├── Keyword.java
│ │ ├── Like.java
│ │ ├── MetaModelField.java
│ │ ├── MetaModelUtils.java
│ │ ├── OprEnum.java
│ │ ├── OrderByAsc.java
│ │ ├── OrderByDesc.java
│ │ ├── ParseHandler.java
│ │ ├── ParseOrderByCondHandler.java
│ │ ├── ParsePageHandler.java
│ │ ├── ParseSearchCondHandler.java
│ │ ├── ParseWhereCondHandler.java
│ │ ├── ParserContext.java
│ │ ├── QueryKeyWord.java
│ │ └── WhereCondition.java
│ ├── rate/
│ │ └── RateLimitFilter.java
│ ├── rest/
│ │ ├── BoolObject.java
│ │ ├── IdObject.java
│ │ ├── PageView.java
│ │ ├── ResponseCode.java
│ │ └── ResponseResult.java
│ └── spring/
│ ├── AopUtils.java
│ ├── GglibBeanMap.java
│ └── SpringContextHolder.java
├── base-generator/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── mcoding/
│ │ └── base/
│ │ └── generator/
│ │ └── CodeGenerator.java
│ └── resources/
│ └── templates/
│ └── mybatis-plus/
│ ├── controller.java.ftl
│ └── entity.java.ftl
├── biz-component/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com.mcoding.base.component/
│ │ ├── ComponentApplication.java
│ │ ├── generatecode/
│ │ │ ├── dao/
│ │ │ │ └── BaseGenerateCodeDao.java
│ │ │ ├── domain/
│ │ │ │ └── CommonBizCodeGenerator.java
│ │ │ ├── entity/
│ │ │ │ └── BaseGenerateCode.java
│ │ │ ├── service/
│ │ │ │ ├── BaseGenerateCodeService.java
│ │ │ │ └── impl/
│ │ │ │ └── BaseGenerateCodeServiceImpl.java
│ │ │ └── strategy/
│ │ │ ├── AutoIncrementStrategy.java
│ │ │ ├── DateIncrementStrategy.java
│ │ │ └── GenerateStrategy.java
│ │ └── shorturl/
│ │ ├── controller/
│ │ │ └── ShortUrlController.java
│ │ └── domain/
│ │ └── ShortUrlGenerator.java
│ └── resources/
│ ├── application-dev.properties
│ ├── application.properties
│ └── prop/
│ └── redisson-dev.yaml
├── biz-user/
│ ├── pom.xml
│ └── src/
│ └── main/
│ └── java/
│ └── com/
│ └── mcoding/
│ └── base/
│ └── user/
│ ├── dao/
│ │ └── BaseUserMapper.java
│ ├── entity/
│ │ └── BaseUser.java
│ └── service/
│ ├── BaseUserService.java
│ └── impl/
│ └── BaseUserServiceImpl.java
└── pom.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Compiled class file
*.class
*.iml
*.idea
target/
logs/
# Log file
*.log
# BlueJ files
*.ctxt
# Package Files #
*.jar
*.war
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
*velocity.log*
# Eclipse #
.classpath
.project
.settings/
.DS_Store
_dockerCerts/
.factorypath
generatortmp/*
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2019 λx.wzt
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# Tropical Fish
Pragmatic 风格的 Java EE 后端开发脚手架。 基于 SpringBoot,技术选型采用主流的技术框架(Mybatis-Plus,Redisson,Xxl-job,Swagger)。开箱即用,提高研发效能。
多家公司线上产品使用了该脚手架。国内某知名日化企业,已把该脚手架作为基础脚手架,支撑数字化产品的研发。
### 项目特点
1. 自定义 DSL 查询语法。配合 generator 模块,研发人员定义表结构之后,逆向生成代码,单表情况下的CRUD,包括分页查询,可不用写一行代码,就完成开发任务。减轻后端研发人员开发压力,提高研发效率。分页查询语法 在 **自定义 DSL 查询语法** 有做详细的说明。
2. 自研 Excel 报表导入导出工具。 配合自定义查询语法,让导出 Excel 功能的开发和普通条件查询一样简单。高效开发报表导出功能。使用方法参照:BaseUserController.exportByExcel 。
3. 自研 分布式业务编码 生成服务。业务编码可批量生成。生成和使用过程,都是线程安全。 详细参照方法:ActivityOrderBizCodeGenerator.generateNextCode ;generateBizCodeList 。
4. 自定义缓存 @RCacheable 注解,实现分布式缓存。支持 Spel语法,可直接指定 expireTime 。
示例:@RCacheable(key = "dmt::miniprogram::token", secKey = "#token", ttl = 1, timeUnit = TimeUnit.DAYS)
5. 自定义注解 @LoginRequired 注解,可以自动装配当前操作人实体。该注解的意义在于,消除在每个 controller 方法需要手动获取当前操作人的重复性的代码。
6. 自定义 service 方法级别文档生成规则和实现。某种程度上缓解研发人员不爱写文档,又抱怨接手新项目没有文档的尴尬处境。 在**方法调用树示例** 有相应的 json 视图可以看到调用树的数据结构。
> 参考 <从码农到工匠> 控制代码复杂度的做法。复杂的业务的流程可拆分为多个阶段,每个阶段下有多个子步骤。 自定义注解,过程 @Process, 阶段 @Phase,步骤 @Step。在业务方法的阶段和步骤上加上相应的注解,即可根据请求返回的 TraceId 获取 service 级别的方法调用树。
> 研发人员需要按照定义规则流水线化,组件化设计代码,再加上必要的注解,runtime 状态下,就可以得到一颗拥有层次结构的方法调用树,得到复杂业务逻辑的主干架构。每个树结点有 Java 类方法,行数等信息,所见即所得。
#### 自定义 DSL 查询语法
> 查询条件语法
> ```json
> {
> "current": "页码",
> "size": "页数",
> "modelField.operation":"搜索条件",
> "orderByDesc":"modelField",
> "searchKeyword": "关键词"
> }
> ```
> 示例
> ```json
> {
> "current":1,
> "size":10,
> "userName.like":"github",
> "orderStatus.in":[1,3,4],
> "createTime.gt":1581392098000,
> "phone.isNotNull": "",
> "orderByDesc": "createTime",
> "searchKeyword": "githu"
> }
> ```
> 查询条件关键字
| KEYWORD | DESC |
| :-----------: | :----------------------------------------------------------: |
| modelField | 模型字段 |
| . | 分隔符 |
| operation | 不传 .operation,则默认为 eq。如果是模糊查询,支持字段加注解 @Like |
| orderByDesc | 递减 |
| orderByAsc | 递增 |
| searchKeyword | 关键词查询字段,搜索字段需要加上 @Keyword |
>operation 关键字列表
| operation | DESC | 语义 |
| :-------: | :---------------: | :-------------: |
| eq | 等于 | = |
| ne | 不等于 | <> |
| gt | 大于 | > |
| ge | 大于等于 | >= |
| lt | 小于 | < |
| le | 小于等于 | <= |
| like | 模糊匹配 | '%value%' |
| likeLeft | 以 value 结尾匹配 | '%value' |
| likeRight | 以 value 开头匹配 | 'value%' |
| in | in | in |
| between | 闭区间 | between s and e |
| isNull | is null | 为空 |
| isNotNull | is not null | 非空 |
#### 方法调用树示例
> ```json
> {
> "id":0,
> "parentId":-1,
> "lineNum":80,
> "method":"UserAuthController.register",
> "event":"小程序用户注册",
> "lifeCycle":"process",
> "sync":true,
> "childList":[
> {
> "id":7,
> "parentId":0,
> "lineNum":46,
> "method":"WechatServiceImpl.getUserInfoByCode",
> "event":"根据jscode获取用户信息",
> "lifeCycle":"phase",
> "sync":true
> },
> {
> "id":8,
> "parentId":0,
> "lineNum":25,
> "method":"BaseUserServiceImpl.getUserByOpenId",
> "event":"根据openId获取用户信息",
> "lifeCycle":"phase",
> "sync":true
> },
> {
> "id":9,
> "parentId":0,
> "lineNum":115,
> "method":"WechatAuthServiceImpl.invalidUserToken",
> "event":"失效用户token",
> "lifeCycle":"phase",
> "sync":true
> },
> {
> "id":10,
> "parentId":0,
> "lineNum":43,
> "method":"WechatAuthServiceImpl.register",
> "event":"注册用户到DMT系统",
> "lifeCycle":"phase",
> "sync":true,
> "childList":[
> {
> "id":11,
> "parentId":10,
> "lineNum":27,
> "method":"BaseGenerateCodeServiceImpl.generateNextCode",
> "event":"生成用户编码",
> "lifeCycle":"step",
> "sync":true
> }
> ]
> },
> {
> "id":12,
> "parentId":0,
> "lineNum":27,
> "method":"BaseUserTokenServiceImpl.saveNewToken",
> "event":"保存新token",
> "lifeCycle":"phase",
> "sync":true
> }
> ]
> }
> ```
>
>
>
>
================================================
FILE: _docs/fish_mysql.sql
================================================
/*
Navicat Premium Data Transfer
Target Server Type : MySQL
Target Server Version : 50628
File Encoding : 65001
Date: 27/07/2020 22:22:43
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for base_generate_code
-- ----------------------------
DROP TABLE IF EXISTS `base_generate_code`;
CREATE TABLE `base_generate_code` (
`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称',
`target_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '目标',
`strategy` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生成策略:自增策略auto_increment',
`prefix` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '前缀',
`suffix` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '后缀',
`current_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '生成的下一个号码',
`start_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '开始的号码',
`max_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '最大的值',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
`version` int(11) NOT NULL DEFAULT 1 COMMENT '版本'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '编码生成规则' ROW_FORMAT = Compact;
-- ----------------------------
-- Records of base_generate_code
-- ----------------------------
INSERT INTO `base_generate_code` VALUES ('1', '大套餐-活动配置编码', 'BIG-PACKAGE-ACTIVITY-CONFIG', 'com.mcoding.modular.generatecode.strategy.DateIncrementStrategy', NULL, NULL, '202007210000001', '2020020900001', '9999999', '2020-02-09 12:39:47', '2020-02-09 12:39:51', 157);
INSERT INTO `base_generate_code` VALUES ('2', '大套餐-活动订单编码', 'BIG-PACKAGE-ACTIVITY-ORDER', 'com.mcoding.modular.generatecode.strategy.DateIncrementStrategy', NULL, NULL, '202007270000001', '2020020900001', '9999999', '2020-02-09 12:39:47', '2020-02-09 12:39:51', 317);
-- ----------------------------
-- Table structure for base_user
-- ----------------------------
DROP TABLE IF EXISTS `base_user`;
CREATE TABLE `base_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
`openId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'openId',
`unionId` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'unionId',
`mobile_number` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号码',
`nick_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称',
`user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名称',
`user_status` int(11) NOT NULL DEFAULT 0 COMMENT '用户状态,1为正常,2为冻结',
`avatar_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像',
`gender` int(11) NULL DEFAULT NULL COMMENT '性别 0:未知、1:男、2:女',
`province` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '省份',
`city` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '城市',
`country` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '区域',
`dealer_id` int(11) NULL DEFAULT NULL COMMENT '经销商ID',
`dealer_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '经销商编码',
`dealer_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '经销商名称',
`store_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '门店ID',
`store_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '门店编码',
`store_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '门店名称',
`binding_time` datetime(0) NULL DEFAULT NULL COMMENT '绑定时间',
`binding_status` int(11) NULL DEFAULT 0 COMMENT '绑定状态,0为未绑定,1为已绑定',
`order_quantity` int(11) NULL DEFAULT 0 COMMENT '产生订单数',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`version` int(11) NOT NULL DEFAULT 1 COMMENT '版本',
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否删除,0为否,1为是',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '基础用户' ROW_FORMAT = Compact;
-- ----------------------------
-- Records of base_user
-- ----------------------------
INSERT INTO `base_user` VALUES (2, 'oLrji5KPgx-4V_WFMcqX5D3c8fgs', NULL, '13800000001', '東', NULL, 0, 'https://wx.qlogo.cn/mmopen/vi_32/v6pQJTnBcricplYxWPgpKhWBGTFLSQTxmKzN9ADFdB8IFDPXRvGQzB2ccutEj3Bt7qyVUpe08b7Aqp8Skb2wUqw/132', 1, 'Guangdong', 'Guangzhou', 'China', 100278, 'JXS00071', '燕塘养猪场', '2c8f89d56c74fbfd016c752b7e5e0004', 'S0000011016', '西门烤鱼', NULL, 1, 0, '2020-04-15 10:49:18', '2020-07-23 14:47:10', 1, 0);
INSERT INTO `base_user` VALUES (3, 'ofind4vDz5-NVXMOUFcdW1jKi5bI', NULL, '13800000000', 'tomcatuw', NULL, 0, 'https://sdfsdf', 1, 'guangdong', 'guangzhou', 'tianhe', 195, 'lgx-000012', NULL, '', '', '', NULL, 0, 0, '2020-04-20 17:38:14', '2020-07-13 17:01:27', 1, 0);
-- ----------------------------
-- Table structure for base_user_token
-- ----------------------------
DROP TABLE IF EXISTS `base_user_token`;
CREATE TABLE `base_user_token` (
`user_id` int(11) NOT NULL COMMENT '用户ID',
`auth_token` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '授权token',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`version` int(11) NOT NULL DEFAULT 1 COMMENT '版本',
`deleted` int(11) NOT NULL DEFAULT 0 COMMENT '是否删除,0为否,1为是',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户授权token' ROW_FORMAT = Compact;
-- ----------------------------
-- Records of base_user_token
-- ----------------------------
INSERT INTO `base_user_token` VALUES (2, '8krl9N2IzOWRkNmQ3ZGM5NGM1NDlhZmM4M2Y5YTc1NTI2N2E=', '2020-07-21 00:26:28', '2020-07-27 15:53:18', 1, 0);
INSERT INTO `base_user_token` VALUES (5, 'y953fZDc1NGU2ZmIyZDAxNGQyN2FjNDkxN2I4MTk5ZGQ0YWY=', '2020-07-21 00:31:36', '2020-07-27 18:04:32', 1, 0);
-- ----------------------------
-- Table structure for sys_user
-- ----------------------------
DROP TABLE IF EXISTS `sys_user`;
CREATE TABLE `sys_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '头像',
`account` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '账号',
`password` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密码',
`salt` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'md5密码盐',
`name` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名字',
`birthday` datetime(0) NULL DEFAULT NULL COMMENT '生日',
`sex` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别(字典)',
`email` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电子邮件',
`phone` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电话',
`role_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '角色id(多个逗号隔开)',
`dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门id(多个逗号隔开)',
`status` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态(字典)',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`create_user` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
`update_user` bigint(20) NULL DEFAULT NULL COMMENT '更新人',
`version` int(11) NULL DEFAULT NULL COMMENT '乐观锁',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '管理员表' ROW_FORMAT = Compact;
-- ----------------------------
-- Records of sys_user
-- ----------------------------
INSERT INTO `sys_user` VALUES (1, '1124606971782160385', 'admin', '123456', 'abcdef', 'admin', '2018-11-16 00:00:00', 'M', 'sn93@qq.com', '18200000000', '1', 25, 'ENABLE', '2016-01-29 08:49:53', NULL, '2019-06-28 14:38:19', 24, 25);
SET FOREIGN_KEY_CHECKS = 1;
================================================
FILE: applet/pom.xml
================================================
<?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">
<parent>
<groupId>com.mcoding</groupId>
<artifactId>tropical_fish</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>applet</artifactId>
<version>${parent.version}</version>
<packaging>jar</packaging>
<name>applet</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.mcoding</groupId>
<artifactId>base-core</artifactId>
</dependency>
<dependency>
<groupId>com.mcoding</groupId>
<artifactId>biz-component</artifactId>
</dependency>
<dependency>
<groupId>com.mcoding</groupId>
<artifactId>biz-user</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>applet</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
================================================
FILE: applet/src/main/java/com/mcoding/applet/AppletApplication.java
================================================
package com.mcoding.applet;
import org.redisson.spring.session.config.EnableRedissonHttpSession;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan;
@EnableRedissonHttpSession
@EnableCaching
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.mcoding"})
public class AppletApplication {
public static void main(String[] args) {
SpringApplication.run(AppletApplication.class, args);
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/AppAuthController.java
================================================
package com.mcoding.applet.auth;
import com.alibaba.fastjson.JSON;
import com.mcoding.applet.auth.dto.CreateUserDto;
import com.mcoding.applet.auth.dto.RegisterDto;
import com.mcoding.base.core.doc.Process;
import com.mcoding.base.core.rest.ResponseResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* <p>
* 基础用户
* </p>
*
* @author wzt
* @since 2020-03-25
*/
@Slf4j
@Api(tags = "业务基础-APP授权服务")
@RestController
public class AppAuthController {
@Process(comment = "IOS用户注册")
@ApiOperation("IOS用户注册")
@PostMapping("/service/app/appuser/register")
public ResponseResult<RegisterDto> register(@Valid @RequestBody CreateUserDto createUserDto) {
log.info("EVENT=小程序用户注册|USER_INFO={}", JSON.toJSONString(createUserDto));
return ResponseResult.success(new RegisterDto());
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/WechatAuthController.java
================================================
package com.mcoding.applet.auth;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSON;
import com.mcoding.applet.auth.business.RegisterBo;
import com.mcoding.applet.auth.business.UserInfoBo;
import com.mcoding.applet.auth.service.BaseUserTokenService;
import com.mcoding.applet.auth.service.WechatAuthService;
import com.mcoding.applet.auth.manager.WechatClient;
import com.mcoding.applet.auth.util.LoginUserUtils;
import com.mcoding.applet.auth.dto.CreateUserDto;
import com.mcoding.applet.auth.dto.PhoneNumberDto;
import com.mcoding.applet.auth.dto.RegisterDto;
import com.mcoding.base.common.util.bean.BeanMapperUtils;
import com.mcoding.base.common.util.wechat.WXBizDataCrypt;
import com.mcoding.base.common.util.wechat.WxUserInfo;
import com.mcoding.base.core.doc.Process;
import com.mcoding.base.core.rest.ResponseCode;
import com.mcoding.base.core.rest.ResponseResult;
import com.mcoding.base.user.entity.BaseUser;
import com.mcoding.base.user.service.BaseUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
/**
* <p>
* 基础用户
* </p>
*
* @author wzt
* @since 2020-03-25
*/
@Slf4j
@Api(tags = "业务基础-微信授权服务")
@RestController
public class WechatAuthController {
@Resource
private WechatClient wechatClient;
@Resource
private WechatAuthService wechatAuthService;
@Resource
private BaseUserService baseUserService;
@Resource
private BaseUserTokenService baseUserTokenService;
@ApiOperation("小程序获取用户手机号码")
@GetMapping("/service/app/wxuser/getPhoneNumber")
public ResponseResult<PhoneNumberDto> getPhoneNumber(@ApiParam("加密数据") @RequestParam String encryptedData,
@ApiParam("加密算法的初始向量") @RequestParam String iv) {
String sessionKey = LoginUserUtils.getSessionKey();
log.info("EVENT=小程序获取用户手机号码|encryptedData={}|iv={}|sessionKey={}", encryptedData, iv, sessionKey);
WxUserInfo userInfo = WXBizDataCrypt.decrypt(encryptedData, sessionKey, iv);
String phoneNumber = userInfo.getPhoneNumber();
return ResponseResult.success(new PhoneNumberDto(phoneNumber));
}
@Process(comment = "小程序用户注册")
@ApiOperation("小程序用户注册")
@PostMapping("/service/app/wxuser/register")
public ResponseResult<RegisterDto> register(@Valid @RequestBody CreateUserDto createUserDto) {
log.info("EVENT=小程序用户注册|USER_INFO={}", JSON.toJSONString(createUserDto));
String jsCode = createUserDto.getJsCode();
UserInfoBo userInfoBo = this.wechatClient.getUserInfoByCode(jsCode);
String openId = userInfoBo.getOpenId();
BaseUser persistenceUser = this.baseUserService.getUserByOpenId(openId);
if (persistenceUser != null) {
String authToken = this.baseUserTokenService.getToken(persistenceUser.getId());
// 当前用户已有授权token,则失效该token
if (StringUtils.isNotEmpty(authToken)) {
this.wechatAuthService.invalidUserToken(authToken);
}
}
String newToken = IdUtil.simpleUUID();
RegisterBo registerBo = this.wechatAuthService.register(persistenceUser, createUserDto, userInfoBo, newToken);
// 记录当前用户Token
this.baseUserTokenService.saveNewToken(registerBo.getUserId(), newToken);
return ResponseResult.success(BeanMapperUtils.map(registerBo, RegisterDto.class));
}
@Process(comment = "小程序用户登录")
@ApiOperation("小程序用户登录")
@PostMapping("/service/app/wxuser/loginByJsCode")
public ResponseResult<RegisterDto> loginByJsCode(@ApiParam("JsCode") @RequestParam String jsCode) {
log.info("EVENT=小程序用户登录|JS_CODE={}", jsCode);
UserInfoBo userInfoBo = this.wechatClient.getUserInfoByCode(jsCode);
String openId = userInfoBo.getOpenId();
BaseUser persistenceUser = this.baseUserService.getUserByOpenId(openId);
if (persistenceUser == null) {
return ResponseResult.fail(ResponseCode.User_Not_Found, "用户还未注册,请先注册");
}
String authToken = this.baseUserTokenService.getToken(persistenceUser.getId());
// 当前用户已有授权token,则失效该token
if (StringUtils.isNotEmpty(authToken)) {
this.wechatAuthService.invalidUserToken(authToken);
}
String newToken = IdUtil.simpleUUID();
RegisterBo registerBo = this.wechatAuthService.login(persistenceUser, userInfoBo, newToken);
// 记录当前用户Token
this.baseUserTokenService.saveNewToken(registerBo.getUserId(), newToken);
return ResponseResult.success(BeanMapperUtils.map(registerBo, RegisterDto.class));
}
@ApiOperation("获取测试token[后端测试使用]")
@PostMapping("/service/app/wxuser/login")
public ResponseResult<RegisterDto> login(@RequestParam("openId") String openId) {
String token = IdUtil.simpleUUID();
RegisterBo registerBo = this.wechatAuthService.login(openId, token);
return ResponseResult.success(BeanMapperUtils.map(registerBo, RegisterDto.class));
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/base/LoginRequired.java
================================================
package com.mcoding.applet.auth.base;
import java.lang.annotation.*;
/**
* @author wzt on 2020/6/13.
* @version 1.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@Documented
public @interface LoginRequired {
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/base/LoginRequiredArgumentResolver.java
================================================
package com.mcoding.applet.auth.base;
import com.mcoding.applet.auth.util.LoginUserUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
/**
* @author wzt on 2020/6/13.
* @version 1.0
*/
@Slf4j
public class LoginRequiredArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//匹配参数上具有@LoginRequired注解的参数
return methodParameter.hasParameterAnnotation(LoginRequired.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) {
return LoginUserUtils.getRegisterBo();
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/base/config/AuthConfig.java
================================================
package com.mcoding.applet.auth.base.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author wzt on 2019/11/13.
* @version 1.0
*/
@Configuration
public class AuthConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
//排除拦截
.excludePathPatterns("/service/app/wxuser/login")
.excludePathPatterns("/service/app/wxuser/register")
.excludePathPatterns("/service/app/wxuser/loginByJsCode")
.excludePathPatterns("/druid/**")
.excludePathPatterns("/javasimon/**")
.excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**")
.addPathPatterns("/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/templates/**.js").addResourceLocations("classpath:/templates/");
registry.addResourceHandler("/templates/**.css").addResourceLocations("classpath:/templates/");
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/base/config/AuthInterceptor.java
================================================
package com.mcoding.applet.auth.base.config;
import com.alibaba.fastjson.JSON;
import com.mcoding.applet.auth.business.RegisterBo;
import com.mcoding.applet.auth.service.WechatAuthService;
import com.mcoding.applet.auth.util.LoginUserUtils;
import com.mcoding.base.core.rest.ResponseCode;
import com.mcoding.base.core.rest.ResponseResult;
import com.mcoding.base.core.spring.SpringContextHolder;
import groovy.util.logging.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
* @author wzt on 2019/11/13.
* @version 1.0
*/
@Slf4j
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
if (StringUtils.isBlank(token)) {
this.write(response, ResponseResult.fail(ResponseCode.UNAUTHORIZED, "HTTP HEADER 携带的token不能为空"));
return false;
}
WechatAuthService wechatAuthService = SpringContextHolder.getOneBean(WechatAuthService.class);
RegisterBo registerBo = wechatAuthService.getUserToken(token);
if (registerBo == null) {
this.write(response, ResponseResult.fail(ResponseCode.UNAUTHORIZED, "token已失效,请重新授权登录认证"));
return false;
}
// 绑定当前线程对应的用户
LoginUserUtils.binding(registerBo);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 情况当前线程的绑定用户信息
LoginUserUtils.remove();
}
private void write(HttpServletResponse response, ResponseResult<String> responseResult) throws Exception {
response.setContentType("application/json;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write(JSON.toJSONString(responseResult));
writer.flush();
writer.close();
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/base/config/LoginRequiredConfig.java
================================================
package com.mcoding.applet.auth.base.config;
import com.mcoding.applet.auth.base.LoginRequiredArgumentResolver;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
* @author wzt on 2020/6/13.
* @version 1.0
*/
@Component
public class LoginRequiredConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List resolvers) {
resolvers.add(new LoginRequiredArgumentResolver());
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/business/RegisterBo.java
================================================
package com.mcoding.applet.auth.business;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author wzt on 2020/3/25.
* @version 1.0
*/
@ApiModel("注册用户信息")
@Data
public class RegisterBo implements Serializable {
@ApiModelProperty("服务端分配token")
private String token;
@ApiModelProperty("sessionKey")
private String sessionKey;
@ApiModelProperty("用户ID")
private Integer userId;
@ApiModelProperty("用户昵称")
private String nickName;
@ApiModelProperty("门店ID")
private String storeId;
@ApiModelProperty("门店编码")
private String storeCode;
@ApiModelProperty("门店名称")
private String storeName;
@ApiModelProperty("经销商ID")
private Integer dealerId;
@ApiModelProperty("经销商编码")
private String dealerCode;
@ApiModelProperty("经销商名称")
private String dealerName;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/business/UserInfoBo.java
================================================
package com.mcoding.applet.auth.business;
import lombok.Data;
/**
* @author wzt on 2019/11/12.
* @version 1.0
*/
@Data
public class UserInfoBo {
private String sessionKey;
private String openId;
private String unionid;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/business/resp/AccessTokenRespEntity.java
================================================
package com.mcoding.applet.auth.business.resp;
import lombok.Data;
/**
* @author wzt on 2020/3/25.
* @version 1.0
*/
@Data
public class AccessTokenRespEntity {
private String access_token;
private Long expires_in;
private String errcode;
private String errmsg;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/business/resp/JsCode2SessionRespEntity.java
================================================
package com.mcoding.applet.auth.business.resp;
import lombok.Data;
/**
* @author wzt on 2020/3/25.
* @version 1.0
*/
@Data
public class JsCode2SessionRespEntity {
private String session_key;
private String openid;
private String unionid;
private String errcode;
private String errmsg;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/business/resp/WxCodeUnlimitedResponse.java
================================================
package com.mcoding.applet.auth.business.resp;
import lombok.Data;
/**
* @author wzt on 2020/3/26.
* @version 1.0
*/
@Data
public class WxCodeUnlimitedResponse {
/**
* 请求失败错误码
*/
private String errcode;
/**
* 请求失败错误信息
*/
private String errmsg;
/**
* 图片信息
*/
private byte[] buffer;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/dao/BaseUserTokenMapper.java
================================================
package com.mcoding.applet.auth.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mcoding.applet.auth.entity.BaseUserToken;
/**
* <p>
* 用户授权token Mapper 接口
* </p>
*
* @author wzt
* @since 2020-04-20
*/
public interface BaseUserTokenMapper extends BaseMapper<BaseUserToken> {
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/dto/BindingStoreDto.java
================================================
package com.mcoding.applet.auth.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author wzt on 2020/3/30.
* @version 1.0
*/
@Data
public class BindingStoreDto {
@ApiModelProperty("门店ID")
private String storeId;
@ApiModelProperty("门店编码")
private String storeCode;
@ApiModelProperty("门店名称")
private String storeName;
@ApiModelProperty("联系人")
private String contactMan;
@ApiModelProperty("手机号码")
private String mobileNumber;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/dto/CreateUserDto.java
================================================
package com.mcoding.applet.auth.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author wzt on 2020/3/25.
* @version 1.0
*/
@Data
public class CreateUserDto {
@ApiModelProperty(value = "微信jscode")
@NotNull(message = "微信jscode不能为空")
private String jsCode;
@ApiModelProperty(value = "经销商ID")
@NotNull(message = "经销商ID不能为空")
private String dealerId;
@ApiModelProperty(value = "经销商编码")
@NotNull(message = "经销商编码不能为空")
private String dealerCode;
@ApiModelProperty(value = "经销商名称")
private String dealerName;
@ApiModelProperty(value = "手机号码")
private String mobileNumber;
@NotNull(message = "昵称不能为空")
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "头像")
private String avatarUrl;
@ApiModelProperty(value = "性别 0:未知、1:男、2:女")
private Integer gender;
@ApiModelProperty(value = "省份")
private String province;
@ApiModelProperty(value = "城市")
private String city;
@ApiModelProperty(value = "区域")
private String country;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/dto/PhoneNumberDto.java
================================================
package com.mcoding.applet.auth.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* @author wzt on 2020/4/15.
* @version 1.0
*/
@AllArgsConstructor
@Data
public class PhoneNumberDto {
private String phoneNumber;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/dto/RegisterDto.java
================================================
package com.mcoding.applet.auth.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author wzt on 2020/3/25.
* @version 1.0
*/
@ApiModel("注册用户信息")
@Data
public class RegisterDto implements Serializable {
@ApiModelProperty("服务端分配token")
private String token;
@ApiModelProperty("用户ID")
private Integer userId;
@ApiModelProperty("用户昵称")
private String nickName;
@ApiModelProperty("门店ID")
private String storeId;
@ApiModelProperty("门店编码")
private String storeCode;
@ApiModelProperty("门店名称")
private String storeName;
@ApiModelProperty("经销商ID")
private Integer dealerId;
@ApiModelProperty("经销商编码")
private String dealerCode;
@ApiModelProperty("经销商名称")
private String dealerName;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/entity/BaseUserToken.java
================================================
package com.mcoding.applet.auth.entity;
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 lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 用户授权token
* </p>
*
* @author wzt
* @since 2020-04-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("base_user_token")
@ApiModel(value="BaseUserToken", description="用户授权token")
public class BaseUserToken implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户ID")
@TableId("user_id")
private Integer userId;
@ApiModelProperty(value = "授权token")
@TableField("auth_token")
private String authToken;
@ApiModelProperty(value = "创建时间")
@TableField("create_time")
private Date createTime;
@ApiModelProperty(value = "更新时间")
@TableField("update_time")
private Date updateTime;
@ApiModelProperty(value = "版本")
@TableField("version")
private Integer version;
@ApiModelProperty(value = "是否删除,0为否,1为是")
@TableField("deleted")
private Integer deleted;
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/manager/WechatClient.java
================================================
package com.mcoding.applet.auth.manager;
import com.mcoding.applet.auth.business.UserInfoBo;
/**
* @author wzt on 2019/11/12.
* @version 1.0
*/
public interface WechatClient {
/**
* 根据jsCode获取用户信息
*
* @param code
* @return
*/
UserInfoBo getUserInfoByCode(String code);
/**
* 获取小程序全局唯一后台接口调用凭据
*
* @return
*/
String getAccessToken();
/**
* 失效小程序全局唯一后台接口调用凭据
*
* @return
*/
String evictAccessToken();
/**
* 获取小程序二维码
*
* @param accessToken
* @param page
* @param scene
* @param width
* @return
*/
byte[] getwxacode(String accessToken, String page, String scene, int width);
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/manager/impl/WechatClientImpl.java
================================================
package com.mcoding.applet.auth.manager.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.mcoding.applet.auth.business.UserInfoBo;
import com.mcoding.applet.auth.business.resp.AccessTokenRespEntity;
import com.mcoding.applet.auth.business.resp.JsCode2SessionRespEntity;
import com.mcoding.applet.auth.manager.WechatClient;
import com.mcoding.base.common.exception.CommonException;
import com.mcoding.base.core.cache.RCacheEvict;
import com.mcoding.base.core.cache.RCacheable;
import com.mcoding.base.core.doc.Phase;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @author wzt on 2019/11/12.
* @version 1.0
*/
@Slf4j
@Service
public class WechatClientImpl implements WechatClient {
@Resource
private RestTemplate restTemplate;
@Value("${wechat.appid}")
private String appID;
@Value("${wechat.secret}")
private String appSecret;
@Phase(comment = "根据jscode获取用户信息")
@Override
public UserInfoBo getUserInfoByCode(String code) {
String requestUrl = this.buildJscode2sessionUrl(code);
ResponseEntity<String> responseEntity = restTemplate.getForEntity(requestUrl, String.class);
log.info("EVENT=根据code获取用户信息|request_url={}|response_result={}", requestUrl, responseEntity);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
JsCode2SessionRespEntity body = JSON.parseObject(responseEntity.getBody(), JsCode2SessionRespEntity.class);
if (StringUtils.isNotBlank(body.getSession_key())) {
UserInfoBo userInfoBo = new UserInfoBo();
userInfoBo.setSessionKey(body.getSession_key());
userInfoBo.setOpenId(body.getOpenid());
userInfoBo.setUnionid(body.getUnionid());
return userInfoBo;
}
throw new CommonException(body.getErrmsg());
}
throw new CommonException("调用微信接口异常");
}
@Phase(comment = "获取小程序access_token")
@RCacheable(key = "dmt::wechat::global::AccessToken", ttl = 7000, timeUnit = TimeUnit.SECONDS,
resetTTL = false, serial = true)
@Override
public String getAccessToken() {
String requestUrl = this.buildAccessTokenUrl();
ResponseEntity<String> responseEntity = this.restTemplate.getForEntity(requestUrl, String.class);
log.info("EVENT=获取微信小程序access_token|request_url={}|response_result={}", requestUrl, responseEntity);
if (responseEntity.getStatusCode().is2xxSuccessful()) {
AccessTokenRespEntity body = JSON.parseObject(responseEntity.getBody(), AccessTokenRespEntity.class);
return body.getAccess_token();
}
throw new CommonException("调用微信接口异常");
}
@RCacheEvict(key = "dmt::wechat::global::AccessToken")
@Override
public String evictAccessToken() {
return null;
}
@Phase(comment = "调用微信服务,生成二维码字节流")
@Override
public byte[] getwxacode(String accessToken, String page, String scene, int width) {
String requestUrl = this.buildGetwxacodeUrl(accessToken);
Map<String, Object> params = Maps.newHashMap();
params.put("scene", scene);
params.put("width", width);
if (StringUtils.isNotBlank(page)) {
params.put("page", page);
}
log.info("EVENT=调用微信服务,生成二维码字节流|REQUEST_PARAM={}", JSON.toJSONString(params));
byte[] byteArray = null;
ResponseEntity<byte[]> entity = restTemplate.postForEntity(requestUrl, JSON.toJSONString(params), byte[].class);
// 图片或错误信息
byteArray = entity.getBody();
String wxReturnStr = new String(byteArray);
if (wxReturnStr.indexOf("errcode") != -1) {
JSONObject json = JSONObject.parseObject(wxReturnStr);
String errcode = json.get("errcode").toString();
String errmsg = json.get("errmsg").toString();
throw new CommonException(errcode + errmsg);
}
return byteArray;
}
private String buildGetwxacodeUrl(String accessToken) {
return String.format("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=%s", accessToken);
}
private String buildAccessTokenUrl() {
return String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",
appID, appSecret);
}
private String buildJscode2sessionUrl(String jsCode) {
return String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%1$s&secret=%2$s&js_code=%3$s&grant_type=authorization_code",
appID, appSecret, jsCode);
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/service/BaseUserTokenService.java
================================================
package com.mcoding.applet.auth.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mcoding.applet.auth.entity.BaseUserToken;
/**
* <p>
* 用户授权token 服务类
* </p>
*
* @author wzt
* @since 2020-04-20
*/
public interface BaseUserTokenService extends IService<BaseUserToken> {
/**
* 保存新token
* @param userId
* @param newToken
*/
void saveNewToken(int userId, String newToken);
/**
* 查询token
* @param userId
* @return
*/
String getToken(int userId);
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/service/WechatAuthService.java
================================================
package com.mcoding.applet.auth.service;
import com.mcoding.applet.auth.business.RegisterBo;
import com.mcoding.applet.auth.business.UserInfoBo;
import com.mcoding.applet.auth.dto.CreateUserDto;
import com.mcoding.base.user.entity.BaseUser;
/**
* @author wzt on 2020/3/25.
* @version 1.0
*/
public interface WechatAuthService {
/**
* 创建用户
*
* @param createUserDto
* @param userInfoBo
* @param token
*/
RegisterBo register(BaseUser currentUser, CreateUserDto createUserDto, UserInfoBo userInfoBo, String token);
/**
* 登录
*
* @param persistenceUser
* @param userInfoBo
* @param token
* @return
*/
RegisterBo login(BaseUser persistenceUser, UserInfoBo userInfoBo, String token);
/**
* 根据openId登录
*
* @param openId
*/
RegisterBo login(String openId, String token);
/**
* 查询当前用户token
*
* @param token
* @return
*/
RegisterBo getUserToken(String token);
/**
* 失效用户token
*
* @param token
*/
void invalidUserToken(String token);
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/service/impl/BaseUserTokenServiceImpl.java
================================================
package com.mcoding.applet.auth.service.impl;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mcoding.applet.auth.dao.BaseUserTokenMapper;
import com.mcoding.applet.auth.entity.BaseUserToken;
import com.mcoding.applet.auth.service.BaseUserTokenService;
import com.mcoding.base.core.doc.Phase;
import jodd.util.Base64;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Optional;
/**
* <p>
* 用户授权token 服务实现类
* </p>
*
* @author wzt
* @since 2020-04-20
*/
@Slf4j
@Service
public class BaseUserTokenServiceImpl extends ServiceImpl<BaseUserTokenMapper, BaseUserToken> implements BaseUserTokenService {
@Phase(comment = "保存新token")
@Override
public void saveNewToken(int userId, String newToken) {
BaseUserToken tokenEntity = new BaseUserToken();
tokenEntity.setUserId(userId);
String fake = RandomUtil.randomString(5);
String encryptToken = Base64.encodeToString(newToken);
tokenEntity.setAuthToken(fake + encryptToken);
BaseUserToken baseUserToken = this.getById(userId);
if (baseUserToken == null) {
tokenEntity.setCreateTime(new Date());
this.save(tokenEntity);
} else {
this.updateById(tokenEntity);
}
}
@Override
public String getToken(int userId) {
BaseUserToken baseUserToken = this.getById(userId);
String encryptToken = Optional.ofNullable(baseUserToken).map(BaseUserToken::getAuthToken).orElse("");
if (StringUtils.isEmpty(encryptToken)) {
return null;
}
String base64Token = StrUtil.sub(encryptToken, 5, encryptToken.length());
return Base64.decodeToString(base64Token);
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/service/impl/WechatAuthServiceImpl.java
================================================
package com.mcoding.applet.auth.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mcoding.applet.auth.business.RegisterBo;
import com.mcoding.applet.auth.business.UserInfoBo;
import com.mcoding.applet.auth.dto.CreateUserDto;
import com.mcoding.applet.auth.service.WechatAuthService;
import com.mcoding.base.common.util.bean.BeanMapperUtils;
import com.mcoding.base.core.cache.RCacheEvict;
import com.mcoding.base.core.cache.RCacheable;
import com.mcoding.base.core.doc.Phase;
import com.mcoding.base.user.entity.BaseUser;
import com.mcoding.base.user.service.BaseUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* 小程序用户服务
*
* @author wzt on 2020/3/25.
* @version 1.0
*/
@Service
public class WechatAuthServiceImpl implements WechatAuthService {
@Resource
private BaseUserService baseUserService;
@Phase(comment = "注册用户到DMT系统")
@RCacheable(key = "dmt::miniprogram::token", secKey = "#token", ttl = 1, timeUnit = TimeUnit.DAYS)
@Override
public RegisterBo register(BaseUser persistenceUser, CreateUserDto createUserDto, UserInfoBo userInfoBo, String token) {
RegisterBo registerBo;
if (persistenceUser == null) {
// 当前用户还未入库,则先入库
BaseUser baseUser = BeanMapperUtils.map(createUserDto, BaseUser.class);
baseUser.setOpenId(userInfoBo.getOpenId());
baseUser.setUnionId(userInfoBo.getUnionid());
baseUser.setCreateTime(new Date());
baseUserService.save(baseUser);
registerBo = BeanMapperUtils.map(baseUser, RegisterBo.class);
registerBo.setUserId(baseUser.getId());
registerBo.setSessionKey(userInfoBo.getSessionKey());
registerBo.setToken(token);
} else {
registerBo = BeanMapperUtils.map(persistenceUser, RegisterBo.class);
registerBo.setUserId(persistenceUser.getId());
registerBo.setSessionKey(userInfoBo.getSessionKey());
registerBo.setToken(token);
}
return registerBo;
}
@Phase(comment = "用户登录DMT系统")
@RCacheable(key = "dmt::miniprogram::token", secKey = "#token", ttl = 1, timeUnit = TimeUnit.DAYS)
@Override
public RegisterBo login(BaseUser persistenceUser, UserInfoBo userInfoBo, String token) {
RegisterBo registerBo = BeanMapperUtils.map(persistenceUser, RegisterBo.class);
registerBo.setUserId(persistenceUser.getId());
registerBo.setSessionKey(userInfoBo.getSessionKey());
registerBo.setToken(token);
return registerBo;
}
@RCacheable(key = "dmt::miniprogram::token", secKey = "#token", ttl = 2, timeUnit = TimeUnit.HOURS)
@Override
public RegisterBo login(String openId, String token) {
QueryWrapper<BaseUser> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(BaseUser::getOpenId, openId);
BaseUser currentUser = baseUserService.getOne(queryWrapper);
RegisterBo registerBo = BeanMapperUtils.map(currentUser, RegisterBo.class);
registerBo.setUserId(currentUser.getId());
registerBo.setToken(token);
return registerBo;
}
@RCacheable(key = "dmt::miniprogram::token", secKey = "#token", resetTTL = false)
@Override
public RegisterBo getUserToken(String token) {
return null;
}
@Phase(comment = "失效用户token")
@RCacheEvict(key = "dmt::miniprogram::token", secKey = "#token")
@Override
public void invalidUserToken(String token) {
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/auth/util/LoginUserUtils.java
================================================
package com.mcoding.applet.auth.util;
import com.mcoding.applet.auth.business.RegisterBo;
/**
* @author wzt on 2019/11/13.
* @version 1.0
*/
public class LoginUserUtils {
private static ThreadLocal<RegisterBo> threadLocal = new ThreadLocal<>();
public static void binding(RegisterBo registerBo) {
threadLocal.set(registerBo);
}
public static RegisterBo getRegisterBo() {
return threadLocal.get();
}
public static Integer getUserId() {
return getRegisterBo().getUserId();
}
public static String getToken() {
return getRegisterBo().getToken();
}
public static String getSessionKey() {
return getRegisterBo().getSessionKey();
}
public static void remove() {
threadLocal.remove();
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/order/component/ActivityCodeController.java
================================================
package com.mcoding.applet.order.component;
import com.alibaba.fastjson.JSON;
import com.mcoding.base.core.rest.ResponseResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.javasimon.aop.Monitored;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
;
/**
* @author wzt on 2020/2/9.
* @version 1.0
*/
@Slf4j
@Api(tags = "业务-活动订单服务")
@RestController
public class ActivityCodeController {
@Resource
private ActivityOrderBizCodeGenerator tradeOrderBizCodeGenerator;
@Monitored
@ApiOperation("生成订单活动编码")
@PostMapping("/service/activityorder/generateBizCode")
public ResponseResult<Integer> generateBizCode(@RequestParam int quantity) {
List<String> codeList = IntStream.rangeClosed(1, quantity)
.parallel()
.mapToObj(num -> tradeOrderBizCodeGenerator.generateNextCode())
.sorted()
.collect(Collectors.toList());
log.info("biz code List = {}", JSON.toJSONString(codeList));
return ResponseResult.success(codeList.size());
}
@Monitored
@ApiOperation("批量生成订单活动编码")
@PostMapping("/service/activityorder/generateBizCodeList")
public ResponseResult<Integer> generateBizCodeList(@RequestParam int quantity) {
List<String> codeList = this.tradeOrderBizCodeGenerator.generateBizCodeList(quantity);
log.info("biz code List = {}", JSON.toJSONString(codeList));
return ResponseResult.success(codeList.size());
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/order/component/ActivityOrderBizCodeGenerator.java
================================================
package com.mcoding.applet.order.component;
import com.google.common.collect.Range;
import com.mcoding.base.common.exception.BizException;
import com.mcoding.base.component.generatecode.domain.CommonBizCodeGenerator;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author wzt on 2020/6/26.
* @version 1.0
*/
@Component
public class ActivityOrderBizCodeGenerator extends CommonBizCodeGenerator {
public ActivityOrderBizCodeGenerator() {
this.setTargetCode(TargetCodeEnum.BIG_PACKAGE_ACTIVITY_ORDER.getTargetCode());
this.setCacheQuantity(100);
}
@Override
public String generateNextCode() {
return super.generateNextCode();
}
@Override
public List<String> generateBizCodeList(int quantity) {
if (!Range.closed(1, 5000).contains(quantity)) {
throw new BizException("批量生成的数量必须在1 到 5000 之间");
}
return super.generateBizCodeList(quantity);
}
}
================================================
FILE: applet/src/main/java/com/mcoding/applet/order/component/TargetCodeEnum.java
================================================
package com.mcoding.applet.order.component;
/**
* @author wzt on 2020/2/9.
* @version 1.0
*/
public enum TargetCodeEnum {
BIG_PACKAGE_ACTIVITY_ORDER("BIG-PACKAGE-ACTIVITY-ORDER", "大套餐-活动订单编码");
private String targetCode;
private String desc;
TargetCodeEnum(String targetCode, String desc) {
this.targetCode = targetCode;
this.desc = desc;
}
public String getTargetCode() {
return targetCode;
}
public String getDesc() {
return desc;
}
}
================================================
FILE: applet/src/main/resources/application-dev.properties
================================================
spring.datasource.druid.url=jdbc:mysql://47.95.192.230:3306/mcoding?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
spring.datasource.druid.username=root
spring.datasource.druid.password=root
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.connection-init-sqls=set names utf8mb4
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.druid.filters=stat,wall,slf4j
spring.datasource.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.allow=
spring.datasource.druid.stat-view-servlet.deny=
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=druid#123456
spring.redis.redisson.config=classpath:prop/redisson-dev.yaml
spring.session.store-type=redis
spring.session.timeout.seconds=900
wechat.appid=wxbf9d7e5f7c669528
wechat.secret=1582d57e2b63ea23b564839d835ca314
elasticsearch.clusterNodes=127.0.0.1:9200
================================================
FILE: applet/src/main/resources/application-prd.properties
================================================
================================================
FILE: applet/src/main/resources/application.properties
================================================
spring.application.name=applet-api
server.port=8086
server.servlet.context-path=/applet-api
spring.profiles.active=dev
spring.mvc.servlet.load-on-startup=1
spring.main.allow-bean-definition-overriding=true
spring.jackson.serialization.write-dates-as-timestamps: true
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis-plus.configuration.log-impl=com.mcoding.base.core.log.MybatisLogImpl
#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
================================================
FILE: applet/src/main/resources/logback-spring.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="/logs/applet/logs" />
<property name="CONSOLE_LOG_PATTERN" value="%white(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight([%X{traceID}]) %highlight(%-5level) %boldMagenta(%logger{10}) - %cyan(%msg%n)"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceID}] %-5level %logger{50} - %msg%n"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_debug.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<springProfile name="dev,test">
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
<springProfile name="prd">
<root level="info">
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="WARN_FILE"/>
</root>
</springProfile>
</configuration>
================================================
FILE: applet/src/main/resources/prop/redisson-dev.yaml
================================================
singleServerConfig:
address: "redis://47.95.192.230:6379"
password: redis#123
clientName: fish_api_dev
database: 0
idleConnectionTimeout: 10000
pingTimeout: 1000
connectTimeout: 3000
timeout: 5000
retryAttempts: 3
retryInterval: 1500
subscriptionsPerConnection: 5
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
connectionMinimumIdleSize: 8
connectionPoolSize: 16
dnsMonitoringInterval: 5000
threads: 0
nettyThreads: 0
codec:
class: "org.redisson.codec.JsonJacksonCodec"
transportMode: "NIO"
================================================
FILE: backend/pom.xml
================================================
<?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>
<parent>
<groupId>com.mcoding</groupId>
<artifactId>tropical_fish</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>backend</artifactId>
<version>${parent.version}</version>
<packaging>jar</packaging>
<name>backend</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.mcoding</groupId>
<artifactId>base-core</artifactId>
</dependency>
<dependency>
<groupId>com.mcoding</groupId>
<artifactId>biz-user</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>backend</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
================================================
FILE: backend/src/main/java/com/mcoding/BackendApplication.java
================================================
package com.mcoding;
import org.redisson.spring.session.config.EnableRedissonHttpSession;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.ComponentScan;
@EnableRedissonHttpSession
@EnableCaching
@EnableAutoConfiguration
@ComponentScan(basePackages = {"com.mcoding"})
public class BackendApplication {
public static void main(String[] args) {
SpringApplication.run(BackendApplication.class, args);
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/auth/config/AuthConfig.java
================================================
package com.mcoding.modular.auth.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author wzt on 2019/11/13.
* @version 1.0
*/
@Configuration
public class AuthConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
//排除拦截
.excludePathPatterns("/service/auth/login")
.excludePathPatterns("/noLogin/**")
.excludePathPatterns("/druid/**")
.excludePathPatterns("/javasimon/**")
.excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**")
.addPathPatterns("/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/templates/**.js").addResourceLocations("classpath:/templates/");
registry.addResourceHandler("/templates/**.css").addResourceLocations("classpath:/templates/");
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/auth/config/AuthInterceptor.java
================================================
package com.mcoding.modular.auth.config;
import com.alibaba.fastjson.JSON;
import com.mcoding.base.core.rest.ResponseCode;
import com.mcoding.base.core.rest.ResponseResult;
import com.mcoding.modular.system.user.entity.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
* @author wzt on 2019/11/13.
* @version 1.0
*/
@Slf4j
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
SysUser loginUser = (SysUser) request.getSession().getAttribute("currentUser");
if (loginUser == null) {
this.write(response, ResponseResult.fail(ResponseCode.UNAUTHORIZED, "请先登录"));
return false;
}
return true;
}
private void write(HttpServletResponse response, ResponseResult<String> responseResult) throws Exception {
response.setContentType("application/json;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write(JSON.toJSONString(responseResult));
writer.flush();
writer.close();
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/auth/config/LoginRequiredConfig.java
================================================
package com.mcoding.modular.auth.config;
import com.mcoding.modular.auth.support.LoginRequiredArgumentResolver;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
* @author wzt on 2020/6/13.
* @version 1.0
*/
@Component
public class LoginRequiredConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List resolvers) {
resolvers.add(new LoginRequiredArgumentResolver());
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/auth/controller/AppAuthController.java
================================================
package com.mcoding.modular.auth.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mcoding.base.common.util.Assert;
import com.mcoding.base.core.rest.ResponseResult;
import com.mcoding.modular.auth.support.LoginRequired;
import com.mcoding.modular.auth.support.LoginUserUtils;
import com.mcoding.modular.system.user.entity.SysUser;
import com.mcoding.modular.system.user.service.SysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.javasimon.aop.Monitored;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
/**
* @author wzt on 2020/6/19.
* @version 1.0
*/
@Api(tags = "业务-鉴权服务")
@RestController
public class AppAuthController {
@Resource
private SysUserService sysUserService;
@Monitored
@ApiOperation(value = "登录")
@PostMapping("/service/auth/login")
public ResponseResult<SysUser> login(@ApiParam("名称") @RequestParam(defaultValue = "admin") String name,
@ApiParam("密码") @RequestParam(defaultValue = "123456") String password) {
QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda()
.eq(SysUser::getName, name)
.eq(SysUser::getPassword, password);
SysUser currentUser = this.sysUserService.getOne(queryWrapper);
Assert.isNotNull(currentUser, String.format("用户%s不存在", name));
LoginUserUtils.markAsLogin(currentUser);
return ResponseResult.success(currentUser);
}
@Monitored
@ApiOperation(value = "whoAmI")
@GetMapping("/service/auth/whoAmI")
public ResponseResult<SysUser> whoAmI(@ApiIgnore @LoginRequired SysUser sysUser) {
return ResponseResult.success(sysUser);
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/auth/support/LoginRequired.java
================================================
package com.mcoding.modular.auth.support;
import java.lang.annotation.*;
/**
* @author wzt on 2020/6/13.
* @version 1.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
@Documented
public @interface LoginRequired {
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/auth/support/LoginRequiredArgumentResolver.java
================================================
package com.mcoding.modular.auth.support;
import com.mcoding.base.common.exception.CommonException;
import com.mcoding.modular.system.user.entity.SysUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
/**
* @author wzt on 2020/6/13.
* @version 1.0
*/
@Slf4j
public class LoginRequiredArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//匹配参数上具有@LoginRequired注解的参数
return methodParameter.hasParameterAnnotation(LoginRequired.class);
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) {
SysUser sysUser = LoginUserUtils.currentUser();
if (sysUser == null) {
log.error("接口 {} 非法调用!", methodParameter.getMethod().toString());
throw new CommonException("请先登录!");
}
return sysUser;
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/auth/support/LoginUserUtils.java
================================================
package com.mcoding.modular.auth.support;
import com.mcoding.modular.system.user.entity.SysUser;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* @author wzt on 2020/6/19.
* @version 1.0
*/
public class LoginUserUtils {
public static SysUser currentUser() {
HttpSession httpSession = getCurrentSession();
return (SysUser) httpSession.getAttribute("currentUser");
}
public static Long getUserId() {
return currentUser().getId();
}
public static void markAsLogin(SysUser loginUser) {
HttpSession httpSession = getCurrentSession();
httpSession.setAttribute("currentUser", loginUser);
}
public static void invalidate() {
HttpSession httpSession = getCurrentSession();
httpSession.invalidate();
}
public static void loginOut() {
HttpSession httpSession = getCurrentSession();
httpSession.invalidate();
}
private static HttpSession getCurrentSession() {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
return request.getSession();
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/biz/user/controller/BizUserController.java
================================================
package com.mcoding.modular.biz.user.controller;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.Maps;
import com.itextpdf.kernel.geom.PageSize;
import com.mcoding.base.common.util.Assert;
import com.mcoding.base.common.util.pdf.FtlToPdfUtil;
import com.mcoding.base.core.orm.DslParser;
import com.mcoding.base.core.rest.ResponseResult;
import com.mcoding.base.user.entity.BaseUser;
import com.mcoding.base.user.service.BaseUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RedissonClient;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* <p>
* 业务用户
* </p>
*
* @author wzt
* @since 2020-06-21
*/
@Slf4j
@Api(tags = "业务-用户服务")
@RestController
public class BizUserController {
@Resource
private BaseUserService baseUserService;
@ApiOperation("创建")
@PostMapping("/service/user/create")
public ResponseResult<String> create(@Valid @RequestBody BaseUser baseUser) {
baseUserService.save(baseUser);
return ResponseResult.success();
}
@ApiOperation(value = "删除")
@PostMapping("/service/user/delete")
public ResponseResult<String> delete(@RequestParam Integer id) {
baseUserService.removeById(id);
return ResponseResult.success();
}
@ApiOperation(value = "修改")
@PostMapping("/service/user/modify")
public ResponseResult<String> modify(@Valid @RequestBody BaseUser baseUser) {
baseUserService.updateById(baseUser);
return ResponseResult.success();
}
@ApiOperation(value = "查询用户详情")
@GetMapping("/service/user/detail")
public ResponseResult<BaseUser> detail(@RequestParam Integer id) {
return ResponseResult.success(baseUserService.getById(id));
}
@ApiOperation(value = "分页查询")
@PostMapping("/service/user/queryByPage")
public ResponseResult<IPage<BaseUser>> queryByPage(@RequestBody JSONObject queryObject) {
DslParser<BaseUser> dslParser = new DslParser<>(queryObject);
QueryWrapper<BaseUser> queryWrapper = dslParser.parseToWrapper(BaseUser.class);
IPage<BaseUser> page = dslParser.generatePage();
baseUserService.page(page, queryWrapper);
return ResponseResult.success(page);
}
@ApiOperation("导出模板")
@GetMapping(value = "/service/user/exportExcelTemplate")
@ResponseBody
public ResponseResult<String> exportExcelTemplate(HttpServletResponse httpServletResponse) throws Exception {
httpServletResponse.reset();
httpServletResponse.setContentType("application/vnd.ms-excel;charset=utf-8");
httpServletResponse.setHeader("Content-Disposition", String.format("attachment;filename=%s.xlsx",
new String("用户导入模板".getBytes("UTF-8"), "ISO8859-1")));
httpServletResponse.addHeader("Cache-Control", "no-cache");
InputStream templateIs = this.getFileFromClassPathResource("template/UserTemplate.xlsx");
OutputStream outputStream = httpServletResponse.getOutputStream();
ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateIs).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().build();
excelWriter.fill(new FillWrapper("user", Collections.emptyList()), fillConfig, writeSheet);
excelWriter.finish();
outputStream.close();
return null;
}
@ApiOperation("导入")
@PostMapping(value = "/service/user/importByExcel")
@ResponseBody
public ResponseResult<String> importByExcel(@RequestParam("file") MultipartFile file) throws Exception {
List<BaseUser> userList = EasyExcel.read(file.getInputStream(), BaseUser.class, new UserDataListener())
.sheet()
.doReadSync();
log.info("userList = {}", JSON.toJSONString(userList));
return ResponseResult.success();
}
@Resource
private RedissonClient redissonClient;
@ApiOperation("EXCEL导出,请求参数换取导出标识ID")
@PostMapping(value = "/service/user/exchangeExportExcelId")
@ResponseBody
public ResponseResult<String> exchangeExportExcelId(@RequestBody JSONObject queryObject) {
String exportExcelId = UUID.randomUUID().toString(true);
redissonClient.getBucket("user::export::excel::" + exportExcelId)
.set(queryObject, 30, TimeUnit.SECONDS);
return ResponseResult.success(exportExcelId);
}
@ApiOperation("EXCEL导出")
@GetMapping(value = "/service/user/exportByExcel/{exportExcelId}")
@ResponseBody
public ResponseResult<String> exportByExcel(
@ApiParam("导出excel标识") @PathVariable("exportExcelId") String exportExcelId,
HttpServletResponse httpServletResponse) throws Exception {
JSONObject jsonObject = (JSONObject) this.redissonClient.getBucket("user::export::excel::" + exportExcelId).get();
Assert.isNotNull(jsonObject, "导出excel标识ID已过期或者不不存在");
String fileName = "用户明细" + DateUtil.format(new Date(), "yyyyMMddHHmmss");
httpServletResponse.reset();
httpServletResponse.setContentType("application/vnd.ms-excel;charset=utf-8");
httpServletResponse.setHeader("Content-Disposition", String.format("attachment;filename=%s.xls",
new String(fileName.getBytes("UTF-8"), "ISO8859-1")));
httpServletResponse.addHeader("Cache-Control", "no-cache");
InputStream templateIs = this.getFileFromClassPathResource("template/UserTemplate.xlsx");
OutputStream outputStream = httpServletResponse.getOutputStream();
ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(templateIs).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().build();
List<BaseUser> userList = this.getUserList(jsonObject);
excelWriter.fill(new FillWrapper("user", userList), fillConfig, writeSheet);
excelWriter.finish();
outputStream.close();
return null;
}
@ApiOperation("PDF导出")
@GetMapping(value = "/service/user/exportByPdf/{exportExcelId}")
@ResponseBody
public void exportPdf(@ApiParam("导出excel标识") @PathVariable("exportExcelId") String exportPdfId,
HttpServletResponse httpServletResponse) throws Exception {
JSONObject jsonObject = (JSONObject) this.redissonClient.getBucket("user::export::excel::" + exportPdfId).get();
Assert.isNotNull(jsonObject, "导出excel标识ID已过期或者不不存在");
httpServletResponse.setContentType("application/x-msdownload");
String fileName = URLEncoder.encode("用户明细.pdf", "UTF-8");
httpServletResponse.setHeader("Content-Disposition", "attachment;filename=" + fileName);
List<BaseUser> userList = this.getUserList(jsonObject);
Map<String, Object> dataSource = Maps.newHashMap();
dataSource.put("userList", userList);
// 去读模板文件 -> 替换占位符 -> 生成 HTML 字节数组
byte[] htmlByteArray = FtlToPdfUtil.generateHtmlByteArray("/template", "UserTemplate.ftl", dataSource);
OutputStream outputStream = httpServletResponse.getOutputStream();
// HTML 转换为 PDF
FtlToPdfUtil.convertToPdf(htmlByteArray, outputStream, PageSize.A2);
outputStream.flush();
outputStream.close();
}
private List<BaseUser> getUserList(JSONObject jsonObject) {
DslParser<BaseUser> dslParser = new DslParser<>(jsonObject);
dslParser.parseToWrapper(BaseUser.class);
QueryWrapper<BaseUser> queryWrapper = dslParser.getQueryWrapper();
queryWrapper.lambda().orderByDesc(BaseUser::getCreateTime);
return this.baseUserService.list(queryWrapper);
}
private InputStream getFileFromClassPathResource(String filePath) throws IOException {
ClassPathResource classPathResource = new ClassPathResource(filePath);
return classPathResource.getInputStream();
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/biz/user/controller/UserDataListener.java
================================================
package com.mcoding.modular.biz.user.controller;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.mcoding.base.user.entity.BaseUser;
import lombok.extern.slf4j.Slf4j;
/**
* Created on 2022/4/9.
*
* @author wzt
*/
@Slf4j
public class UserDataListener implements ReadListener<BaseUser> {
@Override
public void invoke(BaseUser baseUser, AnalysisContext analysisContext) {
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/rule/ACmp.java
================================================
package com.mcoding.modular.rule;
import com.yomahub.liteflow.core.NodeComponent;
import org.springframework.stereotype.Component;
/**
* @author wzt
* @since 2022/11/30
*/
@Component("a")
public class ACmp extends NodeComponent {
@Override
public void process() {
System.out.println("fuck A");
//do your business
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/rule/BCmp.java
================================================
package com.mcoding.modular.rule;
import com.yomahub.liteflow.core.NodeComponent;
import org.springframework.stereotype.Component;
/**
* @author wzt
* @since 2022/11/30
*/
@Component("b")
public class BCmp extends NodeComponent {
@Override
public void process() {
//do your business
System.out.println("fuck B");
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/rule/BizFlow.java
================================================
package com.mcoding.modular.rule;
import com.yomahub.liteflow.core.FlowExecutor;
import com.yomahub.liteflow.flow.LiteflowResponse;
import com.yomahub.liteflow.slot.DefaultContext;
import com.yomahub.liteflow.util.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author wzt
* @since 2022/11/30
*/
@Slf4j
@Component
public class BizFlow {
@Resource
private FlowExecutor flowExecutor;
public void execute() {
flowExecutor.reloadRule();
LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
DefaultContext context = response.getFirstContextBean();
System.out.println(JsonUtil.toJsonString(context.getData("student")));
if (response.isSuccess()){
log.info("执行成功");
}else{
log.info("执行失败");
}
String code = response.getCode();
String message = response.getMessage();
System.out.println(String.format("%s %s", code, message));
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/rule/CCmp.java
================================================
package com.mcoding.modular.rule;
import com.yomahub.liteflow.core.NodeComponent;
import org.springframework.stereotype.Component;
/**
* @author wzt
* @since 2022/11/30
*/
@Component("c")
public class CCmp extends NodeComponent {
@Override
public void process() {
//do your business
System.out.println("fuck C");
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/rule/RuleFlowController.java
================================================
package com.mcoding.modular.rule;
import com.mcoding.base.core.rest.ResponseResult;
import com.mcoding.modular.system.user.entity.SysUser;
import com.yomahub.liteflow.slot.DefaultContext;
import com.yomahub.liteflow.util.JsonUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.javasimon.aop.Monitored;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author wzt on 2020/6/19.
* @version 1.0
*/
@Api(tags = "基础-规则引擎")
@RestController
public class RuleFlowController {
@Resource
private BizFlow bizFlow;
@Monitored
@ApiOperation(value = "执行")
@PostMapping("/noLogin/ruleFlow")
public ResponseResult execute() {
bizFlow.execute();
return ResponseResult.success();
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/search/controller/ProductSpuController.java
================================================
package com.mcoding.modular.search.controller;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.mcoding.base.core.orm.DslParser;
import com.mcoding.base.core.rest.*;
import com.mcoding.modular.search.service.ProductSpuService;
import com.mcoding.modular.search.entity.ProductSpu;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.io.IOException;
import java.util.List;
/**
* <p>
* 商品SPU
* </p>
*
* @author wzt
* @since 2022-06-24
*/
@Slf4j
@Api(tags = "业务-商品服务")
@RestController
public class ProductSpuController {
@Resource
private ProductSpuService productSpuService;
@ApiOperation("创建")
@PostMapping("/service/goods/create")
public ResponseResult<String> create(@Valid @RequestBody ProductSpu productSpu) {
productSpuService.save(productSpu);
return ResponseResult.success();
}
@ApiOperation(value = "删除")
@PostMapping("/service/goods/delete")
public ResponseResult<String> delete(@RequestParam Integer id) {
productSpuService.removeById(id);
return ResponseResult.success();
}
@ApiOperation(value = "修改")
@PostMapping("/service/goods/modify")
public ResponseResult<String> modify(@Valid @RequestBody ProductSpu productSpu) {
productSpuService.updateById(productSpu);
return ResponseResult.success();
}
@ApiOperation(value = "查询活动详情")
@GetMapping("/service/goods/detail")
public ResponseResult<ProductSpu> detail(@RequestParam Integer id) {
return ResponseResult.success(productSpuService.getById(id));
}
@ApiOperation(value = "分页查询")
@PostMapping("/service/goods/queryByPage")
public ResponseResult<IPage<ProductSpu>> queryByPage(@RequestBody JSONObject queryObject) {
DslParser<ProductSpu> dslParser = new DslParser<>(queryObject);
QueryWrapper<ProductSpu> queryWrapper = dslParser.parseToWrapper(ProductSpu.class);
IPage<ProductSpu> page = dslParser.generatePage();
productSpuService.page(page, queryWrapper);
return ResponseResult.success(page);
}
@Resource
private RestHighLevelClient restHighLevelClient;
private String indexName = "mall_product_spu";
@ApiOperation("全量同步商品索引")
@PostMapping("/service/goods/fullIndex")
public ResponseResult<String> fullIndex() {
List<ProductSpu> productSpuList = this.productSpuService.list();
BulkRequest bulkRequest = new BulkRequest();
for (ProductSpu productSpu : productSpuList) {
IndexRequest indexRequest = new IndexRequest(indexName, "doc")
.id(productSpu.getId().toString())
.opType(DocWriteRequest.OpType.CREATE)
.source(JSONObject.toJSONString(productSpu), XContentType.JSON);
bulkRequest.add(indexRequest);
}
try {
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
log.info("返回状态{}", bulkResponse.status());
if (bulkResponse.status() == RestStatus.OK) {
return ResponseResult.success();
}
} catch (IOException e) {
log.error("批量操作失败", e);
}
return ResponseResult.success();
}
@ApiOperation("修改商品文档数据")
@PostMapping("/service/goods/esUpdate")
public ResponseResult<String> esUpdate(@RequestParam String spuId) {
ProductSpu productSpu = this.productSpuService.getById(spuId);
productSpu.setName(productSpu.getName() + "_update");
UpdateRequest updateRequest = new UpdateRequest(indexName, "doc", spuId);
updateRequest.doc(JSONObject.toJSONString(productSpu), XContentType.JSON);
updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
try {
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
log.info("返回状态{}", updateResponse.status());
if (updateResponse.status() == RestStatus.OK) {
return ResponseResult.success();
}
} catch (IOException e) {
log.error("批量操作失败", e);
}
return ResponseResult.success();
}
@ApiOperation("删除商品文档数据")
@PostMapping("/service/goods/esDelete")
public ResponseResult<String> esDelete(@RequestParam String spuId) {
DeleteRequest deleteRequest = new DeleteRequest(indexName, "doc", spuId);
try {
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
log.info("返回状态{}", deleteResponse.status());
if (deleteResponse.status() == RestStatus.OK) {
return ResponseResult.success();
}
} catch (IOException e) {
log.error("批量操作失败", e);
}
return ResponseResult.success();
}
@ApiOperation("分页检索商品")
@PostMapping("/service/goods/search")
public ResponseResult<String> search(@RequestParam String content, @RequestParam int pageNo, @RequestParam int pageSize) {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.from((pageNo - 1) * pageSize);
sourceBuilder.size(pageSize);
sourceBuilder.sort("createdDate", SortOrder.DESC);
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("name", content))
.must(QueryBuilders.termsQuery("companyId", new int[]{1302, 1600}));
sourceBuilder.query(boolQuery);
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(sourceBuilder);
log.info("searchRequest content = {}", sourceBuilder);
try {
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
log.info("返回状态{}", searchResponse.status());
if (searchResponse.status() == RestStatus.OK) {
SearchHits searchHits = searchResponse.getHits();
log.info("hits={}", searchHits.totalHits);
return ResponseResult.success();
}
} catch (IOException e) {
log.error("操作失败", e);
}
return ResponseResult.success();
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/search/dao/ProductSpuMapper.java
================================================
package com.mcoding.modular.search.dao;
import com.mcoding.modular.search.entity.ProductSpu;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 商品SPU Mapper 接口
* </p>
*
* @author wzt
* @since 2022-06-24
*/
public interface ProductSpuMapper extends BaseMapper<ProductSpu> {
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/search/entity/ProductSpu.java
================================================
package com.mcoding.modular.search.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
/**
* <p>
* 商品SPU
* </p>
*
* @author wzt
* @since 2022-06-24
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("product_spu")
@ApiModel(value="ProductSpu", description="商品SPU")
public class ProductSpu implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "编号")
@TableField("code")
private String code;
@ApiModelProperty(value = "名称")
@TableField("name")
private String name;
@ApiModelProperty(value = "副标题")
@TableField("sub_title")
private String subTitle;
@ApiModelProperty(value = "描述")
@TableField("description")
private String description;
@ApiModelProperty(value = "是否是多规")
@TableField("spec_type")
private Boolean specType;
@ApiModelProperty(value = "备注(后台用,前端暂不展示)")
@TableField("memo")
private String memo;
@ApiModelProperty(value = "pc详情")
@TableField("introduce_pc")
private String introducePc;
@ApiModelProperty(value = "移动详情")
@TableField("introduce_mobile")
private String introduceMobile;
@ApiModelProperty(value = "小程序详情")
@TableField("introduce_program")
private String introduceProgram;
@ApiModelProperty(value = "生产厂家")
@TableField("manufacturer_name")
private String manufacturerName;
@ApiModelProperty(value = "名称拼音首字母")
@TableField("pinyin")
private String pinyin;
@ApiModelProperty(value = "条形码")
@TableField("bar_code")
private String barCode;
@ApiModelProperty(value = "规格")
@TableField("spec")
private String spec;
@ApiModelProperty(value = "搜索关键字")
@TableField("keywords")
private String keywords;
@ApiModelProperty(value = "销售单位")
@TableField("unit")
private String unit;
@ApiModelProperty(value = "重量(预留,算运费用)")
@TableField("weight")
private Double weight;
@ApiModelProperty(value = "重量单位")
@TableField("weight_unit")
private String weightUnit;
@ApiModelProperty(value = "体积(预留,算运费用)")
@TableField("volumn")
private String volumn;
@ApiModelProperty(value = "是否纳入预算管控")
@TableField("check_budget")
private Boolean checkBudget;
@ApiModelProperty(value = "创建人")
@TableField("created_by")
private String createdBy;
@ApiModelProperty(value = "创建时间")
@TableField("created_date")
private Date createdDate;
@ApiModelProperty(value = "修改人")
@TableField("last_modified_by")
private String lastModifiedBy;
@ApiModelProperty(value = "修改时间")
@TableField("last_modified_date")
private Date lastModifiedDate;
@ApiModelProperty(value = "是否删除")
@TableField("is_deleted")
private Boolean isDeleted;
@TableField("catalog_id")
private Long catalogId;
@TableField("company_id")
private Long companyId;
@TableField("category_id")
private Long categoryId;
@TableField("brand_id")
private Long brandId;
@TableField("from_category_id")
private Long fromCategoryId;
@TableField("supply_company_id")
private Long supplyCompanyId;
@TableField("purchase_class_id")
private Long purchaseClassId;
@ApiModelProperty(value = "预算分类ID")
@TableField("budget_class_id")
private Integer budgetClassId;
@ApiModelProperty(value = "平台商品ID")
@TableField("base_product_id")
private Long baseProductId;
@ApiModelProperty(value = "平台商品code")
@TableField("base_product_code")
private String baseProductCode;
@ApiModelProperty(value = "预留字段A")
@TableField("field_a")
private String fieldA;
@ApiModelProperty(value = "预留字段B")
@TableField("field_b")
private String fieldB;
@ApiModelProperty(value = "预留字段C")
@TableField("field_c")
private String fieldC;
@ApiModelProperty(value = "预留字段D")
@TableField("field_d")
private String fieldD;
@ApiModelProperty(value = "预留字段E")
@TableField("field_e")
private String fieldE;
@ApiModelProperty(value = "ean码")
@TableField("ean_code")
private String eanCode;
@ApiModelProperty(value = "hsCode")
@TableField("hs_code")
private String hsCode;
@ApiModelProperty(value = "upc码")
@TableField("upc")
private String upc;
@TableField("platform_category_code")
private String platformCategoryCode;
@TableField("platform_category_id")
private Long platformCategoryId;
@ApiModelProperty(value = "运费模板id")
@TableField("freight_template_id")
private Long freightTemplateId;
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/search/service/ProductSpuService.java
================================================
package com.mcoding.modular.search.service;
import com.mcoding.modular.search.entity.ProductSpu;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 商品SPU 服务类
* </p>
*
* @author wzt
* @since 2022-06-24
*/
public interface ProductSpuService extends IService<ProductSpu> {
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/search/service/impl/ProductSpuServiceImpl.java
================================================
package com.mcoding.modular.search.service.impl;
import com.mcoding.modular.search.entity.ProductSpu;
import com.mcoding.modular.search.dao.ProductSpuMapper;
import com.mcoding.modular.search.service.ProductSpuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 商品SPU 服务实现类
* </p>
*
* @author wzt
* @since 2022-06-24
*/
@Service
public class ProductSpuServiceImpl extends ServiceImpl<ProductSpuMapper, ProductSpu> implements ProductSpuService {
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/system/user/controller/SysUserController.java
================================================
package com.mcoding.modular.system.user.controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.mcoding.base.core.orm.DslParser;
import com.mcoding.base.core.rest.*;
import com.mcoding.modular.system.user.service.SysUserService;
import com.mcoding.modular.system.user.entity.SysUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* <p>
* 管理员表
* </p>
*
* @author wzt
* @since 2020-07-27
*/
@Api(tags = "系统-管理员服务")
@RestController
public class SysUserController {
@Resource
private SysUserService sysUserService;
@ApiOperation("创建")
@PostMapping("/service/sysuser/create")
public ResponseResult<String> create(@Valid @RequestBody SysUser sysUser) {
sysUserService.save(sysUser);
return ResponseResult.success();
}
@ApiOperation(value = "删除")
@PostMapping("/service/sysuser/delete")
public ResponseResult<String> delete(@RequestParam Integer id) {
sysUserService.removeById(id);
return ResponseResult.success();
}
@ApiOperation(value = "修改")
@PostMapping("/service/sysuser/modify")
public ResponseResult<String> modify(@Valid @RequestBody SysUser sysUser) {
sysUserService.updateById(sysUser);
return ResponseResult.success();
}
@ApiOperation(value = "查询活动详情")
@GetMapping("/service/sysuser/detail")
public ResponseResult<SysUser> detail(@RequestParam Integer id) {
return ResponseResult.success(sysUserService.getById(id));
}
@ApiOperation(value = "分页查询")
@PostMapping("/service/sysuser/queryByPage")
public ResponseResult<IPage<SysUser>> queryByPage(@RequestBody JSONObject queryObject) {
DslParser<SysUser> dslParser = new DslParser<>(queryObject);
QueryWrapper<SysUser> queryWrapper = dslParser.parseToWrapper(SysUser.class);
IPage<SysUser> page = dslParser.generatePage();
sysUserService.page(page, queryWrapper);
return ResponseResult.success(page);
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/system/user/dao/SysUserMapper.java
================================================
package com.mcoding.modular.system.user.dao;
import com.mcoding.modular.system.user.entity.SysUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 管理员表 Mapper 接口
* </p>
*
* @author wzt
* @since 2020-07-27
*/
public interface SysUserMapper extends BaseMapper<SysUser> {
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/system/user/entity/SysUser.java
================================================
package com.mcoding.modular.system.user.entity;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.baomidou.mybatisplus.annotation.TableName;
/**
* <p>
* 管理员表
* </p>
*
* @author wzt
* @since 2020-07-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("sys_user")
@ApiModel(value="SysUser", description="管理员表")
public class SysUser implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键id")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty(value = "头像")
@TableField("avatar")
private String avatar;
@ApiModelProperty(value = "账号")
@TableField("account")
private String account;
@ApiModelProperty(value = "密码")
@TableField("password")
private String password;
@ApiModelProperty(value = "md5密码盐")
@TableField("salt")
private String salt;
@ApiModelProperty(value = "名字")
@TableField("name")
private String name;
@ApiModelProperty(value = "生日")
@TableField("birthday")
private Date birthday;
@ApiModelProperty(value = "性别(字典)")
@TableField("sex")
private String sex;
@ApiModelProperty(value = "电子邮件")
@TableField("email")
private String email;
@ApiModelProperty(value = "电话")
@TableField("phone")
private String phone;
@ApiModelProperty(value = "角色id(多个逗号隔开)")
@TableField("role_id")
private String roleId;
@ApiModelProperty(value = "部门id(多个逗号隔开)")
@TableField("dept_id")
private Long deptId;
@ApiModelProperty(value = "状态(字典)")
@TableField("status")
private String status;
@ApiModelProperty(value = "创建时间")
@TableField("create_time")
private Date createTime;
@ApiModelProperty(value = "创建人")
@TableField("create_user")
private Long createUser;
@ApiModelProperty(value = "更新时间")
@TableField("update_time")
private Date updateTime;
@ApiModelProperty(value = "更新人")
@TableField("update_user")
private Long updateUser;
@ApiModelProperty(value = "乐观锁")
@TableField("version")
private Integer version;
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/system/user/service/SysUserService.java
================================================
package com.mcoding.modular.system.user.service;
import com.mcoding.modular.system.user.entity.SysUser;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 管理员表 服务类
* </p>
*
* @author wzt
* @since 2020-07-27
*/
public interface SysUserService extends IService<SysUser> {
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/system/user/service/impl/SysUserServiceImpl.java
================================================
package com.mcoding.modular.system.user.service.impl;
import com.mcoding.modular.system.user.entity.SysUser;
import com.mcoding.modular.system.user.dao.SysUserMapper;
import com.mcoding.modular.system.user.service.SysUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 管理员表 服务实现类
* </p>
*
* @author wzt
* @since 2020-07-27
*/
@Service
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements SysUserService {
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/tech/job/ActivityStatusUpdateJob.java
================================================
package com.mcoding.modular.tech.job;
import com.mcoding.base.core.log.MdcLog;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author wzt on 2020/2/9.
* @version 1.0
*/
@Slf4j
@Component
public class ActivityStatusUpdateJob {
@MdcLog
@XxlJob(value = "activityStatusUpdateJob")
public ReturnT<String> execute(String s) {
try {
// do the job
return ReturnT.SUCCESS;
} catch (Exception e) {
e.printStackTrace();
log.error("event=更新大套餐活动状态[异常]|{}", e.getMessage());
return ReturnT.FAIL;
}
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/tech/job/config/XxlJobConfig.java
================================================
package com.mcoding.modular.tech.job.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* @author wzt on 2019/11/20.
* @version 1.0
*/
@Slf4j
@Configuration
public class XxlJobConfig {
@Resource
private XxlJobPropertiesConfig xxlJobPropertiesConfig;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(xxlJobPropertiesConfig.getAdmin_addresses());
xxlJobSpringExecutor.setAppname(xxlJobPropertiesConfig.getAppname());
return xxlJobSpringExecutor;
}
}
================================================
FILE: backend/src/main/java/com/mcoding/modular/tech/job/config/XxlJobPropertiesConfig.java
================================================
package com.mcoding.modular.tech.job.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @author wzt on 2019/11/18.
* @version 1.0
*/
@ConfigurationProperties(prefix = "xxl.job.executor")
@Component
@Data
public class XxlJobPropertiesConfig {
private String admin_addresses;
private String appname;
private String ip;
private Integer port;
private String accessToken;
private String logpath;
private Integer logretentiondays;
}
================================================
FILE: backend/src/main/resources/application-dev.properties
================================================
spring.datasource.druid.url=jdbc:mysql://47.95.192.230:3306/mcoding?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai
spring.datasource.druid.username=root
spring.datasource.druid.password=root
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.maxActive=20
spring.datasource.druid.maxWait=60000
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.connection-init-sqls=set names utf8mb4
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.druid.filters=stat,wall,slf4j
spring.datasource.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.allow=
spring.datasource.druid.stat-view-servlet.deny=
spring.datasource.druid.stat-view-servlet.reset-enable=false
spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=druid#123456
spring.redis.redisson.config=classpath:prop/redisson-dev.yaml
spring.session.store-type=redis
spring.session.timeout.seconds=900
elasticsearch.clusterNodes=127.0.0.1:9200
================================================
FILE: backend/src/main/resources/application.properties
================================================
spring.application.name=backend-api
server.port=8087
server.servlet.context-path=/backend-api
spring.profiles.active=dev
spring.mvc.servlet.load-on-startup=1
spring.main.allow-bean-definition-overriding=true
spring.jackson.serialization.write-dates-as-timestamps: true
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis-plus.configuration.log-impl=com.mcoding.base.core.log.MybatisLogImpl
#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
================================================
FILE: backend/src/main/resources/config/flow.el.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<chain name="chain1">
THEN(a, b, c);
</chain>
</flow>
================================================
FILE: backend/src/main/resources/logback-spring.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!--<include resource="org/springframework/boot/logging/logback/base.xml" />-->
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="~/logs/backend/logs" />
<property name="CONSOLE_LOG_PATTERN" value="%white(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight([%X{traceID}]) %highlight(%-5level) %boldMagenta(%logger{10}) - %cyan(%msg%n)"/>
<property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceID}] %-5level %logger{50} - %msg%n"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_debug.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/debug/log-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_info.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/log_error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<springProfile name="dev,test">
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
<springProfile name="prd">
<root level="info">
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="WARN_FILE"/>
</root>
</springProfile>
</configuration>
================================================
FILE: backend/src/main/resources/prop/redisson-dev.yaml
================================================
singleServerConfig:
address: "redis://47.95.192.230:6379"
password: redis#123
clientName: fish_api_dev
database: 0
idleConnectionTimeout: 10000
pingTimeout: 1000
connectTimeout: 3000
timeout: 5000
retryAttempts: 3
retryInterval: 1500
subscriptionsPerConnection: 5
subscriptionConnectionMinimumIdleSize: 1
subscriptionConnectionPoolSize: 50
connectionMinimumIdleSize: 8
connectionPoolSize: 16
dnsMonitoringInterval: 5000
threads: 0
nettyThreads: 0
codec:
class: "org.redisson.codec.JsonJacksonCodec"
transportMode: "NIO"
================================================
FILE: backend/src/main/resources/template/UserTemplate.ftl
================================================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<style>
* {
margin: 0;
}
body {
height: 100vh;
font-family: 'Lato', sans-serif;
margin: 0;
}
h1 {
font-size: 32px;
margin-bottom: 12px;
text-align: center;
}
h3 {
margin-top: 12px;
}
.table-list,
.form-data {
width: 100%;
margin-bottom: 20px;
border-bottom: 1px solid;
border-left: 1px solid;
}
th,
td {
border-top: 1px solid;
border-right: 1px solid;
}
.audit {
display: flex;
padding: 12px;
}
.audit > span {
flex-basis: 50%;
}
.comments {
padding: 0 12px;
}
</style>
<title>Document</title>
</head>
<body>
<div>
<table class="table-list" cellpadding="4" cellspacing="0">
<tr style="background-color: #c0c0c0">
<th>序号</th>
<th>手机号码</th>
<th>昵称</th>
<th>用户名称</th>
</tr>
<#list userList as ad>
<tr>
<td>${ad_index+1}</td>
<td>${ad.mobileNumber}</td>
<td>${ad.nickName}</td>
<td>${ad.userName ! ''}</td>
</tr>
</#list>
</table>
</div>
</body>
</html>
================================================
FILE: base-common/pom.xml
================================================
<?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">
<parent>
<artifactId>tropical_fish</artifactId>
<groupId>com.mcoding</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>base-common</artifactId>
<version>${parent.version}</version>
<packaging>jar</packaging>
<name>base-common</name>
<properties>
<java.version>1.8</java.version>
<javasimone.version>4.1.4</javasimone.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jooq</groupId>
<artifactId>joor-java-8</artifactId>
<version>0.9.10</version>
</dependency>
<dependency>
<groupId>ma.glasnost.orika</groupId>
<artifactId>orika-core</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
<dependency>
<groupId>org.codehaus.xfire</groupId>
<artifactId>xfire-core</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.2</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.2.1</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
</dependencies>
</project>
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/exception/BizException.java
================================================
package com.mcoding.base.common.exception;
/**
* 业务异常
*
* @author wzt on 2020/3/9.
* @version 1.0
*/
public class BizException extends RuntimeException {
public BizException() {
super();
}
public BizException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public BizException(String message, Throwable cause) {
super(message, cause);
}
public BizException(String message) {
super(message);
}
public BizException(String message, Object data) {
super(message);
}
public BizException(Throwable cause) {
super(cause);
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/exception/CommonException.java
================================================
package com.mcoding.base.common.exception;
public class CommonException extends RuntimeException {
public CommonException() {
super();
}
public CommonException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public CommonException(String message, Throwable cause) {
super(message, cause);
}
public CommonException(String message) {
super(message);
}
public CommonException(String message, Object data) {
super(message);
}
public CommonException(Throwable cause) {
super(cause);
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/exception/SysException.java
================================================
package com.mcoding.base.common.exception;
/**
* 系统异常
*
* @author wzt on 2020/3/9.
* @version 1.0
*/
public class SysException extends RuntimeException {
public SysException() {
super();
}
public SysException(String message, Throwable cause, boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
public SysException(String message, Throwable cause) {
super(message, cause);
}
public SysException(String message) {
super(message);
}
public SysException(String message, Object data) {
super(message);
}
public SysException(Throwable cause) {
super(cause);
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/command/CommandInvoker.java
================================================
package com.mcoding.base.common.pattern.command;
/**
* @author wzt on 2019/11/20.
* @version 1.0
*/
public class CommandInvoker implements ICommandInvoker {
@Override
public <Result> Result invoke(ICommand<Result> command) {
return command.execute(this);
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/command/ICommand.java
================================================
package com.mcoding.base.common.pattern.command;
public interface ICommand<Result> {
Result execute(ICommandInvoker context);
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/command/ICommandInvoker.java
================================================
package com.mcoding.base.common.pattern.command;
public interface ICommandInvoker {
public <Result> Result invoke(ICommand<Result> command);
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/Filter.java
================================================
package com.mcoding.base.common.pattern.filterchain;
/**
* @author wzt on 2020/5/3.
* @version 1.0
*/
public interface Filter<Request> {
/**
* 过滤
*
* @param request
* @param filterContext
*/
void doFilter(Request request, FilterContext<Request, ?> filterContext);
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/FilterContext.java
================================================
package com.mcoding.base.common.pattern.filterchain;
import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* 责任链
*
* @author wzt on 2020/5/3.
* @version 1.0
*/
public class FilterContext<Request, Response> {
private List<Filter<Request>> filterList = Lists.newArrayList();
private int offSet = 0;
@Getter
@Setter
private Target<Request, Response> target;
@Getter
private Response executeResult;
public void doFilter(Request request) {
if (offSet < filterList.size()) {
Filter<Request> filter = filterList.get(offSet++);
filter.doFilter(request, this);
return;
}
executeResult = target.execute(request);
}
public void addFilter(Filter<Request> filter) {
filterList.add(filter);
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/Target.java
================================================
package com.mcoding.base.common.pattern.filterchain;
/**
* @author wzt on 2020/5/3.
* @version 1.0
*/
@FunctionalInterface
public interface Target<Request, Response> {
/**
* 执行目标方法
*
* @param request
* @return
*/
Response execute(Request request);
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/Pipeline.java
================================================
package com.mcoding.base.common.pattern.pipeline;
/**
* @author wzt on 2020/5/4.
* @version 1.0
*/
public interface Pipeline<T> {
Value getHead();
Value getTail();
void setTail(Value<T> v);
void addValue(Value<T> v);
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/StandardPipeline.java
================================================
package com.mcoding.base.common.pattern.pipeline;
/**
* @author wzt on 2020/5/4.
* @version 1.0
*/
public class StandardPipeline<T> {
protected Value<T> head;
protected Value<T> tail;
public Value<T> getHead() {
return this.head;
}
public Value<T> getTail() {
return this.tail;
}
public void setTail(Value<T> v) {
this.tail = v;
}
public void addValue(Value<T> v) {
if (head == null) {
head = v;
v.setNext(tail);
return;
}
Value<T> current = head;
while (current != null) {
if (current.getNext() == tail) {
current.setNext(v);
v.setNext(tail);
break;
}
current = current.getNext();
}
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/Value.java
================================================
package com.mcoding.base.common.pattern.pipeline;
/**
* @author wzt on 2020/5/4.
* @version 1.0
*/
public abstract class Value<T> {
public Value<T> next;
public Value<T> getNext() {
return next;
}
public void setNext(Value<T> v) {
this.next = v;
}
public abstract void invoke(T s);
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/Assert.java
================================================
package com.mcoding.base.common.util;
import com.mcoding.base.common.exception.CommonException;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.Collection;
import java.util.List;
/**
* 帮助验证参数的断言工具
*
* @author hzy
*/
public class Assert {
/**
* 列表不能为空,否则就报错
*
* @param list
* @param defaultMsg
*/
@SuppressWarnings("rawtypes")
public static void isNotEmpty(Collection list, String defaultMsg) {
if (CollectionUtils.isEmpty(list))
throw new CommonException(defaultMsg);
}
/**
* 列表不能为空,否则就报错
*
* @param list
* @param defaultMsg
* @param i18n
*/
@SuppressWarnings("rawtypes")
public static void isNotEmpty(List list, String defaultMsg, String i18n) {
if (CollectionUtils.isEmpty(list))
throw new CommonException(defaultMsg, i18n);
}
/**
* 值不能为空,如果是空则报错
*
* @param value
* @param defaultMsg
*/
public static void isNotBlank(String value, String defaultMsg) {
if (StringUtils.isBlank(value))
throw new CommonException(defaultMsg);
}
/**
* 值不能为空,如果是空则报错
*
* @param value
* @param defaultMsg
* @param i18n
*/
public static void isNotBlank(String value, String defaultMsg, String i18n) {
if (StringUtils.isBlank(value))
throw new CommonException(defaultMsg, i18n);
}
/**
* 参数不能为空,为空报错
*
* @param type
* @param mss
*/
public static void isNotNull(Object type, String mss) {
if (type == null)
throw new CommonException(mss);
}
/**
* 参数不能为空,为空报错
*
* @param type
*/
public static void isNotNull(Object type) {
if (type == null)
throw new CommonException(type + "不能为空");
}
/**
* 值应该存在。如果不存在,则报错
*
* @param list
* @param value
*/
public static <T> void isExists(List<T> list, T value, String msg) {
if (!list.contains(value))
throw new CommonException(StringUtils.defaultIfBlank(msg, "该值不存在"));
}
/**
* 值应该不存在存在。如果存在,则报错
*
* @param obj
* @param str
*/
public static <T> void doNotExists(List<T> list, T value, String msg) {
if (list.contains(value))
throw new CommonException(StringUtils.defaultIfBlank(msg, "该值已经存在"));
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/bean/BeanMapperUtils.java
================================================
package com.mcoding.base.common.util.bean;
import cn.hutool.core.collection.CollectionUtil;
import ma.glasnost.orika.MapperFacade;
import ma.glasnost.orika.MapperFactory;
import ma.glasnost.orika.impl.DefaultMapperFactory;
import ma.glasnost.orika.metadata.Type;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* 实体熟悉映射工具
*/
public abstract class BeanMapperUtils {
private static MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
public static <S, D> D map(S source, Class<D> clazz) {
if (Objects.isNull(source)) {
return null;
}
MapperFacade mapper = mapperFactory.getMapperFacade();
return mapper.map(source, clazz);
}
public static <S, D> void map(S source, D destination) {
if (Objects.isNull(source) || Objects.isNull(destination)) {
return;
}
MapperFacade mapper = mapperFactory.getMapperFacade();
mapper.map(source, destination);
}
public static <S, D> D map(S s, Type<S> sType, Type<D> dType) {
if (s == null) {
return null;
}
MapperFacade mapper = mapperFactory.getMapperFacade();
return mapper.map(s, sType, dType);
}
public static <S, D> List<D> mapAsList(List<S> source, Class<D> clazz) {
if (CollectionUtil.isEmpty(source)) {
return Collections.emptyList();
}
MapperFacade mapper = mapperFactory.getMapperFacade();
return mapper.mapAsList(source, clazz);
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/collection/MapUtils.java
================================================
package com.mcoding.base.common.util.collection;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
/**
* @author wzt on 2020/1/16.
* @version 1.0
*/
public class MapUtils {
/**
* 对每个分组求和
*
* @param sourceMap
* @param function
* @param <S>
* @param <R>
* @return
*/
public static <S, R> Map<String, BigDecimal> sumEachGroupList(Map<String, List<S>> sourceMap, Function<S, R> function) {
Map<String, BigDecimal> resultMap = new HashMap<>(sourceMap.size());
sourceMap.forEach((key, list) -> {
BigDecimal sum = BigDecimal.ZERO;
for (S t : list) {
R result = function.apply(t);
sum = sum.add(new BigDecimal(result.toString()));
}
resultMap.put(key, sum);
});
return resultMap;
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/constant/MdcConstants.java
================================================
package com.mcoding.base.common.util.constant;
/**
* @author wzt on 2020/4/4.
* @version 1.0
*/
public class MdcConstants {
public static final String TRACE_ID = "traceID";
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/constant/SysConstants.java
================================================
package com.mcoding.base.common.util.constant;
/**
* @author wzt on 2020/3/30.
* @version 1.0
*/
public interface SysConstants {
int YES = 1;
int NO = 0;
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/date/DateTimeUtils.java
================================================
package com.mcoding.base.common.util.date;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import java.util.Optional;
/**
* @author mazehong
* @date 2020/3/26
*/
public class DateTimeUtils {
/**
* Date转LocalDateTime
*
* @param date
* @return
*/
public static LocalDateTime toLocalDateTime(Date date) {
Optional.ofNullable(date).orElseThrow(() -> new IllegalArgumentException("Date转LocalDateTime异常"));
return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).withNano(0);
}
/**
* LocalDateTime转Date
*
* @param localDateTime
* @return
*/
public static Date toDate(LocalDateTime localDateTime) {
Optional.ofNullable(localDateTime).orElseThrow(() -> new IllegalArgumentException("LocalDateTime转Date异常"));
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/date/DateUtils.java
================================================
package com.mcoding.base.common.util.date;
import cn.hutool.core.lang.Assert;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
/**
* @author mazehong
* @date 2020/3/3
*/
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DateUtils {
public static final String SHORT_DATE_FORMAT = "yyyy-MM-dd";
public static final String SHORT_DATE_GBK_FORMAT = "yyyy年MM月dd日";
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm";
public static final String DATE_GBK_FORMAT = "yyyy年MM月dd日 HH时mm分";
public static final String LONG_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String LONG_DATE_GBK_FORMAT = "yyyy年MM月dd日 HH时mm分ss秒";
public static final String MAIL_DATE_FORMAT = "yyyyMMddHHmmss";
public static final String MAIL_DATE_HHMM_FORMAT = "HH:mm";
public static final String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss:SSS";
public static final String SQL_FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String FULL_DATE_GBK_FORMAT = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒";
public static final String FULL_DATE_COMPACT_FORMAT = "yyyyMMddHHmmssSSS";
public static final String LDAP_DATE_FORMAT = "yyyyMMddHHmm'Z'";
public static final String US_LOCALE_DATE_FORMAT = "EEE MMM dd HH:mm:ss zzz yyyy";
public static final String MAIL_DATE_DT_PART_FORMAT = "yyyyMMdd";
public static final String MAIL_TIME_TM_PART_FORMAT = "HHmmss";
public static final String LONG_DATE_TM_PART_FORMAT = "HH:mm:ss";
public static final String LONG_DATE_TM_PART_GBK_FORMAT = "HH时mm分ss秒";
public static final String MAIL_DATA_DTM_PART_FORMAT = "MM月dd日HH:mm";
public static final String POINT_DATA_DTM_PART_FORMAT = "yyyy.MM.dd";
public static final String DEFAULT_DATE_FORMAT = US_LOCALE_DATE_FORMAT;
public static final long NANO_ONE_SECOND = 1000;
public static final long NANO_ONE_MINUTE = 60 * NANO_ONE_SECOND;
public static final long NANO_ONE_HOUR = 60 * NANO_ONE_MINUTE;
public static final long NANO_ONE_DAY = 24 * NANO_ONE_HOUR;
/**
* 5分钟
*/
public static final long FIVE_MINUTE = 5 * NANO_ONE_MINUTE;
/**
* 3天
*/
public static final long THREE_DAY = 3 * NANO_ONE_DAY;
public static final String MORE_THAN = ">";
public static final String LESS_THAN = "<";
public static final String EQUAL = "=";
public static final String DASH = "-";
public static final String COLON = ":";
public static final String BLANK = " ";
/**
* 字符串转日期,模糊判断, 超过10的则精确到秒,反之精确到天
*
* @param arg
* @return
* @throws java.text.ParseException
*/
public static Date ignoreDate(String arg) throws ParseException {
SimpleDateFormat ACCURATE_SECONDS = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat ACCURATE_DAYS = new SimpleDateFormat("yyyy-MM-dd");
return arg.length() > 10 ? ACCURATE_SECONDS.parse(arg) : ACCURATE_DAYS.parse(arg);
}
/**
* 获取当前日期类型时间
*/
public static Date getNow() {
return new Date();
}
/**
* 获取当前时间戳
*/
public static long getNowTimestamp() {
return getNow().getTime();
}
/**
* 获取当前日期 yyyyMMdd
*/
public static String getCurrentDate() {
return toMailDateDtPartString(getNow());
}
/**
* 获取当期时间HHmmss
*
* @return
*/
public static String getCurrentTime() {
return toMailTimeTmPartString(getNow());
}
/**
* 获取当期时间MM月dd日HH:mm
*
* @return
*/
public static String getCurrentMmDdHmTime() {
return toMailDtmPart(getNow());
}
/**
* 获取当前日期和时间yyyyMMddHHmmss
*
* @return
*/
public static String getCurrentDateTime() {
return toMailDateString(getNow());
}
//============================1.Date2String=====================================
/**
* 将一个日期型转换为指定格式字串
*
* @param aDate
* @param formatStr
* @return
*/
public static final String toFormatDateString(Date aDate, String formatStr) {
if (aDate == null) {
return StringUtils.EMPTY;
}
return new SimpleDateFormat(formatStr).format(aDate);
}
/**
* 将一个日期型转换为'yyyy-MM-dd'格式字串
*
* @param aDate
* @return
*/
public static final String toShortDateString(Date aDate) {
return toFormatDateString(aDate, SHORT_DATE_FORMAT);
}
/**
* 将一个日期型转换为'yyyyMMdd'格式字串
*
* @param aDate
* @return
*/
public static final String toMailDateDtPartString(Date aDate) {
return toFormatDateString(aDate, MAIL_DATE_DT_PART_FORMAT);
}
/**
* 将一个日期型转换为'HHmmss'格式字串
*
* @param aDate
* @return
*/
public static final String toMailTimeTmPartString(Date aDate) {
return toFormatDateString(aDate, MAIL_TIME_TM_PART_FORMAT);
}
/**
* 将一个日期型转换为'yyyyMMddHHmmss'格式字串
*
* @param aDate
* @return
*/
public static final String toMailDateString(Date aDate) {
return toFormatDateString(aDate, MAIL_DATE_FORMAT);
}
/**
*
*/
/**
* 将一个日期型转换为MM月dd日HH:mm格式字串
*
* @param aDate
* @return
*/
public static final String toMailDtmPart(Date aDate) {
return toFormatDateString(aDate, MAIL_DATA_DTM_PART_FORMAT);
}
/**
*
*/
/**
* 将一个日期型转换为yyyy.MM.dd格式字串
*
* @param aDate
* @return
*/
public static final String toPointDtmPart(Date aDate) {
return toFormatDateString(aDate, POINT_DATA_DTM_PART_FORMAT);
}
/**
* 将一个日期型转换为'yyyy-MM-dd HH:mm:ss'格式字串
*
* @param aDate
* @return
*/
public static final String toLongDateString(Date aDate) {
return toFormatDateString(aDate, LONG_DATE_FORMAT);
}
/**
* 将一个日期型转换为'HH:mm:ss'格式字串
*
* @param aDate
* @return
*/
public static final String toLongDateTmPartString(Date aDate) {
return toFormatDateString(aDate, LONG_DATE_TM_PART_FORMAT);
}
/**
* 将一个日期型转换为'yyyy年MM月dd日'格式字串
*
* @param aDate
* @return
*/
public static final String toShortDateGBKString(Date aDate) {
return toFormatDateString(aDate, SHORT_DATE_GBK_FORMAT);
}
/**
* 将一个日期型转换为'yyyy年MM月dd日 HH时mm分'格式字串
*
* @param aDate
* @return
*/
public static final String toDateGBKString(Date aDate) {
return toFormatDateString(aDate, DATE_GBK_FORMAT);
}
/**
* 将一个日期型转换为'yyyy年MM月dd日 HH时mm分ss秒'格式字串
*
* @param aDate
* @return
*/
public static final String toLongDateGBKString(Date aDate) {
return toFormatDateString(aDate, LONG_DATE_GBK_FORMAT);
}
/**
* 将一个日期型转换为'HH时mm分ss秒'格式字串
*
* @param aDate
* @return
*/
public static final String toLongDateTmPartGBKString(Date aDate) {
return toFormatDateString(aDate, LONG_DATE_TM_PART_GBK_FORMAT);
}
/**
* 将一个日期型转换为'yyyy-MM-dd HH:mm:ss:SSS'格式字串
*
* @param aDate
* @return
*/
public static final String toFullDateString(Date aDate) {
return toFormatDateString(aDate, FULL_DATE_FORMAT);
}
/**
* 将一个日期型转换为'yyyy年MM月dd日 HH时mm分ss秒SSS毫秒'格式字串
*
* @param aDate
* @return
*/
public static final String toFullDateGBKString(Date aDate) {
return toFormatDateString(aDate, FULL_DATE_GBK_FORMAT);
}
/**
* 将一个日期型转换为'yyyyMMddHHmmssSSS'格式字串
*
* @param aDate
* @return
*/
public static final String toFullDateCompactString(Date aDate) {
return toFormatDateString(aDate, FULL_DATE_COMPACT_FORMAT);
}
/**
* 将一个日期型转换为LDAP格式字串
*
* @param aDate
* @return
*/
public static final String toLDAPDateString(Date aDate) {
return toFormatDateString(aDate, LDAP_DATE_FORMAT);
}
//============================2.String2Date=====================================
/**
* 将一个符合指定格式的字串解析成日期型
*
* @param aDateStr
* @param formatter
* @return
* @throws java.text.ParseException
*/
public static final Date parser(String aDateStr, String formatter) throws ParseException {
if (StringUtils.isBlank(aDateStr)) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat(formatter);
return sdf.parse(aDateStr);
}
/**
* 将一个符合指定格式的字串解析成日期型
*
* @param aDateStr
* @param formatter
* @param lenient false表示需要对字符串进行严格校验,有多余的空格都不行 true表示不进行严格校验,是SimpleDateFormat默认的方式
* @return
* @throws java.text.ParseException
*/
public static final Date parser(String aDateStr, String formatter, boolean lenient) throws ParseException {
if (StringUtils.isBlank(aDateStr)) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat(formatter);
sdf.setLenient(lenient);
return sdf.parse(aDateStr);
}
/**
* 将一个符合'yyyy-MM-dd HH:mm:ss'格式的字串解析成日期型
*
* @param aDateStr
* @return
*/
public static final Date parseLongDateString(String aDateStr) throws ParseException {
return parser(aDateStr, LONG_DATE_FORMAT);
}
/**
* 将一个符合'yyyy-MM-dd HH:mm:ss'格式的字串解析成日期型
*
* @param aDateStr
* @return
*/
public static final Date parseLongDateDtPartString(String aDateStr) throws ParseException {
return parser(aDateStr, LONG_DATE_FORMAT);
}
/**
* 将一个符合'yyyy-MM-dd HH:mm:ss'格式的字串解析成日期型
*
* @param aDateStr
* @return
*/
public static final Date parseLongDateTmPartString(String aDateStr) throws ParseException {
return parser(aDateStr, LONG_DATE_FORMAT);
}
/**
* 将一个符合'yyyy-MM-dd'格式的字串解析成日期型
*
* @param aDateStr
* @return
*/
public static final Date parseShortDateString(String aDateStr) throws ParseException {
return parser(aDateStr, SHORT_DATE_FORMAT);
}
/**
* 将一个符合'yyyyMMddHHmmss'格式的字串解析成日期型
*
* @param aDateStr
* @return
*/
public static final Date parseMailDateString(String aDateStr) throws ParseException {
return parser(aDateStr, MAIL_DATE_FORMAT);
}
/**
* 将一个符合'yyyyMMdd'格式的字串解析成日期型
*
* @param aDateStr
* @return
*/
public static final Date parseMailDateDtPartString(String aDateStr) throws ParseException {
return parser(aDateStr, MAIL_DATE_DT_PART_FORMAT);
}
/**
* 将一个符合'HHmmss'格式的字串解析成日期型
*
* @param aDateStr
* @return
*/
public static final Date parseMailDateTmPartString(String aDateStr) throws ParseException {
return parser(aDateStr, MAIL_TIME_TM_PART_FORMAT);
}
/**
* 将一个符合'yyyy-MM-dd HH:mm:ss:SSS'格式的字串解析成日期型
*
* @param aDateStr
* @return
*/
public static final Date parseFullDateString(String aDateStr) throws ParseException {
return parser(aDateStr, FULL_DATE_FORMAT);
}
/**
* 将一个符合'yyyy-MM-dd'、'yyyy-MM-dd HH:mm:ss'或'EEE MMM dd HH:mm:ss zzz
* yyyy'格式的字串解析成日期型, 如果为blank则返回空,如果不为blank又不符合格式则报错
*
* @param aDateStr
* @return
*/
public static Date parseDateString(String aDateStr) {
Date ret = null;
if (StringUtils.isNotBlank(aDateStr)) {
try {
if (DateValidator.isLongDateStr(aDateStr)) {
ret = parseLongDateString(aDateStr);
} else if (DateValidator.isShortDateStr(aDateStr)) {
ret = parseShortDateString(aDateStr);
} else if (DateValidator.isDateStrMatched(aDateStr, DEFAULT_DATE_FORMAT)) {
ret = parser(aDateStr, DEFAULT_DATE_FORMAT);
} else {
throw new IllegalArgumentException("date format mismatch");
}
} catch (ParseException e) {
log.warn("parseDateString failed", e);
}
}
return ret;
}
//============================3.String2String=====================================
/**
* 转换日期格式 yyyy-MM-dd => yyyyMMdd
*
* @param dt yyyy-MM-dd
* @return yyyyMMdd
*/
public static String transfer2ShortDate(String dt) {
if (dt == null || dt.length() != 10) {
return dt;
}
Assert.notNull(dt, "格式错误");
String[] tmp = StringUtils.split(dt, DASH);
Assert.isTrue(tmp != null && tmp.length == 3, "格式错误");
return tmp[0].concat(StringUtils.leftPad(tmp[1], 2, "0")).concat(StringUtils.leftPad(tmp[2], 2, "0"));
}
/**
* 转换日期格式 yyyyMMdd HH:mm:ss => yyyy-MM-dd HH:mm:ss
*
* @param dt yyyyMMdd
* @param tm HHmmss
* @return yyyy-MM-dd HH:mm:ss
*/
public static String transfer2LongDatePart(String dt, String tm) {
return transfer2LongDateDtPart(dt).concat(BLANK).concat(transfer2LongDateTmPart(tm));
}
/**
* 转换日期格式 yyyyMMdd => yyyy-MM-dd
*
* @param dt yyyyMMdd
* @return yyyy-MM-dd
*/
public static String transfer2LongDateDtPart(String dt) {
if (dt == null || dt.length() != 8) {
return dt;
}
Assert.notNull(dt, "格式错误");
Assert.isTrue(dt.length() == 8, "格式错误");
return dt.substring(0, 4).concat(DASH).concat(dt.substring(4, 6)).concat(DASH).concat(dt.substring(6));
}
/**
* 转换日期格式 HHmmss => HH:mm:ss
*
* @param tm HHmmss
* @return HH:mm:ss
*/
public static String transfer2LongDateTmPart(String tm) {
if (tm == null || tm.length() != 6) {
return tm;
}
Assert.notNull(tm, "格式错误");
Assert.isTrue(tm.length() == 6, "格式错误");
return tm.substring(0, 2).concat(COLON).concat(tm.substring(2, 4)).concat(COLON).concat(tm.substring(4));
}
/**
* 转换日期格式 yyyyMMdd => yyyy年MM月dd日
*
* @param dt yyyyMMdd
* @return yyyy年MM月dd日
*/
public static String transfer2LongDateGbkDtPart(String dt) {
if (dt == null || dt.length() != 8) {
return dt;
}
Assert.notNull(dt, "格式错误");
Assert.isTrue(dt.length() == 8, "格式错误");
return dt.substring(0, 4).concat("年").concat(dt.substring(4, 6)).concat("月").concat(dt.substring(6))
.concat("日");
}
/**
* 转换日期格式 yyyyMMdd => yyyy/MM/dd
*
* @param dt yyyyMMdd
* @return yyyy年MM月dd日
*/
public static String transfer2LongDate(String dt) {
if (dt == null || dt.length() != 8) {
return dt;
}
Assert.notNull(dt, "格式错误");
Assert.isTrue(dt.length() == 8, "格式错误");
return dt.substring(0, 4).concat("-").concat(dt.substring(4, 6)).concat("-").concat(dt.substring(6));
}
/**
* 转换日期格式HHmmss => HH时mm分ss秒
*
* @param tm HHmmss
* @return HH时mm分ss秒
*/
public static String transfer2LongDateGbkTmPart(String tm) {
if (tm == null || tm.length() != 6) {
return tm;
}
Assert.notNull(tm, "格式错误");
Assert.isTrue(tm.length() == 6, "格式错误");
return tm.substring(0, 2).concat("时").concat(tm.substring(2, 4)).concat("分").concat(tm.substring(4))
.concat("秒");
}
//============================4.时间加减=====================================
/**
* 为一个日期加上指定年数
*
* @param aDate
* @param amount 年数
* @return
*/
public static final Date addYears(Date aDate, int amount) {
return addTime(aDate, Calendar.YEAR, amount);
}
/**
* 为一个日期加上指定月数
*
* @param aDate
* @param amount 月数
* @return
*/
public static final Date addMonths(Date aDate, int amount) {
return addTime(aDate, Calendar.MONTH, amount);
}
/**
* 为一个日期加上指定天数
*
* @param aDate
* @param amount 天数
* @return
*/
public static final Date addDays(Date aDate, int amount) {
return addTime(aDate, Calendar.DAY_OF_YEAR, amount);
}
/**
* 为一个日期加上指定天数
*
* @param aDate yyyyMMdd格式字串
* @param amount 天数
* @return
*/
public static final String addDays(String aDate, int amount) {
try {
return toMailDateDtPartString(addTime(parseMailDateDtPartString(aDate), Calendar.DAY_OF_YEAR, amount));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 为一个日期加上指定小时数
*
* @param aDate
* @param amount 小时数
* @return
*/
public static final Date addHours(Date aDate, int amount) {
return addTime(aDate, Calendar.HOUR, amount);
}
/**
* 为一个日期加上指定分钟数
*
* @param aDate
* @param amount 分钟数
* @return
*/
public static final Date addMinutes(Date aDate, int amount) {
return addTime(aDate, Calendar.MINUTE, amount);
}
/**
* 为一个日期加上指定秒数
*
* @param aDate
* @param amount 秒数
* @return
*/
public static final Date addSeconds(Date aDate, int amount) {
return addTime(aDate, Calendar.SECOND, amount);
}
private static final Date addTime(Date aDate, int timeType, int amount) {
if (aDate == null) {
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(aDate);
cal.add(timeType, amount);
return cal.getTime();
}
//======================================5.时间国际化=================================
/**
* 得到当前时间的UTC时间
*
* @return
*/
public static final String getUTCTime() {
return getSpecifiedZoneTime(Calendar.getInstance().getTime(), TimeZone.getTimeZone("GMT+0"));
}
/**
* 得到指定时间的UTC时间
*
* @param aDate 时间戳
* @return yyyy-MM-dd HH:mm:ss 格式
*/
public static final String getUTCTime(Date aDate) {
return getSpecifiedZoneTime(aDate, TimeZone.getTimeZone("GMT+0"));
}
/**
* 得到当前时间的指定时区的时间
*
* @param tz
* @return
*/
public static final String getSpecifiedZoneTime(TimeZone tz) {
return getSpecifiedZoneTime(Calendar.getInstance().getTime(), tz);
}
/**
* 得到指定时间的指定时区的时间
*
* @param aDate 时间戳,Date是一个瞬间的long型距离历年的位移偏量,
* 在不同的指定的Locale/TimeZone的jvm中,它toString成不同的显示值,
* 所以没有必要为它再指定一个TimeZone变量表示获取它时的jvm的TimeZone
* @param tz 要转换成timezone
* @return yyyy-MM-dd HH:mm:ss 格式
*/
public static final String getSpecifiedZoneTime(Date aDate, TimeZone tz) {
if (aDate == null) {
return StringUtils.EMPTY;
}
Assert.notNull(tz, "格式错误");
SimpleDateFormat sdf = new SimpleDateFormat(LONG_DATE_FORMAT);
sdf.setTimeZone(tz);
return sdf.format(aDate);
}
//==================================6. miscellaneous==========================
/**
* 计算两个日期之间相差的月数
*
* @param startDate
* @param endDate
* @return
*/
public static final int getDifferenceMonths(Date startDate, Date endDate) {
Assert.notNull(startDate, "格式错误");
Assert.notNull(endDate, "格式错误");
Calendar startCal = Calendar.getInstance();
startCal.setTime(startDate);
Calendar endCal = Calendar.getInstance();
endCal.setTime(endDate);
return Math.abs((startCal.get(Calendar.YEAR) - endCal.get(Calendar.YEAR)) * 12
+ (startCal.get(Calendar.MONTH) - endCal.get(Calendar.MONTH)));
}
/**
* 计算两个日期之间相差的月数
*
* @param startDateStr yyyy-mm-dd
* @param endDateStr yyyy-mm-dd
* @return
*/
public static final int getDifferenceMonths(String startDateStr, String endDateStr) {
DateValidator.checkShortDateStr(startDateStr);
DateValidator.checkShortDateStr(endDateStr);
try {
return getDifferenceMonths(parseShortDateString(startDateStr), parseShortDateString(endDateStr));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 获取两个日期间的月份,返回一个list,包含如下内容:yyyy-MM
* @return
*/
public static List<Map<String,Object>> getMonthBetween(String minDate, String maxDate){
Date start = parseDateString(minDate);
Date end = parseDateString(maxDate);
return getBetweenMonthFirstAndEnd(start,end);
}
/**
* 获取两个日期间的月份,返回一个list,
* @return
*/
public static List<Map<String,Object>> getBetweenMonthFirstAndEnd(Date minDate, Date maxDate) {
List<Map<String,Object>> result = new ArrayList<>();
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
min.setTime(minDate);
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
max.setTime(maxDate);
max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
Calendar curr = min;
while (curr.before(max)) {
Map<String,Object> map = new HashMap<>(4);
Date time = curr.getTime();
Date monthFirst = getMonthFirst(time);
Date monthEnd = getMonthEnd(time);
map.put("startDate",toFormatDateString(monthFirst,SQL_FULL_DATE_FORMAT));
map.put("endDate",toFormatDateString(monthEnd,SQL_FULL_DATE_FORMAT));
result.add(map);
curr.add(Calendar.MONTH, 1);
}
return result;
}
/**
* 计算两个日期之间相差的天数
*
* @param startDateStr yyyy-mm-dd
* @param endDateStr yyyy-mm-dd
* @return
*/
public static final int getDifferenceDays(String startDateStr, String endDateStr) {
return Double.valueOf(getDifferenceMillis(startDateStr, endDateStr) / (NANO_ONE_DAY)).intValue();
}
/**
* 计算两个日期之间相差的天数
*
* @param startDateStr yyyymmdd
* @param endDateStr yyyymmdd
* @return
*/
public static final int getDifferenceDays2(String startDateStr, String endDateStr) {
return Double.valueOf(getDifferenceMillis(startDateStr, endDateStr, MAIL_DATE_DT_PART_FORMAT) / (NANO_ONE_DAY))
.intValue();
}
/* ------- start ------------ */
/**
* 两个日期之间相减(存在负数)
*
* @param startDateStr yyyy-mm-dd
* @param endDateStr yyyy-mm-dd
* @return
*/
public static final int getDaysSubtract(String startDateStr, String endDateStr) {
return Double.valueOf(getDaysSubtractMillis(startDateStr, endDateStr) / (NANO_ONE_DAY)).intValue();
}
/**
* 两个日期的相差天数(存在负数)
*
* @param startDate
* @param endDate
* @return
*/
public static final int getDaysSubtract(Date startDate, Date endDate) {
return DateUtils.getDaysSubtract(DateUtils.toShortDateString(startDate),
DateUtils.toShortDateString(endDate));
}
/**
* 两个日期之间相减(存在负数)
*
* @param startDateStr yyyymmdd
* @param endDateStr yyyymmdd
* @return
*/
public static final int getDaysSubtract2(String startDateStr, String endDateStr) {
return Double.valueOf(
getDaysSubtractMillis(startDateStr, endDateStr, MAIL_DATE_DT_PART_FORMAT) / (NANO_ONE_DAY)).intValue();
}
/**
* 两个日期之间相减(存在负数)
*
* @param startDateStr yyyy-mm-dd
* @param endDateStr yyyy-mm-dd
* @return
* @throws java.text.ParseException
*/
public static final long getDaysSubtractMillis(String startDateStr, String endDateStr) {
return getDaysSubtractMillis(startDateStr, endDateStr, SHORT_DATE_FORMAT);
}
/**
* 计算两个日期之间相差的的毫秒数(存在负数)
*
* @param startDateStr
* @param endDateStr
* @param dateFormat
* @return
*/
public static final long getDaysSubtractMillis(String startDateStr, String endDateStr, String dateFormat) {
try {
return getDaysSubtractMillis(parser(startDateStr, dateFormat), parser(endDateStr, dateFormat));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 计算两个日期之间相差的的毫秒数(存在负数)
*
* @param startDate
* @param endDate
* @return
*/
public static final long getDaysSubtractMillis(Date startDate, Date endDate) {
Assert.notNull(startDate, "格式错误");
Assert.notNull(endDate, "格式错误");
return endDate.getTime() - startDate.getTime();
}
/* ------- end ------------ */
/**
* 计算两个日期之间相差的天数
*
* @param startDate
* @param endDate
* @return
*/
public static final int getDifferenceDays(Date startDate, Date endDate) {
return Double.valueOf(getDifferenceMillis(startDate, endDate) / (NANO_ONE_DAY)).intValue();
}
/**
* 计算两个日期之间相差的的毫秒数
*
* @param startDateStr yyyy-mm-dd
* @param endDateStr yyyy-mm-dd
* @return
* @throws java.text.ParseException
*/
public static final long getDifferenceMillis(String startDateStr, String endDateStr) {
return getDifferenceMillis(startDateStr, endDateStr, SHORT_DATE_FORMAT);
}
/**
* 计算两个日期之间相差的的毫秒数
*
* @param startDateStr yyyyMMddHHmmss
* @param endDateStr yyyyMMddHHmmss
* @return
* @throws java.text.ParseException
*/
public static final long getDifferenceMillis2(String startDateStr, String endDateStr) {
return getDifferenceMillis(startDateStr, endDateStr, MAIL_DATE_FORMAT);
}
/**
* 计算两个日期之间相差的的毫秒数
*
* @param startDateStr
* @param endDateStr
* @param dateFormat
* @return
*/
public static final long getDifferenceMillis(String startDateStr, String endDateStr, String dateFormat) {
try {
return getDifferenceMillis(parser(startDateStr, dateFormat), parser(endDateStr, dateFormat));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
/**
* 计算两个日期之间相差的的毫秒数
*
* @param startDate
* @param endDate
* @return
*/
public static final long getDifferenceMillis(Date startDate, Date endDate) {
Assert.notNull(startDate, "格式错误");
Assert.notNull(endDate, "格式错误");
return Math.abs(endDate.getTime() - startDate.getTime());
}
/**
* 检验 日期是否在指定区间内,如果格式错误,返回false
* 如果maxDateStr或minDateStr为空则比较时变为正负无穷大,如果都为空,则返回false
*
* @param aDate
* @param minDateStr 必须是yyyy-MM-dd格式,时分秒为00:00:00
* @param maxDateStr 必须是yyyy-MM-dd格式,时分秒为00:00:00
* @return
*/
public static final boolean isDateBetween(Date aDate, String minDateStr, String maxDateStr) {
Assert.notNull(aDate, "格式错误");
boolean ret = false;
try {
Date dMaxDate = null;
Date dMinDate = null;
dMaxDate = parseShortDateString(maxDateStr);
dMinDate = parseShortDateString(minDateStr);
switch ((dMaxDate != null ? 5 : 3) + (dMinDate != null ? 1 : 0)) {
case 6:
ret = aDate.before(dMaxDate) && aDate.after(dMinDate);
break;
case 5:
ret = aDate.before(dMaxDate);
break;
case 4:
ret = aDate.after(dMinDate);
break;
}
} catch (ParseException e) {
log.warn("isDateBetween parse failed", e);
}
return ret;
}
/**
* 计算某日期所在月份的天数
*
* @param aDateStr yyyy-mm-dd
* @return
*/
public static final int getDaysInMonth(String aDateStr) {
DateValidator.checkShortDateStr(aDateStr);
try {
return getDaysInMonth(parseShortDateString(aDateStr));
} catch (ParseException e) {
log.warn("getDaysInMonth parse failed", e);
throw new RuntimeException(e);
}
}
/**
* 计算某日期所在月份的天数
*
* @param aDate
* @return
*/
public static final int getDaysInMonth(Date aDate) {
Assert.notNull(aDate, "日期入参不能为空");
Calendar cal = Calendar.getInstance();
cal.setTime(aDate);
return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* yyyyMM
*
* @param aDate
* @return
*/
public static final int getYearAndMonth(Date aDate) {
return Integer.parseInt(toMailDateDtPartString(aDate).substring(0, 6));
}
/**
* @param date
* @return
*/
public static Date getPreviousMonthFirst(Date date) {
Calendar lastDate = new GregorianCalendar();
lastDate.setTime(date);
lastDate.set(5, 1);
lastDate.add(2, -1);
lastDate.set(Calendar.HOUR_OF_DAY, 0);
lastDate.set(Calendar.MINUTE, 0);
lastDate.set(Calendar.SECOND, 0);
return lastDate.getTime();
}
public static Date getMonthFirst(Date date){
Calendar lastDate = new GregorianCalendar();
lastDate.setTime(date);
lastDate.set(5, 1);
lastDate.set(Calendar.HOUR_OF_DAY, 0);
lastDate.set(Calendar.MINUTE, 0);
lastDate.set(Calendar.SECOND, 0);
lastDate.set(Calendar.MILLISECOND,0);
return lastDate.getTime();
}
/**
* 获取指定天的Date格式
*
* @param dd dd格式天
* @param monthOffSet 月份偏移量
* @return
*/
public static Date getAssignDate(String dd, Integer monthOffSet) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, monthOffSet);
calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dd));
return calendar.getTime();
}
/**
* @param date
* @return
* @throws java.text.ParseException
*/
public static Date getPreviousMonthEnd(Date date) throws ParseException {
Calendar lastDate = new GregorianCalendar();
lastDate.setTime(date);
lastDate.add(2, -1);
lastDate.set(5, 1);
lastDate.roll(5, -1);
lastDate.set(Calendar.HOUR_OF_DAY, 23);
lastDate.set(Calendar.MINUTE, 59);
lastDate.set(Calendar.SECOND, 59);
return lastDate.getTime();
}
public static Date getMonthEnd(Date date){
Calendar lastDate = new GregorianCalendar();
lastDate.setTime(date);
lastDate.set(5, 1);
lastDate.roll(5, -1);
lastDate.set(Calendar.HOUR_OF_DAY, 23);
lastDate.set(Calendar.MINUTE, 59);
lastDate.set(Calendar.SECOND, 59);
lastDate.set(Calendar.MILLISECOND,999);
return lastDate.getTime();
}
/**
* 获取小
*
* @return
*/
public static Date getTodayBegin() {
Calendar now = Calendar.getInstance();
now.set(Calendar.HOUR_OF_DAY, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
return now.getTime();
}
/**
* 获取某天的开始时间
*
* @param someDay
* @return
*/
public static Date getOneDayBegin(Date someDay) {
if (someDay == null) {
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(someDay);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
return cal.getTime();
}
public static Date getOneDayBegin(String someDay, String format) throws ParseException {
return getOneDayBegin(parser(someDay, format));
}
/**
* 获取当天末尾时间
*
* @return
*/
public static Date getTodayEnd() {
Calendar now = Calendar.getInstance();
now.set(Calendar.HOUR_OF_DAY, 23);
now.set(Calendar.MINUTE, 59);
now.set(Calendar.SECOND, 59);
return now.getTime();
}
/**
* 获取某天的末尾时间
*
* @param someDay
* @return
*/
public static Date getOneDayEnd(Date someDay) {
if (someDay == null) {
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(someDay);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
return cal.getTime();
}
public static Date getOneDayEnd2(Date someDay) {
if (someDay == null) {
return null;
}
Calendar cal = Calendar.getInstance();
cal.setTime(someDay);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND,999);
return cal.getTime();
}
/**
* 获取指定月日的日期
*
* @param date
* @param monthNum
* @param dayNum
* @return
*/
public static Date getSpecifyDate(Date date, Integer monthNum, Integer dayNum) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, monthNum);
calendar.set(Calendar.DAY_OF_MONTH, dayNum);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
/**
* 获取推迟或者提前几周指定的星期的日期
*
* @param weekNum
* @param weekDay
* @return
*/
public static Date getSpecifyWeekDate(Integer weekNum, Integer weekDay) {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, weekNum * 7);
calendar.add(Calendar.DAY_OF_WEEK, weekDay);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date date = calendar.getTime();
return date;
}
/**
* 昨天的开始时间
*
* @return
*/
public static Date startOfyesterday() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.DATE, -1);
calendar.set(Calendar.MILLISECOND, 0);
Date date = calendar.getTime();
return date;
}
/**
* 昨天的结束时间
*
* @return
*/
public static Date endOfyesterday() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
calendar.add(Calendar.DATE, -1);
Date date = calendar.getTime();
return date;
}
/**
* 获得一个日期的field部分
*
* @param field
* @param aDate
* @return
*/
public static int getFieldOfDate(int field, Date aDate) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(aDate);
return calendar.get(field);
}
/**
* @param strDate
* @param strDateBegin
* @param strDateEnd
* @return
* @throws java.text.ParseException
*/
public static boolean isInDates(String strDate, String strDateBegin, String strDateEnd) throws ParseException {
SimpleDateFormat sd = new SimpleDateFormat(LONG_DATE_TM_PART_FORMAT);
Date myDate = sd.parse(strDate);
Date dateBegin = sd.parse(strDateBegin);
Date dateEnd = sd.parse(strDateEnd);
strDate = String.valueOf(myDate);
strDateBegin = String.valueOf(dateBegin);
strDateEnd = String.valueOf(dateEnd);
int strDateH = Integer.parseInt(strDate.substring(11, 13));
int strDateM = Integer.parseInt(strDate.substring(14, 16));
int strDateS = Integer.parseInt(strDate.substring(17, 19));
int strDateBeginH = Integer.parseInt(strDateBegin.substring(11, 13));
int strDateBeginM = Integer.parseInt(strDateBegin.substring(14, 16));
int strDateBeginS = Integer.parseInt(strDateBegin.substring(17, 19));
int strDateEndH = Integer.parseInt(strDateEnd.substring(11, 13));
int strDateEndM = Integer.parseInt(strDateEnd.substring(14, 16));
int strDateEndS = Integer.parseInt(strDateEnd.substring(17, 19));
if ((strDateH >= strDateBeginH && strDateH <= strDateEndH)) {
if (strDateH > strDateBeginH && strDateH < strDateEndH) {
return true;
} else if (strDateH == strDateBeginH && strDateM > strDateBeginM && strDateH < strDateEndH) {
return true;
} else if (strDateH == strDateBeginH && strDateM == strDateBeginM && strDateS > strDateBeginS && strDateH < strDateEndH) {
return true;
} else if (strDateH == strDateBeginH && strDateM == strDateBeginM && strDateS == strDateBeginS && strDateH < strDateEndH) {
return true;
} else if (strDateH > strDateBeginH && strDateH == strDateEndH && strDateM < strDateEndM) {
return true;
} else if (strDateH > strDateBeginH && strDateH == strDateEndH && strDateM == strDateEndM && strDateS < strDateEndS) {
return true;
} else if (strDateH > strDateBeginH && strDateH == strDateEndH && strDateM == strDateEndM && strDateS == strDateEndS) {
return true;
} else {
return false;
}
} else {
return false;
}
}
public static Date getNextDate(Date now, int next, int dateField) {
Calendar c = Calendar.getInstance();
c.setTime(now);
c.add(dateField, next);
return c.getTime();
}
/**
* 把任意格式的字符串日期转化为日期
*
* @param date
* @return
*/
public static Date parse(String date) {
Date result;
String parse = date.replaceFirst("[0-9]{4}([^0-9]?)", "yyyy$1");
parse = parse.replaceFirst("^[0-9]{2}([^0-9]?)", "yy$1");
parse = parse.replaceFirst("([^0-9]?)[0-9]{1,2}([^0-9]?)", "$1MM$2");
parse = parse.replaceFirst("([^0-9]?)[0-9]{1,2}( ?)", "$1dd$2");
parse = parse.replaceFirst("( )[0-9]{1,2}([^0-9]?)", "$1HH$2");
parse = parse.replaceFirst("([^0-9]?)[0-9]{1,2}([^0-9]?)", "$1mm$2");
parse = parse.replaceFirst("([^0-9]?)[0-9]{1,2}([^0-9]?)", "$1ss$2");
SimpleDateFormat format = new SimpleDateFormat(parse);
try {
result = format.parse(date);
} catch (ParseException e) {
e.printStackTrace();
result = null;
}
return result;
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/date/DateValidator.java
================================================
package com.mcoding.base.common.util.date;
import cn.hutool.core.lang.Assert;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.text.ParseException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author mazehong
* @date 2020/3/3
*/
@Slf4j
@UtilityClass
public class DateValidator {
/**
* 利用正则表达式检查是否完整匹配
*
* @param text
* @param reg
* @return
*/
public static final boolean isMatch(String text, String reg) {
if (StringUtils.isNotEmpty(text) && StringUtils.isNotBlank(reg)) {
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(text);
return m.matches();
}
return false;
}
/**
* 判断字串是否符合yyyy-MM-dd HH:mm:ss格式
*
* @param aDateStr
* @return
*/
public static final boolean isLongDateStr(String aDateStr) {
try {
DateUtils.parseLongDateString(aDateStr);
} catch (ParseException e) {
return false;
}
return true;
}
/**
* 判断字串是否符合yyyy-MM-dd格式
*
* @param aDateStr
* @return
*/
public static final boolean isShortDateStr(String aDateStr) {
try {
DateUtils.parseShortDateString(aDateStr);
} catch (ParseException e) {
return false;
}
return true;
}
/**
* 判断字串是否符合yyyyMMdd格式
*
* @param aDateStr
* @return
*/
public static final boolean isMailDateDtPartStr(String aDateStr) {
try {
DateUtils.parseMailDateDtPartString(aDateStr);
} catch (ParseException e) {
return false;
}
return true;
}
/**
* 判断字串是否符合指定的日期格式
*
* @param aDateStr
* @param formatter
* @return
*/
public static final boolean isDateStrMatched(String aDateStr, String formatter) {
try {
DateUtils.parser(aDateStr, formatter);
} catch (ParseException e) {
return false;
}
return true;
}
/**
* 检查字串是否符合yyyy-MM-dd格式
*
* @param aDateStr
*/
public static final void checkShortDateStr(String aDateStr) {
Assert.isTrue(isShortDateStr(aDateStr), "The str-'" + aDateStr + "' must match 'yyyy-MM-dd' format.");
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/encryption/Md5Utils.java
================================================
package com.mcoding.base.common.util.encryption;
import com.alibaba.fastjson.JSON;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5Utils {
private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7",
"8", "9", "a", "b", "c", "d", "e", "f"};
public static String md5Object(Object object) throws NoSuchAlgorithmException, UnsupportedEncodingException {
if (object == null) {
return "md5_null";
}
return md5Encode(JSON.toJSONString(object));
}
/**
* MD5编码
*
* @param origin 原始字符串
* @return 经过MD5加密之后的结果
* @throws NoSuchAlgorithmException
* @throws UnsupportedEncodingException
*/
public static String md5Encode(String origin) throws NoSuchAlgorithmException, UnsupportedEncodingException {
String resultString = null;
resultString = origin;
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(resultString.getBytes("UTF-8"));
resultString = byteArrayToHexString(md.digest());
return resultString;
}
/**
* 转换字节数组为16进制字串
*
* @param b 字节数组
* @return 16进制字串
*/
public static String byteArrayToHexString(byte[] b) {
StringBuilder resultSb = new StringBuilder();
for (byte aB : b) {
resultSb.append(byteToHexString(aB));
}
return resultSb.toString();
}
/**
* 转换byte到16进制
*
* @param b 要转换的byte
* @return 16进制格式
*/
private static String byteToHexString(byte b) {
int n = b;
if (n < 0) {
n = 256 + n;
}
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/ExcelProperty.java
================================================
package com.mcoding.base.common.util.excel;
import com.mcoding.base.common.util.excel.converter.ObjToStrConverter;
import java.lang.annotation.*;
/**
* @author wzt on 2020/2/12.
* @version 1.0
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface ExcelProperty {
String title();
Class<? extends ObjToStrConverter> objToStrConverter() default ObjToStrConverter.class;
}
================================================
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/ExcelUtils.java
================================================
package com.mcoding.base.common.util.excel;
import cn.hutool.core.util.ReflectUtil;
import com.mcoding.base.common.util.excel.converter.ConverterFactory;
import com.mcoding.base.common.util.excel.converter.ObjToStrConverter;
import com.mcoding.base.common.util.excel.converter.StrToObjConverter;
import com.mcoding.base.common.util.reflect.ReflectUtils;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.write.*;
import jxl.write.biff.RowsExceededException;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
/**
* excel导入导出工具
*
* @author hzy
*/
public class ExcelUtils {
/**
* 把数据导出到excel表
*
* @param os excel表的导出 流
* @param recordClass 拥有元数据信息的类
* @param data 导出的数据
* @param sheetTitle title名
* @param sheetIndex title的索引 表示在第几行
* @return
* @throws IOException
* @throws WriteException
* @throws RowsExceededException
* @throws ParseException
*/
public static WritableWorkbook exportDataToExcel(OutputStream os,
Class<?> recordClass, List<? extends Object> data, String sheetTitle,
String headTitle, int sheetIndex) throws Exception {
List<TitleAndModelKey> titleAndModelKeys = createTitleAndModelKeyList(recordClass);
return exportDataToExcel(os, titleAndModelKeys, data, sheetTitle, headTitle, sheetIndex, null);
}
/**
* 把数据导出到excel表
*
* @param os excel表的导出 流
* @param titleAndModelKeys 表头与数据的关联,不能为空。例如:{ {"序号", "id"}}, “序号”是导出的excel表的表头,“id”是导入data数据的key
* @param data 导出的数据
* @param sheetTitle title名
* @param sheetIndex sheet的索引
* @param writeablebook 工作表
* @return
* @throws IOException
* @throws WriteException
* @throws RowsExceededException
* @throws ParseException
*/
@SuppressWarnings("unchecked")
private static WritableWorkbook exportDataToExcel(OutputStream os,
List<TitleAndModelKey> titleAndModelKeys, List<? extends Object> data, String sheetTitle,
String headTitle, int sheetIndex, WritableWorkbook writeablebook) throws Exception {
// 准备设置excel工作表的标题
if (writeablebook == null) {
writeablebook = Workbook.createWorkbook(os);
}
// 添加第一个工作表并设置第一个Sheet的名字
WritableSheet sheet = writeablebook.createSheet(sheetTitle, sheetIndex);
int headTitleRowIndex = 0;
int titleRowIndex = 1;
WritableCellFormat defaultHeadTitleFormat = new WritableCellFormat(new WritableFont(WritableFont.createFont("微软雅黑"), 12, WritableFont.BOLD));
if (StringUtils.isNotBlank(headTitle)) {
/**默认的标题格式**/
defaultHeadTitleFormat.setAlignment(Alignment.CENTRE); // 设置水平居中对齐
Label headLabel = new Label(0, headTitleRowIndex, headTitle, defaultHeadTitleFormat); // 标题1列0行
headLabel.setCellFormat(new WritableCellFormat(NumberFormats.TEXT));
sheet.mergeCells(0, headTitleRowIndex, titleAndModelKeys.size() - 1, headTitleRowIndex); // 标题头合并单元格 0列0行10列0行
sheet.addCell(headLabel);
} else {
titleRowIndex = 0;
}
// 设置字体
for (int i = 0; i < titleAndModelKeys.size(); i++) {
WritableCellFormat titleFormat = titleAndModelKeys.get(i).getTitleFormat();
if (titleFormat == null) {
titleFormat = new WritableCellFormat(new WritableFont(WritableFont.createFont("微软雅黑"), 12));
titleFormat.setBackground(jxl.format.Colour.GRAY_25); // 设置背景颜色
titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN, jxl.
gitextract_d6am_5fj/ ├── .gitignore ├── LICENSE ├── README.md ├── _docs/ │ └── fish_mysql.sql ├── applet/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── mcoding/ │ │ └── applet/ │ │ ├── AppletApplication.java │ │ ├── auth/ │ │ │ ├── AppAuthController.java │ │ │ ├── WechatAuthController.java │ │ │ ├── base/ │ │ │ │ ├── LoginRequired.java │ │ │ │ ├── LoginRequiredArgumentResolver.java │ │ │ │ └── config/ │ │ │ │ ├── AuthConfig.java │ │ │ │ ├── AuthInterceptor.java │ │ │ │ └── LoginRequiredConfig.java │ │ │ ├── business/ │ │ │ │ ├── RegisterBo.java │ │ │ │ ├── UserInfoBo.java │ │ │ │ └── resp/ │ │ │ │ ├── AccessTokenRespEntity.java │ │ │ │ ├── JsCode2SessionRespEntity.java │ │ │ │ └── WxCodeUnlimitedResponse.java │ │ │ ├── dao/ │ │ │ │ └── BaseUserTokenMapper.java │ │ │ ├── dto/ │ │ │ │ ├── BindingStoreDto.java │ │ │ │ ├── CreateUserDto.java │ │ │ │ ├── PhoneNumberDto.java │ │ │ │ └── RegisterDto.java │ │ │ ├── entity/ │ │ │ │ └── BaseUserToken.java │ │ │ ├── manager/ │ │ │ │ ├── WechatClient.java │ │ │ │ └── impl/ │ │ │ │ └── WechatClientImpl.java │ │ │ ├── service/ │ │ │ │ ├── BaseUserTokenService.java │ │ │ │ ├── WechatAuthService.java │ │ │ │ └── impl/ │ │ │ │ ├── BaseUserTokenServiceImpl.java │ │ │ │ └── WechatAuthServiceImpl.java │ │ │ └── util/ │ │ │ └── LoginUserUtils.java │ │ └── order/ │ │ └── component/ │ │ ├── ActivityCodeController.java │ │ ├── ActivityOrderBizCodeGenerator.java │ │ └── TargetCodeEnum.java │ └── resources/ │ ├── application-dev.properties │ ├── application-prd.properties │ ├── application.properties │ ├── logback-spring.xml │ └── prop/ │ └── redisson-dev.yaml ├── backend/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── mcoding/ │ │ ├── BackendApplication.java │ │ └── modular/ │ │ ├── auth/ │ │ │ ├── config/ │ │ │ │ ├── AuthConfig.java │ │ │ │ ├── AuthInterceptor.java │ │ │ │ └── LoginRequiredConfig.java │ │ │ ├── controller/ │ │ │ │ └── AppAuthController.java │ │ │ └── support/ │ │ │ ├── LoginRequired.java │ │ │ ├── LoginRequiredArgumentResolver.java │ │ │ └── LoginUserUtils.java │ │ ├── biz/ │ │ │ └── user/ │ │ │ └── controller/ │ │ │ ├── BizUserController.java │ │ │ └── UserDataListener.java │ │ ├── rule/ │ │ │ ├── ACmp.java │ │ │ ├── BCmp.java │ │ │ ├── BizFlow.java │ │ │ ├── CCmp.java │ │ │ └── RuleFlowController.java │ │ ├── search/ │ │ │ ├── controller/ │ │ │ │ └── ProductSpuController.java │ │ │ ├── dao/ │ │ │ │ └── ProductSpuMapper.java │ │ │ ├── entity/ │ │ │ │ └── ProductSpu.java │ │ │ └── service/ │ │ │ ├── ProductSpuService.java │ │ │ └── impl/ │ │ │ └── ProductSpuServiceImpl.java │ │ ├── system/ │ │ │ └── user/ │ │ │ ├── controller/ │ │ │ │ └── SysUserController.java │ │ │ ├── dao/ │ │ │ │ └── SysUserMapper.java │ │ │ ├── entity/ │ │ │ │ └── SysUser.java │ │ │ └── service/ │ │ │ ├── SysUserService.java │ │ │ └── impl/ │ │ │ └── SysUserServiceImpl.java │ │ └── tech/ │ │ └── job/ │ │ ├── ActivityStatusUpdateJob.java │ │ └── config/ │ │ ├── XxlJobConfig.java │ │ └── XxlJobPropertiesConfig.java │ └── resources/ │ ├── application-dev.properties │ ├── application.properties │ ├── config/ │ │ └── flow.el.xml │ ├── logback-spring.xml │ ├── prop/ │ │ └── redisson-dev.yaml │ └── template/ │ └── UserTemplate.ftl ├── base-common/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── mcoding/ │ └── base/ │ └── common/ │ ├── exception/ │ │ ├── BizException.java │ │ ├── CommonException.java │ │ └── SysException.java │ ├── pattern/ │ │ ├── command/ │ │ │ ├── CommandInvoker.java │ │ │ ├── ICommand.java │ │ │ └── ICommandInvoker.java │ │ ├── filterchain/ │ │ │ ├── Filter.java │ │ │ ├── FilterContext.java │ │ │ └── Target.java │ │ └── pipeline/ │ │ ├── Pipeline.java │ │ ├── StandardPipeline.java │ │ └── Value.java │ └── util/ │ ├── Assert.java │ ├── bean/ │ │ └── BeanMapperUtils.java │ ├── collection/ │ │ └── MapUtils.java │ ├── constant/ │ │ ├── MdcConstants.java │ │ └── SysConstants.java │ ├── date/ │ │ ├── DateTimeUtils.java │ │ ├── DateUtils.java │ │ └── DateValidator.java │ ├── encryption/ │ │ └── Md5Utils.java │ ├── excel/ │ │ ├── ExcelProperty.java │ │ ├── ExcelUtils.java │ │ ├── TitleAndModelKey.java │ │ └── converter/ │ │ ├── BigDecimalConverter.java │ │ ├── ConverterFactory.java │ │ ├── DateConverter.java │ │ ├── IntegerConverter.java │ │ ├── LongConverter.java │ │ ├── ObjToStrConverter.java │ │ ├── StrToObjConverter.java │ │ └── YesOrNoIntegerConverter.java │ ├── id/ │ │ ├── IdGenerator.java │ │ └── RandomIdGenerator.java │ ├── image/ │ │ ├── ImageUtils.java │ │ └── ImageWatermarkUtils.java │ ├── math/ │ │ ├── BigDecimalUtils.java │ │ ├── BigDecimalWrapper.java │ │ ├── NumberMoneyConvertUtil.java │ │ └── RMBUtil.java │ ├── pdf/ │ │ └── FtlToPdfUtil.java │ ├── reflect/ │ │ └── ReflectUtils.java │ └── wechat/ │ ├── AES.java │ ├── WXBizDataCrypt.java │ ├── WxUserInfo.java │ └── WxWaterMark.java ├── base-core/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── mcoding/ │ └── base/ │ └── core/ │ ├── cache/ │ │ ├── RCacheAspect.java │ │ ├── RCacheEvict.java │ │ └── RCacheable.java │ ├── config/ │ │ ├── ControllerConfig.java │ │ ├── EsClientConfig.java │ │ ├── FilterConfig.java │ │ ├── JavaSimonConfig.java │ │ ├── MybatisPlusConfig.java │ │ └── SwaggerConfig.java │ ├── doc/ │ │ ├── EventNode.java │ │ ├── EventNodeContainer.java │ │ ├── EventNodeStack.java │ │ ├── EventTraceAspect.java │ │ ├── Phase.java │ │ ├── Process.java │ │ ├── Step.java │ │ ├── controller/ │ │ │ ├── DocumentController.java │ │ │ ├── TreeBuilder.java │ │ │ └── dto/ │ │ │ └── TreeNode.java │ │ └── filter/ │ │ └── MethodInvokeTreeFiler.java │ ├── http/ │ │ └── HttpComponentConfig.java │ ├── log/ │ │ ├── MdcAspect.java │ │ ├── MdcLog.java │ │ ├── MybatisLogImpl.java │ │ ├── TraceRequestFiler.java │ │ └── WebLogAspect.java │ ├── orm/ │ │ ├── DslParser.java │ │ ├── Keyword.java │ │ ├── Like.java │ │ ├── MetaModelField.java │ │ ├── MetaModelUtils.java │ │ ├── OprEnum.java │ │ ├── OrderByAsc.java │ │ ├── OrderByDesc.java │ │ ├── ParseHandler.java │ │ ├── ParseOrderByCondHandler.java │ │ ├── ParsePageHandler.java │ │ ├── ParseSearchCondHandler.java │ │ ├── ParseWhereCondHandler.java │ │ ├── ParserContext.java │ │ ├── QueryKeyWord.java │ │ └── WhereCondition.java │ ├── rate/ │ │ └── RateLimitFilter.java │ ├── rest/ │ │ ├── BoolObject.java │ │ ├── IdObject.java │ │ ├── PageView.java │ │ ├── ResponseCode.java │ │ └── ResponseResult.java │ └── spring/ │ ├── AopUtils.java │ ├── GglibBeanMap.java │ └── SpringContextHolder.java ├── base-generator/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── mcoding/ │ │ └── base/ │ │ └── generator/ │ │ └── CodeGenerator.java │ └── resources/ │ └── templates/ │ └── mybatis-plus/ │ ├── controller.java.ftl │ └── entity.java.ftl ├── biz-component/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com.mcoding.base.component/ │ │ ├── ComponentApplication.java │ │ ├── generatecode/ │ │ │ ├── dao/ │ │ │ │ └── BaseGenerateCodeDao.java │ │ │ ├── domain/ │ │ │ │ └── CommonBizCodeGenerator.java │ │ │ ├── entity/ │ │ │ │ └── BaseGenerateCode.java │ │ │ ├── service/ │ │ │ │ ├── BaseGenerateCodeService.java │ │ │ │ └── impl/ │ │ │ │ └── BaseGenerateCodeServiceImpl.java │ │ │ └── strategy/ │ │ │ ├── AutoIncrementStrategy.java │ │ │ ├── DateIncrementStrategy.java │ │ │ └── GenerateStrategy.java │ │ └── shorturl/ │ │ ├── controller/ │ │ │ └── ShortUrlController.java │ │ └── domain/ │ │ └── ShortUrlGenerator.java │ └── resources/ │ ├── application-dev.properties │ ├── application.properties │ └── prop/ │ └── redisson-dev.yaml ├── biz-user/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── com/ │ └── mcoding/ │ └── base/ │ └── user/ │ ├── dao/ │ │ └── BaseUserMapper.java │ ├── entity/ │ │ └── BaseUser.java │ └── service/ │ ├── BaseUserService.java │ └── impl/ │ └── BaseUserServiceImpl.java └── pom.xml
SYMBOL INDEX (653 symbols across 158 files)
FILE: _docs/fish_mysql.sql
type `base_generate_code` (line 18) | CREATE TABLE `base_generate_code` (
type `base_user` (line 43) | CREATE TABLE `base_user` (
type `base_user_token` (line 82) | CREATE TABLE `base_user_token` (
type `sys_user` (line 102) | CREATE TABLE `sys_user` (
FILE: applet/src/main/java/com/mcoding/applet/AppletApplication.java
class AppletApplication (line 9) | @EnableRedissonHttpSession
method main (line 15) | public static void main(String[] args) {
FILE: applet/src/main/java/com/mcoding/applet/auth/AppAuthController.java
class AppAuthController (line 26) | @Slf4j
method register (line 31) | @Process(comment = "IOS用户注册")
FILE: applet/src/main/java/com/mcoding/applet/auth/WechatAuthController.java
class WechatAuthController (line 41) | @Slf4j
method getPhoneNumber (line 59) | @ApiOperation("小程序获取用户手机号码")
method register (line 73) | @Process(comment = "小程序用户注册")
method loginByJsCode (line 104) | @Process(comment = "小程序用户登录")
method login (line 135) | @ApiOperation("获取测试token[后端测试使用]")
FILE: applet/src/main/java/com/mcoding/applet/auth/base/LoginRequiredArgumentResolver.java
class LoginRequiredArgumentResolver (line 15) | @Slf4j
method supportsParameter (line 18) | @Override
method resolveArgument (line 24) | @Override
FILE: applet/src/main/java/com/mcoding/applet/auth/base/config/AuthConfig.java
class AuthConfig (line 12) | @Configuration
method addInterceptors (line 15) | @Override
method addResourceHandlers (line 30) | @Override
FILE: applet/src/main/java/com/mcoding/applet/auth/base/config/AuthInterceptor.java
class AuthInterceptor (line 22) | @Slf4j
method preHandle (line 25) | @Override
method afterCompletion (line 46) | @Override
method write (line 52) | private void write(HttpServletResponse response, ResponseResult<String...
FILE: applet/src/main/java/com/mcoding/applet/auth/base/config/LoginRequiredConfig.java
class LoginRequiredConfig (line 13) | @Component
method addArgumentResolvers (line 16) | @Override
FILE: applet/src/main/java/com/mcoding/applet/auth/business/RegisterBo.java
class RegisterBo (line 13) | @ApiModel("注册用户信息")
FILE: applet/src/main/java/com/mcoding/applet/auth/business/UserInfoBo.java
class UserInfoBo (line 9) | @Data
FILE: applet/src/main/java/com/mcoding/applet/auth/business/resp/AccessTokenRespEntity.java
class AccessTokenRespEntity (line 9) | @Data
FILE: applet/src/main/java/com/mcoding/applet/auth/business/resp/JsCode2SessionRespEntity.java
class JsCode2SessionRespEntity (line 9) | @Data
FILE: applet/src/main/java/com/mcoding/applet/auth/business/resp/WxCodeUnlimitedResponse.java
class WxCodeUnlimitedResponse (line 9) | @Data
FILE: applet/src/main/java/com/mcoding/applet/auth/dao/BaseUserTokenMapper.java
type BaseUserTokenMapper (line 14) | public interface BaseUserTokenMapper extends BaseMapper<BaseUserToken> {
FILE: applet/src/main/java/com/mcoding/applet/auth/dto/BindingStoreDto.java
class BindingStoreDto (line 10) | @Data
FILE: applet/src/main/java/com/mcoding/applet/auth/dto/CreateUserDto.java
class CreateUserDto (line 12) | @Data
FILE: applet/src/main/java/com/mcoding/applet/auth/dto/PhoneNumberDto.java
class PhoneNumberDto (line 10) | @AllArgsConstructor
FILE: applet/src/main/java/com/mcoding/applet/auth/dto/RegisterDto.java
class RegisterDto (line 13) | @ApiModel("注册用户信息")
FILE: applet/src/main/java/com/mcoding/applet/auth/entity/BaseUserToken.java
class BaseUserToken (line 23) | @Data
FILE: applet/src/main/java/com/mcoding/applet/auth/manager/WechatClient.java
type WechatClient (line 10) | public interface WechatClient {
method getUserInfoByCode (line 18) | UserInfoBo getUserInfoByCode(String code);
method getAccessToken (line 25) | String getAccessToken();
method evictAccessToken (line 32) | String evictAccessToken();
method getwxacode (line 44) | byte[] getwxacode(String accessToken, String page, String scene, int w...
FILE: applet/src/main/java/com/mcoding/applet/auth/manager/impl/WechatClientImpl.java
class WechatClientImpl (line 30) | @Slf4j
method getUserInfoByCode (line 43) | @Phase(comment = "根据jscode获取用户信息")
method getAccessToken (line 65) | @Phase(comment = "获取小程序access_token")
method evictAccessToken (line 82) | @RCacheEvict(key = "dmt::wechat::global::AccessToken")
method getwxacode (line 88) | @Phase(comment = "调用微信服务,生成二维码字节流")
method buildGetwxacodeUrl (line 119) | private String buildGetwxacodeUrl(String accessToken) {
method buildAccessTokenUrl (line 123) | private String buildAccessTokenUrl() {
method buildJscode2sessionUrl (line 128) | private String buildJscode2sessionUrl(String jsCode) {
FILE: applet/src/main/java/com/mcoding/applet/auth/service/BaseUserTokenService.java
type BaseUserTokenService (line 14) | public interface BaseUserTokenService extends IService<BaseUserToken> {
method saveNewToken (line 22) | void saveNewToken(int userId, String newToken);
method getToken (line 30) | String getToken(int userId);
FILE: applet/src/main/java/com/mcoding/applet/auth/service/WechatAuthService.java
type WechatAuthService (line 13) | public interface WechatAuthService {
method register (line 22) | RegisterBo register(BaseUser currentUser, CreateUserDto createUserDto,...
method login (line 32) | RegisterBo login(BaseUser persistenceUser, UserInfoBo userInfoBo, Stri...
method login (line 39) | RegisterBo login(String openId, String token);
method getUserToken (line 47) | RegisterBo getUserToken(String token);
method invalidUserToken (line 54) | void invalidUserToken(String token);
FILE: applet/src/main/java/com/mcoding/applet/auth/service/impl/BaseUserTokenServiceImpl.java
class BaseUserTokenServiceImpl (line 26) | @Slf4j
method saveNewToken (line 30) | @Phase(comment = "保存新token")
method getToken (line 51) | @Override
FILE: applet/src/main/java/com/mcoding/applet/auth/service/impl/WechatAuthServiceImpl.java
class WechatAuthServiceImpl (line 27) | @Service
method register (line 33) | @Phase(comment = "注册用户到DMT系统")
method login (line 61) | @Phase(comment = "用户登录DMT系统")
method login (line 74) | @RCacheable(key = "dmt::miniprogram::token", secKey = "#token", ttl = ...
method getUserToken (line 88) | @RCacheable(key = "dmt::miniprogram::token", secKey = "#token", resetT...
method invalidUserToken (line 94) | @Phase(comment = "失效用户token")
FILE: applet/src/main/java/com/mcoding/applet/auth/util/LoginUserUtils.java
class LoginUserUtils (line 10) | public class LoginUserUtils {
method binding (line 14) | public static void binding(RegisterBo registerBo) {
method getRegisterBo (line 18) | public static RegisterBo getRegisterBo() {
method getUserId (line 22) | public static Integer getUserId() {
method getToken (line 26) | public static String getToken() {
method getSessionKey (line 30) | public static String getSessionKey() {
method remove (line 34) | public static void remove() {
FILE: applet/src/main/java/com/mcoding/applet/order/component/ActivityCodeController.java
class ActivityCodeController (line 24) | @Slf4j
method generateBizCode (line 32) | @Monitored
method generateBizCodeList (line 48) | @Monitored
FILE: applet/src/main/java/com/mcoding/applet/order/component/ActivityOrderBizCodeGenerator.java
class ActivityOrderBizCodeGenerator (line 14) | @Component
method ActivityOrderBizCodeGenerator (line 17) | public ActivityOrderBizCodeGenerator() {
method generateNextCode (line 22) | @Override
method generateBizCodeList (line 27) | @Override
FILE: applet/src/main/java/com/mcoding/applet/order/component/TargetCodeEnum.java
type TargetCodeEnum (line 7) | public enum TargetCodeEnum {
method TargetCodeEnum (line 15) | TargetCodeEnum(String targetCode, String desc) {
method getTargetCode (line 20) | public String getTargetCode() {
method getDesc (line 24) | public String getDesc() {
FILE: backend/src/main/java/com/mcoding/BackendApplication.java
class BackendApplication (line 9) | @EnableRedissonHttpSession
method main (line 15) | public static void main(String[] args) {
FILE: backend/src/main/java/com/mcoding/modular/auth/config/AuthConfig.java
class AuthConfig (line 12) | @Configuration
method addInterceptors (line 15) | @Override
method addResourceHandlers (line 29) | @Override
FILE: backend/src/main/java/com/mcoding/modular/auth/config/AuthInterceptor.java
class AuthInterceptor (line 18) | @Slf4j
method preHandle (line 21) | @Override
method write (line 34) | private void write(HttpServletResponse response, ResponseResult<String...
FILE: backend/src/main/java/com/mcoding/modular/auth/config/LoginRequiredConfig.java
class LoginRequiredConfig (line 13) | @Component
method addArgumentResolvers (line 16) | @Override
FILE: backend/src/main/java/com/mcoding/modular/auth/controller/AppAuthController.java
class AppAuthController (line 26) | @Api(tags = "业务-鉴权服务")
method login (line 33) | @Monitored
method whoAmI (line 53) | @Monitored
FILE: backend/src/main/java/com/mcoding/modular/auth/support/LoginRequiredArgumentResolver.java
class LoginRequiredArgumentResolver (line 16) | @Slf4j
method supportsParameter (line 19) | @Override
method resolveArgument (line 25) | @Override
FILE: backend/src/main/java/com/mcoding/modular/auth/support/LoginUserUtils.java
class LoginUserUtils (line 14) | public class LoginUserUtils {
method currentUser (line 16) | public static SysUser currentUser() {
method getUserId (line 21) | public static Long getUserId() {
method markAsLogin (line 26) | public static void markAsLogin(SysUser loginUser) {
method invalidate (line 31) | public static void invalidate() {
method loginOut (line 36) | public static void loginOut() {
method getCurrentSession (line 41) | private static HttpSession getCurrentSession() {
FILE: backend/src/main/java/com/mcoding/modular/biz/user/controller/BizUserController.java
class BizUserController (line 52) | @Slf4j
method create (line 60) | @ApiOperation("创建")
method delete (line 67) | @ApiOperation(value = "删除")
method modify (line 74) | @ApiOperation(value = "修改")
method detail (line 81) | @ApiOperation(value = "查询用户详情")
method queryByPage (line 87) | @ApiOperation(value = "分页查询")
method exportExcelTemplate (line 99) | @ApiOperation("导出模板")
method importByExcel (line 124) | @ApiOperation("导入")
method exchangeExportExcelId (line 139) | @ApiOperation("EXCEL导出,请求参数换取导出标识ID")
method exportByExcel (line 149) | @ApiOperation("EXCEL导出")
method exportPdf (line 181) | @ApiOperation("PDF导出")
method getUserList (line 208) | private List<BaseUser> getUserList(JSONObject jsonObject) {
method getFileFromClassPathResource (line 216) | private InputStream getFileFromClassPathResource(String filePath) thro...
FILE: backend/src/main/java/com/mcoding/modular/biz/user/controller/UserDataListener.java
class UserDataListener (line 13) | @Slf4j
method invoke (line 16) | @Override
method doAfterAllAnalysed (line 20) | @Override
FILE: backend/src/main/java/com/mcoding/modular/rule/ACmp.java
class ACmp (line 10) | @Component("a")
method process (line 13) | @Override
FILE: backend/src/main/java/com/mcoding/modular/rule/BCmp.java
class BCmp (line 10) | @Component("b")
method process (line 13) | @Override
FILE: backend/src/main/java/com/mcoding/modular/rule/BizFlow.java
class BizFlow (line 16) | @Slf4j
method execute (line 23) | public void execute() {
FILE: backend/src/main/java/com/mcoding/modular/rule/CCmp.java
class CCmp (line 10) | @Component("c")
method process (line 13) | @Override
FILE: backend/src/main/java/com/mcoding/modular/rule/RuleFlowController.java
class RuleFlowController (line 20) | @Api(tags = "基础-规则引擎")
method execute (line 27) | @Monitored
FILE: backend/src/main/java/com/mcoding/modular/search/controller/ProductSpuController.java
class ProductSpuController (line 57) | @Slf4j
method create (line 65) | @ApiOperation("创建")
method delete (line 72) | @ApiOperation(value = "删除")
method modify (line 79) | @ApiOperation(value = "修改")
method detail (line 86) | @ApiOperation(value = "查询活动详情")
method queryByPage (line 92) | @ApiOperation(value = "分页查询")
method fullIndex (line 109) | @ApiOperation("全量同步商品索引")
method esUpdate (line 138) | @ApiOperation("修改商品文档数据")
method esDelete (line 161) | @ApiOperation("删除商品文档数据")
method search (line 179) | @ApiOperation("分页检索商品")
FILE: backend/src/main/java/com/mcoding/modular/search/dao/ProductSpuMapper.java
type ProductSpuMapper (line 14) | public interface ProductSpuMapper extends BaseMapper<ProductSpu> {
FILE: backend/src/main/java/com/mcoding/modular/search/entity/ProductSpu.java
class ProductSpu (line 26) | @Data
FILE: backend/src/main/java/com/mcoding/modular/search/service/ProductSpuService.java
type ProductSpuService (line 14) | public interface ProductSpuService extends IService<ProductSpu> {
FILE: backend/src/main/java/com/mcoding/modular/search/service/impl/ProductSpuServiceImpl.java
class ProductSpuServiceImpl (line 17) | @Service
FILE: backend/src/main/java/com/mcoding/modular/system/user/controller/SysUserController.java
class SysUserController (line 33) | @Api(tags = "系统-管理员服务")
method create (line 40) | @ApiOperation("创建")
method delete (line 47) | @ApiOperation(value = "删除")
method modify (line 54) | @ApiOperation(value = "修改")
method detail (line 61) | @ApiOperation(value = "查询活动详情")
method queryByPage (line 67) | @ApiOperation(value = "分页查询")
FILE: backend/src/main/java/com/mcoding/modular/system/user/dao/SysUserMapper.java
type SysUserMapper (line 14) | public interface SysUserMapper extends BaseMapper<SysUser> {
FILE: backend/src/main/java/com/mcoding/modular/system/user/entity/SysUser.java
class SysUser (line 25) | @Data
FILE: backend/src/main/java/com/mcoding/modular/system/user/service/SysUserService.java
type SysUserService (line 14) | public interface SysUserService extends IService<SysUser> {
FILE: backend/src/main/java/com/mcoding/modular/system/user/service/impl/SysUserServiceImpl.java
class SysUserServiceImpl (line 17) | @Service
FILE: backend/src/main/java/com/mcoding/modular/tech/job/ActivityStatusUpdateJob.java
class ActivityStatusUpdateJob (line 13) | @Slf4j
method execute (line 18) | @MdcLog
FILE: backend/src/main/java/com/mcoding/modular/tech/job/config/XxlJobConfig.java
class XxlJobConfig (line 14) | @Slf4j
method xxlJobExecutor (line 21) | @Bean
FILE: backend/src/main/java/com/mcoding/modular/tech/job/config/XxlJobPropertiesConfig.java
class XxlJobPropertiesConfig (line 11) | @ConfigurationProperties(prefix = "xxl.job.executor")
FILE: base-common/src/main/java/com/mcoding/base/common/exception/BizException.java
class BizException (line 10) | public class BizException extends RuntimeException {
method BizException (line 13) | public BizException() {
method BizException (line 17) | public BizException(String message, Throwable cause, boolean enableSup...
method BizException (line 22) | public BizException(String message, Throwable cause) {
method BizException (line 26) | public BizException(String message) {
method BizException (line 31) | public BizException(String message, Object data) {
method BizException (line 35) | public BizException(Throwable cause) {
FILE: base-common/src/main/java/com/mcoding/base/common/exception/CommonException.java
class CommonException (line 3) | public class CommonException extends RuntimeException {
method CommonException (line 6) | public CommonException() {
method CommonException (line 10) | public CommonException(String message, Throwable cause, boolean enable...
method CommonException (line 15) | public CommonException(String message, Throwable cause) {
method CommonException (line 19) | public CommonException(String message) {
method CommonException (line 24) | public CommonException(String message, Object data) {
method CommonException (line 28) | public CommonException(Throwable cause) {
FILE: base-common/src/main/java/com/mcoding/base/common/exception/SysException.java
class SysException (line 9) | public class SysException extends RuntimeException {
method SysException (line 12) | public SysException() {
method SysException (line 16) | public SysException(String message, Throwable cause, boolean enableSup...
method SysException (line 21) | public SysException(String message, Throwable cause) {
method SysException (line 25) | public SysException(String message) {
method SysException (line 30) | public SysException(String message, Object data) {
method SysException (line 34) | public SysException(Throwable cause) {
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/command/CommandInvoker.java
class CommandInvoker (line 7) | public class CommandInvoker implements ICommandInvoker {
method invoke (line 9) | @Override
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/command/ICommand.java
type ICommand (line 3) | public interface ICommand<Result> {
method execute (line 5) | Result execute(ICommandInvoker context);
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/command/ICommandInvoker.java
type ICommandInvoker (line 4) | public interface ICommandInvoker {
method invoke (line 6) | public <Result> Result invoke(ICommand<Result> command);
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/Filter.java
type Filter (line 7) | public interface Filter<Request> {
method doFilter (line 16) | void doFilter(Request request, FilterContext<Request, ?> filterContext);
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/FilterContext.java
class FilterContext (line 15) | public class FilterContext<Request, Response> {
method doFilter (line 29) | public void doFilter(Request request) {
method addFilter (line 41) | public void addFilter(Filter<Request> filter) {
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/Target.java
type Target (line 7) | @FunctionalInterface
method execute (line 16) | Response execute(Request request);
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/Pipeline.java
type Pipeline (line 7) | public interface Pipeline<T> {
method getHead (line 9) | Value getHead();
method getTail (line 11) | Value getTail();
method setTail (line 13) | void setTail(Value<T> v);
method addValue (line 15) | void addValue(Value<T> v);
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/StandardPipeline.java
class StandardPipeline (line 7) | public class StandardPipeline<T> {
method getHead (line 12) | public Value<T> getHead() {
method getTail (line 16) | public Value<T> getTail() {
method setTail (line 20) | public void setTail(Value<T> v) {
method addValue (line 24) | public void addValue(Value<T> v) {
FILE: base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/Value.java
class Value (line 7) | public abstract class Value<T> {
method getNext (line 11) | public Value<T> getNext() {
method setNext (line 15) | public void setNext(Value<T> v) {
method invoke (line 19) | public abstract void invoke(T s);
FILE: base-common/src/main/java/com/mcoding/base/common/util/Assert.java
class Assert (line 16) | public class Assert {
method isNotEmpty (line 24) | @SuppressWarnings("rawtypes")
method isNotEmpty (line 37) | @SuppressWarnings("rawtypes")
method isNotBlank (line 49) | public static void isNotBlank(String value, String defaultMsg) {
method isNotBlank (line 61) | public static void isNotBlank(String value, String defaultMsg, String ...
method isNotNull (line 72) | public static void isNotNull(Object type, String mss) {
method isNotNull (line 82) | public static void isNotNull(Object type) {
method isExists (line 93) | public static <T> void isExists(List<T> list, T value, String msg) {
method doNotExists (line 105) | public static <T> void doNotExists(List<T> list, T value, String msg) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/bean/BeanMapperUtils.java
class BeanMapperUtils (line 16) | public abstract class BeanMapperUtils {
method map (line 20) | public static <S, D> D map(S source, Class<D> clazz) {
method map (line 29) | public static <S, D> void map(S source, D destination) {
method map (line 38) | public static <S, D> D map(S s, Type<S> sType, Type<D> dType) {
method mapAsList (line 47) | public static <S, D> List<D> mapAsList(List<S> source, Class<D> clazz) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/collection/MapUtils.java
class MapUtils (line 13) | public class MapUtils {
method sumEachGroupList (line 24) | public static <S, R> Map<String, BigDecimal> sumEachGroupList(Map<Stri...
FILE: base-common/src/main/java/com/mcoding/base/common/util/constant/MdcConstants.java
class MdcConstants (line 7) | public class MdcConstants {
FILE: base-common/src/main/java/com/mcoding/base/common/util/constant/SysConstants.java
type SysConstants (line 7) | public interface SysConstants {
FILE: base-common/src/main/java/com/mcoding/base/common/util/date/DateTimeUtils.java
class DateTimeUtils (line 12) | public class DateTimeUtils {
method toLocalDateTime (line 20) | public static LocalDateTime toLocalDateTime(Date date) {
method toDate (line 31) | public static Date toDate(LocalDateTime localDateTime) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/date/DateUtils.java
class DateUtils (line 24) | @Slf4j
method ignoreDate (line 107) | public static Date ignoreDate(String arg) throws ParseException {
method getNow (line 116) | public static Date getNow() {
method getNowTimestamp (line 123) | public static long getNowTimestamp() {
method getCurrentDate (line 130) | public static String getCurrentDate() {
method getCurrentTime (line 139) | public static String getCurrentTime() {
method getCurrentMmDdHmTime (line 148) | public static String getCurrentMmDdHmTime() {
method getCurrentDateTime (line 157) | public static String getCurrentDateTime() {
method toFormatDateString (line 170) | public static final String toFormatDateString(Date aDate, String forma...
method toShortDateString (line 184) | public static final String toShortDateString(Date aDate) {
method toMailDateDtPartString (line 194) | public static final String toMailDateDtPartString(Date aDate) {
method toMailTimeTmPartString (line 204) | public static final String toMailTimeTmPartString(Date aDate) {
method toMailDateString (line 214) | public static final String toMailDateString(Date aDate) {
method toMailDtmPart (line 227) | public static final String toMailDtmPart(Date aDate) {
method toPointDtmPart (line 240) | public static final String toPointDtmPart(Date aDate) {
method toLongDateString (line 250) | public static final String toLongDateString(Date aDate) {
method toLongDateTmPartString (line 260) | public static final String toLongDateTmPartString(Date aDate) {
method toShortDateGBKString (line 270) | public static final String toShortDateGBKString(Date aDate) {
method toDateGBKString (line 280) | public static final String toDateGBKString(Date aDate) {
method toLongDateGBKString (line 290) | public static final String toLongDateGBKString(Date aDate) {
method toLongDateTmPartGBKString (line 300) | public static final String toLongDateTmPartGBKString(Date aDate) {
method toFullDateString (line 310) | public static final String toFullDateString(Date aDate) {
method toFullDateGBKString (line 320) | public static final String toFullDateGBKString(Date aDate) {
method toFullDateCompactString (line 330) | public static final String toFullDateCompactString(Date aDate) {
method toLDAPDateString (line 340) | public static final String toLDAPDateString(Date aDate) {
method parser (line 354) | public static final Date parser(String aDateStr, String formatter) thr...
method parser (line 372) | public static final Date parser(String aDateStr, String formatter, boo...
method parseLongDateString (line 388) | public static final Date parseLongDateString(String aDateStr) throws P...
method parseLongDateDtPartString (line 399) | public static final Date parseLongDateDtPartString(String aDateStr) th...
method parseLongDateTmPartString (line 410) | public static final Date parseLongDateTmPartString(String aDateStr) th...
method parseShortDateString (line 421) | public static final Date parseShortDateString(String aDateStr) throws ...
method parseMailDateString (line 432) | public static final Date parseMailDateString(String aDateStr) throws P...
method parseMailDateDtPartString (line 443) | public static final Date parseMailDateDtPartString(String aDateStr) th...
method parseMailDateTmPartString (line 453) | public static final Date parseMailDateTmPartString(String aDateStr) th...
method parseFullDateString (line 463) | public static final Date parseFullDateString(String aDateStr) throws P...
method parseDateString (line 475) | public static Date parseDateString(String aDateStr) {
method transfer2ShortDate (line 503) | public static String transfer2ShortDate(String dt) {
method transfer2LongDatePart (line 520) | public static String transfer2LongDatePart(String dt, String tm) {
method transfer2LongDateDtPart (line 530) | public static String transfer2LongDateDtPart(String dt) {
method transfer2LongDateTmPart (line 545) | public static String transfer2LongDateTmPart(String tm) {
method transfer2LongDateGbkDtPart (line 560) | public static String transfer2LongDateGbkDtPart(String dt) {
method transfer2LongDate (line 576) | public static String transfer2LongDate(String dt) {
method transfer2LongDateGbkTmPart (line 591) | public static String transfer2LongDateGbkTmPart(String tm) {
method addYears (line 610) | public static final Date addYears(Date aDate, int amount) {
method addMonths (line 621) | public static final Date addMonths(Date aDate, int amount) {
method addDays (line 632) | public static final Date addDays(Date aDate, int amount) {
method addDays (line 643) | public static final String addDays(String aDate, int amount) {
method addHours (line 658) | public static final Date addHours(Date aDate, int amount) {
method addMinutes (line 670) | public static final Date addMinutes(Date aDate, int amount) {
method addSeconds (line 681) | public static final Date addSeconds(Date aDate, int amount) {
method addTime (line 686) | private static final Date addTime(Date aDate, int timeType, int amount) {
method getUTCTime (line 703) | public static final String getUTCTime() {
method getUTCTime (line 713) | public static final String getUTCTime(Date aDate) {
method getSpecifiedZoneTime (line 723) | public static final String getSpecifiedZoneTime(TimeZone tz) {
method getSpecifiedZoneTime (line 737) | public static final String getSpecifiedZoneTime(Date aDate, TimeZone t...
method getDifferenceMonths (line 756) | public static final int getDifferenceMonths(Date startDate, Date endDa...
method getDifferenceMonths (line 775) | public static final int getDifferenceMonths(String startDateStr, Strin...
method getMonthBetween (line 789) | public static List<Map<String,Object>> getMonthBetween(String minDate,...
method getBetweenMonthFirstAndEnd (line 799) | public static List<Map<String,Object>> getBetweenMonthFirstAndEnd(Date...
method getDifferenceDays (line 834) | public static final int getDifferenceDays(String startDateStr, String ...
method getDifferenceDays2 (line 845) | public static final int getDifferenceDays2(String startDateStr, String...
method getDaysSubtract (line 859) | public static final int getDaysSubtract(String startDateStr, String en...
method getDaysSubtract (line 870) | public static final int getDaysSubtract(Date startDate, Date endDate) {
method getDaysSubtract2 (line 882) | public static final int getDaysSubtract2(String startDateStr, String e...
method getDaysSubtractMillis (line 895) | public static final long getDaysSubtractMillis(String startDateStr, St...
method getDaysSubtractMillis (line 907) | public static final long getDaysSubtractMillis(String startDateStr, St...
method getDaysSubtractMillis (line 922) | public static final long getDaysSubtractMillis(Date startDate, Date en...
method getDifferenceDays (line 937) | public static final int getDifferenceDays(Date startDate, Date endDate) {
method getDifferenceMillis (line 950) | public static final long getDifferenceMillis(String startDateStr, Stri...
method getDifferenceMillis2 (line 962) | public static final long getDifferenceMillis2(String startDateStr, Str...
method getDifferenceMillis (line 974) | public static final long getDifferenceMillis(String startDateStr, Stri...
method getDifferenceMillis (line 989) | public static final long getDifferenceMillis(Date startDate, Date endD...
method isDateBetween (line 1004) | public static final boolean isDateBetween(Date aDate, String minDateSt...
method getDaysInMonth (line 1035) | public static final int getDaysInMonth(String aDateStr) {
method getDaysInMonth (line 1051) | public static final int getDaysInMonth(Date aDate) {
method getYearAndMonth (line 1064) | public static final int getYearAndMonth(Date aDate) {
method getPreviousMonthFirst (line 1072) | public static Date getPreviousMonthFirst(Date date) {
method getMonthFirst (line 1083) | public static Date getMonthFirst(Date date){
method getAssignDate (line 1101) | public static Date getAssignDate(String dd, Integer monthOffSet) {
method getPreviousMonthEnd (line 1113) | public static Date getPreviousMonthEnd(Date date) throws ParseException {
method getMonthEnd (line 1126) | public static Date getMonthEnd(Date date){
method getTodayBegin (line 1144) | public static Date getTodayBegin() {
method getOneDayBegin (line 1159) | public static Date getOneDayBegin(Date someDay) {
method getOneDayBegin (line 1171) | public static Date getOneDayBegin(String someDay, String format) throw...
method getTodayEnd (line 1180) | public static Date getTodayEnd() {
method getOneDayEnd (line 1194) | public static Date getOneDayEnd(Date someDay) {
method getOneDayEnd2 (line 1205) | public static Date getOneDayEnd2(Date someDay) {
method getSpecifyDate (line 1226) | public static Date getSpecifyDate(Date date, Integer monthNum, Integer...
method getSpecifyWeekDate (line 1244) | public static Date getSpecifyWeekDate(Integer weekNum, Integer weekDay) {
method startOfyesterday (line 1261) | public static Date startOfyesterday() {
method endOfyesterday (line 1277) | public static Date endOfyesterday() {
method getFieldOfDate (line 1295) | public static int getFieldOfDate(int field, Date aDate) {
method isInDates (line 1308) | public static boolean isInDates(String strDate, String strDateBegin, S...
method getNextDate (line 1352) | public static Date getNextDate(Date now, int next, int dateField) {
method parse (line 1365) | public static Date parse(String date) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/date/DateValidator.java
class DateValidator (line 16) | @Slf4j
method isMatch (line 27) | public static final boolean isMatch(String text, String reg) {
method isLongDateStr (line 42) | public static final boolean isLongDateStr(String aDateStr) {
method isShortDateStr (line 57) | public static final boolean isShortDateStr(String aDateStr) {
method isMailDateDtPartStr (line 72) | public static final boolean isMailDateDtPartStr(String aDateStr) {
method isDateStrMatched (line 88) | public static final boolean isDateStrMatched(String aDateStr, String f...
method checkShortDateStr (line 102) | public static final void checkShortDateStr(String aDateStr) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/encryption/Md5Utils.java
class Md5Utils (line 10) | public class Md5Utils {
method md5Object (line 15) | public static String md5Object(Object object) throws NoSuchAlgorithmEx...
method md5Encode (line 30) | public static String md5Encode(String origin) throws NoSuchAlgorithmEx...
method byteArrayToHexString (line 45) | public static String byteArrayToHexString(byte[] b) {
method byteToHexString (line 59) | private static String byteToHexString(byte b) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/ExcelUtils.java
class ExcelUtils (line 34) | public class ExcelUtils {
method exportDataToExcel (line 50) | public static WritableWorkbook exportDataToExcel(OutputStream os,
method exportDataToExcel (line 74) | @SuppressWarnings("unchecked")
method importExcelDataToList (line 171) | public static <T> List<T> importExcelDataToList(InputStream in, int sh...
method converteRowToObject (line 200) | private static <T> T converteRowToObject(Sheet sheet, Cell[] headRow, ...
method convertStrToObject (line 235) | private static Object convertStrToObject(Object object, Sheet sheet, L...
method getAllRows (line 259) | private static List<List<Cell>> getAllRows(Sheet sheet, int dataStartR...
method checkExcel (line 303) | private static void checkExcel(List<TitleAndModelKey> titleAndModelKey...
method getTitleIndexInRow (line 326) | private static int getTitleIndexInRow(Cell[] headRow, String title) {
method createTitleAndModelKeyList (line 341) | private static List<TitleAndModelKey> createTitleAndModelKeyList(Class...
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/TitleAndModelKey.java
class TitleAndModelKey (line 14) | @Data
method TitleAndModelKey (line 40) | public TitleAndModelKey(String title, String modelKey) {
method TitleAndModelKey (line 45) | public TitleAndModelKey(String title, String modelKey, ObjToStrConvert...
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/converter/BigDecimalConverter.java
class BigDecimalConverter (line 15) | public class BigDecimalConverter implements StrToObjConverter<BigDecimal...
method convert (line 17) | @Override
method convert (line 33) | @Override
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/converter/ConverterFactory.java
class ConverterFactory (line 8) | @SuppressWarnings("rawtypes")
method registe (line 20) | private void registe() {
method getDefaultToObjConverter (line 32) | public static StrToObjConverter getDefaultToObjConverter(Class clazz) {
method getDefaultToStrConverter (line 41) | public static ObjToStrConverter getDefaultToStrConverter(Class clazz) {
method ConverterFactory (line 50) | private ConverterFactory() {
method getToObjMap (line 55) | public Map<String, StrToObjConverter> getToObjMap() {
method getToStrMap (line 59) | public Map<String, ObjToStrConverter> getToStrMap() {
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/converter/DateConverter.java
class DateConverter (line 12) | public class DateConverter implements StrToObjConverter<Date>, ObjToStrC...
method getDateFormat (line 21) | public String getDateFormat() {
method DateConverter (line 25) | public DateConverter() {
method DateConverter (line 29) | public DateConverter(String dateFormat) {
method setDateFormat (line 34) | public DateConverter setDateFormat(String dateFormat) {
method convert (line 39) | @Override
method convert (line 58) | @Override
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/converter/IntegerConverter.java
class IntegerConverter (line 10) | public class IntegerConverter implements StrToObjConverter<Integer>, Obj...
method convert (line 14) | @Override
method convert (line 28) | @Override
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/converter/LongConverter.java
class LongConverter (line 16) | public class LongConverter implements StrToObjConverter<Long>, ObjToStrC...
method convert (line 20) | @Override
method convert (line 25) | @Override
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/converter/ObjToStrConverter.java
type ObjToStrConverter (line 3) | public interface ObjToStrConverter<T> {
method convert (line 5) | public String convert(T t, Object item, int index);
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/converter/StrToObjConverter.java
type StrToObjConverter (line 14) | public interface StrToObjConverter<T> {
method convert (line 24) | public T convert(String content, List<Cell> rows, Sheet sheet) throws ...
FILE: base-common/src/main/java/com/mcoding/base/common/util/excel/converter/YesOrNoIntegerConverter.java
class YesOrNoIntegerConverter (line 14) | public class YesOrNoIntegerConverter implements ObjToStrConverter<Intege...
method convert (line 19) | @Override
method convert (line 27) | @Override
FILE: base-common/src/main/java/com/mcoding/base/common/util/id/IdGenerator.java
type IdGenerator (line 7) | public interface IdGenerator {
method generate (line 9) | String generate();
FILE: base-common/src/main/java/com/mcoding/base/common/util/id/RandomIdGenerator.java
class RandomIdGenerator (line 14) | @Slf4j
method generate (line 17) | @Override
method getLastfieldOfAddress (line 26) | private int getLastfieldOfAddress() {
method generateRandomAlphameric (line 39) | private String generateRandomAlphameric(int length) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/image/ImageUtils.java
class ImageUtils (line 13) | public class ImageUtils {
method cropImage (line 25) | public static BufferedImage cropImage(InputStream inputStream, int x, ...
method contactVertical (line 45) | public static BufferedImage contactVertical(File imageUp, File imageBe...
method contactVertical (line 56) | public static BufferedImage contactVertical(BufferedImage imageUp, Buf...
method contactCenter (line 96) | public static BufferedImage contactCenter(BufferedImage outter, Buffer...
method contactHorizontal (line 133) | public static BufferedImage contactHorizontal(File imageLeft, File ima...
method contactHorizontal (line 144) | public static BufferedImage contactHorizontal(BufferedImage imageLeft,...
method createRectlang (line 178) | public static BufferedImage createRectlang(int width, int height){
FILE: base-common/src/main/java/com/mcoding/base/common/util/image/ImageWatermarkUtils.java
class ImageWatermarkUtils (line 17) | public class ImageWatermarkUtils {
method addTextWatermark (line 28) | public static void addTextWatermark(String text, File sourceImageFile,...
method addImageWatermark (line 71) | static void addImageWatermark(File watermarkImageFile, File sourceImag...
method main (line 104) | public static void main(String[] args) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/math/BigDecimalUtils.java
class BigDecimalUtils (line 39) | public final class BigDecimalUtils {
method is (line 42) | public static BigDecimalWrapper is(BigDecimal decimal) {
method is (line 46) | public static BigDecimalWrapper is(double decimal) {
method max (line 50) | public static BigDecimal max(List<BigDecimal> bigDecimalList) {
method min (line 55) | public static BigDecimal min(List<BigDecimal> bigDecimalList) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/math/BigDecimalWrapper.java
class BigDecimalWrapper (line 10) | public final class BigDecimalWrapper {
method BigDecimalWrapper (line 15) | BigDecimalWrapper(BigDecimal bigDecimal) {
method eq (line 26) | public boolean eq(BigDecimal decimal) {
method eq (line 37) | public boolean eq(double decimal) {
method gt (line 48) | public boolean gt(BigDecimal decimal) {
method gt (line 59) | public boolean gt(double decimal) {
method ge (line 70) | public boolean ge(BigDecimal decimal) {
method ge (line 81) | public boolean ge(double decimal) {
method lt (line 92) | public boolean lt(BigDecimal decimal) {
method lt (line 103) | public boolean lt(double decimal) {
method le (line 114) | public boolean le(BigDecimal decimal) {
method le (line 125) | public boolean le(double decimal) {
method notEq (line 136) | public boolean notEq(BigDecimal decimal) {
method notEq (line 147) | public boolean notEq(double decimal) {
method notGt (line 158) | public boolean notGt(BigDecimal decimal) {
method notGt (line 169) | public boolean notGt(double decimal) {
method notGe (line 180) | public boolean notGe(BigDecimal decimal) {
method notGe (line 191) | public boolean notGe(double decimal) {
method notLt (line 202) | public boolean notLt(BigDecimal decimal) {
method notLt (line 213) | public boolean notLt(double decimal) {
method notLe (line 224) | public boolean notLe(BigDecimal decimal) {
method notLe (line 235) | public boolean notLe(double decimal) {
method isPositive (line 242) | public boolean isPositive() {
method isNegative (line 249) | public boolean isNegative() {
method isNonPositive (line 256) | public boolean isNonPositive() {
method isNonNegative (line 263) | public boolean isNonNegative() {
method isZero (line 270) | public boolean isZero() {
method isNotZero (line 277) | public boolean isNotZero() {
method isNullOrZero (line 284) | public boolean isNullOrZero() {
method notNullOrZero (line 291) | public boolean notNullOrZero() {
FILE: base-common/src/main/java/com/mcoding/base/common/util/math/NumberMoneyConvertUtil.java
class NumberMoneyConvertUtil (line 9) | public class NumberMoneyConvertUtil {
method convert (line 40) | public static String convert(BigDecimal numberOfMoney) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/math/RMBUtil.java
class RMBUtil (line 6) | public final class RMBUtil {
method RMBUtil (line 7) | private RMBUtil() {
method convert (line 20) | public static final String convert(double val) {
method PositiveIntegerToHanStr (line 73) | private static String PositiveIntegerToHanStr(String NumStr) {
FILE: base-common/src/main/java/com/mcoding/base/common/util/pdf/FtlToPdfUtil.java
class FtlToPdfUtil (line 24) | public class FtlToPdfUtil {
method generateHtmlByteArray (line 45) | public static byte[] generateHtmlByteArray(String path, String fileNam...
method convertToPdf (line 72) | public static void convertToPdf(byte[] htmlByteArray, OutputStream out...
FILE: base-common/src/main/java/com/mcoding/base/common/util/reflect/ReflectUtils.java
class ReflectUtils (line 20) | public abstract class ReflectUtils {
method getFieldType (line 29) | @SuppressWarnings("rawtypes")
method getValue (line 62) | @SuppressWarnings("rawtypes")
method getPropertyValue (line 78) | private static Object getPropertyValue(Object instance, String propert...
method setValue (line 110) | public static void setValue(Object instance, String propertyName, Obje...
method invokeMethod (line 141) | public static Object invokeMethod(Object instance, String methodName, ...
method findMethod (line 154) | private static Method findMethod(Object instance, String methodName, O...
method isSameMethod (line 198) | private static boolean isSameMethod(Method declareMethod, Method metho...
method findMethod (line 222) | private static Method findMethod(List<Method> methodList, Object[] obj...
FILE: base-common/src/main/java/com/mcoding/base/common/util/wechat/AES.java
class AES (line 17) | public class AES {
method decrypt (line 30) | public byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) t...
method initialize (line 58) | public static void initialize() {
method generateIV (line 66) | public static AlgorithmParameters generateIV(byte[] iv) throws Excepti...
FILE: base-common/src/main/java/com/mcoding/base/common/util/wechat/WXBizDataCrypt.java
class WXBizDataCrypt (line 14) | public class WXBizDataCrypt {
method encode (line 26) | public static byte[] encode(int count) {
method decode (line 48) | public static byte[] decode(byte[] decrypted) {
method chr (line 63) | public static char chr(int a) {
method decrypt (line 73) | public static WxUserInfo decrypt(String encryptedData, String sessionK...
method main (line 90) | public static void main(String[] args) throws Exception{
FILE: base-common/src/main/java/com/mcoding/base/common/util/wechat/WxUserInfo.java
class WxUserInfo (line 9) | @Data
FILE: base-common/src/main/java/com/mcoding/base/common/util/wechat/WxWaterMark.java
class WxWaterMark (line 9) | @Data
FILE: base-core/src/main/java/com/mcoding/base/core/cache/RCacheAspect.java
class RCacheAspect (line 31) | @Order(10)
method cacheablePointCut (line 39) | @Pointcut(value = "@annotation(com.mcoding.base.core.cache.RCacheable)")
method cacheableDoAround (line 43) | @Around(value = "cacheablePointCut()")
method cacheEvictPointCut (line 102) | @Pointcut(value = "@annotation(com.mcoding.base.core.cache.RCacheEvict)")
method cacheEvitDoBefore (line 106) | @Before(value = "cacheEvictPointCut()")
method parseSpel (line 137) | private <T> T parseSpel(Method method, Object[] arguments, String spel...
FILE: base-core/src/main/java/com/mcoding/base/core/config/ControllerConfig.java
class ControllerConfig (line 21) | @ControllerAdvice
method exceptionHandler (line 26) | @ExceptionHandler(value = MethodArgumentNotValidException.class)
method exceptionHandler (line 36) | @ExceptionHandler(value = CommonException.class)
method exceptionHandler (line 43) | @ExceptionHandler(value = SysException.class)
method exceptionHandler (line 50) | @ExceptionHandler(value = BizException.class)
method exceptionHandler (line 57) | @ExceptionHandler(value = Exception.class)
FILE: base-core/src/main/java/com/mcoding/base/core/config/EsClientConfig.java
class EsClientConfig (line 15) | @Slf4j
method loadHttpHosts (line 57) | private HttpHost[] loadHttpHosts() {
method restClient (line 73) | @Bean
method setConnectTimeOutConfig (line 89) | private void setConnectTimeOutConfig(RestClientBuilder restClientBuild...
method setConnectConfig (line 103) | private void setConnectConfig(RestClientBuilder restClientBuilder) {
method close (line 111) | @PreDestroy
FILE: base-core/src/main/java/com/mcoding/base/core/config/FilterConfig.java
class FilterConfig (line 14) | @Configuration
method rateLimitFilter (line 17) | @Bean
method initBaseDataFilter (line 24) | @Bean
method initInvokeTreeFiler (line 31) | @Bean
FILE: base-core/src/main/java/com/mcoding/base/core/config/JavaSimonConfig.java
class JavaSimonConfig (line 17) | @Configuration
method monitoringAdvisor (line 20) | @Bean(name = "monitoringAdvisor")
method dispatcherRegistration (line 28) | @Bean
method filterRegistrationBean (line 35) | @Bean
FILE: base-core/src/main/java/com/mcoding/base/core/config/MybatisPlusConfig.java
class MybatisPlusConfig (line 13) | @Configuration
method dataSourceOne (line 17) | @Primary
method paginationInterceptor (line 29) | @Bean
method optimisticLockerInterceptor (line 39) | @Bean
FILE: base-core/src/main/java/com/mcoding/base/core/config/SwaggerConfig.java
class SwaggerConfig (line 18) | @Configuration
method swaggerSpringMvcPlugin (line 22) | @Bean
method securitySchemes (line 33) | private List<ApiKey> securitySchemes() {
method securityContexts (line 39) | private List<SecurityContext> securityContexts() {
method defaultAuth (line 47) | private List<SecurityReference> defaultAuth() {
method apiInfo (line 56) | private ApiInfo apiInfo() {
FILE: base-core/src/main/java/com/mcoding/base/core/doc/EventNode.java
class EventNode (line 15) | @Data
FILE: base-core/src/main/java/com/mcoding/base/core/doc/EventNodeContainer.java
class EventNodeContainer (line 19) | public class EventNodeContainer {
method put (line 26) | static void put(String traceId, EventNode eventNode) {
method get (line 35) | public static List<EventNode> get(String traceId) {
method getAllTraceId (line 39) | public static Set<String> getAllTraceId() {
FILE: base-core/src/main/java/com/mcoding/base/core/doc/EventNodeStack.java
class EventNodeStack (line 11) | public class EventNodeStack {
method push (line 15) | static void push(EventNode eventNode) {
method pop (line 24) | static EventNode pop() {
method peek (line 28) | static EventNode peek() {
method size (line 36) | static int size() {
method clear (line 41) | public static void clear() {
FILE: base-core/src/main/java/com/mcoding/base/core/doc/EventTraceAspect.java
class EventTraceAspect (line 37) | @Profile({"dev", "test"})
method tracePointCut (line 45) | @Pointcut("@annotation(com.mcoding.base.core.doc.Process) || @annotati...
method doBefore (line 50) | @Before("tracePointCut()")
method doAfter (line 112) | @After("tracePointCut()")
method getLineNumber (line 120) | private int getLineNumber(Method method) {
method getCtMethod (line 131) | private CtMethod getCtMethod(Method method) throws NotFoundException {
FILE: base-core/src/main/java/com/mcoding/base/core/doc/controller/DocumentController.java
class DocumentController (line 18) | @Api(tags = "基础-文档服务")
method viewInvokeTree (line 23) | @ApiOperation("根据traceID查看方法调用树视图")
method viewALLTraceId (line 32) | @ApiOperation("查看所有方法调用树的TraceId")
FILE: base-core/src/main/java/com/mcoding/base/core/doc/controller/TreeBuilder.java
class TreeBuilder (line 14) | public class TreeBuilder {
method build (line 17) | public static EventNode build(List<EventNode> eventNodeList) {
method forEach (line 32) | private static void forEach(Map<Long, List<EventNode>> parentIdGroupBy...
FILE: base-core/src/main/java/com/mcoding/base/core/doc/controller/dto/TreeNode.java
class TreeNode (line 13) | @Data
FILE: base-core/src/main/java/com/mcoding/base/core/doc/filter/MethodInvokeTreeFiler.java
class MethodInvokeTreeFiler (line 17) | @Slf4j
method doFilter (line 21) | @Override
FILE: base-core/src/main/java/com/mcoding/base/core/http/HttpComponentConfig.java
class HttpComponentConfig (line 15) | @Configuration
method restTemplate (line 18) | @Bean
method simpleClientHttpRequestFactory (line 37) | @Bean
FILE: base-core/src/main/java/com/mcoding/base/core/log/MdcAspect.java
class MdcAspect (line 16) | @Aspect
method pointCut (line 22) | @Pointcut(value = "@annotation(com.mcoding.base.core.log.MdcLog)")
method doBefore (line 27) | @Before(value = "pointCut()")
method doAfter (line 33) | @After(value = "pointCut()")
FILE: base-core/src/main/java/com/mcoding/base/core/log/MybatisLogImpl.java
class MybatisLogImpl (line 10) | @Slf4j
method MybatisLogImpl (line 13) | public MybatisLogImpl(String clazz) {
method isDebugEnabled (line 16) | @Override
method isTraceEnabled (line 21) | @Override
method error (line 26) | @Override
method error (line 31) | @Override
method debug (line 36) | @Override
method trace (line 41) | @Override
method warn (line 46) | @Override
FILE: base-core/src/main/java/com/mcoding/base/core/log/TraceRequestFiler.java
class TraceRequestFiler (line 17) | @Slf4j
method doFilter (line 22) | @Override
FILE: base-core/src/main/java/com/mcoding/base/core/log/WebLogAspect.java
class WebLogAspect (line 29) | @Slf4j
method webApiOperation (line 37) | @Pointcut("@annotation(io.swagger.annotations.ApiOperation)")
method doBefore (line 41) | @Before("webApiOperation()")
method getRequestArgs (line 65) | private String getRequestArgs(JoinPoint joinPoint) {
method doAround (line 87) | @Around("webApiOperation()")
method getAspectLogDescription (line 95) | private String getAspectLogDescription(JoinPoint joinPoint)
FILE: base-core/src/main/java/com/mcoding/base/core/orm/DslParser.java
class DslParser (line 25) | @Slf4j
method DslParser (line 37) | public DslParser() {
method DslParser (line 41) | public DslParser(JSONObject queryObject) {
method DslParser (line 45) | public DslParser(Map<String, String[]> params) {
method parseToWrapper (line 65) | public QueryWrapper<T> parseToWrapper(Class<T> clazz) {
method executeWhereCondOpr (line 101) | private void executeWhereCondOpr(List<WhereCondition> whereCondList) {
method executeOrderByOpr (line 125) | private void executeOrderByOpr(Map<String, String> orderByMap) {
method executeKeyWordSearch (line 135) | private void executeKeyWordSearch(List<MetaModelField> keywordFieldLis...
method generatePage (line 148) | public IPage<T> generatePage() {
method toLowerCaseFirstOne (line 158) | private String toLowerCaseFirstOne(String str) {
method getPropValue (line 175) | public <R> R getPropValue(SFunction<T, ?> column, OprEnum oprEnum, Cla...
FILE: base-core/src/main/java/com/mcoding/base/core/orm/MetaModelField.java
class MetaModelField (line 11) | @Data
FILE: base-core/src/main/java/com/mcoding/base/core/orm/MetaModelUtils.java
class MetaModelUtils (line 19) | public class MetaModelUtils {
method generateMetaModelField (line 30) | public static <T> Map<String, MetaModelField> generateMetaModelField(C...
FILE: base-core/src/main/java/com/mcoding/base/core/orm/OprEnum.java
type OprEnum (line 3) | public enum OprEnum {
method OprEnum (line 10) | OprEnum(String value) {
method getValue (line 14) | public String getValue() {
FILE: base-core/src/main/java/com/mcoding/base/core/orm/ParseHandler.java
type ParseHandler (line 9) | public interface ParseHandler {
method apply (line 16) | void apply(ParserContext parserContext);
FILE: base-core/src/main/java/com/mcoding/base/core/orm/ParseOrderByCondHandler.java
class ParseOrderByCondHandler (line 21) | @AllArgsConstructor
method apply (line 27) | @Override
FILE: base-core/src/main/java/com/mcoding/base/core/orm/ParsePageHandler.java
class ParsePageHandler (line 14) | @AllArgsConstructor
method apply (line 19) | @Override
FILE: base-core/src/main/java/com/mcoding/base/core/orm/ParseSearchCondHandler.java
class ParseSearchCondHandler (line 17) | @AllArgsConstructor
method apply (line 24) | @Override
FILE: base-core/src/main/java/com/mcoding/base/core/orm/ParseWhereCondHandler.java
class ParseWhereCondHandler (line 22) | @AllArgsConstructor
method apply (line 28) | @Override
method validField (line 140) | private void validField(MetaModelField metaModelField, String queryFie...
FILE: base-core/src/main/java/com/mcoding/base/core/orm/ParserContext.java
class ParserContext (line 14) | @Data
method addQueryCondition (line 41) | void addQueryCondition(String operation, String tableFieldName, Object...
method addOrderByCondition (line 45) | void addOrderByCondition(String orderByCommand, String orderByTableFie...
FILE: base-core/src/main/java/com/mcoding/base/core/orm/QueryKeyWord.java
class QueryKeyWord (line 11) | public class QueryKeyWord {
FILE: base-core/src/main/java/com/mcoding/base/core/orm/WhereCondition.java
class WhereCondition (line 10) | @Data
FILE: base-core/src/main/java/com/mcoding/base/core/rate/RateLimitFilter.java
class RateLimitFilter (line 15) | public class RateLimitFilter implements Filter {
method doFilter (line 19) | @Override
FILE: base-core/src/main/java/com/mcoding/base/core/rest/BoolObject.java
class BoolObject (line 12) | @ApiModel("布尔对象")
FILE: base-core/src/main/java/com/mcoding/base/core/rest/IdObject.java
class IdObject (line 9) | @Data
FILE: base-core/src/main/java/com/mcoding/base/core/rest/PageView.java
class PageView (line 12) | @Data
method newPageView (line 23) | public static <T> PageView<T> newPageView() {
method newPageView (line 27) | public static <T> PageView<T> newPageView(int current, int size, long ...
FILE: base-core/src/main/java/com/mcoding/base/core/rest/ResponseCode.java
type ResponseCode (line 7) | public enum ResponseCode {
method ResponseCode (line 62) | private ResponseCode(String httpCode, String key, String msg) {
method getCode (line 69) | public String getCode() {
method getKey (line 73) | public String getKey() {
method getMsg (line 77) | public String getMsg() {
FILE: base-core/src/main/java/com/mcoding/base/core/rest/ResponseResult.java
class ResponseResult (line 15) | @ApiModel("请求返回包装模型")
method success (line 33) | public static ResponseResult<String> success() {
method success (line 37) | public static <T> ResponseResult<T> success(T data) {
method fail (line 46) | public static ResponseResult<String> fail(String msg) {
method fail (line 50) | public static <T> ResponseResult<T> fail(ResponseCode responseCode, St...
method isSuccess (line 58) | public boolean isSuccess() {
FILE: base-core/src/main/java/com/mcoding/base/core/spring/AopUtils.java
class AopUtils (line 12) | public class AopUtils {
method getCurrentMethod (line 14) | public static Method getCurrentMethod(JoinPoint joinPoint) {
FILE: base-core/src/main/java/com/mcoding/base/core/spring/GglibBeanMap.java
class GglibBeanMap (line 14) | public class GglibBeanMap {
method beanToMap (line 22) | public static <T> Map<String, Object> beanToMap(T bean) {
method mapToBean (line 43) | public static <T> T mapToBean(Map<String, Object> map, Class<T> beanCl...
FILE: base-core/src/main/java/com/mcoding/base/core/spring/SpringContextHolder.java
class SpringContextHolder (line 14) | @Component
method setApplicationContext (line 19) | @Override
method getApplicationContext (line 27) | public static ApplicationContext getApplicationContext() {
method getBean (line 35) | @SuppressWarnings("unchecked")
method getOneBean (line 43) | public static <T> T getOneBean(Class<T> clazz) {
method getBeans (line 52) | public static <T> Map<String, T> getBeans(Class<T> clazz) {
method checkApplicationContext (line 57) | private static void checkApplicationContext() {
method getProperty (line 68) | public static String getProperty(String key){
method getProperty (line 77) | public static String getProperty(String key, String defaultValue){
FILE: base-generator/src/main/java/com/mcoding/base/generator/CodeGenerator.java
class CodeGenerator (line 24) | public class CodeGenerator {
method scanner (line 36) | public static String scanner(String tip) {
method main (line 50) | public static void main(String[] args) {
FILE: biz-component/src/main/java/com.mcoding.base.component/ComponentApplication.java
class ComponentApplication (line 9) | @EnableRedissonHttpSession
method main (line 15) | public static void main(String[] args) {
FILE: biz-component/src/main/java/com.mcoding.base.component/generatecode/dao/BaseGenerateCodeDao.java
type BaseGenerateCodeDao (line 15) | public interface BaseGenerateCodeDao extends BaseMapper<BaseGenerateCode> {
FILE: biz-component/src/main/java/com.mcoding.base.component/generatecode/domain/CommonBizCodeGenerator.java
class CommonBizCodeGenerator (line 19) | @Slf4j
method generateNextCode (line 43) | public synchronized String generateNextCode() {
method generateBizCodeList (line 69) | public List<String> generateBizCodeList(int quantity) {
FILE: biz-component/src/main/java/com.mcoding.base.component/generatecode/entity/BaseGenerateCode.java
class BaseGenerateCode (line 19) | @TableName("base_generate_code")
FILE: biz-component/src/main/java/com.mcoding.base.component/generatecode/service/BaseGenerateCodeService.java
type BaseGenerateCodeService (line 18) | public interface BaseGenerateCodeService extends IService<BaseGenerateCo...
method generateBizCodeList (line 27) | List<String> generateBizCodeList(String targetCode, int quantity);
FILE: biz-component/src/main/java/com.mcoding.base.component/generatecode/service/impl/BaseGenerateCodeServiceImpl.java
class BaseGenerateCodeServiceImpl (line 25) | @Service
method generateBizCodeList (line 28) | @Transactional(rollbackFor = Exception.class)
method generateLastCode (line 67) | private String generateLastCode(String generateCodeId, int quantity, b...
FILE: biz-component/src/main/java/com.mcoding.base.component/generatecode/strategy/AutoIncrementStrategy.java
class AutoIncrementStrategy (line 17) | @Component
method generateListCode (line 20) | @Override
FILE: biz-component/src/main/java/com.mcoding.base.component/generatecode/strategy/DateIncrementStrategy.java
class DateIncrementStrategy (line 13) | @Component
method generateListCode (line 16) | @Override
FILE: biz-component/src/main/java/com.mcoding.base.component/generatecode/strategy/GenerateStrategy.java
class GenerateStrategy (line 11) | public abstract class GenerateStrategy {
method generateListCode (line 20) | public abstract String generateListCode(BaseGenerateCode currentCode, ...
FILE: biz-component/src/main/java/com.mcoding.base.component/shorturl/controller/ShortUrlController.java
class ShortUrlController (line 21) | @Slf4j
method generateShortUrl (line 29) | @ApiOperation("生成短链接")
method mapToLongUrl (line 36) | @ApiOperation("映射为长链接")
FILE: biz-component/src/main/java/com.mcoding.base.component/shorturl/domain/ShortUrlGenerator.java
class ShortUrlGenerator (line 14) | @Component
method generateShortUrl (line 33) | public String generateShortUrl(String longUrl) {
method mapToShortUrl (line 41) | public String mapToShortUrl(String shortUrl) {
method shortUrl (line 45) | private String shortUrl() {
method shortUrlSeed (line 61) | private Long shortUrlSeed() {
method saveShortUrlMap (line 66) | private void saveShortUrlMap(String shortUrl, String longUrl) {
method getLongUrl (line 71) | private String getLongUrl(String shortUrl) {
FILE: biz-user/src/main/java/com/mcoding/base/user/dao/BaseUserMapper.java
type BaseUserMapper (line 14) | public interface BaseUserMapper extends BaseMapper<BaseUser> {
FILE: biz-user/src/main/java/com/mcoding/base/user/entity/BaseUser.java
class BaseUser (line 22) | @Data
FILE: biz-user/src/main/java/com/mcoding/base/user/service/BaseUserService.java
type BaseUserService (line 14) | public interface BaseUserService extends IService<BaseUser> {
method getUserByOpenId (line 22) | BaseUser getUserByOpenId(String openId);
FILE: biz-user/src/main/java/com/mcoding/base/user/service/impl/BaseUserServiceImpl.java
class BaseUserServiceImpl (line 22) | @Service
method getUserByOpenId (line 26) | @Phase(comment = "根据openId获取用户信息")
Condensed preview — 198 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (421K chars).
[
{
"path": ".gitignore",
"chars": 373,
"preview": "# Compiled class file\n*.class\n*.iml\n*.idea\ntarget/\nlogs/\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n\n# Package Files #\n*.j"
},
{
"path": "LICENSE",
"chars": 1063,
"preview": "MIT License\n\nCopyright (c) 2019 λx.wzt\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof "
},
{
"path": "README.md",
"chars": 4999,
"preview": "# Tropical Fish\n\nPragmatic 风格的 Java EE 后端开发脚手架。 基于 SpringBoot,技术选型采用主流的技术框架(Mybatis-Plus,Redisson,Xxl-job,Swagger)。开箱即用,"
},
{
"path": "_docs/fish_mysql.sql",
"chars": 8795,
"preview": "/*\n Navicat Premium Data Transfer\n\n Target Server Type : MySQL\n Target Server Version : 50628\n File Encoding "
},
{
"path": "applet/pom.xml",
"chars": 1744,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www"
},
{
"path": "applet/src/main/java/com/mcoding/applet/AppletApplication.java",
"chars": 605,
"preview": "package com.mcoding.applet;\n\nimport org.redisson.spring.session.config.EnableRedissonHttpSession;\nimport org.springframe"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/AppAuthController.java",
"chars": 1106,
"preview": "package com.mcoding.applet.auth;\n\n\nimport com.alibaba.fastjson.JSON;\nimport com.mcoding.applet.auth.dto.CreateUserDto;\ni"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/WechatAuthController.java",
"chars": 5263,
"preview": "package com.mcoding.applet.auth;\n\n\nimport cn.hutool.core.util.IdUtil;\nimport com.alibaba.fastjson.JSON;\nimport com.mcodi"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/base/LoginRequired.java",
"chars": 240,
"preview": "package com.mcoding.applet.auth.base;\n\nimport java.lang.annotation.*;\n\n/**\n * @author wzt on 2020/6/13.\n * @version 1.0\n"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/base/LoginRequiredArgumentResolver.java",
"chars": 1100,
"preview": "package com.mcoding.applet.auth.base;\n\nimport com.mcoding.applet.auth.util.LoginUserUtils;\nimport lombok.extern.slf4j.Sl"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/base/config/AuthConfig.java",
"chars": 1718,
"preview": "package com.mcoding.applet.auth.base.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.sp"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/base/config/AuthInterceptor.java",
"chars": 2147,
"preview": "package com.mcoding.applet.auth.base.config;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mcoding.applet.auth.business."
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/base/config/LoginRequiredConfig.java",
"chars": 528,
"preview": "package com.mcoding.applet.auth.base.config;\n\nimport com.mcoding.applet.auth.base.LoginRequiredArgumentResolver;\nimport "
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/business/RegisterBo.java",
"chars": 933,
"preview": "package com.mcoding.applet.auth.business;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiMode"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/business/UserInfoBo.java",
"chars": 241,
"preview": "package com.mcoding.applet.auth.business;\n\nimport lombok.Data;\n\n/**\n * @author wzt on 2019/11/12.\n * @version 1.0\n */\n@D"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/business/resp/AccessTokenRespEntity.java",
"chars": 286,
"preview": "package com.mcoding.applet.auth.business.resp;\n\nimport lombok.Data;\n\n/**\n * @author wzt on 2020/3/25.\n * @version 1.0\n *"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/business/resp/JsCode2SessionRespEntity.java",
"chars": 314,
"preview": "package com.mcoding.applet.auth.business.resp;\n\nimport lombok.Data;\n\n/**\n * @author wzt on 2020/3/25.\n * @version 1.0\n *"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/business/resp/WxCodeUnlimitedResponse.java",
"chars": 345,
"preview": "package com.mcoding.applet.auth.business.resp;\n\nimport lombok.Data;\n\n/**\n * @author wzt on 2020/3/26.\n * @version 1.0\n *"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/dao/BaseUserTokenMapper.java",
"chars": 309,
"preview": "package com.mcoding.applet.auth.dao;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.mcoding.applet."
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/dto/BindingStoreDto.java",
"chars": 506,
"preview": "package com.mcoding.applet.auth.dto;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n/**\n * @autho"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/dto/CreateUserDto.java",
"chars": 1145,
"preview": "package com.mcoding.applet.auth.dto;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport javax."
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/dto/PhoneNumberDto.java",
"chars": 237,
"preview": "package com.mcoding.applet.auth.dto;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\n/**\n * @author wzt on 2020/"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/dto/RegisterDto.java",
"chars": 861,
"preview": "package com.mcoding.applet.auth.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProp"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/entity/BaseUserToken.java",
"chars": 1365,
"preview": "package com.mcoding.applet.auth.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.myba"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/manager/WechatClient.java",
"chars": 722,
"preview": "package com.mcoding.applet.auth.manager;\n\n\nimport com.mcoding.applet.auth.business.UserInfoBo;\n\n/**\n * @author wzt on 20"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/manager/impl/WechatClientImpl.java",
"chars": 5007,
"preview": "package com.mcoding.applet.auth.manager.impl;\n\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/service/BaseUserTokenService.java",
"chars": 542,
"preview": "package com.mcoding.applet.auth.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport com.mcoding"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/service/WechatAuthService.java",
"chars": 1057,
"preview": "package com.mcoding.applet.auth.service;\n\n\nimport com.mcoding.applet.auth.business.RegisterBo;\nimport com.mcoding.applet"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/service/impl/BaseUserTokenServiceImpl.java",
"chars": 1916,
"preview": "package com.mcoding.applet.auth.service.impl;\n\nimport cn.hutool.core.util.RandomUtil;\nimport cn.hutool.core.util.StrUtil"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/service/impl/WechatAuthServiceImpl.java",
"chars": 3327,
"preview": "package com.mcoding.applet.auth.service.impl;\n\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimpo"
},
{
"path": "applet/src/main/java/com/mcoding/applet/auth/util/LoginUserUtils.java",
"chars": 795,
"preview": "package com.mcoding.applet.auth.util;\n\n\nimport com.mcoding.applet.auth.business.RegisterBo;\n\n/**\n * @author wzt on 2019/"
},
{
"path": "applet/src/main/java/com/mcoding/applet/order/component/ActivityCodeController.java",
"chars": 1815,
"preview": "package com.mcoding.applet.order.component;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mcoding.base.core.rest.Respons"
},
{
"path": "applet/src/main/java/com/mcoding/applet/order/component/ActivityOrderBizCodeGenerator.java",
"chars": 972,
"preview": "package com.mcoding.applet.order.component;\n\nimport com.google.common.collect.Range;\nimport com.mcoding.base.common.exce"
},
{
"path": "applet/src/main/java/com/mcoding/applet/order/component/TargetCodeEnum.java",
"chars": 515,
"preview": "package com.mcoding.applet.order.component;\n\n/**\n * @author wzt on 2020/2/9.\n * @version 1.0\n */\npublic enum TargetCodeE"
},
{
"path": "applet/src/main/resources/application-dev.properties",
"chars": 2120,
"preview": "spring.datasource.druid.url=jdbc:mysql://47.95.192.230:3306/mcoding?autoReconnect=true&useUnicode=true&characterEncoding"
},
{
"path": "applet/src/main/resources/application-prd.properties",
"chars": 0,
"preview": ""
},
{
"path": "applet/src/main/resources/application.properties",
"chars": 596,
"preview": "spring.application.name=applet-api\nserver.port=8086\nserver.servlet.context-path=/applet-api\n\nspring.profiles.active=dev\n"
},
{
"path": "applet/src/main/resources/logback-spring.xml",
"chars": 6629,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不"
},
{
"path": "applet/src/main/resources/prop/redisson-dev.yaml",
"chars": 554,
"preview": "singleServerConfig:\n address: \"redis://47.95.192.230:6379\"\n password: redis#123\n clientName: fish_api_dev\n database:"
},
{
"path": "backend/pom.xml",
"chars": 1601,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "backend/src/main/java/com/mcoding/BackendApplication.java",
"chars": 600,
"preview": "package com.mcoding;\n\nimport org.redisson.spring.session.config.EnableRedissonHttpSession;\nimport org.springframework.bo"
},
{
"path": "backend/src/main/java/com/mcoding/modular/auth/config/AuthConfig.java",
"chars": 1617,
"preview": "package com.mcoding.modular.auth.config;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.spring"
},
{
"path": "backend/src/main/java/com/mcoding/modular/auth/config/AuthInterceptor.java",
"chars": 1326,
"preview": "package com.mcoding.modular.auth.config;\n\nimport com.alibaba.fastjson.JSON;\nimport com.mcoding.base.core.rest.ResponseCo"
},
{
"path": "backend/src/main/java/com/mcoding/modular/auth/config/LoginRequiredConfig.java",
"chars": 528,
"preview": "package com.mcoding.modular.auth.config;\n\nimport com.mcoding.modular.auth.support.LoginRequiredArgumentResolver;\nimport "
},
{
"path": "backend/src/main/java/com/mcoding/modular/auth/controller/AppAuthController.java",
"chars": 2105,
"preview": "package com.mcoding.modular.auth.controller;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport"
},
{
"path": "backend/src/main/java/com/mcoding/modular/auth/support/LoginRequired.java",
"chars": 244,
"preview": "package com.mcoding.modular.auth.support;\n\nimport java.lang.annotation.*;\n\n/**\n * @author wzt on 2020/6/13.\n * @version "
},
{
"path": "backend/src/main/java/com/mcoding/modular/auth/support/LoginRequiredArgumentResolver.java",
"chars": 1366,
"preview": "package com.mcoding.modular.auth.support;\n\nimport com.mcoding.base.common.exception.CommonException;\nimport com.mcoding."
},
{
"path": "backend/src/main/java/com/mcoding/modular/auth/support/LoginUserUtils.java",
"chars": 1416,
"preview": "package com.mcoding.modular.auth.support;\n\nimport com.mcoding.modular.system.user.entity.SysUser;\nimport org.springframe"
},
{
"path": "backend/src/main/java/com/mcoding/modular/biz/user/controller/BizUserController.java",
"chars": 8982,
"preview": "package com.mcoding.modular.biz.user.controller;\n\nimport cn.hutool.core.date.DateUtil;\nimport cn.hutool.core.lang.UUID;\n"
},
{
"path": "backend/src/main/java/com/mcoding/modular/biz/user/controller/UserDataListener.java",
"chars": 540,
"preview": "package com.mcoding.modular.biz.user.controller;\n\nimport com.alibaba.excel.context.AnalysisContext;\nimport com.alibaba.e"
},
{
"path": "backend/src/main/java/com/mcoding/modular/rule/ACmp.java",
"chars": 351,
"preview": "package com.mcoding.modular.rule;\n\nimport com.yomahub.liteflow.core.NodeComponent;\nimport org.springframework.stereotype"
},
{
"path": "backend/src/main/java/com/mcoding/modular/rule/BCmp.java",
"chars": 351,
"preview": "package com.mcoding.modular.rule;\n\nimport com.yomahub.liteflow.core.NodeComponent;\nimport org.springframework.stereotype"
},
{
"path": "backend/src/main/java/com/mcoding/modular/rule/BizFlow.java",
"chars": 1060,
"preview": "package com.mcoding.modular.rule;\n\nimport com.yomahub.liteflow.core.FlowExecutor;\nimport com.yomahub.liteflow.flow.Litef"
},
{
"path": "backend/src/main/java/com/mcoding/modular/rule/CCmp.java",
"chars": 351,
"preview": "package com.mcoding.modular.rule;\n\nimport com.yomahub.liteflow.core.NodeComponent;\nimport org.springframework.stereotype"
},
{
"path": "backend/src/main/java/com/mcoding/modular/rule/RuleFlowController.java",
"chars": 917,
"preview": "package com.mcoding.modular.rule;\n\nimport com.mcoding.base.core.rest.ResponseResult;\nimport com.mcoding.modular.system.u"
},
{
"path": "backend/src/main/java/com/mcoding/modular/search/controller/ProductSpuController.java",
"chars": 7751,
"preview": "package com.mcoding.modular.search.controller;\n\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.elasticsearch.action.DocWr"
},
{
"path": "backend/src/main/java/com/mcoding/modular/search/dao/ProductSpuMapper.java",
"chars": 302,
"preview": "package com.mcoding.modular.search.dao;\n\nimport com.mcoding.modular.search.entity.ProductSpu;\nimport com.baomidou.mybati"
},
{
"path": "backend/src/main/java/com/mcoding/modular/search/entity/ProductSpu.java",
"chars": 5192,
"preview": "package com.mcoding.modular.search.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.my"
},
{
"path": "backend/src/main/java/com/mcoding/modular/search/service/ProductSpuService.java",
"chars": 303,
"preview": "package com.mcoding.modular.search.service;\n\nimport com.mcoding.modular.search.entity.ProductSpu;\nimport com.baomidou.my"
},
{
"path": "backend/src/main/java/com/mcoding/modular/search/service/impl/ProductSpuServiceImpl.java",
"chars": 541,
"preview": "package com.mcoding.modular.search.service.impl;\n\nimport com.mcoding.modular.search.entity.ProductSpu;\nimport com.mcodin"
},
{
"path": "backend/src/main/java/com/mcoding/modular/system/user/controller/SysUserController.java",
"chars": 2374,
"preview": "package com.mcoding.modular.system.user.controller;\n\n\nimport org.springframework.web.bind.annotation.RequestBody;\nimport"
},
{
"path": "backend/src/main/java/com/mcoding/modular/system/user/dao/SysUserMapper.java",
"chars": 302,
"preview": "package com.mcoding.modular.system.user.dao;\n\nimport com.mcoding.modular.system.user.entity.SysUser;\nimport com.baomidou"
},
{
"path": "backend/src/main/java/com/mcoding/modular/system/user/entity/SysUser.java",
"chars": 2508,
"preview": "package com.mcoding.modular.system.user.entity;\n\nimport java.util.Date;\n\nimport com.baomidou.mybatisplus.annotation.IdTy"
},
{
"path": "backend/src/main/java/com/mcoding/modular/system/user/service/SysUserService.java",
"chars": 303,
"preview": "package com.mcoding.modular.system.user.service;\n\nimport com.mcoding.modular.system.user.entity.SysUser;\nimport com.baom"
},
{
"path": "backend/src/main/java/com/mcoding/modular/system/user/service/impl/SysUserServiceImpl.java",
"chars": 539,
"preview": "package com.mcoding.modular.system.user.service.impl;\n\nimport com.mcoding.modular.system.user.entity.SysUser;\nimport com"
},
{
"path": "backend/src/main/java/com/mcoding/modular/tech/job/ActivityStatusUpdateJob.java",
"chars": 734,
"preview": "package com.mcoding.modular.tech.job;\n\nimport com.mcoding.base.core.log.MdcLog;\nimport com.xxl.job.core.biz.model.Return"
},
{
"path": "backend/src/main/java/com/mcoding/modular/tech/job/config/XxlJobConfig.java",
"chars": 881,
"preview": "package com.mcoding.modular.tech.job.config;\n\nimport com.xxl.job.core.executor.impl.XxlJobSpringExecutor;\nimport lombok."
},
{
"path": "backend/src/main/java/com/mcoding/modular/tech/job/config/XxlJobPropertiesConfig.java",
"chars": 570,
"preview": "package com.mcoding.modular.tech.job.config;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.Con"
},
{
"path": "backend/src/main/resources/application-dev.properties",
"chars": 2040,
"preview": "spring.datasource.druid.url=jdbc:mysql://47.95.192.230:3306/mcoding?autoReconnect=true&useUnicode=true&characterEncoding"
},
{
"path": "backend/src/main/resources/application.properties",
"chars": 598,
"preview": "spring.application.name=backend-api\nserver.port=8087\nserver.servlet.context-path=/backend-api\n\nspring.profiles.active=de"
},
{
"path": "backend/src/main/resources/config/flow.el.xml",
"chars": 115,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<flow>\n <chain name=\"chain1\">\n THEN(a, b, c);\n </chain>\n</flow>"
},
{
"path": "backend/src/main/resources/logback-spring.xml",
"chars": 6631,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不"
},
{
"path": "backend/src/main/resources/prop/redisson-dev.yaml",
"chars": 554,
"preview": "singleServerConfig:\n address: \"redis://47.95.192.230:6379\"\n password: redis#123\n clientName: fish_api_dev\n database:"
},
{
"path": "backend/src/main/resources/template/UserTemplate.ftl",
"chars": 1503,
"preview": " <!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta http-equiv=\"X-UA-Compatible\" content=\""
},
{
"path": "base-common/pom.xml",
"chars": 3602,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/exception/BizException.java",
"chars": 762,
"preview": "package com.mcoding.base.common.exception;\n\n\n/**\n * 业务异常\n *\n * @author wzt on 2020/3/9.\n * @version 1.0\n */\npublic class"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/exception/CommonException.java",
"chars": 723,
"preview": "package com.mcoding.base.common.exception;\n\npublic class CommonException extends RuntimeException {\n\n\n public CommonE"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/exception/SysException.java",
"chars": 761,
"preview": "package com.mcoding.base.common.exception;\n\n/**\n * 系统异常\n *\n * @author wzt on 2020/3/9.\n * @version 1.0\n */\npublic class "
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/command/CommandInvoker.java",
"chars": 285,
"preview": "package com.mcoding.base.common.pattern.command;\n\n/**\n * @author wzt on 2019/11/20.\n * @version 1.0\n */\npublic class Com"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/command/ICommand.java",
"chars": 131,
"preview": "package com.mcoding.base.common.pattern.command;\n\npublic interface ICommand<Result> {\n\n\tResult execute(ICommandInvoker c"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/command/ICommandInvoker.java",
"chars": 147,
"preview": "package com.mcoding.base.common.pattern.command;\n\n\npublic interface ICommandInvoker {\n\n\tpublic <Result> Result invoke(IC"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/Filter.java",
"chars": 306,
"preview": "package com.mcoding.base.common.pattern.filterchain;\n\n/**\n * @author wzt on 2020/5/3.\n * @version 1.0\n */\npublic interfa"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/FilterContext.java",
"chars": 869,
"preview": "package com.mcoding.base.common.pattern.filterchain;\n\nimport com.google.common.collect.Lists;\nimport lombok.Getter;\nimpo"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/filterchain/Target.java",
"chars": 289,
"preview": "package com.mcoding.base.common.pattern.filterchain;\n\n/**\n * @author wzt on 2020/5/3.\n * @version 1.0\n */\n@FunctionalInt"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/Pipeline.java",
"chars": 244,
"preview": "package com.mcoding.base.common.pattern.pipeline;\n\n/**\n * @author wzt on 2020/5/4.\n * @version 1.0\n */\npublic interface "
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/StandardPipeline.java",
"chars": 822,
"preview": "package com.mcoding.base.common.pattern.pipeline;\n\n/**\n * @author wzt on 2020/5/4.\n * @version 1.0\n */\npublic class Stan"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/pattern/pipeline/Value.java",
"chars": 332,
"preview": "package com.mcoding.base.common.pattern.pipeline;\n\n/**\n * @author wzt on 2020/5/4.\n * @version 1.0\n */\npublic abstract c"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/Assert.java",
"chars": 2467,
"preview": "package com.mcoding.base.common.util;\n\nimport com.mcoding.base.common.exception.CommonException;\nimport org.apache.commo"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/bean/BeanMapperUtils.java",
"chars": 1400,
"preview": "package com.mcoding.base.common.util.bean;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport ma.glasnost.orika.Ma"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/collection/MapUtils.java",
"chars": 936,
"preview": "package com.mcoding.base.common.util.collection;\n\nimport java.math.BigDecimal;\nimport java.util.HashMap;\nimport java.uti"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/constant/MdcConstants.java",
"chars": 184,
"preview": "package com.mcoding.base.common.util.constant;\n\n/**\n * @author wzt on 2020/4/4.\n * @version 1.0\n */\npublic class MdcCons"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/constant/SysConstants.java",
"chars": 170,
"preview": "package com.mcoding.base.common.util.constant;\n\n/**\n * @author wzt on 2020/3/30.\n * @version 1.0\n */\npublic interface Sy"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/date/DateTimeUtils.java",
"chars": 870,
"preview": "package com.mcoding.base.common.util.date;\n\nimport java.time.LocalDateTime;\nimport java.time.ZoneId;\nimport java.util.Da"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/date/DateUtils.java",
"chars": 39032,
"preview": "package com.mcoding.base.common.util.date;\n\nimport cn.hutool.core.lang.Assert;\nimport lombok.AccessLevel;\nimport lombok."
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/date/DateValidator.java",
"chars": 2033,
"preview": "package com.mcoding.base.common.util.date;\n\nimport cn.hutool.core.lang.Assert;\nimport lombok.experimental.UtilityClass;\n"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/encryption/Md5Utils.java",
"chars": 1839,
"preview": "package com.mcoding.base.common.util.encryption;\n\nimport com.alibaba.fastjson.JSON;\n\nimport java.io.UnsupportedEncodingE"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/ExcelProperty.java",
"chars": 428,
"preview": "package com.mcoding.base.common.util.excel;\n\nimport com.mcoding.base.common.util.excel.converter.ObjToStrConverter;\n\nimp"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/ExcelUtils.java",
"chars": 13935,
"preview": "package com.mcoding.base.common.util.excel;\n\nimport cn.hutool.core.util.ReflectUtil;\nimport com.mcoding.base.common.util"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/TitleAndModelKey.java",
"chars": 1171,
"preview": "package com.mcoding.base.common.util.excel;\n\nimport com.mcoding.base.common.util.excel.converter.ObjToStrConverter;\nimpo"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/converter/BigDecimalConverter.java",
"chars": 950,
"preview": "package com.mcoding.base.common.util.excel.converter;\n\nimport cn.hutool.core.util.StrUtil;\nimport jxl.Cell;\nimport jxl.S"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/converter/ConverterFactory.java",
"chars": 2060,
"preview": "package com.mcoding.base.common.util.excel.converter;\n\nimport java.math.BigDecimal;\nimport java.util.Date;\nimport java.u"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/converter/DateConverter.java",
"chars": 1961,
"preview": "package com.mcoding.base.common.util.excel.converter;\n\nimport jxl.Cell;\nimport jxl.Sheet;\nimport org.apache.commons.lang"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/converter/IntegerConverter.java",
"chars": 845,
"preview": "package com.mcoding.base.common.util.excel.converter;\n\nimport jxl.Cell;\nimport jxl.Sheet;\nimport org.apache.commons.lang"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/converter/LongConverter.java",
"chars": 904,
"preview": "package com.mcoding.base.common.util.excel.converter;\n\nimport cn.hutool.core.util.StrUtil;\nimport jxl.Cell;\nimport jxl.S"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/converter/ObjToStrConverter.java",
"chars": 154,
"preview": "package com.mcoding.base.common.util.excel.converter;\n\npublic interface ObjToStrConverter<T> {\n\n public String conver"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/converter/StrToObjConverter.java",
"chars": 431,
"preview": "package com.mcoding.base.common.util.excel.converter;\n\nimport jxl.Cell;\nimport jxl.Sheet;\n\nimport java.util.List;\n\n/**\n "
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/excel/converter/YesOrNoIntegerConverter.java",
"chars": 944,
"preview": "package com.mcoding.base.common.util.excel.converter;\n\nimport com.mcoding.base.common.util.excel.converter.ObjToStrConve"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/id/IdGenerator.java",
"chars": 152,
"preview": "package com.mcoding.base.common.util.id;\n\n/**\n * @author wzt on 2020/3/9.\n * @version 1.0\n */\npublic interface IdGenerat"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/id/RandomIdGenerator.java",
"chars": 1875,
"preview": "package com.mcoding.base.common.util.id;\n\nimport cn.hutool.core.date.DateUtil;\nimport lombok.extern.slf4j.Slf4j;\n\nimport"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/image/ImageUtils.java",
"chars": 5837,
"preview": "package com.mcoding.base.common.util.image;\n\nimport java.awt.Color;\nimport java.awt.Graphics2D;\nimport java.awt.image.Bu"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/image/ImageWatermarkUtils.java",
"chars": 3933,
"preview": "package com.mcoding.base.common.util.image;\n\nimport org.apache.commons.io.FilenameUtils;\nimport org.slf4j.Logger;\nimport"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/math/BigDecimalUtils.java",
"chars": 1801,
"preview": "package com.mcoding.base.common.util.math;\n\n\nimport cn.hutool.core.lang.Assert;\n\nimport java.math.BigDecimal;\nimport jav"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/math/BigDecimalWrapper.java",
"chars": 7893,
"preview": "package com.mcoding.base.common.util.math;\n\nimport java.math.BigDecimal;\n\n/**\n * wrapper of {@link BigDecimal} simplifie"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/math/NumberMoneyConvertUtil.java",
"chars": 3418,
"preview": "package com.mcoding.base.common.util.math;\n\nimport java.math.BigDecimal;\n\n/**\n * 数字转换为汉语中人民币的大写<br>\n * @author liuhongfe"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/math/RMBUtil.java",
"chars": 2582,
"preview": "package com.mcoding.base.common.util.math;\n\n/**\n * 字符串辅助类\n */\npublic final class RMBUtil {\n\tprivate RMBUtil() {\n\t}\n\n\tpri"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/pdf/FtlToPdfUtil.java",
"chars": 2624,
"preview": "package com.mcoding.base.common.util.pdf;\n\nimport com.itextpdf.html2pdf.ConverterProperties;\nimport com.itextpdf.html2pd"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/reflect/ReflectUtils.java",
"chars": 7713,
"preview": "package com.mcoding.base.common.util.reflect;\n\nimport org.apache.commons.collections4.CollectionUtils;\nimport org.apache"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/wechat/AES.java",
"chars": 2214,
"preview": "package com.mcoding.base.common.util.wechat;\n\nimport org.bouncycastle.jce.provider.BouncyCastleProvider;\n\nimport javax.c"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/wechat/WXBizDataCrypt.java",
"chars": 2920,
"preview": "package com.mcoding.base.common.util.wechat;\n\nimport com.alibaba.fastjson.JSON;\nimport org.apache.commons.codec.binary.B"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/wechat/WxUserInfo.java",
"chars": 677,
"preview": "package com.mcoding.base.common.util.wechat;\n\nimport lombok.Data;\n\n/**\n * @author wzt on 2020/4/15.\n * @version 1.0\n */\n"
},
{
"path": "base-common/src/main/java/com/mcoding/base/common/util/wechat/WxWaterMark.java",
"chars": 222,
"preview": "package com.mcoding.base.common.util.wechat;\n\nimport lombok.Data;\n\n/**\n * @author wzt on 2020/4/15.\n * @version 1.0\n */\n"
},
{
"path": "base-core/pom.xml",
"chars": 6008,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/cache/RCacheAspect.java",
"chars": 4672,
"preview": "package com.mcoding.base.core.cache;\n\nimport com.mcoding.base.common.exception.CommonException;\nimport com.mcoding.base."
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/cache/RCacheEvict.java",
"chars": 359,
"preview": "package com.mcoding.base.core.cache;\n\nimport java.lang.annotation.*;\n\n/**\n * @author wzt on 2020/3/26.\n * @version 1.0\n "
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/cache/RCacheable.java",
"chars": 933,
"preview": "package com.mcoding.base.core.cache;\n\nimport java.lang.annotation.*;\nimport java.util.concurrent.TimeUnit;\n\n/**\n * @auth"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/config/ControllerConfig.java",
"chars": 2819,
"preview": "package com.mcoding.base.core.config;\n\n\nimport com.mcoding.base.core.rest.ResponseResult;\nimport com.mcoding.base.common"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/config/EsClientConfig.java",
"chars": 3578,
"preview": "package com.mcoding.base.core.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.http.HttpHost;\nimport org.ela"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/config/FilterConfig.java",
"chars": 1292,
"preview": "package com.mcoding.base.core.config;\n\nimport com.mcoding.base.core.rate.RateLimitFilter;\nimport com.mcoding.base.core.d"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/config/JavaSimonConfig.java",
"chars": 1593,
"preview": "package com.mcoding.base.core.config;\n\nimport org.javasimon.console.SimonConsoleServlet;\nimport org.javasimon.javaee.Sim"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/config/MybatisPlusConfig.java",
"chars": 1323,
"preview": "package com.mcoding.base.core.config;\n\nimport com.alibaba.druid.pool.DruidDataSource;\nimport com.alibaba.druid.spring.bo"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/config/SwaggerConfig.java",
"chars": 2535,
"preview": "package com.mcoding.base.core.config;\n\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.context.an"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/EventNode.java",
"chars": 860,
"preview": "package com.mcoding.base.core.doc;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.fasterxml.jackson.ann"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/EventNodeContainer.java",
"chars": 1106,
"preview": "package com.mcoding.base.core.doc;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.google.common.cache.Cach"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/EventNodeStack.java",
"chars": 997,
"preview": "package com.mcoding.base.core.doc;\n\nimport cn.hutool.core.collection.CollectionUtil;\n\nimport java.util.Stack;\n\n/**\n * @a"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/EventTraceAspect.java",
"chars": 4684,
"preview": "package com.mcoding.base.core.doc;\n\nimport com.mcoding.base.common.exception.SysException;\nimport com.mcoding.base.commo"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/Phase.java",
"chars": 434,
"preview": "package com.mcoding.base.core.doc;\n\nimport java.lang.annotation.*;\n\n/**\n * 阶段注解\n * <p>\n * {@link EventTraceAspect}\n *\n *"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/Process.java",
"chars": 429,
"preview": "package com.mcoding.base.core.doc;\n\nimport java.lang.annotation.*;\n\n/**\n * 过程注解\n * {@link EventTraceAspect}\n *\n * @autho"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/Step.java",
"chars": 426,
"preview": "package com.mcoding.base.core.doc;\n\nimport java.lang.annotation.*;\n\n/**\n * 步骤注解\n *\n * @author wzt on 2020/4/2.\n * @versi"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/controller/DocumentController.java",
"chars": 1211,
"preview": "package com.mcoding.base.core.doc.controller;\n\nimport com.mcoding.base.core.doc.EventNode;\nimport com.mcoding.base.core."
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/controller/TreeBuilder.java",
"chars": 1212,
"preview": "package com.mcoding.base.core.doc.controller;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.mcoding.base."
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/controller/dto/TreeNode.java",
"chars": 304,
"preview": "package com.mcoding.base.core.doc.controller.dto;\n\nimport com.mcoding.base.core.doc.EventNode;\nimport lombok.Data;\n\nimpo"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/doc/filter/MethodInvokeTreeFiler.java",
"chars": 665,
"preview": "package com.mcoding.base.core.doc.filter;\n\nimport com.mcoding.base.core.doc.EventNodeStack;\nimport lombok.extern.slf4j.S"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/http/HttpComponentConfig.java",
"chars": 1436,
"preview": "package com.mcoding.base.core.http;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.cont"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/log/MdcAspect.java",
"chars": 913,
"preview": "package com.mcoding.base.core.log;\n\nimport com.mcoding.base.common.util.id.RandomIdGenerator;\nimport org.aspectj.lang.Jo"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/log/MdcLog.java",
"chars": 228,
"preview": "package com.mcoding.base.core.log;\n\nimport java.lang.annotation.*;\n\n/**\n * @author wzt on 2020/3/11.\n * @version 1.0\n */"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/log/MybatisLogImpl.java",
"chars": 823,
"preview": "package com.mcoding.base.core.log;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.ibatis.logging.Log;\n\n/**\n * @aut"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/log/TraceRequestFiler.java",
"chars": 1155,
"preview": "package com.mcoding.base.core.log;\n\nimport com.mcoding.base.common.util.constant.MdcConstants;\nimport com.mcoding.base.c"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/log/WebLogAspect.java",
"chars": 4080,
"preview": "package com.mcoding.base.core.log;\n\nimport com.alibaba.fastjson.JSON;\nimport io.swagger.annotations.ApiOperation;\nimport"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/DslParser.java",
"chars": 6391,
"preview": "package com.mcoding.base.core.orm;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.alibaba.fastjson.JSONObj"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/Keyword.java",
"chars": 238,
"preview": "package com.mcoding.base.core.orm;\n\nimport java.lang.annotation.*;\n\n/**\n * 搜索关键字注解\n *\n * Created on 2022/4/10.\n *\n * @au"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/Like.java",
"chars": 194,
"preview": "package com.mcoding.base.core.orm;\n\nimport java.lang.annotation.*;\n\n/**\n * 通用查询 Like 标识\n */\n@Documented\n@Target(ElementT"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/MetaModelField.java",
"chars": 635,
"preview": "package com.mcoding.base.core.orm;\n\nimport lombok.Data;\n\n/**\n * 模型字段元数据\n *\n * @author wzt on 2020/2/12.\n * @version 1.0\n"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/MetaModelUtils.java",
"chars": 2391,
"preview": "package com.mcoding.base.core.orm;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.ReflectU"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/OprEnum.java",
"chars": 232,
"preview": "package com.mcoding.base.core.orm;\n\npublic enum OprEnum {\n\n\n EQ(\"eq\");\n\n private String value;\n\n OprEnum(String"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/OrderByAsc.java",
"chars": 208,
"preview": "package com.mcoding.base.core.orm;\n\nimport java.lang.annotation.*;\n\n/**\n * 正序\n *\n * @author wzt\n */\n@Documented\n@Target("
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/OrderByDesc.java",
"chars": 209,
"preview": "package com.mcoding.base.core.orm;\n\nimport java.lang.annotation.*;\n\n/**\n * 倒序\n *\n * @author wzt\n */\n@Documented\n@Target("
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/ParseHandler.java",
"chars": 246,
"preview": "package com.mcoding.base.core.orm;\n\n/**\n * 解析处理接口\n *\n * @author wzt on 2020/7/7.\n * @version 1.0\n */\npublic interface Pa"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/ParseOrderByCondHandler.java",
"chars": 2288,
"preview": "package com.mcoding.base.core.orm;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.alibaba.fastjson.JSONObj"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/ParsePageHandler.java",
"chars": 741,
"preview": "package com.mcoding.base.core.orm;\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.AllArgsConstructor;\n\nimport ja"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/ParseSearchCondHandler.java",
"chars": 924,
"preview": "package com.mcoding.base.core.orm;\n\n\nimport com.alibaba.fastjson.JSONObject;\nimport lombok.AllArgsConstructor;\n\nimport j"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/ParseWhereCondHandler.java",
"chars": 5255,
"preview": "package com.mcoding.base.core.orm;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.alibaba.fastjson.JSONObj"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/ParserContext.java",
"chars": 1025,
"preview": "package com.mcoding.base.core.orm;\n\nimport com.google.common.collect.Lists;\nimport com.google.common.collect.Maps;\nimpor"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/QueryKeyWord.java",
"chars": 389,
"preview": "package com.mcoding.base.core.orm;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * 查询关键字\n *\n * @author wzt\n */\n"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/orm/WhereCondition.java",
"chars": 294,
"preview": "package com.mcoding.base.core.orm;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\n/**\n * @author wzt on 2020/7/"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/rate/RateLimitFilter.java",
"chars": 961,
"preview": "package com.mcoding.base.core.rate;\n\nimport com.alibaba.fastjson.JSON;\nimport com.google.common.util.concurrent.RateLimi"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/rest/BoolObject.java",
"chars": 362,
"preview": "package com.mcoding.base.core.rest;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelPrope"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/rest/IdObject.java",
"chars": 159,
"preview": "package com.mcoding.base.core.rest;\n\nimport lombok.Data;\n\n/**\n * @author wzt on 2020/2/14.\n * @version 1.0\n */\n@Data\npub"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/rest/PageView.java",
"chars": 587,
"preview": "package com.mcoding.base.core.rest;\n\nimport lombok.Builder;\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * @author "
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/rest/ResponseCode.java",
"chars": 2928,
"preview": "package com.mcoding.base.core.rest;\n\n/**\n * 响应码:0表示成功,其他表示错误或失败\n *\n */\npublic enum ResponseCode {\n\n\tSuccess(\"200\", \"base"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/rest/ResponseResult.java",
"chars": 1705,
"preview": "package com.mcoding.base.core.rest;\n\n\nimport com.mcoding.base.common.util.constant.MdcConstants;\nimport io.swagger.annot"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/spring/AopUtils.java",
"chars": 439,
"preview": "package com.mcoding.base.core.spring;\n\nimport org.aspectj.lang.JoinPoint;\nimport org.aspectj.lang.reflect.MethodSignatur"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/spring/GglibBeanMap.java",
"chars": 1238,
"preview": "package com.mcoding.base.core.spring;\n\nimport com.google.common.collect.Maps;\nimport com.mcoding.base.common.exception.S"
},
{
"path": "base-core/src/main/java/com/mcoding/base/core/spring/SpringContextHolder.java",
"chars": 2194,
"preview": "package com.mcoding.base.core.spring;\n\nimport org.springframework.beans.BeansException;\nimport org.springframework.conte"
},
{
"path": "base-generator/pom.xml",
"chars": 1384,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www"
},
{
"path": "base-generator/src/main/java/com/mcoding/base/generator/CodeGenerator.java",
"chars": 5495,
"preview": "package com.mcoding.base.generator;\n\n\nimport com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;\nimport com.b"
},
{
"path": "base-generator/src/main/resources/templates/mybatis-plus/controller.java.ftl",
"chars": 2630,
"preview": "package ${package.Controller};\n\n\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework."
},
{
"path": "base-generator/src/main/resources/templates/mybatis-plus/entity.java.ftl",
"chars": 3888,
"preview": "package ${package.Entity};\n\n<#list table.importPackages as pkg>\nimport ${pkg};\n</#list>\n<#if swagger2>\nimport io.swagger"
},
{
"path": "biz-component/pom.xml",
"chars": 1217,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/ComponentApplication.java",
"chars": 619,
"preview": "package com.mcoding.base.component;\n\nimport org.redisson.spring.session.config.EnableRedissonHttpSession;\nimport org.spr"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/generatecode/dao/BaseGenerateCodeDao.java",
"chars": 344,
"preview": "package com.mcoding.base.component.generatecode.dao;\n\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport co"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/generatecode/domain/CommonBizCodeGenerator.java",
"chars": 1611,
"preview": "package com.mcoding.base.component.generatecode.domain;\n\nimport com.google.common.collect.Range;\nimport com.mcoding.base"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/generatecode/entity/BaseGenerateCode.java",
"chars": 1608,
"preview": "package com.mcoding.base.component.generatecode.entity;\n\nimport com.baomidou.mybatisplus.annotation.*;\nimport lombok.Dat"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/generatecode/service/BaseGenerateCodeService.java",
"chars": 547,
"preview": "package com.mcoding.base.component.generatecode.service;\n\n\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/generatecode/service/impl/BaseGenerateCodeServiceImpl.java",
"chars": 3953,
"preview": "package com.mcoding.base.component.generatecode.service.impl;\n\n\nimport com.baomidou.mybatisplus.core.conditions.query.Qu"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/generatecode/strategy/AutoIncrementStrategy.java",
"chars": 1122,
"preview": "package com.mcoding.base.component.generatecode.strategy;\n\nimport com.mcoding.base.common.exception.CommonException;\nimp"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/generatecode/strategy/DateIncrementStrategy.java",
"chars": 1731,
"preview": "package com.mcoding.base.component.generatecode.strategy;\n\nimport cn.hutool.core.date.DateUtil;\nimport cn.hutool.core.ut"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/generatecode/strategy/GenerateStrategy.java",
"chars": 428,
"preview": "package com.mcoding.base.component.generatecode.strategy;\n\n\nimport com.mcoding.base.component.generatecode.entity.BaseGe"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/shorturl/controller/ShortUrlController.java",
"chars": 1096,
"preview": "package com.mcoding.modular.biz.shorturl.controller;\n\n\nimport com.mcoding.base.core.rest.ResponseResult;\nimport com.mcod"
},
{
"path": "biz-component/src/main/java/com.mcoding.base.component/shorturl/domain/ShortUrlGenerator.java",
"chars": 2125,
"preview": "package com.mcoding.modular.biz.shorturl.domain;\n\nimport org.redisson.api.RAtomicLong;\nimport org.redisson.api.RMap;\nimp"
},
{
"path": "biz-component/src/main/resources/application-dev.properties",
"chars": 1998,
"preview": "spring.datasource.druid.url=jdbc:mysql://47.95.192.230:3306/mcoding?autoReconnect=true&useUnicode=true&characterEncoding"
},
{
"path": "biz-component/src/main/resources/application.properties",
"chars": 521,
"preview": "spring.application.name=biz-component\nserver.port=8088\nserver.servlet.context-path=/biz-component\n\nspring.profiles.activ"
},
{
"path": "biz-component/src/main/resources/prop/redisson-dev.yaml",
"chars": 554,
"preview": "singleServerConfig:\n address: \"redis://47.95.192.230:6379\"\n password: redis#123\n clientName: fish_api_dev\n database:"
},
{
"path": "biz-user/pom.xml",
"chars": 1014,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www"
},
{
"path": "biz-user/src/main/java/com/mcoding/base/user/dao/BaseUserMapper.java",
"chars": 285,
"preview": "package com.mcoding.base.user.dao;\n\nimport com.mcoding.base.user.entity.BaseUser;\nimport com.baomidou.mybatisplus.core.m"
},
{
"path": "biz-user/src/main/java/com/mcoding/base/user/entity/BaseUser.java",
"chars": 3111,
"preview": "package com.mcoding.base.user.entity;\n\nimport com.alibaba.excel.annotation.ExcelProperty;\nimport com.baomidou.mybatisplu"
},
{
"path": "biz-user/src/main/java/com/mcoding/base/user/service/BaseUserService.java",
"chars": 413,
"preview": "package com.mcoding.base.user.service;\n\nimport com.baomidou.mybatisplus.extension.service.IService;\nimport com.mcoding.b"
},
{
"path": "biz-user/src/main/java/com/mcoding/base/user/service/impl/BaseUserServiceImpl.java",
"chars": 961,
"preview": "package com.mcoding.base.user.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport "
},
{
"path": "pom.xml",
"chars": 3052,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www"
}
]
About this extraction
This page contains the full source code of the gnanquanmama/tropical-fish GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 198 files (357.2 KB), approximately 98.0k tokens, and a symbol index with 653 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.