同步平台业务模块能力

This commit is contained in:
baiyanyun
2026-07-13 09:13:30 +08:00
parent e612f5e434
commit a1a38f62d8
224 changed files with 22331 additions and 1224 deletions

View File

@@ -142,6 +142,12 @@ public class TenantConfigDto implements Serializable {
private String mpAppId;
private String mpAppSecret;
@Schema(description = "公众号 appId微信内 H5 JSAPI / OAuth")
private String oaAppId;
@Schema(description = "公众号 secret")
private String oaAppSecret;
private String sandboxConfig;
private boolean enabledSandbox;
private Boolean supportCustomDomain;

View File

@@ -34,4 +34,6 @@ public interface AuthService {
String newTicket(UserDto userDto, String token);
String getTokenByTicket(String ticket);
String newEcoToken(String tenantClientId, String tenantSecret, UserDto user);
}

View File

@@ -31,6 +31,11 @@ public interface SpaceApplicationService {
*/
List<SpaceDto> queryListByUserId(Long userId);
/**
* 查询用户的个人空间ID
*/
Long getPersonalSpaceId(Long userId);
/**
* 查询空间用户列表
*/

View File

@@ -76,6 +76,11 @@ public interface SysGroupApplicationService {
*/
List<SysGroup> getEffectiveGroupListByUserId(Long userId);
/**
* 查询用户当前系统订阅套餐关联的用户组(不含 sys_user_group 直接绑定,仅启用状态)
*/
List<SysGroup> getSubscriptionGroupListByUserId(Long userId);
/**
* 查询用户可用于系统登录的已授权用户组(启用、授权开启、未过期)
*/
@@ -123,4 +128,3 @@ public interface SysGroupApplicationService {
}

View File

@@ -17,6 +17,7 @@ import com.xspaceagi.system.spec.utils.I18nUtil;
import com.xspaceagi.system.spec.utils.JwtUtils;
import com.xspaceagi.system.spec.utils.RedisUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -25,6 +26,7 @@ import org.springframework.util.Assert;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class AuthServiceImpl implements AuthService {
@@ -271,4 +273,18 @@ public class AuthServiceImpl implements AuthService {
}
return null;
}
@Override
public String newEcoToken(String tenantClientId, String tenantSecret, UserDto user) {
TenantConfigDto tenantConfig = (TenantConfigDto) RequestContext.get().getTenantConfig();
Map<String, String> data = Map.of(
"clientId", tenantClientId,
"clientSiteUrl", tenantConfig.getSiteUrl(),
"userId", user.getId().toString(),
"role", user.getRole().name()
);
log.info("newEcoToken: {}, userId {}, userName {}", data, user.getId(), user.getUserName());
return JwtUtils.createJwt(String.valueOf(user.getId()), "user" + user.getId(), tenantSecret, 86400, data);
}
}

View File

@@ -178,7 +178,7 @@ public class PermissionImportServiceImpl implements PermissionImportService {
}
/**
* 基于差异 JSON 导入:对差异中的新增 / 修改记录做 upsert不处理删除
* 基于差异 JSON 导入:对差异中的新增/修改记录做 upsert对 removed 记录做物理删除
*/
@SuppressWarnings("unchecked")
private void doImportDiff(Tenant tenant, String version) {
@@ -243,6 +243,16 @@ public class PermissionImportServiceImpl implements PermissionImportService {
}
}
}
List<Map<String, Object>> removedResources = (List<Map<String, Object>>) resources.get("removed");
if (CollectionUtils.isNotEmpty(removedResources)) {
for (Map<String, Object> m : removedResources) {
String code = (String) m.get("code");
if (StringUtils.isBlank(code)) continue;
sysResourceService.remove(Wrappers.<SysResource>lambdaQuery()
.eq(SysResource::getTenantId, tenantId)
.eq(SysResource::getCode, code));
}
}
}
// 2. Menu
@@ -272,6 +282,16 @@ public class PermissionImportServiceImpl implements PermissionImportService {
}
}
}
List<Map<String, Object>> removedMenus = (List<Map<String, Object>>) menus.get("removed");
if (CollectionUtils.isNotEmpty(removedMenus)) {
for (Map<String, Object> m : removedMenus) {
String code = (String) m.get("code");
if (StringUtils.isBlank(code)) continue;
sysMenuService.remove(Wrappers.<SysMenu>lambdaQuery()
.eq(SysMenu::getTenantId, tenantId)
.eq(SysMenu::getCode, code));
}
}
}
// 3. Role
@@ -301,6 +321,16 @@ public class PermissionImportServiceImpl implements PermissionImportService {
}
}
}
List<Map<String, Object>> removedRoles = (List<Map<String, Object>>) roles.get("removed");
if (CollectionUtils.isNotEmpty(removedRoles)) {
for (Map<String, Object> m : removedRoles) {
String code = (String) m.get("code");
if (StringUtils.isBlank(code)) continue;
sysRoleService.remove(Wrappers.<SysRole>lambdaQuery()
.eq(SysRole::getTenantId, tenantId)
.eq(SysRole::getCode, code));
}
}
}
// 4. Group
@@ -330,6 +360,16 @@ public class PermissionImportServiceImpl implements PermissionImportService {
}
}
}
List<Map<String, Object>> removedGroups = (List<Map<String, Object>>) groups.get("removed");
if (CollectionUtils.isNotEmpty(removedGroups)) {
for (Map<String, Object> m : removedGroups) {
String code = (String) m.get("code");
if (StringUtils.isBlank(code)) continue;
sysGroupService.remove(Wrappers.<SysGroup>lambdaQuery()
.eq(SysGroup::getTenantId, tenantId)
.eq(SysGroup::getCode, code));
}
}
}
// 5. MenuResource
@@ -363,6 +403,19 @@ public class PermissionImportServiceImpl implements PermissionImportService {
resolveOrCreateMenuResource(tenantId, menuId, resourceId, dto);
}
}
List<Map<String, Object>> removedMenuResources = (List<Map<String, Object>>) menuResources.get("removed");
if (CollectionUtils.isNotEmpty(removedMenuResources)) {
for (Map<String, Object> m : removedMenuResources) {
MenuResourceExportDto mrDto = JsonSerializeUtil.parseObject(JsonSerializeUtil.toJSONString(m), MenuResourceExportDto.class);
Long menuId = menuCodeToId.get(mrDto.getMenuCode());
Long resourceId = resourceCodeToId.get(mrDto.getResourceCode());
if (menuId == null || resourceId == null) continue;
sysMenuResourceService.remove(Wrappers.<SysMenuResource>lambdaQuery()
.eq(SysMenuResource::getTenantId, tenantId)
.eq(SysMenuResource::getMenuId, menuId)
.eq(SysMenuResource::getResourceId, resourceId));
}
}
}
// 6. RoleMenu
@@ -398,6 +451,19 @@ public class PermissionImportServiceImpl implements PermissionImportService {
resolveOrCreateRoleMenu(tenantId, roleId, menuId, dto, resourceTreeJson);
}
}
List<Map<String, Object>> removedRoleMenus = (List<Map<String, Object>>) roleMenus.get("removed");
if (CollectionUtils.isNotEmpty(removedRoleMenus)) {
for (Map<String, Object> m : removedRoleMenus) {
RoleMenuExportDto rmDto = JsonSerializeUtil.parseObject(JsonSerializeUtil.toJSONString(m), RoleMenuExportDto.class);
Long roleId = roleCodeToId.get(rmDto.getRoleCode());
Long menuId = menuCodeToId.get(rmDto.getMenuCode());
if (roleId == null || menuId == null) continue;
sysRoleMenuService.remove(Wrappers.<SysRoleMenu>lambdaQuery()
.eq(SysRoleMenu::getTenantId, tenantId)
.eq(SysRoleMenu::getRoleId, roleId)
.eq(SysRoleMenu::getMenuId, menuId));
}
}
}
// 7. GroupMenu
@@ -433,6 +499,19 @@ public class PermissionImportServiceImpl implements PermissionImportService {
resolveOrCreateGroupMenu(tenantId, groupId, menuId, dto, resourceTreeJson);
}
}
List<Map<String, Object>> removedGroupMenus = (List<Map<String, Object>>) groupMenus.get("removed");
if (CollectionUtils.isNotEmpty(removedGroupMenus)) {
for (Map<String, Object> m : removedGroupMenus) {
GroupMenuExportDto gmDto = JsonSerializeUtil.parseObject(JsonSerializeUtil.toJSONString(m), GroupMenuExportDto.class);
Long groupId = groupCodeToId.get(gmDto.getGroupCode());
Long menuId = menuCodeToId.get(gmDto.getMenuCode());
if (groupId == null || menuId == null) continue;
sysGroupMenuService.remove(Wrappers.<SysGroupMenu>lambdaQuery()
.eq(SysGroupMenu::getTenantId, tenantId)
.eq(SysGroupMenu::getGroupId, groupId)
.eq(SysGroupMenu::getMenuId, menuId));
}
}
}
// 8. DataPermission
@@ -464,6 +543,18 @@ public class PermissionImportServiceImpl implements PermissionImportService {
resolveOrCreateDataPermission(tenantId, dto, targetId);
}
}
List<Map<String, Object>> removedDataPermissions = (List<Map<String, Object>>) dataPermissions.get("removed");
if (CollectionUtils.isNotEmpty(removedDataPermissions)) {
for (Map<String, Object> m : removedDataPermissions) {
DataPermissionExportDto dpDto = JsonSerializeUtil.parseObject(JsonSerializeUtil.toJSONString(m), DataPermissionExportDto.class);
Long targetId = resolveTargetId(dpDto, roleCodeToId, groupCodeToId);
if (targetId == null) continue;
sysDataPermissionService.remove(Wrappers.<SysDataPermission>lambdaQuery()
.eq(SysDataPermission::getTenantId, tenantId)
.eq(SysDataPermission::getTargetType, dpDto.getTargetType())
.eq(SysDataPermission::getTargetId, targetId));
}
}
}
log.info("权限差异导入完成租户ID{},版本:{}", tenantId, version);

View File

@@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@@ -108,17 +109,39 @@ public class SpaceApplicationServiceImpl implements SpaceApplicationService, Spa
@Override
public List<SpaceDto> queryListByUserId(Long userId) {
List<Space> spaceList = spaceDomainService.queryListByIds(spaceDomainService.querySpaceUserListByUserId(userId).stream().map(SpaceUser::getSpaceId).toList());
List<SpaceUser> spaceUsers = spaceDomainService.querySpaceUserListByUserId(userId);
Map<Long, SpaceUser> spaceUserMap = spaceUsers.stream().collect(Collectors.toMap(SpaceUser::getSpaceId, (s1) -> s1, (s1, s2) -> s1));
List<Long> ids = spaceUsers.stream().map(SpaceUser::getSpaceId).toList();
List<Space> spaceList = spaceDomainService.queryListByIds(ids);
if (spaceList != null) {
return spaceList.stream().map(space -> {
SpaceDto spaceDto = new SpaceDto();
BeanUtils.copyProperties(space, spaceDto);
if (spaceUserMap.get(spaceDto.getId()) != null) {
spaceDto.setCurrentUserRole(spaceUserMap.get(spaceDto.getId()).getRole());
}
return spaceDto;
}).collect(Collectors.toList());
}
return new ArrayList<>();
}
@Override
public Long getPersonalSpaceId(Long userId) {
Space personalSpace = null;
List<Space> spaceList = spaceDomainService.queryListByIds(spaceDomainService.querySpaceUserListByUserId(userId).stream().map(SpaceUser::getSpaceId).toList());
if (spaceList != null) {
personalSpace = spaceList.stream()
.filter(s -> s.getType() == Space.Type.Personal)
.findFirst()
.orElse(null);
}
if (personalSpace == null) {
throw BizException.of(ErrorCodeEnum.INVALID_PARAM, BizExceptionCodeEnum.agentUserNoPersonalSpace);
}
return personalSpace.getId();
}
@Override
public List<SpaceUserDto> querySpaceUserList(Long spaceId) {
List<SpaceUser> spaceUserList = spaceDomainService.querySpaceUserList(spaceId);

View File

@@ -144,6 +144,22 @@ public class SysGroupApplicationServiceImpl implements SysGroupApplicationServic
: groupList.stream().filter(g -> StatusEnum.isEnabled(g.getStatus())).toList();
}
@Override
public List<SysGroup> getSubscriptionGroupListByUserId(Long userId) {
if (userId == null) {
return List.of();
}
List<Long> subscriptionGroupIds = getSubscriptionPlanGroupIds(userId);
if (CollectionUtils.isEmpty(subscriptionGroupIds)) {
return List.of();
}
List<SysGroup> groups = listGroupsByIds(subscriptionGroupIds);
if (CollectionUtils.isEmpty(groups)) {
return List.of();
}
return groups.stream().filter(g -> StatusEnum.isEnabled(g.getStatus())).toList();
}
@Override
public List<SysGroup> getAuthorizedGroupListForLogin(Long userId) {
return filterAuthorizedGroupsForLogin(getEffectiveGroupListByUserId(userId));

View File

@@ -153,6 +153,14 @@ public class SysUserPermissionServiceImpl implements SysUserPermissionService {
MenuNode menuNode = menuNodes.get(0);
menuNode.setChildren(null);
// 多个角色/用户组时取最大权限ALL(1) > PART(2) > NONE(0)
Integer mergedMenuBindType = menuNodes.stream()
.map(MenuNode::getMenuBindType)
.filter(Objects::nonNull)
.max(Comparator.comparingInt(SysUserPermissionServiceImpl::menuBindTypePriority))
.orElse(BindTypeEnum.NONE.getCode());
menuNode.setMenuBindType(mergedMenuBindType);
// 合并资源(先打平再按 resourceId 分组)
List<ResourceNode> flatResources = menuNodes.stream()
.filter(n -> CollectionUtils.isNotEmpty(n.getResourceTree()))
@@ -193,6 +201,25 @@ public class SysUserPermissionServiceImpl implements SysUserPermissionService {
return result;
}
/**
* 菜单绑定类型优先级ALL(1) > PART(2) > NONE(0)
*/
private static int menuBindTypePriority(Integer bindType) {
if (bindType == null) {
return 0;
}
if (BindTypeEnum.ALL.getCode().equals(bindType)) {
return 3;
}
if (BindTypeEnum.PART.getCode().equals(bindType)) {
return 2;
}
if (BindTypeEnum.NONE.getCode().equals(bindType)) {
return 1;
}
return 0;
}
/**
* 资源绑定类型优先级ALL(1) > PART(2) > NONE(0)
*/

View File

@@ -2,6 +2,8 @@ package com.xspaceagi.system.application.service.impl;
import com.alibaba.fastjson2.JSON;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.xspaceagi.eco.market.sdk.constant.EcoMarketRegisterTaskConstant;
import com.xspaceagi.eco.market.sdk.model.ClientSecretDTO;
import com.xspaceagi.eco.market.sdk.service.IEcoMarketSecretRpcService;
import com.xspaceagi.pay.spec.gateway.PayGatewayOutboundCacheEvictSupport;
import com.xspaceagi.pay.spec.gateway.PayGatewayOutboundCacheEvictor;
@@ -13,11 +15,14 @@ import com.xspaceagi.system.infra.dao.entity.TenantConfig;
import com.xspaceagi.system.infra.dao.entity.User;
import com.xspaceagi.system.infra.dao.service.TenantConfigService;
import com.xspaceagi.system.infra.dao.service.TenantService;
import com.xspaceagi.system.sdk.service.ScheduleTaskApiService;
import com.xspaceagi.system.sdk.service.dto.ScheduleTaskDto;
import com.xspaceagi.system.spec.common.RequestContext;
import com.xspaceagi.system.spec.enums.ErrorCodeEnum;
import com.xspaceagi.system.spec.exception.BizException;
import com.xspaceagi.system.spec.exception.BizExceptionCodeEnum;
import com.xspaceagi.system.spec.utils.RedisUtil;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -30,6 +35,7 @@ import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Date;
import java.util.stream.Collectors;
@Slf4j
@@ -49,17 +55,40 @@ public class TenantConfigApplicationServiceImpl implements TenantConfigApplicati
private UserApplicationService userApplicationService;
@Resource
private IEcoMarketSecretRpcService ecoMarketSecretRpcService;
private ScheduleTaskApiService scheduleTaskApiService;
@Autowired(required = false)
private PayGatewayOutboundCacheEvictor payGatewayOutboundCacheEvictor;
@Resource
private IEcoMarketSecretRpcService iEcoMarketSecretRpcService;
@Value("${app.version:1.0.0}")
private String newVersion;
@Value("${license:}")
private String license;
@Value("${eco-market.server.enabled:false}")
private boolean ecoMarketServerEnabled;
@PostConstruct
private void startUpRegisterEco() {
if (!ecoMarketServerEnabled) {
log.info("Eco market remote server disabled, skip startup registration task");
return;
}
ClientSecretDTO secretDTO = iEcoMarketSecretRpcService.getByTenantId(1L);
if (secretDTO != null) {
return;
}
Tenant t = new Tenant();
t.setId(1L);
t.setName("Qiming AgentOS");
t.setDescription("Qiming AgentOS");
scheduleEcoMarketRegisterTask(t);
}
@Override
public List<TenantConfigItemDto> getTenantConfigList() {
String lockKey = "lock-for-check-tenant-config:" + RequestContext.get().getTenantId();
@@ -207,9 +236,36 @@ public class TenantConfigApplicationServiceImpl implements TenantConfigApplicati
RequestContext.setThreadTenantId(tenant.getId());
userApplicationService.add(userDto);
// 注册生态市场客户端,注册成功后初始化租户信息
ecoMarketSecretRpcService.registerClient(tenant.getId(), tenant.getName(), tenant.getDescription());
log.info("注册生态市场客户端成功: tenantId={}", tenant.getId());
// 注册任务
scheduleEcoMarketRegisterTask(tenant);
}
private void scheduleEcoMarketRegisterTask(Tenant tenant) {
if (!ecoMarketServerEnabled) {
log.info("Eco market remote server disabled, skip register task scheduling: tenantId={}", tenant.getId());
return;
}
try {
Map<String, Object> params = new HashMap<>();
params.put("tenantId", tenant.getId());
params.put("name", tenant.getName());
params.put("description", tenant.getDescription() != null ? tenant.getDescription() : "");
Long taskId = scheduleTaskApiService.start(ScheduleTaskDto.builder()
.tenantId(tenant.getId())
.taskId(EcoMarketRegisterTaskConstant.taskIdForTenant(tenant.getId()))
.beanId(EcoMarketRegisterTaskConstant.BEAN_ID)
.taskName("注册生态市场客户端")
.targetType("Tenant")
.targetId(String.valueOf(tenant.getId()))
.maxExecTimes(Long.MAX_VALUE)
.cron(ScheduleTaskDto.Cron.EVERY_MINUTE.getCron())
.lockTime(new Date())
.params(params)
.build());
log.info("已调度生态市场注册任务: tenantId={}, scheduleTaskId={}", tenant.getId(), taskId);
} catch (Exception e) {
log.warn("调度生态市场注册任务失败,租户已创建,可稍后通过生态市场功能触发懒注册: tenantId={}", tenant.getId(), e);
}
}
@Override

View File

@@ -24,7 +24,7 @@ public class DefaultIconUrlUtil {
}
public static String setDefaultIconUrl(String originalIcon, String name, String type) {
if (StringUtils.isBlank(name)) {
if (StringUtils.isBlank(name) || RequestContext.get() == null) {
return originalIcon;
}
//避免名字太长引起url超长

View File

@@ -0,0 +1,112 @@
[
{
"type": "System",
"side": "Mobile",
"module": "Chat",
"dataId": "-1",
"lang": "en-US",
"fieldKey": "Mobile.Chat.callLimitLabel",
"fieldValue": "Available Calls",
"remark": null
},
{
"type": "System",
"side": "Mobile",
"module": "Chat",
"dataId": "-1",
"lang": "en-US",
"fieldKey": "Mobile.Chat.subscriptionModalTitle",
"fieldValue": "Select Subscription Plan",
"remark": null
},
{
"type": "System",
"side": "PC",
"module": "Pages",
"dataId": "-1",
"lang": "en-US",
"fieldKey": "PC.Pages.MorePage.MyEarnings.confirmWithdrawDesc",
"fieldValue": "The withdrawal amount is {0} Yuan, the platform service fee is {1} Yuan, and the actual amount received is {2} Yuan.",
"remark": null
},
{
"type": "System",
"side": "Mobile",
"module": "Chat",
"dataId": "-1",
"lang": "zh-CN",
"fieldKey": "Mobile.Chat.callLimitLabel",
"fieldValue": "可调用次数",
"remark": null
},
{
"type": "System",
"side": "Mobile",
"module": "Chat",
"dataId": "-1",
"lang": "zh-CN",
"fieldKey": "Mobile.Chat.subscriptionModalTitle",
"fieldValue": "选择订阅套餐",
"remark": null
},
{
"type": "System",
"side": "Mobile",
"module": "Chat",
"dataId": "-1",
"lang": "zh-CN",
"fieldKey": "Mobile.Chat.unlimited",
"fieldValue": "不限制",
"remark": null
},
{
"type": "System",
"side": "PC",
"module": "Pages",
"dataId": "-1",
"lang": "zh-CN",
"fieldKey": "PC.Pages.MorePage.MyEarnings.confirmWithdrawDesc",
"fieldValue": "本次提现金额为 {0} 元,平台服务费 {1} 元,实际到账 {2} 元。",
"remark": null
},
{
"type": "System",
"side": "Mobile",
"module": "Chat",
"dataId": "-1",
"lang": "zh-TW",
"fieldKey": "Mobile.Chat.callLimitLabel",
"fieldValue": "可調用次數",
"remark": null
},
{
"type": "System",
"side": "Mobile",
"module": "Chat",
"dataId": "-1",
"lang": "zh-TW",
"fieldKey": "Mobile.Chat.subscriptionModalTitle",
"fieldValue": "選擇訂閱套餐",
"remark": null
},
{
"type": "System",
"side": "Mobile",
"module": "Chat",
"dataId": "-1",
"lang": "zh-TW",
"fieldKey": "Mobile.Chat.unlimited",
"fieldValue": "不限制",
"remark": null
},
{
"type": "System",
"side": "PC",
"module": "Pages",
"dataId": "-1",
"lang": "zh-TW",
"fieldKey": "PC.Pages.MorePage.MyEarnings.confirmWithdrawDesc",
"fieldValue": "本次提現金額為 {0} 元,平台服務費 {1} 元,實際到賬 {2} 元。",
"remark": null
}
]

View File

@@ -1,5 +1,5 @@
{
"version": "1.4",
"version": "1.6",
"resources": [
{
"code": "space",
@@ -225,6 +225,15 @@
"sortIndex": 25,
"status": 1
},
{
"code": "display_recommend_manage",
"name": "展示推荐模块",
"description": "展示推荐模块",
"source": 1,
"type": 1,
"sortIndex": 26,
"status": 1
},
{
"code": "category_config_query",
"name": "查询",
@@ -865,6 +874,16 @@
"sortIndex": 1,
"status": 1
},
{
"code": "display_recommend_query",
"name": "查询",
"description": "查询",
"source": 1,
"type": 2,
"parentCode": "display_recommend_manage",
"sortIndex": 1,
"status": 1
},
{
"code": "i18n_lang_query",
"name": "查询",
@@ -994,6 +1013,16 @@
"sortIndex": 2,
"status": 1
},
{
"code": "display_recommend_save",
"name": "保存",
"description": "保存",
"source": 1,
"type": 2,
"parentCode": "display_recommend_manage",
"sortIndex": 2,
"status": 1
},
{
"code": "i18n_lang_add",
"name": "新增",
@@ -1103,6 +1132,16 @@
"sortIndex": 3,
"status": 1
},
{
"code": "display_recommend_delete",
"name": "删除",
"description": "删除",
"source": 1,
"type": 2,
"parentCode": "display_recommend_manage",
"sortIndex": 3,
"status": 1
},
{
"code": "i18n_lang_modify",
"name": "编辑",
@@ -2279,7 +2318,7 @@
"name": "生态市场",
"description": "生态市场",
"source": 1,
"path": "/ecosystem/mcp",
"path": "%siteUrl%/api/eco/redirect",
"openType": 1,
"icon": "",
"sortIndex": 5,
@@ -2414,7 +2453,7 @@
"parentCode": "workspace",
"code": "component_lib_dev",
"name": "组件资源",
"description": "组件",
"description": "组件资源",
"source": 1,
"path": "/space/:spaceId/library",
"openType": 1,
@@ -2537,6 +2576,7 @@
"source": 1,
"path": "/space/:spaceId/resource-pricing",
"openType": 1,
"icon": "",
"sortIndex": 6,
"status": 1
},
@@ -2551,6 +2591,17 @@
"sortIndex": 6,
"status": 1
},
{
"parentCode": "more_page",
"code": "history_conversation",
"name": "历史会话",
"source": 1,
"path": "/more-page/history-conversation",
"openType": 1,
"icon": "",
"sortIndex": 7,
"status": 1
},
{
"parentCode": "workspace",
"code": "im_channel",
@@ -2600,9 +2651,9 @@
},
{
"parentCode": "system_manage",
"code": "permission_manage",
"name": "菜单权限",
"description": "菜单权限",
"code": "recommend_manage",
"name": "推荐管理",
"description": "推荐管理",
"source": 1,
"openType": 1,
"icon": "",
@@ -2622,24 +2673,23 @@
"status": 1
},
{
"parentCode": "workspace",
"code": "space_square",
"name": "空间广场",
"description": "空间广场",
"parentCode": "system_manage",
"code": "permission_manage",
"name": "菜单权限",
"description": "菜单权限",
"source": 1,
"path": "/space/:spaceId/space-square?activeKey=Agent",
"openType": 1,
"icon": "",
"sortIndex": 10,
"status": 1
},
{
"parentCode": "system_manage",
"code": "system_task_manage",
"name": "任务管理",
"description": "任务管理",
"parentCode": "workspace",
"code": "space_square",
"name": "空间广场",
"description": "空间广场",
"source": 1,
"path": "/system/task-manage",
"path": "/space/:spaceId/space-square?activeKey=Agent",
"openType": 1,
"icon": "",
"sortIndex": 10,
@@ -2656,6 +2706,18 @@
"sortIndex": 11,
"status": 1
},
{
"parentCode": "system_manage",
"code": "system_task_manage",
"name": "任务管理",
"description": "任务管理",
"source": 1,
"path": "/system/task-manage",
"openType": 1,
"icon": "",
"sortIndex": 11,
"status": 1
},
{
"parentCode": "system_manage",
"code": "system_log_query",
@@ -2664,7 +2726,7 @@
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 11,
"sortIndex": 12,
"status": 1
},
{
@@ -2675,7 +2737,7 @@
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 12,
"sortIndex": 13,
"status": 1
},
{
@@ -2716,11 +2778,11 @@
},
{
"parentCode": "component_lib_dev",
"code": "plugin_and_workflow",
"name": "插件与工作流",
"description": "插件与工作流",
"code": "plugin",
"name": "插件",
"description": "插件",
"source": 1,
"path": "/space/:spaceId/plugin-workflow",
"path": "/space/:spaceId/plugin",
"openType": 1,
"icon": "",
"sortIndex": 1,
@@ -2786,18 +2848,6 @@
"sortIndex": 2,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "knowledge_and_datatable",
"name": "知识与数据存储",
"description": "知识与数据存储",
"source": 1,
"path": "/space/:spaceId/knowledge-storage",
"openType": 1,
"icon": "",
"sortIndex": 2,
"status": 1
},
{
"parentCode": "pay_and_earnings",
"code": "merchant_onboarding",
@@ -2822,6 +2872,18 @@
"sortIndex": 2,
"status": 1
},
{
"parentCode": "recommend_manage",
"code": "recommend_official",
"name": "官方推荐",
"description": "官方推荐",
"source": 1,
"path": "/system/recommend-manage/official",
"openType": 1,
"icon": "",
"sortIndex": 2,
"status": 1
},
{
"parentCode": "subscription_and_points",
"code": "subscription_packages",
@@ -2858,6 +2920,18 @@
"sortIndex": 2,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "workflow",
"name": "工作流",
"description": "工作流",
"source": 1,
"path": "/space/:spaceId/workflow",
"openType": 1,
"icon": "",
"sortIndex": 2,
"status": 1
},
{
"parentCode": "content_manage",
"code": "content_page_app",
@@ -2882,6 +2956,18 @@
"sortIndex": 3,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "knowledge",
"name": "知识库",
"description": "知识库",
"source": 1,
"path": "/space/:spaceId/knowledge",
"openType": 1,
"icon": "",
"sortIndex": 3,
"status": 1
},
{
"parentCode": "permission_manage",
"code": "menu_manage",
@@ -2919,24 +3005,24 @@
"status": 1
},
{
"parentCode": "system_config",
"code": "sandbox_config",
"name": "沙盒配置",
"description": "沙盒配置",
"parentCode": "recommend_manage",
"code": "recommend_chatbox",
"name": "对话框智能体",
"description": "对话框智能体",
"source": 1,
"path": "/system/config/sandbox",
"path": "/system/recommend-manage/chatbox",
"openType": 1,
"icon": "",
"sortIndex": 3,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "space_model_manage",
"name": "模型管理",
"description": "模型管理",
"parentCode": "system_config",
"code": "sandbox_config",
"name": "沙盒配置",
"description": "沙盒配置",
"source": 1,
"path": "/space/:spaceId/model-manage",
"path": "/system/config/sandbox",
"openType": 1,
"icon": "",
"sortIndex": 3,
@@ -2966,6 +3052,18 @@
"sortIndex": 4,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "datatable",
"name": "数据表",
"description": "数据表",
"source": 1,
"path": "/space/:spaceId/storage",
"openType": 1,
"icon": "",
"sortIndex": 4,
"status": 1
},
{
"parentCode": "pay_and_earnings",
"code": "developer_earnings_stats",
@@ -3038,6 +3136,18 @@
"sortIndex": 5,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "space_model_manage",
"name": "模型管理",
"description": "模型管理",
"source": 1,
"path": "/space/:spaceId/model-manage",
"openType": 1,
"icon": "",
"sortIndex": 5,
"status": 1
},
{
"parentCode": "subscription_and_points",
"code": "business_orders",
@@ -3382,6 +3492,11 @@
"menuCode": "model_config",
"resourceCode": "model_manage",
"resourceBindType": 1
},
{
"menuCode": "recommend_manage",
"resourceCode": "display_recommend_manage",
"resourceBindType": 1
}
],
"roleMenus": [
@@ -3438,13 +3553,25 @@
},
{
"roleCode": "super_admin",
"menuCode": "plugin_and_workflow",
"menuCode": "plugin",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "knowledge_and_datatable",
"menuCode": "workflow",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "knowledge",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "datatable",
"menuBindType": 1,
"resourceTree": []
},
@@ -3875,6 +4002,29 @@
}
]
},
{
"roleCode": "super_admin",
"menuCode": "recommend_manage",
"menuBindType": 1,
"resourceTree": [
{
"code": "display_recommend_manage",
"resourceBindType": 1
}
]
},
{
"roleCode": "super_admin",
"menuCode": "recommend_official",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "recommend_chatbox",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "permission_manage",
@@ -4086,6 +4236,12 @@
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "model_permissions",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "api_key",
@@ -4094,7 +4250,7 @@
},
{
"roleCode": "super_admin",
"menuCode": "model_permissions",
"menuCode": "history_conversation",
"menuBindType": 1,
"resourceTree": []
}
@@ -4153,13 +4309,25 @@
},
{
"groupCode": "default_group",
"menuCode": "plugin_and_workflow",
"menuCode": "plugin",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "knowledge_and_datatable",
"menuCode": "workflow",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "knowledge",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "datatable",
"menuBindType": 1,
"resourceTree": []
},
@@ -4253,6 +4421,12 @@
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "eco_market",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "documents",
@@ -4312,6 +4486,12 @@
"menuCode": "api_key",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "history_conversation",
"menuBindType": 1,
"resourceTree": []
}
],
"dataPermissions": [

View File

@@ -0,0 +1,249 @@
{
"fromVersion": "1.4",
"toVersion": "1.5",
"resources": {
"added": [],
"removed": [],
"modified": []
},
"menus": {
"added": [
{
"parentCode": "component_lib_dev",
"code": "plugin",
"name": "插件",
"description": "插件",
"source": 1,
"path": "/space/:spaceId/plugin",
"openType": 1,
"icon": "",
"sortIndex": 1,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "workflow",
"name": "工作流",
"description": "工作流",
"source": 1,
"path": "/space/:spaceId/workflow",
"openType": 1,
"icon": "",
"sortIndex": 2,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "knowledge",
"name": "知识库",
"description": "知识库",
"source": 1,
"path": "/space/:spaceId/knowledge",
"openType": 1,
"icon": "",
"sortIndex": 3,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "datatable",
"name": "数据表",
"description": "数据表",
"source": 1,
"path": "/space/:spaceId/storage",
"openType": 1,
"icon": "",
"sortIndex": 4,
"status": 1
}
],
"removed": [
{
"parentCode": "component_lib_dev",
"code": "plugin_and_workflow",
"name": "插件与工作流",
"description": "插件与工作流",
"source": 1,
"path": "/space/:spaceId/plugin-workflow",
"openType": 1,
"icon": "",
"sortIndex": 1,
"status": 1
},
{
"parentCode": "component_lib_dev",
"code": "knowledge_and_datatable",
"name": "知识与数据存储",
"description": "知识与数据存储",
"source": 1,
"path": "/space/:spaceId/knowledge-storage",
"openType": 1,
"icon": "",
"sortIndex": 2,
"status": 1
}
],
"modified": [
{
"key": "component_lib_dev",
"old": {
"parentCode": "workspace",
"code": "component_lib_dev",
"name": "组件资源",
"description": "组件库",
"source": 1,
"path": "/space/:spaceId/library",
"openType": 1,
"icon": "",
"sortIndex": 3,
"status": 1
},
"new": {
"parentCode": "workspace",
"code": "component_lib_dev",
"name": "组件资源",
"description": "组件资源",
"source": 1,
"path": "/space/:spaceId/library",
"openType": 1,
"icon": "",
"sortIndex": 3,
"status": 1
}
},
{
"key": "space_model_manage",
"old": {
"parentCode": "component_lib_dev",
"code": "space_model_manage",
"name": "模型管理",
"description": "模型管理",
"source": 1,
"path": "/space/:spaceId/model-manage",
"openType": 1,
"icon": "",
"sortIndex": 3,
"status": 1
},
"new": {
"parentCode": "component_lib_dev",
"code": "space_model_manage",
"name": "模型管理",
"description": "模型管理",
"source": 1,
"path": "/space/:spaceId/model-manage",
"openType": 1,
"icon": "",
"sortIndex": 5,
"status": 1
}
}
]
},
"roles": {
"added": [],
"removed": [],
"modified": []
},
"groups": {
"added": [],
"removed": [],
"modified": []
},
"menuResources": {
"added": [],
"removed": [],
"modified": []
},
"roleMenus": {
"added": [
{
"roleCode": "super_admin",
"menuCode": "plugin",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "workflow",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "knowledge",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "datatable",
"menuBindType": 1,
"resourceTree": []
}
],
"removed": [
{
"roleCode": "super_admin",
"menuCode": "plugin_and_workflow",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "knowledge_and_datatable",
"menuBindType": 1,
"resourceTree": []
}
],
"modified": []
},
"groupMenus": {
"added": [
{
"groupCode": "default_group",
"menuCode": "plugin",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "workflow",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "knowledge",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "datatable",
"menuBindType": 1,
"resourceTree": []
}
],
"removed": [
{
"groupCode": "default_group",
"menuCode": "plugin_and_workflow",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "knowledge_and_datatable",
"menuBindType": 1,
"resourceTree": []
}
],
"modified": []
},
"dataPermissions": {
"added": [],
"removed": [],
"modified": []
}
}

View File

@@ -0,0 +1,308 @@
{
"fromVersion": "1.5",
"toVersion": "1.6",
"resources": {
"added": [
{
"code": "display_recommend_manage",
"name": "展示推荐模块",
"description": "展示推荐模块",
"source": 1,
"type": 1,
"sortIndex": 26,
"status": 1
},
{
"code": "display_recommend_query",
"name": "查询",
"description": "查询",
"source": 1,
"type": 2,
"parentCode": "display_recommend_manage",
"sortIndex": 1,
"status": 1
},
{
"code": "display_recommend_save",
"name": "保存",
"description": "保存",
"source": 1,
"type": 2,
"parentCode": "display_recommend_manage",
"sortIndex": 2,
"status": 1
},
{
"code": "display_recommend_delete",
"name": "删除",
"description": "删除",
"source": 1,
"type": 2,
"parentCode": "display_recommend_manage",
"sortIndex": 3,
"status": 1
}
],
"removed": [],
"modified": []
},
"menus": {
"added": [
{
"parentCode": "more_page",
"code": "history_conversation",
"name": "历史会话",
"source": 1,
"path": "/more-page/history-conversation",
"openType": 1,
"icon": "",
"sortIndex": 7,
"status": 1
},
{
"parentCode": "system_manage",
"code": "recommend_manage",
"name": "推荐管理",
"description": "推荐管理",
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 9,
"status": 1
},
{
"parentCode": "recommend_manage",
"code": "recommend_official",
"name": "官方推荐",
"description": "官方推荐",
"source": 1,
"path": "/system/recommend-manage/official",
"openType": 1,
"icon": "",
"sortIndex": 2,
"status": 1
},
{
"parentCode": "recommend_manage",
"code": "recommend_chatbox",
"name": "对话框智能体",
"description": "对话框智能体",
"source": 1,
"path": "/system/recommend-manage/chatbox",
"openType": 1,
"icon": "",
"sortIndex": 3,
"status": 1
}
],
"removed": [],
"modified": [
{
"key": "eco_market",
"old": {
"code": "eco_market",
"name": "生态市场",
"description": "生态市场",
"source": 1,
"path": "/ecosystem/mcp",
"openType": 1,
"icon": "",
"sortIndex": 5,
"status": 1
},
"new": {
"code": "eco_market",
"name": "生态市场",
"description": "生态市场",
"source": 1,
"path": "%siteUrl%/api/eco/redirect",
"openType": 1,
"icon": "",
"sortIndex": 5,
"status": 1
}
},
{
"key": "permission_manage",
"old": {
"parentCode": "system_manage",
"code": "permission_manage",
"name": "菜单权限",
"description": "菜单权限",
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 9,
"status": 1
},
"new": {
"parentCode": "system_manage",
"code": "permission_manage",
"name": "菜单权限",
"description": "菜单权限",
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 10,
"status": 1
}
},
{
"key": "system_task_manage",
"old": {
"parentCode": "system_manage",
"code": "system_task_manage",
"name": "任务管理",
"description": "任务管理",
"source": 1,
"path": "/system/task-manage",
"openType": 1,
"icon": "",
"sortIndex": 10,
"status": 1
},
"new": {
"parentCode": "system_manage",
"code": "system_task_manage",
"name": "任务管理",
"description": "任务管理",
"source": 1,
"path": "/system/task-manage",
"openType": 1,
"icon": "",
"sortIndex": 11,
"status": 1
}
},
{
"key": "system_log_query",
"old": {
"parentCode": "system_manage",
"code": "system_log_query",
"name": "日志查询",
"description": "日志查询",
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 11,
"status": 1
},
"new": {
"parentCode": "system_manage",
"code": "system_log_query",
"name": "日志查询",
"description": "日志查询",
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 12,
"status": 1
}
},
{
"key": "system_config",
"old": {
"parentCode": "system_manage",
"code": "system_config",
"name": "系统配置",
"description": "系统配置",
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 12,
"status": 1
},
"new": {
"parentCode": "system_manage",
"code": "system_config",
"name": "系统配置",
"description": "系统配置",
"source": 1,
"openType": 1,
"icon": "",
"sortIndex": 13,
"status": 1
}
}
]
},
"roles": {
"added": [],
"removed": [],
"modified": []
},
"groups": {
"added": [],
"removed": [],
"modified": []
},
"menuResources": {
"added": [
{
"menuCode": "recommend_manage",
"resourceCode": "display_recommend_manage",
"resourceBindType": 1
}
],
"removed": [],
"modified": []
},
"roleMenus": {
"added": [
{
"roleCode": "super_admin",
"menuCode": "recommend_manage",
"menuBindType": 1,
"resourceTree": [
{
"code": "display_recommend_manage",
"resourceBindType": 1
}
]
},
{
"roleCode": "super_admin",
"menuCode": "recommend_official",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "recommend_chatbox",
"menuBindType": 1,
"resourceTree": []
},
{
"roleCode": "super_admin",
"menuCode": "history_conversation",
"menuBindType": 1,
"resourceTree": []
}
],
"removed": [],
"modified": []
},
"groupMenus": {
"added": [
{
"groupCode": "default_group",
"menuCode": "eco_market",
"menuBindType": 1,
"resourceTree": []
},
{
"groupCode": "default_group",
"menuCode": "history_conversation",
"menuBindType": 1,
"resourceTree": []
}
],
"removed": [],
"modified": []
},
"dataPermissions": {
"added": [],
"removed": [],
"modified": []
}
}