From 71411a14f082b3d9f70554769ccc30388e294cd9 Mon Sep 17 00:00:00 2001 From: yiumankam <415481084@qq.com> Date: Fri, 8 Jan 2021 17:00:39 +0800 Subject: [PATCH 001/178] =?UTF-8?q?=E4=BF=AE=E5=A4=8DMybatis=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=B8=BA=E7=A9=BA=E6=97=B6=E7=9A=84BUG,=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86=EF=BC=8C=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E7=AE=A1=E7=90=86=EF=BC=8C=E8=AE=BF=E9=97=AE=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicDataSourceAutoConfiguration.java | 9 +++++++-- .../yiuman/citrus/support/model/Page.java | 12 +++++------ .../yiuman/citrus/system/dto/UserDto.java | 1 + .../citrus/system/entity/AccessLog.java | 3 +++ .../citrus/system/entity/Dictionary.java | 3 +++ .../system/rest/AccessLogController.java | 20 +++++++++++++++++-- .../system/rest/DictionaryController.java | 20 +++++++++++++++++++ 7 files changed, 58 insertions(+), 10 deletions(-) diff --git a/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/DynamicDataSourceAutoConfiguration.java b/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/DynamicDataSourceAutoConfiguration.java index 1b5a081a..5540d0c0 100644 --- a/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/DynamicDataSourceAutoConfiguration.java +++ b/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/DynamicDataSourceAutoConfiguration.java @@ -229,7 +229,7 @@ public DataSource buildDruidXADataSource(String resourceName, DataSourceProperti */ @Bean @ConditionalOnMissingBean - public SqlSessionFactory sqlSessionFactory(DynamicSqlSessionTemplate dynamicSqlSessionTemplate) throws Exception { + public SqlSessionFactory sqlSessionFactory(DynamicSqlSessionTemplate dynamicSqlSessionTemplate) { return dynamicSqlSessionTemplate.getSqlSessionFactory(); } @@ -314,7 +314,12 @@ private void applyConfiguration(MybatisSqlSessionFactoryBean factory) { private MybatisConfiguration getCopyMybatisConfiguration(MybatisPlusProperties mybatisPlusProperties) { MybatisConfiguration mybatisConfiguration = new MybatisConfiguration(); - BeanUtils.copyProperties(mybatisPlusProperties.getConfiguration(), mybatisConfiguration); + + //如果配置中有,则拷贝一份 + Optional.ofNullable(mybatisPlusProperties.getConfiguration()) + .ifPresent(propertiesConfiguration -> + BeanUtils.copyProperties(propertiesConfiguration, mybatisConfiguration)); + if (!CollectionUtils.isEmpty(this.configurationCustomizers)) { for (ConfigurationCustomizer customizer : this.configurationCustomizers) { customizer.customize(mybatisConfiguration); diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/model/Page.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/model/Page.java index fc2b1773..f5db355b 100644 --- a/citrus-support/src/main/java/com/github/yiuman/citrus/support/model/Page.java +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/model/Page.java @@ -223,12 +223,12 @@ public void beforeShow() { * 若需要扩展上面的记录字段,如想加一个cField; * 则扩展后为 * { - * records:[{key:'1',aField:xxx,bField:xxx}], - * extends:{ - * '1':{ - * cField:xxxx - * } - * } + * records:[{key:'1',aField:xxx,bField:xxx}], + * extends:{ + * '1':{ + * cField:xxxx + * } + * } * } */ public void initFunctionalRecords() { diff --git a/citrus-system/src/main/java/com/github/yiuman/citrus/system/dto/UserDto.java b/citrus-system/src/main/java/com/github/yiuman/citrus/system/dto/UserDto.java index 4727fc23..f1d60b12 100644 --- a/citrus-system/src/main/java/com/github/yiuman/citrus/system/dto/UserDto.java +++ b/citrus-system/src/main/java/com/github/yiuman/citrus/system/dto/UserDto.java @@ -36,6 +36,7 @@ public class UserDto { private String email; @ExcelIgnore + @JsonIgnore private String avatar; @JsonSerialize(contentUsing = ToStringSerializer.class) diff --git a/citrus-system/src/main/java/com/github/yiuman/citrus/system/entity/AccessLog.java b/citrus-system/src/main/java/com/github/yiuman/citrus/system/entity/AccessLog.java index ba128902..0fe77758 100644 --- a/citrus-system/src/main/java/com/github/yiuman/citrus/system/entity/AccessLog.java +++ b/citrus-system/src/main/java/com/github/yiuman/citrus/system/entity/AccessLog.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; import java.time.LocalDateTime; @@ -22,6 +24,7 @@ public class AccessLog { * 主键 */ @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) private Long id; /** diff --git a/citrus-system/src/main/java/com/github/yiuman/citrus/system/entity/Dictionary.java b/citrus-system/src/main/java/com/github/yiuman/citrus/system/entity/Dictionary.java index 567cd9bb..8f8e0f63 100644 --- a/citrus-system/src/main/java/com/github/yiuman/citrus/system/entity/Dictionary.java +++ b/citrus-system/src/main/java/com/github/yiuman/citrus/system/entity/Dictionary.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Data; /** @@ -16,6 +18,7 @@ public class Dictionary { @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) private Long dictId; private String dictCode; diff --git a/citrus-system/src/main/java/com/github/yiuman/citrus/system/rest/AccessLogController.java b/citrus-system/src/main/java/com/github/yiuman/citrus/system/rest/AccessLogController.java index 965836de..f8608d92 100644 --- a/citrus-system/src/main/java/com/github/yiuman/citrus/system/rest/AccessLogController.java +++ b/citrus-system/src/main/java/com/github/yiuman/citrus/system/rest/AccessLogController.java @@ -1,7 +1,10 @@ package com.github.yiuman.citrus.system.rest; +import cn.hutool.core.date.DateUtil; import com.github.yiuman.citrus.support.crud.query.QueryParam; -import com.github.yiuman.citrus.support.crud.rest.BaseCrudController; +import com.github.yiuman.citrus.support.crud.rest.BaseQueryController; +import com.github.yiuman.citrus.support.model.Header; +import com.github.yiuman.citrus.support.model.Page; import com.github.yiuman.citrus.system.entity.AccessLog; import lombok.Data; import org.springframework.web.bind.annotation.RequestMapping; @@ -17,7 +20,7 @@ */ @RestController @RequestMapping("/rest/access/log") -public class AccessLogController extends BaseCrudController { +public class AccessLogController extends BaseQueryController { public AccessLogController() { addSortBy("createTime", true); @@ -34,4 +37,17 @@ static class AccessLogQuery { private List resourceType; } + @Override + protected Page createPage() throws Exception { + Page page = super.createPage(); + page.setHasSelect(false); + page.addHeader("用户", "username").align(Header.Align.center); + page.addHeader("IP地址", "ipAddress"); + page.addHeader("请求", "method_url", entity -> String.format("%s %s", entity.getRequestMethod(), entity.getUrl())); + page.addHeader("参数","params"); + page.addHeader("资源名称", "resourceName"); + page.addHeader("时间", "createTime_",entity-> DateUtil.format(entity.getCreateTime(),"yyyy-MM-dd hh:mm:ss")); + return page; + } + } diff --git a/citrus-system/src/main/java/com/github/yiuman/citrus/system/rest/DictionaryController.java b/citrus-system/src/main/java/com/github/yiuman/citrus/system/rest/DictionaryController.java index 228c9fa1..42d486e8 100644 --- a/citrus-system/src/main/java/com/github/yiuman/citrus/system/rest/DictionaryController.java +++ b/citrus-system/src/main/java/com/github/yiuman/citrus/system/rest/DictionaryController.java @@ -1,6 +1,9 @@ package com.github.yiuman.citrus.system.rest; import com.github.yiuman.citrus.support.crud.rest.BaseCrudController; +import com.github.yiuman.citrus.support.model.DialogView; +import com.github.yiuman.citrus.support.model.Page; +import com.github.yiuman.citrus.support.utils.Buttons; import com.github.yiuman.citrus.system.entity.Dictionary; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -15,4 +18,21 @@ @RequestMapping("/rest/dicts") public class DictionaryController extends BaseCrudController { + @Override + protected Page createPage() throws Exception { + Page page = super.createPage(); + page.addHeader("名称", "dictName"); + page.addHeader("编码", "dictCode"); + page.addButton(Buttons.defaultButtonsWithMore()); + page.addActions(Buttons.defaultActions()); + return page; + } + + @Override + protected DialogView createDialogView() { + DialogView view = new DialogView(); + view.addEditField("名称", "dictName").addRule("required"); + view.addEditField("编码", "dictCode").addRule("required"); + return view; + } } From b8da55cd5f406e36146f610d0253e881a8be54ae Mon Sep 17 00:00:00 2001 From: yiumankam <415481084@qq.com> Date: Tue, 12 Jan 2021 14:34:18 +0800 Subject: [PATCH 002/178] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=88=9B=E8=A1=A8sql?= =?UTF-8?q?=EF=BC=8C=E5=A4=84=E7=90=86issue#8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../captcha/Base64CaptchaProcessor.java | 2 +- sql/citrus_sys.sql | 34 ++++++++----------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/captcha/Base64CaptchaProcessor.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/captcha/Base64CaptchaProcessor.java index 352ea783..bffba4e0 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/captcha/Base64CaptchaProcessor.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/captcha/Base64CaptchaProcessor.java @@ -18,7 +18,7 @@ */ public class Base64CaptchaProcessor extends CaptchaProcessor { - private ObjectMapper objectMapper = new ObjectMapper(); + private final ObjectMapper objectMapper = new ObjectMapper(); public Base64CaptchaProcessor(VerificationRepository verificationRepository, VerifyProperties verifyProperties) { super(verificationRepository, verifyProperties); diff --git a/sql/citrus_sys.sql b/sql/citrus_sys.sql index d109015b..96ce9848 100644 --- a/sql/citrus_sys.sql +++ b/sql/citrus_sys.sql @@ -18,8 +18,8 @@ CREATE TABLE `sys_user` `admin` int(1) DEFAULT 0 COMMENT '是否管理员', `avatar` mediumtext DEFAULT NULL COMMENT '头像', `status` bigint DEFAULT NULL COMMENT '状态', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建人', + `created_time` datetime DEFAULT NULL COMMENT '创建时间', + `created_by` bigint(20) DEFAULT NULL COMMENT '创建人', `last_modified_time` datetime DEFAULT NULL COMMENT '最后的更新时间', `last_modified_by` bigint(20) DEFAULT NULL COMMENT '最后的更新人', `version` int(11) DEFAULT 0 COMMENT '乐观锁', @@ -49,7 +49,7 @@ CREATE TABLE `sys_role` `parent_id` bigint(20) DEFAULT NULL COMMENT '主键id', `type` int NOT NULL COMMENT '主键id', `role_name` varchar(45) DEFAULT NULL COMMENT '名字', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `created_time` datetime DEFAULT NULL COMMENT '创建时间', `create_by` bigint(20) DEFAULT NULL COMMENT '创建人', `last_modified_time` datetime DEFAULT NULL COMMENT '最后的更新时间', `last_modified_by` bigint(20) DEFAULT NULL COMMENT '最后的更新人', @@ -76,8 +76,8 @@ CREATE TABLE `sys_resource` `path` varchar(2000) DEFAULT NULL COMMENT '资源路径', `operation` varchar(100) DEFAULT NULL COMMENT '操作类型', `resource_code` varchar(100) DEFAULT NULL COMMENT '资源代码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建人', + `created_time` datetime DEFAULT NULL COMMENT '创建时间', + `created_by` bigint(20) DEFAULT NULL COMMENT '创建人', `last_modified_time` datetime DEFAULT NULL COMMENT '最后的更新时间', `last_modified_by` bigint(20) DEFAULT NULL COMMENT '最后的更新人', `hidden` int DEFAULT 0 COMMENT '是否隐藏', @@ -101,8 +101,8 @@ CREATE TABLE `sys_organ` `parent_id` bigint(20) NOT NULL NULL COMMENT '父ID', `left_value` int(7) NOT NULL COMMENT '左值', `right_value` int(7) NOT NULL COMMENT '右值', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建人', + `created_time` datetime DEFAULT NULL COMMENT '创建时间', + `created_by` bigint(20) DEFAULT NULL COMMENT '创建人', `last_modified_time` datetime DEFAULT NULL COMMENT '最后的更新时间', `last_modified_by` bigint(20) DEFAULT NULL COMMENT '最后的更新人', `remark` varchar(1000) DEFAULT NULL COMMENT '最后的更新人', @@ -170,8 +170,8 @@ CREATE TABLE `sys_authority` `authority_id` bigint(20) NOT NULL COMMENT '主键id', `authority_name` varchar(50) DEFAULT NULL COMMENT '权限名字', `remark` varchar(2000) DEFAULT NULL COMMENT '权限名字', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `create_by` bigint(20) DEFAULT NULL COMMENT '创建人', + `created_time` datetime DEFAULT NULL COMMENT '创建时间', + `created_by` bigint(20) DEFAULT NULL COMMENT '创建人', `last_modified_time` datetime DEFAULT NULL COMMENT '最后的更新时间', `last_modified_by` bigint(20) DEFAULT NULL COMMENT '最后的更新人', PRIMARY KEY (`authority_id`) USING BTREE @@ -193,7 +193,7 @@ CREATE TABLE `sys_auth_resource` `scope_id` bigint(20) COMMENT '数据范围ID', `object_id` bigint(20) COMMENT '关联的对象,如果资源类型为"操作",即关联的对象为该"操作对应的资源ID 例如 菜单与新增、删除等操作,此实体中的resourceId为操作类型的ID,即此objectId为此操作对应的菜单', `type` int(2) COMMENT '资源类型,菜单为0;操作为2', - `id` varchar(1000) COMMENT '逻辑ID' + `id` varchar(1000) COMMENT '逻辑ID', PRIMARY KEY (`authority_id`, `resource_id`) USING BTREE ) ENGINE = InnoDB DEFAULT CHARSET = utf8 @@ -207,7 +207,7 @@ CREATE TABLE `sys_user_role` ( `user_id` bigint(20) NOT NULL COMMENT '用户ID', `organ_id` bigint(20) NOT NULL COMMENT '组织ID', - `id` varchar(1000) COMMENT '逻辑ID' + `id` varchar(1000) COMMENT '逻辑ID', PRIMARY KEY (`user_id`, `organ_id`) USING BTREE ) ENGINE = InnoDB DEFAULT CHARSET = utf8 @@ -222,7 +222,7 @@ CREATE TABLE `sys_user_role` `user_id` bigint(20) NOT NULL COMMENT '用户ID', `role_id` bigint(20) NOT NULL COMMENT '角色ID', `organ_id` bigint(20) NOT NULL COMMENT '组织ID', - `id` varchar(1000) COMMENT '逻辑ID' + `id` varchar(1000) COMMENT '逻辑ID', PRIMARY KEY (`user_id`, `role_id`, `organ_id`) USING BTREE ) ENGINE = InnoDB DEFAULT CHARSET = utf8 @@ -236,7 +236,7 @@ CREATE TABLE `sys_role_auth` ( `role_id` bigint(20) NOT NULL COMMENT '角色ID', `authority_id` bigint(20) NOT NULL COMMENT '权限ID', - `id` varchar(1000) COMMENT '逻辑ID' + `id` varchar(1000) COMMENT '逻辑ID', PRIMARY KEY (`role_id`, `authority_id`) USING BTREE ) ENGINE = InnoDB DEFAULT CHARSET = utf8 @@ -274,16 +274,10 @@ CREATE TABLE `sys_access_log` `resource_id` varchar(1000) DEFAULT NULL COMMENT '资源ID', `resource_name` varchar(1000) DEFAULT NULL COMMENT '资源名', `resource_type` int DEFAULT NULL COMMENT '资源类型', - `create_time` datetime NOT NULL COMMENT '访问时间', + `created_time` datetime NOT NULL COMMENT '访问时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB DEFAULT CHARSET = utf8 ROW_FORMAT = DYNAMIC COMMENT ='访问日志表'; -- ---------------------------- - - - - - - From 36e7e7fdb548ce0dbd44114135f405eed6f59d44 Mon Sep 17 00:00:00 2001 From: yiumankam <415481084@qq.com> Date: Thu, 14 Jan 2021 18:55:07 +0800 Subject: [PATCH 003/178] =?UTF-8?q?=E4=BF=AE=E6=94=B9sql=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/citrus_sys.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/citrus_sys.sql b/sql/citrus_sys.sql index 96ce9848..a403b9da 100644 --- a/sql/citrus_sys.sql +++ b/sql/citrus_sys.sql @@ -46,8 +46,8 @@ DROP TABLE IF EXISTS `sys_role`; CREATE TABLE `sys_role` ( `role_id` bigint(20) NOT NULL COMMENT '主键id', - `parent_id` bigint(20) DEFAULT NULL COMMENT '主键id', - `type` int NOT NULL COMMENT '主键id', + `parent_id` bigint(20) DEFAULT NULL COMMENT '父角色ID', + `type` int NOT NULL COMMENT '类型 0:角色 1:角色组', `role_name` varchar(45) DEFAULT NULL COMMENT '名字', `created_time` datetime DEFAULT NULL COMMENT '创建时间', `create_by` bigint(20) DEFAULT NULL COMMENT '创建人', From 6a16eed7d133961224fe87e5740a6cd621cb439f Mon Sep 17 00:00:00 2001 From: yiumankam <415481084@qq.com> Date: Wed, 20 Jan 2021 17:23:33 +0800 Subject: [PATCH 004/178] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E8=80=A6=E8=AF=B7=E6=B1=82=E5=88=86=E9=A1=B5?= =?UTF-8?q?=E4=B8=8E=E8=A7=86=E5=9B=BE=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../starter/CitrusAutoConfiguration.java | 72 +---- .../SystemDefaultBeanConfiguration.java | 71 +++++ .../citrus/datasource/DynamicController.java | 2 +- .../workflow/LeaveWorkflowController.java | 27 +- .../parser/DeptCandidateParserImpl.java | 2 +- .../parser/RoleCandidateParserImpl.java | 6 +- .../parser/UserCandidateParserImpl.java | 2 +- .../src/main/resources/application.yml | 2 +- .../citrus/starter/PasswordEncoderTests.java | 1 - .../authenticate/AuthenticateController.java | 2 +- .../AuthenticateExceptionHandler.java | 1 - .../authenticate/AuthenticateService.java | 1 + .../authenticate/NoPermissionException.java | 5 +- .../citrus/security/authorize/Authorize.java | 8 +- .../yiuman/citrus/security/jwt/JwtToken.java | 1 - .../citrus/security/verify/Verification.java | 3 + .../verify/VerificationGenerator.java | 1 + .../verify/captcha/CaptchaGenerator.java | 2 +- .../citrus/support/crud/EnumArrayHandler.java | 2 +- .../support/crud/rest/BaseCrudRestful.java | 27 +- .../crud/rest/BaseQueryController.java | 2 +- .../support/crud/rest/BaseQueryRestful.java | 49 ++-- .../support/crud/rest/BaseTreeController.java | 31 ++- .../crud/service/DeletableService.java | 1 + .../crud/service/EntityTypeService.java | 1 + .../support/crud/view/ActionableView.java | 42 +++ .../support/crud/view/CheckboxTableView.java | 13 + .../support/crud/view/EditableView.java | 14 + .../support/crud/view/RecordExtender.java | 14 + .../citrus/support/crud/view/TableView.java | 16 ++ .../citrus/support/crud/view/TreeView.java | 55 ++++ .../yiuman/citrus/support/crud/view/View.java | 8 + .../crud/view/impl/BaseActionableView.java | 118 +++++++++ .../{model => crud/view/impl}/DialogView.java | 4 +- .../support/crud/view/impl/PageTableView.java | 34 +++ .../support/crud/view/impl/PageTreeView.java | 36 +++ .../crud/view/impl/SimpleTableView.java | 95 +++++++ .../view/impl/SimpleTreeView.java} | 35 +-- ...ynamicDataSourceAnnotationInterceptor.java | 3 +- .../support/exception/RestException.java | 3 +- .../http/JsonServletRequestWrapper.java | 4 +- .../inject/TargetAnnotationInjector.java | 1 + .../yiuman/citrus/support/model/BaseTree.java | 5 +- .../yiuman/citrus/support/model/Button.java | 1 - .../citrus/support/model/FieldFunction.java | 2 +- .../yiuman/citrus/support/model/Header.java | 81 +----- .../yiuman/citrus/support/model/Page.java | 247 +++--------------- .../yiuman/citrus/support/model/Tree.java | 1 - .../yiuman/citrus/support/utils/Buttons.java | 2 +- .../citrus/support/utils/CrudUtils.java | 10 +- .../yiuman/citrus/support/utils/WebUtils.java | 27 +- .../authticate/PageAuthenticateAdvice.java | 47 ++-- .../PasswordAuthenticateServiceImpl.java | 3 +- .../citrus/system/entity/DictionaryItem.java | 1 + .../yiuman/citrus/system/entity/Resource.java | 2 +- .../citrus/system/entity/RoleAuthority.java | 2 +- .../citrus/system/entity/UserOrgan.java | 2 +- .../yiuman/citrus/system/entity/UserRole.java | 3 +- .../citrus/system/hook/HasLoginHook.java | 2 +- .../system/mapper/ScopeDefineMapper.java | 2 +- .../system/rest/AccessLogController.java | 21 +- .../system/rest/AuthorityController.java | 20 +- .../system/rest/DictionaryController.java | 20 +- .../citrus/system/rest/MenuController.java | 21 +- .../citrus/system/rest/OrganController.java | 24 +- .../system/rest/ResourceController.java | 25 +- .../citrus/system/rest/RoleController.java | 24 +- .../citrus/system/rest/ScopeController.java | 20 +- .../citrus/system/rest/UserController.java | 30 +-- .../system/service/RbacMixinService.java | 1 - .../system/service/ResourceService.java | 2 +- .../citrus/system/service/RoleService.java | 2 +- .../citrus/system/service/UserService.java | 2 +- .../workflow/model/ProcessPersonalModel.java | 1 - .../workflow/resolver/CandidateParser.java | 2 +- .../impl/TaskCandidateResolverImpl.java | 3 +- .../workflow/rest/DeploymentController.java | 20 +- 77 files changed, 878 insertions(+), 617 deletions(-) create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/ActionableView.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/CheckboxTableView.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/EditableView.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/RecordExtender.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/TableView.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/TreeView.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/View.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/impl/BaseActionableView.java rename citrus-support/src/main/java/com/github/yiuman/citrus/support/{model => crud/view/impl}/DialogView.java (95%) create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/impl/PageTableView.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/impl/PageTreeView.java create mode 100644 citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/impl/SimpleTableView.java rename citrus-support/src/main/java/com/github/yiuman/citrus/support/{model/TreeDisplay.java => crud/view/impl/SimpleTreeView.java} (84%) diff --git a/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/CitrusAutoConfiguration.java b/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/CitrusAutoConfiguration.java index 2169d48d..49616a96 100644 --- a/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/CitrusAutoConfiguration.java +++ b/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/CitrusAutoConfiguration.java @@ -2,18 +2,7 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.github.yiuman.citrus.security.authenticate.AuthenticateProcessor; -import com.github.yiuman.citrus.security.authenticate.AuthenticateProcessorImpl; -import com.github.yiuman.citrus.security.authenticate.AuthenticateService; import com.github.yiuman.citrus.security.authorize.AuthorizeConfigManager; -import com.github.yiuman.citrus.security.authorize.AuthorizeConfigProvider; -import com.github.yiuman.citrus.security.jwt.JwtAccessDeniedHandler; -import com.github.yiuman.citrus.security.jwt.JwtAuthenticationEntryPoint; -import com.github.yiuman.citrus.security.jwt.JwtAuthenticationFilter; import com.github.yiuman.citrus.security.jwt.JwtSecurityConfigurerAdapter; import com.github.yiuman.citrus.security.properties.CitrusProperties; import lombok.extern.slf4j.Slf4j; @@ -26,9 +15,13 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.ComponentScans; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -37,19 +30,17 @@ import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.access.AccessDeniedHandler; -import java.util.List; - /** * 自动配置 * * @author yiuman * @date 2020/3/22 */ -@Configuration -@EnableConfigurationProperties(CitrusProperties.class) +@Configuration(proxyBeanMethods = false) @ConditionalOnClass(WebSecurityConfigurerAdapter.class) @ConditionalOnMissingBean(WebSecurityConfigurerAdapter.class) -@AutoConfigureBefore(MybatisPlusAutoConfiguration.class) +@EnableConfigurationProperties(CitrusProperties.class) +@AutoConfigureBefore({MybatisPlusAutoConfiguration.class, JacksonAutoConfiguration.class}) @AutoConfigureAfter({DataSourceAutoConfiguration.class, MybatisPlusLanguageDriverAutoConfiguration.class}) @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @ComponentScans({ @@ -68,7 +59,7 @@ public class CitrusAutoConfiguration { */ @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) - public static class StatelessSecurityConfiguration extends WebSecurityConfigurerAdapter { + public static class SecurityConfiguration extends WebSecurityConfigurerAdapter { private final AuthenticationEntryPoint authenticationEntryPoint; @@ -84,7 +75,7 @@ public static class StatelessSecurityConfiguration extends WebSecurityConfigurer */ private final AuthorizeConfigManager authorizeConfigManager; - public StatelessSecurityConfiguration(AuthenticationEntryPoint authenticationEntryPoint, JwtSecurityConfigurerAdapter jwtSecurityConfigurerAdapter, AuthorizeConfigManager authorizeConfigManager, AccessDeniedHandler accessDeniedHandler) { + public SecurityConfiguration(AuthenticationEntryPoint authenticationEntryPoint, JwtSecurityConfigurerAdapter jwtSecurityConfigurerAdapter, AuthorizeConfigManager authorizeConfigManager, AccessDeniedHandler accessDeniedHandler) { this.authenticationEntryPoint = authenticationEntryPoint; this.jwtSecurityConfigurerAdapter = jwtSecurityConfigurerAdapter; this.authorizeConfigManager = authorizeConfigManager; @@ -113,49 +104,6 @@ protected void configure(HttpSecurity http) throws Exception { } - @Bean - @ConditionalOnMissingBean(ObjectMapper.class) - public ObjectMapper objectMapper() { - ObjectMapper objectMapper = new ObjectMapper(); - //用于解决java.time 模块的时间序列化为json时变成数组的问题 - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - return objectMapper; - - } - - @Bean - @ConditionalOnMissingBean(AuthenticationEntryPoint.class) - public AuthenticationEntryPoint entryPoint() { - return new JwtAuthenticationEntryPoint(objectMapper()); - } - - @Bean - @ConditionalOnMissingBean(AccessDeniedHandler.class) - public AccessDeniedHandler accessDeniedHandler() { - return new JwtAccessDeniedHandler(objectMapper()); - } - - @Bean - @ConditionalOnMissingBean(AuthenticateProcessor.class) - public AuthenticateProcessor authenticateProcessor(List authenticateServices) { - return new AuthenticateProcessorImpl(authenticateServices); - } - - @Bean - @ConditionalOnMissingBean(JwtSecurityConfigurerAdapter.class) - public JwtSecurityConfigurerAdapter jwtSecurityConfigurerAdapter(AuthenticateProcessor authenticateProcessor) { - return new JwtSecurityConfigurerAdapter(new JwtAuthenticationFilter(authenticateProcessor)); - } - - - @Bean - @ConditionalOnMissingBean(AuthorizeConfigManager.class) - public AuthorizeConfigManager authorizeConfigManager(List authorizeConfigProviders) { - return new AuthorizeConfigManager(authorizeConfigProviders); - - } @Configuration @Import(MybatisPlusAutoConfiguration.AutoConfiguredMapperScannerRegistrar.class) diff --git a/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/SystemDefaultBeanConfiguration.java b/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/SystemDefaultBeanConfiguration.java index 5078ce95..be4d4692 100644 --- a/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/SystemDefaultBeanConfiguration.java +++ b/citrus-boot-starter/src/main/java/com/github/yiuman/citrus/starter/SystemDefaultBeanConfiguration.java @@ -3,13 +3,32 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.github.yiuman.citrus.security.authenticate.AuthenticateProcessor; +import com.github.yiuman.citrus.security.authenticate.AuthenticateProcessorImpl; +import com.github.yiuman.citrus.security.authenticate.AuthenticateService; +import com.github.yiuman.citrus.security.authorize.AuthorizeConfigManager; +import com.github.yiuman.citrus.security.authorize.AuthorizeConfigProvider; +import com.github.yiuman.citrus.security.jwt.JwtAccessDeniedHandler; +import com.github.yiuman.citrus.security.jwt.JwtAuthenticationEntryPoint; +import com.github.yiuman.citrus.security.jwt.JwtAuthenticationFilter; +import com.github.yiuman.citrus.security.jwt.JwtSecurityConfigurerAdapter; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.access.AccessDeniedHandler; + +import java.util.List; /** * 系统默认实例配置 @@ -20,6 +39,58 @@ @Configuration public class SystemDefaultBeanConfiguration { + @Bean + @Primary + @ConditionalOnMissingBean(ObjectMapper.class) + public ObjectMapper jacksonObjectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + //用于解决java.time 模块的时间序列化为json时变成数组的问题 + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS); + return objectMapper; + + } + + @Bean + @ConditionalOnMissingBean(AuthenticationEntryPoint.class) + public AuthenticationEntryPoint entryPoint() { + return new JwtAuthenticationEntryPoint(jacksonObjectMapper()); + } + + @Bean + @ConditionalOnMissingBean(AccessDeniedHandler.class) + public AccessDeniedHandler accessDeniedHandler() { + return new JwtAccessDeniedHandler(jacksonObjectMapper()); + } + + @Bean + @ConditionalOnMissingBean(AuthenticateProcessor.class) + public AuthenticateProcessor authenticateProcessor(List authenticateServices) { + return new AuthenticateProcessorImpl(authenticateServices); + } + + @Bean + @ConditionalOnMissingBean(JwtSecurityConfigurerAdapter.class) + public JwtSecurityConfigurerAdapter jwtSecurityConfigurerAdapter(AuthenticateProcessor authenticateProcessor) { + return new JwtSecurityConfigurerAdapter(new JwtAuthenticationFilter(authenticateProcessor)); + } + + + /** + * 创建授权配置管理器 + * + * @param authorizeConfigProviders Spring Security授权配置提供者集合 + * @return 授权配置管理器 + */ + @Bean + @ConditionalOnMissingBean(AuthorizeConfigManager.class) + public AuthorizeConfigManager authorizeConfigManager(List authorizeConfigProviders) { + return new AuthorizeConfigManager(authorizeConfigProviders); + + } + /** * 默认加密 */ diff --git a/citrus-main/src/main/java/com/github/yiuman/citrus/datasource/DynamicController.java b/citrus-main/src/main/java/com/github/yiuman/citrus/datasource/DynamicController.java index b6d6de73..7036e6ab 100644 --- a/citrus-main/src/main/java/com/github/yiuman/citrus/datasource/DynamicController.java +++ b/citrus-main/src/main/java/com/github/yiuman/citrus/datasource/DynamicController.java @@ -30,7 +30,7 @@ public void testTransactional() { // dictionaryMapperTwo.saveEntity(dictionary2); - int error = 1/0; + int error = 1 / 0; Dictionary dictionary = new Dictionary(); dictionary.setDictCode("123123"); diff --git a/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/LeaveWorkflowController.java b/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/LeaveWorkflowController.java index a0ab285f..7b55d020 100644 --- a/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/LeaveWorkflowController.java +++ b/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/LeaveWorkflowController.java @@ -1,7 +1,7 @@ package com.github.yiuman.citrus.workflow; -import com.github.yiuman.citrus.support.model.DialogView; -import com.github.yiuman.citrus.support.model.Page; +import com.github.yiuman.citrus.support.crud.view.impl.DialogView; +import com.github.yiuman.citrus.support.crud.view.impl.PageTableView; import com.github.yiuman.citrus.support.utils.Buttons; import com.github.yiuman.citrus.support.widget.Inputs; import com.github.yiuman.citrus.system.service.UserService; @@ -36,21 +36,22 @@ protected EntityCrudWorkflowService getProcessService() { @Override - protected Page createPage() throws Exception { - Page page = super.createPage(); - page.addHeader("ID", "leaveId"); - page.addHeader("请假天数", "leaveDay"); - page.addHeader("申请人", "username", entity -> userService.get(entity.getUserId()).getUsername()); - page.addHeader("流程ID", "processInstanceId"); - page.addButton(Buttons.defaultButtonsWithMore()); - page.addActions(Buttons.defaultActions()); - return page; + protected Object createView() { + PageTableView view = new PageTableView<>(); + view.addHeader("ID", "leaveId"); + view.addHeader("请假天数", "leaveDay"); + view.addHeader("申请人", "username", entity -> userService.get(entity.getUserId()).getUsername()); + view.addHeader("流程ID", "processInstanceId"); + view.addButton(Buttons.defaultButtonsWithMore()); + view.addAction(Buttons.defaultActions()); + return view; } @Override - protected DialogView createDialogView() { + protected Object createEditableView() throws Exception { DialogView view = new DialogView(); - view.addEditField(new Inputs("请假天数","leaveDay").type("number")).addRule("required"); + view.addEditField(new Inputs("请假天数", "leaveDay").type("number")).addRule("required"); return view; } + } diff --git a/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/DeptCandidateParserImpl.java b/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/DeptCandidateParserImpl.java index 8ca92df4..e9f2a7b9 100644 --- a/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/DeptCandidateParserImpl.java +++ b/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/DeptCandidateParserImpl.java @@ -33,7 +33,7 @@ public boolean support(String dimension) { } @Override - public List parse(WorkflowContext workflowContext,T candidateModel) { + public List parse(WorkflowContext workflowContext, T candidateModel) { List deptIds = candidateModel.getValues().stream() .map(Long::valueOf) .collect(Collectors.toList()); diff --git a/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/RoleCandidateParserImpl.java b/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/RoleCandidateParserImpl.java index 9e2653ba..c9a149a4 100644 --- a/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/RoleCandidateParserImpl.java +++ b/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/RoleCandidateParserImpl.java @@ -34,11 +34,11 @@ public boolean support(String dimension) { } @Override - public List parse(WorkflowContext workflowContext,T candidateModel) { + public List parse(WorkflowContext workflowContext, T candidateModel) { List roleIds = candidateModel.getValues(); List usersByRoleIds = userService.getUsersByRoleIds( - roleIds.parallelStream().map(Long::valueOf).collect(Collectors.toList()) - ); + roleIds.parallelStream().map(Long::valueOf).collect(Collectors.toList()) + ); if (CollectionUtils.isEmpty(usersByRoleIds)) { return null; diff --git a/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/UserCandidateParserImpl.java b/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/UserCandidateParserImpl.java index 0e42f6d2..f5ba0a86 100644 --- a/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/UserCandidateParserImpl.java +++ b/citrus-main/src/main/java/com/github/yiuman/citrus/workflow/parser/UserCandidateParserImpl.java @@ -34,7 +34,7 @@ public boolean support(String dimension) { } @Override - public List parse(WorkflowContext workflowContext,T candidateModel) { + public List parse(WorkflowContext workflowContext, T candidateModel) { List userIds = candidateModel.getValues().stream().map(Long::valueOf).collect(Collectors.toList()); List userDtos = userService.list(Wrappers.query().in("user_id", userIds)); if (CollectionUtils.isEmpty(userDtos)) { diff --git a/citrus-main/src/main/resources/application.yml b/citrus-main/src/main/resources/application.yml index 1a60b371..445dfd29 100644 --- a/citrus-main/src/main/resources/application.yml +++ b/citrus-main/src/main/resources/application.yml @@ -10,7 +10,7 @@ spring: url: jdbc:mysql://42.192.95.146:3306/citrus?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8 username: root password: yiuman -# enable-multiple-tx: false + # enable-multiple-tx: false activiti: db-history-used: true history-level: audit diff --git a/citrus-main/src/test/java/com/github/yiuman/citrus/starter/PasswordEncoderTests.java b/citrus-main/src/test/java/com/github/yiuman/citrus/starter/PasswordEncoderTests.java index 06dc303d..1390a1f2 100644 --- a/citrus-main/src/test/java/com/github/yiuman/citrus/starter/PasswordEncoderTests.java +++ b/citrus-main/src/test/java/com/github/yiuman/citrus/starter/PasswordEncoderTests.java @@ -1,6 +1,5 @@ package com.github.yiuman.citrus.starter; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateController.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateController.java index bd36036e..da13886c 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateController.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateController.java @@ -49,7 +49,7 @@ static class ExceptionAdvice { * 异常处理 */ - @ExceptionHandler(value = {AuthenticationException.class,VerificationException.class}) + @ExceptionHandler(value = {AuthenticationException.class, VerificationException.class}) @ResponseBody public ResponseEntity exceptionHandler(AuthenticationException e) { log.error(e.getMessage(), e); diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateExceptionHandler.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateExceptionHandler.java index 55ddb19c..db6ece83 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateExceptionHandler.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateExceptionHandler.java @@ -1,6 +1,5 @@ package com.github.yiuman.citrus.security.authenticate; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.yiuman.citrus.support.http.ResponseEntity; import com.github.yiuman.citrus.support.http.ResponseStatusCode; import lombok.extern.slf4j.Slf4j; diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateService.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateService.java index 70fb7591..b4cd2a1a 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateService.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/AuthenticateService.java @@ -42,6 +42,7 @@ public interface AuthenticateService { /** * 支持的认证模式,与请求的参数mode对应,表示支持的授权模式 + * * @return 认证模式字符串 如密码模式 "password" */ String supportMode(); diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/NoPermissionException.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/NoPermissionException.java index 770c3939..67136842 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/NoPermissionException.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authenticate/NoPermissionException.java @@ -4,12 +4,13 @@ /** * 没权限异常 + * * @author yiuman * @date 2020/4/4 */ public class NoPermissionException extends AuthenticationException { - private final static String DEFAULT_MESSAGE= "No permission"; + private final static String DEFAULT_MESSAGE = "No permission"; public NoPermissionException(String msg, Throwable t) { super(msg, t); @@ -19,7 +20,7 @@ public NoPermissionException(String msg) { super(msg); } - public NoPermissionException(){ + public NoPermissionException() { super(DEFAULT_MESSAGE); } } diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authorize/Authorize.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authorize/Authorize.java index 72a120d3..bfaac382 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/authorize/Authorize.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/authorize/Authorize.java @@ -1,13 +1,17 @@ package com.github.yiuman.citrus.security.authorize; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; /** * 鉴权注解,AOP自定义校验 + * * @author yiuman * @date 2020/4/4 */ -@Target({ElementType.METHOD,ElementType.TYPE}) +@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Authorize { diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/jwt/JwtToken.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/jwt/JwtToken.java index a4b37b14..35485816 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/jwt/JwtToken.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/jwt/JwtToken.java @@ -1,6 +1,5 @@ package com.github.yiuman.citrus.security.jwt; -import lombok.Builder; import lombok.Data; import java.util.Map; diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/Verification.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/Verification.java index b884e944..e2ceab1a 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/Verification.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/Verification.java @@ -12,18 +12,21 @@ public interface Verification { /** * 获取验证码对象 + * * @return 获取验证实体值 */ T getValue(); /** * 验证码类型 + * * @return 验证码类型标识字符串 如验证码为"captcha" */ String getVerificationType(); /** * 有效时间(单位秒) + * * @return 有效的验证时间 */ LocalDateTime validTimeInSeconds(); diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/VerificationGenerator.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/VerificationGenerator.java index 3a88dbf7..939a2ca5 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/VerificationGenerator.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/VerificationGenerator.java @@ -12,6 +12,7 @@ public interface VerificationGenerator> { /** * 根据当前请求构造验证信息 + * * @param httpServletRequest 当前请求 * @return 验证信息实体 如验证码 */ diff --git a/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/captcha/CaptchaGenerator.java b/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/captcha/CaptchaGenerator.java index 6ff9027f..7f07c63c 100644 --- a/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/captcha/CaptchaGenerator.java +++ b/citrus-security/src/main/java/com/github/yiuman/citrus/security/verify/captcha/CaptchaGenerator.java @@ -1,8 +1,8 @@ package com.github.yiuman.citrus.security.verify.captcha; +import com.github.yiuman.citrus.security.verify.VerificationGenerator; import com.github.yiuman.citrus.security.verify.VerifyProperties; import com.github.yiuman.citrus.security.verify.VerifyUtils; -import com.github.yiuman.citrus.security.verify.VerificationGenerator; import javax.servlet.http.HttpServletRequest; diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/EnumArrayHandler.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/EnumArrayHandler.java index c1c6c586..9ee0826f 100644 --- a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/EnumArrayHandler.java +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/EnumArrayHandler.java @@ -78,7 +78,7 @@ private E[] getEnumArray(int value) { } } - if (containsOneChar==0) { + if (containsOneChar == 0) { return null; } diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseCrudRestful.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseCrudRestful.java index 4a88d8ab..94cc43d0 100644 --- a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseCrudRestful.java +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseCrudRestful.java @@ -1,14 +1,18 @@ package com.github.yiuman.citrus.support.crud.rest; import com.github.yiuman.citrus.support.crud.CrudReadDataListener; -import com.github.yiuman.citrus.support.model.DialogView; +import com.github.yiuman.citrus.support.crud.view.EditableView; +import com.github.yiuman.citrus.support.crud.view.impl.DialogView; +import com.github.yiuman.citrus.support.crud.view.impl.PageTableView; import com.github.yiuman.citrus.support.model.EditField; import com.github.yiuman.citrus.support.model.Page; +import com.github.yiuman.citrus.support.utils.CrudUtils; import com.github.yiuman.citrus.support.utils.WebUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.util.ReflectionUtils; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -29,9 +33,22 @@ public abstract class BaseCrudRestful extends BaseQue * @throws Exception 反射、数据库操作等异常 */ @Override - protected Page createPage() throws Exception { - Page page = super.createPage(); - page.setDialogView(createDialogView()); + protected Object createView() throws Exception { + PageTableView view = new PageTableView<>(); + //构造页面小部件 + CrudUtils.getCrudWidgets(this).forEach(widget -> view.addWidget(widget, true)); + //构造默认表头 + ReflectionUtils.doWithFields(modelClass, field -> view.addHeader(field.getName(), field.getName())); + return view; + } + + @Override + public Page page(HttpServletRequest request) throws Exception { + Page page = super.page(request); + Object view = page.getView(); + if (view instanceof EditableView) { + ((EditableView) view).setEditableView(createEditableView()); + } return page; } @@ -41,7 +58,7 @@ protected Page createPage() throws Exception { * @return 对话框视图 * @throws Exception 反射等操作异常 */ - protected DialogView createDialogView() throws Exception { + protected Object createEditableView() throws Exception { List editFields = new ArrayList<>(); ReflectionUtils.doWithFields(modelClass, field -> editFields.add(new EditField(field.getName(), field.getName()))); return new DialogView(editFields); diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseQueryController.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseQueryController.java index 9593f964..332c11ee 100644 --- a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseQueryController.java +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseQueryController.java @@ -22,7 +22,7 @@ public abstract class BaseQueryController extends Bas @SuppressWarnings("unchecked") @GetMapping public ResponseEntity> getPageList(HttpServletRequest request) throws Exception { - BaseQueryController currentProxy = Optional.ofNullable((BaseQueryController) AopContext.currentProxy()).orElse(this); + BaseQueryController currentProxy = Optional.ofNullable((BaseQueryController) AopContext.currentProxy()).orElse(this); return ResponseEntity.ok(currentProxy.page(request)); } diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseQueryRestful.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseQueryRestful.java index 91ea2e48..823ed344 100644 --- a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseQueryRestful.java +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseQueryRestful.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.yiuman.citrus.support.crud.query.QueryParam; import com.github.yiuman.citrus.support.crud.query.QueryParamHandler; +import com.github.yiuman.citrus.support.crud.view.impl.SimpleTableView; import com.github.yiuman.citrus.support.exception.ValidateException; import com.github.yiuman.citrus.support.inject.InjectAnnotationParserHolder; import com.github.yiuman.citrus.support.model.Page; @@ -12,7 +13,6 @@ import com.github.yiuman.citrus.support.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; -import org.springframework.util.CollectionUtils; import org.springframework.util.ReflectionUtils; import javax.servlet.http.HttpServletRequest; @@ -49,35 +49,30 @@ protected void setParamClass(Class paramClass) { this.paramClass = paramClass; } - /** * 创建列表分页页面 * * @return 分页页面对象 - * @throws Exception 反射、数据库操作等异常 + * @throws Exception 反射等异常 */ - protected Page createPage() throws Exception { - Page page = new Page<>(); + protected Object createView() throws Exception { + SimpleTableView view = new SimpleTableView<>(); //构造页面小部件 - CrudUtils.getCrudWidgets(this) - .forEach(widget -> page.addWidget(widget, true)); - return page; + CrudUtils.getCrudWidgets(this).forEach(widget -> view.addWidget(widget, true)); + //构造默认表头 + ReflectionUtils.doWithFields(modelClass, field -> view.addHeader(field.getName(), field.getName())); + return view; } @Override public Page page(HttpServletRequest request) throws Exception { - //获取pageNo - Page page = createPage(); - //添加默表头 - if (CollectionUtils.isEmpty(page.getHeaders())) { - ReflectionUtils.doWithFields(modelClass, field -> page.addHeader(field.getName(), field.getName())); - } - - //绑定页面参数 - WebUtils.requestDataBind(page, request); QueryWrapper queryWrapper = Optional.ofNullable(getQueryWrapper(request)).orElse(Wrappers.query()); handleSortWrapper(queryWrapper, request); + //获取pageNo + Page page = new Page<>(); + //绑定页面参数 + WebUtils.requestDataBind(page, request); //这里需要调用了page方法查询后再进行设置ItemKey,原因是Service中的mapper为动态注入,调用查询才会初始化mapper构造表信息 Page realPage = selectPage(page, queryWrapper); @@ -85,7 +80,8 @@ public Page page(HttpServletRequest request) throws Exception { realPage.setItemKey(getService().getKeyProperty()); } - realPage.beforeShow(); + realPage.setView(createView()); + return realPage; } @@ -114,14 +110,16 @@ public void exp(HttpServletRequest request, HttpServletResponse response) throws QueryWrapper queryWrapper = Optional.ofNullable(getQueryWrapper(request)).orElse(Wrappers.query()); handleSortWrapper(queryWrapper, request); - Page createPage = createPage(); - createPage.setSize(-1); - Page resultPage = selectPage(createPage, queryWrapper); - if (StringUtils.isBlank(resultPage.getItemKey())) { - resultPage.setItemKey(getService().getKeyProperty()); + Page page = new Page<>(); + + page.setSize(-1); + page = selectPage(page, queryWrapper); + if (StringUtils.isBlank(page.getItemKey())) { + page.setItemKey(getService().getKeyProperty()); } - resultPage.setItemKey(getService().getKeyProperty()); - WebUtils.exportExcel(response, resultPage, fileName); + + page.setView(createView()); + WebUtils.exportExcel(response, page, fileName); } /** @@ -212,6 +210,7 @@ protected void handleSortWrapper(QueryWrapper wrapper, HttpServletRequest req } + /** * 根据参数,处理查询wrapper * diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseTreeController.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseTreeController.java index 75f3aa08..c268feb7 100644 --- a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseTreeController.java +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/rest/BaseTreeController.java @@ -7,10 +7,12 @@ import com.github.yiuman.citrus.support.crud.service.BaseSimpleTreeService; import com.github.yiuman.citrus.support.crud.service.CrudService; import com.github.yiuman.citrus.support.crud.service.TreeCrudService; +import com.github.yiuman.citrus.support.crud.view.TreeView; +import com.github.yiuman.citrus.support.crud.view.impl.PageTreeView; +import com.github.yiuman.citrus.support.crud.view.impl.SimpleTreeView; import com.github.yiuman.citrus.support.http.ResponseEntity; import com.github.yiuman.citrus.support.model.BasePreOrderTree; import com.github.yiuman.citrus.support.model.Tree; -import com.github.yiuman.citrus.support.model.TreeDisplay; import com.github.yiuman.citrus.support.utils.CrudUtils; import com.github.yiuman.citrus.support.utils.WebUtils; import org.springframework.web.bind.annotation.GetMapping; @@ -23,6 +25,7 @@ import javax.validation.constraints.NotNull; import java.io.Serializable; import java.util.List; +import java.util.Optional; /** * 基础树结构控制器 @@ -77,27 +80,29 @@ protected CrudService getService() { * @return 树形结构的显示视图 * @throws Exception 反射异常 */ - protected TreeDisplay createTree() throws Exception { - return new TreeDisplay<>(); + protected TreeView createTreeView() throws Exception { + return null; } /** * 加载树,支持查询 */ + @SuppressWarnings("unchecked") @GetMapping(Operations.Tree.TREE) - public ResponseEntity> load(HttpServletRequest request) throws Exception { - TreeDisplay tree = this.createTree(); + public > ResponseEntity load(HttpServletRequest request) throws Exception { + TreeView treeView = Optional.ofNullable(createTreeView()).orElse(new PageTreeView<>()); QueryWrapper queryWrapper = getQueryWrapper(request); if (queryWrapper != null) { - tree.setTree(getCrudService().treeQuery(queryWrapper)); - return ResponseEntity.ok(tree); + treeView.setTree(getCrudService().treeQuery(queryWrapper)); + return (ResponseEntity) ResponseEntity.ok(treeView); + } + + treeView.setTree(getCrudService().load(isLazy)); + if (treeView instanceof PageTreeView) { + ((PageTreeView) treeView).setEditableView(createEditableView()); } - tree.setTree(getCrudService().load(isLazy)); - tree.setLazy(isLazy); - tree.setDialogView(createDialogView()); - tree.setItemKey(getService().getKeyProperty()); - return ResponseEntity.ok(tree); + return (ResponseEntity) ResponseEntity.ok(treeView); } /** @@ -133,7 +138,7 @@ public ResponseEntity reInit() throws Exception { @Override public void exp(HttpServletRequest request, HttpServletResponse response) throws Exception { - ResponseEntity> load = this.load(request); + ResponseEntity> load = this.load(request); String fileName = WebUtils.getRequestParam("fileName"); if (StringUtils.isBlank(fileName)) { fileName = String.valueOf(System.currentTimeMillis()); diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/service/DeletableService.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/service/DeletableService.java index 35bf905f..62b4d8f4 100644 --- a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/service/DeletableService.java +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/service/DeletableService.java @@ -29,6 +29,7 @@ public interface DeletableService { /** * 删除 + * * @param wrappers 删除的条件 * @return 是否删除成功true/false */ diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/service/EntityTypeService.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/service/EntityTypeService.java index 7f81beb2..9da8537e 100644 --- a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/service/EntityTypeService.java +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/service/EntityTypeService.java @@ -12,6 +12,7 @@ public interface EntityTypeService { /** * 获取实体的类型 + * * @return 实体类型Class */ @SuppressWarnings("unchecked") diff --git a/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/ActionableView.java b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/ActionableView.java new file mode 100644 index 00000000..9dbd40c0 --- /dev/null +++ b/citrus-support/src/main/java/com/github/yiuman/citrus/support/crud/view/ActionableView.java @@ -0,0 +1,42 @@ +package com.github.yiuman.citrus.support.crud.view; + +import com.github.yiuman.citrus.support.model.Button; + +import java.util.List; + +/** + * 可执行的视图 + * + * @author yiuman + * @date 2021/1/20 + */ +public interface ActionableView { + + /** + * 获取视图的控件集合 + * + * @return 组件 + */ + List getWidgets(); + + void setWidgets(List widgets); + + /** + * 获取页面的按钮集合 + * + * @return 按钮集合 + */ + List