浙政钉

This commit is contained in:
zjf committed 2026-05-08 20:54:20 +08:00
1 parent 957641393c
commit 2636c9e0c3
4 files changed
+94 -1

No files matched your search

@@ -1 +1,2 @@
com.bsd.pjcloud.app.api.feign.RemoteAppUserService
com.bsd.pjcloud.app.api.feign.RemoteAppMenuService
@@ -13,6 +13,7 @@ import com.bsd.pjcloud.app.api.entity.AppMenuEntity;
import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.app.service.AppMenuService;
import org.springframework.security.access.prepost.PreAuthorize;
import com.bsd.pjcloud.common.excel.annotation.ResponseExcel;
@@ -25,7 +26,6 @@ import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
* 菜单管理
@@ -47,6 +47,20 @@ public class AppMenuController {
@Operation(summary = "分页查询", description = "分页查询")
@GetMapping("/app/list")
public R<List<AppMenuEntity>> appList(@ParameterObject AppMenuDto dto) {
return listVisibleAppMenus(dto);
}
/**
* 服务间调用:与 {@link #appList} 数据一致,需 Feign 携带内部调用头(见 {@code @NoToken} 与 {@link Inner})。
*/
@Inner(value = true)
@Operation(summary = "内部-App菜单列表", description = "供 integrated 等经 Feign 拉取,与 /app-menu/app/list 一致")
@GetMapping("/inner/app/list")
public R<List<AppMenuEntity>> innerAppList(@ParameterObject AppMenuDto dto) {
return listVisibleAppMenus(dto);
}
private R<List<AppMenuEntity>> listVisibleAppMenus(AppMenuDto dto) {
dto.setVisible(YesNoEnum.YES.getCode());
if (ObjectUtil.isNotEmpty(dto.getPlatformEnum())) {
dto.setPlatform(dto.getPlatformEnum().getType());
@@ -91,6 +91,11 @@
<artifactId>pjcloud-thirdparty-api</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>com.bsd</groupId>
<artifactId>pjcloud-app-server-api</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>com.bsd</groupId>
@@ -0,0 +1,73 @@
package com.bsd.pjcloud.integrated.controller;
import cn.hutool.core.util.StrUtil;
import com.bsd.pjcloud.app.api.constant.menu.AppMenuPlatformEnum;
import com.bsd.pjcloud.app.api.constant.menu.AppMenuTypeEnum;
import com.bsd.pjcloud.app.api.entity.AppMenuEntity;
import com.bsd.pjcloud.app.api.feign.RemoteAppMenuService;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.integrated.config.ExternalAppConfig;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* App 端菜单:开放路径凭 X-App-Id/Secret;已登录路径与 {@code /app-menu/app/list} 数据一致,经 Feign 调 app-server(租户头随 Feign 传递)。
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/appMenu")
@Tag(description = "appMenuOpen", name = "开放-App菜单")
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class AppMenuOpenController {
private final ExternalAppConfig externalAppConfig;
private final RemoteAppMenuService remoteAppMenuService;
/**
* 已登录(Bearer):与 app-server GET /app-menu/app/list 一致,走 integrated 统一前缀。
*/
@Operation(summary = "App菜单列表", description = "需登录,转发 app-server 内部菜单接口")
@GetMapping("/app/list")
public R<List<AppMenuEntity>> appList(
@RequestParam(value = "typeEnum", required = false) AppMenuTypeEnum typeEnum,
@RequestParam(value = "platformEnum", required = false) AppMenuPlatformEnum platformEnum) {
return remoteAppMenuService.innerAppList(typeEnum, platformEnum);
}
@Operation(summary = "开放-App菜单列表", description = "凭应用凭证访问,与 app-server /app-menu/app/list 数据一致")
@GetMapping("/open/app/list")
@Inner(value = false)
public R<List<AppMenuEntity>> openAppList(
@RequestHeader(value = "X-App-Id", required = false) String appId,
@RequestHeader(value = "X-App-Secret", required = false) String appSecret,
@RequestParam(value = "typeEnum", required = false) AppMenuTypeEnum typeEnum,
@RequestParam(value = "platformEnum", required = false) AppMenuPlatformEnum platformEnum) {
if (!isValidAppCredentials(appId, appSecret)) {
return R.failed("无效的应用ID或密钥");
}
return remoteAppMenuService.innerAppList(typeEnum, platformEnum);
}
private boolean isValidAppCredentials(String appId, String appSecret) {
if (StrUtil.isBlank(appId) || StrUtil.isBlank(appSecret)) {
return false;
}
if (externalAppConfig.getApps() != null) {
return externalAppConfig.getApps().stream()
.filter(ExternalAppConfig.AppCredential::getEnabled)
.anyMatch(app -> appId.equals(app.getAppId()) && appSecret.equals(app.getAppSecret()));
}
return false;
}
}