فهرست منبع

处理blob类型

shiqian 4 سال پیش
والد
کامیت
23b77dd53f

+ 1 - 1
boman-api/boman-api-system/src/main/java/com/boman/system/api/model/LoginUser.java

@@ -61,7 +61,7 @@ public class LoginUser implements Serializable
     private SysUser sysUser;
 
     /**
-     * 用户变量
+     * 用户变量 登录的时候塞进去的
      */
     private JSONObject userEnv;
 

+ 18 - 0
boman-modules/boman-gen/src/main/java/com/boman/gen/controller/MyController.java

@@ -10,6 +10,8 @@ import com.boman.gen.domain.GenTableRelation;
 import com.boman.gen.service.IGenTableColumnService;
 import com.boman.gen.service.IGenTableRelationService;
 import com.boman.gen.service.IGenTableService;
+import com.google.common.collect.Lists;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -125,6 +127,7 @@ public class MyController extends BaseController {
             }
 
             table.setColumns(columnList);
+            table.setIsContainsBlob(isContainsBlob(columnList));
             redisService.setCacheObject(RedisKey.TABLE_INFO + table.getTableName(), table, 12L, TimeUnit.DAYS);
         }
     }
@@ -151,4 +154,19 @@ public class MyController extends BaseController {
         packTableAndInsertToRedis(tableList, genTableColumns);
         return AjaxResult.success();
     }
+
+    public boolean isContainsBlob(List<GenTableColumn> columnList) {
+        if (CollectionUtils.isEmpty(columnList)) {
+            return false;
+        }
+
+        ArrayList<String> blob = Lists.newArrayList("blob", "tinyblob", "mediumblob", "longblob");
+        for (GenTableColumn column : columnList) {
+            if (blob.contains(column.getColumnType())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }

+ 13 - 0
boman-modules/boman-gen/src/main/java/com/boman/gen/domain/GenTable.java

@@ -174,6 +174,11 @@ public class GenTable extends BaseEntity
      */
     private String tablePrimaryKeyName;
 
+    /**
+     * 此表中的字段是否含有blob的列, true含
+     */
+    private Boolean isContainsBlob;
+
     public String getAkColumnName() {
         return akColumnName;
     }
@@ -582,4 +587,12 @@ public class GenTable extends BaseEntity
     public void setRelationList(List<GenTable> relationList) {
         this.relationList = relationList;
     }
+
+    public Boolean getIsContainsBlob() {
+        return isContainsBlob;
+    }
+
+    public void setIsContainsBlob(Boolean isContainsBlob) {
+        this.isContainsBlob = isContainsBlob;
+    }
 }

+ 3 - 0
boman-modules/boman-gen/src/main/java/com/boman/gen/domain/GenTableColumn.java

@@ -21,6 +21,9 @@ public class GenTableColumn extends BaseEntity
     /** 主键 */
     public static final String IS_PK = "1";
 
+    /** 必填 */
+    public static final String IS_REQUIRED = "1";
+
     /** 编号 */
     private Long columnId;
 

+ 11 - 0
boman-web-core/src/main/java/com/boman/web/core/constant/FormDataConstant.java

@@ -76,6 +76,17 @@ public class FormDataConstant {
      */
     public static final String VARCHAR = "varchar";
 
+    public static final String BLOB = "blob";
+    public static final String TINYBLOB = "tinyblob";
+    public static final String MEDIUMBLOB = "mediumblob";
+    public static final String LONGBLOB = "longblob";
+    /**
+     * Blob
+     */
+    public static final List<String> BLOB_LIST = Lists.newArrayList(BLOB, TINYBLOB, MEDIUMBLOB, LONGBLOB);
+
+    public static final String BYTE_ARRAY = "byte[]";
+
     public static final String CHAR = "char";
     public static final String DATETIME = "datetime";
     public static final String TIMESTAMP = "timestamp";

+ 9 - 6
boman-web-core/src/main/java/com/boman/web/core/domain/TableContext.java

@@ -6,13 +6,13 @@ import com.boman.common.redis.RedisKey;
 import com.boman.common.redis.service.RedisService;
 import com.boman.gen.domain.GenTable;
 import com.boman.gen.domain.GenTableColumn;
+import com.boman.web.core.constant.FormDataConstant;
 import com.boman.web.core.utils.IdUtils;
 
 import java.util.List;
 import java.util.Map;
 
-import static com.boman.common.core.utils.obj.ObjectUtils.ltZero;
-import static com.boman.common.core.utils.obj.ObjectUtils.requireNonNull;
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
 import static com.boman.web.core.constant.MaskConstant.*;
 
 /**
@@ -50,19 +50,22 @@ public class TableContext {
         context.setFixedData(fixedData);
 
         JSONObject commitData = new JSONObject();
-        packCommitData(dto, context, columns, fixedData, commitData);
+        packCommitData(dto.getObjId(), context, columns, fixedData, commitData);
         context.setCommitData(commitData);
 
         return context;
 
     }
 
-    private static void packCommitData(FormDataDto dto, TableContext context, List<GenTableColumn> columns
+
+    private static void packCommitData(Long objId, TableContext context, List<GenTableColumn> columns
             , JSONObject fixedData, JSONObject commitData) {
-        boolean isInsert = ltZero(dto.getObjId());
+        boolean isInsert = ltZero(objId);
         context.setActionType(isInsert ? ActionType.INSERT : ActionType.UPDATE);
+        // 过滤掉hr字段
+        columns = filter(columns, col -> !FormDataConstant.HR.equalsIgnoreCase(col.getHtmlType()));
         for (GenTableColumn column : columns) {
-            String[] maskArray = requireNonNull(column.getMask(), "mask is empty").split("");
+            String[] maskArray = requireNonNull(column.getMask(), "mask is empty, columnName = " + column.getColumnName()).split("");
             assert maskArray.length == 6;
             // 新增可见 修改可见
             String insertVisible = maskArray[0], updateVisible = maskArray[2];

+ 18 - 1
boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java

@@ -50,6 +50,7 @@ import java.util.stream.Collectors;
 import static com.boman.common.core.utils.obj.ObjectUtils.*;
 import static com.boman.web.core.constant.FormDataConstant.*;
 import static com.boman.web.core.utils.ColumnUtils.*;
+import static com.boman.web.core.utils.ColumnUtils.handlerBlobWithJSONObject;
 
 /**
  * @author shiqian
@@ -91,6 +92,8 @@ public class TableServiceCmdService {
         JSONObject commitData = context.getCommitData();
 
         checkColumn(commitData, context.getColumns());
+        // 必填项
+        handlerRequired(commitData, context.getColumns());
 
         // 新增
         if (ActionType.INSERT.equals(context.getActionType())) {
@@ -117,6 +120,19 @@ public class TableServiceCmdService {
 
     }
 
+    private void handlerRequired(JSONObject commitData, List<GenTableColumn> columns) {
+        for (GenTableColumn column : columns) {
+            if (GenTableColumn.IS_REQUIRED.equalsIgnoreCase(column.getIsRequired())) {
+                Object value = commitData.get(column.getColumnName());
+                if ((value instanceof String)) {
+                    requireNonNull((String) value, column.getColumnComment() + " 为必填项");
+                } else {
+                    requireNonNull(value, column.getColumnComment() + " 为必填项");
+                }
+            }
+        }
+    }
+
     /**
      * 功能描述: 通用删除接口 (真的删除)
      *
@@ -207,7 +223,7 @@ public class TableServiceCmdService {
 
         List<JSONObject> result = selectService.selectByCondition(genTable.getTableName(), condition, packCondition
                 , showData, dto.getOrderBy(), dto.getLimit(), dto.getOffset());
-
+        handlerBlobWithJSONObject(genTable.getIsContainsBlob(), result);
         handler(result =  filter(result, ObjectUtils::isNotEmpty), columns);
         // 定制接口
         result = isCustomized(dto.getTable(),result,"trigger_retrieve");
@@ -390,6 +406,7 @@ public class TableServiceCmdService {
         // 默认查所有字段,不支持自定义
         JSONObject json = selectService.selectById(tableName, pkName, id);
         requireNonNull(json, "id 为[" + id + "]的数据不存在, 表名为[" + tableName + "]");
+        handlerBlobWithJSONObject(genTable.getIsContainsBlob(), Collections.singletonList(json));
         List<GenTableColumn> parentColumns = GenUtils.filterHrAndSort(columns);
 
         // 处理成hr的形式

+ 3 - 10
boman-web-core/src/main/java/com/boman/web/core/service/save/BaseSaveServiceImpl.java

@@ -47,19 +47,12 @@ public class BaseSaveServiceImpl implements IBaseSaveService {
     public RowResult insertRow(TableContext context, Long maxId) {
         List<GenTableColumn> columns = context.getColumns();
         JSONObject commitData = context.getCommitData();
-        String pkName = context.getPkName();
-        String tableName = context.getTableName();
-        Timestamp currentTime = new Timestamp(System.currentTimeMillis());
-        commitData.put(pkName.toUpperCase(), maxId);
-
-        ColumnUtils.packUpdateByAndTime(columns, commitData, currentTime);
+        ColumnUtils.packUpdateByAndTime(columns, commitData, new Timestamp(System.currentTimeMillis()), true);
         // 处理默认值
         handlerDefaultValue(commitData, columns);
 
-        // 默认创建人和创建时间是都有的
-        commitData.put(FormDataConstant.CREATE_TIME.toUpperCase(), currentTime);
-        commitData.put(FormDataConstant.CREATE_BY.toUpperCase(), SecurityUtils.getUserId());
-        int ret = mapper.insert(tableName, commitData);
+        commitData.put(context.getPkName(), maxId);
+        int ret = mapper.insert(context.getTableName(), commitData);
         if (ret > 0) {
             LOGGER.info("保存成功,保存的数据为:{}", commitData);
             commitData.put(FormDataConstant.SUCCESS_CNT, ret);

+ 1 - 1
boman-web-core/src/main/java/com/boman/web/core/service/update/BaseUpdateServiceImpl.java

@@ -47,8 +47,8 @@ public class BaseUpdateServiceImpl implements IBaseUpdateService {
         List<GenTableColumn> columns = context.getColumns();
         Timestamp currentTime = new Timestamp(System.currentTimeMillis());
 
+        ColumnUtils.packUpdateByAndTime(columns, commitData, currentTime, false);
         commitData = ObjectUtils.ifNullSetEmpty(escapeByQueryType(columns, commitData));
-        ColumnUtils.packUpdateByAndTime(columns, commitData, currentTime);
 
         return mapper.updateByIdList(tableName, pkName, idList, commitData);
     }

+ 84 - 12
boman-web-core/src/main/java/com/boman/web/core/utils/ColumnUtils.java

@@ -5,17 +5,19 @@ import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.SecurityUtils;
 import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.gen.domain.GenTableColumn;
-import com.boman.web.core.constant.FormDataConstant;
 import com.google.common.collect.Lists;
 import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.BooleanUtils;
 
+import java.nio.charset.StandardCharsets;
 import java.sql.Timestamp;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
 
 import static com.boman.common.core.utils.obj.ObjectUtils.*;
-import static com.boman.web.core.constant.FormDataConstant.HR;
+import static com.boman.web.core.constant.FormDataConstant.*;
 
 /**
  * @author shiqian
@@ -29,21 +31,41 @@ public class ColumnUtils {
      * @param columns     所有的列
      * @param jsonObject  需要返回的数据
      * @param currentTime currentTime
+     * @param isSave      新增true、修改false
      */
-    public static void packUpdateByAndTime(List<GenTableColumn> columns, JSONObject jsonObject, Timestamp currentTime) {
+    public static void packUpdateByAndTime(List<GenTableColumn> columns, JSONObject jsonObject, Timestamp currentTime, boolean isSave) {
         for (GenTableColumn column : columns) {
-            // 判断是否有修改人、修改时间
-            if (FormDataConstant.UPDATE_BY.equalsIgnoreCase(column.getColumnName())) {
-                jsonObject.put(FormDataConstant.UPDATE_BY, SecurityUtils.getUserId());
+            String columnName = column.getColumnName();
+            if (UPDATE_BY.equalsIgnoreCase(columnName)) {
+                jsonObject.put(columnName, SecurityUtils.getUsername());
+                continue;
             }
-            if (FormDataConstant.UPDATE_TIME.equalsIgnoreCase(column.getColumnName())) {
-                jsonObject.put(FormDataConstant.UPDATE_TIME, currentTime);
+
+            if (UPDATE_TIME.equalsIgnoreCase(columnName)) {
+                jsonObject.put(columnName, currentTime.toString());
+                continue;
             }
 
-            // 如果某一列是datetime类型,需要把类型转成datetime,否则数据库会报错
-            if (FormDataConstant.DATETIME.equalsIgnoreCase(column.getColumnType())) {
-                String columnName = column.getColumnName().toUpperCase();
-                jsonObject.put(columnName, jsonObject.getTimestamp(columnName));
+            if (isSave) {
+                if (CREATE_TIME.equalsIgnoreCase(columnName)) {
+                    jsonObject.put(columnName, currentTime.toString());
+                    continue;
+                }
+                if (CREATE_BY.equalsIgnoreCase(columnName)) {
+                    jsonObject.put(columnName, SecurityUtils.getUsername());
+                    continue;
+                }
+                if (DATETIME.equalsIgnoreCase(column.getColumnType())) {
+                    Object value = jsonObject.get(columnName);
+                    if (isEmpty(((String) value))) {
+                        jsonObject.put(columnName, currentTime.toString());
+                    }
+                }
+            } else {
+                // 修改时,修改非创建时间的其他时间类型
+                if (!CREATE_TIME.equalsIgnoreCase(columnName) && DATETIME.equalsIgnoreCase(column.getColumnType())) {
+                    jsonObject.put(columnName, currentTime.toString());
+                }
             }
         }
     }
@@ -177,4 +199,54 @@ public class ColumnUtils {
             }
         }
     }
+
+    /**
+     * 功能描述: 根据从数据库查出来的返回值来确实是否是blob, 转为字符串! 转为字符串! 转为字符串!
+     *
+     * @param isContainsBlob 此表中的字段是否含有blob的列, true含
+     * @param result         result
+     */
+    public static void handlerBlobWithJSONObject(Boolean isContainsBlob, List<JSONObject> result) {
+        // 不包含
+        if (BooleanUtils.isFalse(isContainsBlob)) {
+            return;
+        }
+
+        for (JSONObject jsonObject : result) {
+            for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
+                Object value = entry.getValue();
+                if (isNotEmpty(value) && BYTE_ARRAY.equals(value.getClass().getSimpleName())) {
+                    entry.setValue(byteToString(((byte[]) value)));
+                }
+            }
+        }
+    }
+
+    /**
+     * 功能描述: 根据从数据库查出来的返回值来确实是否是blob, 转为字符串! 转为字符串! 转为字符串!
+     *
+     * @param result result
+     */
+    public static void handlerBlobWithTableColumn(Boolean isContainsBlob, List<GenTableColumn> result) {
+        // 不包含
+        if (BooleanUtils.isFalse(isContainsBlob)) {
+            return;
+        }
+
+        for (GenTableColumn column : result) {
+            Object value = column.getColumnValue();
+            if (isNotEmpty(value) && BYTE_ARRAY.equals(value.getClass().getSimpleName())) {
+                column.setColumnValue(byteToString(((byte[]) value)));
+            }
+        }
+    }
+
+    public static String byteToString(byte[] bytes) {
+        String result = "";
+        if (ArrayUtils.isNotEmpty(bytes)) {
+            result = new String(bytes, StandardCharsets.UTF_8);
+        }
+
+        return result;
+    }
 }