diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000000000000000000000000000000000..e2a4b3de7e88c899db95f674bdf1fba4ebc69ac6 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,54 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates +# https://docs.github.com/zh/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "maven" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" + # 目标分支 + target-branch: "dev" + # https://docs.github.com/zh/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#ignore + ignore: + - dependency-name: org.springframework.boot:spring-boot-dependencies + # spring-boot 3.0 不支持 JDK 8 + versions: + - ">= 3" + - dependency-name: org.springframework.cloud:spring-cloud-dependencies + # spring-cloud 2022 不支持 JDK 8 + versions: + - ">= 2022" + - dependency-name: com.alibaba.cloud:spring-cloud-alibaba-dependencies + # spring-cloud-alibaba 2022 不支持 JDK 8 + versions: + - ">= 2022" + - dependency-name: com.alibaba.cloud:spring-cloud-alibaba-dependencies + # spring-cloud-alibaba 2021.1 为命名错误 + versions: + - "= 2021.1" + - dependency-name: de.codecentric:spring-boot-admin-dependencies + # spring-boot-admin 3.0 不支持 JDK 8 + versions: + - ">= 3" + - dependency-name: org.springframework.security:spring-security-oauth2-authorization-server + # spring-security-oauth2-authorization-server 1.0 不支持 JDK 8 + versions: + - ">= 1" + + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "daily" + # 目标分支 + target-branch: "sca-springboot3" + + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "daily" + # 目标分支 + target-branch: "sct-springboot3" diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index b87d69b9a586cd0f2e8a19573442b3d5ffd3a63f..082741b9465bf03bd7e41cdbbf9d7b965c85797b 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -22,6 +22,7 @@ jobs: with: java-version: ${{ matrix.java-version }} distribution: 'zulu' + cache: maven - name: mvn spring-javaformat:validate run: mvn spring-javaformat:validate diff --git a/.github/workflows/mirror.yml b/.github/workflows/mirror.yml index 47028f88f1d0a68b7cfce6d2883a767a5b06472d..35d6cb69b77f0d8318ead35f6aeb963cf2558ac6 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/mirror.yml @@ -3,8 +3,6 @@ name: 同步代码 on: push: branches: [ master,dev ] - pull_request: - branches: [ master,dev ] jobs: sync: diff --git a/README.md b/README.md index 412e642cb226a2f6498fbd28a3cac59688426a30..8f4cc7af1c505bf9d29a21b470df3631ee2e575c 100644 --- a/README.md +++ b/README.md @@ -30,20 +30,30 @@ ![](https://minio.pigx.vip/oss/1648184189.png) - - ## 快速开始 +### 分支说明 + +- master: java8 + springboot 2.7 + springcloud 2021 +- jdk17: java17 + springboot 3.0 + springcloud 2022 + +| 分支 | 说明 | +|-----------------|------------------------------------------------------------------| +| master | java8 + springboot 2.7 + springcloud 2021 | +| sca-springboot3 | java17 + springboot 3.0 + springcloud 2022 | +| sct-springboot3 | java17 + springboot 3.0 + springcloud 2022 | + + ### 核心依赖 | 依赖 | 版本 | | ---------------------- |------------| -| Spring Boot | 2.7.6 | -| Spring Cloud | 2021.0.5 | -| Spring Cloud Alibaba | 2021.0.4.0 | -| Spring Authorization Server | 0.4.0 | -| Mybatis Plus | 3.5.2 | -| hutool | 5.8.10 | +| Spring Boot | 2.7.11 | +| Spring Cloud | 2021.0.6 | +| Spring Cloud Alibaba | 2021.0.5.0 | +| Spring Authorization Server | 0.4.2 | +| Mybatis Plus | 3.5.3.1 | +| hutool | 5.8.17 | ### 模块说明 diff --git a/db/pig.sql b/db/pig.sql index 9850a86f0635f8e23f355a146c56d07c1aefaf0b..afa97a0707aab7648e591d6a959268267b9e3406 100644 --- a/db/pig.sql +++ b/db/pig.sql @@ -1,28 +1,26 @@ DROP DATABASE IF EXISTS `pig`; -CREATE DATABASE `pig` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; +CREATE DATABASE `pig` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; USE `pig`; --- ---------------------------- --- Table structure for sys_dept --- ---------------------------- DROP TABLE IF EXISTS `sys_dept` ; +-- 创建表 `sys_dept` CREATE TABLE `sys_dept` ( - `dept_id` bigint NOT NULL, - `name` varchar(50) COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门名称', - `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序', - `del_flag` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', - `parent_id` bigint DEFAULT NULL, - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`dept_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门管理'; + `dept_id` bigint NOT NULL COMMENT '部门ID', + `name` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '部门名称', + `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序值', + `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记 -1:已删除 0:正常', + `parent_id` bigint DEFAULT NULL COMMENT '父部门ID', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`dept_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='部门管理'; -- ---------------------------- -- Records of sys_dept @@ -37,17 +35,15 @@ INSERT INTO `sys_dept` VALUES (6, '产品中心', 0, '0', 3, '2020-03-13 13:15:4 INSERT INTO `sys_dept` VALUES (7, '测试中心', 0, '0', 3, '2020-03-13 13:16:02', ' ', '2021-12-31 06:59:56', ' '); COMMIT; --- ---------------------------- --- Table structure for sys_dept_relation --- ---------------------------- DROP TABLE IF EXISTS `sys_dept_relation`; +-- 创建表 `sys_dept_relation` CREATE TABLE `sys_dept_relation` ( - `ancestor` bigint NOT NULL, - `descendant` bigint NOT NULL, - PRIMARY KEY (`ancestor`,`descendant`), - KEY `idx1` (`ancestor`), - KEY `idx2` (`descendant`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='部门关系表'; + `ancestor` bigint NOT NULL COMMENT '祖先节点', + `descendant` bigint NOT NULL COMMENT '后代节点', + PRIMARY KEY (`ancestor`,`descendant`), + KEY `idx1` (`ancestor`), + KEY `idx2` (`descendant`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='部门关系表'; -- ---------------------------- -- Records of sys_dept_relation @@ -77,18 +73,18 @@ COMMIT; DROP TABLE IF EXISTS `sys_dict`; CREATE TABLE `sys_dict` ( `id` bigint NOT NULL, - `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标识', - `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', - `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '是否是系统内置', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标识', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '备注', + `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '是否是系统内置', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `sys_dict_del_flag` (`del_flag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='字典表'; -- ---------------------------- -- Records of sys_dict @@ -112,23 +108,23 @@ DROP TABLE IF EXISTS `sys_dict_item`; CREATE TABLE `sys_dict_item` ( `id` bigint NOT NULL, `dict_id` bigint NOT NULL COMMENT '字典ID', - `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典标识', - `value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '值', - `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签', - `type` varchar(100) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '字典类型', - `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', + `dict_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '字典标识', + `value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '值', + `label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '标签', + `type` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '字典类型', + `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '描述', `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序(升序)', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT ' ' COMMENT '备注', - `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标记', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT ' ' COMMENT '备注', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '修改人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`id`) USING BTREE, KEY `sys_dict_value` (`value`) USING BTREE, KEY `sys_dict_label` (`label`) USING BTREE, KEY `sys_dict_del_flag` (`del_flag`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典项'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='字典项'; -- ---------------------------- -- Records of sys_dict_item @@ -173,21 +169,22 @@ COMMIT; -- Table structure for sys_public_param -- ---------------------------- DROP TABLE IF EXISTS `sys_public_param`; +-- 创建表 `sys_public_param` CREATE TABLE `sys_public_param` ( - `public_id` bigint(0) NOT NULL COMMENT '编号', - `public_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `public_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `public_value` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `status` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0', - `validate_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ' ' COMMENT '修改人', - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', - `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间', - `public_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0', - `system_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0', - PRIMARY KEY (`public_id`) USING BTREE -) ENGINE = InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_general_ci COMMENT = '公共参数配置表'; + `public_id` bigint(0) NOT NULL COMMENT '编号', + `public_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数名称', + `public_key` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数键名', + `public_value` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '参数键值', + `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '状态,1-启用,0-禁用', + `validate_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '校验码', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ' ' COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ' ' COMMENT '修改人', + `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间', + `update_time` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '修改时间', + `public_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '参数类型,1-系统参数,2-业务参数', + `system_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '0' COMMENT '是否为系统内置参数,1-是,0-否', + PRIMARY KEY (`public_id`) USING BTREE +) ENGINE = InnoDB DEFAULT CHARSET=utf8mb4 COLLATE = utf8mb4_bin COMMENT = '公共参数配置表'; -- ---------------------------- -- Records of sys_public_param @@ -203,19 +200,19 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_file`; CREATE TABLE `sys_file` ( - `id` bigint NOT NULL, - `file_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `bucket_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `original` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `file_size` bigint DEFAULT NULL COMMENT '文件大小', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '0-正常,1-删除', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='文件管理表'; + `id` bigint NOT NULL COMMENT '文件ID', + `file_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件名称', + `bucket_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件存储桶名称', + `original` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '原始文件名', + `type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '文件类型', + `file_size` bigint DEFAULT NULL COMMENT '文件大小', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标志:0-正常,1-删除', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建者', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='文件管理表'; -- ---------------------------- -- Records of sys_file @@ -229,27 +226,27 @@ COMMIT; DROP TABLE IF EXISTS `sys_log`; CREATE TABLE `sys_log` ( `id` bigint NOT NULL, - `type` char(1) COLLATE utf8_general_ci DEFAULT '1' COMMENT '日志类型', - `title` varchar(255) COLLATE utf8_general_ci DEFAULT '' COMMENT '日志标题', - `service_id` varchar(32) COLLATE utf8_general_ci DEFAULT NULL COMMENT '服务ID', - `remote_addr` varchar(255) COLLATE utf8_general_ci DEFAULT NULL COMMENT '操作IP地址', - `user_agent` varchar(1000) COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户代理', - `request_uri` varchar(255) COLLATE utf8_general_ci DEFAULT NULL COMMENT '请求URI', - `method` varchar(10) COLLATE utf8_general_ci DEFAULT NULL COMMENT '操作方式', - `params` text COLLATE utf8_general_ci COMMENT '操作提交的数据', + `type` char(1) COLLATE utf8mb4_bin DEFAULT '1' COMMENT '日志类型', + `title` varchar(255) COLLATE utf8mb4_bin DEFAULT '' COMMENT '日志标题', + `service_id` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '服务ID', + `remote_addr` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作IP地址', + `user_agent` varchar(1000) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户代理', + `request_uri` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '请求URI', + `method` varchar(10) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '操作方式', + `params` text COLLATE utf8mb4_bin COMMENT '操作提交的数据', `time` bigint DEFAULT NULL COMMENT '执行时间', - `del_flag` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', - `exception` text COLLATE utf8_general_ci COMMENT '异常信息', + `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', + `exception` text COLLATE utf8mb4_bin COMMENT '异常信息', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`id`), KEY `sys_log_create_by` (`create_by`), KEY `sys_log_request_uri` (`request_uri`), KEY `sys_log_type` (`type`), KEY `sys_log_create_date` (`create_time`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='日志表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='日志表'; -- ---------------------------- -- Records of sys_log @@ -263,21 +260,21 @@ COMMIT; DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( `menu_id` bigint NOT NULL, - `name` varchar(32) COLLATE utf8_general_ci NOT NULL COMMENT '菜单名称', - `permission` varchar(32) COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单权限标识', - `path` varchar(128) COLLATE utf8_general_ci DEFAULT NULL COMMENT '前端URL', + `name` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '菜单名称', + `permission` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '菜单权限标识', + `path` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '前端URL', `parent_id` bigint DEFAULT NULL COMMENT '父菜单ID', - `icon` varchar(32) COLLATE utf8_general_ci DEFAULT NULL COMMENT '图标', + `icon` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '图标', `sort_order` int NOT NULL DEFAULT '0' COMMENT '排序值', - `keep_alive` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '0-开启,1- 关闭', - `type` char(1) COLLATE utf8_general_ci DEFAULT NULL COMMENT '菜单类型 (0菜单 1按钮)', - `del_flag` char(1) COLLATE utf8_general_ci DEFAULT '0' COMMENT '逻辑删除标记(0--正常 1--删除)', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', + `keep_alive` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-开启,1- 关闭', + `type` char(1) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '菜单类型 (0菜单 1按钮)', + `del_flag` char(1) COLLATE utf8mb4_bin DEFAULT '0' COMMENT '逻辑删除标记(0--正常 1--删除)', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '修改人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', `update_time` datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`menu_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='菜单权限表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='菜单权限表'; -- ---------------------------- -- Records of sys_menu @@ -348,23 +345,23 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_oauth_client_details`; CREATE TABLE `sys_oauth_client_details` ( - `client_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户端ID', - `resource_ids` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '资源列表', - `client_secret` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '客户端密钥', - `scope` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '域', - `authorized_grant_types` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '认证类型', - `web_server_redirect_uri` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '重定向地址', - `authorities` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '角色列表', + `client_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '客户端ID', + `resource_ids` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '资源列表', + `client_secret` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '客户端密钥', + `scope` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '域', + `authorized_grant_types` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '认证类型', + `web_server_redirect_uri` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '重定向地址', + `authorities` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '角色列表', `access_token_validity` int DEFAULT NULL COMMENT 'token 有效期', `refresh_token_validity` int DEFAULT NULL COMMENT '刷新令牌有效期', - `additional_information` varchar(4096) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '令牌扩展字段JSON', - `autoapprove` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '是否自动放行', + `additional_information` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '令牌扩展字段JSON', + `autoapprove` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '是否自动放行', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '更新时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`client_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='终端信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='终端信息表'; -- ---------------------------- -- Records of sys_oauth_client_details @@ -384,17 +381,17 @@ COMMIT; DROP TABLE IF EXISTS `sys_post`; CREATE TABLE `sys_post` ( `post_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '岗位ID', - `post_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '岗位编码', - `post_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '岗位名称', + `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位编码', + `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '岗位名称', `post_sort` int(0) NOT NULL COMMENT '岗位排序', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '是否删除 -1:已删除 0:正常', `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '创建人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '创建人', `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '更新人', - `remark` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注信息', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT '' COMMENT '更新人', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '备注信息', PRIMARY KEY (`post_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT = '岗位信息表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT = '岗位信息表'; -- ---------------------------- -- Records of sys_post @@ -413,7 +410,7 @@ CREATE TABLE `sys_user_post` ( `user_id` bigint(0) NOT NULL COMMENT '用户ID', `post_id` bigint(0) NOT NULL COMMENT '岗位ID', PRIMARY KEY (`user_id`, `post_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT = '用户与岗位关联表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT = '用户与岗位关联表'; -- ---------------------------- -- Records of sys_user_post @@ -427,18 +424,18 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( - `role_id` bigint NOT NULL, - `role_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `role_code` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - `role_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL, - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标识(0-正常,1-删除)', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '修改人', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - PRIMARY KEY (`role_id`), - UNIQUE KEY `role_idx1_role_code` (`role_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统角色表'; + `role_id` bigint NOT NULL COMMENT '角色ID', + `role_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色名称', + `role_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '角色代码', + `role_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '角色描述', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标识:0-正常,1-删除', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '修改人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + PRIMARY KEY (`role_id`), + UNIQUE KEY `role_idx1_role_code` (`role_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='系统角色表'; -- ---------------------------- -- Records of sys_role @@ -453,10 +450,10 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_role_menu`; CREATE TABLE `sys_role_menu` ( - `role_id` bigint NOT NULL, - `menu_id` bigint NOT NULL, - PRIMARY KEY (`role_id`,`menu_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='角色菜单表'; + `role_id` bigint NOT NULL COMMENT '角色ID', + `menu_id` bigint NOT NULL COMMENT '菜单ID', + PRIMARY KEY (`role_id`,`menu_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='角色菜单表'; -- ---------------------------- -- Records of sys_role_menu @@ -530,21 +527,21 @@ COMMIT; DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `user_id` bigint NOT NULL, - `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名', - `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码', - `salt` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '随机盐', - `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '简介', - `avatar` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '头像', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '用户名', + `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '密码', + `salt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '随机盐', + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '简介', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '头像', `dept_id` bigint DEFAULT NULL COMMENT '部门ID', - `lock_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '0-正常,9-锁定', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '0-正常,1-删除', + `lock_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,9-锁定', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '0-正常,1-删除', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `create_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建者', - `update_by` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建者', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', PRIMARY KEY (`user_id`), KEY `user_idx1_username` (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户表'; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='用户表'; -- ---------------------------- -- Records of sys_user @@ -558,10 +555,10 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `sys_user_role`; CREATE TABLE `sys_user_role` ( - `user_id` bigint NOT NULL, - `role_id` bigint NOT NULL, - PRIMARY KEY (`user_id`,`role_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户角色表'; + `user_id` bigint NOT NULL COMMENT '用户ID', + `role_id` bigint NOT NULL COMMENT '角色ID', + PRIMARY KEY (`user_id`,`role_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC COMMENT='用户角色表'; -- ---------------------------- -- Records of sys_user_role diff --git a/db/pig_codegen.sql b/db/pig_codegen.sql index 7f8859f2922b32acb19547e06389abf98fea7f84..791d139352bd6ca24c3c0f0b1600a46ed9f198a6 100644 --- a/db/pig_codegen.sql +++ b/db/pig_codegen.sql @@ -1,8 +1,8 @@ DROP DATABASE IF EXISTS `pig_codegen`; -CREATE DATABASE `pig_codegen` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; +CREATE DATABASE `pig_codegen` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; -SET NAMES utf8; +SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; USE `pig_codegen`; @@ -12,18 +12,18 @@ USE `pig_codegen`; -- ---------------------------- DROP TABLE IF EXISTS `gen_datasource_conf`; CREATE TABLE `gen_datasource_conf` ( - `id` bigint NOT NULL, - `name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '数据源名称', - `url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT 'jdbc-url', - `username` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '用户名', - `password` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='数据源表'; + `id` bigint NOT NULL COMMENT '数据源ID', + `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '数据源名称', + `url` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'jdbc-url', + `username` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户名', + `password` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='数据源表'; -- ---------------------------- -- Records of gen_datasource_conf @@ -36,17 +36,17 @@ COMMIT; -- ---------------------------- DROP TABLE IF EXISTS `gen_form_conf`; CREATE TABLE `gen_form_conf` ( - `id` bigint NOT NULL, - `table_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '表名', - `form_info` json NOT NULL COMMENT '表单信息', - `del_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '删除标记', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '创建人', - `update_time` datetime DEFAULT NULL COMMENT '修改时间', - `update_by` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT '更新人', - PRIMARY KEY (`id`) USING BTREE, - KEY `table_name` (`table_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='表单配置'; + `id` bigint NOT NULL COMMENT '表单配置ID', + `table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '表名', + `form_info` json NOT NULL COMMENT '表单信息', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT '0' COMMENT '删除标记', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '创建人', + `update_time` datetime DEFAULT NULL COMMENT '修改时间', + `update_by` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '更新人', + PRIMARY KEY (`id`) USING BTREE, + KEY `table_name` (`table_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='表单配置'; -- ---------------------------- -- Records of gen_form_conf diff --git a/db/pig_config.sql b/db/pig_config.sql index ef21140649dc4759e6f2103b50131f767d583d8a..3a404bb03cbac087a2b253f0b9b32544c89ffb24 100644 --- a/db/pig_config.sql +++ b/db/pig_config.sql @@ -37,12 +37,12 @@ CREATE TABLE `config_info` ( -- Records of config_info -- ---------------------------- BEGIN; -INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 加解密根密码\njasypt:\n encryptor:\n password: pig #根密码\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# spring security 配置\nsecurity:\n oauth2:\n # 通用放行URL,服务个性化,请在对应配置文件覆盖\n ignore:\n urls:\n - /v3/api-docs\n - /actuator/**\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server\n services:\n pig-upms-biz: admin\n pig-codegen: gen', 'a9fec7814841cfa5db8db2e4e6bdbf50', '2022-05-08 12:10:37', '2022-08-07 14:40:17', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); +INSERT INTO `config_info` VALUES (1, 'application-dev.yml', 'DEFAULT_GROUP', '# 配置文件加密根密码\njasypt:\n encryptor:\n password: pig\n algorithm: PBEWithMD5AndDES\n iv-generator-classname: org.jasypt.iv.NoIvGenerator\n \n# Spring 相关\nspring:\n cache:\n type: redis\n redis:\n host: pig-redis\n cloud:\n sentinel:\n eager: true\n transport:\n dashboard: pig-sentinel:5003\n\n# 暴露监控端点\nmanagement:\n endpoints:\n web:\n exposure:\n include: \"*\" \n endpoint:\n health:\n show-details: ALWAYS\n\n\n# feign 配置\nfeign:\n sentinel:\n enabled: true\n okhttp:\n enabled: true\n httpclient:\n enabled: false\n client:\n config:\n default:\n connectTimeout: 10000\n readTimeout: 10000\n compression:\n request:\n enabled: true\n response:\n enabled: true\n\n# mybaits-plus配置\nmybatis-plus:\n mapper-locations: classpath:/mapper/*Mapper.xml\n global-config:\n banner: false\n db-config:\n id-type: auto\n table-underline: true\n logic-delete-value: 1\n logic-not-delete-value: 0\n configuration:\n map-underscore-to-camel-case: true\n\n# swagger 配置\nswagger:\n enabled: true\n title: Pig Swagger API\n gateway: http://${GATEWAY_HOST:pig-gateway}:${GATEWAY-PORT:9999}\n token-url: ${swagger.gateway}/auth/oauth2/token\n scope: server\n services:\n pig-upms-biz: admin\n pig-codegen: gen', '81f8bae4b8125fd198704f797268c6b5', '2022-05-08 12:10:37', '2023-02-28 14:45:23', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (2, 'pig-auth-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n freemarker:\n allow-request-override: false\n allow-session-override: false\n cache: true\n charset: UTF-8\n check-template-location: true\n content-type: text/html\n enabled: true\n expose-request-attributes: false\n expose-session-attributes: false\n expose-spring-macro-helpers: true\n prefer-file-system-access: true\n suffix: .ftl\n template-loader-path: classpath:/templates/', '74f53b71c7799aa754da75662378b93c', '2022-05-08 12:10:37', '2022-06-04 14:15:35', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); -INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '## spring security 配置\nsecurity:\n oauth2:\n client:\n client-id: ENC(27v1agvAug87ANOVnbKdsw==)\n client-secret: ENC(VbnkopxrwgbFVKp+UxJ2pg==)\n scope: server\n\n# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', '02fe9e81c41986626067b8cbe589b77f', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); +INSERT INTO `config_info` VALUES (3, 'pig-codegen-dev.yml', 'DEFAULT_GROUP', '# 数据源配置\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig_codegen?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n resources:\n static-locations: classpath:/static/,classpath:/views/\n', 'cf786dbe3b07074fc187bf2eab3266b1', '2022-05-08 12:10:37', '2023-01-28 14:05:36', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (4, 'pig-gateway-dev.yml', 'DEFAULT_GROUP', 'spring:\n cloud:\n gateway:\n locator:\n enabled: true\n routes:\n # 认证中心\n - id: pig-auth\n uri: lb://pig-auth\n predicates:\n - Path=/auth/**\n filters:\n # 验证码处理\n - ValidateCodeGatewayFilter\n # 前端密码解密\n - PasswordDecoderFilter\n #UPMS 模块\n - id: pig-upms-biz\n uri: lb://pig-upms-biz\n predicates:\n - Path=/admin/**\n filters:\n # 限流配置\n - name: RequestRateLimiter\n args:\n key-resolver: \'#{@remoteAddrKeyResolver}\'\n redis-rate-limiter.replenishRate: 100\n redis-rate-limiter.burstCapacity: 200\n # 代码生成模块\n - id: pig-codegen\n uri: lb://pig-codegen\n predicates:\n - Path=/gen/**\n # 固定路由转发配置 无修改\n - id: openapi\n uri: lb://pig-gateway\n predicates:\n - Path=/v3/api-docs/**\n filters:\n - RewritePath=/v3/api-docs/(?.*), /$\\{path}/$\\{path}/v3/api-docs\n\ngateway:\n encode-key: \'thanks,pig4cloud\'\n ignore-clients:\n - test\n - client', '000988cf0102382d3f23df35027b47fd', '2022-05-08 12:10:37', '2022-06-07 14:00:11', 'nacos', '127.0.0.1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (5, 'pig-monitor-dev.yml', 'DEFAULT_GROUP', 'spring:\n autoconfigure:\n exclude: com.pig4cloud.pig.common.core.config.JacksonConfiguration\n # 安全配置\n security:\n user:\n name: ENC(8Hk2ILNJM8UTOuW/Xi75qg==) # pig\n password: ENC(o6cuPFfUevmTbkmBnE67Ow====) # pig\n', '650bdfa15f60f3faa84dfe6e6878b8cf', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); -INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', 'security:\n oauth2:\n client:\n client-id: ENC(imENTO7M8bLO38LFSIxnzw==)\n client-secret: ENC(i3cDFhs26sa2Ucrfz2hnQw==)\n scope: server\n\n# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\noss:\n endpoint: http://minio.pig4cloud.com\n accessKey: lengleng\n secretKey: lengleng\n bucket-name: tmp', '107614b40932e8237787b769e0937ed2', '2022-05-08 12:10:37', '2022-05-08 12:10:37', NULL, '127.0.0.1', '', '', NULL, NULL, NULL, 'yaml', NULL, ''); +INSERT INTO `config_info` VALUES (6, 'pig-upms-biz-dev.yml', 'DEFAULT_GROUP', '# 数据源\nspring:\n datasource:\n type: com.zaxxer.hikari.HikariDataSource\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: root\n password: root\n url: jdbc:mysql://pig-mysql:3306/pig?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n\n# 文件上传相关 支持阿里云、华为云、腾讯、minio\noss:\n endpoint: http://minio.pig4cloud.com\n accessKey: lengleng\n secretKey: lengleng\n bucket-name: tmp', '899d2431d91da0d521378cc7fa61268d', '2022-05-08 12:10:37', '2023-01-28 14:01:46', '', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); INSERT INTO `config_info` VALUES (7, 'pig-xxl-job-admin-dev.yml', 'DEFAULT_GROUP', '# xxl\nxxl:\n job:\n accessToken: default_token\n i18n: zh_CN\n logretentiondays: 30\n triggerpool:\n fast.max: 200\n slow.max: 200\n\n# mybatis\nmybatis:\n mapper-locations: classpath:/mybatis-mapper/*Mapper.xml\n\nspring:\n datasource:\n url: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pig_job}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true\n driver-class-name: com.mysql.cj.jdbc.Driver\n username: ${MYSQL_USER:root}\n password: ${MYSQL_PWD:root}\n mvc:\n static-path-pattern: /static/**\n freemarker:\n suffix: .ftl\n request-context-attribute: request\n settings:\n number_format: 0.##########\n mail:\n host: smtp.mxhichina.com\n port: 465\n from: xxxx@gitee.wang\n username: xxxx@gitee.wang\n password: xxxx\n properties:\n mail:\n smtp:\n auth: true\n ssl.enable: true\n starttls.enable: false\n required: false\n# spring boot admin 配置\n\nmanagement:\n health:\n mail:\n enabled: false\n endpoints:\n web:\n exposure:\n include: \'*\'\n endpoint:\n health:\n show-details: ALWAYS\n\n', 'b67cbbd37c8b42cdc6521780b3ed742a', '2022-11-27 17:23:42', '2022-11-27 17:28:01', 'nacos', '0:0:0:0:0:0:0:1', '', '', '', '', '', 'yaml', '', ''); COMMIT; diff --git a/db/pig_job.sql b/db/pig_job.sql index 585c6e8bf1b3554de2f4d752bc3a7f20b1a93e32..766178296f540d33db266d7944a47753ece907dd 100644 --- a/db/pig_job.sql +++ b/db/pig_job.sql @@ -1,10 +1,10 @@ DROP DATABASE IF EXISTS `pig_job`; -CREATE DATABASE `pig_job` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; +CREATE DATABASE `pig_job` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; use `pig_job`; -SET NAMES utf8; +SET NAMES utf8mb4; CREATE TABLE `xxl_job_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -32,7 +32,7 @@ CREATE TABLE `xxl_job_info` ( `trigger_last_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '上次调度时间', `trigger_next_time` bigint(13) NOT NULL DEFAULT '0' COMMENT '下次调度时间', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, @@ -53,7 +53,7 @@ CREATE TABLE `xxl_job_log` ( PRIMARY KEY (`id`), KEY `I_trigger_time` (`trigger_time`), KEY `I_handle_code` (`handle_code`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_log_report` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -64,7 +64,7 @@ CREATE TABLE `xxl_job_log_report` ( `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `i_trigger_day` (`trigger_day`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_logglue` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -75,7 +75,7 @@ CREATE TABLE `xxl_job_logglue` ( `add_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_registry` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -85,7 +85,7 @@ CREATE TABLE `xxl_job_registry` ( `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), KEY `i_g_k_v` (`registry_group`,`registry_key`,`registry_value`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_group` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -95,7 +95,7 @@ CREATE TABLE `xxl_job_group` ( `address_list` text COMMENT '执行器地址列表,多地址逗号分隔', `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, @@ -105,12 +105,12 @@ CREATE TABLE `xxl_job_user` ( `permission` varchar(255) DEFAULT NULL COMMENT '权限:执行器ID列表,多个逗号分割', PRIMARY KEY (`id`), UNIQUE KEY `i_username` (`username`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `xxl_job_lock` ( `lock_name` varchar(50) NOT NULL COMMENT '锁名称', PRIMARY KEY (`lock_name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `xxl_job_group`(`id`, `app_name`, `title`, `address_type`, `address_list`, `update_time`) VALUES (1, 'xxl-job-executor-sample', '示例执行器', 0, NULL, '2018-11-03 22:21:31' ); INSERT INTO `xxl_job_info`(`id`, `job_group`, `job_desc`, `add_time`, `update_time`, `author`, `alarm_email`, `schedule_type`, `schedule_conf`, `misfire_strategy`, `executor_route_strategy`, `executor_handler`, `executor_param`, `executor_block_strategy`, `executor_timeout`, `executor_fail_retry_count`, `glue_type`, `glue_source`, `glue_remark`, `glue_updatetime`, `child_jobid`) VALUES (1, 1, '测试任务1', '2018-11-03 22:21:31', '2018-11-03 22:21:31', 'XXL', '', 'CRON', '0 0 0 * * ? *', 'DO_NOTHING', 'FIRST', 'demoJobHandler', '', 'SERIAL_EXECUTION', 0, 0, 'BEAN', '', 'GLUE代码初始化', '2018-11-03 22:21:31', ''); diff --git a/docker-compose.yml b/docker-compose.yml index be4193263a711c9f496c142fc9e4faa3f257b1e8..3380751d680e7175bec8baaefb9d19a69a152e0b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,13 +9,9 @@ services: restart: always container_name: pig-mysql image: pig-mysql - ports: - - 3306:3306 pig-redis: image: redis:7.0.0 - ports: - - 6379:6379 restart: always container_name: pig-redis hostname: pig-redis diff --git a/pig-auth/pom.xml b/pig-auth/pom.xml index 1e5e2da47c9c7087d584f1b5064692ad4e8d1e1c..9557d78de3f53e184bae675d41c99a3bc4fecfca 100755 --- a/pig-auth/pom.xml +++ b/pig-auth/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.7 pig-auth diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java index a6e9105d567dcad462d5fdef34d94a1c30677a24..a67f2c85e51392111d70f0d106c51f7816f4dcc6 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/AuthorizationServerConfiguration.java @@ -17,24 +17,30 @@ package com.pig4cloud.pig.auth.config; import com.pig4cloud.pig.auth.support.CustomeOAuth2AccessTokenGenerator; +import com.pig4cloud.pig.auth.support.MaxKeyOAuth2AccessTokenGenerator; import com.pig4cloud.pig.auth.support.core.CustomeOAuth2TokenCustomizer; import com.pig4cloud.pig.auth.support.core.FormIdentityLoginConfigurer; import com.pig4cloud.pig.auth.support.core.PigDaoAuthenticationProvider; import com.pig4cloud.pig.auth.support.handler.PigAuthenticationFailureEventHandler; import com.pig4cloud.pig.auth.support.handler.PigAuthenticationSuccessEventHandler; +import com.pig4cloud.pig.auth.support.maxkey.OAuth2MaxKeyAuthenticationConvert; +import com.pig4cloud.pig.auth.support.maxkey.OAuth2MaxKeyAuthenticationProvider; import com.pig4cloud.pig.auth.support.password.OAuth2ResourceOwnerPasswordAuthenticationConverter; import com.pig4cloud.pig.auth.support.password.OAuth2ResourceOwnerPasswordAuthenticationProvider; import com.pig4cloud.pig.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationConverter; import com.pig4cloud.pig.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationProvider; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration; import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator; @@ -44,14 +50,13 @@ import org.springframework.security.oauth2.server.authorization.web.authenticati import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationConverter; -import org.springframework.security.web.util.matcher.RequestMatcher; import java.util.Arrays; /** * @author lengleng * @date 2022/5/27 - * + *

* 认证服务器配置 */ @Configuration @@ -63,25 +68,34 @@ public class AuthorizationServerConfiguration { @Bean @Order(Ordered.HIGHEST_PRECEDENCE) public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { - OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer(); - - http.apply(authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 - tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter - .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 - .errorResponseHandler(new PigAuthenticationFailureEventHandler());// 登录失败处理器 - }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 - oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new PigAuthenticationFailureEventHandler()))// 处理客户端认证异常 + + // OAuth 2.1 默认配置 + // 缺省配置:authorizeRequests.anyRequest().authenticated()、 + // csrf.ignoringRequestMatchers(endpointsMatcher) 等等 + OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); + + // 使用 HttpSecurity 获取 OAuth 2.1 配置中的 OAuth2AuthorizationServerConfigurer 对象 + OAuth2AuthorizationServerConfigurer authorizationServerConfigurer = http + .getConfigurer(OAuth2AuthorizationServerConfigurer.class); + + authorizationServerConfigurer.tokenEndpoint((tokenEndpoint) -> {// 个性化认证授权端点 + tokenEndpoint.accessTokenRequestConverter(accessTokenRequestConverter()) // 注入自定义的授权认证Converter + .accessTokenResponseHandler(new PigAuthenticationSuccessEventHandler()) // 登录成功处理器 + .errorResponseHandler(new PigAuthenticationFailureEventHandler());// 登录失败处理器 + }).clientAuthentication(oAuth2ClientAuthenticationConfigurer -> // 个性化客户端认证 + oAuth2ClientAuthenticationConfigurer.errorResponseHandler(new PigAuthenticationFailureEventHandler()))// 处理客户端认证异常 .authorizationEndpoint(authorizationEndpoint -> authorizationEndpoint// 授权码端点个性化confirm页面 - .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI))); - - RequestMatcher endpointsMatcher = authorizationServerConfigurer.getEndpointsMatcher(); - DefaultSecurityFilterChain securityFilterChain = http.requestMatcher(endpointsMatcher) - .authorizeRequests(authorizeRequests -> authorizeRequests.anyRequest().authenticated()) - .apply(authorizationServerConfigurer.authorizationService(authorizationService)// redis存储token的实现 - .authorizationServerSettings(AuthorizationServerSettings.builder() - .issuer(SecurityConstants.PROJECT_LICENSE).build())) + .consentPage(SecurityConstants.CUSTOM_CONSENT_PAGE_URI)); + + DefaultSecurityFilterChain securityFilterChain = authorizationServerConfigurer + .authorizationService(authorizationService)// redis存储token的实现 + .authorizationServerSettings( + AuthorizationServerSettings.builder().issuer(SecurityConstants.PROJECT_LICENSE).build()) // 授权码登录的登录页个性化 - .and().apply(new FormIdentityLoginConfigurer()).and().build(); + .and() + .apply(new FormIdentityLoginConfigurer()) + .and() + .build(); // 注入自定义授权模式实现 addCustomOAuth2GrantAuthenticationProvider(http); @@ -91,9 +105,10 @@ public class AuthorizationServerConfiguration { /** * 令牌生成规则实现
* client:username:uuid + * * @return OAuth2TokenGenerator */ - @Bean + @Bean(name = "oAuth2TokenGenerator") public OAuth2TokenGenerator oAuth2TokenGenerator() { CustomeOAuth2AccessTokenGenerator accessTokenGenerator = new CustomeOAuth2AccessTokenGenerator(); // 注入Token 增加关联用户信息 @@ -101,8 +116,18 @@ public class AuthorizationServerConfiguration { return new DelegatingOAuth2TokenGenerator(accessTokenGenerator, new OAuth2RefreshTokenGenerator()); } + @Bean(name = "maxKeyOAuth2TokenGenerator") + public OAuth2TokenGenerator maxKeyOAuth2TokenGenerator() { + MaxKeyOAuth2AccessTokenGenerator maxKeyOAuth2AccessTokenGenerator = new MaxKeyOAuth2AccessTokenGenerator(); + // 注入Token 增加关联用户信息 + maxKeyOAuth2AccessTokenGenerator.setAccessTokenCustomizer(new CustomeOAuth2TokenCustomizer()); + return new DelegatingOAuth2TokenGenerator(maxKeyOAuth2AccessTokenGenerator, new OAuth2RefreshTokenGenerator()); + } + + /** * request -> xToken 注入请求转换器 + * * @return DelegatingAuthenticationConverter */ private AuthenticationConverter accessTokenRequestConverter() { @@ -111,15 +136,16 @@ public class AuthorizationServerConfiguration { new OAuth2ResourceOwnerSmsAuthenticationConverter(), new OAuth2RefreshTokenAuthenticationConverter(), new OAuth2ClientCredentialsAuthenticationConverter(), new OAuth2AuthorizationCodeAuthenticationConverter(), + new OAuth2MaxKeyAuthenticationConvert(), new OAuth2AuthorizationCodeRequestAuthenticationConverter())); } /** * 注入授权模式实现提供方 - * + *

* 1. 密码模式
* 2. 短信登录
- * + * 3. MaxKey授权码登陆
*/ @SuppressWarnings("unchecked") private void addCustomOAuth2GrantAuthenticationProvider(HttpSecurity http) { @@ -132,12 +158,16 @@ public class AuthorizationServerConfiguration { OAuth2ResourceOwnerSmsAuthenticationProvider resourceOwnerSmsAuthenticationProvider = new OAuth2ResourceOwnerSmsAuthenticationProvider( authenticationManager, authorizationService, oAuth2TokenGenerator()); + OAuth2MaxKeyAuthenticationProvider oAuth2MaxKeyAuthenticationProvider = new OAuth2MaxKeyAuthenticationProvider(authenticationManager, authorizationService, oAuth2TokenGenerator()); + // 处理 UsernamePasswordAuthenticationToken http.authenticationProvider(new PigDaoAuthenticationProvider()); // 处理 OAuth2ResourceOwnerPasswordAuthenticationToken http.authenticationProvider(resourceOwnerPasswordAuthenticationProvider); // 处理 OAuth2ResourceOwnerSmsAuthenticationToken http.authenticationProvider(resourceOwnerSmsAuthenticationProvider); + // 处理 oAuth2MaxKeyAuthenticationProvider + http.authenticationProvider(oAuth2MaxKeyAuthenticationProvider); } } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java index 0ebc699d9a1821d14d1b01016b6e18c8ce9d481d..1fa2893ef7f58678da92345744946a7ed262f129 100755 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/config/WebSecurityConfiguration.java @@ -41,9 +41,15 @@ public class WebSecurityConfiguration { */ @Bean SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { - http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*").permitAll()// 开放自定义的部分端点 - .anyRequest().authenticated()).headers().frameOptions().sameOrigin()// 避免iframe同源无法登录 - .and().apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 + http.authorizeRequests(authorizeRequests -> authorizeRequests.antMatchers("/token/*","/maxkey/*") + .permitAll()// 开放自定义的部分端点 + .anyRequest() + .authenticated()) + .headers() + .frameOptions() + .sameOrigin()// 避免iframe同源无法登录 + .and() + .apply(new FormIdentityLoginConfigurer()); // 表单登录个性化 // 处理 UsernamePasswordAuthenticationToken http.authenticationProvider(new PigDaoAuthenticationProvider()); return http.build(); @@ -61,8 +67,13 @@ public class WebSecurityConfiguration { @Order(0) SecurityFilterChain resources(HttpSecurity http) throws Exception { http.requestMatchers((matchers) -> matchers.antMatchers("/actuator/**", "/css/**", "/error")) - .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()).requestCache().disable() - .securityContext().disable().sessionManagement().disable(); + .authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll()) + .requestCache() + .disable() + .securityContext() + .disable() + .sessionManagement() + .disable(); return http.build(); } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java index 99b64714535553384f0c626854da741e39a46268..bab2df56f9914f459d8110bd283617863b342853 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/endpoint/PigTokenEndpoint.java @@ -62,6 +62,7 @@ import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.security.Principal; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -91,23 +92,27 @@ public class PigTokenEndpoint { /** * 认证页面 + * * @param modelAndView - * @param error 表单登录失败处理回调的错误信息 + * @param error 表单登录失败处理回调的错误信息 * @return ModelAndView */ @GetMapping("/login") public ModelAndView require(ModelAndView modelAndView, @RequestParam(required = false) String error) { modelAndView.setViewName("ftl/login"); + Map map = new HashMap<>(); modelAndView.addObject("error", error); return modelAndView; + } @GetMapping("/confirm_access") public ModelAndView confirm(Principal principal, ModelAndView modelAndView, - @RequestParam(OAuth2ParameterNames.CLIENT_ID) String clientId, - @RequestParam(OAuth2ParameterNames.SCOPE) String scope, - @RequestParam(OAuth2ParameterNames.STATE) String state) { - SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)).getData() + @RequestParam(OAuth2ParameterNames.CLIENT_ID) String clientId, + @RequestParam(OAuth2ParameterNames.SCOPE) String scope, + @RequestParam(OAuth2ParameterNames.STATE) String state) { + SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)) + .getData() .orElseThrow(() -> new OAuthClientException("clientId 不合法")); Set authorizedScopes = StringUtils.commaDelimitedListToSet(clientDetails.getScope()); @@ -121,6 +126,7 @@ public class PigTokenEndpoint { /** * 退出并删除token + * * @param authHeader Authorization */ @DeleteMapping("/logout") @@ -135,6 +141,7 @@ public class PigTokenEndpoint { /** * 校验token + * * @param token 令牌 */ @SneakyThrows @@ -165,6 +172,7 @@ public class PigTokenEndpoint { /** * 令牌管理调用 + * * @param token token */ @Inner @@ -191,6 +199,7 @@ public class PigTokenEndpoint { /** * 查询token + * * @param params 分页参数 * @return */ diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/facade/MaxKeySSOServiceFacade.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/facade/MaxKeySSOServiceFacade.java new file mode 100644 index 0000000000000000000000000000000000000000..690784e01437245fca28164aca324ea09db9745b --- /dev/null +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/facade/MaxKeySSOServiceFacade.java @@ -0,0 +1,82 @@ +package com.pig4cloud.pig.auth.facade; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.IOException; + +@Service +public class MaxKeySSOServiceFacade { + + @Value("${sso.maxkey.oauth2.maxkey_token_uri:http://sso.maxkey.top/sign/authz/oauth/v20/token?client_id=%s&client_secret=%s&grant_type=%s&redirect_uri=%s&code=%s}") + private String maxkeyTokenUri; + + @Value("${sso.maxkey.oauth2.maxkey_getme_uri:http://sso.maxkey.top/sign/api/oauth/v20/me?access_token=%s}") + private String maxkeyGetmeUri; + + @Value("${sso.maxkey.oauth2.client_id:b32834accb544ea7a9a09dcae4a36403}") + private String clientId; + + @Value("${sso.maxkey.oauth2.response_type:code}") + private String responseType; + + @Value("${sso.maxkey.oauth2.redirect_uri:http://localhost:8080/login}") + private String redirectUri; + + @Value("${sso.maxkey.oauth2.client_secret:E9UO53P3JH52aQAcnLP2FlLv8olKIB7u}") + private String clientSecret; + @Value("${sso.maxkey.oauth2.grant_type:authorization_code}") + private String grantType; + + @Resource + OkHttpClient okHttpClient; + + + // TODO + public String getUserInfoByToken(String accessToken) { + String userInfo; + try { + String url = String.format(maxkeyGetmeUri, accessToken); + Request request = new Request.Builder() + //参数放到链接后面 + .url(url).build(); + //发送请求 + Response response = okHttpClient.newCall(request).execute(); + //将响应数据转换字符传(实际是json字符传) + userInfo = response.body().string(); + JSONObject jsonObject = JSON.parseObject(userInfo); + System.out.println(jsonObject); + } catch (IOException e) { + throw new RuntimeException(e); + } + return userInfo; + } + + // TODO + public String getTokenByCode(String code) { + String accessToken; + try { + String url = String.format(maxkeyTokenUri, clientId, clientSecret, grantType, redirectUri, code); + Request request = new Request.Builder() + //参数放到链接后面 + .url(url).build(); + //发送请求 + Response response = okHttpClient.newCall(request).execute(); + //将响应数据转换字符传(实际是json字符传) + + accessToken = JSONObject.parseObject(response.body().string()).getString("access_token"); + + } catch (IOException e) { + throw new RuntimeException(e); + } + + return accessToken; + } + +} diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/CustomeOAuth2AccessTokenGenerator.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/CustomeOAuth2AccessTokenGenerator.java index 7865f68d376b6fb1a8d21c239dcbd1f5f69b6679..667f6da5ada7b3382a871bc1233a4c93f85942e4 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/CustomeOAuth2AccessTokenGenerator.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/CustomeOAuth2AccessTokenGenerator.java @@ -30,7 +30,7 @@ public class CustomeOAuth2AccessTokenGenerator implements OAuth2TokenGenerator { + + private OAuth2TokenCustomizer accessTokenCustomizer; + + @Nullable + @Override + public OAuth2AccessToken generate(OAuth2TokenContext context) { + if (!OAuth2TokenType.ACCESS_TOKEN.equals(context.getTokenType()) || !OAuth2TokenFormat.REFERENCE + .equals(context.getRegisteredClient().getTokenSettings().getAccessTokenFormat())) { + return null; + } + + String issuer = null; + if (context.getAuthorizationServerContext() != null) { + issuer = context.getAuthorizationServerContext().getIssuer(); + } + RegisteredClient registeredClient = context.getRegisteredClient(); + + Instant issuedAt = Instant.now(); + Instant expiresAt = issuedAt.plus(registeredClient.getTokenSettings().getAccessTokenTimeToLive()); + + // @formatter:off + OAuth2TokenClaimsSet.Builder claimsBuilder = OAuth2TokenClaimsSet.builder(); + if (StringUtils.hasText(issuer)) { + claimsBuilder.issuer(issuer); + } + claimsBuilder + .subject(context.getPrincipal().getName()) + .audience(Collections.singletonList(registeredClient.getClientId())) + .issuedAt(issuedAt) + .expiresAt(expiresAt) + .notBefore(issuedAt) + .id(UUID.randomUUID().toString()); + if (!CollectionUtils.isEmpty(context.getAuthorizedScopes())) { + claimsBuilder.claim(OAuth2ParameterNames.SCOPE, context.getAuthorizedScopes()); + } + // @formatter:on + + if (this.accessTokenCustomizer != null) { + // @formatter:off + OAuth2TokenClaimsContext.Builder accessTokenContextBuilder = OAuth2TokenClaimsContext.with(claimsBuilder) + .registeredClient(context.getRegisteredClient()) + .principal(context.getPrincipal()) + .authorizationServerContext(context.getAuthorizationServerContext()) + .authorizedScopes(context.getAuthorizedScopes()) + .tokenType(context.getTokenType()) + .authorizationGrantType(context.getAuthorizationGrantType()); + if (context.getAuthorization() != null) { + accessTokenContextBuilder.authorization(context.getAuthorization()); + } + if (context.getAuthorizationGrant() != null) { + accessTokenContextBuilder.authorizationGrant(context.getAuthorizationGrant()); + } + // @formatter:on + + OAuth2TokenClaimsContext accessTokenContext = accessTokenContextBuilder.build(); + this.accessTokenCustomizer.customize(accessTokenContext); + } + + OAuth2TokenClaimsSet accessTokenClaimsSet = claimsBuilder.build(); + return new MaxKeyOAuth2AccessTokenGenerator.OAuth2AccessTokenClaims(OAuth2AccessToken.TokenType.BEARER, + UUID.randomUUID().toString(), accessTokenClaimsSet.getIssuedAt(), accessTokenClaimsSet.getExpiresAt(), + context.getAuthorizedScopes(), accessTokenClaimsSet.getClaims()); + } + + /** + * Sets the {@link OAuth2TokenCustomizer} that customizes the + * {@link OAuth2TokenClaimsContext#getClaims() claims} for the + * {@link OAuth2AccessToken}. + * @param accessTokenCustomizer the {@link OAuth2TokenCustomizer} that customizes the + * claims for the {@code OAuth2AccessToken} + */ + public void setAccessTokenCustomizer(OAuth2TokenCustomizer accessTokenCustomizer) { + Assert.notNull(accessTokenCustomizer, "accessTokenCustomizer cannot be null"); + this.accessTokenCustomizer = accessTokenCustomizer; + } + + private static final class OAuth2AccessTokenClaims extends OAuth2AccessToken implements ClaimAccessor { + + private final Map claims; + + private OAuth2AccessTokenClaims(TokenType tokenType, String tokenValue, Instant issuedAt, Instant expiresAt, + Set scopes, Map claims) { + super(tokenType, tokenValue, issuedAt, expiresAt, scopes); + this.claims = claims; + } + + @Override + public Map getClaims() { + return this.claims; + } + + } + +} diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java index 96944f7daba0367612ba9f7ed3b2cfc757a69795..2f681311caf6f962b5ba5a4d06f2ac9411dedfd3 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationConverter.java @@ -83,10 +83,11 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationConverter additionalParameters = parameters.entrySet().stream() - .filter(e -> !e.getKey().equals(OAuth2ParameterNames.GRANT_TYPE) - && !e.getKey().equals(OAuth2ParameterNames.SCOPE)) - .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get(0))); + Map additionalParameters = parameters.entrySet() + .stream() + .filter(e -> !e.getKey().equals(OAuth2ParameterNames.GRANT_TYPE) + && !e.getKey().equals(OAuth2ParameterNames.SCOPE)) + .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().get(0))); // 创建token return buildToken(clientPrincipal, requestedScopes, additionalParameters); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index f551f77b98f4e0074866e22825cb199ea5b1bd80..0ef6892c1950a21228c1372bc0761061b0e33d7d 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -3,6 +3,7 @@ package com.pig4cloud.pig.auth.support.base; import cn.hutool.extra.spring.SpringUtil; import com.pig4cloud.pig.common.security.util.OAuth2ErrorCodesExpand; import com.pig4cloud.pig.common.security.util.ScopeException; +import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.context.support.MessageSourceAccessor; @@ -35,6 +36,7 @@ import java.util.function.Supplier; * * 处理自定义授权 */ +@Slf4j public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider implements AuthenticationProvider { @@ -109,29 +111,29 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider authorizedScopes; // Default to configured scopes - if (!CollectionUtils.isEmpty(resouceOwnerBaseAuthentication.getScopes())) { - for (String requestedScope : resouceOwnerBaseAuthentication.getScopes()) { + if (!CollectionUtils.isEmpty(resourceOwnerBaseAuthentication.getScopes())) { + for (String requestedScope : resourceOwnerBaseAuthentication.getScopes()) { if (!registeredClient.getScopes().contains(requestedScope)) { throw new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_SCOPE); } } - authorizedScopes = new LinkedHashSet<>(resouceOwnerBaseAuthentication.getScopes()); + authorizedScopes = new LinkedHashSet<>(resourceOwnerBaseAuthentication.getScopes()); } else { throw new ScopeException(OAuth2ErrorCodesExpand.SCOPE_IS_EMPTY); } - Map reqParameters = resouceOwnerBaseAuthentication.getAdditionalParameters(); + Map reqParameters = resourceOwnerBaseAuthentication.getAdditionalParameters(); try { UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = buildToken(reqParameters); @@ -139,7 +141,7 @@ public abstract class OAuth2ResourceOwnerBaseAuthenticationProvider) () -> new InternalAuthenticationServiceException("web request is empty")); + HttpServletRequest request = WebUtils.getRequest() + .orElseThrow( + (Supplier) () -> new InternalAuthenticationServiceException("web request is empty")); Map paramMap = ServletUtil.getParamMap(request); String grantType = paramMap.get(OAuth2ParameterNames.GRANT_TYPE); @@ -104,12 +104,13 @@ public class PigDaoAuthenticationProvider extends AbstractUserDetailsAuthenticat } Map userDetailsServiceMap = SpringUtil - .getBeansOfType(PigUserDetailsService.class); + .getBeansOfType(PigUserDetailsService.class); String finalClientId = clientId; - Optional optional = userDetailsServiceMap.values().stream() - .filter(service -> service.support(finalClientId, grantType)) - .max(Comparator.comparingInt(Ordered::getOrder)); + Optional optional = userDetailsServiceMap.values() + .stream() + .filter(service -> service.support(finalClientId, grantType)) + .max(Comparator.comparingInt(Ordered::getOrder)); if (!optional.isPresent()) { throw new InternalAuthenticationServiceException("UserDetailsService error , not register"); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java index a12b2a99df77d857c9396d9783b2300b4576a225..979282e179ebbb2fed9efdb47bbdd18b4a05f766 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationFailureEventHandler.java @@ -23,6 +23,7 @@ import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.MsgUtils; import com.pig4cloud.pig.common.core.util.R; import com.pig4cloud.pig.common.core.util.SpringContextHolder; +import com.pig4cloud.pig.common.core.util.WebUtils; import com.pig4cloud.pig.common.log.event.SysLogEvent; import com.pig4cloud.pig.common.log.util.LogTypeEnum; import com.pig4cloud.pig.common.log.util.SysLogUtils; @@ -75,6 +76,8 @@ public class PigAuthenticationFailureEventHandler implements AuthenticationFailu Long endTime = System.currentTimeMillis(); logVo.setTime(endTime - startTime); } + + logVo.setServiceId(WebUtils.getClientId()); logVo.setCreateBy(username); logVo.setUpdateBy(username); SpringContextHolder.publishEvent(new SysLogEvent(logVo)); diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java index 162babd2133ea5fbf0800244d2efd67f9830ff80..09e6f01f88b659b4e2ab96d89e8ec4a754ffbae8 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/handler/PigAuthenticationSuccessEventHandler.java @@ -30,6 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServletServerHttpResponse; import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.security.oauth2.core.OAuth2RefreshToken; @@ -71,7 +72,10 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce // 发送异步日志事件 PigUser userInfo = (PigUser) map.get(SecurityConstants.DETAILS_USER); log.info("用户:{} 登录成功", userInfo.getName()); - SecurityContextHolder.getContext().setAuthentication(accessTokenAuthentication); + // 避免 race condition + SecurityContext context = SecurityContextHolder.createEmptyContext(); + context.setAuthentication(accessTokenAuthentication); + SecurityContextHolder.setContext(context); SysLog logVo = SysLogUtils.getSysLog(); logVo.setTitle("登录成功"); String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME); @@ -80,6 +84,8 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce Long endTime = System.currentTimeMillis(); logVo.setTime(endTime - startTime); } + + logVo.setServiceId(accessTokenAuthentication.getRegisteredClient().getClientId()); logVo.setCreateBy(userInfo.getName()); logVo.setUpdateBy(userInfo.getName()); SpringContextHolder.publishEvent(new SysLogEvent(logVo)); @@ -99,7 +105,8 @@ public class PigAuthenticationSuccessEventHandler implements AuthenticationSucce Map additionalParameters = accessTokenAuthentication.getAdditionalParameters(); OAuth2AccessTokenResponse.Builder builder = OAuth2AccessTokenResponse.withToken(accessToken.getTokenValue()) - .tokenType(accessToken.getTokenType()).scopes(accessToken.getScopes()); + .tokenType(accessToken.getTokenType()) + .scopes(accessToken.getScopes()); if (accessToken.getIssuedAt() != null && accessToken.getExpiresAt() != null) { builder.expiresIn(ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt())); } diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationConvert.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..a12db6239f8ff3c9574e2c9099f41bab7ab67dd3 --- /dev/null +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationConvert.java @@ -0,0 +1,39 @@ +package com.pig4cloud.pig.auth.support.maxkey; + +import com.pig4cloud.pig.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationConverter; +import com.pig4cloud.pig.common.security.util.OAuth2EndpointUtils; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2ErrorCodes; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.util.MultiValueMap; +import org.springframework.util.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; +import java.util.Set; + +public class OAuth2MaxKeyAuthenticationConvert extends OAuth2ResourceOwnerBaseAuthenticationConverter { + + @Override + public boolean support(String grantType) { + System.out.println(grantType); + return OAuth2AuthorizationResponseType.CODE.getValue().equals(grantType); + } + + @Override + public OAuth2MaxKeyAuthenticationToken buildToken(Authentication clientPrincipal, Set requestedScopes, Map additionalParameters) { + return new OAuth2MaxKeyAuthenticationToken(new AuthorizationGrantType(OAuth2AuthorizationResponseType.CODE.getValue()), clientPrincipal, requestedScopes, additionalParameters); + } + + @Override + public void checkParams(HttpServletRequest request) { + MultiValueMap parameters = OAuth2EndpointUtils.getParameters(request); + String code = parameters.getFirst(OAuth2ParameterNames.CODE); + if (!StringUtils.hasText(code) || parameters.get(OAuth2ParameterNames.CODE).size() != 1) { + OAuth2EndpointUtils.throwError(OAuth2ErrorCodes.INVALID_REQUEST, OAuth2ParameterNames.CODE, + OAuth2EndpointUtils.ACCESS_TOKEN_REQUEST_ERROR_URI); + } + } +} diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..ce031e0e33c8b3346b78dd816a4db7e486acde17 --- /dev/null +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationProvider.java @@ -0,0 +1,66 @@ +package com.pig4cloud.pig.auth.support.maxkey; + +import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pig.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationProvider; +import com.pig4cloud.pig.auth.support.sms.OAuth2ResourceOwnerSmsAuthenticationToken; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.OAuth2ErrorCodes; +import org.springframework.security.oauth2.core.OAuth2Token; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; +import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; + +import javax.annotation.Resource; +import java.util.Map; + +public class OAuth2MaxKeyAuthenticationProvider extends OAuth2ResourceOwnerBaseAuthenticationProvider implements AuthenticationProvider { + + + private static final Logger LOGGER = LogManager.getLogger(OAuth2MaxKeyAuthenticationProvider.class); + + + /** + * Constructs an {@code OAuth2AuthorizationCodeAuthenticationProvider} using the + * provided parameters. + * + * @param authenticationManager + * @param authorizationService the authorization service + * @param tokenGenerator the token generator + * @since 0.2.3 + */ + public OAuth2MaxKeyAuthenticationProvider(AuthenticationManager authenticationManager, OAuth2AuthorizationService authorizationService, OAuth2TokenGenerator tokenGenerator) { + super(authenticationManager, authorizationService, SpringUtil.getBean("maxKeyOAuth2TokenGenerator")); + } + + @Override + public boolean supports(Class authentication) { + boolean supports = OAuth2MaxKeyAuthenticationToken.class.isAssignableFrom(authentication); + LOGGER.debug("supports authentication=" + authentication + " returning " + supports); + return supports; + } + + @Override + public void checkClient(RegisteredClient registeredClient) { + assert registeredClient != null; + if (!registeredClient.getAuthorizationGrantTypes() + .contains(AuthorizationGrantType.PASSWORD)) { + throw new OAuth2AuthenticationException(OAuth2ErrorCodes.UNAUTHORIZED_CLIENT); + } + } + + @Override + public UsernamePasswordAuthenticationToken buildToken(Map reqParameters) { + String code = (String) reqParameters.get(OAuth2ParameterNames.CODE); + return new UsernamePasswordAuthenticationToken(code, null); + } +} diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationToken.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationToken.java new file mode 100644 index 0000000000000000000000000000000000000000..2911272334fdfa3a30d0aabe2e7f3204db17529e --- /dev/null +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/maxkey/OAuth2MaxKeyAuthenticationToken.java @@ -0,0 +1,18 @@ +package com.pig4cloud.pig.auth.support.maxkey; + +import com.pig4cloud.pig.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.core.AuthorizationGrantType; + +import java.util.Map; +import java.util.Set; + + +public class OAuth2MaxKeyAuthenticationToken extends OAuth2ResourceOwnerBaseAuthenticationToken { + + public OAuth2MaxKeyAuthenticationToken(AuthorizationGrantType authorizationGrantType, + Authentication clientPrincipal, Set scopes, Map additionalParameters) { + super(authorizationGrantType, clientPrincipal, scopes, additionalParameters); + } + +} diff --git a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java index bc556612772a2396d2be582f0845d47e3e368a66..d7779e90198d687a550ab6bc2d19b99f54b13e2e 100644 --- a/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java +++ b/pig-auth/src/main/java/com/pig4cloud/pig/auth/support/sms/OAuth2ResourceOwnerSmsAuthenticationProvider.java @@ -52,7 +52,7 @@ public class OAuth2ResourceOwnerSmsAuthenticationProvider public void checkClient(RegisteredClient registeredClient) { assert registeredClient != null; if (!registeredClient.getAuthorizationGrantTypes() - .contains(new AuthorizationGrantType(SecurityConstants.APP))) { + .contains(new AuthorizationGrantType(SecurityConstants.APP))) { throw new OAuth2AuthenticationException(OAuth2ErrorCodes.UNAUTHORIZED_CLIENT); } } diff --git a/pig-auth/src/main/resources/application.yml b/pig-auth/src/main/resources/application.yml index 3690b33d37c0324eec92acae55a12685e09da6bb..8c60e73e60b42a207c12ba89c7da6e8a3c9ef853 100755 --- a/pig-auth/src/main/resources/application.yml +++ b/pig-auth/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-common/pig-common-bom/pom.xml b/pig-common/pig-common-bom/pom.xml index b82dd87b97c45265d40ae5b8ea2812df61b2c80f..ef5e0fac5debb90c551d96db0be9c35ca6521ae1 100644 --- a/pig-common/pig-common-bom/pom.xml +++ b/pig-common/pig-common-bom/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common-bom - 3.6.4 + 3.6.7 pom pig-common-bom @@ -15,7 +15,7 @@ ${project.version} - 2.7.6 + 2.7.10 UTF-8 2.17.1 1.8 @@ -25,15 +25,15 @@ 1.2.83 1.6.9 2.2.0 - 3.5.2 + 3.5.3.1 8.0.31 - 1.5.2 + 1.6.1 1.2.6 7.1 1.0.5 2.0.2 2.3.5 - 5.8.10 + 5.8.17 2.7.4 1.8.4 diff --git a/pig-common/pig-common-core/pom.xml b/pig-common/pig-common-core/pom.xml index d8457f55e26b730bc8843779c190d301708dc84a..6b3a2332e15b157299902cb63a637dc721503166 100755 --- a/pig-common/pig-common-core/pom.xml +++ b/pig-common/pig-common-core/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.7 pig-common-core diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/config/JacksonConfiguration.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/config/JacksonConfiguration.java old mode 100755 new mode 100644 diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/config/RedisTemplateConfiguration.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/config/RedisTemplateConfiguration.java old mode 100755 new mode 100644 diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/config/RestTemplateConfiguration.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/config/RestTemplateConfiguration.java old mode 100755 new mode 100644 diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/ClassUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/ClassUtils.java index 6668c673e3f60194a97ad532c036f3bf5a3eea36..bf689fcd13faaaed535917c2d21fcb45667f7348 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/ClassUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/ClassUtils.java @@ -81,7 +81,6 @@ public class ClassUtils extends org.springframework.util.ClassUtils { specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); // 先找方法,再找方法上的类 A annotation = AnnotatedElementUtils.findMergedAnnotation(specificMethod, annotationType); - ; if (null != annotation) { return annotation; } diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RetOps.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RetOps.java index ea59db5ace2177ab38fc7e57a6a8d23aeb580ec2..bc48065accd49516e13017e953169879b0f57932 100644 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RetOps.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/RetOps.java @@ -210,7 +210,7 @@ public class RetOps { * @throws Ex 断言失败时抛出 */ public RetOps assertDataNotEmpty(Function, ? extends Ex> func) throws Ex { - if (ObjectUtil.isNotEmpty(original.getData())) { + if (ObjectUtil.isEmpty(original.getData())) { throw func.apply(original); } return this; diff --git a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java index e454735fd42838e3622d0cc3c0040991e62ce024..11a842bdeae83a64f502cc4d4cac91ba8e2a06c2 100755 --- a/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java +++ b/pig-common/pig-common-core/src/main/java/com/pig4cloud/pig/common/core/util/WebUtils.java @@ -105,13 +105,20 @@ public class WebUtils extends org.springframework.web.util.WebUtils { response.addCookie(cookie); } + public ServletRequestAttributes getServletRequestAttributes() { + return (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + } + /** * 获取 HttpServletRequest * @return {HttpServletRequest} */ public Optional getRequest() { - return Optional - .ofNullable(((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest()); + ServletRequestAttributes servletRequestAttributes = getServletRequestAttributes(); + if (servletRequestAttributes == null) { + return Optional.empty(); + } + return Optional.of(servletRequestAttributes.getRequest()); } /** @@ -119,7 +126,11 @@ public class WebUtils extends org.springframework.web.util.WebUtils { * @return {HttpServletResponse} */ public HttpServletResponse getResponse() { - return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); + ServletRequestAttributes servletRequestAttributes = getServletRequestAttributes(); + if (servletRequestAttributes == null) { + throw new CheckedException("无法获取HttpServletRequest"); + } + return servletRequestAttributes.getResponse(); } /** diff --git a/pig-common/pig-common-datasource/pom.xml b/pig-common/pig-common-datasource/pom.xml index 0af20a6ea1fc03a7a555d4224501e7e811b89969..e03d585e08ece72f5404178d95b8b3b2d57929e2 100644 --- a/pig-common/pig-common-datasource/pom.xml +++ b/pig-common/pig-common-datasource/pom.xml @@ -21,7 +21,7 @@ pig-common com.pig4cloud - 3.6.4 + 3.6.7 4.0.0 diff --git a/pig-common/pig-common-feign/pom.xml b/pig-common/pig-common-feign/pom.xml index 26451d25c0db32e4ffd3ef2f8711a11eab414022..0f2332db27d0abe610fba0eb6d1b155d4135513d 100755 --- a/pig-common/pig-common-feign/pom.xml +++ b/pig-common/pig-common-feign/pom.xml @@ -16,52 +16,58 @@ --> - - com.pig4cloud - pig-common - 3.6.4 - + 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"> + + com.pig4cloud + pig-common + 3.6.7 + - 4.0.0 - jar - pig-common-feign - feign-sentinel服务降级熔断、限流组件 + 4.0.0 + jar + pig-common-feign + feign-sentinel服务降级熔断、限流组件 - - - com.pig4cloud - pig-common-core - - - com.alibaba.cloud - spring-cloud-starter-alibaba-sentinel - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - io.github.openfeign - feign-okhttp - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - com.github.ben-manes.caffeine - caffeine - - - - org.springframework.security - spring-security-core - - + + + com.pig4cloud + pig-common-core + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + io.github.openfeign + feign-okhttp + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + com.github.ben-manes.caffeine + caffeine + + + + org.springframework.security + spring-security-core + + + + org.springframework.retry + spring-retry + true + + diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java index 44de28367bf78d50833bde096de97c787f64a829..ff9fa669bfee85b73ab73937bbf03547345e6082 100755 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignAutoConfiguration.java @@ -24,6 +24,7 @@ import com.pig4cloud.pig.common.feign.sentinel.ext.PigSentinelFeign; import com.pig4cloud.pig.common.feign.sentinel.handle.PigUrlBlockHandler; import com.pig4cloud.pig.common.feign.sentinel.parser.PigHeaderRequestOriginParser; import feign.Feign; +import okhttp3.OkHttpClient; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -31,6 +32,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; +import java.util.concurrent.TimeUnit; + /** * sentinel 配置 * @@ -61,4 +64,18 @@ public class PigFeignAutoConfiguration { return new PigHeaderRequestOriginParser(); } + /** + * OkHttp 客户端配置 + * @return OkHttp 客户端配 + */ + @Bean + public OkHttpClient okHttpClient() { + return new OkHttpClient.Builder().retryOnConnectionFailure(false) // 是否开启缓存 + .connectTimeout(30L, TimeUnit.SECONDS) // 连接超时时间 + .readTimeout(30L, TimeUnit.SECONDS) // 读取超时时间 + .writeTimeout(30L, TimeUnit.SECONDS) + .followRedirects(true) // 是否允许重定向 + .build(); + } + } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigFeignClientConfiguration.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignRetryAutoConfiguration.java similarity index 54% rename from pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigFeignClientConfiguration.java rename to pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignRetryAutoConfiguration.java index a66b52d0e1655f583bf96f66d5ba48ebdecdb225..413c35f7173ea1d5a807444ae849b415672f6ab1 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigFeignClientConfiguration.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/PigFeignRetryAutoConfiguration.java @@ -14,22 +14,27 @@ * limitations under the License. */ -package com.pig4cloud.pig.common.security.feign; +package com.pig4cloud.pig.common.feign; -import feign.RequestInterceptor; +import com.pig4cloud.pig.common.feign.retry.FeignRetryAspect; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; -import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; +import org.springframework.context.annotation.Configuration; +import org.springframework.retry.support.RetryTemplate; -public class PigFeignClientConfiguration { +/** + * 重试配置 + * + * @author lengleng + * @date 2023年03月09日 + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnClass(RetryTemplate.class) +public class PigFeignRetryAutoConfiguration { - /** - * 注入 oauth2 feign token 增强 - * @param tokenResolver token获取处理器 - * @return 拦截器 - */ @Bean - public RequestInterceptor oauthRequestInterceptor(BearerTokenResolver tokenResolver) { - return new PigOAuthRequestInterceptor(tokenResolver); + public FeignRetryAspect feignRetryAspect() { + return new FeignRetryAspect(); } } diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java new file mode 100644 index 0000000000000000000000000000000000000000..7c4260d96e7a97487828adb03ab84155fe838895 --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/Backoff.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pig.common.feign.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 重试具体的策略 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface Backoff { + + long delay() default 1000L; + + long maxDelay() default 0L; + + double multiplier() default 0.0D; + +} diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/FeignRetry.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/FeignRetry.java new file mode 100644 index 0000000000000000000000000000000000000000..846d09a3938a968ba6f5ad1a5522e8fad9f3544e --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/annotation/FeignRetry.java @@ -0,0 +1,21 @@ +package com.pig4cloud.pig.common.feign.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 重试注解,作用在 @FeignClient 注解之上 + */ +@Target({ ElementType.METHOD, ElementType.TYPE }) +@Retention(RetentionPolicy.RUNTIME) +public @interface FeignRetry { + + Backoff backoff() default @Backoff(); + + int maxAttempt() default 3; + + Class[] include() default {}; + +} diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..3119b7c06d5a92d85ba0b50d48523316e79dd73e --- /dev/null +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/retry/FeignRetryAspect.java @@ -0,0 +1,92 @@ +package com.pig4cloud.pig.common.feign.retry; + +import com.pig4cloud.pig.common.feign.annotation.FeignRetry; +import feign.RetryableException; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.retry.backoff.BackOffPolicy; +import org.springframework.retry.backoff.ExponentialBackOffPolicy; +import org.springframework.retry.backoff.FixedBackOffPolicy; +import org.springframework.retry.policy.SimpleRetryPolicy; +import org.springframework.retry.support.RetryTemplate; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +/** + * FeignRetry 注解切面注入 retryTemplate + * + * @author lengleng + * @date 2023/1/21 + * {@link org.springframework.cloud.loadbalancer.blocking.retry.BlockingLoadBalancedRetryPolicy}. + */ +@Slf4j +@Aspect +public class FeignRetryAspect { + + @Around("@annotation(feignRetry)") + public Object retry(ProceedingJoinPoint joinPoint, FeignRetry feignRetry) throws Throwable { + Method method = getCurrentMethod(joinPoint); + + RetryTemplate retryTemplate = new RetryTemplate(); + retryTemplate.setBackOffPolicy(prepareBackOffPolicy(feignRetry)); + retryTemplate.setRetryPolicy(prepareSimpleRetryPolicy(feignRetry)); + + // 重试 + return retryTemplate.execute(arg0 -> { + int retryCount = arg0.getRetryCount(); + log.info("Sending request method: {}, max attempt: {}, delay: {}, retryCount: {}", method.getName(), + feignRetry.maxAttempt(), feignRetry.backoff().delay(), retryCount); + return joinPoint.proceed(joinPoint.getArgs()); + }); + } + + /** + * 构造重试策略 + * @param feignRetry 重试注解 + * @return BackOffPolicy + */ + private BackOffPolicy prepareBackOffPolicy(FeignRetry feignRetry) { + if (feignRetry.backoff().multiplier() != 0) { + ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy(); + backOffPolicy.setInitialInterval(feignRetry.backoff().delay()); + backOffPolicy.setMaxInterval(feignRetry.backoff().maxDelay()); + backOffPolicy.setMultiplier(feignRetry.backoff().multiplier()); + return backOffPolicy; + } + else { + FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); + fixedBackOffPolicy.setBackOffPeriod(feignRetry.backoff().delay()); + return fixedBackOffPolicy; + } + } + + /** + * 构造重试策略 + * @param feignRetry 重试注解 + * @return SimpleRetryPolicy + */ + private SimpleRetryPolicy prepareSimpleRetryPolicy(FeignRetry feignRetry) { + Map, Boolean> policyMap = new HashMap<>(); + policyMap.put(RetryableException.class, true); // Connection refused or time out + + if (feignRetry.include().length != 0) { + for (Class t : feignRetry.include()) { + policyMap.put(t, true); + } + } + + return new SimpleRetryPolicy(feignRetry.maxAttempt(), policyMap, true); + } + + private Method getCurrentMethod(JoinPoint joinPoint) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + return signature.getMethod(); + } + +} diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelFeign.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelFeign.java index 474ff71751ecc7412e9c351f0bb80d7dc7fe71ad..3a6e7ea40805185508aba7eb679dbf540747e49a 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelFeign.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelFeign.java @@ -106,8 +106,8 @@ public final class PigSentinelFeign { private Object getFromContext(String name, String type, Class fallbackType, Class targetType) { Object fallbackInstance = feignContext.getInstance(name, fallbackType); if (fallbackInstance == null) { - throw new IllegalStateException(String.format( - "No %s instance of type %s found for feign client %s", type, fallbackType, name)); + throw new IllegalStateException(String + .format("No %s instance of type %s found for feign client %s", type, fallbackType, name)); } if (!targetType.isAssignableFrom(fallbackType)) { diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java index da0afb5be5ca8fb97b416c2f107ecd4afe397d9c..d1bf4270c5cfe0e96c0e1ccc8e2312b8a76821d4 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/ext/PigSentinelInvocationHandler.java @@ -25,12 +25,14 @@ import com.alibaba.csp.sentinel.Tracer; import com.alibaba.csp.sentinel.context.ContextUtil; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.pig4cloud.pig.common.core.util.R; +import com.pig4cloud.pig.common.feign.annotation.FeignRetry; import feign.Feign; import feign.InvocationHandlerFactory; import feign.MethodMetadata; import feign.Target; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.core.annotation.AnnotationUtils; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; @@ -38,6 +40,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Objects; import static feign.Util.checkNotNull; @@ -101,7 +104,7 @@ public class PigSentinelInvocationHandler implements InvocationHandler { if (target instanceof Target.HardCodedTarget) { Target.HardCodedTarget hardCodedTarget = (Target.HardCodedTarget) target; MethodMetadata methodMetadata = SentinelContractHolder.METADATA_MAP - .get(hardCodedTarget.type().getName() + Feign.configKey(hardCodedTarget.type(), method)); + .get(hardCodedTarget.type().getName() + Feign.configKey(hardCodedTarget.type(), method)); // resource default is HttpMethod:protocol://url if (methodMetadata == null) { result = methodHandler.invoke(args); @@ -134,8 +137,9 @@ public class PigSentinelInvocationHandler implements InvocationHandler { } } else { - // 若是R类型 执行自动降级返回R - if (R.class == method.getReturnType()) { + // 若是R类型 并且不包含@FeignRetry 执行自动降级返回R + FeignRetry feignRetry = AnnotationUtils.findAnnotation(method, FeignRetry.class); + if (R.class == method.getReturnType() && Objects.isNull(feignRetry)) { log.error("feign 服务间调用异常", ex); return R.failed(ex.getLocalizedMessage()); } diff --git a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java index 89bad6202e4411ad085fb817a1bdc532eecb8474..3dccbf3c8cf1cc317185000e523cec14eb459f96 100644 --- a/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java +++ b/pig-common/pig-common-feign/src/main/java/com/pig4cloud/pig/common/feign/sentinel/handle/GlobalBizExceptionHandler.java @@ -88,8 +88,8 @@ public class GlobalBizExceptionHandler { @ExceptionHandler(AccessDeniedException.class) @ResponseStatus(HttpStatus.FORBIDDEN) public R handleAccessDeniedException(AccessDeniedException e) { - String msg = SpringSecurityMessageSource.getAccessor().getMessage("AbstractAccessDecisionManager.accessDenied", - e.getMessage()); + String msg = SpringSecurityMessageSource.getAccessor() + .getMessage("AbstractAccessDecisionManager.accessDenied", e.getMessage()); log.warn("拒绝授权异常信息 ex={}", msg); return R.failed(e.getLocalizedMessage()); } diff --git a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java index 8230d93d126f46ff91c12c331d210b5c54a7f2eb..55d495c1dec0de3174df25f397dafcff90b3a43b 100644 --- a/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java +++ b/pig-common/pig-common-feign/src/main/java/org/springframework/cloud/openfeign/PigFeignClientsRegistrar.java @@ -91,7 +91,7 @@ public class PigFeignClientsRegistrar implements ImportBeanDefinitionRegistrar, validate(attributes); BeanDefinitionBuilder definition = BeanDefinitionBuilder - .genericBeanDefinition(FeignClientFactoryBean.class); + .genericBeanDefinition(FeignClientFactoryBean.class); definition.addPropertyValue("url", getUrl(attributes)); definition.addPropertyValue("path", getPath(attributes)); String name = getName(attributes); diff --git a/pig-common/pig-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/pig-common/pig-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index caa9f52f81845862d2d50099a0f81490d7181746..4531157b81ddec1988699b235d2d9b11f6461dab 100644 --- a/pig-common/pig-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/pig-common/pig-common-feign/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,4 @@ com.pig4cloud.pig.common.feign.PigFeignAutoConfiguration +com.pig4cloud.pig.common.feign.PigFeignRetryAutoConfiguration com.pig4cloud.pig.common.feign.sentinel.SentinelAutoConfiguration com.pig4cloud.pig.common.feign.sentinel.handle.GlobalBizExceptionHandler diff --git a/pig-common/pig-common-job/pom.xml b/pig-common/pig-common-job/pom.xml index 1a12427d4b4395c3955038932bd9acc2f701a900..6c5b166af517a26068015df51626d8a3fc424653 100755 --- a/pig-common/pig-common-job/pom.xml +++ b/pig-common/pig-common-job/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.7 pig-common-job diff --git a/pig-common/pig-common-job/src/main/java/com/pig4cloud/pig/common/job/XxlJobAutoConfiguration.java b/pig-common/pig-common-job/src/main/java/com/pig4cloud/pig/common/job/XxlJobAutoConfiguration.java index 0555aadb6fe1eb501325c5a83482d2fa6d834a1d..e162c0f1f0201788ffecc2d0114b790fda180a22 100644 --- a/pig-common/pig-common-job/src/main/java/com/pig4cloud/pig/common/job/XxlJobAutoConfiguration.java +++ b/pig-common/pig-common-job/src/main/java/com/pig4cloud/pig/common/job/XxlJobAutoConfiguration.java @@ -61,10 +61,13 @@ public class XxlJobAutoConfiguration { // 如果配置为空则获取注册中心的服务列表 "http://pig-xxl:9080/xxl-job-admin" if (!StringUtils.hasText(xxlJobProperties.getAdmin().getAddresses())) { - String serverList = discoveryClient.getServices().stream().filter(s -> s.contains(XXL_JOB_ADMIN)) - .flatMap(s -> discoveryClient.getInstances(s).stream()).map(instance -> String - .format("http://%s:%s/%s", instance.getHost(), instance.getPort(), XXL_JOB_ADMIN)) - .collect(Collectors.joining(",")); + String serverList = discoveryClient.getServices() + .stream() + .filter(s -> s.contains(XXL_JOB_ADMIN)) + .flatMap(s -> discoveryClient.getInstances(s).stream()) + .map(instance -> String.format("http://%s:%s/%s", instance.getHost(), instance.getPort(), + XXL_JOB_ADMIN)) + .collect(Collectors.joining(",")); xxlJobSpringExecutor.setAdminAddresses(serverList); } else { diff --git a/pig-common/pig-common-log/pom.xml b/pig-common/pig-common-log/pom.xml index 83acf4c35bb9551b3adaf24b7cf40db93f52b3b4..b01f6f3849ea31e7ae66748d46125e480f94e79c 100755 --- a/pig-common/pig-common-log/pom.xml +++ b/pig-common/pig-common-log/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.7 pig-common-log @@ -54,5 +54,9 @@ org.springframework.security spring-security-core + + org.springframework.security + spring-security-oauth2-core + diff --git a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java index 4d980646b574753332e6d0febecfe1c05f3a572e..6046cfe9703fbd2afa042286c4b3452b8b3efc4d 100755 --- a/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java +++ b/pig-common/pig-common-log/src/main/java/com/pig4cloud/pig/common/log/util/SysLogUtils.java @@ -16,10 +16,12 @@ package com.pig4cloud.pig.common.log.util; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.URLUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.http.HttpUtil; import com.pig4cloud.pig.admin.api.entity.SysLog; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; import lombok.experimental.UtilityClass; import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.expression.EvaluationContext; @@ -29,6 +31,7 @@ import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.http.HttpHeaders; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -46,7 +49,7 @@ public class SysLogUtils { public SysLog getSysLog() { HttpServletRequest request = ((ServletRequestAttributes) Objects - .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); SysLog sysLog = new SysLog(); sysLog.setType(LogTypeEnum.NORMAL.getType()); sysLog.setRemoteAddr(ServletUtil.getClientIP(request)); @@ -56,9 +59,28 @@ public class SysLogUtils { sysLog.setParams(HttpUtil.toParams(request.getParameterMap())); sysLog.setCreateBy(getUsername()); sysLog.setUpdateBy(getUsername()); + sysLog.setServiceId(getClientId()); return sysLog; } + /** + * 获取客户端 + * @return clientId + */ + private String getClientId() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication == null) { + return null; + } + + Object principal = authentication.getPrincipal(); + if (principal instanceof OAuth2AuthenticatedPrincipal) { + OAuth2AuthenticatedPrincipal auth2Authentication = (OAuth2AuthenticatedPrincipal) principal; + return MapUtil.getStr(auth2Authentication.getAttributes(), SecurityConstants.CLIENT_ID); + } + return null; + } + /** * 获取用户名称 * @return username diff --git a/pig-common/pig-common-mybatis/pom.xml b/pig-common/pig-common-mybatis/pom.xml index 84c3a56f92980931a8187e4da4a6e0743b8276df..c2d0b5dafcecbdeb43d08cf34cede1ec10fb1ade 100755 --- a/pig-common/pig-common-mybatis/pom.xml +++ b/pig-common/pig-common-mybatis/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.7 pig-common-mybatis diff --git a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java index 5084471d1ab443a98860545609d9c121409e97ea..683b13e072828740a031f9eaca0f794fbddb529e 100644 --- a/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java +++ b/pig-common/pig-common-mybatis/src/main/java/com/pig4cloud/pig/common/mybatis/resolver/SqlFilterArgumentResolver.java @@ -88,10 +88,12 @@ public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver } List orderItemList = new ArrayList<>(); - Optional.ofNullable(ascs).ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::asc).collect(Collectors.toList()))); - Optional.ofNullable(descs).ifPresent(s -> orderItemList.addAll( - Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::desc).collect(Collectors.toList()))); + Optional.ofNullable(ascs) + .ifPresent(s -> orderItemList.addAll( + Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::asc).collect(Collectors.toList()))); + Optional.ofNullable(descs) + .ifPresent(s -> orderItemList.addAll( + Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::desc).collect(Collectors.toList()))); page.addOrder(orderItemList); return page; diff --git a/pig-common/pig-common-seata/pom.xml b/pig-common/pig-common-seata/pom.xml index 6b80cb4ae6d8ec578448bea1e596425c856aa0f6..d227a7fc819693ce37906a3284e5945245f272a0 100755 --- a/pig-common/pig-common-seata/pom.xml +++ b/pig-common/pig-common-seata/pom.xml @@ -23,7 +23,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.7 pig-common-seata diff --git a/pig-common/pig-common-security/pom.xml b/pig-common/pig-common-security/pom.xml index 469aa634a797c258d6575b72f5e0b033bf4bc326..46652e783619cb38bf5c795aff4ec7bb09770e64 100755 --- a/pig-common/pig-common-security/pom.xml +++ b/pig-common/pig-common-security/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.7 pig-common-security diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java index 806cbea8437f481aff9539b8f1379fc647a72f82..3dbbd0c6609a4cdfa5139d8f74c3f839dcb028f6 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/annotation/EnablePigResourceServer.java @@ -18,7 +18,6 @@ package com.pig4cloud.pig.common.security.annotation; import com.pig4cloud.pig.common.security.component.PigResourceServerAutoConfiguration; import com.pig4cloud.pig.common.security.component.PigResourceServerConfiguration; -import com.pig4cloud.pig.common.security.feign.PigFeignClientConfiguration; import org.springframework.context.annotation.Import; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; @@ -35,8 +34,7 @@ import java.lang.annotation.*; @Target({ ElementType.TYPE }) @Retention(RetentionPolicy.RUNTIME) @EnableGlobalMethodSecurity(prePostEnabled = true) -@Import({ PigResourceServerAutoConfiguration.class, PigResourceServerConfiguration.class, - PigFeignClientConfiguration.class }) +@Import({ PigResourceServerAutoConfiguration.class, PigResourceServerConfiguration.class }) public @interface EnablePigResourceServer { } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermissionService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermissionService.java index fcf394a4746678470ca80dc3a28cb215d8e46d85..5bef7ab3580f0fba167947bded01dc5c0b8ad744 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermissionService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermissionService.java @@ -46,8 +46,10 @@ public class PermissionService { return false; } Collection authorities = authentication.getAuthorities(); - return authorities.stream().map(GrantedAuthority::getAuthority).filter(StringUtils::hasText) - .anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x)); + return authorities.stream() + .map(GrantedAuthority::getAuthority) + .filter(StringUtils::hasText) + .anyMatch(x -> PatternMatchUtils.simpleMatch(permissions, x)); } } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermitAllUrlProperties.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermitAllUrlProperties.java index 3e8aae220de3499d77a2e47230ee2d5291c5eeaf..f6f068cba94ac7f49bfd292b12233568ca26753e 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermitAllUrlProperties.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PermitAllUrlProperties.java @@ -61,13 +61,17 @@ public class PermitAllUrlProperties implements InitializingBean { // 获取方法上边的注解 替代path variable 为 * Inner method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Inner.class); - Optional.ofNullable(method).ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) - .getPatternValues().forEach(url -> urls.add(ReUtil.replaceAll(url, PATTERN, "*")))); + Optional.ofNullable(method) + .ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) + .getPatternValues() + .forEach(url -> urls.add(ReUtil.replaceAll(url, PATTERN, "*")))); // 获取类上边的注解, 替代path variable 为 * Inner controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Inner.class); - Optional.ofNullable(controller).ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) - .getPatternValues().forEach(url -> urls.add(ReUtil.replaceAll(url, PATTERN, "*")))); + Optional.ofNullable(controller) + .ifPresent(inner -> Objects.requireNonNull(info.getPathPatternsCondition()) + .getPatternValues() + .forEach(url -> urls.add(ReUtil.replaceAll(url, PATTERN, "*")))); }); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigBearerTokenExtractor.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigBearerTokenExtractor.java index 47353cf9e8e08f9f7c197aa8fdaa8272c1895307..9868c7b18419af4f505f5a8c7cd52248bb36dca3 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigBearerTokenExtractor.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigBearerTokenExtractor.java @@ -55,8 +55,9 @@ public class PigBearerTokenExtractor implements BearerTokenResolver { @Override public String resolve(HttpServletRequest request) { - boolean match = urlProperties.getUrls().stream() - .anyMatch(url -> pathMatcher.match(url, request.getRequestURI())); + boolean match = urlProperties.getUrls() + .stream() + .anyMatch(url -> pathMatcher.match(url, request.getRequestURI())); if (match) { return null; @@ -68,7 +69,7 @@ public class PigBearerTokenExtractor implements BearerTokenResolver { if (authorizationHeaderToken != null) { if (parameterToken != null) { final BearerTokenError error = BearerTokenErrors - .invalidRequest("Found multiple bearer tokens in the request"); + .invalidRequest("Found multiple bearer tokens in the request"); throw new OAuth2AuthenticationException(error); } return authorizationHeaderToken; diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigClientCredentialsOAuth2AuthenticatedPrincipal.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigClientCredentialsOAuth2AuthenticatedPrincipal.java deleted file mode 100644 index 9765be356e17fbfa1a38b66fa1fe11ac143baab6..0000000000000000000000000000000000000000 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigClientCredentialsOAuth2AuthenticatedPrincipal.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.pig4cloud.pig.common.security.component; - -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; - -import java.util.Collection; -import java.util.Map; - -/** - * @author lengleng - * @date 2022/7/6 - * - * credential 支持客户端模式的用户存储 - */ -@RequiredArgsConstructor -public class PigClientCredentialsOAuth2AuthenticatedPrincipal implements OAuth2AuthenticatedPrincipal { - - private final Map attributes; - - private final Collection authorities; - - private final String name; - - @Override - public Map getAttributes() { - return this.attributes; - } - - @Override - public Collection getAuthorities() { - return this.authorities; - } - - @Override - public String getName() { - return this.name; - } - -} diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java index d250f389ef02db6de362f98b7e5ccd926f2fea15..96148d10697ebef08a9318e5d6c48fa6ace7b7d5 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigCustomOpaqueTokenIntrospector.java @@ -1,6 +1,7 @@ package com.pig4cloud.pig.common.security.component; import cn.hutool.extra.spring.SpringUtil; +import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.security.service.PigUser; import com.pig4cloud.pig.common.security.service.PigUserDetailsService; import lombok.RequiredArgsConstructor; @@ -11,6 +12,7 @@ import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.DefaultOAuth2AuthenticatedPrincipal; import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; @@ -43,17 +45,18 @@ public class PigCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector // 客户端模式默认返回 if (AuthorizationGrantType.CLIENT_CREDENTIALS.equals(oldAuthorization.getAuthorizationGrantType())) { - return new PigClientCredentialsOAuth2AuthenticatedPrincipal(oldAuthorization.getAttributes(), - AuthorityUtils.NO_AUTHORITIES, oldAuthorization.getPrincipalName()); + return new DefaultOAuth2AuthenticatedPrincipal(oldAuthorization.getPrincipalName(), + oldAuthorization.getAttributes(), AuthorityUtils.NO_AUTHORITIES); } Map userDetailsServiceMap = SpringUtil - .getBeansOfType(PigUserDetailsService.class); + .getBeansOfType(PigUserDetailsService.class); - Optional optional = userDetailsServiceMap.values().stream() - .filter(service -> service.support(Objects.requireNonNull(oldAuthorization).getRegisteredClientId(), - oldAuthorization.getAuthorizationGrantType().getValue())) - .max(Comparator.comparingInt(Ordered::getOrder)); + Optional optional = userDetailsServiceMap.values() + .stream() + .filter(service -> service.support(Objects.requireNonNull(oldAuthorization).getRegisteredClientId(), + oldAuthorization.getAuthorizationGrantType().getValue())) + .max(Comparator.comparingInt(Ordered::getOrder)); UserDetails userDetails = null; try { @@ -69,7 +72,13 @@ public class PigCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospector catch (Exception ex) { log.error("资源服务器 introspect Token error {}", ex.getLocalizedMessage()); } - return (PigUser) userDetails; + + // 注入扩展属性,方便上下文获取客户端ID + PigUser user = (PigUser) userDetails; + Objects.requireNonNull(user) + .getAttributes() + .put(SecurityConstants.CLIENT_ID, oldAuthorization.getRegisteredClientId()); + return user; } } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigOAuthRequestInterceptor.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java similarity index 92% rename from pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigOAuthRequestInterceptor.java rename to pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java index 597ac3625bfe4c2cbb3179ab1ea001b47f5e3084..edb5812f9336aacfa056fcb7f9175cc6ac9c4837 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/feign/PigOAuthRequestInterceptor.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigOAuthRequestInterceptor.java @@ -1,7 +1,7 @@ -package com.pig4cloud.pig.common.security.feign; +package com.pig4cloud.pig.common.security.component; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.core.util.WebUtils; import feign.RequestInterceptor; @@ -52,7 +52,7 @@ public class PigOAuthRequestInterceptor implements RequestInterceptor { HttpServletRequest request = WebUtils.getRequest().get(); // 避免请求参数的 query token 无法传递 String token = tokenResolver.resolve(request); - if (StrUtil.isBlank(token)) { + if (StringUtils.isBlank(token)) { return; } template.header(HttpHeaders.AUTHORIZATION, diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerAutoConfiguration.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerAutoConfiguration.java index 3aac75ace6ff6d94eca6835af8faa213d8727fcf..9016c4dd47f4e37a848cad01ee5c9e4cb28becf6 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerAutoConfiguration.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerAutoConfiguration.java @@ -17,12 +17,14 @@ package com.pig4cloud.pig.common.security.component; import com.fasterxml.jackson.databind.ObjectMapper; +import feign.RequestInterceptor; import lombok.RequiredArgsConstructor; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector; +import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver; /** * @author lengleng @@ -73,4 +75,14 @@ public class PigResourceServerAutoConfiguration { return new PigCustomOpaqueTokenIntrospector(authorizationService); } + /** + * 注入 oauth2 feign token 增强 + * @param tokenResolver token获取处理器 + * @return 拦截器 + */ + @Bean + public RequestInterceptor oauthRequestInterceptor(BearerTokenResolver tokenResolver) { + return new PigOAuthRequestInterceptor(tokenResolver); + } + } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerConfiguration.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerConfiguration.java index 4e5a2c296a14a951699af9458ee35aea06706767..c2ca9b80eaee21815e50a2ef4f25ee97d48e0e90 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerConfiguration.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigResourceServerConfiguration.java @@ -51,13 +51,20 @@ public class PigResourceServerConfiguration { SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests(authorizeRequests -> authorizeRequests - .antMatchers(ArrayUtil.toArray(permitAllUrl.getUrls(), String.class)).permitAll().anyRequest() - .authenticated()) - .oauth2ResourceServer( - oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) - .authenticationEntryPoint(resourceAuthExceptionEntryPoint) - .bearerTokenResolver(pigBearerTokenExtractor)) - .headers().frameOptions().disable().and().csrf().disable(); + .antMatchers(ArrayUtil.toArray(permitAllUrl.getUrls(), String.class)) + .permitAll() + .anyRequest() + .authenticated()) + .oauth2ResourceServer( + oauth2 -> oauth2.opaqueToken(token -> token.introspector(customOpaqueTokenIntrospector)) + .authenticationEntryPoint(resourceAuthExceptionEntryPoint) + .bearerTokenResolver(pigBearerTokenExtractor)) + .headers() + .frameOptions() + .disable() + .and() + .csrf() + .disable(); return http.build(); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java index ddae78468d3ca723b240edea7f3221668d07f423..6d55f61eb7e2b46b80dae1a82fb207c1a3c9f0ac 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/component/PigSecurityInnerAspect.java @@ -48,12 +48,13 @@ public class PigSecurityInnerAspect implements Ordered { @Around("@within(inner) || @annotation(inner)") public Object around(ProceedingJoinPoint point, Inner inner) { // 实际注入的inner实体由表达式后一个注解决定,即是方法上的@Inner注解实体,若方法上无@Inner注解,则获取类上的 - if (inner == null) { - Class clazz = point.getTarget().getClass(); - inner = AnnotationUtils.findAnnotation(clazz, Inner.class); - } + // 这段代码没有意义,拦截的就是@Inner注解,怎么会为null呢 + // if (inner == null) { + // Class clazz = point.getTarget().getClass(); + // inner = AnnotationUtils.findAnnotation(clazz, Inner.class); + // } String header = request.getHeader(SecurityConstants.FROM); - if (inner.value() && !StrUtil.equals(SecurityConstants.FROM_IN, header)) { + if (inner.value() && !SecurityConstants.FROM_IN.equals(header)) { log.warn("访问接口 {} 没有权限", point.getSignature().getName()); throw new AccessDeniedException("Access is denied"); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationConsentService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationConsentService.java index 64e9194010a6e225d6f93e2a0b308852a8a6ed64..df83102f87e5e6bf6fe5382b77485497bca0dff5 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationConsentService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationConsentService.java @@ -19,8 +19,8 @@ public class PigRedisOAuth2AuthorizationConsentService implements OAuth2Authoriz public void save(OAuth2AuthorizationConsent authorizationConsent) { Assert.notNull(authorizationConsent, "authorizationConsent cannot be null"); - redisTemplate.opsForValue().set(buildKey(authorizationConsent), authorizationConsent, TIMEOUT, - TimeUnit.MINUTES); + redisTemplate.opsForValue() + .set(buildKey(authorizationConsent), authorizationConsent, TIMEOUT, TimeUnit.MINUTES); } @@ -35,7 +35,7 @@ public class PigRedisOAuth2AuthorizationConsentService implements OAuth2Authoriz Assert.hasText(registeredClientId, "registeredClientId cannot be empty"); Assert.hasText(principalName, "principalName cannot be empty"); return (OAuth2AuthorizationConsent) redisTemplate.opsForValue() - .get(buildKey(registeredClientId, principalName)); + .get(buildKey(registeredClientId, principalName)); } private static String buildKey(String registeredClientId, String principalName) { diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java index 7ba2a2255a6c7fba3b42fbbf8a7f622921f2fd27..db7c6b1b0353e0b2ae886703166489d5e014e281 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRedisOAuth2AuthorizationService.java @@ -37,37 +37,40 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe Assert.notNull(authorization, "authorization cannot be null"); if (isState(authorization)) { - String token = authorization.getAttribute("state"); + String token = authorization.getAttribute(OAuth2ParameterNames.STATE); redisTemplate.setValueSerializer(RedisSerializer.java()); - redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.STATE, token), authorization, TIMEOUT, - TimeUnit.MINUTES); + redisTemplate.opsForValue() + .set(buildKey(OAuth2ParameterNames.STATE, token), authorization, TIMEOUT, TimeUnit.MINUTES); } if (isCode(authorization)) { OAuth2Authorization.Token authorizationCode = authorization - .getToken(OAuth2AuthorizationCode.class); + .getToken(OAuth2AuthorizationCode.class); OAuth2AuthorizationCode authorizationCodeToken = authorizationCode.getToken(); long between = ChronoUnit.MINUTES.between(authorizationCodeToken.getIssuedAt(), authorizationCodeToken.getExpiresAt()); redisTemplate.setValueSerializer(RedisSerializer.java()); - redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue()), - authorization, between, TimeUnit.MINUTES); + redisTemplate.opsForValue() + .set(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue()), authorization, + between, TimeUnit.MINUTES); } if (isRefreshToken(authorization)) { OAuth2RefreshToken refreshToken = authorization.getRefreshToken().getToken(); long between = ChronoUnit.SECONDS.between(refreshToken.getIssuedAt(), refreshToken.getExpiresAt()); redisTemplate.setValueSerializer(RedisSerializer.java()); - redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.REFRESH_TOKEN, refreshToken.getTokenValue()), - authorization, between, TimeUnit.SECONDS); + redisTemplate.opsForValue() + .set(buildKey(OAuth2ParameterNames.REFRESH_TOKEN, refreshToken.getTokenValue()), authorization, between, + TimeUnit.SECONDS); } if (isAccessToken(authorization)) { OAuth2AccessToken accessToken = authorization.getAccessToken().getToken(); long between = ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt()); redisTemplate.setValueSerializer(RedisSerializer.java()); - redisTemplate.opsForValue().set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue()), - authorization, between, TimeUnit.SECONDS); + redisTemplate.opsForValue() + .set(buildKey(OAuth2ParameterNames.ACCESS_TOKEN, accessToken.getTokenValue()), authorization, between, + TimeUnit.SECONDS); } } @@ -77,13 +80,13 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe List keys = new ArrayList<>(); if (isState(authorization)) { - String token = authorization.getAttribute("state"); + String token = authorization.getAttribute(OAuth2ParameterNames.STATE); keys.add(buildKey(OAuth2ParameterNames.STATE, token)); } if (isCode(authorization)) { OAuth2Authorization.Token authorizationCode = authorization - .getToken(OAuth2AuthorizationCode.class); + .getToken(OAuth2AuthorizationCode.class); OAuth2AuthorizationCode authorizationCodeToken = authorizationCode.getToken(); keys.add(buildKey(OAuth2ParameterNames.CODE, authorizationCodeToken.getTokenValue())); } @@ -120,12 +123,12 @@ public class PigRedisOAuth2AuthorizationService implements OAuth2AuthorizationSe } private static boolean isState(OAuth2Authorization authorization) { - return Objects.nonNull(authorization.getAttribute("state")); + return Objects.nonNull(authorization.getAttribute(OAuth2ParameterNames.STATE)); } private static boolean isCode(OAuth2Authorization authorization) { OAuth2Authorization.Token authorizationCode = authorization - .getToken(OAuth2AuthorizationCode.class); + .getToken(OAuth2AuthorizationCode.class); return Objects.nonNull(authorizationCode); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java index ee44bae16f4b7f817269f32298da27e9cd66ce27..65583c1e175f6e3718a124e9c32ca6eb35417fb0 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigRemoteRegisteredClientRepository.java @@ -87,38 +87,48 @@ public class PigRemoteRegisteredClientRepository implements RegisteredClientRepo @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") public RegisteredClient findByClientId(String clientId) { - SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)).getData() - .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( - new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); + SysOauthClientDetails clientDetails = RetOps.of(clientDetailsService.getClientDetailsById(clientId)) + .getData() + .orElseThrow(() -> new OAuth2AuthorizationCodeRequestAuthenticationException( + new OAuth2Error("客户端查询异常,请检查数据库链接"), null)); RegisteredClient.Builder builder = RegisteredClient.withId(clientDetails.getClientId()) - .clientId(clientDetails.getClientId()) - .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) - .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); + .clientId(clientDetails.getClientId()) + .clientSecret(SecurityConstants.NOOP + clientDetails.getClientSecret()) + .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_POST) + .clientAuthenticationMethods(clientAuthenticationMethods -> { + clientAuthenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_BASIC); + clientAuthenticationMethods.add(ClientAuthenticationMethod.CLIENT_SECRET_POST); + }); // 授权模式 Optional.ofNullable(clientDetails.getAuthorizedGrantTypes()) - .ifPresent(grants -> StringUtils.commaDelimitedListToSet(grants) - .forEach(s -> builder.authorizationGrantType(new AuthorizationGrantType(s)))); + .ifPresent(grants -> StringUtils.commaDelimitedListToSet(grants) + .forEach(s -> builder.authorizationGrantType(new AuthorizationGrantType(s)))); // 回调地址 - Optional.ofNullable(clientDetails.getWebServerRedirectUri()).ifPresent(redirectUri -> Arrays - .stream(redirectUri.split(StrUtil.COMMA)).filter(StrUtil::isNotBlank).forEach(builder::redirectUri)); + Optional.ofNullable(clientDetails.getWebServerRedirectUri()) + .ifPresent(redirectUri -> Arrays.stream(redirectUri.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::redirectUri)); // scope - Optional.ofNullable(clientDetails.getScope()).ifPresent( - scope -> Arrays.stream(scope.split(StrUtil.COMMA)).filter(StrUtil::isNotBlank).forEach(builder::scope)); + Optional.ofNullable(clientDetails.getScope()) + .ifPresent(scope -> Arrays.stream(scope.split(StrUtil.COMMA)) + .filter(StrUtil::isNotBlank) + .forEach(builder::scope)); return builder - .tokenSettings(TokenSettings.builder().accessTokenFormat(OAuth2TokenFormat.REFERENCE) - .accessTokenTimeToLive(Duration.ofSeconds(Optional - .ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) - .refreshTokenTimeToLive( - Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) - .orElse(refreshTokenValiditySeconds))) - .build()) - .clientSettings(ClientSettings.builder() - .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())).build()) - .build(); + .tokenSettings(TokenSettings.builder() + .accessTokenFormat(OAuth2TokenFormat.REFERENCE) + .accessTokenTimeToLive(Duration.ofSeconds( + Optional.ofNullable(clientDetails.getAccessTokenValidity()).orElse(accessTokenValiditySeconds))) + .refreshTokenTimeToLive(Duration.ofSeconds(Optional.ofNullable(clientDetails.getRefreshTokenValidity()) + .orElse(refreshTokenValiditySeconds))) + .build()) + .clientSettings(ClientSettings.builder() + .requireAuthorizationConsent(!BooleanUtil.toBoolean(clientDetails.getAutoapprove())) + .build()) + .build(); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java index 36f48f9e81da48dda47ca12fb54ca780a140627f..723ac02daadeed39a31ba7d7a4a848efc143bf77 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUser.java @@ -36,6 +36,8 @@ public class PigUser extends User implements OAuth2AuthenticatedPrincipal { private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID; + private final Map attributes = new HashMap<>(); + /** * 用户ID */ @@ -71,7 +73,7 @@ public class PigUser extends User implements OAuth2AuthenticatedPrincipal { */ @Override public Map getAttributes() { - return new HashMap<>(); + return this.attributes; } @Override diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java index 53202225ce7a15f607a0f2ff12577b032fb81c05..4b33f304b8b201b0b5f1642288d910b30a07c615 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/service/PigUserDetailsService.java @@ -62,7 +62,7 @@ public interface PigUserDetailsService extends UserDetailsService, Ordered { } Collection authorities = AuthorityUtils - .createAuthorityList(dbAuthsSet.toArray(new String[0])); + .createAuthorityList(dbAuthsSet.toArray(new String[0])); SysUser user = info.getSysUser(); // 构造security用户 diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java index 4ff9c03a44729b5db9f4383bf2d79e4c6301064e..017cf3f0ad715abfc2afa58362fdda3b7698caa5 100644 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/OAuth2EndpointUtils.java @@ -28,10 +28,8 @@ public class OAuth2EndpointUtils { Map parameterMap = request.getParameterMap(); MultiValueMap parameters = new LinkedMultiValueMap<>(parameterMap.size()); parameterMap.forEach((key, values) -> { - if (values.length > 0) { - for (String value : values) { - parameters.add(key, value); - } + for (String value : values) { + parameters.add(key, value); } }); return parameters; @@ -39,7 +37,7 @@ public class OAuth2EndpointUtils { public boolean matchesPkceTokenRequest(HttpServletRequest request) { return AuthorizationGrantType.AUTHORIZATION_CODE.getValue() - .equals(request.getParameter(OAuth2ParameterNames.GRANT_TYPE)) + .equals(request.getParameter(OAuth2ParameterNames.GRANT_TYPE)) && request.getParameter(OAuth2ParameterNames.CODE) != null && request.getParameter(PkceParameterNames.CODE_VERIFIER) != null; } @@ -63,7 +61,8 @@ public class OAuth2EndpointUtils { OAuth2RefreshToken refreshToken = authentication.getRefreshToken().getToken(); OAuth2AccessTokenResponse.Builder builder = OAuth2AccessTokenResponse.withToken(accessToken.getTokenValue()) - .tokenType(accessToken.getTokenType()).scopes(accessToken.getScopes()); + .tokenType(accessToken.getTokenType()) + .scopes(accessToken.getScopes()); if (accessToken.getIssuedAt() != null && accessToken.getExpiresAt() != null) { builder.expiresIn(ChronoUnit.SECONDS.between(accessToken.getIssuedAt(), accessToken.getExpiresAt())); } diff --git a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java index 292636ec9003c6e532b9ad632c2aeebe4ff86ec5..de5368e00179a10f8158c3b689bf84609318f16b 100755 --- a/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java +++ b/pig-common/pig-common-security/src/main/java/com/pig4cloud/pig/common/security/util/SecurityUtils.java @@ -16,6 +16,7 @@ package com.pig4cloud.pig.common.security.util; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.StrUtil; import com.pig4cloud.pig.common.core.constant.SecurityConstants; import com.pig4cloud.pig.common.security.service.PigUser; @@ -74,11 +75,12 @@ public class SecurityUtils { Collection authorities = authentication.getAuthorities(); List roleIds = new ArrayList<>(); - authorities.stream().filter(granted -> StrUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) - .forEach(granted -> { - String id = StrUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); - roleIds.add(Long.parseLong(id)); - }); + authorities.stream() + .filter(granted -> CharSequenceUtil.startWith(granted.getAuthority(), SecurityConstants.ROLE)) + .forEach(granted -> { + String id = CharSequenceUtil.removePrefix(granted.getAuthority(), SecurityConstants.ROLE); + roleIds.add(Long.parseLong(id)); + }); return roleIds; } diff --git a/pig-common/pig-common-swagger/pom.xml b/pig-common/pig-common-swagger/pom.xml index 854dad1981850d04bf285ecc1bca0f6222826aa1..500159851984565dfaa708d6c9c0d4ddebfa745d 100644 --- a/pig-common/pig-common-swagger/pom.xml +++ b/pig-common/pig-common-swagger/pom.xml @@ -24,7 +24,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.7 pig-common-swagger diff --git a/pig-common/pig-common-xss/pom.xml b/pig-common/pig-common-xss/pom.xml index 495cfe2b0d07adc277bafd4dd7a0e7eba46a070d..615fd489d6a94fb58ebdef71e90d3a2f043891c5 100755 --- a/pig-common/pig-common-xss/pom.xml +++ b/pig-common/pig-common-xss/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-common - 3.6.4 + 3.6.7 pig-common-xss diff --git a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/PigXssAutoConfiguration.java b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/PigXssAutoConfiguration.java index b5f7b88cb7d6bc38c5cdb252fb645691313d005e..2bf54e9b4b25c128d1c865983bc2040355c04bbc 100644 --- a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/PigXssAutoConfiguration.java +++ b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/PigXssAutoConfiguration.java @@ -75,8 +75,10 @@ public class PigXssAutoConfiguration implements WebMvcConfigurer { } com.pig4cloud.pig.common.xss.core.XssCleanInterceptor interceptor = new com.pig4cloud.pig.common.xss.core.XssCleanInterceptor( xssProperties); - registry.addInterceptor(interceptor).addPathPatterns(patterns) - .excludePathPatterns(xssProperties.getPathExcludePatterns()).order(Ordered.LOWEST_PRECEDENCE); + registry.addInterceptor(interceptor) + .addPathPatterns(patterns) + .excludePathPatterns(xssProperties.getPathExcludePatterns()) + .order(Ordered.LOWEST_PRECEDENCE); } } diff --git a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/DefaultXssCleaner.java b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/DefaultXssCleaner.java index 338f2da314011f9a0a57d33c9e09e6e63de7ac1d..7be9a6ded4b35326064fba695ac4d77c5d695dbf 100644 --- a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/DefaultXssCleaner.java +++ b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/DefaultXssCleaner.java @@ -40,10 +40,10 @@ public class DefaultXssCleaner implements XssCleaner { private static Document.OutputSettings getOutputSettings(PigXssProperties properties) { return new Document.OutputSettings() - // 2. 转义,没找到关闭的方法,目前这个规则最少 - .escapeMode(Entities.EscapeMode.xhtml) - // 3. 保留换行 - .prettyPrint(properties.isPrettyPrint()); + // 2. 转义,没找到关闭的方法,目前这个规则最少 + .escapeMode(Entities.EscapeMode.xhtml) + // 3. 保留换行 + .prettyPrint(properties.isPrettyPrint()); } @Override diff --git a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java index 017b674945721b2c02265318d78bb4d31d20405b..128044e3662ac2a7a776785c04c49a2a76ecbe10 100644 --- a/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java +++ b/pig-common/pig-common-xss/src/main/java/com/pig4cloud/pig/common/xss/core/XssHolder.java @@ -23,6 +23,9 @@ package com.pig4cloud.pig.common.xss.core; */ public class XssHolder { + private XssHolder() { + } + private static final ThreadLocal TL = new ThreadLocal<>(); private static final ThreadLocal TL_IGNORE = new ThreadLocal<>(); diff --git a/pig-common/pom.xml b/pig-common/pom.xml index 8c24c931cf5d05a9b4ef2a338edaf4ff1801c95a..15908dee575ff66780a7f6e44aa85fb16ed0922f 100755 --- a/pig-common/pom.xml +++ b/pig-common/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.7 pig-common diff --git a/pig-gateway/pom.xml b/pig-gateway/pom.xml index 7f625d7a15327f8b40d3fceb35154ea10574ca78..9e4ea2788b268cf1fe86e6754c4b8acf0d17be1c 100755 --- a/pig-gateway/pom.xml +++ b/pig-gateway/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.7 pig-gateway diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RateLimiterConfiguration.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RateLimiterConfiguration.java index a3c595c790580fd4cd925e11d8dc1d1529f7371c..36cf7bf6cbc0a5b5363781ec36c464bd6caf189a 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RateLimiterConfiguration.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/config/RateLimiterConfiguration.java @@ -38,8 +38,9 @@ public class RateLimiterConfiguration { @Bean public KeyResolver remoteAddrKeyResolver() { return exchange -> Mono - .just(Objects.requireNonNull(Objects.requireNonNull(exchange.getRequest().getRemoteAddress())) - .getAddress().getHostAddress()); + .just(Objects.requireNonNull(Objects.requireNonNull(exchange.getRequest().getRemoteAddress())) + .getAddress() + .getHostAddress()); } } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PigRequestGlobalFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PigRequestGlobalFilter.java index 16b3f658c1098aff816a2bd63e7573f919aed282..f432e1e6c8a339978e15fbe016334d32af7904dc 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PigRequestGlobalFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/PigRequestGlobalFilter.java @@ -65,8 +65,9 @@ public class PigRequestGlobalFilter implements GlobalFilter, Ordered { // 2. 重写StripPrefix addOriginalRequestUrl(exchange, request.getURI()); String rawPath = request.getURI().getRawPath(); - String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")).skip(1L) - .collect(Collectors.joining("/")); + String newPath = "/" + Arrays.stream(StringUtils.tokenizeToStringArray(rawPath, "/")) + .skip(1L) + .collect(Collectors.joining("/")); ServerHttpRequest newRequest = request.mutate().path(newPath).build(); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, newRequest.getURI()); diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java index e52e4c87b27480752ef7e0f61082af95093a4227..522d409343d118a1eed2ce05b6a119b24bb0761c 100644 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/filter/SwaggerBasicGatewayFilter.java @@ -68,7 +68,7 @@ public class SwaggerBasicGatewayFilter implements GlobalFilter { String password = swaggerProperties.getBasic().getPassword(); String encodeToString = Base64Utils - .encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8)); + .encodeToString((username + ":" + password).getBytes(StandardCharsets.UTF_8)); return auth.equals(BASIC_PREFIX + encodeToString); } diff --git a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java index ee227a3dcba36ee8e19e644ad5cff66ee2fca3ce..d401497a1b9dbf9ad894b038dd195efa108095d6 100755 --- a/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java +++ b/pig-gateway/src/main/java/com/pig4cloud/pig/gateway/handler/ImageCodeHandler.java @@ -59,15 +59,16 @@ public class ImageCodeHandler implements HandlerFunction { // 保存验证码信息 Optional randomStr = serverRequest.queryParam("randomStr"); redisTemplate.setKeySerializer(new StringRedisSerializer()); - randomStr.ifPresent(s -> redisTemplate.opsForValue().set(CacheConstants.DEFAULT_CODE_KEY + s, result, - SecurityConstants.CODE_TIME, TimeUnit.SECONDS)); + randomStr.ifPresent(s -> redisTemplate.opsForValue() + .set(CacheConstants.DEFAULT_CODE_KEY + s, result, SecurityConstants.CODE_TIME, TimeUnit.SECONDS)); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); captcha.out(os); - return ServerResponse.status(HttpStatus.OK).contentType(MediaType.IMAGE_JPEG) - .body(BodyInserters.fromResource(new ByteArrayResource(os.toByteArray()))); + return ServerResponse.status(HttpStatus.OK) + .contentType(MediaType.IMAGE_JPEG) + .body(BodyInserters.fromResource(new ByteArrayResource(os.toByteArray()))); } } diff --git a/pig-gateway/src/main/resources/application.yml b/pig-gateway/src/main/resources/application.yml index 4e9e8bdf6376fd4b8c9db00432e7a0719c8193ca..c694dc1bafdd2e6a4833e8d69ca7f55b3cdc6583 100755 --- a/pig-gateway/src/main/resources/application.yml +++ b/pig-gateway/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-register/pom.xml b/pig-register/pom.xml index d5309be05a79bdcb18d4d4dbe23150b2e4a4b813..afed927c162b977a31a88fd4c28504ad58503361 100755 --- a/pig-register/pom.xml +++ b/pig-register/pom.xml @@ -18,7 +18,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.7 pig-register @@ -94,6 +94,7 @@ **/*.woff **/*.woff2 **/*.ttf + **/*.eot @@ -103,6 +104,7 @@ **/*.woff **/*.woff2 **/*.ttf + **/*.eot diff --git a/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java b/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java index 74397f974d5be3a44af256a2338071ad528f76b5..42abdf46c422ead88a1bccb292a883c72e60fd5b 100755 --- a/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java +++ b/pig-register/src/main/java/com/alibaba/nacos/PigNacosApplication.java @@ -43,7 +43,7 @@ public class PigNacosApplication { */ private static boolean initEnv() { System.setProperty(ConfigConstants.STANDALONE_MODE, "true"); - System.setProperty(ConfigConstants.AUTH_ENABLED, "false"); + System.setProperty(ConfigConstants.AUTH_ENABLED, "true"); System.setProperty(ConfigConstants.LOG_BASEDIR, "logs"); System.setProperty(ConfigConstants.LOG_ENABLED, "false"); return true; diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java b/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java index 7a3ec617d640bcfedaec633ab16088c31cbe6f65..b5dbe6e89392b96595f9f5045dc04619a77c0102 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java +++ b/pig-register/src/main/java/com/alibaba/nacos/config/ConsoleConfig.java @@ -16,6 +16,7 @@ package com.alibaba.nacos.config; +import com.alibaba.nacos.console.filter.XssFilter; import com.alibaba.nacos.core.code.ControllerMethodsCache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; @@ -39,7 +40,7 @@ import java.time.ZoneId; */ @Component @EnableScheduling -@PropertySource("/application.properties") +@PropertySource("/application.yml") public class ConsoleConfig { @Autowired @@ -64,11 +65,17 @@ public class ConsoleConfig { config.addAllowedHeader("*"); config.setMaxAge(18000L); config.addAllowedMethod("*"); + config.addAllowedOriginPattern("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } + @Bean + public XssFilter xssFilter() { + return new XssFilter(); + } + @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(ZoneId.systemDefault().toString()); diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java new file mode 100644 index 0000000000000000000000000000000000000000..72a05665d637ec4664b03d736cc545f622b5eaa2 --- /dev/null +++ b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/HistoryService.java @@ -0,0 +1,88 @@ +package com.alibaba.nacos.config.server.service; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.nacos.common.utils.Pair; +import com.alibaba.nacos.config.server.model.ConfigHistoryInfo; +import com.alibaba.nacos.config.server.model.ConfigInfoWrapper; +import com.alibaba.nacos.config.server.model.Page; +import com.alibaba.nacos.config.server.service.repository.ConfigInfoPersistService; +import com.alibaba.nacos.config.server.service.repository.HistoryConfigInfoPersistService; +import com.alibaba.nacos.plugin.auth.exception.AccessException; +import com.alibaba.nacos.plugin.encryption.handler.EncryptionHandler; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Objects; + +/** + * @author aeizzz + */ +@Service +public class HistoryService { + + private final HistoryConfigInfoPersistService historyConfigInfoPersistService; + + private final ConfigInfoPersistService configInfoPersistService; + + public HistoryService(HistoryConfigInfoPersistService historyConfigInfoPersistService, + ConfigInfoPersistService configInfoPersistService) { + this.historyConfigInfoPersistService = historyConfigInfoPersistService; + this.configInfoPersistService = configInfoPersistService; + } + + public Page listConfigHistory(String dataId, String group, String namespaceId, Integer pageNo, + Integer pageSize) { + return this.historyConfigInfoPersistService.findConfigHistory(dataId, group, namespaceId, pageNo, pageSize); + } + + public ConfigHistoryInfo getConfigHistoryInfo(String dataId, String group, String namespaceId, Long nid) + throws AccessException { + ConfigHistoryInfo configHistoryInfo = this.historyConfigInfoPersistService.detailConfigHistory(nid); + if (Objects.isNull(configHistoryInfo)) { + return null; + } + else { + this.checkHistoryInfoPermission(configHistoryInfo, dataId, group, namespaceId); + String encryptedDataKey = configHistoryInfo.getEncryptedDataKey(); + Pair pair = EncryptionHandler.decryptHandler(dataId, encryptedDataKey, + configHistoryInfo.getContent()); + configHistoryInfo.setContent((String) pair.getSecond()); + return configHistoryInfo; + } + } + + public ConfigHistoryInfo getPreviousConfigHistoryInfo(String dataId, String group, String namespaceId, Long id) + throws AccessException { + ConfigHistoryInfo configHistoryInfo = this.historyConfigInfoPersistService.detailPreviousConfigHistory(id); + if (Objects.isNull(configHistoryInfo)) { + return null; + } + else { + this.checkHistoryInfoPermission(configHistoryInfo, dataId, group, namespaceId); + return configHistoryInfo; + } + } + + public List getConfigListByNamespace(String namespaceId) { + return this.configInfoPersistService.queryConfigInfoByNamespace(namespaceId); + } + + /** + * 覆盖原有的校验方式,oracle 数据库没有空 字符串 只有 null + * @param configHistoryInfo + * @param dataId + * @param group + * @param namespaceId + * @throws AccessException + */ + private void checkHistoryInfoPermission(ConfigHistoryInfo configHistoryInfo, String dataId, String group, + String namespaceId) throws AccessException { + if (!Objects.equals(configHistoryInfo.getDataId(), dataId) + || !Objects.equals(configHistoryInfo.getGroup(), group) + || (!StrUtil.isEmpty(configHistoryInfo.getTenant()) + && !Objects.equals(configHistoryInfo.getTenant(), namespaceId))) { + throw new AccessException("Please check dataId, group or namespaceId."); + } + } + +} diff --git a/pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..d3c747a1d663086d25cde4b3cf7852a8b82368ff --- /dev/null +++ b/pig-register/src/main/java/com/alibaba/nacos/config/server/service/package-info.java @@ -0,0 +1,4 @@ +/** + * 处理再oracle数据库下空置的判断 + */ +package com.alibaba.nacos.config.server.service; diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java b/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java index 6799a0bcecdc180013047e8e552040e999bb125d..2b088165de0b78d4e1bc027a9d7a572b2358e21d 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/controller/HealthController.java @@ -77,7 +77,7 @@ public class HealthController { if (!isConfigReadiness && !isNamingReadiness) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Config and Naming are not in readiness"); + .body("Config and Naming are not in readiness"); } if (!isConfigReadiness) { diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java b/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java index 9dd2b2f4a629c587065d73bf84baa3b6ef24b4af..8b0d6fbdfb4d043f08f807d24b872a3605445399 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/exception/ConsoleExceptionHandler.java @@ -57,7 +57,7 @@ public class ConsoleExceptionHandler { LOGGER.error("CONSOLE {}", uri, e); if (uri.contains(Commons.NACOS_SERVER_VERSION_V2)) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); + .body(RestResultUtils.failed(ExceptionUtil.getAllExceptionMsg(e))); } return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ExceptionUtil.getAllExceptionMsg(e)); } diff --git a/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java b/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java index c73e8f8e0a09b51f52e0c1299d24cf0d6865aba7..c704dd0f1a236eb3210185f45dd3c2f122ed3460 100644 --- a/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java +++ b/pig-register/src/main/java/com/alibaba/nacos/console/exception/NacosApiExceptionHandler.java @@ -59,7 +59,7 @@ public class NacosApiExceptionHandler { public ResponseEntity> handleNacosApiException(NacosApiException e) { LOGGER.error("got exception. {} {}", e.getErrAbstract(), e.getErrMsg()); return ResponseEntity.status(e.getErrCode()) - .body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); + .body(new Result<>(e.getDetailErrCode(), e.getErrAbstract(), e.getErrMsg())); } @ExceptionHandler(NacosException.class) diff --git a/pig-register/src/main/resources/application.yml b/pig-register/src/main/resources/application.yml index 60681dab9e5b6017ad2218b2f663071b3c21b8d2..140e99fc32b0d1e0a920228067e40d6aff4a0478 100755 --- a/pig-register/src/main/resources/application.yml +++ b/pig-register/src/main/resources/application.yml @@ -2,24 +2,29 @@ server: port: 8848 #如何修改 pig-register 启动端口 >: https://t.cn/A6XGvTdb tomcat: basedir: logs + error: + include-message: always db: num: 1 user: ${MYSQL_USER:root} - password: ${MYSQL_PWD:root} + password: ${MYSQL_PWD:Zhangzhengxu123.} url: 0: jdbc:mysql://${MYSQL_HOST:pig-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pig_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true - + pool.config.connectionTimeout: 30000 nacos: core: auth: + server: + identity: + key: serverIdentity + value: security plugin.nacos.token.secret.key: SecretKey012345678901234567890123456789012345678901234567890123456789 - enabled: false system.type: nacos security: ignore: - urls: /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** + urls: /actuator/**,/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/** spring: datasource: diff --git a/pig-upms/pig-upms-api/pom.xml b/pig-upms/pig-upms-api/pom.xml index 03c66e106ded4f295e16a1854dc0a86d6bb88054..9fae9627625b510331d6b003aafce1a2a81244d3 100755 --- a/pig-upms/pig-upms-api/pom.xml +++ b/pig-upms/pig-upms-api/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.4 + 3.6.7 pig-upms-api @@ -43,8 +43,8 @@ - org.springframework.cloud - spring-cloud-openfeign-core + com.pig4cloud + pig-common-feign true diff --git a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java index 3dfc3f084a87acd1cade03a430478bba1a69956b..0af6d9ba570747f38c7facd78e992b90e97b6193 100755 --- a/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java +++ b/pig-upms/pig-upms-api/src/main/java/com/pig4cloud/pig/admin/api/feign/RemoteUserService.java @@ -46,7 +46,6 @@ public interface RemoteUserService { /** * 通过手机号码查询用户、角色信息 * @param phone 手机号码 - * @param from 调用标志 * @return R */ @GetMapping(value = "/app/info/{phone}", headers = SecurityConstants.HEADER_FROM_IN) @@ -55,7 +54,6 @@ public interface RemoteUserService { /** * 根据部门id,查询对应的用户 id 集合 * @param deptIds 部门id 集合 - * @param from 调用标志 * @return 用户 id 集合 */ @GetMapping(value = "/user/ids", headers = SecurityConstants.HEADER_FROM_IN) diff --git a/pig-upms/pig-upms-biz/pom.xml b/pig-upms/pig-upms-biz/pom.xml index a3652ff2be98ce35a484cb7b9b39d82b199f0cf9..ce53f69edaf8e92951710d056265b40eb67b50fd 100644 --- a/pig-upms/pig-upms-biz/pom.xml +++ b/pig-upms/pig-upms-biz/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-upms - 3.6.4 + 3.6.7 pig-upms-biz diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DeptController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java similarity index 94% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DeptController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java index 23bd6dca5a088a4722614f2ab9547e09f660a0b8..c0e4a2bd2922da58db9aaf47137b3bfb1c146344 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DeptController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDeptController.java @@ -45,7 +45,7 @@ import java.util.List; @RequestMapping("/dept") @Tag(name = "部门管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class DeptController { +public class SysDeptController { private final SysDeptService sysDeptService; @@ -115,13 +115,13 @@ public class DeptController { /** * 根据部门名查询部门信息 - * @param deptname 部门名 - * @return + * @param deptName 部门名 + * @return SysDept */ - @GetMapping("/details/{deptname}") - public R user(@PathVariable String deptname) { + @GetMapping("/details/{deptName}") + public R user(@PathVariable String deptName) { SysDept condition = new SysDept(); - condition.setName(deptname); + condition.setName(deptName); return R.ok(sysDeptService.getOne(new QueryWrapper<>(condition))); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java similarity index 93% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java index 3c3623542621eed6929f82f3aa3470717dc4fc3c..3817925ab8a6b6d1648ecdb8043a4b150d07a53e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/DictController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysDictController.java @@ -52,7 +52,7 @@ import java.util.List; @RequestMapping("/dict") @Tag(name = "字典管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class DictController { +public class SysDictController { private final SysDictItemService sysDictItemService; @@ -75,19 +75,24 @@ public class DictController { */ @GetMapping("/page") public R> getDictPage(Page page, SysDict sysDict) { - return R.ok(sysDictService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()))); + return R.ok(sysDictService.page(page, + Wrappers.lambdaQuery() + .like(StrUtil.isNotBlank(sysDict.getDictKey()), SysDict::getDictKey, sysDict.getDictKey()) + .orderByDesc(SysDict::getUpdateTime))); } /** * 通过字典类型查找字典 - * @param type 类型 + * @param key 类型 * @return 同类型字典 */ @GetMapping("/key/{key}") @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#key") public R> getDictByKey(@PathVariable String key) { - return R.ok(sysDictItemService.list(Wrappers.query().lambda().eq(SysDictItem::getDictKey, key))); + return R.ok(sysDictItemService.list(Wrappers.query() + .lambda() + .eq(SysDictItem::getDictKey, key) + .orderByAsc(SysDictItem::getSortOrder))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java similarity index 97% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java index 96154d68d8c0bb9219f596df63f30a72aa2858ea..59ed986841849ad29d1a2871e2c114e397fd0cab 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/FileController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysFileController.java @@ -51,7 +51,7 @@ import javax.servlet.http.HttpServletResponse; @RequestMapping("/sys-file") @Tag(name = "文件管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class FileController { +public class SysFileController { private final SysFileService sysFileService; @@ -65,7 +65,7 @@ public class FileController { @GetMapping("/page") public R> getSysFilePage(Page page, SysFile sysFile) { return R.ok(sysFileService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysFile.getFileName()), SysFile::getFileName, sysFile.getFileName()))); + .like(StrUtil.isNotBlank(sysFile.getFileName()), SysFile::getFileName, sysFile.getFileName()))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/LogController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java similarity index 98% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/LogController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java index ff8c7f25f78c49df342295a3489271234e98ed9d..f33d031dc39cb5f9471c021014d1dda54debc5b4 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/LogController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysLogController.java @@ -46,7 +46,7 @@ import java.util.List; @RequestMapping("/log") @Tag(name = "日志管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class LogController { +public class SysLogController { private final SysLogService sysLogService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java similarity index 92% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java index 31d7c96815d98a137cbfc68e0a90c1584bb13b4e..6b9e057e2ff4f01fb7a5e5182bf3bbecdfabb2f9 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/MenuController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysMenuController.java @@ -44,7 +44,7 @@ import java.util.stream.Collectors; @RequestMapping("/menu") @Tag(name = "菜单管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class MenuController { +public class SysMenuController { private final SysMenuService sysMenuService; @@ -56,8 +56,11 @@ public class MenuController { @GetMapping public R>> getUserMenu(Long parentId) { // 获取符合条件的菜单 - Set menuSet = SecurityUtils.getRoles().stream().map(sysMenuService::findMenuByRoleId) - .flatMap(Collection::stream).collect(Collectors.toSet()); + Set menuSet = SecurityUtils.getRoles() + .stream() + .map(sysMenuService::findMenuByRoleId) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); return R.ok(sysMenuService.filterMenu(menuSet, parentId)); } @@ -79,8 +82,8 @@ public class MenuController { */ @GetMapping("/tree/{roleId}") public R> getRoleTree(@PathVariable Long roleId) { - return R.ok( - sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).collect(Collectors.toList())); + return R + .ok(sysMenuService.findMenuByRoleId(roleId).stream().map(SysMenu::getMenuId).collect(Collectors.toList())); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java similarity index 96% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java index e21bfc6e47e077ace60c1f84ff39ecc68c675ad5..d01aad333afa331e772d02b507adf7137ffbf7ed 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/OauthClientDetailsController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysOauthClientDetailsController.java @@ -47,7 +47,7 @@ import java.util.List; @RequestMapping("/client") @Tag(name = "客户端管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class OauthClientDetailsController { +public class SysOauthClientDetailsController { private final SysOauthClientDetailsService sysOauthClientDetailsService; @@ -59,7 +59,7 @@ public class OauthClientDetailsController { @GetMapping("/{clientId}") public R> getByClientId(@PathVariable String clientId) { return R.ok(sysOauthClientDetailsService - .list(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId))); + .list(Wrappers.lambdaQuery().eq(SysOauthClientDetails::getClientId, clientId))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java index e2ed6c0ee6bb5f4d55d87bda3f56d6b55fe8ebd4..b8bffb48d492861a31b9a5599fad7f57b6c90db0 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PostController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPostController.java @@ -46,7 +46,7 @@ import java.util.List; @RequestMapping("/post") @Tag(name = "岗位管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class PostController { +public class SysPostController { private final SysPostService sysPostService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java similarity index 93% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java index b9e23f77f19078e36c1c5b354a590425fed4d15f..b397571816ccf43f012cddb261406579409493ca 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/PublicParamController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysPublicParamController.java @@ -44,7 +44,7 @@ import org.springframework.web.bind.annotation.*; @RequestMapping("/param") @Tag(name = "公共参数配置") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class PublicParamController { +public class SysPublicParamController { private final SysPublicParamService sysPublicParamService; @@ -71,10 +71,10 @@ public class PublicParamController { public R getSysPublicParamPage(Page page, SysPublicParam sysPublicParam) { return R.ok(sysPublicParamService.page(page, Wrappers.lambdaQuery() - .like(StrUtil.isNotBlank(sysPublicParam.getPublicName()), SysPublicParam::getPublicName, - sysPublicParam.getPublicName()) - .like(StrUtil.isNotBlank(sysPublicParam.getPublicKey()), SysPublicParam::getPublicKey, - sysPublicParam.getPublicKey()))); + .like(StrUtil.isNotBlank(sysPublicParam.getPublicName()), SysPublicParam::getPublicName, + sysPublicParam.getPublicName()) + .like(StrUtil.isNotBlank(sysPublicParam.getPublicKey()), SysPublicParam::getPublicKey, + sysPublicParam.getPublicKey()))); } /** diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RegisterController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java similarity index 97% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RegisterController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java index a5a0ab4920aaf8fbfdf0a2f3bb89e44c89b87d1a..8ee36fec990e86e5d04c3c29d9d8b9bcc8d62b55 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RegisterController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRegisterController.java @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/register") @RequiredArgsConstructor @ConditionalOnProperty(name = "register.user", matchIfMissing = true) -public class RegisterController { +public class SysRegisterController { private final SysUserService userService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java similarity index 99% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java index 570ac8c61a90a2f4b713fa163a5d750148384900..fc657136f7b7dce1fa2c82fe93c2857e8595147e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/RoleController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysRoleController.java @@ -48,7 +48,7 @@ import java.util.List; @RequestMapping("/role") @Tag(name = "角色管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class RoleController { +public class SysRoleController { private final SysRoleService sysRoleService; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java similarity index 98% rename from pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java rename to pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java index ec4be7a18178ca233356d1af8a7dbb45f66a942c..ae65ff8f86c9c2f9f891fcfa6c3ee7782c4a3d7b 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/UserController.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/controller/SysUserController.java @@ -58,7 +58,7 @@ import java.util.Set; @RequestMapping("/user") @Tag(name = "用户管理模块") @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) -public class UserController { +public class SysUserController { private final SysUserService userService; @@ -122,8 +122,8 @@ public class UserController { * @return */ @Inner(false) - @GetMapping("/check/exsit") - public R isExsit(UserDTO userDTO) { + @GetMapping("/check/exist") + public R isExist(UserDTO userDTO) { List sysUserList = userService.list(new QueryWrapper<>(userDTO)); if (CollUtil.isNotEmpty(sysUserList)) { return R.ok(Boolean.TRUE, MsgUtils.getMessage(ErrorCodes.SYS_USER_EXISTING)); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java index 01e81a90d1020e1e3ba08106bc8fd11618cfb6db..a68246b54a40a2b498c47a753bbb555e9dabca32 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/AppServiceImpl.java @@ -76,8 +76,8 @@ public class AppServiceImpl implements AppService { String code = RandomUtil.randomNumbers(Integer.parseInt(SecurityConstants.CODE_SIZE)); log.info("手机号生成验证码成功:{},{}", sms.getPhone(), code); - redisTemplate.opsForValue().set(CacheConstants.DEFAULT_CODE_KEY + sms.getPhone(), code, - SecurityConstants.CODE_TIME, TimeUnit.SECONDS); + redisTemplate.opsForValue() + .set(CacheConstants.DEFAULT_CODE_KEY + sms.getPhone(), code, SecurityConstants.CODE_TIME, TimeUnit.SECONDS); // 调用短信通道发送 this.smsClient.sendCode(code, sms.getPhone()); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java index f777a5858175c2394d02aa8fb52627c70add684d..3f077e3db7e27dcc7faf97ae5dcf7a8fa128d267 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptRelationServiceImpl.java @@ -55,10 +55,12 @@ public class SysDeptRelationServiceImpl extends ServiceImpl relationList = sysDeptRelationMapper.selectList( Wrappers.query().lambda().eq(SysDeptRelation::getDescendant, sysDept.getParentId())) - .stream().map(relation -> { - relation.setDescendant(sysDept.getDeptId()); - return relation; - }).collect(Collectors.toList()); + .stream() + .map(relation -> { + relation.setDescendant(sysDept.getDeptId()); + return relation; + }) + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(relationList)) { this.saveBatch(relationList); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java index 029b3e81fadc8f012579bdb54e67bf6bd08c3170..ade640ef2be79bfd765f5669b6c19bb7d0c5cdf8 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDeptServiceImpl.java @@ -29,7 +29,6 @@ import com.pig4cloud.pig.admin.service.SysDeptRelationService; import com.pig4cloud.pig.admin.service.SysDeptService; import com.pig4cloud.pig.common.security.util.SecurityUtils; import lombok.RequiredArgsConstructor; -import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -58,10 +57,8 @@ public class SysDeptServiceImpl extends ServiceImpl impl @Override @Transactional(rollbackFor = Exception.class) public Boolean saveDept(SysDept dept) { - SysDept sysDept = new SysDept(); - BeanUtils.copyProperties(dept, sysDept); - this.save(sysDept); - sysDeptRelationService.saveDeptRelation(sysDept); + this.save(dept); + sysDeptRelationService.saveDeptRelation(dept); return Boolean.TRUE; } @@ -75,8 +72,10 @@ public class SysDeptServiceImpl extends ServiceImpl impl public Boolean removeDeptById(Long id) { // 级联删除部门 List idList = sysDeptRelationService - .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, id)).stream() - .map(SysDeptRelation::getDescendant).collect(Collectors.toList()); + .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, id)) + .stream() + .map(SysDeptRelation::getDescendant) + .collect(Collectors.toList()); if (CollUtil.isNotEmpty(idList)) { this.removeByIds(idList); @@ -108,7 +107,8 @@ public class SysDeptServiceImpl extends ServiceImpl impl @Override public List listChildDeptId(Long deptId) { List deptRelations = sysDeptRelationService.list(Wrappers.lambdaQuery() - .eq(SysDeptRelation::getAncestor, deptId).ne(SysDeptRelation::getDescendant, deptId)); + .eq(SysDeptRelation::getAncestor, deptId) + .ne(SysDeptRelation::getDescendant, deptId)); if (CollUtil.isNotEmpty(deptRelations)) { return deptRelations.stream().map(SysDeptRelation::getDescendant).collect(Collectors.toList()); } @@ -132,8 +132,10 @@ public class SysDeptServiceImpl extends ServiceImpl impl public List> listCurrentUserDeptTrees() { Long deptId = SecurityUtils.getUser().getDeptId(); List descendantIdList = sysDeptRelationService - .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, deptId)).stream() - .map(SysDeptRelation::getDescendant).collect(Collectors.toList()); + .list(Wrappers.query().lambda().eq(SysDeptRelation::getAncestor, deptId)) + .stream() + .map(SysDeptRelation::getDescendant) + .collect(Collectors.toList()); List deptList = baseMapper.selectBatchIds(descendantIdList); Optional dept = deptList.stream().filter(item -> item.getDeptId().intValue() == deptId).findFirst(); @@ -147,19 +149,22 @@ public class SysDeptServiceImpl extends ServiceImpl impl * @return */ private List> getDeptTree(List depts, Long parentId) { - List> collect = depts.stream().filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) - .sorted(Comparator.comparingInt(SysDept::getSortOrder)).map(dept -> { - TreeNode treeNode = new TreeNode(); - treeNode.setId(dept.getDeptId()); - treeNode.setParentId(dept.getParentId()); - treeNode.setName(dept.getName()); - treeNode.setWeight(dept.getSortOrder()); - // 扩展属性 - Map extra = new HashMap<>(4); - extra.put("createTime", dept.getCreateTime()); - treeNode.setExtra(extra); - return treeNode; - }).collect(Collectors.toList()); + List> collect = depts.stream() + .filter(dept -> dept.getDeptId().intValue() != dept.getParentId()) + .sorted(Comparator.comparingInt(SysDept::getSortOrder)) + .map(dept -> { + TreeNode treeNode = new TreeNode(); + treeNode.setId(dept.getDeptId()); + treeNode.setParentId(dept.getParentId()); + treeNode.setName(dept.getName()); + treeNode.setWeight(dept.getSortOrder()); + // 扩展属性 + Map extra = new HashMap<>(2); + extra.put("createTime", dept.getCreateTime()); + treeNode.setExtra(extra); + return treeNode; + }) + .collect(Collectors.toList()); return TreeUtil.build(collect, parentId); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java index 65c729f22eaf55946fc27aa5f61ebff390ce9716..b43e6dc66129326115d2cc04c138e4bb5d098cbd 100755 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysDictItemServiceImpl.java @@ -65,7 +65,7 @@ public class SysDictItemServiceImpl extends ServiceImpl impl * @return */ @Override - @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.type") + @CacheEvict(value = CacheConstants.DICT_DETAILS, key = "#dict.dictKey") public void updateDict(SysDict dict) { SysDict sysDict = this.getById(dict.getId()); // 系统内置 diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java index a88639f792494c2d755d7553e8a8657d2150c6bb..eb04d3f62f1b1a3372337a53825ef4f743bd0b7b 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysLogServiceImpl.java @@ -63,12 +63,12 @@ public class SysLogServiceImpl extends ServiceImpl impleme */ private LambdaQueryWrapper buildQueryWrapper(SysLogDTO sysLog) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() - .eq(StrUtil.isNotBlank(sysLog.getType()), SysLog::getType, sysLog.getType()) - .like(StrUtil.isNotBlank(sysLog.getRemoteAddr()), SysLog::getRemoteAddr, sysLog.getRemoteAddr()); + .eq(StrUtil.isNotBlank(sysLog.getType()), SysLog::getType, sysLog.getType()) + .like(StrUtil.isNotBlank(sysLog.getRemoteAddr()), SysLog::getRemoteAddr, sysLog.getRemoteAddr()); if (ArrayUtil.isNotEmpty(sysLog.getCreateTime())) { - wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]).le(SysLog::getCreateTime, - sysLog.getCreateTime()[1]); + wrapper.ge(SysLog::getCreateTime, sysLog.getCreateTime()[0]) + .le(SysLog::getCreateTime, sysLog.getCreateTime()[1]); } return wrapper; diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java index 3eff49c585f828932bf64211d14ea60612182dd5..22663d06aa1e555b8144c9054e6b0970d425c65a 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysMenuServiceImpl.java @@ -103,8 +103,10 @@ public class SysMenuServiceImpl extends ServiceImpl impl public List> treeMenu(boolean lazy, Long parentId) { if (!lazy) { List> collect = baseMapper - .selectList(Wrappers.lambdaQuery().orderByAsc(SysMenu::getSortOrder)).stream() - .map(getNodeFunction()).collect(Collectors.toList()); + .selectList(Wrappers.lambdaQuery().orderByAsc(SysMenu::getSortOrder)) + .stream() + .map(getNodeFunction()) + .collect(Collectors.toList()); return TreeUtil.build(collect, CommonConstants.MENU_TREE_ROOT_ID); } @@ -112,9 +114,11 @@ public class SysMenuServiceImpl extends ServiceImpl impl Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; List> collect = baseMapper - .selectList(Wrappers.lambdaQuery().eq(SysMenu::getParentId, parent) - .orderByAsc(SysMenu::getSortOrder)) - .stream().map(getNodeFunction()).collect(Collectors.toList()); + .selectList( + Wrappers.lambdaQuery().eq(SysMenu::getParentId, parent).orderByAsc(SysMenu::getSortOrder)) + .stream() + .map(getNodeFunction()) + .collect(Collectors.toList()); return TreeUtil.build(collect, parent); } @@ -128,8 +132,10 @@ public class SysMenuServiceImpl extends ServiceImpl impl @Override public List> filterMenu(Set all, Long parentId) { List> collect = all.stream() - .filter(menu -> MenuTypeEnum.LEFT_MENU.getType().equals(menu.getType())) - .filter(menu -> StrUtil.isNotBlank(menu.getPath())).map(getNodeFunction()).collect(Collectors.toList()); + .filter(menu -> MenuTypeEnum.LEFT_MENU.getType().equals(menu.getType())) + .filter(menu -> StrUtil.isNotBlank(menu.getPath())) + .map(getNodeFunction()) + .collect(Collectors.toList()); Long parent = parentId == null ? CommonConstants.MENU_TREE_ROOT_ID : parentId; return TreeUtil.build(collect, parent); } diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java index b2231106e898779f7b1c3f0b386b48f605097510..925996a2e5cc6a9bf61cc60785c1e0e7ecbe5b6f 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPostServiceImpl.java @@ -63,8 +63,9 @@ public class SysPostServiceImpl extends ServiceImpl impl for (PostExcelVO excel : excelVOList) { Set errorMsg = new HashSet<>(); // 检验岗位名称或者岗位编码是否存在 - boolean existPost = postList.stream().anyMatch(post -> excel.getPostName().equals(post.getPostName()) - || excel.getPostCode().equals(post.getPostCode())); + boolean existPost = postList.stream() + .anyMatch(post -> excel.getPostName().equals(post.getPostName()) + || excel.getPostCode().equals(post.getPostCode())); if (existPost) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_NAMEORCODE_EXISTING, excel.getPostName(), diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java index 7f9a373667584e5c03a0b7af49fc7af4eba6cef4..677065fd54b4070e690fb09fb929bdd90330a697 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysPublicParamServiceImpl.java @@ -47,7 +47,7 @@ public class SysPublicParamServiceImpl extends ServiceImpllambdaQuery().eq(SysPublicParam::getPublicKey, publicKey)); + .selectOne(Wrappers.lambdaQuery().eq(SysPublicParam::getPublicKey, publicKey)); if (sysPublicParam != null) { return sysPublicParam.getPublicValue(); diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java index 3d6c9f6f2a9839bfca6a8762e608f14754ce8a57..3af802c0ae490c86a9725c453bfb77a1a7ff445b 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysRoleServiceImpl.java @@ -87,8 +87,9 @@ public class SysRoleServiceImpl extends ServiceImpl impl for (RoleExcelVO excel : excelVOList) { Set errorMsg = new HashSet<>(); // 检验角色名称或者角色编码是否存在 - boolean existRole = roleList.stream().anyMatch(sysRole -> excel.getRoleName().equals(sysRole.getRoleName()) - || excel.getRoleCode().equals(sysRole.getRoleCode())); + boolean existRole = roleList.stream() + .anyMatch(sysRole -> excel.getRoleName().equals(sysRole.getRoleName()) + || excel.getRoleCode().equals(sysRole.getRoleCode())); if (existRole) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_NAMEORCODE_EXISTING, excel.getRoleName(), diff --git a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java index b2b40166c7d483b0fc637066151bee8e294146c8..136739bddf7f0001d2aa33af63f21ae77e3b523e 100644 --- a/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java +++ b/pig-upms/pig-upms-biz/src/main/java/com/pig4cloud/pig/admin/service/impl/SysUserServiceImpl.java @@ -130,9 +130,13 @@ public class SysUserServiceImpl extends ServiceImpl impl List postList = sysPostMapper.listPostsByUserId(sysUser.getUserId()); userInfo.setPostList(postList); // 设置权限列表(menu.permission) - Set permissions = roleIds.stream().map(sysMenuService::findMenuByRoleId).flatMap(Collection::stream) - .filter(m -> MenuTypeEnum.BUTTON.getType().equals(m.getType())).map(SysMenu::getPermission) - .filter(StrUtil::isNotBlank).collect(Collectors.toSet()); + Set permissions = roleIds.stream() + .map(sysMenuService::findMenuByRoleId) + .flatMap(Collection::stream) + .filter(m -> MenuTypeEnum.BUTTON.getType().equals(m.getType())) + .map(SysMenu::getPermission) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class)); return userInfo; @@ -213,7 +217,7 @@ public class SysUserServiceImpl extends ServiceImpl impl this.updateById(sysUser); sysUserRoleMapper - .delete(Wrappers.update().lambda().eq(SysUserRole::getUserId, userDto.getUserId())); + .delete(Wrappers.update().lambda().eq(SysUserRole::getUserId, userDto.getUserId())); userDto.getRole().forEach(roleId -> { SysUserRole userRole = new SysUserRole(); userRole.setUserId(sysUser.getUserId()); @@ -260,11 +264,15 @@ public class SysUserServiceImpl extends ServiceImpl impl List userExcelVOList = voList.stream().map(userVO -> { UserExcelVO excelVO = new UserExcelVO(); BeanUtils.copyProperties(userVO, excelVO); - String roleNameList = userVO.getRoleList().stream().map(SysRole::getRoleName) - .collect(Collectors.joining(StrUtil.COMMA)); + String roleNameList = userVO.getRoleList() + .stream() + .map(SysRole::getRoleName) + .collect(Collectors.joining(StrUtil.COMMA)); excelVO.setRoleNameList(roleNameList); - String postNameList = userVO.getPostList().stream().map(SysPost::getPostName) - .collect(Collectors.joining(StrUtil.COMMA)); + String postNameList = userVO.getPostList() + .stream() + .map(SysPost::getPostName) + .collect(Collectors.joining(StrUtil.COMMA)); excelVO.setPostNameList(postNameList); return excelVO; }).collect(Collectors.toList()); @@ -292,16 +300,17 @@ public class SysUserServiceImpl extends ServiceImpl impl for (UserExcelVO excel : excelVOList) { Set errorMsg = new HashSet<>(); // 校验用户名是否存在 - boolean exsitUserName = userList.stream() - .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); + boolean existUserName = userList.stream() + .anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername())); - if (exsitUserName) { + if (existUserName) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername())); } // 判断输入的部门名称列表是否合法 Optional deptOptional = deptList.stream() - .filter(dept -> excel.getDeptName().equals(dept.getName())).findFirst(); + .filter(dept -> excel.getDeptName().equals(dept.getName())) + .findFirst(); if (!deptOptional.isPresent()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName())); } @@ -309,8 +318,8 @@ public class SysUserServiceImpl extends ServiceImpl impl // 判断输入的角色名称列表是否合法 List roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA); List roleCollList = roleList.stream() - .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) - .collect(Collectors.toList()); + .filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name))) + .collect(Collectors.toList()); if (roleCollList.size() != roleNameList.size()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList())); @@ -319,8 +328,8 @@ public class SysUserServiceImpl extends ServiceImpl impl // 判断输入的岗位名称列表是否合法 List postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA); List postCollList = postList.stream() - .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) - .collect(Collectors.toList()); + .filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name))) + .collect(Collectors.toList()); if (postCollList.size() != postNameList.size()) { errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList())); @@ -393,7 +402,7 @@ public class SysUserServiceImpl extends ServiceImpl impl String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); // 默认角色 SysRole sysRole = sysRoleMapper - .selectOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + .selectOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); if (sysRole == null) { return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_PARAM_CONFIG_ERROR, "USER_DEFAULT_ROLE")); diff --git a/pig-upms/pig-upms-biz/src/main/resources/application.yml b/pig-upms/pig-upms-biz/src/main/resources/application.yml index 7528a4fa80fba135b7cd75a8ba3e966f1d83d09c..d3da88fc3a92307ec651d760574839fb2aecfdad 100644 --- a/pig-upms/pig-upms-biz/src/main/resources/application.yml +++ b/pig-upms/pig-upms-biz/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-upms/pom.xml b/pig-upms/pom.xml index a5994580b570bb1bf709237068120017e9c2d207..629b8138d0854a8f71d05fe009900ebcc2da8b35 100755 --- a/pig-upms/pom.xml +++ b/pig-upms/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.7 pig-upms diff --git a/pig-visual/pig-codegen/pom.xml b/pig-visual/pig-codegen/pom.xml index d5cadd48517d5efd637a6671357cba5657611d5f..6c5ebb1ec36cb33d4b06fb8af36da59d6c792ff9 100755 --- a/pig-visual/pig-codegen/pom.xml +++ b/pig-visual/pig-codegen/pom.xml @@ -22,7 +22,7 @@ com.pig4cloud pig-visual - 3.6.4 + 3.6.7 pig-codegen diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java index 7f3d5d2ebb9cd644f7fd9bd5d76cc43b7922a3ad..8dc7da320ea6994f80fe9392336900406b755ee8 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GenDatasourceConfServiceImpl.java @@ -82,7 +82,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpllambdaQuery().eq(GenFormConf::getTableName, tableName) - .orderByDesc(GenFormConf::getCreateTime), false); + GenFormConf form = getOne(Wrappers.lambdaQuery() + .eq(GenFormConf::getTableName, tableName) + .orderByDesc(GenFormConf::getCreateTime), false); if (form != null) { return form.getFormInfo(); diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java index 94b901bf9e72eb0032ba13c58d7d6bc5ae1bc676..9d65392a97f2c22fd5ab5258fbc1a9ba9654a2a2 100755 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/service/impl/GeneratorServiceImpl.java @@ -77,7 +77,8 @@ public class GeneratorServiceImpl implements GeneratorService { public Map previewCode(GenConfig genConfig) { // 根据tableName 查询最新的表单配置 List formConfList = genFormConfMapper.selectList(Wrappers.lambdaQuery() - .eq(GenFormConf::getTableName, genConfig.getTableName()).orderByDesc(GenFormConf::getCreateTime)); + .eq(GenFormConf::getTableName, genConfig.getTableName()) + .orderByDesc(GenFormConf::getCreateTime)); String tableNames = genConfig.getTableName(); String dsName = genConfig.getDsName(); @@ -111,7 +112,8 @@ public class GeneratorServiceImpl implements GeneratorService { public byte[] generatorCode(GenConfig genConfig) { // 根据tableName 查询最新的表单配置 List formConfList = genFormConfMapper.selectList(Wrappers.lambdaQuery() - .eq(GenFormConf::getTableName, genConfig.getTableName()).orderByDesc(GenFormConf::getCreateTime)); + .eq(GenFormConf::getTableName, genConfig.getTableName()) + .orderByDesc(GenFormConf::getCreateTime)); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ZipOutputStream zip = new ZipOutputStream(outputStream); diff --git a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java index de5a7ffd285215991e18bc97c39ed703b6b59933..3de92f7c14a942f2b495632db46780abfb617299 100644 --- a/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java +++ b/pig-visual/pig-codegen/src/main/java/com/pig4cloud/pig/codegen/support/StyleTypeEnum.java @@ -36,8 +36,11 @@ public enum StyleTypeEnum { private String description; public static String getDecs(String style) { - return Arrays.stream(StyleTypeEnum.values()).filter(styleTypeEnum -> styleTypeEnum.getStyle().equals(style)) - .findFirst().orElse(ELEMENT).getDescription(); + return Arrays.stream(StyleTypeEnum.values()) + .filter(styleTypeEnum -> styleTypeEnum.getStyle().equals(style)) + .findFirst() + .orElse(ELEMENT) + .getDescription(); } } diff --git a/pig-visual/pig-codegen/src/main/resources/application.yml b/pig-visual/pig-codegen/src/main/resources/application.yml index 3a87b84885733cb1e37dc5c94db769a8e2cff6de..a21122e311ac9c2fbefa2bc2ad48136e5e35b812 100644 --- a/pig-visual/pig-codegen/src/main/resources/application.yml +++ b/pig-visual/pig-codegen/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-visual/pig-monitor/pom.xml b/pig-visual/pig-monitor/pom.xml index e643f3cf14f99ecd755f2538b1ed49c234d0ecb4..1be8a1170cbf3be7d1ef5fc9b4f86ad9ff5a74b6 100755 --- a/pig-visual/pig-monitor/pom.xml +++ b/pig-visual/pig-monitor/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig-visual - 3.6.4 + 3.6.7 pig-monitor diff --git a/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/config/WebSecurityConfigurer.java b/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/config/WebSecurityConfigurer.java index 316f9a781784d0292938c531250bef93994ffd96..1498b0d831efcddf6d1e46016870778dd2f93f4b 100755 --- a/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/config/WebSecurityConfigurer.java +++ b/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/config/WebSecurityConfigurer.java @@ -49,12 +49,28 @@ public class WebSecurityConfigurer { SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); successHandler.setTargetUrlParameter("redirectTo"); successHandler.setDefaultTargetUrl(adminContextPath + "/"); - http.headers().frameOptions().disable().and().authorizeRequests() - .antMatchers(adminContextPath + "/assets/**", adminContextPath + "/login", - adminContextPath + "/instances/**", adminContextPath + "/actuator/**") - .permitAll().anyRequest().authenticated().and().formLogin().loginPage(adminContextPath + "/login") - .successHandler(successHandler).and().logout().logoutUrl(adminContextPath + "/logout").and().httpBasic() - .and().csrf().disable(); + http.headers() + .frameOptions() + .disable() + .and() + .authorizeRequests() + .antMatchers(adminContextPath + "/assets/**", adminContextPath + "/login", + adminContextPath + "/instances/**", adminContextPath + "/actuator/**") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage(adminContextPath + "/login") + .successHandler(successHandler) + .and() + .logout() + .logoutUrl(adminContextPath + "/logout") + .and() + .httpBasic() + .and() + .csrf() + .disable(); return http.build(); } diff --git a/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/converter/NacosServiceInstanceConverter.java b/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/converter/NacosServiceInstanceConverter.java index 6298de211e5e73d0f798070de9af34b59059e02e..d5a87bc1f6fe0789a5e7985a056d6983adf8a59c 100644 --- a/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/converter/NacosServiceInstanceConverter.java +++ b/pig-visual/pig-monitor/src/main/java/com/pig4cloud/pig/monitor/converter/NacosServiceInstanceConverter.java @@ -20,10 +20,11 @@ public class NacosServiceInstanceConverter extends DefaultServiceInstanceConvert @Override protected Map getMetadata(ServiceInstance instance) { - return (instance.getMetadata() != null) - ? instance.getMetadata().entrySet().stream().filter((e) -> e.getKey() != null && e.getValue() != null) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)) - : emptyMap(); + return (instance.getMetadata() != null) ? instance.getMetadata() + .entrySet() + .stream() + .filter((e) -> e.getKey() != null && e.getValue() != null) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)) : emptyMap(); } } diff --git a/pig-visual/pig-monitor/src/main/resources/application.yml b/pig-visual/pig-monitor/src/main/resources/application.yml index 2ce78424eb85462b1544fb092ff1798f72b62ccb..928dcb819db6292ae90e6245d8034f59cfd8466f 100755 --- a/pig-visual/pig-monitor/src/main/resources/application.yml +++ b/pig-visual/pig-monitor/src/main/resources/application.yml @@ -6,6 +6,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} config: diff --git a/pig-visual/pig-sentinel-dashboard/pom.xml b/pig-visual/pig-sentinel-dashboard/pom.xml index 86f4321d097e7009abe519cfa41bca44c444ccba..9a3fb87eafb8d98a67ca5a357cdc5e45b5bea0aa 100755 --- a/pig-visual/pig-sentinel-dashboard/pom.xml +++ b/pig-visual/pig-sentinel-dashboard/pom.xml @@ -6,7 +6,7 @@ com.pig4cloud pig-visual - 3.6.4 + 3.6.7 pig-sentinel-dashboard diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java index b8a864deb36d2590743b142570b7d15a80a34cf9..af8c6a3d462063e4098db413a2c33177c602d1e7 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/auth/DefaultLoginAuthenticationFilter.java @@ -88,7 +88,7 @@ public class DefaultLoginAuthenticationFilter implements LoginAuthenticationFilt // Exclude the urls which needn't auth boolean authFilterExcludeMatch = authFilterExcludeUrls.stream() - .anyMatch(authFilterExcludeUrl -> PATH_MATCHER.match(authFilterExcludeUrl, servletPath)); + .anyMatch(authFilterExcludeUrl -> PATH_MATCHER.match(authFilterExcludeUrl, servletPath)); if (authFilterExcludeMatch) { chain.doFilter(request, response); return; diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java index afeb58bb46c3b461fa31db10466471dfb3faf2b2..821727f54c7d6011fb5dae351a517826621ffa13 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/client/SentinelApiClient.java @@ -87,7 +87,7 @@ public class SentinelApiClient { private static final String HTTP_HEADER_CONTENT_TYPE = "Content-Type"; private static final String HTTP_HEADER_CONTENT_TYPE_URLENCODED = ContentType.create(URLEncodedUtils.CONTENT_TYPE) - .toString(); + .toString(); private static final String RESOURCE_URL_PATH = "jsonTree"; @@ -143,8 +143,11 @@ public class SentinelApiClient { private AppManagement appManagement; public SentinelApiClient() { - IOReactorConfig ioConfig = IOReactorConfig.custom().setConnectTimeout(3000).setSoTimeout(10000) - .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2).build(); + IOReactorConfig ioConfig = IOReactorConfig.custom() + .setConnectTimeout(3000) + .setSoTimeout(10000) + .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2) + .build(); httpClient = HttpAsyncClients.custom().setRedirectStrategy(new DefaultRedirectStrategy() { @Override protected boolean isRedirectable(final String method) { @@ -164,10 +167,10 @@ public class SentinelApiClient { } protected boolean isSupportPost(String app, String ip, int port) { - return StringUtil.isNotEmpty(app) - && Optional.ofNullable(appManagement.getDetailApp(app)).flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version160))) - .orElse(false); + return StringUtil.isNotEmpty(app) && Optional.ofNullable(appManagement.getDetailApp(app)) + .flatMap(e -> e.getMachine(ip, port)) + .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version160))) + .orElse(false); } /** @@ -178,10 +181,10 @@ public class SentinelApiClient { * @param port target node's port */ protected boolean isSupportEnhancedContentType(String app, String ip, int port) { - return StringUtil.isNotEmpty(app) - && Optional.ofNullable(appManagement.getDetailApp(app)).flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version171))) - .orElse(false); + return StringUtil.isNotEmpty(app) && Optional.ofNullable(appManagement.getDetailApp(app)) + .flatMap(e -> e.getMachine(ip, port)) + .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version171))) + .orElse(false); } private StringBuilder queryString(Map params) { @@ -368,7 +371,7 @@ public class SentinelApiClient { AssertUtil.isTrue(port > 0, "Bad machine port"); Map params = null; if (StringUtil.isNotEmpty(type)) { - params = new HashMap<>(1); + params = new HashMap<>(2); params.put("type", type); } return executeCommand(ip, port, api, params, false).thenApply(json -> JSON.parseArray(json, ruleType)); @@ -379,11 +382,6 @@ public class SentinelApiClient { try { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); - Map params = null; - if (StringUtil.isNotEmpty(type)) { - params = new HashMap<>(1); - params.put("type", type); - } return fetchItemsAsync(ip, port, api, type, ruleType).get(); } catch (InterruptedException | ExecutionException e) { @@ -409,7 +407,7 @@ public class SentinelApiClient { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); String data = JSON.toJSONString(entities.stream().map(r -> r.toRule()).collect(Collectors.toList())); - Map params = new HashMap<>(2); + Map params = new HashMap<>(4); params.put("type", type); params.put("data", data); String result = executeCommand(app, ip, port, SET_RULES_PATH, params, true).get(); @@ -438,7 +436,7 @@ public class SentinelApiClient { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); String data = JSON.toJSONString(entities.stream().map(r -> r.toRule()).collect(Collectors.toList())); - Map params = new HashMap<>(2); + Map params = new HashMap<>(4); params.put("type", type); params.put("data", data); return executeCommand(app, ip, port, SET_RULES_PATH, params, true).thenCompose(r -> { @@ -476,8 +474,9 @@ public class SentinelApiClient { public List fetchFlowRuleOfMachine(String app, String ip, int port) { List rules = fetchRules(ip, port, FLOW_RULE_TYPE, FlowRule.class); if (rules != null) { - return rules.stream().map(rule -> FlowRuleEntity.fromFlowRule(app, ip, port, rule)) - .collect(Collectors.toList()); + return rules.stream() + .map(rule -> FlowRuleEntity.fromFlowRule(app, ip, port, rule)) + .collect(Collectors.toList()); } else { return null; @@ -487,8 +486,9 @@ public class SentinelApiClient { public List fetchDegradeRuleOfMachine(String app, String ip, int port) { List rules = fetchRules(ip, port, DEGRADE_RULE_TYPE, DegradeRule.class); if (rules != null) { - return rules.stream().map(rule -> DegradeRuleEntity.fromDegradeRule(app, ip, port, rule)) - .collect(Collectors.toList()); + return rules.stream() + .map(rule -> DegradeRuleEntity.fromDegradeRule(app, ip, port, rule)) + .collect(Collectors.toList()); } else { return null; @@ -498,8 +498,9 @@ public class SentinelApiClient { public List fetchSystemRuleOfMachine(String app, String ip, int port) { List rules = fetchRules(ip, port, SYSTEM_RULE_TYPE, SystemRule.class); if (rules != null) { - return rules.stream().map(rule -> SystemRuleEntity.fromSystemRule(app, ip, port, rule)) - .collect(Collectors.toList()); + return rules.stream() + .map(rule -> SystemRuleEntity.fromSystemRule(app, ip, port, rule)) + .collect(Collectors.toList()); } else { return null; @@ -520,8 +521,9 @@ public class SentinelApiClient { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); return fetchItemsAsync(ip, port, GET_PARAM_RULE_PATH, null, ParamFlowRule.class) - .thenApply(rules -> rules.stream().map(e -> ParamFlowRuleEntity.fromParamFlowRule(app, ip, port, e)) - .collect(Collectors.toList())); + .thenApply(rules -> rules.stream() + .map(e -> ParamFlowRuleEntity.fromParamFlowRule(app, ip, port, e)) + .collect(Collectors.toList())); } catch (Exception e) { logger.error("Error when fetching parameter flow rules", e); @@ -541,12 +543,14 @@ public class SentinelApiClient { AssertUtil.notEmpty(app, "Bad app name"); AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("type", AUTHORITY_TYPE); List rules = fetchRules(ip, port, AUTHORITY_TYPE, AuthorityRule.class); - return Optional.ofNullable(rules).map(r -> r.stream() - .map(e -> AuthorityRuleEntity.fromAuthorityRule(app, ip, port, e)).collect(Collectors.toList())) - .orElse(null); + return Optional.ofNullable(rules) + .map(r -> r.stream() + .map(e -> AuthorityRuleEntity.fromAuthorityRule(app, ip, port, e)) + .collect(Collectors.toList())) + .orElse(null); } /** @@ -607,8 +611,8 @@ public class SentinelApiClient { } try { String data = JSON - .toJSONString(rules.stream().map(ParamFlowRuleEntity::getRule).collect(Collectors.toList())); - Map params = new HashMap<>(1); + .toJSONString(rules.stream().map(ParamFlowRuleEntity::getRule).collect(Collectors.toList())); + Map params = new HashMap<>(2); params.put("data", data); return executeCommand(app, ip, port, SET_PARAM_RULE_PATH, params, true).thenCompose(e -> { if (CommandConstants.MSG_SUCCESS.equals(e)) { @@ -634,7 +638,7 @@ public class SentinelApiClient { } try { return executeCommand(ip, port, FETCH_CLUSTER_MODE_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterStateSimpleEntity.class)); + .thenApply(r -> JSON.parseObject(r, ClusterStateSimpleEntity.class)); } catch (Exception ex) { logger.warn("Error when fetching cluster mode", ex); @@ -647,7 +651,7 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("mode", String.valueOf(mode)); return executeCommand(ip, port, MODIFY_CLUSTER_MODE_PATH, params, false).thenCompose(e -> { if (CommandConstants.MSG_SUCCESS.equals(e)) { @@ -671,7 +675,7 @@ public class SentinelApiClient { } try { return executeCommand(ip, port, FETCH_CLUSTER_CLIENT_CONFIG_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterClientInfoVO.class)); + .thenApply(r -> JSON.parseObject(r, ClusterClientInfoVO.class)); } catch (Exception ex) { logger.warn("Error when fetching cluster client config", ex); @@ -685,7 +689,7 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("data", JSON.toJSONString(config)); return executeCommand(app, ip, port, MODIFY_CLUSTER_CLIENT_CONFIG_PATH, params, true).thenCompose(e -> { if (CommandConstants.MSG_SUCCESS.equals(e)) { @@ -709,18 +713,18 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("data", JSON.toJSONString(config)); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_FLOW_CONFIG_PATH, params, true) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server flow config: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); + .thenCompose(e -> { + if (CommandConstants.MSG_SUCCESS.equals(e)) { + return CompletableFuture.completedFuture(null); + } + else { + logger.warn("Error when modifying cluster server flow config: " + e); + return AsyncUtils.newFailedFuture(new RuntimeException(e)); + } + }); } catch (Exception ex) { logger.warn("Error when modifying cluster server flow config", ex); @@ -734,19 +738,19 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(2); + Map params = new HashMap<>(4); params.put("port", config.getPort().toString()); params.put("idleSeconds", config.getIdleSeconds().toString()); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_TRANSPORT_CONFIG_PATH, params, false) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server transport config: " + e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); + .thenCompose(e -> { + if (CommandConstants.MSG_SUCCESS.equals(e)) { + return CompletableFuture.completedFuture(null); + } + else { + logger.warn("Error when modifying cluster server transport config: " + e); + return AsyncUtils.newFailedFuture(new RuntimeException(e)); + } + }); } catch (Exception ex) { logger.warn("Error when modifying cluster server transport config", ex); @@ -759,18 +763,18 @@ public class SentinelApiClient { return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter")); } try { - Map params = new HashMap<>(1); + Map params = new HashMap<>(2); params.put("data", JSON.toJSONString(set)); return executeCommand(app, ip, port, MODIFY_CLUSTER_SERVER_NAMESPACE_SET_PATH, params, true) - .thenCompose(e -> { - if (CommandConstants.MSG_SUCCESS.equals(e)) { - return CompletableFuture.completedFuture(null); - } - else { - logger.warn("Error when modifying cluster server NamespaceSet", e); - return AsyncUtils.newFailedFuture(new RuntimeException(e)); - } - }); + .thenCompose(e -> { + if (CommandConstants.MSG_SUCCESS.equals(e)) { + return CompletableFuture.completedFuture(null); + } + else { + logger.warn("Error when modifying cluster server NamespaceSet", e); + return AsyncUtils.newFailedFuture(new RuntimeException(e)); + } + }); } catch (Exception ex) { logger.warn("Error when modifying cluster server NamespaceSet", ex); @@ -784,7 +788,7 @@ public class SentinelApiClient { } try { return executeCommand(ip, port, FETCH_CLUSTER_SERVER_BASIC_INFO_PATH, false) - .thenApply(r -> JSON.parseObject(r, ClusterServerStateVO.class)); + .thenApply(r -> JSON.parseObject(r, ClusterServerStateVO.class)); } catch (Exception ex) { logger.warn("Error when fetching cluster sever all config and basic info", ex); @@ -847,8 +851,8 @@ public class SentinelApiClient { return executeCommand(ip, port, FETCH_GATEWAY_FLOW_RULE_PATH, false).thenApply(r -> { List gatewayFlowRules = JSON.parseArray(r, GatewayFlowRule.class); List entities = gatewayFlowRules.stream() - .map(rule -> GatewayFlowRuleEntity.fromGatewayFlowRule(app, ip, port, rule)) - .collect(Collectors.toList()); + .map(rule -> GatewayFlowRuleEntity.fromGatewayFlowRule(app, ip, port, rule)) + .collect(Collectors.toList()); return entities; }); } @@ -868,7 +872,7 @@ public class SentinelApiClient { AssertUtil.notEmpty(ip, "Bad machine IP"); AssertUtil.isTrue(port > 0, "Bad machine port"); String data = JSON - .toJSONString(rules.stream().map(r -> r.toGatewayFlowRule()).collect(Collectors.toList())); + .toJSONString(rules.stream().map(r -> r.toGatewayFlowRule()).collect(Collectors.toList())); Map params = new HashMap<>(2); params.put("data", data); String result = executeCommand(app, ip, port, MODIFY_GATEWAY_FLOW_RULE_PATH, params, true).get(); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java index b372453bb4a1e65cd44325690972cc6c53248db6..1efc019edf404c92c7ac76d25d4c12693bb53b86 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/AppController.java @@ -58,8 +58,10 @@ public class AppController { return Result.ofSuccess(null); } List list = new ArrayList<>(appInfo.getMachines()); - Collections.sort(list, Comparator.comparing(MachineInfo::getApp).thenComparing(MachineInfo::getIp) - .thenComparingInt(MachineInfo::getPort)); + Collections.sort(list, + Comparator.comparing(MachineInfo::getApp) + .thenComparing(MachineInfo::getIp) + .thenComparingInt(MachineInfo::getPort)); return Result.ofSuccess(MachineInfoVo.fromMachineInfoList(list)); } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java index f81d64cd9099138153242416a42cc40860f6847e..72ddaf3b9043e19184f298b128e8e86591318395 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ParamFlowRuleController.java @@ -60,9 +60,10 @@ public class ParamFlowRuleController { private boolean checkIfSupported(String app, String ip, int port) { try { - return Optional.ofNullable(appManagement.getDetailApp(app)).flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version020))) - .orElse(true); + return Optional.ofNullable(appManagement.getDetailApp(app)) + .flatMap(e -> e.getMachine(ip, port)) + .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version020))) + .orElse(true); // If error occurred or cannot retrieve machine info, return true. } catch (Exception ex) { @@ -87,8 +88,10 @@ public class ParamFlowRuleController { return unsupportedVersion(); } try { - return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port).thenApply(repository::saveAll) - .thenApply(Result::ofSuccess).get(); + return sentinelApiClient.fetchParamFlowRulesOfMachine(app, ip, port) + .thenApply(repository::saveAll) + .thenApply(Result::ofSuccess) + .get(); } catch (ExecutionException ex) { logger.error("Error when querying parameter flow rules", ex.getCause()); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java index ad9148c603648351c5bb8e1ba8beb502a0828c02..c342d5460688e57025ff06fdd743578f8c17ae3a 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/ResourceController.java @@ -81,8 +81,8 @@ public class ResourceController { } if (StringUtil.isNotEmpty(searchKey)) { nodeVos = nodeVos.stream() - .filter(node -> node.getResource().toLowerCase().contains(searchKey.toLowerCase())) - .collect(Collectors.toList()); + .filter(node -> node.getResource().toLowerCase().contains(searchKey.toLowerCase())) + .collect(Collectors.toList()); } return Result.ofSuccess(ResourceVo.fromNodeVoList(nodeVos)); } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java index e967900b8c559ffd6b4f40186a7513e805508fdc..d15dee282e7c5d20bcbf358ae45489a37ad0d268 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/cluster/ClusterConfigController.java @@ -147,7 +147,9 @@ public class ClusterConfigController { } try { return clusterConfigService.getClusterUniversalState(app) - .thenApply(ClusterEntityUtils::wrapToAppClusterServerState).thenApply(Result::ofSuccess).get(); + .thenApply(ClusterEntityUtils::wrapToAppClusterServerState) + .thenApply(Result::ofSuccess) + .get(); } catch (ExecutionException ex) { logger.error("Error when fetching cluster server state of app: " + app, ex.getCause()); @@ -166,7 +168,9 @@ public class ClusterConfigController { } try { return clusterConfigService.getClusterUniversalState(app) - .thenApply(ClusterEntityUtils::wrapToAppClusterClientState).thenApply(Result::ofSuccess).get(); + .thenApply(ClusterEntityUtils::wrapToAppClusterClientState) + .thenApply(Result::ofSuccess) + .get(); } catch (ExecutionException ex) { logger.error("Error when fetching cluster token client state of app: " + app, ex.getCause()); @@ -202,9 +206,10 @@ public class ClusterConfigController { private boolean checkIfSupported(String app, String ip, int port) { try { - return Optional.ofNullable(appManagement.getDetailApp(app)).flatMap(e -> e.getMachine(ip, port)) - .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version140))) - .orElse(true); + return Optional.ofNullable(appManagement.getDetailApp(app)) + .flatMap(e -> e.getMachine(ip, port)) + .flatMap(m -> VersionUtils.parseVersion(m.getVersion()).map(v -> v.greaterOrEqual(version140))) + .orElse(true); // If error occurred or cannot retrieve machine info, return true. } catch (Exception ex) { diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java index 32e1888271bb7bd696c9d7b9c58b41e71c084ef4..9415b577e964bc9c6ec35dd190d631a181073b5e 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayApiController.java @@ -125,7 +125,7 @@ public class GatewayApiController { // 匹配模式 Integer matchStrategy = predicateItem.getMatchStrategy(); if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { + .contains(matchStrategy)) { return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); } predicateItemEntity.setMatchStrategy(matchStrategy); @@ -197,7 +197,7 @@ public class GatewayApiController { // 匹配模式 int matchStrategy = predicateItem.getMatchStrategy(); if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { + .contains(matchStrategy)) { return Result.ofFail(-1, "Invalid matchStrategy: " + matchStrategy); } predicateItemEntity.setMatchStrategy(matchStrategy); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java index 016d4f3960150065dcceb122103d067ca673f32e..5a9907c40220b4c443dc0e52da9ccd713d0a7937 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/controller/gateway/GatewayFlowRuleController.java @@ -132,15 +132,17 @@ public class GatewayFlowRuleController { // 参数属性 0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie Integer parseStrategy = paramItem.getParseStrategy(); - if (!Arrays.asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, - PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) { + if (!Arrays + .asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, + PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) + .contains(parseStrategy)) { return Result.ofFail(-1, "invalid parseStrategy: " + parseStrategy); } itemEntity.setParseStrategy(paramItem.getParseStrategy()); // 当参数属性为2-Header 3-URL参数 4-Cookie时,参数名称必填 if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) - .contains(parseStrategy)) { + .contains(parseStrategy)) { // 参数名称 String fieldName = paramItem.getFieldName(); if (StringUtil.isBlank(fieldName)) { @@ -155,8 +157,8 @@ public class GatewayFlowRuleController { itemEntity.setPattern(pattern); Integer matchStrategy = paramItem.getMatchStrategy(); if (!Arrays - .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { + .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) + .contains(matchStrategy)) { return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); } itemEntity.setMatchStrategy(matchStrategy); @@ -199,7 +201,7 @@ public class GatewayFlowRuleController { return Result.ofFail(-1, "intervalUnit can't be null"); } if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY) - .contains(intervalUnit)) { + .contains(intervalUnit)) { return Result.ofFail(-1, "Invalid intervalUnit: " + intervalUnit); } entity.setIntervalUnit(intervalUnit); @@ -283,15 +285,17 @@ public class GatewayFlowRuleController { // 参数属性 0-ClientIP 1-Remote Host 2-Header 3-URL参数 4-Cookie Integer parseStrategy = paramItem.getParseStrategy(); - if (!Arrays.asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, - PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE).contains(parseStrategy)) { + if (!Arrays + .asList(PARAM_PARSE_STRATEGY_CLIENT_IP, PARAM_PARSE_STRATEGY_HOST, PARAM_PARSE_STRATEGY_HEADER, + PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) + .contains(parseStrategy)) { return Result.ofFail(-1, "invalid parseStrategy: " + parseStrategy); } itemEntity.setParseStrategy(paramItem.getParseStrategy()); // 当参数属性为2-Header 3-URL参数 4-Cookie时,参数名称必填 if (Arrays.asList(PARAM_PARSE_STRATEGY_HEADER, PARAM_PARSE_STRATEGY_URL_PARAM, PARAM_PARSE_STRATEGY_COOKIE) - .contains(parseStrategy)) { + .contains(parseStrategy)) { // 参数名称 String fieldName = paramItem.getFieldName(); if (StringUtil.isBlank(fieldName)) { @@ -306,8 +310,8 @@ public class GatewayFlowRuleController { itemEntity.setPattern(pattern); Integer matchStrategy = paramItem.getMatchStrategy(); if (!Arrays - .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) - .contains(matchStrategy)) { + .asList(PARAM_MATCH_STRATEGY_EXACT, PARAM_MATCH_STRATEGY_CONTAINS, PARAM_MATCH_STRATEGY_REGEX) + .contains(matchStrategy)) { return Result.ofFail(-1, "invalid matchStrategy: " + matchStrategy); } itemEntity.setMatchStrategy(matchStrategy); @@ -353,7 +357,7 @@ public class GatewayFlowRuleController { return Result.ofFail(-1, "intervalUnit can't be null"); } if (!Arrays.asList(INTERVAL_UNIT_SECOND, INTERVAL_UNIT_MINUTE, INTERVAL_UNIT_HOUR, INTERVAL_UNIT_DAY) - .contains(intervalUnit)) { + .contains(intervalUnit)) { return Result.ofFail(-1, "Invalid intervalUnit: " + intervalUnit); } entity.setIntervalUnit(intervalUnit); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java index 463412c837c394459981928f72f9091c83152ccc..33bfc2bb763fd051b8a342286835e863a1a9c9fc 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/AppInfo.java @@ -98,8 +98,10 @@ public class AppInfo { long healthyCount = machines.stream().filter(MachineInfo::isHealthy).count(); if (healthyCount == 0) { // No healthy machines. - return machines.stream().max(Comparator.comparingLong(MachineInfo::getLastHeartbeat)) - .map(e -> System.currentTimeMillis() - e.getLastHeartbeat() < threshold).orElse(false); + return machines.stream() + .max(Comparator.comparingLong(MachineInfo::getLastHeartbeat)) + .map(e -> System.currentTimeMillis() - e.getLastHeartbeat() < threshold) + .orElse(false); } } return true; diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java index 2b4a080bc0cae2f25b53341e64c44bc2fd70a8fb..357ed599fb4d61b2ff4d4a9f9a977d8463b25b95 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/discovery/MachineInfo.java @@ -151,11 +151,31 @@ public class MachineInfo implements Comparable { @Override public String toString() { - return new StringBuilder("MachineInfo {").append("app='").append(app).append('\'').append(",appType='") - .append(appType).append('\'').append(", hostname='").append(hostname).append('\'').append(", ip='") - .append(ip).append('\'').append(", port=").append(port).append(", heartbeatVersion=") - .append(heartbeatVersion).append(", lastHeartbeat=").append(lastHeartbeat).append(", version='") - .append(version).append('\'').append(", healthy=").append(isHealthy()).append('}').toString(); + return new StringBuilder("MachineInfo {").append("app='") + .append(app) + .append('\'') + .append(",appType='") + .append(appType) + .append('\'') + .append(", hostname='") + .append(hostname) + .append('\'') + .append(", ip='") + .append(ip) + .append('\'') + .append(", port=") + .append(port) + .append(", heartbeatVersion=") + .append(heartbeatVersion) + .append(", lastHeartbeat=") + .append(lastHeartbeat) + .append(", version='") + .append(version) + .append('\'') + .append(", healthy=") + .append(isHealthy()) + .append('}') + .toString(); } @Override diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java index ec42af53b69b0ebe2492edfa233cb36e7b69b6a5..2b4cc7887cea6ad4b8ed84311fcfc332a45ee050 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/metric/MetricFetcher.java @@ -101,8 +101,11 @@ public class MetricFetcher { fetchWorker = new ThreadPoolExecutor(cores, cores, keepAliveTime, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(queueSize), new NamedThreadFactory("sentinel-dashboard-metrics-fetchWorker", true), handler); - IOReactorConfig ioConfig = IOReactorConfig.custom().setConnectTimeout(3000).setSoTimeout(3000) - .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2).build(); + IOReactorConfig ioConfig = IOReactorConfig.custom() + .setConnectTimeout(3000) + .setSoTimeout(3000) + .setIoThreadCount(Runtime.getRuntime().availableProcessors() * 2) + .build(); httpclient = HttpAsyncClients.custom().setRedirectStrategy(new DefaultRedirectStrategy() { @Override diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java index 684ffc2c05b25878604940af119b295a7a9baf85..7968851a8d375f9e2b82b01ae8f234a8096146cf 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/metric/InMemoryMetricsRepository.java @@ -52,14 +52,15 @@ public class InMemoryMetricsRepository implements MetricsRepository new HashMap<>(16)) - .computeIfAbsent(entity.getResource(), e -> new LinkedHashMap() { - @Override - protected boolean removeEldestEntry(Entry eldest) { - // Metric older than {@link #MAX_METRIC_LIVE_TIME_MS} will be - // removed. - return eldest.getKey() < TimeUtil.currentTimeMillis() - MAX_METRIC_LIVE_TIME_MS; - } - }).put(entity.getTimestamp().getTime(), entity); + .computeIfAbsent(entity.getResource(), e -> new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Entry eldest) { + // Metric older than {@link #MAX_METRIC_LIVE_TIME_MS} will be + // removed. + return eldest.getKey() < TimeUtil.currentTimeMillis() - MAX_METRIC_LIVE_TIME_MS; + } + }) + .put(entity.getTimestamp().getTime(), entity); } finally { readWriteLock.writeLock().unlock(); diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java index 2e6e15cf7c0656cec045594d6a3d8b6b4542616c..d3be5f88b7b920fcd347cf5dce3aa40af3bacc40 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/repository/rule/InMemoryRuleRepositoryAdapter.java @@ -49,11 +49,12 @@ public abstract class InMemoryRuleRepositoryAdapter implem if (processedEntity != null) { allRules.put(processedEntity.getId(), processedEntity); machineRules - .computeIfAbsent(MachineInfo.of(processedEntity.getApp(), processedEntity.getIp(), - processedEntity.getPort()), e -> new ConcurrentHashMap<>(32)) - .put(processedEntity.getId(), processedEntity); + .computeIfAbsent( + MachineInfo.of(processedEntity.getApp(), processedEntity.getIp(), processedEntity.getPort()), + e -> new ConcurrentHashMap<>(32)) + .put(processedEntity.getId(), processedEntity); appRules.computeIfAbsent(processedEntity.getApp(), v -> new ConcurrentHashMap<>(32)) - .put(processedEntity.getId(), processedEntity); + .put(processedEntity.getId(), processedEntity); } return processedEntity; diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java index c5bf9fc8c8c59b5a40ebea9dfbefa5f170bf69de..eabafdd2bcdc5af805572baa2d7236987852e5b3 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/FlowRuleApiProvider.java @@ -44,10 +44,12 @@ public class FlowRuleApiProvider implements DynamicRuleProvider(); } - List list = appManagement.getDetailApp(appName).getMachines().stream() - .filter(MachineInfo::isHealthy) - .sorted((e1, e2) -> Long.compare(e2.getLastHeartbeat(), e1.getLastHeartbeat())) - .collect(Collectors.toList()); + List list = appManagement.getDetailApp(appName) + .getMachines() + .stream() + .filter(MachineInfo::isHealthy) + .sorted((e1, e2) -> Long.compare(e2.getLastHeartbeat(), e1.getLastHeartbeat())) + .collect(Collectors.toList()); if (list.isEmpty()) { return new ArrayList<>(); } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java index 1635e8d61f2cc197fbac20fa28eb98a9fa542e66..53a046af61d5519724309382e2334d265ab4952c 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterAssignServiceImpl.java @@ -60,13 +60,14 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { private ClusterAppAssignResultVO handleUnbindClusterServerNotInApp(String app, String machineId) { Set failedSet = new HashSet<>(); try { - List list = clusterConfigService.getClusterUniversalState(app).get(10, - TimeUnit.SECONDS); + List list = clusterConfigService.getClusterUniversalState(app) + .get(10, TimeUnit.SECONDS); Set toModifySet = list.stream() - .filter(e -> e.getState().getStateInfo().getMode() == ClusterStateManager.CLUSTER_CLIENT) - .filter(e -> machineId.equals(e.getState().getClient().getClientConfig().getServerHost() + ':' - + e.getState().getClient().getClientConfig().getServerPort())) - .map(e -> e.getIp() + '@' + e.getCommandPort()).collect(Collectors.toSet()); + .filter(e -> e.getState().getStateInfo().getMode() == ClusterStateManager.CLUSTER_CLIENT) + .filter(e -> machineId.equals(e.getState().getClient().getClientConfig().getServerHost() + ':' + + e.getState().getClient().getClientConfig().getServerPort())) + .map(e -> e.getIp() + '@' + e.getCommandPort()) + .collect(Collectors.toSet()); // Modify mode to NOT-STARTED for all associated token clients. modifyToNonStarted(toModifySet, failedSet); } @@ -79,11 +80,15 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { } private void modifyToNonStarted(Set toModifySet, Set failedSet) { - toModifySet.parallelStream().map(MachineUtils::parseCommandIpAndPort).filter(Optional::isPresent) - .map(Optional::get).map(e -> { - CompletableFuture f = modifyMode(e.r1, e.r2, ClusterStateManager.CLUSTER_NOT_STARTED); - return Tuple2.of(e.r1 + '@' + e.r2, f); - }).forEach(f -> handleFutureSync(f, failedSet)); + toModifySet.parallelStream() + .map(MachineUtils::parseCommandIpAndPort) + .filter(Optional::isPresent) + .map(Optional::get) + .map(e -> { + CompletableFuture f = modifyMode(e.r1, e.r2, ClusterStateManager.CLUSTER_NOT_STARTED); + return Tuple2.of(e.r1 + '@' + e.r2, f); + }) + .forEach(f -> handleFutureSync(f, failedSet)); } @Override @@ -97,7 +102,7 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { Set failedSet = new HashSet<>(); try { ClusterGroupEntity entity = clusterConfigService.getClusterUniversalStateForAppMachine(app, machineId) - .get(10, TimeUnit.SECONDS); + .get(10, TimeUnit.SECONDS); Set toModifySet = new HashSet<>(); toModifySet.add(machineId); if (entity.getClientSet() != null) { @@ -120,7 +125,7 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { AssertUtil.assertNotBlank(app, "app cannot be blank"); AssertUtil.isTrue(machineIdSet != null && !machineIdSet.isEmpty(), "machineIdSet cannot be empty"); ClusterAppAssignResultVO result = new ClusterAppAssignResultVO().setFailedClientSet(new HashSet<>()) - .setFailedServerSet(new HashSet<>()); + .setFailedServerSet(new HashSet<>()); for (String machineId : machineIdSet) { ClusterAppAssignResultVO resultVO = unbindClusterServer(app, machineId); result.getFailedClientSet().addAll(resultVO.getFailedClientSet()); @@ -142,13 +147,14 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { String ip = e.getIp(); int commandPort = parsePort(e); CompletableFuture f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_SERVER) - .thenCompose(v -> applyServerConfigChange(app, ip, commandPort, e)); + .thenCompose(v -> applyServerConfigChange(app, ip, commandPort, e)); return Tuple2.of(e.getMachineId(), f); }).forEach(t -> handleFutureSync(t, failedServerSet)); // Assign client of servers and apply config. - clusterMap.parallelStream().filter(Objects::nonNull) - .forEach(e -> applyAllClientConfigChange(app, e, failedClientSet)); + clusterMap.parallelStream() + .filter(Objects::nonNull) + .forEach(e -> applyAllClientConfigChange(app, e, failedClientSet)); // Unbind remaining (unassigned) machines. applyAllRemainingMachineSet(app, remainingSet, failedClientSet); @@ -160,13 +166,18 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { if (remainingSet == null || remainingSet.isEmpty()) { return; } - remainingSet.parallelStream().filter(Objects::nonNull).map(MachineUtils::parseCommandIpAndPort) - .filter(Optional::isPresent).map(Optional::get).map(ipPort -> { - String ip = ipPort.r1; - int commandPort = ipPort.r2; - CompletableFuture f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_NOT_STARTED); - return Tuple2.of(ip + '@' + commandPort, f); - }).forEach(t -> handleFutureSync(t, failedSet)); + remainingSet.parallelStream() + .filter(Objects::nonNull) + .map(MachineUtils::parseCommandIpAndPort) + .filter(Optional::isPresent) + .map(Optional::get) + .map(ipPort -> { + String ip = ipPort.r1; + int commandPort = ipPort.r2; + CompletableFuture f = modifyMode(ip, commandPort, ClusterStateManager.CLUSTER_NOT_STARTED); + return Tuple2.of(ip + '@' + commandPort, f); + }) + .forEach(t -> handleFutureSync(t, failedSet)); } private void applyAllClientConfigChange(String app, ClusterAppAssignMap assignMap, Set failedSet) { @@ -176,15 +187,20 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { } final String serverIp = assignMap.getIp(); final int serverPort = assignMap.getPort(); - clientSet.stream().map(MachineUtils::parseCommandIpAndPort).filter(Optional::isPresent).map(Optional::get) - .map(ipPort -> { - CompletableFuture f = sentinelApiClient - .modifyClusterMode(ipPort.r1, ipPort.r2, ClusterStateManager.CLUSTER_CLIENT) - .thenCompose(v -> sentinelApiClient.modifyClusterClientConfig(app, ipPort.r1, ipPort.r2, - new ClusterClientConfig().setRequestTimeout(20).setServerHost(serverIp) - .setServerPort(serverPort))); - return Tuple2.of(ipPort.r1 + '@' + ipPort.r2, f); - }).forEach(t -> handleFutureSync(t, failedSet)); + clientSet.stream() + .map(MachineUtils::parseCommandIpAndPort) + .filter(Optional::isPresent) + .map(Optional::get) + .map(ipPort -> { + CompletableFuture f = sentinelApiClient + .modifyClusterMode(ipPort.r1, ipPort.r2, ClusterStateManager.CLUSTER_CLIENT) + .thenCompose(v -> sentinelApiClient.modifyClusterClientConfig(app, ipPort.r1, ipPort.r2, + new ClusterClientConfig().setRequestTimeout(20) + .setServerHost(serverIp) + .setServerPort(serverPort))); + return Tuple2.of(ipPort.r1 + '@' + ipPort.r2, f); + }) + .forEach(t -> handleFutureSync(t, failedSet)); } private void handleFutureSync(Tuple2> t, Set failedSet) { @@ -205,10 +221,10 @@ public class ClusterAssignServiceImpl implements ClusterAssignService { private CompletableFuture applyServerConfigChange(String app, String ip, int commandPort, ClusterAppAssignMap assignMap) { ServerTransportConfig transportConfig = new ServerTransportConfig().setPort(assignMap.getPort()) - .setIdleSeconds(600); + .setIdleSeconds(600); return sentinelApiClient.modifyClusterServerTransportConfig(app, ip, commandPort, transportConfig) - .thenCompose(v -> applyServerFlowConfigChange(app, ip, commandPort, assignMap)) - .thenCompose(v -> applyServerNamespaceSetConfig(app, ip, commandPort, assignMap)); + .thenCompose(v -> applyServerFlowConfigChange(app, ip, commandPort, assignMap)) + .thenCompose(v -> applyServerNamespaceSetConfig(app, ip, commandPort, assignMap)); } private CompletableFuture applyServerFlowConfigChange(String app, String ip, int commandPort, diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java index d1cf10ffd1251f8d43da4a41f2cb5a8a4830b0b2..d88506316359cf254a0d90c2d8d6fcb3be2b51a1 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/service/ClusterConfigService.java @@ -61,7 +61,7 @@ public class ClusterConfigService { String ip = request.getIp(); int port = request.getPort(); return sentinelApiClient.modifyClusterClientConfig(app, ip, port, request.getClientConfig()) - .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT)); + .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_CLIENT)); } private boolean notClientRequestValid(/* @NonNull */ ClusterClientModifyRequest request) { @@ -87,9 +87,9 @@ public class ClusterConfigService { String ip = request.getIp(); int port = request.getPort(); return sentinelApiClient.modifyClusterServerNamespaceSet(app, ip, port, namespaceSet) - .thenCompose(v -> sentinelApiClient.modifyClusterServerTransportConfig(app, ip, port, transportConfig)) - .thenCompose(v -> sentinelApiClient.modifyClusterServerFlowConfig(app, ip, port, flowConfig)) - .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_SERVER)); + .thenCompose(v -> sentinelApiClient.modifyClusterServerTransportConfig(app, ip, port, transportConfig)) + .thenCompose(v -> sentinelApiClient.modifyClusterServerFlowConfig(app, ip, port, flowConfig)) + .thenCompose(v -> sentinelApiClient.modifyClusterMode(ip, port, ClusterStateManager.CLUSTER_SERVER)); } /** @@ -107,11 +107,12 @@ public class ClusterConfigService { return CompletableFuture.completedFuture(new ArrayList<>()); } - List> futures = appInfo.getMachines().stream() - .filter(e -> e.isHealthy()) - .map(machine -> getClusterUniversalState(app, machine.getIp(), machine.getPort()) - .thenApply(e -> new ClusterUniversalStatePairVO(machine.getIp(), machine.getPort(), e))) - .collect(Collectors.toList()); + List> futures = appInfo.getMachines() + .stream() + .filter(e -> e.isHealthy()) + .map(machine -> getClusterUniversalState(app, machine.getIp(), machine.getPort()) + .thenApply(e -> new ClusterUniversalStatePairVO(machine.getIp(), machine.getPort(), e))) + .collect(Collectors.toList()); return AsyncUtils.sequenceSuccessFuture(futures); } @@ -125,36 +126,43 @@ public class ClusterConfigService { return AsyncUtils.newFailedFuture(new IllegalArgumentException("app does not have machines")); } - boolean machineOk = appInfo.getMachines().stream().filter(e -> e.isHealthy()) - .map(e -> e.getIp() + '@' + e.getPort()).anyMatch(e -> e.equals(machineId)); + boolean machineOk = appInfo.getMachines() + .stream() + .filter(e -> e.isHealthy()) + .map(e -> e.getIp() + '@' + e.getPort()) + .anyMatch(e -> e.equals(machineId)); if (!machineOk) { return AsyncUtils.newFailedFuture(new IllegalStateException("machine does not exist or disconnected")); } return getClusterUniversalState(app).thenApply(ClusterEntityUtils::wrapToClusterGroup) - .thenCompose(e -> e.stream().filter(e1 -> e1.getMachineId().equals(machineId)).findAny() - .map(CompletableFuture::completedFuture) - .orElse(AsyncUtils.newFailedFuture(new IllegalStateException("not a server: " + machineId)))); + .thenCompose(e -> e.stream() + .filter(e1 -> e1.getMachineId().equals(machineId)) + .findAny() + .map(CompletableFuture::completedFuture) + .orElse(AsyncUtils.newFailedFuture(new IllegalStateException("not a server: " + machineId)))); } public CompletableFuture getClusterUniversalState(String app, String ip, int port) { return sentinelApiClient.fetchClusterMode(ip, port) - .thenApply(e -> new ClusterUniversalStateVO().setStateInfo(e)).thenCompose(vo -> { - if (vo.getStateInfo().getClientAvailable()) { - return sentinelApiClient.fetchClusterClientInfoAndConfig(ip, port) - .thenApply(cc -> vo.setClient(new ClusterClientStateVO().setClientConfig(cc))); - } - else { - return CompletableFuture.completedFuture(vo); - } - }).thenCompose(vo -> { - if (vo.getStateInfo().getServerAvailable()) { - return sentinelApiClient.fetchClusterServerBasicInfo(ip, port).thenApply(vo::setServer); - } - else { - return CompletableFuture.completedFuture(vo); - } - }); + .thenApply(e -> new ClusterUniversalStateVO().setStateInfo(e)) + .thenCompose(vo -> { + if (vo.getStateInfo().getClientAvailable()) { + return sentinelApiClient.fetchClusterClientInfoAndConfig(ip, port) + .thenApply(cc -> vo.setClient(new ClusterClientStateVO().setClientConfig(cc))); + } + else { + return CompletableFuture.completedFuture(vo); + } + }) + .thenCompose(vo -> { + if (vo.getStateInfo().getServerAvailable()) { + return sentinelApiClient.fetchClusterServerBasicInfo(ip, port).thenApply(vo::setServer); + } + else { + return CompletableFuture.completedFuture(vo); + } + }); } private boolean invalidTransportConfig(ServerTransportConfig transportConfig) { diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java index b7372b273a26dad85d9c2227ec1c7a32c134f552..2cf15bbc95d55f9f926d31a002cc3fd9b3cc4219 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/AsyncUtils.java @@ -39,13 +39,18 @@ public final class AsyncUtils { } public static CompletableFuture> sequenceFuture(List> futures) { - return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenApply( - v -> futures.stream().map(AsyncUtils::getValue).filter(Objects::nonNull).collect(Collectors.toList())); + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .thenApply(v -> futures.stream() + .map(AsyncUtils::getValue) + .filter(Objects::nonNull) + .collect(Collectors.toList())); } public static CompletableFuture> sequenceSuccessFuture(List> futures) { - return CompletableFuture.supplyAsync(() -> futures.parallelStream().map(AsyncUtils::getValue) - .filter(Objects::nonNull).collect(Collectors.toList())); + return CompletableFuture.supplyAsync(() -> futures.parallelStream() + .map(AsyncUtils::getValue) + .filter(Objects::nonNull) + .collect(Collectors.toList())); } public static T getValue(CompletableFuture future) { diff --git a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java index a4cb6de124758687c478966272ec4184acfd4fb5..de2ed0c5d17183a37c2c47321319f2ba388d6410 100644 --- a/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java +++ b/pig-visual/pig-sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/util/ClusterEntityUtils.java @@ -45,10 +45,15 @@ public final class ClusterEntityUtils { String serverId = ip + '@' + stateVO.getCommandPort(); ClusterServerStateVO serverStateVO = stateVO.getState().getServer(); map.computeIfAbsent(serverId, - v -> new AppClusterServerStateWrapVO().setId(serverId).setIp(ip) - .setPort(serverStateVO.getPort()).setState(serverStateVO).setBelongToApp(true) - .setConnectedCount(serverStateVO.getConnection().stream() - .mapToInt(ConnectionGroupVO::getConnectedCount).sum())); + v -> new AppClusterServerStateWrapVO().setId(serverId) + .setIp(ip) + .setPort(serverStateVO.getPort()) + .setState(serverStateVO) + .setBelongToApp(true) + .setConnectedCount(serverStateVO.getConnection() + .stream() + .mapToInt(ConnectionGroupVO::getConnectedCount) + .sum())); tokenServerSet.add(ip + ":" + serverStateVO.getPort()); } } @@ -69,8 +74,11 @@ public final class ClusterEntityUtils { // We are not able to get the commandPort of foreign token server // directly. String serverId = String.format("%s:%d", serverIp, serverPort); - map.computeIfAbsent(serverId, v -> new AppClusterServerStateWrapVO().setId(serverId).setIp(serverIp) - .setPort(serverPort).setBelongToApp(false)); + map.computeIfAbsent(serverId, + v -> new AppClusterServerStateWrapVO().setId(serverId) + .setIp(serverIp) + .setPort(serverPort) + .setBelongToApp(false)); } } return new ArrayList<>(map.values()); @@ -89,8 +97,11 @@ public final class ClusterEntityUtils { String ip = stateVO.getIp(); String clientId = ip + '@' + stateVO.getCommandPort(); ClusterClientStateVO clientStateVO = stateVO.getState().getClient(); - map.computeIfAbsent(clientId, v -> new AppClusterClientStateWrapVO().setId(clientId).setIp(ip) - .setState(clientStateVO).setCommandPort(stateVO.getCommandPort())); + map.computeIfAbsent(clientId, + v -> new AppClusterClientStateWrapVO().setId(clientId) + .setIp(ip) + .setState(clientStateVO) + .setCommandPort(stateVO.getCommandPort())); } } return new ArrayList<>(map.values()); @@ -108,8 +119,11 @@ public final class ClusterEntityUtils { String serverAddress = getIp(ip); int port = stateVO.getState().getServer().getPort(); String targetAddress = serverAddress + ":" + port; - map.computeIfAbsent(targetAddress, v -> new ClusterGroupEntity().setBelongToApp(true) - .setMachineId(ip + '@' + stateVO.getCommandPort()).setIp(ip).setPort(port)); + map.computeIfAbsent(targetAddress, + v -> new ClusterGroupEntity().setBelongToApp(true) + .setMachineId(ip + '@' + stateVO.getCommandPort()) + .setIp(ip) + .setPort(port)); } } for (ClusterUniversalStatePairVO stateVO : list) { @@ -122,8 +136,11 @@ public final class ClusterEntityUtils { continue; } String targetAddress = targetServer + ":" + targetPort; - ClusterGroupEntity group = map.computeIfAbsent(targetAddress, v -> new ClusterGroupEntity() - .setBelongToApp(true).setMachineId(targetServer).setIp(targetServer).setPort(targetPort)); + ClusterGroupEntity group = map.computeIfAbsent(targetAddress, + v -> new ClusterGroupEntity().setBelongToApp(true) + .setMachineId(targetServer) + .setIp(targetServer) + .setPort(targetPort)); group.getClientSet().add(ip + '@' + stateVO.getCommandPort()); } } diff --git a/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml b/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml index f70cb932358fae68bcbc36b2ab0946d5e8feffa5..d88c2d1be2f0430d144ea0f64c8497a828dbd9c3 100755 --- a/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml +++ b/pig-visual/pig-sentinel-dashboard/src/main/resources/application.yml @@ -9,6 +9,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} diff --git a/pig-visual/pig-xxl-job-admin/pom.xml b/pig-visual/pig-xxl-job-admin/pom.xml index 098b2cdaa043ec2adff906a12e51cadd321678e6..1478ed7026f28fbb5717c7ce83c6cee8a0db5d51 100644 --- a/pig-visual/pig-xxl-job-admin/pom.xml +++ b/pig-visual/pig-xxl-job-admin/pom.xml @@ -4,7 +4,7 @@ com.pig4cloud pig-visual - 3.6.4 + 3.6.7 pig-xxl-job-admin @@ -95,9 +95,11 @@ src/main/resources true - sta**/*.woff + **/*.woff **/*.woff2 + **/*.otf **/*.ttf + **/*.eot @@ -107,6 +109,8 @@ **/*.woff **/*.woff2 **/*.ttf + **/*.otf + **/*.eot diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java index 7c5be8e64a6891c33fd5d3956a34a368d0dac68f..4bea237be39f1de9a86b7d890d664531f8197709 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobApiController.java @@ -49,8 +49,9 @@ public class JobApiController { } if (XxlJobAdminConfig.getAdminConfig().getAccessToken() != null && XxlJobAdminConfig.getAdminConfig().getAccessToken().trim().length() > 0 - && !XxlJobAdminConfig.getAdminConfig().getAccessToken() - .equals(request.getHeader(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN))) { + && !XxlJobAdminConfig.getAdminConfig() + .getAccessToken() + .equals(request.getHeader(XxlJobRemotingUtil.XXL_JOB_ACCESS_TOKEN))) { return new ReturnT(ReturnT.FAIL_CODE, "The access token is wrong."); } diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java old mode 100755 new mode 100644 index f52e941bdfab932eb570d3533116840b735a7b77..87c5da426f324a7f2ee883e73f8e7149ecae0214 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobGroupController.java @@ -1,5 +1,6 @@ package com.xxl.job.admin.controller; +import com.xxl.job.admin.controller.annotation.PermissionLimit; import com.xxl.job.admin.core.model.XxlJobGroup; import com.xxl.job.admin.core.model.XxlJobRegistry; import com.xxl.job.admin.core.util.I18nUtil; @@ -37,12 +38,14 @@ public class JobGroupController { private XxlJobRegistryDao xxlJobRegistryDao; @RequestMapping + @PermissionLimit(adminuser = true) public String index(Model model) { return "jobgroup/jobgroup.index"; } @RequestMapping("/pageList") @ResponseBody + @PermissionLimit(adminuser = true) public Map pageList(HttpServletRequest request, @RequestParam(required = false, defaultValue = "0") int start, @RequestParam(required = false, defaultValue = "10") int length, String appname, String title) { @@ -61,6 +64,7 @@ public class JobGroupController { @RequestMapping("/save") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT save(XxlJobGroup xxlJobGroup) { // valid @@ -107,6 +111,7 @@ public class JobGroupController { @RequestMapping("/update") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT update(XxlJobGroup xxlJobGroup) { // valid if (xxlJobGroup.getAppname() == null || xxlJobGroup.getAppname().trim().length() == 0) { @@ -177,6 +182,7 @@ public class JobGroupController { @RequestMapping("/remove") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT remove(int id) { // valid @@ -196,6 +202,7 @@ public class JobGroupController { @RequestMapping("/loadById") @ResponseBody + @PermissionLimit(adminuser = true) public ReturnT loadById(int id) { XxlJobGroup jobGroup = xxlJobGroupDao.load(id); return jobGroup != null ? new ReturnT(jobGroup) diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java old mode 100755 new mode 100644 index d7225dd124717fe8839c1f09d36db9172b6f2ea9..8aad8291d137983663e81da3226ec9edf272a294 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/JobLogController.java @@ -138,23 +138,29 @@ public class JobLogController { model.addAttribute("triggerCode", jobLog.getTriggerCode()); model.addAttribute("handleCode", jobLog.getHandleCode()); - model.addAttribute("executorAddress", jobLog.getExecutorAddress()); - model.addAttribute("triggerTime", jobLog.getTriggerTime().getTime()); model.addAttribute("logId", jobLog.getId()); return "joblog/joblog.detail"; } @RequestMapping("/logDetailCat") @ResponseBody - public ReturnT logDetailCat(String executorAddress, long triggerTime, long logId, int fromLineNum) { + public ReturnT logDetailCat(long logId, int fromLineNum) { try { - ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(executorAddress); - ReturnT logResult = executorBiz.log(new LogParam(triggerTime, logId, fromLineNum)); + // valid + XxlJobLog jobLog = xxlJobLogDao.load(logId); // todo, need to improve + // performance + if (jobLog == null) { + return new ReturnT(ReturnT.FAIL_CODE, I18nUtil.getString("joblog_logid_unvalid")); + } + + // log cat + ExecutorBiz executorBiz = XxlJobScheduler.getExecutorBiz(jobLog.getExecutorAddress()); + ReturnT logResult = executorBiz + .log(new LogParam(jobLog.getTriggerTime().getTime(), logId, fromLineNum)); // is end if (logResult.getContent() != null && logResult.getContent().getFromLineNum() > logResult.getContent().getToLineNum()) { - XxlJobLog jobLog = xxlJobLogDao.load(logId); if (jobLog.getHandleCode() > 0) { logResult.getContent().setEnd(true); } diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java index 1b3fcf1eef522ca1511ba70859dc815b26cbc84a..e60ea1ccccffc8d7bb76e147cf31510cdfa9bca4 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/controller/annotation/PermissionLimit.java @@ -7,6 +7,7 @@ import java.lang.annotation.Target; /** * 权限限制 + * * @author xuxueli 2015-12-12 18:29:02 */ @Target(ElementType.METHOD) diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java index 4c52796e66b97a8d2c7f8aa88213c43acaf27d01..869eb1d393cd916d2a754d316c9073a8cf205045 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/alarm/impl/EmailJobAlarm.java @@ -49,8 +49,9 @@ public class EmailJobAlarm implements JobAlarm { } // email info - XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao() - .load(Integer.valueOf(info.getJobGroup())); + XxlJobGroup group = XxlJobAdminConfig.getAdminConfig() + .getXxlJobGroupDao() + .load(Integer.valueOf(info.getJobGroup())); String personal = I18nUtil.getString("admin_name_full"); String title = I18nUtil.getString("jobconf_monitor"); String content = MessageFormat.format(loadEmailJobAlarmTemplate(), diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java index 92e50d158ffc9ba5b1e1a38c264b158ce9787047..435ac1fe9dd7f17e719fbb4d84aae122c00c37af 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/complete/XxlJobCompleter.java @@ -47,8 +47,9 @@ public class XxlJobCompleter { // 1、handle success, to trigger child job String triggerChildMsg = null; if (XxlJobContext.HANDLE_CODE_SUCCESS == xxlJobLog.getHandleCode()) { - XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao() - .loadById(xxlJobLog.getJobId()); + XxlJobInfo xxlJobInfo = XxlJobAdminConfig.getAdminConfig() + .getXxlJobInfoDao() + .loadById(xxlJobLog.getJobId()); if (xxlJobInfo != null && xxlJobInfo.getChildJobId() != null && xxlJobInfo.getChildJobId().trim().length() > 0) { triggerChildMsg = "

>>>>>>>>>>>" diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java index 530d6dbf8b3392b96f677d60d694a76e725efbcc..3a5dd759e41a31e6591450196b0747c0d2485ecc 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteBusyover.java @@ -30,9 +30,13 @@ public class ExecutorRouteBusyover extends ExecutorRouter { idleBeatResult = new ReturnT(ReturnT.FAIL_CODE, "" + e); } idleBeatResultSB.append((idleBeatResultSB.length() > 0) ? "

" : "") - .append(I18nUtil.getString("jobconf_idleBeat") + ":").append("
address:").append(address) - .append("
code:").append(idleBeatResult.getCode()).append("
msg:") - .append(idleBeatResult.getMsg()); + .append(I18nUtil.getString("jobconf_idleBeat") + ":") + .append("
address:") + .append(address) + .append("
code:") + .append(idleBeatResult.getCode()) + .append("
msg:") + .append(idleBeatResult.getMsg()); // beat success if (idleBeatResult.getCode() == ReturnT.SUCCESS_CODE) { diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java index 0889e3d30415ef43089011c0f5de73bf08333dc3..f6d815188bcef792c963c0d8268eccb460166f20 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/route/strategy/ExecutorRouteFailover.java @@ -30,8 +30,13 @@ public class ExecutorRouteFailover extends ExecutorRouter { beatResult = new ReturnT(ReturnT.FAIL_CODE, "" + e); } beatResultSB.append((beatResultSB.length() > 0) ? "

" : "") - .append(I18nUtil.getString("jobconf_beat") + ":").append("
address:").append(address) - .append("
code:").append(beatResult.getCode()).append("
msg:").append(beatResult.getMsg()); + .append(I18nUtil.getString("jobconf_beat") + ":") + .append("
address:") + .append(address) + .append("
code:") + .append(beatResult.getCode()) + .append("
msg:") + .append(beatResult.getMsg()); // beat success if (beatResult.getCode() == ReturnT.SUCCESS_CODE) { diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java index 52abfe8989d6f215cdfd1b882322679624c1e874..4c57b120d51798bb0e2850a7c9cf329950e59f8c 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobCompleteHelper.java @@ -76,8 +76,9 @@ public class JobCompleteHelper { try { // 任务结果丢失处理:调度记录停留在 "运行中" 状态超过10min,且对应执行器心跳注册失败不在线,则将本地调度主动标记失败; Date losedTime = DateUtil.addMinutes(new Date(), -10); - List losedJobIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao() - .findLostJobIds(losedTime); + List losedJobIds = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .findLostJobIds(losedTime); if (losedJobIds != null && losedJobIds.size() > 0) { for (Long logId : losedJobIds) { diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java index 79863a0df23a6897e219cc7ed07e81ed7a8df1cc..dc7156b6ce5b0d3fcb9f15c87b0af10d828c1906 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java @@ -42,20 +42,23 @@ public class JobFailMonitorHelper { while (!toStop) { try { - List failLogIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao() - .findFailJobLogIds(1000); + List failLogIds = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .findFailJobLogIds(1000); if (failLogIds != null && !failLogIds.isEmpty()) { for (long failLogId : failLogIds) { // lock log - int lockRet = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao() - .updateAlarmStatus(failLogId, 0, -1); + int lockRet = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .updateAlarmStatus(failLogId, 0, -1); if (lockRet < 1) { continue; } XxlJobLog log = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().load(failLogId); - XxlJobInfo info = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao() - .loadById(log.getJobId()); + XxlJobInfo info = XxlJobAdminConfig.getAdminConfig() + .getXxlJobInfoDao() + .loadById(log.getJobId()); // 1、fail retry monitor if (log.getExecutorFailRetryCount() > 0) { @@ -72,16 +75,18 @@ public class JobFailMonitorHelper { // 2、fail alarm monitor int newAlarmStatus = 0; // 告警状态:0-默认、-1=锁定状态、1-无需告警、2-告警成功、3-告警失败 if (info != null) { - boolean alarmResult = XxlJobAdminConfig.getAdminConfig().getJobAlarmer().alarm(info, - log); + boolean alarmResult = XxlJobAdminConfig.getAdminConfig() + .getJobAlarmer() + .alarm(info, log); newAlarmStatus = alarmResult ? 2 : 3; } else { newAlarmStatus = 1; } - XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().updateAlarmStatus(failLogId, -1, - newAlarmStatus); + XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .updateAlarmStatus(failLogId, -1, newAlarmStatus); } } diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java index d2c7c38e4e7d9bbd2184d3bfaa75e32a079025a6..93b1b089a449d868cd124f43bc6b77adb47256c5 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobLogReportHelper.java @@ -70,8 +70,9 @@ public class JobLogReportHelper { xxlJobLogReport.setSucCount(0); xxlJobLogReport.setFailCount(0); - Map triggerCountMap = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao() - .findLogReport(todayFrom, todayTo); + Map triggerCountMap = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .findLogReport(todayFrom, todayTo); if (triggerCountMap != null && triggerCountMap.size() > 0) { int triggerDayCount = triggerCountMap.containsKey("triggerDayCount") ? Integer.valueOf(String.valueOf(triggerCountMap.get("triggerDayCount"))) : 0; @@ -89,8 +90,9 @@ public class JobLogReportHelper { } // do refresh - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao() - .update(xxlJobLogReport); + int ret = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogReportDao() + .update(xxlJobLogReport); if (ret < 1) { XxlJobAdminConfig.getAdminConfig().getXxlJobLogReportDao().save(xxlJobLogReport); } @@ -120,8 +122,9 @@ public class JobLogReportHelper { // clean expired log List logIds = null; do { - logIds = XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().findClearLogIds(0, 0, - clearBeforeTime, 0, 1000); + logIds = XxlJobAdminConfig.getAdminConfig() + .getXxlJobLogDao() + .findClearLogIds(0, 0, clearBeforeTime, 0, 1000); if (logIds != null && logIds.size() > 0) { XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().clearLog(logIds); } diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java index 27d39219b3d8764914ecfcaf10bbea69518177b0..967b4d0af87c08732fd9d6e9694c5373efbb8fcc 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobRegistryHelper.java @@ -60,21 +60,24 @@ public class JobRegistryHelper { while (!toStop) { try { // auto registry group - List groupList = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao() - .findByAddressType(0); + List groupList = XxlJobAdminConfig.getAdminConfig() + .getXxlJobGroupDao() + .findByAddressType(0); if (groupList != null && !groupList.isEmpty()) { // remove dead address (admin/executor) - List ids = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao() - .findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); + List ids = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .findDead(RegistryConfig.DEAD_TIMEOUT, new Date()); if (ids != null && ids.size() > 0) { XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().removeDead(ids); } // fresh online address (admin/executor) HashMap> appAddressMap = new HashMap>(); - List list = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao() - .findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); + List list = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .findAll(RegistryConfig.DEAD_TIMEOUT, new Date()); if (list != null) { for (XxlJobRegistry item : list) { if (RegistryConfig.RegistType.EXECUTOR.name().equals(item.getRegistryGroup())) { @@ -165,13 +168,15 @@ public class JobRegistryHelper { registryOrRemoveThreadPool.execute(new Runnable() { @Override public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryUpdate( - registryParam.getRegistryGroup(), registryParam.getRegistryKey(), - registryParam.getRegistryValue(), new Date()); - if (ret < 1) { - XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registrySave( - registryParam.getRegistryGroup(), registryParam.getRegistryKey(), + int ret = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .registryUpdate(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), registryParam.getRegistryValue(), new Date()); + if (ret < 1) { + XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .registrySave(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), + registryParam.getRegistryValue(), new Date()); // fresh freshGroupRegistryInfo(registryParam); @@ -195,9 +200,10 @@ public class JobRegistryHelper { registryOrRemoveThreadPool.execute(new Runnable() { @Override public void run() { - int ret = XxlJobAdminConfig.getAdminConfig().getXxlJobRegistryDao().registryDelete( - registryParam.getRegistryGroup(), registryParam.getRegistryKey(), - registryParam.getRegistryValue()); + int ret = XxlJobAdminConfig.getAdminConfig() + .getXxlJobRegistryDao() + .registryDelete(registryParam.getRegistryGroup(), registryParam.getRegistryKey(), + registryParam.getRegistryValue()); if (ret > 0) { // fresh freshGroupRegistryInfo(registryParam); diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java index 3d98bb5cb6cc5b01cba3fc469efbdad97540b1e7..d4f97d83335e8a33e0f4ae36fc4491ceba442995 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobScheduleHelper.java @@ -87,8 +87,9 @@ public class JobScheduleHelper { // 1、pre read long nowTime = System.currentTimeMillis(); - List scheduleList = XxlJobAdminConfig.getAdminConfig().getXxlJobInfoDao() - .scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount); + List scheduleList = XxlJobAdminConfig.getAdminConfig() + .getXxlJobInfoDao() + .scheduleJobQuery(nowTime + PRE_READ_MS, preReadCount); if (scheduleList != null && scheduleList.size() > 0) { // 2、push time-ring for (XxlJobInfo jobInfo : scheduleList) { @@ -101,7 +102,7 @@ public class JobScheduleHelper { // 1、misfire match MisfireStrategyEnum misfireStrategyEnum = MisfireStrategyEnum - .match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING); + .match(jobInfo.getMisfireStrategy(), MisfireStrategyEnum.DO_NOTHING); if (MisfireStrategyEnum.FIRE_ONCE_NOW == misfireStrategyEnum) { // FIRE_ONCE_NOW 》 trigger JobTriggerPoolHelper.trigger(jobInfo.getId(), TriggerTypeEnum.MISFIRE, -1, null, @@ -228,7 +229,7 @@ public class JobScheduleHelper { // pre-read period: success > scan each second; fail > skip // this period; TimeUnit.MILLISECONDS - .sleep((preReadSuc ? 1000 : PRE_READ_MS) - System.currentTimeMillis() % 1000); + .sleep((preReadSuc ? 1000 : PRE_READ_MS) - System.currentTimeMillis() % 1000); } catch (InterruptedException e) { if (!scheduleThreadToStop) { diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java index 2dd817bad38477654fba67de82e2d63fdb08dc1e..e0b660f18be3bdaa16be75bdcefe4118c8e8b4c7 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/trigger/XxlJobTrigger.java @@ -66,7 +66,7 @@ public class XxlJobTrigger { } } if (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == ExecutorRouteStrategyEnum - .match(jobInfo.getExecutorRouteStrategy(), null) && group.getRegistryList() != null + .match(jobInfo.getExecutorRouteStrategy(), null) && group.getRegistryList() != null && !group.getRegistryList().isEmpty() && shardingParam == null) { for (int i = 0; i < group.getRegistryList().size(); i++) { processTrigger(group, jobInfo, finalFailRetryCount, triggerType, i, group.getRegistryList().size()); @@ -106,7 +106,7 @@ public class XxlJobTrigger { ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION); // block strategy ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum - .match(jobInfo.getExecutorRouteStrategy(), null); // route strategy + .match(jobInfo.getExecutorRouteStrategy(), null); // route strategy String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST == executorRouteStrategyEnum) ? String.valueOf(index).concat("/").concat(String.valueOf(total)) : null; @@ -169,31 +169,45 @@ public class XxlJobTrigger { // 5、collection trigger info StringBuffer triggerMsgSb = new StringBuffer(); triggerMsgSb.append(I18nUtil.getString("jobconf_trigger_type")).append(":").append(triggerType.getTitle()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_admin_adress")).append(":") - .append(IpUtil.getIp()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_exe_regtype")).append(":") - .append((group.getAddressType() == 0) ? I18nUtil.getString("jobgroup_field_addressType_0") - : I18nUtil.getString("jobgroup_field_addressType_1")); - triggerMsgSb.append("
").append(I18nUtil.getString("jobconf_trigger_exe_regaddress")).append(":") - .append(group.getRegistryList()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")).append(":") - .append(executorRouteStrategyEnum.getTitle()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobconf_trigger_admin_adress")) + .append(":") + .append(IpUtil.getIp()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobconf_trigger_exe_regtype")) + .append(":") + .append((group.getAddressType() == 0) ? I18nUtil.getString("jobgroup_field_addressType_0") + : I18nUtil.getString("jobgroup_field_addressType_1")); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobconf_trigger_exe_regaddress")) + .append(":") + .append(group.getRegistryList()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobinfo_field_executorRouteStrategy")) + .append(":") + .append(executorRouteStrategyEnum.getTitle()); if (shardingParam != null) { triggerMsgSb.append("(" + shardingParam + ")"); } - triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")).append(":") - .append(blockStrategy.getTitle()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_timeout")).append(":") - .append(jobInfo.getExecutorTimeout()); - triggerMsgSb.append("
").append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")).append(":") - .append(finalFailRetryCount); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobinfo_field_executorBlockStrategy")) + .append(":") + .append(blockStrategy.getTitle()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobinfo_field_timeout")) + .append(":") + .append(jobInfo.getExecutorTimeout()); + triggerMsgSb.append("
") + .append(I18nUtil.getString("jobinfo_field_executorFailRetryCount")) + .append(":") + .append(finalFailRetryCount); triggerMsgSb - .append("

>>>>>>>>>>>" - + I18nUtil.getString("jobconf_trigger_run") + "<<<<<<<<<<<
") - .append((routeAddressResult != null && routeAddressResult.getMsg() != null) - ? routeAddressResult.getMsg() + "

" : "") - .append(triggerResult.getMsg() != null ? triggerResult.getMsg() : ""); + .append("

>>>>>>>>>>>" + I18nUtil.getString("jobconf_trigger_run") + + "<<<<<<<<<<<
") + .append((routeAddressResult != null && routeAddressResult.getMsg() != null) + ? routeAddressResult.getMsg() + "

" : "") + .append(triggerResult.getMsg() != null ? triggerResult.getMsg() : ""); // 6、save log trigger-info jobLog.setExecutorAddress(address); diff --git a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java index 82e63c9dfda80b8cdde0e86c9c9eb393f5b81891..7ee1830d3a50a0aab4d6eec233a6660776d83da3 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java +++ b/pig-visual/pig-xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/FtlUtil.java @@ -17,7 +17,7 @@ public class FtlUtil { private static Logger logger = LoggerFactory.getLogger(FtlUtil.class); private static BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS) - .build(); // BeansWrapper.getDefaultInstance(); + .build(); // BeansWrapper.getDefaultInstance(); public static TemplateHashModel generateStaticModel(String packageName) { try { diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml b/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml index 20eccf92a897834573f0d81f8c0fe6f2fbff7367..1de0564052a8dd108d0ae2f07fa83417cc0266ba 100644 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/application.yml @@ -12,6 +12,8 @@ spring: name: @artifactId@ cloud: nacos: + username: @nacos.username@ + password: @nacos.password@ discovery: server-addr: ${NACOS_HOST:pig-register}:${NACOS_PORT:8848} metadata: diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties index 001f841a495f030cb829d90f09df408b74d13386..589d9eb4f5115013f5faae030cbcd276e7d23d11 100644 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_en.properties @@ -1,6 +1,6 @@ admin_name=Scheduling Center admin_name_full=Distributed Task Scheduling Platform XXL-JOB -admin_version=2.3.1 +admin_version=2.4.0 admin_i18n=en ## system diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties index 69ef6e3d774b095ba98451aaa53bb0d8cf51cd15..fc1d276441e27994c10b00272d5b7f75b8462778 100644 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_CN.properties @@ -1,6 +1,6 @@ admin_name=任务调度中心 admin_name_full=分布式任务调度平台XXL-JOB -admin_version=2.3.1 +admin_version=2.4.0 admin_i18n= ## system diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties index 35916c0d4be8388f8a13baa9b2eb07ed174b6a98..49d39fd2a2def38bfea733f209da4ce0252af0dc 100755 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/i18n/message_zh_TC.properties @@ -1,6 +1,6 @@ admin_name=任務調度中心 admin_name_full=分布式任務調度平臺XXL-JOB -admin_version=2.3.1 +admin_version=2.4.0 admin_i18n= ## system diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js b/pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js old mode 100755 new mode 100644 index ddefd46631a54e3cc0bcde085a73ba3409d0985f..0638eee275739bfdf038ae8b8197c7ece968dae4 --- a/pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/static/js/joblog.detail.1.js @@ -25,8 +25,6 @@ $(function() { async: false, // sync, make log ordered url : base_url + '/joblog/logDetailCat', data : { - "executorAddress":executorAddress, - "triggerTime":triggerTime, "logId":logId, "fromLineNum":fromLineNum }, diff --git a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl old mode 100755 new mode 100644 index 3881cfa6ae491b7f21ff84196ad1a444be630ddc..bb8072f978b18c8041533b6aa80db73942bc277c --- a/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl +++ b/pig-visual/pig-xxl-job-admin/src/main/resources/templates/joblog/joblog.detail.ftl @@ -62,8 +62,6 @@ // 参数 var triggerCode = '${triggerCode}'; var handleCode = '${handleCode}'; - var executorAddress = '${executorAddress!}'; - var triggerTime = '${triggerTime?c}'; var logId = '${logId}'; diff --git a/pig-visual/pom.xml b/pig-visual/pom.xml index 7366fa283977820fd9cbc8dc7731c7b8d8278bfd..9469be1b5533ed860e51be970ff8e81bca876980 100755 --- a/pig-visual/pom.xml +++ b/pig-visual/pom.xml @@ -21,7 +21,7 @@ com.pig4cloud pig - 3.6.4 + 3.6.7 pig-visual diff --git a/pom.xml b/pom.xml index 2ed3732272416d541c24675c5a2fe67a6848259d..b716876a879eb9c470c1d90463d9f3dbe195cfe5 100755 --- a/pom.xml +++ b/pom.xml @@ -22,28 +22,28 @@ com.pig4cloud pig ${project.artifactId} - 3.6.4 + 3.6.7 pom https://www.pig4cloud.com - 2.7.6 - 2021.0.5 - 2021.0.4.0 + 2.7.11 + 2021.0.6 + 2021.0.5.0 UTF-8 1.8 1.8 - 2.7.9 - 0.4.0 + 2.7.10 + 0.4.2 3.6.0 2.2.2 2.3 3.1 1.10 - 2.1.0 + 3.0.5 3.0.0 3.0.3 - 2.3.1 + 2.4.0 0.32.0 http://192.168.0.100:2375 192.168.0.100 @@ -51,7 +51,7 @@ username password 4.9.9 - 0.0.34 + 0.0.38 @@ -230,15 +230,6 @@ io.spring.javaformat spring-javaformat-maven-plugin ${spring.checkstyle.plugin} - - - validate - true - - validate - - - @@ -249,6 +240,8 @@ dev + nacos + nacos