From 764830a60b31c52a1f11d399fec4090f3cef0a6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?REBUILD=20=E4=BC=81=E4=B8=9A=E7=AE=A1=E7=90=86=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F?= <42044143+getrebuild@users.noreply.github.com> Date: Mon, 22 Jul 2024 21:11:25 +0800 Subject: [PATCH] Fix 3.7.5 (#786) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 记录转换 * be: if nav unshare * be: db AppBuild * bump netty --- pom.xml | 19 +++++--- .../java/com/rebuild/core/Application.java | 12 ++---- .../core/configuration/NavBuilder.java | 12 +++++- .../general/AutoFillinManager.java | 4 +- .../core/metadata/impl/Entity2Schema.java | 2 +- .../rebuild/core/privileges/UserService.java | 2 +- .../service/general/ObservableService.java | 2 +- .../general/transform/RecordTransfomer37.java | 43 ++++++++++++------- .../transform/TransformerPreview37.java | 14 +----- .../core/support/integration/SMSender.java | 2 +- .../core/support/setup/DatabaseFixer.java | 2 +- .../rebuild/core/support/setup/Installer.java | 5 ++- .../robot/trigger/TriggerAdminController.java | 2 +- .../web/user/signup/LoginController.java | 2 +- 14 files changed, 69 insertions(+), 54 deletions(-) diff --git a/pom.xml b/pom.xml index 5c05c77f1..d79c062eb 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.rebuild rebuild - 3.7.4 + 3.7.5 rebuild Building your business-systems freely! https://getrebuild.com/ @@ -548,15 +548,20 @@ woodstox-core 6.6.1 - - io.netty - netty-handler - 4.1.108.Final - com.google.guava guava - 33.1.0-jre + 33.2.1-jre + + + io.netty + netty-handler + 4.1.112.Final + + + io.netty + netty-resolver-dns + 4.1.112.Final diff --git a/src/main/java/com/rebuild/core/Application.java b/src/main/java/com/rebuild/core/Application.java index 09f6c00d3..ad9f40c82 100644 --- a/src/main/java/com/rebuild/core/Application.java +++ b/src/main/java/com/rebuild/core/Application.java @@ -15,7 +15,6 @@ import cn.devezhao.persist4j.Query; import cn.devezhao.persist4j.engine.ID; import cn.devezhao.persist4j.engine.StandardRecord; import cn.devezhao.persist4j.query.QueryedRecord; -import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializerFeature; @@ -75,11 +74,11 @@ public class Application implements ApplicationListener /** * Rebuild Version */ - public static final String VER = "3.7.4"; + public static final String VER = "3.7.5"; /** * Rebuild Build [MAJOR]{1}[MINOR]{2}[PATCH]{2}[BUILD]{2} */ - public static final int BUILD = 3070410; + public static final int BUILD = 3070511; static { // Driver for DB @@ -210,16 +209,13 @@ public class Application implements ApplicationListener return false; } - // H2 no filters - if (Installer.isUseH2()) _CONTEXT.getBean(DruidDataSource.class).clearFilters(); - // 升级数据库 new UpgradeDatabase().upgradeQuietly(); // 版本升级会清除缓存 int lastBuild = ObjectUtils.toInt(RebuildConfiguration.get(ConfigurationItem.AppBuild, true), 0); - if (lastBuild > 0 && lastBuild != BUILD) { - log.warn("Clean up the cache once when upgrading : {}", BUILD); + if (lastBuild != BUILD) { + log.warn("Clean up the cache once when upgrading : {} from {}", BUILD, lastBuild); Installer.clearAllCache(); RebuildConfiguration.set(ConfigurationItem.AppBuild, BUILD); } diff --git a/src/main/java/com/rebuild/core/configuration/NavBuilder.java b/src/main/java/com/rebuild/core/configuration/NavBuilder.java index de9d7561e..af53b9b20 100644 --- a/src/main/java/com/rebuild/core/configuration/NavBuilder.java +++ b/src/main/java/com/rebuild/core/configuration/NavBuilder.java @@ -100,7 +100,15 @@ public class NavBuilder extends NavManager { ID useNavId; if ((useNavId = MetadataHelper.checkSpecEntityId(useNav, EntityHelper.LayoutConfig)) != null) { Object[][] cached = getAllConfig(null, TYPE_NAV); - config = findConfigBean(cached, useNavId); + // fix: 3.7.5 原本可见现在不可见了 + for (Object[] c : cached) { + if (c[0].equals(useNavId)) { + if (!isShareTo((String) c[1], user)) useNavId = null; + break; + } + } + + if (useNavId != null) config = findConfigBean(cached, useNavId); } } @@ -343,7 +351,7 @@ public class NavBuilder extends NavManager { ID user = AppUtils.getRequestUser(request); String useNav = ServletUtils.readCookie(request, "AppHome.Nav"); - JSONArray navs = License.isCommercial() + JSONArray navs = License.isRbvAttached() ? NavBuilder.instance.getUserNav(user, useNav) : NavBuilder.instance.getUserNav(user); diff --git a/src/main/java/com/rebuild/core/configuration/general/AutoFillinManager.java b/src/main/java/com/rebuild/core/configuration/general/AutoFillinManager.java index 999ed8792..7f1f47831 100644 --- a/src/main/java/com/rebuild/core/configuration/general/AutoFillinManager.java +++ b/src/main/java/com/rebuild/core/configuration/general/AutoFillinManager.java @@ -170,7 +170,7 @@ public class AutoFillinManager implements ConfigManager { // v3.7 附加过滤条件 if (value instanceof ID && tfEasy.getDisplayType() == DisplayType.REFERENCE) { if (!FieldValueHelper.checkRefDataFilter(tfEasy, (ID) value)) { - log.info("Mismatch `referenceDataFilter`, ignored : {}", value); + log.info("Not meeting the `referenceDataFilter`, ignored : {}", value); continue; } } else if (value instanceof JSONArray && tfEasy.getDisplayType() == DisplayType.N2NREFERENCE) { @@ -181,7 +181,7 @@ public class AutoFillinManager implements ConfigManager { if (FieldValueHelper.checkRefDataFilter(tfEasy, ID.valueOf(id))) { value2.add(item); } else { - log.info("Mismatch `referenceDataFilter`, ignored : {}", value); + log.info("Not meeting the `referenceDataFilter`, ignored : {}", value); } } value = value2.isEmpty() ? null : value2; diff --git a/src/main/java/com/rebuild/core/metadata/impl/Entity2Schema.java b/src/main/java/com/rebuild/core/metadata/impl/Entity2Schema.java index 4463cbf5a..bf14d531e 100644 --- a/src/main/java/com/rebuild/core/metadata/impl/Entity2Schema.java +++ b/src/main/java/com/rebuild/core/metadata/impl/Entity2Schema.java @@ -67,7 +67,7 @@ public class Entity2Schema extends Field2Schema { * @return Returns 实体名称 */ public String createEntity(String entityName, String entityLabel, String comments, String mainEntity, boolean haveNameField, boolean haveSeriesField) { - if (!License.isCommercial() && MetadataHelper.getEntities().length >= 100) { + if (!License.isRbvAttached() && MetadataHelper.getEntities().length >= 100) { throw new NeedRbvException(Language.L("实体数量超出免费版限制")); } diff --git a/src/main/java/com/rebuild/core/privileges/UserService.java b/src/main/java/com/rebuild/core/privileges/UserService.java index 0ee204185..e7428e956 100644 --- a/src/main/java/com/rebuild/core/privileges/UserService.java +++ b/src/main/java/com/rebuild/core/privileges/UserService.java @@ -81,7 +81,7 @@ public class UserService extends BaseService { * @return */ private Record create(Record record, boolean notifyUser) { - if (!License.isCommercial() && Application.getUserStore().getAllUsers().length >= 100) { + if (!License.isRbvAttached() && Application.getUserStore().getAllUsers().length >= 100) { throw new NeedRbvException(Language.L("用户数量超出免费版限制")); } diff --git a/src/main/java/com/rebuild/core/service/general/ObservableService.java b/src/main/java/com/rebuild/core/service/general/ObservableService.java index 2f64673d4..1934a9f88 100644 --- a/src/main/java/com/rebuild/core/service/general/ObservableService.java +++ b/src/main/java/com/rebuild/core/service/general/ObservableService.java @@ -50,7 +50,7 @@ public abstract class ObservableService extends SafeObservable implements Servic @Override public void addObserver(SafeObserver o) { - log.info("Add observer : {} for [ {} ] ", o, getEntityCode()); + log.info("Add observer : {} for [ {} ] ", o, getEntityCode() == 0 ? "*" : getEntityCode()); super.addObserver(o); } diff --git a/src/main/java/com/rebuild/core/service/general/transform/RecordTransfomer37.java b/src/main/java/com/rebuild/core/service/general/transform/RecordTransfomer37.java index 702e5a49c..611f55445 100644 --- a/src/main/java/com/rebuild/core/service/general/transform/RecordTransfomer37.java +++ b/src/main/java/com/rebuild/core/service/general/transform/RecordTransfomer37.java @@ -70,23 +70,11 @@ public class RecordTransfomer37 extends RecordTransfomer { Entity dTargetEntity = fmdEntity[0]; Entity dSourceEntity = fmdEntity[1]; - // 明细 > 明细 - String sql = String.format( - "select %s from %s where %s = '%s' and (1=1) order by autoId asc", - dSourceEntity.getPrimaryField().getName(), dSourceEntity.getName(), - MetadataHelper.getDetailToMainField(dSourceEntity).getName(), sourceRecordId); - // 明细 > 主+明细 - if (dSourceEntity.getEntityCode().equals(sourceRecordId.getEntityCode())) { - sql = String.format( - "select %s from %s where %s = '%s' and (1=1) order by autoId asc", - dSourceEntity.getPrimaryField().getName(), dSourceEntity.getName(), - dSourceEntity.getPrimaryField().getName(), sourceRecordId); - } - + String querySourceSql = buildDetailsSourceSql(dSourceEntity, sourceRecordId); String filter = appendFilter(fmd); - if (filter != null) sql = sql.replace("(1=1)", filter); + if (filter != null) querySourceSql = querySourceSql.replace("(1=1)", filter); - Object[][] dArray = Application.createQueryNoFilter(sql).array(); + Object[][] dArray = Application.createQueryNoFilter(querySourceSql).array(); for (Object[] d : dArray) { detailsList.add(transformRecord( dSourceEntity, dTargetEntity, fmd, (ID) d[0], null, false, false, checkNullable)); @@ -151,4 +139,29 @@ public class RecordTransfomer37 extends RecordTransfomer { } return null; } + + /** + * @param sourceEntity + * @param sourceId + * @return + */ + protected static String buildDetailsSourceSql(Entity sourceEntity, ID sourceId) { + String querySourceSql = null; + if (sourceEntity.getMainEntity() != null) { + querySourceSql = String.format( + "select %s from %s where %s = '%s' and (1=1) order by autoId asc", + sourceEntity.getPrimaryField().getName(), sourceEntity.getName(), + MetadataHelper.getDetailToMainField(sourceEntity).getName(), sourceId); + } + + // 明细 > 主+明细 + if (querySourceSql == null || sourceEntity.getEntityCode().equals(sourceId.getEntityCode())) { + querySourceSql = String.format( + "select %s from %s where %s = '%s' and (1=1) order by autoId asc", + sourceEntity.getPrimaryField().getName(), sourceEntity.getName(), + sourceEntity.getPrimaryField().getName(), sourceId); + } + + return querySourceSql; + } } diff --git a/src/main/java/com/rebuild/core/service/general/transform/TransformerPreview37.java b/src/main/java/com/rebuild/core/service/general/transform/TransformerPreview37.java index b7f6e8d83..81a7d23a1 100644 --- a/src/main/java/com/rebuild/core/service/general/transform/TransformerPreview37.java +++ b/src/main/java/com/rebuild/core/service/general/transform/TransformerPreview37.java @@ -63,6 +63,7 @@ public class TransformerPreview37 extends TransformerPreview { JSONArray detailModels = new JSONArray(); + // 明细 for (Object o : fieldsMappingDetails) { JSONObject fmd = (JSONObject) o; Entity[] fmdEntity = RecordTransfomer37.checkEntity(fmd); @@ -74,18 +75,7 @@ public class TransformerPreview37 extends TransformerPreview { // ND 指定明细的 if (!detailName.equalsIgnoreCase(dTargetEntity.getName())) continue; - String querySourceSql = "select %s from %s where %s = '%s' and (1=1) order by autoId asc"; - // 源=明细 && 目标=主 - if (dSourceEntity.getMainEntity() != null && dTargetEntity.getDetailEntity() != null) { - querySourceSql = String.format(querySourceSql, - dSourceEntity.getPrimaryField().getName(), dSourceEntity.getName(), - MetadataHelper.getDetailToMainField(dSourceEntity).getName(), sourceId); - } else { - querySourceSql = String.format(querySourceSql, - dSourceEntity.getPrimaryField().getName(), dSourceEntity.getName(), - dSourceEntity.getPrimaryField().getName(), sourceId); - } - + String querySourceSql = RecordTransfomer37.buildDetailsSourceSql(dSourceEntity, sourceId); String filter = RecordTransfomer37.appendFilter(fmd); if (filter != null) querySourceSql = querySourceSql.replace("(1=1)", filter); diff --git a/src/main/java/com/rebuild/core/support/integration/SMSender.java b/src/main/java/com/rebuild/core/support/integration/SMSender.java index 9e5ae0711..e283dde2d 100644 --- a/src/main/java/com/rebuild/core/support/integration/SMSender.java +++ b/src/main/java/com/rebuild/core/support/integration/SMSender.java @@ -138,7 +138,7 @@ public class SMSender { htmlContent = htmlContent.replace("%TIME%", CalendarUtils.getUTCDateTimeFormat().format(CalendarUtils.now())); htmlContent = htmlContent.replace("%APPURL%", RebuildConfiguration.getHomeUrl()); htmlContent = htmlContent.replace("%APPLOGO%", RebuildConfiguration.getHomeUrl("commons/theme/use-logo")); - if (License.isCommercial()) { + if (License.isRbvAttached()) { htmlContent = htmlContent.replace("%APPNAME%", RebuildConfiguration.get(ConfigurationItem.AppName)); } else { htmlContent = htmlContent.replace("%APPNAME%", "REBUILD"); diff --git a/src/main/java/com/rebuild/core/support/setup/DatabaseFixer.java b/src/main/java/com/rebuild/core/support/setup/DatabaseFixer.java index 463e69c88..87d587f75 100644 --- a/src/main/java/com/rebuild/core/support/setup/DatabaseFixer.java +++ b/src/main/java/com/rebuild/core/support/setup/DatabaseFixer.java @@ -48,7 +48,7 @@ public class DatabaseFixer { // 最新升级过的 final int dbVer = RebuildConfiguration.getInt(ConfigurationItem.DBVer); - if (dbVer == 41 && !BooleanUtils.toBoolean(KVStorage.getCustomValue(KEY_41))) { + if (dbVer <= 41 && !BooleanUtils.toBoolean(KVStorage.getCustomValue(KEY_41))) { log.info("Database fixing `#41` ..."); ThreadPool.exec(() -> { try { diff --git a/src/main/java/com/rebuild/core/support/setup/Installer.java b/src/main/java/com/rebuild/core/support/setup/Installer.java index 6cc01d6ad..8a2a6e3b2 100644 --- a/src/main/java/com/rebuild/core/support/setup/Installer.java +++ b/src/main/java/com/rebuild/core/support/setup/Installer.java @@ -60,7 +60,9 @@ import java.util.Map; import java.util.Properties; import java.util.TimeZone; -import static com.rebuild.core.support.ConfigurationItem.*; +import static com.rebuild.core.support.ConfigurationItem.CacheHost; +import static com.rebuild.core.support.ConfigurationItem.CachePassword; +import static com.rebuild.core.support.ConfigurationItem.CachePort; /** * 系统安装 @@ -211,6 +213,7 @@ public class Installer implements InstallState { License.siteApiNoCache("api/authority/query"); } + // 初始化 Application.init(); System.setProperty("SN", StringUtils.EMPTY); diff --git a/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java b/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java index a1e295ea5..c912bc916 100644 --- a/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java +++ b/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java @@ -67,7 +67,7 @@ public class TriggerAdminController extends BaseController { Entity sourceEntity = MetadataHelper.getEntity((String) config[0]); ActionType actionType = ActionType.valueOf((String) config[1]); - if (!License.isCommercial() && actionType.getActionClass().contains(".rbv.")) { + if (!License.isRbvAttached() && actionType.getActionClass().contains(".rbv.")) { response.sendError(404, Language.L("免费版不支持此功能 [(查看详情)](https://getrebuild.com/docs/rbv-features)")); return null; diff --git a/src/main/java/com/rebuild/web/user/signup/LoginController.java b/src/main/java/com/rebuild/web/user/signup/LoginController.java index 7d42b5033..2c7fe5c1c 100644 --- a/src/main/java/com/rebuild/web/user/signup/LoginController.java +++ b/src/main/java/com/rebuild/web/user/signup/LoginController.java @@ -123,7 +123,7 @@ public class LoginController extends LoginAction { mv.getModel().put("mobileUrl", RebuildConfiguration.getHomeUrl("h5app-download")); } - if (License.isCommercial()) { + if (License.isRbvAttached()) { // DingTalk mv.getModel().put("ssoDingtalk", RebuildConfiguration.get(ConfigurationItem.DingtalkAppkey)); // WxWork