Skip to content

Commit 2df1c2c

Browse files
authored
feat(portal): 新增菜单显隐管理功能及相关配置支持 (#188)
- 在门户配置中添加 menuVisibility 字段控制菜单项显示状态 - 新增后台接口 /portal-config/ui 提供门户 UI 配置数据 - 新增 PortalMenuSettings 组件实现门户菜单显隐设置功能 - 在门户详情页添加菜单显隐管理菜单项入口 - 创建 PortalConfigContext 统一管理和提供菜单显隐状态 - 在前端 Header 组件及路由守卫动态控制菜单及路由访问权限 - HiCoding 功能开关支持终端功能启用状态,通过接口动态获取 - 终端功能禁用时拒绝 WebSocket 连接并隐藏终端面板 - Docker 及 Helm 部署脚本新增 JWT_SECRET 支持,增强安全性 - AcpProperties 配置新增 terminalEnabled 配置属性及注释说明 - RemoteWorkspaceService 过滤隐藏以点开头的文件名 - 统一完善配置项默认值和配置逻辑,保证升级及安装流程顺畅
1 parent 2c5b14b commit 2df1c2c

File tree

24 files changed

+429
-22
lines changed

24 files changed

+429
-22
lines changed

deploy/docker/docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ services:
145145
- DB_NAME=${DB_NAME:-portal_db}
146146
- DB_USERNAME=${DB_USERNAME:-portal_user}
147147
- DB_PASSWORD=${DB_PASSWORD:-himarket_app_2024}
148+
- JWT_SECRET=${JWT_SECRET}
148149
- ACP_REMOTE_HOST=${ACP_REMOTE_HOST:-sandbox-shared}
149150
- ACP_REMOTE_PORT=${ACP_REMOTE_PORT:-8080}
150151
- ACP_DEFAULT_RUNTIME=${ACP_DEFAULT_RUNTIME:-remote}

deploy/docker/install.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ load_config() {
366366
HIMARKET_SERVER_IMAGE HIMARKET_ADMIN_IMAGE HIMARKET_FRONTEND_IMAGE \
367367
MYSQL_IMAGE NACOS_IMAGE HIGRESS_IMAGE REDIS_IMAGE SANDBOX_IMAGE \
368368
MYSQL_ROOT_PASSWORD MYSQL_PASSWORD MYSQL_DATABASE MYSQL_USER \
369+
JWT_SECRET \
369370
NACOS_ADMIN_PASSWORD HIGRESS_USERNAME HIGRESS_PASSWORD \
370371
ADMIN_USERNAME ADMIN_PASSWORD FRONT_USERNAME FRONT_PASSWORD \
371372
HIMARKET_LANGUAGE \
@@ -593,6 +594,12 @@ interactive_config() {
593594
export DB_USERNAME="${MYSQL_USER:-portal_user}"
594595
export DB_PASSWORD="${MYSQL_PASSWORD}"
595596

597+
# ─── JWT Secret(自动生成随机值) ───
598+
if [[ -z "${JWT_SECRET:-}" ]]; then
599+
JWT_SECRET="$(openssl rand -base64 32)"
600+
fi
601+
export JWT_SECRET
602+
596603
# ─── 服务凭证 ───
597604
log ""
598605
log "$(msg section.credential)"
@@ -771,6 +778,9 @@ HIGRESS_IMAGE="${HIGRESS_IMAGE}"
771778
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD}"
772779
MYSQL_PASSWORD="${MYSQL_PASSWORD}"
773780
781+
# ========== JWT Secret ==========
782+
JWT_SECRET="${JWT_SECRET}"
783+
774784
# ========== 服务凭证 ==========
775785
NACOS_ADMIN_PASSWORD="${NACOS_ADMIN_PASSWORD}"
776786
HIGRESS_USERNAME="${HIGRESS_USERNAME}"

deploy/helm/himarket/templates/himarket-server-cm.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ data:
1111
ACP_REMOTE_HOST: {{ .Values.sandbox.remoteHost | default "sandbox-shared" | quote }}
1212
ACP_REMOTE_PORT: {{ .Values.sandbox.remotePort | default "8080" | quote }}
1313
ACP_DEFAULT_RUNTIME: {{ .Values.sandbox.defaultRuntime | default "remote" | quote }}
14+
ACP_TERMINAL_ENABLED: {{ .Values.sandbox.terminalEnabled | default false | quote }}
1415
# 其他非敏感配置可以在这里添加

deploy/helm/himarket/templates/mysql.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
{{- $existingSecret := (lookup "v1" "Secret" .Release.Namespace "mysql-secret") }}
2+
{{- $existingServerSecret := (lookup "v1" "Secret" .Release.Namespace "himarket-server-secret") }}
23
{{- $rootPassword := "" }}
34
{{- $userPassword := "" }}
5+
{{- $jwtSecret := "" }}
46
{{- if $existingSecret }}
57
{{- $rootPassword = (index $existingSecret.data "MYSQL_ROOT_PASSWORD" | b64dec) }}
68
{{- $userPassword = (index $existingSecret.data "MYSQL_PASSWORD" | b64dec) }}
@@ -16,6 +18,15 @@
1618
{{- $userPassword = randAlphaNum 16 }}
1719
{{- end }}
1820
{{- end }}
21+
{{- if $existingServerSecret }}
22+
{{- $jwtSecret = (index $existingServerSecret.data "JWT_SECRET" | b64dec) }}
23+
{{- else }}
24+
{{- if .Values.server.jwtSecret }}
25+
{{- $jwtSecret = .Values.server.jwtSecret }}
26+
{{- else }}
27+
{{- $jwtSecret = randAlphaNum 32 }}
28+
{{- end }}
29+
{{- end }}
1930
---
2031
# MySQL Secret: 存储敏感的数据库凭据(自动生成随机密码)
2132
apiVersion: v1
@@ -46,6 +57,7 @@ stringData:
4657
DB_NAME: {{ .Values.mysql.auth.database | quote }}
4758
DB_USERNAME: {{ .Values.mysql.auth.username | quote }}
4859
DB_PASSWORD: {{ $userPassword | quote }}
60+
JWT_SECRET: {{ $jwtSecret | quote }}
4961

5062
---
5163
# MySQL Headless Service: 为 StatefulSet 提供稳定的网络域

deploy/helm/himarket/values.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ server:
3232
port: 80
3333
replicaCount: 1
3434
serverPort: 8080
35+
# JWT Secret(留空则自动生成随机值)
36+
jwtSecret: ""
3537

3638
# MySQL 数据库配置(始终部署内置 MySQL)
3739
mysql:
@@ -86,6 +88,7 @@ resources:
8688
# 共享沙箱配置
8789
sandbox:
8890
enabled: true
91+
terminalEnabled: false
8992
image:
9093
repository: sandbox
9194
tag: "latest"

deploy/helm/install.sh

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ load_config() {
522522
NACOS_VERSION NACOS_IMAGE_REGISTRY NACOS_IMAGE_REPOSITORY \
523523
HIGRESS_REPO_NAME HIGRESS_REPO_URL HIGRESS_CHART_REF \
524524
MYSQL_ROOT_PASSWORD MYSQL_PASSWORD \
525+
JWT_SECRET \
525526
NACOS_ADMIN_PASSWORD HIGRESS_USERNAME HIGRESS_PASSWORD \
526527
ADMIN_USERNAME ADMIN_PASSWORD FRONT_USERNAME FRONT_PASSWORD \
527528
MYSQL_STORAGE_CLASS MYSQL_STORAGE_SIZE SANDBOX_STORAGE_CLASS SANDBOX_STORAGE_SIZE \
@@ -753,6 +754,10 @@ interactive_config() {
753754
NACOS_IMAGE_REPOSITORY="${NACOS_IMAGE_REPOSITORY:-nacos/nacos-server}"
754755
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD:-himarket_root_2024}"
755756
MYSQL_PASSWORD="${MYSQL_PASSWORD:-himarket_app_2024}"
757+
# JWT Secret: 升级时沿用已有值,全新安装时自动生成
758+
if [[ -z "${JWT_SECRET:-}" ]]; then
759+
JWT_SECRET="$(openssl rand -base64 32)"
760+
fi
756761
NACOS_ADMIN_PASSWORD="${NACOS_ADMIN_PASSWORD:-nacos}"
757762
HIGRESS_USERNAME="${HIGRESS_USERNAME:-admin}"
758763
HIGRESS_PASSWORD="${HIGRESS_PASSWORD:-admin}"
@@ -808,6 +813,11 @@ interactive_config() {
808813
prompt MYSQL_ROOT_PASSWORD "MySQL root password" "himarket_root_2024"
809814
prompt MYSQL_PASSWORD "MySQL app password" "himarket_app_2024"
810815

816+
# JWT Secret: 自动生成随机值(无需用户交互)
817+
if [[ -z "${JWT_SECRET:-}" ]]; then
818+
JWT_SECRET="$(openssl rand -base64 32)"
819+
fi
820+
811821
log ""
812822
log "$(msg section.credential)"
813823
prompt NACOS_ADMIN_PASSWORD "Nacos admin password" "nacos"
@@ -1008,6 +1018,9 @@ HIGRESS_CHART_REF="${HIGRESS_CHART_REF}"
10081018
MYSQL_ROOT_PASSWORD="${MYSQL_ROOT_PASSWORD}"
10091019
MYSQL_PASSWORD="${MYSQL_PASSWORD}"
10101020
1021+
# ========== JWT Secret ==========
1022+
JWT_SECRET="${JWT_SECRET}"
1023+
10111024
# ========== 服务凭证 ==========
10121025
NACOS_ADMIN_PASSWORD="${NACOS_ADMIN_PASSWORD}"
10131026
HIGRESS_USERNAME="${HIGRESS_USERNAME}"
@@ -1129,7 +1142,8 @@ deploy_all() {
11291142
--set "mysql.persistence.storageClass=${MYSQL_STORAGE_CLASS}" \
11301143
--set "mysql.persistence.size=${MYSQL_STORAGE_SIZE}" \
11311144
--set "sandbox.persistence.storageClass=${SANDBOX_STORAGE_CLASS}" \
1132-
--set "sandbox.persistence.size=${SANDBOX_STORAGE_SIZE}"
1145+
--set "sandbox.persistence.size=${SANDBOX_STORAGE_SIZE}" \
1146+
--set "server.jwtSecret=${JWT_SECRET}"
11331147

11341148
# 7. 等待 MySQL Pod 就绪 + 初始化 Nacos 数据库
11351149
init_nacos_db_in_cluster "${NS}" "${MYSQL_ROOT_PASSWORD}" "${NACOS_DB_NAME}"

himarket-bootstrap/src/main/resources/application.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,11 @@ springdoc:
3737
packages-to-scan: com.alibaba.himarket.controller
3838

3939
jwt:
40-
secret: YourJWTSecret
40+
secret: ${JWT_SECRET:YourJWTSecret}
4141
expiration: 7d
4242

4343
acp:
44+
terminal-enabled: ${ACP_TERMINAL_ENABLED:false}
4445
default-provider: ${ACP_DEFAULT_PROVIDER:qwen-code}
4546
default-runtime: ${ACP_DEFAULT_RUNTIME:remote}
4647
remote:

himarket-dal/src/main/java/com/alibaba/himarket/support/portal/PortalUiConfig.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package com.alibaba.himarket.support.portal;
2121

22+
import java.util.Map;
2223
import lombok.Data;
2324

2425
@Data
@@ -27,4 +28,6 @@ public class PortalUiConfig {
2728
private String logo;
2829

2930
private String icon;
31+
32+
private Map<String, Boolean> menuVisibility;
3033
}

himarket-server/src/main/java/com/alibaba/himarket/config/AcpProperties.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
@ConfigurationProperties(prefix = "acp")
1010
public class AcpProperties {
1111

12+
/**
13+
* 是否启用终端功能。
14+
* 设为 false 时后端拒绝 Terminal WebSocket 连接,前端隐藏终端面板。
15+
*/
16+
private boolean terminalEnabled = true;
17+
1218
/**
1319
* 默认使用的 CLI provider key(对应 providers map 中的 key)
1420
*/
@@ -32,6 +38,14 @@ public class AcpProperties {
3238
*/
3339
private RemoteConfig remote = new RemoteConfig();
3440

41+
public boolean isTerminalEnabled() {
42+
return terminalEnabled;
43+
}
44+
45+
public void setTerminalEnabled(boolean terminalEnabled) {
46+
this.terminalEnabled = terminalEnabled;
47+
}
48+
3549
public String getDefaultProvider() {
3650
return defaultProvider;
3751
}

himarket-server/src/main/java/com/alibaba/himarket/controller/CliProviderController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,12 @@ private MarketModelInfo buildMarketModelInfo(ProductResult product) {
338338
.build();
339339
}
340340

341+
@Operation(summary = "获取 HiCoding 功能开关状态")
342+
@GetMapping("/features")
343+
public Map<String, Boolean> getFeatures() {
344+
return Map.of("terminalEnabled", acpProperties.isTerminalEnabled());
345+
}
346+
341347
@Operation(summary = "获取可用的 CLI Provider 列表(含运行时兼容性信息)")
342348
@GetMapping
343349
public List<CliProviderInfo> listProviders() {

0 commit comments

Comments
 (0)