From dac0eb6342061016439355eb49e109f1db7fdb77 Mon Sep 17 00:00:00 2001 From: Friday <1121353141@qq.com> Date: Thu, 7 Sep 2023 23:19:36 +0000 Subject: [PATCH 1/7] =?UTF-8?q?=E5=BA=94=E7=94=A8=E5=88=86=E7=BB=84?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractApplicationService.java | 1 - .../audit/event/type/AppEventType.java | 14 +++ .../employee/audit/event/type/EventType.java | 10 +- .../employee/common/entity/app/AppEntity.java | 6 -- .../entity/app/AppGroupAssociationEntity.java | 63 ++++++++++++ .../query/AppGroupAssociationListQuery.java | 55 +++++++++++ .../app/AppGroupAssociationRepository.java | 54 +++++++++++ ...pGroupAssociationRepositoryCustomized.java | 41 ++++++++ ...upAssociationRepositoryCustomizedImpl.java | 84 ++++++++++++++++ .../app/impl/AppRepositoryCustomizedImpl.java | 3 +- .../src/main/resources/db/1.1.0-changelog.xml | 32 ++++++- .../controller/app/AppGroupController.java | 59 ++++++++++++ .../console/service/app/AppGroupService.java | 32 +++++++ .../service/app/impl/AppGroupServiceImpl.java | 95 ++++++++++++++++++- .../portal/converter/AppGroupConverter.java | 25 +++-- .../portal/service/impl/AppServiceImpl.java | 24 +++-- 16 files changed, 571 insertions(+), 27 deletions(-) create mode 100644 eiam-common/src/main/java/cn/topiam/employee/common/entity/app/AppGroupAssociationEntity.java create mode 100644 eiam-common/src/main/java/cn/topiam/employee/common/entity/app/query/AppGroupAssociationListQuery.java create mode 100644 eiam-common/src/main/java/cn/topiam/employee/common/repository/app/AppGroupAssociationRepository.java create mode 100644 eiam-common/src/main/java/cn/topiam/employee/common/repository/app/AppGroupAssociationRepositoryCustomized.java create mode 100644 eiam-common/src/main/java/cn/topiam/employee/common/repository/app/impl/AppGroupAssociationRepositoryCustomizedImpl.java diff --git a/eiam-application/eiam-application-core/src/main/java/cn/topiam/employee/application/AbstractApplicationService.java b/eiam-application/eiam-application-core/src/main/java/cn/topiam/employee/application/AbstractApplicationService.java index 785faefe..afdba1d3 100644 --- a/eiam-application/eiam-application-core/src/main/java/cn/topiam/employee/application/AbstractApplicationService.java +++ b/eiam-application/eiam-application-core/src/main/java/cn/topiam/employee/application/AbstractApplicationService.java @@ -60,7 +60,6 @@ public abstract class AbstractApplicationService implements ApplicationService { AppEntity appEntity = new AppEntity(); appEntity.setName(name); appEntity.setIcon(icon); - appEntity.setGroupId(null == groupId ? 0L : groupId); appEntity.setCode(RandomStringUtils.randomAlphanumeric(32).toLowerCase()); appEntity.setTemplate(getCode()); appEntity.setType(getType()); diff --git a/eiam-audit/src/main/java/cn/topiam/employee/audit/event/type/AppEventType.java b/eiam-audit/src/main/java/cn/topiam/employee/audit/event/type/AppEventType.java index 295580f9..e0c83e44 100644 --- a/eiam-audit/src/main/java/cn/topiam/employee/audit/event/type/AppEventType.java +++ b/eiam-audit/src/main/java/cn/topiam/employee/audit/event/type/AppEventType.java @@ -182,4 +182,18 @@ public class AppEventType { public static Type DELETE_APP_GROUP = new Type("eiam:event:app_group:delete", "删除应用分组", APP_GROUP_RESOURCE, List.of(UserType.ADMIN)); + /** + * 添加应用分组关联 + */ + public static Type ADD_APP_GROUP_ASSOCIATION = new Type( + "eiam:event:add_app_group_association", "添加应用分组关联", APP_GROUP_RESOURCE, + List.of(UserType.ADMIN)); + + /** + * 移除应用分组关联 + */ + public static Type REMOVE_APP_GROUP_ASSOCIATION = new Type( + "eiam:event:remove_app_group_association", "移除应用分组关联", APP_GROUP_RESOURCE, + List.of(UserType.ADMIN)); + } diff --git a/eiam-audit/src/main/java/cn/topiam/employee/audit/event/type/EventType.java b/eiam-audit/src/main/java/cn/topiam/employee/audit/event/type/EventType.java index 092da84d..a68bc15a 100644 --- a/eiam-audit/src/main/java/cn/topiam/employee/audit/event/type/EventType.java +++ b/eiam-audit/src/main/java/cn/topiam/employee/audit/event/type/EventType.java @@ -503,7 +503,15 @@ public enum EventType { /** * 删除应用分组 */ - DELETE_APP_GROUP(AppEventType.DELETE_APP_GROUP); + DELETE_APP_GROUP(AppEventType.DELETE_APP_GROUP), + /** + * 添加应用组关联 + */ + ADD_APP_GROUP_ASSOCIATION(AppEventType.ADD_APP_GROUP_ASSOCIATION), + /** + * 移除应用组关联 + */ + REMOVE_APP_GROUP_ASSOCIATION(AppEventType.REMOVE_APP_GROUP_ASSOCIATION); /** * code diff --git a/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/AppEntity.java b/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/AppEntity.java index 3a3c44a7..0c943dd8 100644 --- a/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/AppEntity.java +++ b/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/AppEntity.java @@ -100,12 +100,6 @@ public class AppEntity extends LogicDeleteEntity { @Column(name = "icon_") private String icon; - /** - * 应用分组id - */ - @Column(name = "group_id") - private Long groupId; - /** * SSO 发起登录类型 */ diff --git a/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/AppGroupAssociationEntity.java b/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/AppGroupAssociationEntity.java new file mode 100644 index 00000000..92592bb1 --- /dev/null +++ b/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/AppGroupAssociationEntity.java @@ -0,0 +1,63 @@ +/* + * eiam-common - Employee Identity and Access Management + * Copyright © 2022-Present Jinan Yuanchuang Network Technology Co., Ltd. (support@topiam.cn) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package cn.topiam.employee.common.entity.app; + +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.Where; + +import cn.topiam.employee.support.repository.domain.LogicDeleteEntity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import static cn.topiam.employee.support.repository.domain.LogicDeleteEntity.SOFT_DELETE_SET; +import static cn.topiam.employee.support.repository.domain.LogicDeleteEntity.SOFT_DELETE_WHERE; + +/** + * 应用组关联 + * + * @author TopIAM + * Created by support@topiam.cn on 2023年09月06日22:03:21 + */ +@Getter +@Setter +@ToString +@Accessors(chain = true) +@Entity +@Table(name = "app_group_association") +@SQLDelete(sql = "update app_group_association set " + SOFT_DELETE_SET + " where id_ = ?") +@Where(clause = SOFT_DELETE_WHERE) +public class AppGroupAssociationEntity extends LogicDeleteEntity { + + /** + * 应用组ID + */ + @Column(name = "group_id") + private Long groupId; + + /** + * 应用ID + */ + @Column(name = "app_id") + private Long appId; +} diff --git a/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/query/AppGroupAssociationListQuery.java b/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/query/AppGroupAssociationListQuery.java new file mode 100644 index 00000000..708a9559 --- /dev/null +++ b/eiam-common/src/main/java/cn/topiam/employee/common/entity/app/query/AppGroupAssociationListQuery.java @@ -0,0 +1,55 @@ +/* + * eiam-common - Employee Identity and Access Management + * Copyright © 2022-Present Jinan Yuanchuang Network Technology Co., Ltd. (support@topiam.cn) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package cn.topiam.employee.common.entity.app.query; + +import java.io.Serial; +import java.io.Serializable; + +import org.springdoc.core.annotations.ParameterObject; + +import lombok.Data; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; + +/** + * 查询应用列表入参 + * + * @author TopIAM + * Created by support@topiam.cn on 2020/8/11 23:08 + */ +@Data +@Schema(description = "查询应用组应用列表入参") +@ParameterObject +public class AppGroupAssociationListQuery implements Serializable { + @Serial + private static final long serialVersionUID = -7110595216804896858L; + /** + * 组ID + */ + @NotEmpty(message = "组ID不能为空") + @Parameter(description = "组ID") + private String id; + + /** + * 应用名称 + */ + @Parameter(description = "应用名称") + private String appName; +} diff --git a/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/AppGroupAssociationRepository.java b/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/AppGroupAssociationRepository.java new file mode 100644 index 00000000..652acc26 --- /dev/null +++ b/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/AppGroupAssociationRepository.java @@ -0,0 +1,54 @@ +/* + * eiam-common - Employee Identity and Access Management + * Copyright © 2022-Present Jinan Yuanchuang Network Technology Co., Ltd. (support@topiam.cn) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package cn.topiam.employee.common.repository.app; + +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.querydsl.QuerydslPredicateExecutor; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import cn.topiam.employee.common.entity.app.AppGroupAssociationEntity; +import cn.topiam.employee.support.repository.LogicDeleteRepository; +import static cn.topiam.employee.support.repository.domain.LogicDeleteEntity.SOFT_DELETE_SET; + +/** + * 应用组成员 + * + * @author TopIAM + * Created by support@topiam.cn on 2023年09月06日22:03:18 + */ +@Repository +public interface AppGroupAssociationRepository extends + LogicDeleteRepository, + QuerydslPredicateExecutor, + AppGroupAssociationRepositoryCustomized { + + /** + * 根据应用组ID和应用ID删除 + * + * @param groupId {@link String} + * @param appId {@link String} + */ + @Modifying + @Transactional(rollbackFor = Exception.class) + @Query(value = "UPDATE app_group_association SET " + SOFT_DELETE_SET + + " WHERE app_id = :appId and group_id = :groupId", nativeQuery = true) + void deleteByGroupIdAndAppId(@Param("groupId") Long groupId, @Param("appId") Long appId); +} diff --git a/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/AppGroupAssociationRepositoryCustomized.java b/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/AppGroupAssociationRepositoryCustomized.java new file mode 100644 index 00000000..79e16734 --- /dev/null +++ b/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/AppGroupAssociationRepositoryCustomized.java @@ -0,0 +1,41 @@ +/* + * eiam-common - Employee Identity and Access Management + * Copyright © 2022-Present Jinan Yuanchuang Network Technology Co., Ltd. (support@topiam.cn) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package cn.topiam.employee.common.repository.app; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import cn.topiam.employee.common.entity.app.AppEntity; +import cn.topiam.employee.common.entity.app.query.AppGroupAssociationListQuery; + +/** + * @author TopIAM + * Created by support@topiam.cn on 2023/9/7 21:27 + */ +public interface AppGroupAssociationRepositoryCustomized { + + /** + * 获取应用组应用列表 + * + * @param query {@link AppGroupAssociationListQuery} + * @param pageable {@link Pageable} + * @return {@link Page} + */ + Page getAppGroupAssociationList(AppGroupAssociationListQuery query, + Pageable pageable); +} diff --git a/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/impl/AppGroupAssociationRepositoryCustomizedImpl.java b/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/impl/AppGroupAssociationRepositoryCustomizedImpl.java new file mode 100644 index 00000000..dd6e76ee --- /dev/null +++ b/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/impl/AppGroupAssociationRepositoryCustomizedImpl.java @@ -0,0 +1,84 @@ +/* + * eiam-common - Employee Identity and Access Management + * Copyright © 2022-Present Jinan Yuanchuang Network Technology Co., Ltd. (support@topiam.cn) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package cn.topiam.employee.common.repository.app.impl; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import cn.topiam.employee.common.entity.account.query.UserGroupMemberListQuery; +import cn.topiam.employee.common.entity.app.AppEntity; +import cn.topiam.employee.common.entity.app.query.AppGroupAssociationListQuery; +import cn.topiam.employee.common.repository.app.AppGroupAssociationRepositoryCustomized; +import cn.topiam.employee.common.repository.app.impl.mapper.AppEntityMapper; + +import lombok.AllArgsConstructor; + +/** + * @author TopIAM + * Created by support@topiam.cn on 2023/9/7 21:27 + */ +@Repository +@AllArgsConstructor +public class AppGroupAssociationRepositoryCustomizedImpl implements + AppGroupAssociationRepositoryCustomized { + + /** + * 获取应用组应用列表 + * + * @param query {@link UserGroupMemberListQuery} + * @param pageable {@link Pageable} + * @return {@link Page} + */ + @SuppressWarnings("DuplicatedCode") + @Override + public Page getAppGroupAssociationList(AppGroupAssociationListQuery query, + Pageable pageable) { + //@formatter:off + StringBuilder builder = new StringBuilder(""" + SELECT + app.* + FROM + app app LEFT JOIN app_group_association ass ON app.id_ = ass.app_id AND app.is_deleted = 0 AND ass.is_deleted = 0 + WHERE ass.group_id = '%s' + """.formatted(query.getId())); + //应用名称 + if (StringUtils.isNoneBlank(query.getAppName())) { + builder.append(" AND app.name_ like '%").append(query.getAppName()).append("%'"); + } + builder.append(" ORDER BY `app`.create_time DESC"); + //@formatter:on + String sql = builder.toString(); + List list = jdbcTemplate.query( + builder.append(" LIMIT ").append(pageable.getPageNumber() * pageable.getPageSize()) + .append(",").append(pageable.getPageSize()).toString(), + new AppEntityMapper()); + //@formatter:off + String countSql = "SELECT count(*) FROM (" + sql + ") app_"; + //@formatter:on + Integer count = jdbcTemplate.queryForObject(countSql, Integer.class); + return new PageImpl<>(list, pageable, count); + } + + private final JdbcTemplate jdbcTemplate; +} diff --git a/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/impl/AppRepositoryCustomizedImpl.java b/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/impl/AppRepositoryCustomizedImpl.java index d9e18692..d356daf2 100644 --- a/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/impl/AppRepositoryCustomizedImpl.java +++ b/eiam-common/src/main/java/cn/topiam/employee/common/repository/app/impl/AppRepositoryCustomizedImpl.java @@ -79,6 +79,7 @@ public class AppRepositoryCustomizedImpl implements AppRepositoryCustomized { FROM app LEFT JOIN app_access_policy app_acce ON app.id_ = app_acce.app_id AND app_acce.is_deleted = '0' + LEFT JOIN app_group_association ass ON app.id_ = ass.app_id AND ass.is_deleted = '0' WHERE app.is_enabled = 1 AND app.is_deleted = '0' @@ -90,7 +91,7 @@ public class AppRepositoryCustomizedImpl implements AppRepositoryCustomized { } //分组id if (null!=groupId) { - builder.append(" AND app.group_id = ").append(groupId); + builder.append(" AND ass.group_id = ").append(groupId); } //@formatter:on String sql = builder.toString(); diff --git a/eiam-common/src/main/resources/db/1.1.0-changelog.xml b/eiam-common/src/main/resources/db/1.1.0-changelog.xml index ceaf433a..3bf2e8ce 100644 --- a/eiam-common/src/main/resources/db/1.1.0-changelog.xml +++ b/eiam-common/src/main/resources/db/1.1.0-changelog.xml @@ -53,12 +53,33 @@ - - + + + + - + + + + + + + + + + + + + + + + + + + + @@ -196,5 +217,10 @@ + + + + + \ No newline at end of file diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java b/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java index 26793ec3..0f635ae4 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java @@ -22,11 +22,16 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import com.google.common.collect.Lists; + import cn.topiam.employee.audit.annotation.Audit; import cn.topiam.employee.audit.event.type.EventType; +import cn.topiam.employee.common.entity.account.query.UserGroupMemberListQuery; +import cn.topiam.employee.common.entity.app.query.AppGroupAssociationListQuery; import cn.topiam.employee.console.pojo.query.app.AppGroupQuery; import cn.topiam.employee.console.pojo.result.app.AppGroupGetResult; import cn.topiam.employee.console.pojo.result.app.AppGroupListResult; +import cn.topiam.employee.console.pojo.result.app.AppListResult; import cn.topiam.employee.console.pojo.save.app.AppGroupCreateParam; import cn.topiam.employee.console.pojo.update.app.AppGroupUpdateParam; import cn.topiam.employee.console.service.app.AppGroupService; @@ -39,7 +44,9 @@ import cn.topiam.employee.support.result.ApiRestResult; import lombok.AllArgsConstructor; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotEmpty; import static cn.topiam.employee.common.constant.AppConstants.APP_PATH; /** @@ -169,6 +176,58 @@ public class AppGroupController { return ApiRestResult. builder().result(result).build(); } + /** + * 添加分组用户 + * + * @param appIds {@link String} + * @return {@link Boolean} + */ + @Lock + @Preview + @Validated + @Operation(summary = "添加应用组关联") + @Audit(type = EventType.ADD_APP_GROUP_ASSOCIATION) + @PostMapping(value = "/add_association/{id}") + @PreAuthorize(value = "authenticated and @sae.hasAuthority(T(cn.topiam.employee.support.security.userdetails.UserType).ADMIN)") + public ApiRestResult addAssociation(@PathVariable(value = "id") String id, + @Parameter(description = "应用ID") String[] appIds) { + return ApiRestResult. builder().result(appGroupService.addAssociation(id, appIds)) + .build(); + } + + /** + * 移除分组用户 + * + * @param id {@link String} + * @return {@link Boolean} + */ + @Lock + @Preview + @Operation(summary = "移除应用组关联") + @Audit(type = EventType.REMOVE_APP_GROUP_ASSOCIATION) + @DeleteMapping(value = "/remove_association/{id}") + @PreAuthorize(value = "authenticated and @sae.hasAuthority(T(cn.topiam.employee.support.security.userdetails.UserType).ADMIN)") + public ApiRestResult removeAssociation(@PathVariable(value = "id") String id, + @NotEmpty(message = "应用ID不能为空") @Parameter(description = "应用ID集合") String[] appIds) { + return ApiRestResult. builder() + .result(appGroupService.batchRemoveAssociation(id, Lists.newArrayList(appIds))).build(); + } + + /** + * 获取应用组内应用 + * + * @param query {@link UserGroupMemberListQuery} 参数 + * @return {@link Boolean} + */ + @Operation(summary = "获取应用组内应用") + @GetMapping(value = "/{id}/app_list") + @PreAuthorize(value = "authenticated and @sae.hasAuthority(T(cn.topiam.employee.support.security.userdetails.UserType).ADMIN)") + public ApiRestResult> getAppGroupAssociationList(PageModel model, + AppGroupAssociationListQuery query) { + return ApiRestResult.> builder() + .result(appGroupService.getAppGroupAssociationList(model, query)).build(); + } + /** * AppGroupService */ diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/service/app/AppGroupService.java b/eiam-console/src/main/java/cn/topiam/employee/console/service/app/AppGroupService.java index 76ef4aca..27c268cb 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/service/app/AppGroupService.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/service/app/AppGroupService.java @@ -17,9 +17,13 @@ */ package cn.topiam.employee.console.service.app; +import java.util.List; + +import cn.topiam.employee.common.entity.app.query.AppGroupAssociationListQuery; import cn.topiam.employee.console.pojo.query.app.AppGroupQuery; import cn.topiam.employee.console.pojo.result.app.AppGroupGetResult; import cn.topiam.employee.console.pojo.result.app.AppGroupListResult; +import cn.topiam.employee.console.pojo.result.app.AppListResult; import cn.topiam.employee.console.pojo.save.app.AppGroupCreateParam; import cn.topiam.employee.console.pojo.update.app.AppGroupUpdateParam; import cn.topiam.employee.support.repository.page.domain.Page; @@ -91,4 +95,32 @@ public interface AppGroupService { * @return {@link Boolean} */ Boolean disableAppGroup(String id); + + /** + * 添加应用 + * + * @param appIds {@link String} + * @param groupId {@link String} + * @return {@link Boolean} + */ + Boolean addAssociation(String groupId, String[] appIds); + + /** + * 批量移除应用 + * + * @param id {@link String} + * @param appIds {@link String} + * @return {@link Boolean} + */ + Boolean batchRemoveAssociation(String id, List appIds); + + /** + * 获取应用组内应用列表 + * + * @param query {@link AppGroupAssociationListQuery} + * @param page {@link PageModel} + * @return {@link AppListResult} + */ + Page getAppGroupAssociationList(PageModel page, + AppGroupAssociationListQuery query); } diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/service/app/impl/AppGroupServiceImpl.java b/eiam-console/src/main/java/cn/topiam/employee/console/service/app/impl/AppGroupServiceImpl.java index d9d5f2dc..6c71d341 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/service/app/impl/AppGroupServiceImpl.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/service/app/impl/AppGroupServiceImpl.java @@ -18,25 +18,36 @@ package cn.topiam.employee.console.service.app.impl; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Optional; +import org.springframework.data.domain.PageRequest; import org.springframework.data.querydsl.QPageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.google.common.collect.Lists; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.Predicate; import cn.topiam.employee.audit.context.AuditContext; import cn.topiam.employee.audit.entity.Target; import cn.topiam.employee.audit.enums.TargetType; +import cn.topiam.employee.common.entity.app.AppEntity; +import cn.topiam.employee.common.entity.app.AppGroupAssociationEntity; import cn.topiam.employee.common.entity.app.AppGroupEntity; import cn.topiam.employee.common.entity.app.QAppGroupEntity; +import cn.topiam.employee.common.entity.app.query.AppGroupAssociationListQuery; +import cn.topiam.employee.common.repository.app.AppGroupAssociationRepository; import cn.topiam.employee.common.repository.app.AppGroupRepository; +import cn.topiam.employee.console.converter.app.AppConverter; import cn.topiam.employee.console.converter.app.AppGroupConverter; import cn.topiam.employee.console.pojo.query.app.AppGroupQuery; import cn.topiam.employee.console.pojo.result.app.AppGroupGetResult; import cn.topiam.employee.console.pojo.result.app.AppGroupListResult; +import cn.topiam.employee.console.pojo.result.app.AppListResult; import cn.topiam.employee.console.pojo.save.app.AppGroupCreateParam; import cn.topiam.employee.console.pojo.update.app.AppGroupUpdateParam; import cn.topiam.employee.console.service.app.AppGroupService; @@ -93,7 +104,6 @@ public class AppGroupServiceImpl implements AppGroupService { public Boolean createAppGroup(AppGroupCreateParam param) { // TODO 创建后没有数据权限 AppGroupEntity entity = appGroupConverter.appGroupCreateParamConvertToEntity(param); - entity.setEnabled(true); appGroupRepository.save(entity); AuditContext.setTarget( Target.builder().id(String.valueOf(entity.getId())).type(TargetType.APP_GROUP).build()); @@ -194,13 +204,92 @@ public class AppGroupServiceImpl implements AppGroupService { return optional.get(); } + /** + * 添加应用 + * + * @param appIds {@link String} + * @param groupId {@link String} + * @return {@link Boolean} + */ + @Override + public Boolean addAssociation(String groupId, String[] appIds) { + Optional optional = appGroupRepository.findById(Long.valueOf(groupId)); + //用户组不存在 + if (optional.isEmpty()) { + AuditContext.setContent("操作失败,应用组不存在"); + log.warn(AuditContext.getContent()); + throw new TopIamException(AuditContext.getContent()); + } + List list = new ArrayList<>(); + Lists.newArrayList(appIds).forEach(id -> { + AppGroupAssociationEntity member = new AppGroupAssociationEntity(); + member.setGroupId(Long.valueOf(groupId)); + member.setAppId(Long.valueOf(id)); + list.add(member); + }); + //添加 + appGroupAssociationRepository.saveAll(list); + List targets = new ArrayList<>(Arrays.stream(appIds) + .map(i -> Target.builder().id(i).type(TargetType.APPLICATION).build()).toList()); + targets.add(Target.builder().id(groupId).type(TargetType.APP_GROUP).build()); + AuditContext.setTarget(targets); + return true; + } + + /** + * 批量移除应用 + * + * @param appIds {@link String} + * @param id {@link String} + * @return {@link Boolean} + */ + @Override + public Boolean batchRemoveAssociation(String id, List appIds) { + Optional optional = appGroupRepository.findById(Long.valueOf(id)); + //用户组不存在 + if (optional.isEmpty()) { + AuditContext.setContent("操作失败,应用组不存在"); + log.warn(AuditContext.getContent()); + throw new TopIamException(AuditContext.getContent()); + } + appIds.forEach(userId -> appGroupAssociationRepository + .deleteByGroupIdAndAppId(Long.valueOf(id), Long.valueOf(userId))); + List targets = new ArrayList<>(appIds.stream() + .map(i -> Target.builder().id(i).type(TargetType.APPLICATION).build()).toList()); + targets.add(Target.builder().id(id).type(TargetType.APP_GROUP).build()); + AuditContext.setTarget(targets); + return true; + } + + /** + * 获取应用组内应用列表 + * + * @param query {@link AppGroupAssociationListQuery} + * @return {@link AppListResult} + */ + @Override + public Page getAppGroupAssociationList(PageModel model, + AppGroupAssociationListQuery query) { + org.springframework.data.domain.Page page = appGroupAssociationRepository + .getAppGroupAssociationList(query, + PageRequest.of(model.getCurrent(), model.getPageSize())); + return appConverter.entityConvertToAppListResult(page); + } + /** * AppGroupRepository */ - private final AppGroupRepository appGroupRepository; + private final AppGroupRepository appGroupRepository; /** * AppGroupConverter */ - private final AppGroupConverter appGroupConverter; + private final AppGroupConverter appGroupConverter; + + private final AppConverter appConverter; + + /** + * AppGroupAssociationRepository + */ + private final AppGroupAssociationRepository appGroupAssociationRepository; } diff --git a/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java b/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java index af2795d8..ab6c80f0 100644 --- a/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java +++ b/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java @@ -25,8 +25,9 @@ import org.mapstruct.Mapper; import com.querydsl.core.types.ExpressionUtils; import com.querydsl.core.types.Predicate; -import cn.topiam.employee.common.entity.app.AppEntity; +import cn.topiam.employee.common.entity.app.AppGroupAssociationEntity; import cn.topiam.employee.common.entity.app.AppGroupEntity; +import cn.topiam.employee.common.entity.app.QAppGroupAssociationEntity; import cn.topiam.employee.common.entity.app.QAppGroupEntity; import cn.topiam.employee.portal.pojo.result.AppGroupListResult; @@ -53,20 +54,32 @@ public interface AppGroupConverter { return predicate; } + /** + * 应用组与应用关联 Predicate + * + * @return {@link Predicate} + */ + default Predicate queryAppGroupAssociationPredicate() { + QAppGroupAssociationEntity appGroupAssociation = QAppGroupAssociationEntity.appGroupAssociationEntity; + Predicate predicate = appGroupAssociation.deleted.eq(Boolean.FALSE); + //@formatter:on + return predicate; + } + /** * 实体转分组管理列表 * - * @param list {@link AppGroupEntity} - * @param appList {@link AppEntity} + * @param list {@link AppGroupEntity} + * @param appGroupAssociationList {@link AppGroupAssociationEntity} * @return {@link AppGroupListResult} */ default List entityConvertToAppGroupListResult(List list, - List appList) { + List appGroupAssociationList) { List results = new ArrayList<>(); for (AppGroupEntity entity : list) { AppGroupListResult result = appGroupEntityConverterToResult(entity); - Long count = appList.stream().filter(t -> t.getGroupId().equals(entity.getId())) - .count(); + Long count = appGroupAssociationList.stream() + .filter(t -> t.getGroupId().equals(entity.getId())).count(); result.setAppCount(Integer.valueOf(count.toString())); results.add(result); } diff --git a/eiam-portal/src/main/java/cn/topiam/employee/portal/service/impl/AppServiceImpl.java b/eiam-portal/src/main/java/cn/topiam/employee/portal/service/impl/AppServiceImpl.java index 97ab224e..ee166d24 100644 --- a/eiam-portal/src/main/java/cn/topiam/employee/portal/service/impl/AppServiceImpl.java +++ b/eiam-portal/src/main/java/cn/topiam/employee/portal/service/impl/AppServiceImpl.java @@ -25,7 +25,9 @@ import org.springframework.stereotype.Service; import com.querydsl.core.types.Predicate; import cn.topiam.employee.common.entity.app.AppEntity; +import cn.topiam.employee.common.entity.app.AppGroupAssociationEntity; import cn.topiam.employee.common.entity.app.AppGroupEntity; +import cn.topiam.employee.common.repository.app.AppGroupAssociationRepository; import cn.topiam.employee.common.repository.app.AppGroupRepository; import cn.topiam.employee.common.repository.app.AppRepository; import cn.topiam.employee.portal.converter.AppConverter; @@ -70,36 +72,46 @@ public class AppServiceImpl implements AppService { @Override public List getAppGroupList() { Predicate predicate = appGroupConverter.queryPredicate(); - List appList = appRepository.getAppListByGroup(); + Predicate appGroupAssociationPredicate = appGroupConverter + .queryAppGroupAssociationPredicate(); + List appGroupAssociationList = (List) appGroupAssociationRepository + .findAll(appGroupAssociationPredicate); //查询映射 List list = (List) appGroupRepository.findAll(predicate); - return appGroupConverter.entityConvertToAppGroupListResult(list, appList); + return appGroupConverter.entityConvertToAppGroupListResult(list, appGroupAssociationList); } /** * AppRepository */ - private final AppRepository appRepository; + private final AppRepository appRepository; /** * AppGroupRepository */ - private final AppGroupRepository appGroupRepository; + private final AppGroupRepository appGroupRepository; + + /** + * AppGroupAssociationRepository + */ + private final AppGroupAssociationRepository appGroupAssociationRepository; /** * AppConverter */ - private final AppConverter appConverter; + private final AppConverter appConverter; /** * AppGroupConverter */ - private final AppGroupConverter appGroupConverter; + private final AppGroupConverter appGroupConverter; public AppServiceImpl(AppRepository appRepository, AppGroupRepository appGroupRepository, + AppGroupAssociationRepository appGroupAssociationRepository, AppConverter appConverter, AppGroupConverter appGroupConverter) { this.appRepository = appRepository; this.appGroupRepository = appGroupRepository; + this.appGroupAssociationRepository = appGroupAssociationRepository; this.appConverter = appConverter; this.appGroupConverter = appGroupConverter; } From e96846e8fe48d1a4515b2d3c9f1872b6aa089bcf Mon Sep 17 00:00:00 2001 From: smallbun <2689170096@qq.com> Date: Fri, 8 Sep 2023 12:39:54 +0800 Subject: [PATCH 2/7] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eiam-console/src/main/console-fe/package.json | 8 +++---- .../src/pages/setting/Message/Message.tsx | 2 +- .../src/main/console-fe/src/services/app.ts | 21 ------------------- eiam-portal/src/main/portal-fe/package.json | 8 +++---- .../Account/components/ModifyPassword.tsx | 4 ++-- 5 files changed, 11 insertions(+), 32 deletions(-) diff --git a/eiam-console/src/main/console-fe/package.json b/eiam-console/src/main/console-fe/package.json index ad3770ce..5c3e62bc 100644 --- a/eiam-console/src/main/console-fe/package.json +++ b/eiam-console/src/main/console-fe/package.json @@ -47,7 +47,7 @@ "@ant-design/charts": "^1.4.2", "@ant-design/icons": "^5.2.6", "@ant-design/maps": "^1.0.7", - "@ant-design/pro-components": "^2.6.16", + "@ant-design/pro-components": "^2.6.18", "ahooks": "^3.7.8", "antd": "^5.8.6", "antd-img-crop": "^4.12.2", @@ -89,14 +89,14 @@ "@types/google-libphonenumber": "^7.4.26", "@types/history": "^4.7.11", "@types/js-yaml": "^4.0.5", - "@types/lodash": "^4.14.197", + "@types/lodash": "^4.14.198", "@types/numeral": "^2.0.2", "@types/qs": "^6.9.8", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@types/react-helmet": "^6.1.6", - "@umijs/lint": "^4.0.79", - "@umijs/max": "^4.0.79", + "@umijs/lint": "^4.0.80", + "@umijs/max": "^4.0.80", "cross-env": "^7.0.3", "cross-port-killer": "^1.4.0", "eslint": "^8.48.0", diff --git a/eiam-console/src/main/console-fe/src/pages/setting/Message/Message.tsx b/eiam-console/src/main/console-fe/src/pages/setting/Message/Message.tsx index ccbf1cea..a4062ee6 100644 --- a/eiam-console/src/main/console-fe/src/pages/setting/Message/Message.tsx +++ b/eiam-console/src/main/console-fe/src/pages/setting/Message/Message.tsx @@ -35,7 +35,7 @@ export default (): React.ReactNode => { const { type } = query as { type: TabType; }; - if (!type) { + if (!type || !TabType[type]) { setActiveKey(TabType.mail_template); history.replace({ pathname: location.pathname, diff --git a/eiam-console/src/main/console-fe/src/services/app.ts b/eiam-console/src/main/console-fe/src/services/app.ts index 0d095409..f96d967b 100644 --- a/eiam-console/src/main/console-fe/src/services/app.ts +++ b/eiam-console/src/main/console-fe/src/services/app.ts @@ -21,18 +21,6 @@ import type { SortOrder } from 'antd/es/table/interface'; import { request } from '@umijs/max'; import type { UploadFile } from 'antd/es/upload/interface'; -/** - * Get Application Template FormSchema - */ -export async function getAppTemplateFormSchema( - code: string, -): Promise>> { - return request>(`/api/v1/app/template/form_schema`, { - method: 'GET', - params: { code: code }, - }); -} - /** * 获取应用列表 */ @@ -65,15 +53,6 @@ export async function updateApp(params: Record): Promise> { - return request>(`/api/v1/app/get/${id}`, { - method: 'GET', - }); -} - /** * Get Config */ diff --git a/eiam-portal/src/main/portal-fe/package.json b/eiam-portal/src/main/portal-fe/package.json index 07511d18..a05715f9 100644 --- a/eiam-portal/src/main/portal-fe/package.json +++ b/eiam-portal/src/main/portal-fe/package.json @@ -48,7 +48,7 @@ "@ant-design/charts": "^1.4.2", "@ant-design/icons": "^5.2.6", "@ant-design/maps": "^1.0.7", - "@ant-design/pro-components": "^2.6.16", + "@ant-design/pro-components": "^2.6.18", "ahooks": "^3.7.8", "antd": "^5.8.6", "antd-img-crop": "^4.12.2", @@ -84,14 +84,14 @@ "@types/google-libphonenumber": "^7.4.26", "@types/history": "^4.7.11", "@types/js-yaml": "^4.0.5", - "@types/lodash": "^4.14.197", + "@types/lodash": "^4.14.198", "@types/numeral": "^2.0.2", "@types/qs": "^6.9.8", "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@types/react-helmet": "^6.1.6", - "@umijs/lint": "^4.0.79", - "@umijs/max": "^4.0.79", + "@umijs/lint": "^4.0.80", + "@umijs/max": "^4.0.80", "cross-env": "^7.0.3", "cross-port-killer": "^1.4.0", "eslint": "^8.48.0", diff --git a/eiam-portal/src/main/portal-fe/src/pages/Account/components/ModifyPassword.tsx b/eiam-portal/src/main/portal-fe/src/pages/Account/components/ModifyPassword.tsx index ed952b13..67edece0 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Account/components/ModifyPassword.tsx +++ b/eiam-portal/src/main/portal-fe/src/pages/Account/components/ModifyPassword.tsx @@ -70,7 +70,7 @@ const ModifyPassword = (props: { destroyOnClose: true, maskClosable: false, onCancel: async () => { - await setVisible(false); + setVisible(false); }, }} onFinish={async (formData: Record) => { @@ -89,7 +89,7 @@ const ModifyPassword = (props: { ), ); if (success && result) { - await setVisible(false); + setVisible(false); message.success(intl.formatMessage({ id: 'page.account.modify_password.success' })); setRefresh(true); return Promise.resolve(); From 207d0ff7f791d8fee6c0d7c645406c27fd5dfabb Mon Sep 17 00:00:00 2001 From: smallbun <2689170096@qq.com> Date: Fri, 8 Sep 2023 12:41:07 +0800 Subject: [PATCH 3/7] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/IconFont/lib/iconfont.js | 67 +++++++++++- .../components/CreateUser/CreateUser.tsx | 2 +- .../src/pages/app/AppConfig/data.d.ts | 102 ++++++++++++++++++ .../src/pages/security/Setting/data.d.ts | 11 ++ .../components/MailTemplate/MailTemplate.tsx | 5 +- .../portal-fe/src/pages/Account/data.d.ts | 6 +- .../portal-fe/src/pages/Application/data.d.ts | 10 +- .../main/portal-fe/src/pages/Login/data.d.ts | 8 +- 8 files changed, 195 insertions(+), 16 deletions(-) diff --git a/eiam-console/src/main/console-fe/src/components/IconFont/lib/iconfont.js b/eiam-console/src/main/console-fe/src/components/IconFont/lib/iconfont.js index 90ee4748..43cd3bd7 100644 --- a/eiam-console/src/main/console-fe/src/components/IconFont/lib/iconfont.js +++ b/eiam-console/src/main/console-fe/src/components/IconFont/lib/iconfont.js @@ -15,4 +15,69 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -window._iconfont_svg_string_3203993='',function(c){var l=(l=document.getElementsByTagName("script"))[l.length-1],a=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var h,t,i,p,m,d=function(l,a){a.parentNode.insertBefore(l,a)};if(a&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}h=function(){let l,a=document.createElement("div");a.innerHTML=c._iconfont_svg_string_3203993,(a=a.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",a=a,(l=document.body).firstChild?d(a,l.firstChild):l.appendChild(a))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),h()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(i=h,p=c.document,m=!1,o(),p.onreadystatechange=function(){"complete"==p.readyState&&(p.onreadystatechange=null,z())})}function z(){m||(m=!0,i())}function o(){try{p.documentElement.doScroll("left")}catch(l){return void setTimeout(o,50)}z()}}(window); +(window._iconfont_svg_string_3203993 = + ''), + (function (c) { + var l = (l = document.getElementsByTagName('script'))[l.length - 1], + a = l.getAttribute('data-injectcss'), + l = l.getAttribute('data-disable-injectsvg'); + if (!l) { + var h, + t, + i, + p, + m, + d = function (l, a) { + a.parentNode.insertBefore(l, a); + }; + if (a && !c.__iconfont__svg__cssinject__) { + c.__iconfont__svg__cssinject__ = !0; + try { + document.write( + '', + ); + } catch (l) { + console && console.log(l); + } + } + (h = function () { + let l, + a = document.createElement('div'); + (a.innerHTML = c._iconfont_svg_string_3203993), + (a = a.getElementsByTagName('svg')[0]) && + (a.setAttribute('aria-hidden', 'true'), + (a.style.position = 'absolute'), + (a.style.width = 0), + (a.style.height = 0), + (a.style.overflow = 'hidden'), + (a = a), + (l = document.body).firstChild ? d(a, l.firstChild) : l.appendChild(a)); + }), + document.addEventListener + ? ~['complete', 'loaded', 'interactive'].indexOf(document.readyState) + ? setTimeout(h, 0) + : ((t = function () { + document.removeEventListener('DOMContentLoaded', t, !1), h(); + }), + document.addEventListener('DOMContentLoaded', t, !1)) + : document.attachEvent && + ((i = h), + (p = c.document), + (m = !1), + o(), + (p.onreadystatechange = function () { + 'complete' == p.readyState && ((p.onreadystatechange = null), z()); + })); + } + function z() { + m || ((m = !0), i()); + } + function o() { + try { + p.documentElement.doScroll('left'); + } catch (l) { + return void setTimeout(o, 50); + } + z(); + } + })(window); diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserList/components/CreateUser/CreateUser.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserList/components/CreateUser/CreateUser.tsx index ceee1ee9..f7c8ebfa 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserList/components/CreateUser/CreateUser.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserList/components/CreateUser/CreateUser.tsx @@ -136,7 +136,7 @@ const CreateUser = (props: CreateUserProps) => { */ const cancel = async () => { if (onCancel) { - await onCancel(); + onCancel(); } setSubmitLoading(false); form.resetFields(); diff --git a/eiam-console/src/main/console-fe/src/pages/app/AppConfig/data.d.ts b/eiam-console/src/main/console-fe/src/pages/app/AppConfig/data.d.ts index e708a4be..6e31e932 100644 --- a/eiam-console/src/main/console-fe/src/pages/app/AppConfig/data.d.ts +++ b/eiam-console/src/main/console-fe/src/pages/app/AppConfig/data.d.ts @@ -38,3 +38,105 @@ export type GetApp = { enabled: boolean; remark: string; }; + +/** + * 应用权限列表 + */ +export type AppAccessPolicyList = { + id: string; + //主体ID + subjectId: string; + //主体名称 + subjectName: string; + //主体类型 + subjectType: string; + //应用类型 + appType: string; + appProtocol: string; + //Effect + effect: string; +}; + +/** + * 角色列表 + */ +type AppPermissionRoleList = { + id: string; + name: string; + code: string; + enabled: boolean; + appId: string; + remark: string; +}; + +/** + * 角色列表 + */ +type GetAppPermissionRole = { + id: string; + name: string; + code: string; + enabled: boolean; + appId: string; + remark: string; +}; + +/** + * 资源列表 + */ +type AppPermissionResourceList = { + id: string; + name: string; + code: string; + enabled: boolean; + desc: string; + appId: string; +}; + +/** + * 权限资源点 + */ +type AppPermissionResourceActionList = { + id: string; + name: string; + code: string; + desc: string; + appId: string; + menus: { + access: string; + id: string; + name: string; + }[]; + datas: { + access: string; + id: string; + name: string; + }[]; + buttons: { + access: string; + id: string; + name: string; + }[]; + apis: { + access: string; + id: string; + name: string; + }[]; + others: { + access: string; + id: string; + name: string; + }[]; +}; + +/** + * 权限授权列表 + */ +type AppPermissionPolicyList = { + id: string; + name: string; + code: string; + enabled: boolean; + desc: string; + appId: string; +}; diff --git a/eiam-console/src/main/console-fe/src/pages/security/Setting/data.d.ts b/eiam-console/src/main/console-fe/src/pages/security/Setting/data.d.ts index 096e3414..d18cfe6f 100644 --- a/eiam-console/src/main/console-fe/src/pages/security/Setting/data.d.ts +++ b/eiam-console/src/main/console-fe/src/pages/security/Setting/data.d.ts @@ -18,3 +18,14 @@ export type SecurityDefensePolicyConfig = { contentSecurityPolicy: string; }; + +/** + * 安全基础配置 + */ +export type BasicSettingConfig = { + frequentRegisterCheck: boolean; + emailVerifiedDefault: boolean; + sendWelcomeEmail: boolean; + verifyOldEmail: boolean; + verifyOldPhone: boolean; +}; diff --git a/eiam-console/src/main/console-fe/src/pages/setting/Message/components/MailTemplate/MailTemplate.tsx b/eiam-console/src/main/console-fe/src/pages/setting/Message/components/MailTemplate/MailTemplate.tsx index 21670230..01e81683 100644 --- a/eiam-console/src/main/console-fe/src/pages/setting/Message/components/MailTemplate/MailTemplate.tsx +++ b/eiam-console/src/main/console-fe/src/pages/setting/Message/components/MailTemplate/MailTemplate.tsx @@ -26,6 +26,7 @@ import MailTemplateConfig from './MailTemplateConfig'; import useStyle from './style'; import classnames from 'classnames'; import { useIntl } from '@umijs/max'; +import { EmailTemplateList } from '../../data.d'; const prefixCls = 'setting-mail-template'; @@ -36,7 +37,7 @@ export default (props: { visible: boolean }) => { const [content, setContent] = useState(''); const [configType, setConfigType] = useState(''); const [loading, setLoading] = useState(false); - const [dataSource, setDataSource] = useState([]); + const [dataSource, setDataSource] = useState([]); const [browseVisible, setBrowseVisible] = useState(false); const { styles } = useStyle(prefixCls); const intl = useIntl(); @@ -85,7 +86,7 @@ export default (props: { visible: boolean }) => {
- + rowKey="type" split cardProps={{ bodyStyle: { padding: 0 } }} diff --git a/eiam-portal/src/main/portal-fe/src/pages/Account/data.d.ts b/eiam-portal/src/main/portal-fe/src/pages/Account/data.d.ts index 3e3a1893..7215cf53 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Account/data.d.ts +++ b/eiam-portal/src/main/portal-fe/src/pages/Account/data.d.ts @@ -40,7 +40,7 @@ export interface GetBoundIdpList { * 账户菜单类型 */ export enum AccountSettingsStateKey { - BASE = 'base', - SECURITY = 'security', - BIND = 'bind', + base = 'base', + security = 'security', + bind = 'bind', } diff --git a/eiam-portal/src/main/portal-fe/src/pages/Application/data.d.ts b/eiam-portal/src/main/portal-fe/src/pages/Application/data.d.ts index 88d8e7f0..ad21d5f4 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Application/data.d.ts +++ b/eiam-portal/src/main/portal-fe/src/pages/Application/data.d.ts @@ -31,9 +31,15 @@ export enum InitLoginType { /** * 仅允许应用发起 SSO */ - ONLY_APP_INIT_SSO = 'only_app_init_sso', + only_app_init_sso = 'only_app_init_sso', /** * 门户或应用发起 SSO */ - PORTAL_OR_APP_INIT_SSO = 'portal_or_app_init_sso', + portal_or_app_init_sso = 'portal_or_app_init_sso', } + +export type AppGroupList = { + id: string; + name: string; + appCount: number; +}; diff --git a/eiam-portal/src/main/portal-fe/src/pages/Login/data.d.ts b/eiam-portal/src/main/portal-fe/src/pages/Login/data.d.ts index 66a37a2b..c95ea070 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Login/data.d.ts +++ b/eiam-portal/src/main/portal-fe/src/pages/Login/data.d.ts @@ -15,7 +15,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -import type { IDP_TYPE, MFA_FACTOR } from '@/constants'; +import type { IDP_TYPE } from '@/constants'; /** * 登录参数类型 @@ -44,9 +44,3 @@ export type IdpList = { export type LoginConfig = { idps: IdpList[]; }; - -export type MfaFactor = { - factor: MFA_FACTOR; - target?: string; - usable: boolean; -}; From 4f52d44966909708ecfb0717d072f50cc7b78108 Mon Sep 17 00:00:00 2001 From: smallbun <2689170096@qq.com> Date: Fri, 8 Sep 2023 12:41:39 +0800 Subject: [PATCH 4/7] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/console-fe/src/components/UserAvatar/UserAvatar.tsx | 2 +- .../main/console-fe/src/pages/account/UserDetail/UserDetail.tsx | 2 +- .../src/pages/account/UserGroupDetail/UserGroupDetail.tsx | 2 +- .../pages/account/UserList/components/UpdateUser/UpdateUser.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eiam-console/src/main/console-fe/src/components/UserAvatar/UserAvatar.tsx b/eiam-console/src/main/console-fe/src/components/UserAvatar/UserAvatar.tsx index 078d52ea..499d4075 100644 --- a/eiam-console/src/main/console-fe/src/components/UserAvatar/UserAvatar.tsx +++ b/eiam-console/src/main/console-fe/src/components/UserAvatar/UserAvatar.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ import { Avatar, Image } from 'antd'; -import { AvatarSize } from 'antd/es/avatar/SizeContext'; +import { AvatarSize } from 'antd/es/avatar/AvatarContext'; export default (props: { avatar: string; diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserDetail/UserDetail.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserDetail/UserDetail.tsx index cb98e2ca..504bbb80 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserDetail/UserDetail.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserDetail/UserDetail.tsx @@ -46,7 +46,7 @@ export default () => { history.push(`/account/user`); return; } - if (!type) { + if (!type || !UserDetailTabs[type]) { setTabActiveKey(UserDetailTabs.user_info); history.replace({ pathname: location.pathname, diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserGroupDetail/UserGroupDetail.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserGroupDetail/UserGroupDetail.tsx index 8cd23ffa..fee130d5 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserGroupDetail/UserGroupDetail.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserGroupDetail/UserGroupDetail.tsx @@ -55,7 +55,7 @@ export default () => { history.push(`/account/user-group`); return; } - if (!type) { + if (!type || !UserGroupDetailTabs[type]) { setTabActiveKey(UserGroupDetailTabs.member); history.push({ pathname: location.pathname, diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserList/components/UpdateUser/UpdateUser.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserList/components/UpdateUser/UpdateUser.tsx index 9dc91c65..a7a61cc4 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserList/components/UpdateUser/UpdateUser.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserList/components/UpdateUser/UpdateUser.tsx @@ -99,7 +99,7 @@ const UpdateUser = (props: UpdateFormProps) => { */ const cancel = async () => { if (onCancel) { - await onCancel(); + onCancel(); } setSubmitLoading(false); form.resetFields(); From cc804d0d2e0b64712487a1dc36958a068c334083 Mon Sep 17 00:00:00 2001 From: smallbun <2689170096@qq.com> Date: Fri, 8 Sep 2023 12:42:20 +0800 Subject: [PATCH 5/7] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/AddUserGroup/AddUserGroup.tsx | 12 ++++++----- .../security/Administrator/Administrator.tsx | 5 +++-- .../pages/setting/Storage/locales/zh-CN.ts | 21 +++++++------------ .../portal-fe/src/pages/Account/Account.tsx | 20 +++++++++--------- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/eiam-console/src/main/console-fe/src/pages/account/UserGroupList/components/AddUserGroup/AddUserGroup.tsx b/eiam-console/src/main/console-fe/src/pages/account/UserGroupList/components/AddUserGroup/AddUserGroup.tsx index aba73683..de0a10bc 100644 --- a/eiam-console/src/main/console-fe/src/pages/account/UserGroupList/components/AddUserGroup/AddUserGroup.tsx +++ b/eiam-console/src/main/console-fe/src/pages/account/UserGroupList/components/AddUserGroup/AddUserGroup.tsx @@ -48,8 +48,10 @@ export default (props: { preserve={false} width="500px" open={visible} - onOpenChange={() => { - form.setFieldsValue({ code: random(9) }); + onOpenChange={(visible) => { + if (visible) { + form.setFieldsValue({ code: random(9) }); + } }} modalProps={{ maskClosable: true, @@ -58,9 +60,9 @@ export default (props: { }} onFinish={async (values: AccountAPI.BaseUserGroup) => { setLoading(true); - const result = await onFinish(values); - setLoading(false); - return !!result; + await onFinish(values).finally(() => { + setLoading(false); + }); }} > diff --git a/eiam-console/src/main/console-fe/src/pages/security/Administrator/Administrator.tsx b/eiam-console/src/main/console-fe/src/pages/security/Administrator/Administrator.tsx index b9288be5..cd907620 100644 --- a/eiam-console/src/main/console-fe/src/pages/security/Administrator/Administrator.tsx +++ b/eiam-console/src/main/console-fe/src/pages/security/Administrator/Administrator.tsx @@ -39,6 +39,7 @@ import CreateAdministrator from './components/CreateAdministrator'; import UpdateAdministrator from './components/UpdateAdministrator'; import ResetPassword from './components/ResetAdministratorPassword'; import Avatar from '@/components/UserAvatar'; +import { AdministratorList } from './data'; export const Administrator = () => { const intl = useIntl(); @@ -49,7 +50,7 @@ export const Administrator = () => { const [resetPasswordVisible, setResetPasswordVisible] = useState(false); const [id, setId] = useState(); const [loading, setLoading] = useState(false); - const columns: ProColumns[] = [ + const columns: ProColumns[] = [ { title: intl.formatMessage({ id: 'pages.setting.administrator.table.columns.username' }), dataIndex: 'username', @@ -289,7 +290,7 @@ export const Administrator = () => { } > <> - + actionRef={actionRef} columns={columns} rowKey={'id'} diff --git a/eiam-console/src/main/console-fe/src/pages/setting/Storage/locales/zh-CN.ts b/eiam-console/src/main/console-fe/src/pages/setting/Storage/locales/zh-CN.ts index 90318df8..8ca0d852 100644 --- a/eiam-console/src/main/console-fe/src/pages/setting/Storage/locales/zh-CN.ts +++ b/eiam-console/src/main/console-fe/src/pages/setting/Storage/locales/zh-CN.ts @@ -99,27 +99,20 @@ export default { 'pages.setting.storage_provider.minio.bucket.rule.0.message': 'MinIO Bucket为必填项', 'pages.setting.storage_provider.provider.s3': 'S3', 'pages.setting.storage_provider.provider.s3.endpoint': 'S3 域名', - 'pages.setting.storage_provider.provider.s3.endpoint.placeholder': - '请输入 S3 域名', + 'pages.setting.storage_provider.provider.s3.endpoint.placeholder': '请输入 S3 域名', 'pages.setting.storage_provider.provider.qiniu_kodo.endpoint.rule.0.message': '七牛云Kodo S3 域名为必填项', 'pages.setting.storage_provider.provider.s3.domain': '外链域名', - 'pages.setting.storage_provider.provider.s3.domain.placeholder': - '请输入S3 外链域名', - 'pages.setting.storage_provider.provider.s3.domain.rule.0.message': - 'S3 外链域名为必填项', - 'pages.setting.storage_provider.provider.s3.access_key_id.placeholder': - '请输入S3 AccessKeyId', + 'pages.setting.storage_provider.provider.s3.domain.placeholder': '请输入S3 外链域名', + 'pages.setting.storage_provider.provider.s3.domain.rule.0.message': 'S3 外链域名为必填项', + 'pages.setting.storage_provider.provider.s3.access_key_id.placeholder': '请输入S3 AccessKeyId', 'pages.setting.storage_provider.provider.s3.access_key_id.rule.0.message': 'S3 AccessKeyId为必填项', 'pages.setting.storage_provider.provider.s3.secret_access_key.placeholder': '请输入S3 SecretAccessKey', 'pages.setting.storage_provider.provider.s3.secret_access_key.rule.0.message': 'S3 SecretAccessKey为必填项', - 'pages.setting.storage_provider.provider.s3.region.placeholder': - '请输入S3 Region', - 'pages.setting.storage_provider.provider.s3.bucket.placeholder': - '请输入S3 Bucket', - 'pages.setting.storage_provider.provider.s3.bucket.rule.0.message': - 'S3 Bucket为必填项', + 'pages.setting.storage_provider.provider.s3.region.placeholder': '请输入S3 Region', + 'pages.setting.storage_provider.provider.s3.bucket.placeholder': '请输入S3 Bucket', + 'pages.setting.storage_provider.provider.s3.bucket.rule.0.message': 'S3 Bucket为必填项', }; diff --git a/eiam-portal/src/main/portal-fe/src/pages/Account/Account.tsx b/eiam-portal/src/main/portal-fe/src/pages/Account/Account.tsx index 4cacf432..efe4a267 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Account/Account.tsx +++ b/eiam-portal/src/main/portal-fe/src/pages/Account/Account.tsx @@ -45,15 +45,15 @@ const AccountSettings = () => { const intl = useIntl(); const [initConfig, setInitConfig] = useState({ mode: 'inline', - selectKey: AccountSettingsStateKey.BASE, + selectKey: AccountSettingsStateKey.base, }); useAsyncEffect(async () => { - if (!type || !AccountSettingsStateKey[type.toUpperCase()]) { - setInitConfig({ ...initConfig, selectKey: AccountSettingsStateKey.BASE }); + if (!type || !AccountSettingsStateKey[type]) { + setInitConfig({ ...initConfig, selectKey: AccountSettingsStateKey.base }); history.replace({ pathname: location.pathname, - search: queryString.stringify({ type: AccountSettingsStateKey.BASE }), + search: queryString.stringify({ type: AccountSettingsStateKey.base }), }); return; } @@ -62,19 +62,19 @@ const AccountSettings = () => { const menu: ItemType[] = [ { - key: AccountSettingsStateKey.BASE, + key: AccountSettingsStateKey.base, label: intl.formatMessage({ id: 'page.account.menu.base', }), }, { - key: AccountSettingsStateKey.SECURITY, + key: AccountSettingsStateKey.security, label: intl.formatMessage({ id: 'page.account.menu.security', }), }, { - key: AccountSettingsStateKey.BIND, + key: AccountSettingsStateKey.bind, label: intl.formatMessage({ id: 'page.account.menu.bind', }), @@ -113,11 +113,11 @@ const AccountSettings = () => { const renderChildren = () => { const { selectKey } = initConfig; switch (selectKey) { - case AccountSettingsStateKey.BASE: + case AccountSettingsStateKey.base: return ; - case AccountSettingsStateKey.SECURITY: + case AccountSettingsStateKey.security: return ; - case AccountSettingsStateKey.BIND: + case AccountSettingsStateKey.bind: return ; default: return null; From 7720cc377da9c7e3f7fad885b874833cd18eef8a Mon Sep 17 00:00:00 2001 From: smallbun <2689170096@qq.com> Date: Fri, 8 Sep 2023 12:43:12 +0800 Subject: [PATCH 6/7] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/SmsProvider/SmsProvider.tsx | 7 +-- .../main/console-fe/src/services/typings.d.ts | 24 --------- .../main/portal-fe/src/pages/Login/service.ts | 51 +------------------ 3 files changed, 5 insertions(+), 77 deletions(-) diff --git a/eiam-console/src/main/console-fe/src/pages/setting/Message/components/SmsProvider/SmsProvider.tsx b/eiam-console/src/main/console-fe/src/pages/setting/Message/components/SmsProvider/SmsProvider.tsx index 8305fdb4..1c9731f1 100644 --- a/eiam-console/src/main/console-fe/src/pages/setting/Message/components/SmsProvider/SmsProvider.tsx +++ b/eiam-console/src/main/console-fe/src/pages/setting/Message/components/SmsProvider/SmsProvider.tsx @@ -45,6 +45,7 @@ import QiNiu from './QiNiu'; import Tencent from './Tencent'; import { Container } from '@/components/Container'; import { useIntl } from '@umijs/max'; +import { SmsTemplateList } from '@/pages/setting/Message/data'; const layout = { labelCol: { @@ -130,7 +131,7 @@ const TestModal = (props: { }; export default (props: { visible: boolean }) => { const [form] = Form.useForm(); - const editorFormRef = useRef>(); + const editorFormRef = useRef>(); const intl = useIntl(); const { message, modal } = App.useApp(); const actionRef = useRef(); @@ -144,7 +145,7 @@ export default (props: { visible: boolean }) => { const [enabled, setEnabled] = useState(false); const [language, setLanguage] = useState(Language.ZH); const [editableKeys, setEditableRowKeys] = useState(); - const [smsTemplateList, setSmsTemplateList] = useState(); + const [smsTemplateList, setSmsTemplateList] = useState(); const columns: ProColumns[] = [ { @@ -380,7 +381,7 @@ export default (props: { visible: boolean }) => { label={intl.formatMessage({ id: 'pages.setting.message.sms_provider.provider' })} rules={[{ required: true }]} fieldProps={{ - onChange: async (value) => { + onChange: async (value: string) => { setLoading(true); setProvider(value); //清理 diff --git a/eiam-console/src/main/console-fe/src/services/typings.d.ts b/eiam-console/src/main/console-fe/src/services/typings.d.ts index 6a725ab9..7e4300f5 100644 --- a/eiam-console/src/main/console-fe/src/services/typings.d.ts +++ b/eiam-console/src/main/console-fe/src/services/typings.d.ts @@ -422,28 +422,4 @@ declare namespace AppAPI { template: string; remark: string; }; - - /** - * 应用信息 - */ - export type GetApp = { - id: string; - type: string; - name: string; - icon: string; - template: string; - protocol: string; - protocolName: string; - clientId: string; - clientSecret: string; - //sso发起方 - initLoginType: string; - //sso登录链接 - initLoginUrl: string; - nameIdValueType: string; - //授权范围 - authorizationType: string; - enabled: boolean; - remark: string; - }; } diff --git a/eiam-portal/src/main/portal-fe/src/pages/Login/service.ts b/eiam-portal/src/main/portal-fe/src/pages/Login/service.ts index 0f1a650a..fec3207c 100644 --- a/eiam-portal/src/main/portal-fe/src/pages/Login/service.ts +++ b/eiam-portal/src/main/portal-fe/src/pages/Login/service.ts @@ -16,16 +16,9 @@ * along with this program. If not, see . */ import { request } from '@umijs/max'; -import type { LoginConfig, LoginParamsType, MfaFactor } from './data.d'; +import type { LoginConfig, LoginParamsType } from './data.d'; import { stringify } from 'querystring'; -/** - * 获取 Mfa 因素 - */ -export async function getMfaFactors(): Promise> { - return request('/api/v1/login/mfa/factors'); -} - /** * 账户登录 * @@ -74,32 +67,6 @@ export async function sendLoginCaptchaOpt( }); } -/** - * 发送MFA短信验证码 - */ -export async function sendMfaSmsOtp(): Promise> { - return request(`/api/v1/login/mfa/send`, { - method: 'POST', - data: stringify({ channel: 'sms' }), - skipErrorHandler: true, - }).catch((e) => { - throw e; - }); -} - -/** - * 发送MFA邮件验证码 - */ -export async function sendMfaEmailOtp(): Promise> { - return request(`/api/v1/login/mfa/send`, { - method: 'POST', - data: stringify({ channel: 'mail' }), - skipErrorHandler: true, - }).catch((e) => { - throw e; - }); -} - /** * 获取钉钉授权URL * @@ -115,22 +82,6 @@ export async function getDingtalkAuthorizeUrl( }); } -/** - * 获取钉钉授权URL - * - * @param params - */ -export async function loginMfaValidate( - params: Record, -): Promise> { - return request(`/api/v1/login/mfa/validate`, { - params: params, - skipErrorHandler: true, - }).catch(({ response: { data } }) => { - return data; - }); -} - /** * Idp绑定用户 */ From e97442208645fb224d39318235a8c0f1a85853ae Mon Sep 17 00:00:00 2001 From: smallbun <2689170096@qq.com> Date: Fri, 8 Sep 2023 18:56:14 +0800 Subject: [PATCH 7/7] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/app/AppGroupController.java | 2 +- .../converter/app/AppGroupConverter.java | 34 +++---------------- .../pojo/result/app/AppGroupListResult.java | 7 ++++ .../pojo/save/app/AppGroupCreateParam.java | 15 ++++---- .../pojo/update/app/AppGroupUpdateParam.java | 6 ---- .../portal/converter/AppGroupConverter.java | 10 +++--- 6 files changed, 25 insertions(+), 49 deletions(-) diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java b/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java index 0f635ae4..a99ec1fb 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/controller/app/AppGroupController.java @@ -59,7 +59,7 @@ import static cn.topiam.employee.common.constant.AppConstants.APP_PATH; @Tag(name = "应用分组管理") @RestController @AllArgsConstructor -@RequestMapping(value = APP_PATH + "/app_group", produces = MediaType.APPLICATION_JSON_VALUE) +@RequestMapping(value = APP_PATH + "/group", produces = MediaType.APPLICATION_JSON_VALUE) public class AppGroupController { /** diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/converter/app/AppGroupConverter.java b/eiam-console/src/main/java/cn/topiam/employee/console/converter/app/AppGroupConverter.java index 381b2fcd..3b3f1ee8 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/converter/app/AppGroupConverter.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/converter/app/AppGroupConverter.java @@ -96,21 +96,7 @@ public interface AppGroupConverter { * @param entity {@link AppGroupEntity} * @return {@link AppGroupListResult} */ - default AppGroupListResult entityConvertToAppGroupListResult(AppGroupEntity entity) { - if (entity == null) { - return null; - } - - AppGroupListResult appGroupListResult = new AppGroupListResult(); - if (entity.getId() != null) { - appGroupListResult.setId(String.valueOf(entity.getId())); - } - appGroupListResult.setName(entity.getName()); - appGroupListResult.setCode(entity.getCode()); - appGroupListResult.setEnabled(entity.getEnabled()); - appGroupListResult.setRemark(entity.getRemark()); - return appGroupListResult; - } + AppGroupListResult entityConvertToAppGroupListResult(AppGroupEntity entity); /** * 实体转分组返回 @@ -118,20 +104,7 @@ public interface AppGroupConverter { * @param entity {@link AppGroupEntity} * @return {@link AppGroupGetResult} */ - default AppGroupGetResult entityConvertToAppGroupResult(AppGroupEntity entity) { - if (entity == null) { - return null; - } - AppGroupGetResult appGroupGetResult = new AppGroupGetResult(); - - if (entity.getId() != null) { - appGroupGetResult.setId(String.valueOf(entity.getId())); - } - appGroupGetResult.setName(entity.getName()); - appGroupGetResult.setEnabled(entity.getEnabled()); - appGroupGetResult.setCreateTime(entity.getCreateTime()); - return appGroupGetResult; - } + AppGroupGetResult entityConvertToAppGroupResult(AppGroupEntity entity); /** * 将分组修改对象转换为entity @@ -139,12 +112,12 @@ public interface AppGroupConverter { * @param param {@link AppGroupUpdateParam} * @return {@link AppGroupEntity} */ + @Mapping(target = "enabled", ignore = true) @Mapping(target = "deleted", ignore = true) @Mapping(target = "updateTime", ignore = true) @Mapping(target = "updateBy", ignore = true) @Mapping(target = "createTime", ignore = true) @Mapping(target = "createBy", ignore = true) - @Mapping(target = "enabled", ignore = false) AppGroupEntity appGroupUpdateParamConverterToEntity(AppGroupUpdateParam param); /** @@ -153,6 +126,7 @@ public interface AppGroupConverter { * @param param {@link AppAccountCreateParam} * @return {@link AppAccountEntity} */ + @Mapping(target = "enabled", expression = "java(Boolean.TRUE)") @Mapping(target = "deleted", ignore = true) @Mapping(target = "id", ignore = true) @Mapping(target = "updateTime", ignore = true) diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/result/app/AppGroupListResult.java b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/result/app/AppGroupListResult.java index c8acdbf5..e32cf3a6 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/result/app/AppGroupListResult.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/result/app/AppGroupListResult.java @@ -18,6 +18,7 @@ package cn.topiam.employee.console.pojo.result.app; import java.io.Serializable; +import java.time.LocalDateTime; import lombok.Data; @@ -58,6 +59,12 @@ public class AppGroupListResult implements Serializable { @Parameter(description = "是否启用") private Boolean enabled; + /** + * 创建时间 + */ + @Parameter(description = "创建时间") + private LocalDateTime createTime; + /** * 备注 */ diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/save/app/AppGroupCreateParam.java b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/save/app/AppGroupCreateParam.java index b3210144..580f59d2 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/save/app/AppGroupCreateParam.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/save/app/AppGroupCreateParam.java @@ -31,7 +31,7 @@ import jakarta.validation.constraints.NotBlank; * Created by support@topiam.cn on 2023/8/31 23:26 */ @Data -@Schema(description = "分组保存入参") +@Schema(description = "应用分组保存入参") public class AppGroupCreateParam implements Serializable { /** @@ -41,16 +41,17 @@ public class AppGroupCreateParam implements Serializable { @Schema(description = "分组名称") private String name; + /** + * 分组编码 + */ + @NotBlank(message = "分组编码不能为空") + @Schema(description = "分组编码") + private String code; + /** * 备注 */ @Schema(description = "备注") private String remark; - /** - * 分组编码 - */ - @Schema(description = "分组编码") - private String code; - } diff --git a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/update/app/AppGroupUpdateParam.java b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/update/app/AppGroupUpdateParam.java index b0fff9ec..903d74f1 100644 --- a/eiam-console/src/main/java/cn/topiam/employee/console/pojo/update/app/AppGroupUpdateParam.java +++ b/eiam-console/src/main/java/cn/topiam/employee/console/pojo/update/app/AppGroupUpdateParam.java @@ -53,12 +53,6 @@ public class AppGroupUpdateParam implements Serializable { @Schema(description = "分组编码") private String code; - /** - * 分组是否启用 - */ - @Schema(description = "分组是否启用") - private Boolean enabled; - /** * 备注 */ diff --git a/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java b/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java index ab6c80f0..73a3881a 100644 --- a/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java +++ b/eiam-portal/src/main/java/cn/topiam/employee/portal/converter/AppGroupConverter.java @@ -30,6 +30,7 @@ import cn.topiam.employee.common.entity.app.AppGroupEntity; import cn.topiam.employee.common.entity.app.QAppGroupAssociationEntity; import cn.topiam.employee.common.entity.app.QAppGroupEntity; import cn.topiam.employee.portal.pojo.result.AppGroupListResult; +import org.mapstruct.Mapping; /** * 分组映射 @@ -61,9 +62,7 @@ public interface AppGroupConverter { */ default Predicate queryAppGroupAssociationPredicate() { QAppGroupAssociationEntity appGroupAssociation = QAppGroupAssociationEntity.appGroupAssociationEntity; - Predicate predicate = appGroupAssociation.deleted.eq(Boolean.FALSE); - //@formatter:on - return predicate; + return appGroupAssociation.deleted.eq(Boolean.FALSE); } /** @@ -78,9 +77,9 @@ public interface AppGroupConverter { List results = new ArrayList<>(); for (AppGroupEntity entity : list) { AppGroupListResult result = appGroupEntityConverterToResult(entity); - Long count = appGroupAssociationList.stream() + long count = appGroupAssociationList.stream() .filter(t -> t.getGroupId().equals(entity.getId())).count(); - result.setAppCount(Integer.valueOf(count.toString())); + result.setAppCount(Integer.valueOf(Long.toString(count))); results.add(result); } return results; @@ -92,6 +91,7 @@ public interface AppGroupConverter { * @param entity {@link AppGroupEntity} * @return {@link AppGroupEntity} */ + @Mapping(target = "appCount", ignore = true) AppGroupListResult appGroupEntityConverterToResult(AppGroupEntity entity); }