Fix v3.4.1 (#655)

* feat: jansi for windows

* be: manifest.json

* fix: Remove escapeHtml

* fix: TransformConfig not exists

* fix: user delete check

* fix: fixedDecimalScale

* v3.4.1

---------

Co-authored-by: devezhao <zhaofang123@gmail.com>
This commit is contained in:
REBUILD 企业管理系统 2023-09-06 19:55:38 +08:00 committed by GitHub
parent a1fcefad28
commit 3560e8d02d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 112 additions and 32 deletions

View file

@ -10,7 +10,7 @@
</parent>
<groupId>com.rebuild</groupId>
<artifactId>rebuild</artifactId>
<version>3.4.0</version>
<version>3.4.1</version>
<name>rebuild</name>
<description>Building your business-systems freely!</description>
<!-- UNCOMMENT USE TOMCAT -->
@ -485,6 +485,11 @@
<version>15.4</version>
</dependency>
-->
<dependency>
<groupId>org.fusesource.jansi</groupId>
<artifactId>jansi</artifactId>
<version>2.4.0</version>
</dependency>
<!-- fix: CVEs -->
<dependency>

View file

@ -73,11 +73,11 @@ public class Application implements ApplicationListener<ApplicationStartedEvent>
/**
* Rebuild Version
*/
public static final String VER = "3.4.0";
public static final String VER = "3.4.1";
/**
* Rebuild Build [MAJOR]{1}[MINOR]{2}[PATCH]{2}[BUILD]{2}
*/
public static final int BUILD = 3040005;
public static final int BUILD = 3040106;
static {
// Driver for DB

View file

@ -11,6 +11,8 @@ import com.rebuild.core.support.CommandArgs;
import com.rebuild.core.support.RebuildConfiguration;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
import org.fusesource.jansi.AnsiConsole;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
@ -117,6 +119,7 @@ public class BootApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
if (SystemUtils.IS_OS_WINDOWS) AnsiConsole.systemInstall();
if (devMode()) System.setProperty("spring.profiles.active", "dev");
try {

View file

@ -85,9 +85,10 @@ public class TransformManager implements ConfigManager {
/**
* @param configId
* @param sourceEntity [可选]
* @return Returns clone
* @return
* @throws ConfigurationException
*/
public ConfigBean getTransformConfig(ID configId, String sourceEntity) {
public ConfigBean getTransformConfig(ID configId, String sourceEntity) throws ConfigurationException {
if (sourceEntity == null) sourceEntity = getBelongEntity(configId);
for (ConfigBean c : getRawTransforms(sourceEntity)) {

View file

@ -17,7 +17,6 @@ import cn.devezhao.persist4j.engine.NullValue;
import cn.devezhao.persist4j.record.JsonRecordCreator;
import com.alibaba.fastjson.JSONObject;
import com.rebuild.core.metadata.easymeta.DisplayType;
import com.rebuild.core.metadata.easymeta.EasyDecimal;
import com.rebuild.core.metadata.easymeta.EasyField;
import com.rebuild.core.metadata.easymeta.EasyMetaFactory;
import com.rebuild.core.metadata.easymeta.EasyText;
@ -240,11 +239,6 @@ public class EntityRecordCreator extends JsonRecordCreator {
}
}
}
// 小数精度处理
if (field.getDisplayType() == DisplayType.DECIMAL) {
record.setDecimal(fieldName, EasyDecimal.fixedDecimalScale(value, field.getRawMeta()));
}
}
}

View file

@ -90,7 +90,16 @@ public class EasyDecimal extends EasyField {
* @return
*/
public static BigDecimal fixedDecimalScale(Object decimalValue, Field decimalField) {
int scale = ((EasyDecimal) EasyMetaFactory.valueOf(decimalField)).getScale();
return fixedDecimalScale(decimalValue, EasyMetaFactory.valueOf(decimalField));
}
/**
* @param decimalValue
* @param decimalField
* @return
*/
public static BigDecimal fixedDecimalScale(Object decimalValue, EasyField decimalField) {
int scale = ((EasyDecimal) decimalField).getScale();
if (decimalValue instanceof BigDecimal) {
return ((BigDecimal) decimalValue).setScale(scale, RoundingMode.HALF_UP);

View file

@ -13,7 +13,6 @@ import cn.devezhao.bizz.security.AccessDeniedException;
import cn.devezhao.commons.CalendarUtils;
import cn.devezhao.commons.CodecUtils;
import cn.devezhao.commons.EncryptUtils;
import cn.devezhao.commons.ObjectUtils;
import cn.devezhao.persist4j.PersistManagerFactory;
import cn.devezhao.persist4j.Record;
import cn.devezhao.persist4j.engine.ID;
@ -125,11 +124,7 @@ public class UserService extends BaseService {
throw new OperationDeniedException(Language.L("内置用户禁止删除"));
}
Object[] hasLogin = Application.createQueryNoFilter(
"select count(logId) from LoginLog where user = ?")
.setParameter(1, recordId)
.unique();
if (ObjectUtils.toInt(hasLogin[0]) > 0) {
if (checkHasUsed(recordId)) {
throw new OperationDeniedException(Language.L("已使用过的用户禁止删除"));
}
@ -479,4 +474,28 @@ public class UserService extends BaseService {
}
return null;
}
/**
* 检查用户是否使用过
*
* @param user
* @return
*/
public static boolean checkHasUsed(ID user) {
// FIXME 仅检查是否登陆过严谨些还应该检查是否有其他业务数据
// 登录
Object[] hasLogin = Application.createQueryNoFilter(
"select user from LoginLog where user = ?")
.setParameter(1, user)
.unique();
if (hasLogin != null) return true;
// 绑定
Object[] hasBind = Application.createQueryNoFilter(
"select bindUser from ExternalUser where bindUser = ?")
.setParameter(1, user)
.unique();
return hasBind != null;
}
}

View file

@ -15,17 +15,29 @@ import cn.devezhao.persist4j.Record;
import cn.devezhao.persist4j.engine.ID;
import cn.devezhao.persist4j.engine.NullValue;
import com.rebuild.core.metadata.EntityHelper;
import com.rebuild.core.metadata.MetadataHelper;
import com.rebuild.core.metadata.MetadataSorter;
import com.rebuild.core.metadata.easymeta.DisplayType;
import com.rebuild.core.metadata.easymeta.EasyDecimal;
import com.rebuild.core.metadata.easymeta.EasyField;
import com.rebuild.core.metadata.easymeta.EasyMetaFactory;
import com.rebuild.core.metadata.easymeta.EasyTag;
import com.rebuild.core.privileges.UserService;
import com.rebuild.core.service.general.QuickCodeReindexTask;
import com.rebuild.utils.Callable2;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import java.util.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 基础服务类
@ -33,6 +45,7 @@ import java.util.*;
* @author devezhao
* @since 01/04/2019
*/
@Slf4j
public class BaseService extends InternalPersistService {
public BaseService(PersistManagerFactory aPMFactory) {
@ -46,6 +59,7 @@ public class BaseService extends InternalPersistService {
@Override
public Record create(Record record) {
fixedDecimalScale(record);
setQuickCodeValue(record);
Callable2<Integer, Record> call1 = processN2NReference(record, Boolean.TRUE);
Callable2<Integer, Record> call2 = processTag(record, Boolean.TRUE);
@ -58,6 +72,7 @@ public class BaseService extends InternalPersistService {
@Override
public Record update(Record record) {
fixedDecimalScale(record);
setQuickCodeValue(record);
Callable2<Integer, Record> call1 = processN2NReference(record, Boolean.FALSE);
Callable2<Integer, Record> call2 = processTag(record, Boolean.FALSE);
@ -86,6 +101,30 @@ public class BaseService extends InternalPersistService {
}
}
/**
* 强制精度
*
* @param record
*/
private void fixedDecimalScale(Record record) {
final Entity entity = record.getEntity();
if (!MetadataHelper.isBusinessEntity(entity)) return;
for (String field : record.getAvailableFields()) {
if (!record.hasValue(field, false)) continue;
EasyField decimalField = EasyMetaFactory.valueOf(entity.getField(field));
if (decimalField.getDisplayType() != DisplayType.DECIMAL) continue;
Object oldValue = record.getObjectValue(field);
BigDecimal fixed = EasyDecimal.fixedDecimalScale(oldValue, decimalField);
if (oldValue.equals(fixed)) continue;
log.debug("Force decimal scale : {}={} < {}", decimalField.getRawMeta(), field, oldValue);
record.setDecimal(field, fixed);
}
}
/**
* 多引用存在独立的表
*

View file

@ -198,9 +198,9 @@ public class TableBuilder {
if (rowspan == 0) {
return StringUtils.EMPTY;
} else if (rowspan > 1) {
return String.format("<%s rowspan=\"%d\">%s</%s>", tag, rowspan, CommonsUtils.escapeHtml(content), tag);
return String.format("<%s rowspan=\"%d\">%s</%s>", tag, rowspan, content, tag);
} else {
return String.format("<%s>%s</%s>", tag, CommonsUtils.escapeHtml(content), tag);
return String.format("<%s>%s</%s>", tag, content, tag);
}
}
}

View file

@ -7,7 +7,6 @@ See LICENSE and COMMERCIAL in the project root for license information.
package com.rebuild.web.admin.bizz;
import cn.devezhao.commons.ObjectUtils;
import cn.devezhao.commons.web.ServletUtils;
import cn.devezhao.persist4j.Record;
import cn.devezhao.persist4j.engine.ID;
@ -27,12 +26,20 @@ import com.rebuild.utils.JSONUtils;
import com.rebuild.web.EntityController;
import com.rebuild.web.IdParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* @author devezhao
@ -170,12 +177,7 @@ public class UserController extends EntityController {
hasMember += UserHelper.getRoleMembers(bizzId).size();
} else if (bizzId.getEntityCode() == EntityHelper.User) {
// NOTE 仅检查是否登陆过严谨些还应该检查是否有其他业务数据
Object[] hasLogin = Application.createQueryNoFilter(
"select count(logId) from LoginLog where user = ?")
.setParameter(1, bizzId)
.unique();
hasMember = ObjectUtils.toInt(hasLogin[0]);
hasMember = UserService.checkHasUsed(bizzId) ? 1 : 0;
}
return JSONUtils.toJSONObject(

View file

@ -13,6 +13,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rebuild.core.Application;
import com.rebuild.core.configuration.ConfigBean;
import com.rebuild.core.configuration.ConfigurationException;
import com.rebuild.core.configuration.general.TransformManager;
import com.rebuild.core.metadata.MetadataHelper;
import com.rebuild.core.metadata.MetadataSorter;
@ -152,7 +153,13 @@ public class TriggerAdminController extends BaseController {
String useTransform = configJson.getString("useTransform");
if (ID.isId(useTransform)) {
ConfigBean cb = TransformManager.instance.getTransformConfig(ID.valueOf(useTransform), sourceEntity);
ConfigBean cb;
try {
cb = TransformManager.instance.getTransformConfig(ID.valueOf(useTransform), sourceEntity);
} catch (ConfigurationException ex) {
return String.format("[%s]", useTransform.toUpperCase());
}
targetEntity = cb.getString("target");
if (MetadataHelper.containsEntity(targetEntity)) {
return EasyMetaFactory.getLabel(targetEntity);

View file

@ -1,7 +1,8 @@
{
"$schema": "https://json.schemastore.org/web-manifest-combined.json",
"name": "REBUILD Web",
"name": "REBUILD",
"short_name": "REBUILD",
"description": "Made by getrebuild.com",
"start_url": "../",
"background_color": "#ffffff",
"theme_color": "#4285f4",