sr 4 жил өмнө
parent
commit
b3d988a1d3
37 өөрчлөгдсөн 1067 нэмэгдсэн , 320 устгасан
  1. 10 0
      boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteDictDataService.java
  2. 46 4
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/obj/ObjectUtils.java
  3. 31 14
      boman-modules/boman-gen/src/main/java/com/boman/gen/controller/MyController.java
  4. 22 0
      boman-modules/boman-gen/src/main/java/com/boman/gen/domain/GenTableColumn.java
  5. 16 1
      boman-modules/boman-gen/src/main/java/com/boman/gen/domain/GenTableRelation.java
  6. 7 0
      boman-modules/boman-gen/src/main/java/com/boman/gen/mapper/GenTableColumnMapper.java
  7. 10 0
      boman-modules/boman-gen/src/main/java/com/boman/gen/service/GenTableColumnServiceImpl.java
  8. 7 0
      boman-modules/boman-gen/src/main/java/com/boman/gen/service/IGenTableColumnService.java
  9. 8 1
      boman-modules/boman-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml
  10. 5 1
      boman-modules/boman-gen/src/main/resources/mapper/generator/GenTableRelationMapper.xml
  11. 8 0
      boman-modules/boman-system/src/main/java/com/boman/system/controller/SysDictDataController.java
  12. 1 1
      boman-modules/boman-system/src/main/java/com/boman/system/controller/SysMenuController.java
  13. 5 5
      boman-modules/boman-system/src/main/java/com/boman/system/domain/SysMenu.java
  14. 13 0
      boman-modules/boman-system/src/main/java/com/boman/system/domain/vo/RouterVo.java
  15. 48 6
      boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysMenuServiceImpl.java
  16. 1 1
      boman-modules/boman-system/src/main/resources/mapper/system/SysDictDataMapper.xml
  17. 1 1
      boman-modules/boman-system/src/main/resources/mapper/system/SysMenuMapper.xml
  18. 11 0
      boman-web-core/src/main/java/com/boman/web/core/constant/FormDataConstant.java
  19. 55 0
      boman-web-core/src/main/java/com/boman/web/core/controller/ObjController.java
  20. 1 1
      boman-web-core/src/main/java/com/boman/web/core/controller/TableController.java
  21. 14 0
      boman-web-core/src/main/java/com/boman/web/core/domain/BaseTableSaveDTO.java
  22. 2 2
      boman-web-core/src/main/java/com/boman/web/core/mapper/StandardlyMapper.java
  23. 163 57
      boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java
  24. 2 2
      boman-web-core/src/main/java/com/boman/web/core/service/delete/BaseDeleteServiceImpl.java
  25. 26 18
      boman-web-core/src/main/java/com/boman/web/core/service/save/BaseSaveServiceImpl.java
  26. 7 6
      boman-web-core/src/main/java/com/boman/web/core/service/save/IBaseSaveService.java
  27. 2 2
      boman-web-core/src/main/java/com/boman/web/core/service/select/BaseSelectServiceImpl.java
  28. 2 2
      boman-web-core/src/main/java/com/boman/web/core/service/submit/BaseSubmitServiceImpl.java
  29. 2 2
      boman-web-core/src/main/java/com/boman/web/core/service/update/BaseUpdateServiceImpl.java
  30. 2 2
      boman-web-core/src/main/java/com/boman/web/core/utils/IdUtils.java
  31. 1 0
      ruoyi-ui/src/api/system/config.js
  32. 10 2
      ruoyi-ui/src/api/system/table.js
  33. 93 121
      ruoyi-ui/src/components/DynamicForms/index.vue
  34. 179 0
      ruoyi-ui/src/components/MemoranDum/index.vue
  35. 2 0
      ruoyi-ui/src/main.js
  36. 197 35
      ruoyi-ui/src/views/index.vue
  37. 57 33
      ruoyi-ui/src/views/system/table/index.vue

+ 10 - 0
boman-api/boman-api-system/src/main/java/com/boman/system/api/RemoteDictDataService.java

@@ -23,5 +23,15 @@ public interface RemoteDictDataService {
      */
     @GetMapping(value = "/dict/data/type/data/{dictType}")
     List<SysDictData> listByType(@PathVariable(value = "dictType") String dictType);
+
+    /**
+     * 功能描述: 根据type和value查字典值
+     *
+     * @param dictType  dictType
+     * @param dictValue dictValue
+     * @return java.lang.String
+     */
+    @GetMapping(value = "/dict/data/type/data/{dictType}/{dictValue}")
+    String selectDictLabel(@PathVariable("dictType") String dictType, @PathVariable("dictValue") String dictValue);
 }
 

+ 46 - 4
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/obj/ObjectUtils.java

@@ -6,10 +6,10 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 /**
  * @author shiqian
@@ -176,4 +176,46 @@ public class ObjectUtils {
     public static boolean ltZero(Long aLong) {
         return null != aLong && aLong < 0;
     }
+
+
+    /**
+     * 功能描述: 根据规则过滤
+     *
+     * @param input     原数据
+     * @param predicate FunctionalInterface
+     * @return java.util.List<T>
+     */
+    public static <T> List<T> filter(List<T> input, Predicate<T> predicate) {
+        return requireNonNull(input, "list is null")
+                .stream().filter(predicate).collect(Collectors.toList());
+    }
+
+    /**
+     * 功能描述: 根据规则获取
+     *
+     * @param input    原数据
+     * @param function FunctionalInterface
+     * @return java.util.List<T>
+     */
+    public static <T, R> List<R> map(List<T> input, Function<T, R> function) {
+        return requireNonNull(input, "list is null")
+                .stream().map(function).collect(Collectors.toList());
+    }
+
+
+    /**
+     * 功能描述: 根据规则获取单个
+     *
+     * @param input    原数据
+     * @param function FunctionalInterface
+     * @return java.util.List<T>
+     */
+    public static <T, R> R mapFirst(List<T> input, Function<T, R> function) {
+        requireNonNull(input, "list is null");
+        List<R> rList = input.stream().map(function).collect(Collectors.toList());
+        requireNonNull(rList, "rList is null");
+        Optional<R> optionalR = rList.stream().findFirst();
+        return optionalR.orElse(null);
+    }
+
 }

+ 31 - 14
boman-modules/boman-gen/src/main/java/com/boman/gen/controller/MyController.java

@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -70,22 +71,36 @@ public class MyController extends BaseController {
     /**
      * 功能描述: 把主表关联的附表的信息和附表的字段信息存进redis
      *
-     * @param tableList    tableList
-     * @param relationList 主表和附表的关联信息
+     * @param tableList    tableList 所有表对象信息
+     * @param relationList 所有主表和附表的关联关系
+     * @param tableColumns 所有表字段
      */
     private void packRelationAndInsertToRedis(List<GenTable> tableList, List<GenTableRelation> relationList
             , List<GenTableColumn> tableColumns) {
         for (GenTable table : tableList) {
             List<GenTable> tableListTemp = new ArrayList<>(16);
+            //对关联关系表进行排序
+            relationList = relationList.stream().sorted(Comparator.comparing(GenTableRelation::getRelationParentId).thenComparing(GenTableRelation::getSort)).collect(Collectors.toList());
+
             for (GenTableRelation relation : relationList) {
                 if (relation.getRelationParentId().equals(table.getTableId())) {
+                    //关联主表PK gen_table_column的id
                     Long childId = relation.getRelationChildId();
-                    // 存了附表的建表信息和表的所有字段信息
-                    // todo
-                    List<GenTable> collect = tableList.stream()
-                            .filter(genTable -> genTable.getTableId().equals(childId))
-                            .collect(Collectors.toList());
-                    tableListTemp.add(collect.get(0));
+                    //根据gen_table_column的id查询出表id
+                    GenTableColumn genTableColumn = genTableColumnService.selectGenTableColumnListByColumnId(childId);
+                    // TODO: 2021/4/8
+                    //从tableList中去取出对应表的对象
+                    if (genTableColumn != null) {
+                        List<GenTable> collect = tableList.stream()
+                                .filter(genTable -> genTable.getTableId().equals(genTableColumn.getTableId()))
+                                .collect(Collectors.toList());
+                        GenTable genTable = collect.get(0);
+                        List<GenTableColumn> collectColumn = tableColumns.stream()
+                                .filter(genTableColumns -> genTableColumns.getTableId().equals(genTableColumn.getTableId()))
+                                .collect(Collectors.toList());
+                        genTable.setColumns(collectColumn);
+                        tableListTemp.add(genTable);
+                    }
                 }
             }
             table.setRelationList(tableListTemp);
@@ -114,12 +129,14 @@ public class MyController extends BaseController {
     }
 
 
-    /**手动更新redis缓存表数据
-    * @Description
-    * @author tjf
-    * @Date 2021/3/29
-    */
-    public AjaxResult updateRedisTable(){
+    /**
+     * 手动更新redis缓存表数据
+     *
+     * @Description
+     * @author tjf
+     * @Date 2021/3/29
+     */
+    public AjaxResult updateRedisTable() {
         //获取所有的表和表字段,更新到redis中
         List<GenTable> tableList = genTableService.selectGenTableList(new GenTable());
         if (null == tableList || tableList.isEmpty()) {

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

@@ -86,6 +86,12 @@ public class GenTableColumn extends BaseEntity
     /** 如果是下拉框,单选,复选框 对应的子节点的值 */
     private List<SysDictData> sysDictData;
 
+    /** 哪些字段属于这些hr的 */
+    private Long hrParentId;
+
+    /** hr的孩子们 */
+    private List<GenTableColumn> hrChildren;
+
     public String getForeignKey() {
         return foreignKey;
     }
@@ -404,4 +410,20 @@ public class GenTableColumn extends BaseEntity
     public void setSysDictData(List<SysDictData> sysDictData) {
         this.sysDictData = sysDictData;
     }
+
+    public Long getHrParentId() {
+        return hrParentId;
+    }
+
+    public void setHrParentId(Long hrParentId) {
+        this.hrParentId = hrParentId;
+    }
+
+    public List<GenTableColumn> getHrChildren() {
+        return hrChildren;
+    }
+
+    public void setHrChildren(List<GenTableColumn> hrChildren) {
+        this.hrChildren = hrChildren;
+    }
 }

+ 16 - 1
boman-modules/boman-gen/src/main/java/com/boman/gen/domain/GenTableRelation.java

@@ -35,10 +35,23 @@ public class GenTableRelation extends BaseEntity {
     private Long relationType;
 
     /**
-     * 是否删除(1是)
+     * 排序
+     */
+    private Long sort;
+
+    /**
+     * 是否删除(Y是)
      */
     private String isDel;
 
+    public Long getSort() {
+        return sort;
+    }
+
+    public void setSort(Long sort) {
+        this.sort = sort;
+    }
+
     public Long getId() {
         return id;
     }
@@ -87,6 +100,7 @@ public class GenTableRelation extends BaseEntity {
         this.isDel = isDel;
     }
 
+
     @Override
     public String toString() {
         return "GenTableRelation{" +
@@ -95,6 +109,7 @@ public class GenTableRelation extends BaseEntity {
                 ", relationParentId=" + relationParentId +
                 ", relationChildId=" + relationChildId +
                 ", relationType=" + relationType +
+                ", sort=" + sort +
                 ", isDel='" + isDel + '\'' +
                 '}';
     }

+ 7 - 0
boman-modules/boman-gen/src/main/java/com/boman/gen/mapper/GenTableColumnMapper.java

@@ -27,6 +27,13 @@ public interface GenTableColumnMapper
      */
     public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
 
+    /**
+     * 根据gen_table_column的id查询字段对象
+     * @param columnId
+     * @return
+     */
+    public GenTableColumn selectGenTableColumnListByColumnId(Long columnId);
+
     /**
      * 查询业务字段列表
      *

+ 10 - 0
boman-modules/boman-gen/src/main/java/com/boman/gen/service/GenTableColumnServiceImpl.java

@@ -32,6 +32,16 @@ public class GenTableColumnServiceImpl implements IGenTableColumnService {
         return genTableColumnMapper.selectGenTableColumnListByTableId(tableId);
     }
 
+    /**
+     * 根据gen_table_column的id查询字段对象
+     * @param columnId
+     * @return
+     */
+    @Override
+    public GenTableColumn selectGenTableColumnListByColumnId(Long columnId) {
+        return   genTableColumnMapper.selectGenTableColumnListByColumnId(columnId);
+    }
+
     /**
      * 查询业务字段列表
      *

+ 7 - 0
boman-modules/boman-gen/src/main/java/com/boman/gen/service/IGenTableColumnService.java

@@ -18,6 +18,13 @@ public interface IGenTableColumnService
      */
     public List<GenTableColumn> selectGenTableColumnListByTableId(Long tableId);
 
+    /**
+     * 根据gen_table_column的id查询字段对象
+     * @param columnId
+     * @return
+     */
+    public GenTableColumn selectGenTableColumnListByColumnId(Long columnId);
+
     /**
      * 查询业务字段列表
      *

+ 8 - 1
boman-modules/boman-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml

@@ -28,10 +28,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="createTime"     column="create_time"    />
         <result property="updateBy"       column="update_by"      />
         <result property="updateTime"     column="update_time"    />
+        <result property="hrParentId"     column="hr_parent_id"    />
     </resultMap>
 	
 	<sql id="selectGenTableColumnVo">
-        select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, foreign_key, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column
+        select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, foreign_key, dict_type, sort, create_by, create_time, update_by, update_time, hr_parent_id from gen_table_column
     </sql>
 	
     <select id="selectGenTableColumnListByTableId" parameterType="GenTableColumn" resultMap="GenTableColumnResult">
@@ -40,6 +41,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by sort
     </select>
 
+    <select id="selectGenTableColumnListByColumnId" parameterType="GenTableColumn" resultMap="GenTableColumnResult">
+        <include refid="selectGenTableColumnVo"/>
+        where column_id = #{columnId}
+       limit 1
+    </select>
+
     <select id="listByTableIdList" parameterType="GenTableColumn" resultMap="GenTableColumnResult">
         <include refid="selectGenTableColumnVo"/>
         where table_id in

+ 5 - 1
boman-modules/boman-gen/src/main/resources/mapper/generator/GenTableRelationMapper.xml

@@ -10,6 +10,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="relationParentId"     column="relation_parent_id"      />
 		<result property="relationChildId"     column="relation_child_id"      />
 		<result property="relationType"     column="relation_type"      />
+		<result property="sort"     column="sort"      />
 		<result property="createBy"     column="create_by"      />
 		<result property="createTime"     column="create_time"      />
 		<result property="updateBy"     column="update_by"      />
@@ -18,7 +19,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</resultMap>
 
 	<sql id="selectGenTableRelationVo">
-        select id, description, relation_parent_id, relation_child_id, relation_type, create_by, create_time, update_by, update_time, is_del
+        select id, description, relation_parent_id, relation_child_id, relation_type, sort, create_by, create_time, update_by, update_time, is_del
 		from gen_table_relation
     </sql>
 
@@ -58,6 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<if test="relationParentId != null">relation_parent_id,</if>
 		<if test="relationChildId != null">relation_child_id,</if>
 		<if test="relationType != null">relation_type,</if>
+		<if test="sort != null">sort,</if>
 		<if test="createBy != null and createBy != ''">create_by,</if>
 		<if test="updateBy != null and updateBy != ''">update_by,</if>
 		<if test="updateTime != null and updateTime != ''">update_time,</if>
@@ -67,6 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<if test="relationParentId != null">#{relationParentId},</if>
 		<if test="relationChildId != null">#{relationChildId},</if>
 		<if test="relationType != null">#{relationType},</if>
+		<if test="sort != null">#{sort},</if>
 		<if test="createBy != null and createBy != ''">#{createBy},</if>
 		<if test="updateBy != null and updateBy != ''">#{updateBy},</if>
 		<if test="updateTime != null and updateTime != ''">#{updateTime},</if>
@@ -81,6 +84,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="relationParentId != null">relation_parent_id = #{relationParentId},</if>
 			<if test="relationChildId != null">relation_child_id = #{relationChildId},</if>
 			<if test="relationType != null">relation_type = #{relationType},</if>
+			<if test="sort != null">sort = #{sort},</if>
 			<if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
 			<if test="create_time != null">create_time = #{createTime},</if>
 			<if test="updateBy != null and updateBy != null">update_by = #{updateBy},</if>

+ 8 - 0
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysDictDataController.java

@@ -93,6 +93,14 @@ public class SysDictDataController extends BaseController
         return dictTypeService.selectDictDataByType(dictType);
     }
 
+    /**
+     * 根据字典类型查询字典数据信息
+     */
+    @GetMapping(value = "/type/data/{dictType}/{dictValue}")
+    public String selectDictLabel(@PathVariable("dictType") String dictType, @PathVariable("dictValue") String dictValue) {
+        return dictDataService.selectDictLabel(dictType, dictValue);
+    }
+
     /**
      * 新增字典类型
      */

+ 1 - 1
boman-modules/boman-system/src/main/java/com/boman/system/controller/SysMenuController.java

@@ -167,7 +167,7 @@ public class SysMenuController extends BaseController
      * @Author: tjf
      * @Date: 2021/3/24
      */
-    @PostMapping("addTable")
+    @PostMapping("/addTable")
     public AjaxResult add(@Validated @RequestBody GenTable genTable) {
         return menuService.insertGenTable(genTable);
     }

+ 5 - 5
boman-modules/boman-system/src/main/java/com/boman/system/domain/SysMenu.java

@@ -65,14 +65,14 @@ public class SysMenu extends BaseEntity
     /**
      * 对应的表名称
      */
-    private String tableName;
+    private String sysTableName;
 
-    public String getTableName() {
-        return tableName;
+    public String getSysTableName() {
+        return sysTableName;
     }
 
-    public void setTableName(String tableName) {
-        this.tableName = tableName;
+    public void setSysTableName(String sysTableName) {
+        this.sysTableName = sysTableName;
     }
 
     public Long getId()

+ 13 - 0
boman-modules/boman-system/src/main/java/com/boman/system/domain/vo/RouterVo.java

@@ -46,11 +46,24 @@ public class RouterVo
      */
     private MetaVo meta;
 
+    /**
+     * 表名称
+     */
+    private String sysTableName;
+
     /**
      * 子路由
      */
     private List<RouterVo> children;
 
+    public String getSysTableName() {
+        return sysTableName;
+    }
+
+    public void setSysTableName(String sysTableName) {
+        this.sysTableName = sysTableName;
+    }
+
     public String getName()
     {
         return name;

+ 48 - 6
boman-modules/boman-system/src/main/java/com/boman/system/service/impl/SysMenuServiceImpl.java

@@ -165,6 +165,9 @@ public class SysMenuServiceImpl implements ISysMenuService
             router.setPath(getRouterPath(menu));
             router.setComponent(getComponent(menu));
             router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache())));
+            if (menu.getSysTableName() != null){
+                router.setSysTableName(menu.getSysTableName());
+            }
             List<SysMenu> cMenus = menu.getChildren();
             if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()))
             {
@@ -180,6 +183,9 @@ public class SysMenuServiceImpl implements ISysMenuService
                 children.setComponent(menu.getComponent());
                 children.setName(StringUtils.capitalize(menu.getPath()));
                 children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache())));
+                if (menu.getSysTableName() != null){
+                    children.setSysTableName(menu.getSysTableName());
+                }
                 childrenList.add(children);
                 router.setChildren(childrenList);
             }
@@ -504,11 +510,42 @@ public class SysMenuServiceImpl implements ISysMenuService
      * @param tableId
      */
     public void insertCommonColumn(Long tableId) {
-
-        String[] columnName = new String[]{"create_by", "create_time", "update_by", "update_time", "is_del"};
-        String[] columnComment = new String[]{"创建者", "创建时间", "更新者", "更新时间", "是否删除"};
-        String[] columnType = new String[]{"varchar(64)", "datetime", "varchar(64)", "datetime", "char(1)"};
-        String[] htmlType = new String[]{"input", "datetime", "input", "datetime", "select"};
+        GenTableColumn genTableColumnLog = new GenTableColumn();
+        GenTableColumn genTableColumnBaseInfo = new GenTableColumn();
+
+        genTableColumnLog.setTableId(tableId);
+        genTableColumnLog.setColumnName("log_info");
+        genTableColumnLog.setColumnComment("日志信息");
+        genTableColumnLog.setColumnType("varchar(255)");
+        genTableColumnLog.setIsPk("0");
+        genTableColumnLog.setIsIncrement("0");
+        genTableColumnLog.setIsInsert("1");
+        genTableColumnLog.setQueryType("LIKE");
+        genTableColumnLog.setHtmlType("input");
+        genTableColumnLog.setSort(7);
+        genTableColumnLog.setCreateBy("admin");
+        genTableColumnLog.setCreateTime(DateUtils.getNowDate());
+        genTableColumnMapper.insertGenTableColumn(genTableColumnLog);
+
+        genTableColumnBaseInfo.setTableId(tableId);
+        genTableColumnBaseInfo.setColumnName("base_info");
+        genTableColumnBaseInfo.setColumnComment("基本信息");
+        genTableColumnBaseInfo.setColumnType("varchar(255)");
+        genTableColumnBaseInfo.setIsPk("0");
+        genTableColumnBaseInfo.setIsIncrement("0");
+        genTableColumnBaseInfo.setIsInsert("1");
+        genTableColumnBaseInfo.setQueryType("LIKE");
+        genTableColumnBaseInfo.setHtmlType("input");
+        genTableColumnBaseInfo.setSort(8);
+        genTableColumnBaseInfo.setCreateBy("admin");
+        genTableColumnBaseInfo.setCreateTime(DateUtils.getNowDate());
+        genTableColumnMapper.insertGenTableColumn(genTableColumnBaseInfo);
+
+
+        String[] columnName = new String[]{"id", "create_by", "create_time", "update_by", "update_time", "is_del"};
+        String[] columnComment = new String[]{"编号","创建者", "创建时间", "更新者", "更新时间", "是否删除"};
+        String[] columnType = new String[]{"bigint(20)","varchar(64)", "datetime", "varchar(64)", "datetime", "char(1)"};
+        String[] htmlType = new String[]{"input", "input", "datetime", "input", "datetime", "select"};
         for (int i = 0; i < columnName.length; i++) {
             GenTableColumn genTableColumn = new GenTableColumn();
             genTableColumn.setTableId(tableId);
@@ -523,6 +560,11 @@ public class SysMenuServiceImpl implements ISysMenuService
             genTableColumn.setSort(i + 1);
             genTableColumn.setCreateBy("admin");
             genTableColumn.setCreateTime(DateUtils.getNowDate());
+            genTableColumn.setHrParentId(genTableColumnBaseInfo.getColumnId());
+            if (i == 0){
+                genTableColumn.setIsIncrement("1");
+                genTableColumn.setHrParentId(genTableColumnLog.getColumnId());
+            }
             genTableColumnMapper.insertGenTableColumn(genTableColumn);
         }
     }
@@ -543,7 +585,7 @@ public class SysMenuServiceImpl implements ISysMenuService
             sysMenu.setMenuType("C");
             sysMenu.setIcon("system");
             sysMenu.setCreateBy(SecurityUtils.getUsername());
-            sysMenu.setTableName(genTable.getTableName());
+            sysMenu.setSysTableName(genTable.getTableName());
             menuMapper.insertMenu(sysMenu);
             //是菜单,生成crud按钮
             for (int i = 0; i < Constants.MENU_NAME.length; i++) {

+ 1 - 1
boman-modules/boman-system/src/main/resources/mapper/system/SysDictDataMapper.xml

@@ -48,7 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	
 	<select id="selectDictLabel" resultType="java.lang.String">
 		select dict_label from sys_dict_data
-		where dict_type = #{dictType} and dict_value = #{dictValue}
+		where dict_type = #{dictType} and dict_value = #{dictValue} limit 1;
 	</select>
 	
 	<select id="selectDictDataById" parameterType="Long" resultMap="SysDictDataResult">

+ 1 - 1
boman-modules/boman-system/src/main/resources/mapper/system/SysMenuMapper.xml

@@ -24,7 +24,7 @@
 		<result property="updateTime"     column="update_time"    />
 		<result property="updateBy"       column="update_by"      />
 		<result property="remark"         column="remark"         />
-		<result property="sysTableName"         column="sys_table_name"         />
+		<result property="sysTableName"   column="sys_table_name" />
 	</resultMap>
 
 	<sql id="selectMenuVo">

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

@@ -88,6 +88,10 @@ public class FormDataConstant {
 
     /**  根据表名查询表单时,返回给前台列表展示的列*/
     public static final String TABLE_HEAD_LIST = "tableHeadList";
+    /**
+     * 查询主表的子表对象的头
+     */
+    public static final String REF = "ref";
 
     /**  分页  总条数*/
     public static final String PAGE_TOTAL = "total";
@@ -96,6 +100,10 @@ public class FormDataConstant {
     public static final String PAGE_ROWS = "rows";
 
 
+    /**  暂时是用作新增时,成功的记录数 */
+    public static final String SUCCESS_CNT = "successCnt";
+
+
     /**  数据库字段创建人*/
     public static final String UPDATE_BY = "UPDATE_BY";
 
@@ -129,6 +137,9 @@ public class FormDataConstant {
     /**  需要查字典表的框框 */
     public static final List<String> NEED_QUERY_DICT_LIST = Lists.newArrayList(RADIO, CHECKBOX, SELECT);
 
+    /**  hr 日志、基础信息..... */
+    public static final String HR = "hr";
+
 
 
 }

+ 55 - 0
boman-web-core/src/main/java/com/boman/web/core/controller/ObjController.java

@@ -152,6 +152,61 @@ public class ObjController {
         return tableServiceCmdService.getTableQuery(condition);
     }
 
+    /**
+     * 功能描述: 获取表单查询字段
+     * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
+     * 刷新的入口为 {@link MyController#loadTable(com.boman.gen.domain.GenTable)}
+     *
+     *                    eg:{
+     *                          "table": "sys_config"
+     *                        }
+     *
+     * @param condition condition
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    @ApiOperation(value = "获取表单查询字段")
+    @PostMapping("/getQueryParam")
+    public AjaxResult getQueryParam(@RequestBody BaseTableSaveDTO condition) {
+        return tableServiceCmdService.getQueryParam(condition);
+    }
+
+
+    /**
+     * 功能描述: 获取表单表头
+     * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
+     * 刷新的入口为 {@link MyController#loadTable(com.boman.gen.domain.GenTable)}
+     *
+     *                    eg:{
+     *                          "table": "sys_config"
+     *                        }
+     *
+     * @param condition condition
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    @ApiOperation(value = "获取表单表头")
+    @PostMapping("/getTableHead")
+    public AjaxResult getTableHead(@RequestBody BaseTableSaveDTO condition) {
+        return tableServiceCmdService.getTableHead(condition);
+    }
+
+    /**
+     * 功能描述: 获取表单按钮
+     * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
+     * 刷新的入口为 {@link MyController#loadTable(com.boman.gen.domain.GenTable)}
+     *
+     *                    eg:{
+     *                          "table": "sys_config"
+     *                        }
+     *
+     * @param condition condition
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    @ApiOperation(value = "获取表单按钮")
+    @PostMapping("/getButton")
+    public AjaxResult getButton(@RequestBody BaseTableSaveDTO condition) {
+        return tableServiceCmdService.getButton(condition);
+    }
+
     /**
      * 功能描述: 获取表单子表
      *

+ 1 - 1
boman-web-core/src/main/java/com/boman/web/core/controller/TableController.java

@@ -24,7 +24,7 @@ public class TableController {
     private TableServiceCmdService tableServiceCmdService;
 
     /**
-     * 功能描述: 反提交接口, 更改的字段类型和字段值都是一致的
+     * 功能描述: 根据表名获取表信息、表字段和表字段对应的字典值
      *                {
      *                    "table": "sys_config",
      *                }

+ 14 - 0
boman-web-core/src/main/java/com/boman/web/core/domain/BaseTableSaveDTO.java

@@ -74,6 +74,12 @@ public class BaseTableSaveDTO implements Serializable {
     @JSONField(name = "status")
     private String status;
 
+    /**
+     * 跳转新增或者编辑页面显示的类型带不带折叠,如果isUi=true, 带折叠
+     */
+    @JSONField(name = "isUi")
+    private Boolean isUi;
+
 
     public int getLimit() {
         return pageNo == 0 ? 0 : (pageNo - 1) * pageSize;
@@ -174,6 +180,14 @@ public class BaseTableSaveDTO implements Serializable {
     public void setPageSize(Integer pageSize) {
         this.pageSize = pageSize;
     }
+
+    public Boolean getIsUi() {
+        return isUi;
+    }
+
+    public void setIsUi(Boolean ui) {
+        isUi = ui;
+    }
 }
 
 

+ 2 - 2
boman-web-core/src/main/java/com/boman/web/core/mapper/StandardlyMapper1.java → boman-web-core/src/main/java/com/boman/web/core/mapper/StandardlyMapper.java

@@ -24,9 +24,9 @@ import static com.boman.web.core.constant.FormDataConstant.*;
  **/
 @Mapper
 @Component
-public interface StandardlyMapper1 {
+public interface StandardlyMapper {
 
-    Logger LOGGER = LoggerFactory.getLogger(StandardlyMapper1.class);
+    Logger LOGGER = LoggerFactory.getLogger(StandardlyMapper.class);
 
     @UpdateProvider(
             type = SqlProvider.class,

+ 163 - 57
boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java

@@ -17,7 +17,6 @@ import com.boman.gen.domain.GenTable;
 import com.boman.gen.domain.GenTableColumn;
 import com.boman.gen.domain.GenTableRelation;
 import com.boman.system.api.RemoteDictDataService;
-import com.boman.web.core.constant.DictConstant;
 import com.boman.web.core.constant.FormDataConstant;
 import com.boman.web.core.constant.SubmitConstant;
 import com.boman.web.core.domain.*;
@@ -29,6 +28,7 @@ import com.boman.web.core.service.update.IBaseUpdateService;
 import com.boman.web.core.utils.IdUtils;
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
+import org.apache.commons.lang3.BooleanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -38,12 +38,11 @@ import javax.annotation.Resource;
 import java.sql.Timestamp;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
-import static com.boman.common.core.utils.obj.ObjectUtils.ifNullSetEmpty;
-import static com.boman.common.core.utils.obj.ObjectUtils.requireNonNull;
-import static com.boman.web.core.constant.FormDataConstant.CONDITION;
-import static com.boman.web.core.constant.FormDataConstant.SHOW_DATA;
+import static com.boman.common.core.utils.obj.ObjectUtils.*;
+import static com.boman.web.core.constant.FormDataConstant.*;
 
 /**
  * @author shiqian
@@ -68,7 +67,7 @@ public class TableServiceCmdService {
     @Resource
     private  RestTemplate restTemplate;
     @Resource
-    private RemoteDictDataService dictTypeService;
+    private RemoteDictDataService remoteDictDataService;
     @Resource
     private RemoteGenTableService remoteGenTableService;
 
@@ -91,15 +90,10 @@ public class TableServiceCmdService {
         String pkName = IdUtils.getPkName(columns);
         requireNonNull(pkName, "主键名称为空");
 
-        //
-        List<String> allColumnNameList = columns.stream()
-                .map(GenTableColumn::getColumnName)
-                .collect(Collectors.toList());
-
         // 新增
         if (ObjectUtils.ltZero(baseTableDTO.getObjId())) {
             Long maxId = IdUtils.getMaxId(baseTableDTO.getTable(), pkName);
-            RowResult rowResult = saveService.insertRow(context.getRealTableName(), pkName, maxId, context.getRows().get(0), allColumnNameList);
+            RowResult rowResult = saveService.insertRow(context.getRealTableName(), pkName, maxId, context.getRows().get(0), columns);
             if (RowResult.checkSuccess(rowResult)) {
                 LOGGER.info("保存成功,封装到数据库的数据为: {}", JSON.toJSONString(rowResult.getData()));
             } else {
@@ -209,7 +203,8 @@ public class TableServiceCmdService {
 
         List<JSONObject> result = selectService.selectByCondition(genTable.getTableName(), condition, packCondition
                 , showData, dto.getOrderBy(), dto.getLimit(), dto.getOffset());
-        handlerDate(result);
+        handlerDate(result, columns);
+        handlerSysDictData(result, columns);
         result = isCustomized(dto.getTable(),result,"trigger_retrieve");
         rows.put(FormDataConstant.PAGE_ROWS, result);
         return AjaxResult.success(rows);
@@ -220,13 +215,38 @@ public class TableServiceCmdService {
      *
      * @param result 被转的数据
      */
-    private void handlerDate(List<JSONObject> result) {
+    private void handlerDate(List<JSONObject> result, List<GenTableColumn> columns) {
         if (org.apache.commons.collections4.CollectionUtils.isEmpty(result)) {
             return;
         }
+
         for (JSONObject jsonObject : result) {
-            getStrByTimeStamp(jsonObject, FormDataConstant.CREATE_TIME);
-            getStrByTimeStamp(jsonObject, FormDataConstant.UPDATE_TIME.toLowerCase());
+            for (GenTableColumn column : columns) {
+                if (jsonObject.containsKey(column.getColumnName()) && DATETIME.equalsIgnoreCase(column.getColumnType())) {
+                    getStrByTimeStamp(jsonObject, column.getColumnName());
+                }
+            }
+        }
+    }
+
+    /**
+     * 功能描述: 把返回值中含有字典值的转为可视化的心事
+     *
+     * @param result 被转的数据
+     */
+    private void handlerSysDictData(List<JSONObject> result, List<GenTableColumn> columns) {
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(result)) {
+            return;
+        }
+
+        for (JSONObject jsonObject : result) {
+            for (GenTableColumn column : columns) {
+                String dictType = column.getDictType();
+                if (isNotEmpty(dictType) && jsonObject.containsKey(column.getColumnName())) {
+                    String dictLabel = remoteDictDataService.selectDictLabel(dictType, jsonObject.getString(column.getColumnName()));
+                    jsonObject.put(column.getColumnName(), dictLabel);
+                }
+            }
         }
     }
 
@@ -239,7 +259,6 @@ public class TableServiceCmdService {
     private void getStrByTimeStamp(JSONObject jsonObject, String columnType) {
         Date date = jsonObject.getTimestamp(columnType);
         if (null != date) {
-
             jsonObject.put(columnType, DateUtils.dateTime(date));
         }
     }
@@ -318,7 +337,7 @@ public class TableServiceCmdService {
             if (GenTableColumn.IS_QUERY.equalsIgnoreCase(column.getIsQuery())) {
                 String dictType = column.getDictType();
                 if (ObjectUtils.isNotEmpty(dictType)) {
-                    List<SysDictData> sysDictData1 = dictTypeService.listByType(dictType);
+                    List<SysDictData> sysDictData1 = remoteDictDataService.listByType(dictType);
                     column.setSysDictData(sysDictData1);
                 }
 
@@ -330,12 +349,87 @@ public class TableServiceCmdService {
         // genTable.getMenuRole() 暂时数据库没有数据,
         jsonObject.put(FormDataConstant.BUTTON_LIST, Strings.nullToEmpty(genTable.getMenuRole()));
 
+        jsonObject.put(FormDataConstant.TABLE_HEAD_LIST, getTableHeadList(genTable));
+        return AjaxResult.success(jsonObject);
+    }
+
+    /**
+     * 功能描述: 获取表单查询字段
+     * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
+     * 刷新的入口为 {@link MyController#loadTable(com.boman.gen.domain.GenTable)}
+     *
+     *                    eg:{
+     *                          "table": "sys_config"
+     *                        }
+     *
+     * @param condition condition
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    public AjaxResult getQueryParam(BaseTableSaveDTO condition) {
+        GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, condition.getTable());
+        List<GenTableColumn> columns = genTable.getColumns();
+        // 查询字段
+        ArrayList<GenTableColumn> queryList = Lists.newArrayListWithCapacity(16);
+        for (GenTableColumn column : columns) {
+            if (GenTableColumn.IS_QUERY.equalsIgnoreCase(column.getIsQuery())) {
+                String dictType = column.getDictType();
+                if (ObjectUtils.isNotEmpty(dictType)) {
+                    List<SysDictData> sysDictData1 = remoteDictDataService.listByType(dictType);
+                    column.setSysDictData(sysDictData1);
+                }
+                queryList.add(column);
+            }
+        }
+
+        return AjaxResult.success(queryList);
+    }
+
+    /**
+     * 功能描述: 获取表单表头
+     * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
+     * 刷新的入口为 {@link MyController#loadTable(com.boman.gen.domain.GenTable)}
+     *
+     *                    eg:{
+     *                          "table": "sys_config"
+     *                        }
+     *
+     * @param condition condition
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    public AjaxResult getTableHead(BaseTableSaveDTO condition) {
+        GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, condition.getTable());
+        return AjaxResult.success(getTableHeadList(genTable));
+    }
+
+    /**
+     * 功能描述: 获取表单按钮
+     * 注意: 都是从redis中拿的,如果数据库和redis不一致,则需刷新一下redis
+     * 刷新的入口为 {@link MyController#loadTable(com.boman.gen.domain.GenTable)}
+     *
+     *                    eg:{
+     *                          "table": "sys_config"
+     *                        }
+     *
+     * @param condition condition
+     * @return com.boman.common.core.web.domain.AjaxResult
+     */
+    public AjaxResult getButton(BaseTableSaveDTO condition) {
+        GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, condition.getTable());
+        return AjaxResult.success("成功", Strings.nullToEmpty(genTable.getMenuRole()));
+    }
+
+
+    /**
+     * 根据表对象获取要显示的表头信息
+     * @param genTable
+     * @return
+     */
+    public List<GenTableColumn> getTableHeadList(GenTable genTable){
+        List<GenTableColumn> columns = genTable.getColumns();
         // 表头
-        List<GenTableColumn> tableHeadList = columns.stream()
+        return columns.stream()
                 .filter(genTableColumn -> GenTableColumn.IS_LIST.equals(genTableColumn.getIsList()))
                 .collect(Collectors.toList());
-        jsonObject.put(FormDataConstant.TABLE_HEAD_LIST, tableHeadList);
-        return AjaxResult.success(jsonObject);
     }
 
     /**
@@ -345,24 +439,16 @@ public class TableServiceCmdService {
      * @return com.boman.common.core.web.domain.AjaxResult
      */
     public AjaxResult objectTab(BaseTableSaveDTO condition) {
+        //获取到主表对象
         GenTable genTable = getTableFromRedisByTableName(RedisKey.RELATION, condition.getTable());
-
+        //从主表对象的relationList中获取出所有子表表对象
         List<GenTable> childTableList = genTable.getRelationList();
-        // 此表没有关联子表,查啥查
-        requireNonNull(childTableList);
-        // todo
-        for (GenTable childTable : childTableList) {
-            String childTableName = childTable.getTableName();
-            Long childTableTableId = childTable.getTableId();
-            List<GenTableColumn> childColumns = childTable.getColumns();
-            //  column_name = 先根据tableName查到id,再用id到relation中查到relation_child_id, 在用这个值去到tableColumn中查到column_name
-            // select * from childTableName where column_name = objId
-
-
-        }
-
-
-        return AjaxResult.success();
+        // 表头
+        List<GenTableColumn> tableHeadList = getTableHeadList(genTable);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put(FormDataConstant.REF, childTableList);
+        jsonObject.put(FormDataConstant.TABLE_HEAD_LIST, tableHeadList);
+        return AjaxResult.success(jsonObject);
     }
 
     public String getChildColumnNameByParentTableName(GenTable parentGenTable, Long childTableTableId){
@@ -517,7 +603,7 @@ public class TableServiceCmdService {
         GenTable genTable = redisService.getCacheObject(key);
         if (ObjectUtils.isEmpty(genTable)) {
             genTable = remoteGenTableService.getByTableName(tableName);
-            requireNonNull(genTable, "未找到表对应的信息");
+            requireNonNull(genTable, "数据库中,未找到表对应的信息");
             // {@link com.boman.gen.controller.MyController.packTableAndInsertToRedis} 失效时间
             redisService.setCacheObject(key, genTable, 12L, TimeUnit.DAYS);
         }
@@ -526,7 +612,7 @@ public class TableServiceCmdService {
     }
 
     /**
-     * 功能描述: 反提交接口, 更改的字段类型和字段值都是一致的
+     * 功能描述: 根据表名获取表信息、表字段和表字段对应的字典值
      *                {
      *                    "table": "sys_config",
      *                }
@@ -537,32 +623,52 @@ public class TableServiceCmdService {
      */
     public AjaxResult getByTableName(BaseTableSaveDTO condition) {
         requireNonNull(condition.getTable(), "表名为空");
+        requireNonNull(condition.getIsUi(), "根据表名获取表字段,未传 isUi 这个字段");
         GenTable genTable = getTableFromRedisByTableName(RedisKey.TABLE_INFO, condition.getTable());
-        List<GenTableColumn> columns = genTable.getColumns();
-        for (GenTableColumn column : columns) {
-            String dictType = column.getDictType();
-            if (ObjectUtils.isNotEmpty(dictType)) {
-                List<SysDictData> sysDictData1 = dictTypeService.listByType(dictType);
-                column.setSysDictData(sysDictData1);
+        List<GenTableColumn> allColumns = genTable.getColumns();
+        // 普通的展示,不带折叠的
+        if (BooleanUtils.isFalse(condition.getIsUi())) {
+            packDictDataToColumns(allColumns, ObjectUtils::isNotEmpty);
+            return AjaxResult.success(genTable);
+        } else {
+            // 带折叠的展示
+            return getByTableName(allColumns);
+        }
+    }
+
+    public AjaxResult getByTableName( List<GenTableColumn> allColumns) {
+        List<GenTableColumn> parentColumns = filter(allColumns, col -> HR.equalsIgnoreCase(col.getHtmlType()));
+
+        // 把孩子放入父亲的怀抱
+        for (GenTableColumn hrColumn : parentColumns) {
+            List<GenTableColumn> children = Lists.newArrayListWithCapacity(16);
+            for (GenTableColumn column : allColumns) {
+                if (hrColumn.getColumnId().equals(column.getHrParentId())) {
+                    children.add(column);
+                }
             }
+            hrColumn.setHrChildren(children);
         }
 
-        return AjaxResult.success(genTable);
+        // 把孩子对应的字典值放进去
+        for (GenTableColumn hrColumn : parentColumns) {
+            packDictDataToColumns(hrColumn.getHrChildren(), ObjectUtils::isNotEmpty);
+        }
+
+        return AjaxResult.success(parentColumns);
     }
 
-    public List<JSONObject> coverSysDictDataToJSONObject(List<SysDictData> sysDictData) {
-        List<JSONObject> result = Lists.newArrayListWithCapacity(sysDictData.size());
-        for (SysDictData data : sysDictData) {
-            JSONObject jsonObject = new JSONObject();
-            String dictLabel = data.getDictLabel();
-            String dictValue = data.getDictValue();
-            jsonObject.put(DictConstant.DICT_LABEL, dictLabel);
-            jsonObject.put(DictConstant.DICT_VALUE, dictValue);
-            result.add(jsonObject);
+    public void packDictDataToColumns(List<GenTableColumn> columns, Predicate<String> predicate) {
+        requireNonNull(columns, "columns 为空");
+        for (GenTableColumn column : columns) {
+            String dictType = column.getDictType();
+            if (predicate.test(dictType)) {
+                List<SysDictData> sysDictData1 = remoteDictDataService.listByType(dictType);
+                column.setSysDictData(sysDictData1);
+            }
         }
+    }
 
-        return result;
 
-    }
 }
 

+ 2 - 2
boman-web-core/src/main/java/com/boman/web/core/service/delete/BaseDeleteServiceImpl.java

@@ -2,7 +2,7 @@ package com.boman.web.core.service.delete;
 
 import com.alibaba.fastjson.JSONObject;
 import com.boman.web.core.domain.RowResult;
-import com.boman.web.core.mapper.StandardlyMapper1;
+import com.boman.web.core.mapper.StandardlyMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,7 +18,7 @@ public class BaseDeleteServiceImpl implements IBaseDeleteService {
     private static final Logger LOGGER = LoggerFactory.getLogger(BaseDeleteServiceImpl.class);
 
     @Autowired
-    private StandardlyMapper1 mapper;
+    private StandardlyMapper mapper;
 
     /**
      * 功能描述: 在此不对入参进行校验,所以在调用此方法之前一定要对参数进行校验,以免报错

+ 26 - 18
boman-web-core/src/main/java/com/boman/web/core/service/save/BaseSaveServiceImpl.java

@@ -2,10 +2,11 @@ package com.boman.web.core.service.save;
 
 import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.SecurityUtils;
+import com.boman.gen.domain.GenTableColumn;
 import com.boman.web.core.constant.FormDataConstant;
 import com.boman.web.core.domain.MainTableRecord;
 import com.boman.web.core.domain.RowResult;
-import com.boman.web.core.mapper.StandardlyMapper1;
+import com.boman.web.core.mapper.StandardlyMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,41 +26,48 @@ public class BaseSaveServiceImpl implements IBaseSaveService {
     private static final Logger LOGGER = LoggerFactory.getLogger(BaseSaveServiceImpl.class);
 
     @Autowired
-    private StandardlyMapper1 mapper;
+    private StandardlyMapper mapper;
 
     /**
      * 功能描述: 保存一行
      *
-     * @param tableName         tableName
-     * @param pkName            主键名称
-     * @param maxId             最大的SEQ
-     * @param row               要保存的数据
-     * @param allColumnNameList 这是此表的所有字段属性名称,用来判断是否所有UPDATE_BY和UPDATE_TIME
+     * @param tableName tableName
+     * @param pkName    主键名称
+     * @param maxId     最大的SEQ
+     * @param row       要保存的数据
+     * @param columns   这是此表的所有字段属性名称,用来判断是否所有UPDATE_BY和UPDATE_TIME,和时间类型
      * @return com.boman.system.common.RowResult
      */
     @Override
-    public RowResult insertRow(String tableName, String pkName, Long maxId, MainTableRecord row, List<String> allColumnNameList) {
+    public RowResult insertRow(String tableName, String pkName, Long maxId, MainTableRecord row, List<GenTableColumn> columns) {
         JSONObject commitData = row.getMainData().getCommitData();
         Timestamp currentTime = new Timestamp(System.currentTimeMillis());
-        if (allColumnNameList.contains(FormDataConstant.UPDATE_BY)
-                || allColumnNameList.contains(FormDataConstant.UPDATE_BY.toLowerCase())) {
-            commitData.put(FormDataConstant.UPDATE_BY, SecurityUtils.getUserId());
-        }
-        if (allColumnNameList.contains(FormDataConstant.UPDATE_TIME)
-                || allColumnNameList.contains(FormDataConstant.UPDATE_TIME.toLowerCase())) {
-            commitData.put(FormDataConstant.UPDATE_TIME, currentTime);
+        for (GenTableColumn column : columns) {
+            // 判断是否有修改人、修改时间
+            if (column.getColumnName().equalsIgnoreCase(FormDataConstant.UPDATE_BY)) {
+                commitData.put(FormDataConstant.UPDATE_BY, SecurityUtils.getUserId());
+            }
+            if (column.getColumnName().equalsIgnoreCase(FormDataConstant.UPDATE_TIME)) {
+                commitData.put(FormDataConstant.UPDATE_TIME, currentTime);
+            }
+
+            // 如果某一列是datetime类型,需要把类型转成datetime,否则数据库会报错
+            if (FormDataConstant.DATETIME.equalsIgnoreCase(column.getColumnType())) {
+                String columnName = column.getColumnName().toUpperCase();
+                commitData.put(columnName, commitData.getTimestamp(columnName));
+            }
         }
 
         // 新增
         if (row.getId() > 0) {
-            commitData.put("CREATE_TIME", currentTime);
-            commitData.put("CREATE_BY", SecurityUtils.getUserId());
+            commitData.put(FormDataConstant.UPDATE_TIME, currentTime);
+            commitData.put(FormDataConstant.UPDATE_BY, SecurityUtils.getUserId());
         }
 
         commitData.put(pkName.toUpperCase(), maxId);
         int ret = mapper.insert(tableName, commitData);
         if (ret > 0) {
-            commitData.put("successCnt", ret);
+            commitData.put(FormDataConstant.SUCCESS_CNT, ret);
             return RowResult.ok("保存成功", commitData);
         }
 

+ 7 - 6
boman-web-core/src/main/java/com/boman/web/core/service/save/IBaseSaveService.java

@@ -1,6 +1,7 @@
 package com.boman.web.core.service.save;
 
 
+import com.boman.gen.domain.GenTableColumn;
 import com.boman.web.core.domain.MainTableRecord;
 import com.boman.web.core.domain.RowResult;
 
@@ -17,13 +18,13 @@ public interface IBaseSaveService {
     /**
      * 功能描述: 保存一行
      *
-     * @param tableName         tableName
-     * @param pkName            主键名称
-     * @param maxId             最大的SEQ
-     * @param row               要保存的数据
-     * @param allColumnNameList 这是此表的所有字段属性名称,用来判断是否所有UPDATE_BY和UPDATE_TIME
+     * @param tableName tableName
+     * @param pkName    主键名称
+     * @param maxId     最大的SEQ
+     * @param row       要保存的数据
+     * @param columns   这是此表的所有字段属性名称,用来判断是否所有UPDATE_BY和UPDATE_TIME,和时间类型
      * @return com.boman.system.common.RowResult
      */
-    RowResult insertRow(String tableName, String pkName, Long maxId, MainTableRecord row, List<String> allColumnNameList);
+    RowResult insertRow(String tableName, String pkName, Long maxId, MainTableRecord row, List<GenTableColumn> columns);
 
 }

+ 2 - 2
boman-web-core/src/main/java/com/boman/web/core/service/select/BaseSelectServiceImpl.java

@@ -2,7 +2,7 @@ package com.boman.web.core.service.select;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.boman.web.core.mapper.StandardlyMapper1;
+import com.boman.web.core.mapper.StandardlyMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,7 +22,7 @@ public class BaseSelectServiceImpl implements IBaseSelectService {
     private static final Logger LOGGER = LoggerFactory.getLogger(BaseSelectServiceImpl.class);
 
     @Autowired
-    private StandardlyMapper1 mapper;
+    private StandardlyMapper mapper;
 
 
     /**

+ 2 - 2
boman-web-core/src/main/java/com/boman/web/core/service/submit/BaseSubmitServiceImpl.java

@@ -1,7 +1,7 @@
 package com.boman.web.core.service.submit;
 
 import com.alibaba.fastjson.JSONObject;
-import com.boman.web.core.mapper.StandardlyMapper1;
+import com.boman.web.core.mapper.StandardlyMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -17,7 +17,7 @@ public class BaseSubmitServiceImpl implements IBaseSubmitService {
 
 
     @Autowired
-    private StandardlyMapper1 mapper;
+    private StandardlyMapper mapper;
 
     /**
      * 功能描述: 处理提交流程

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

@@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.gen.domain.GenTableColumn;
 import com.boman.web.core.domain.TableServiceContext;
-import com.boman.web.core.mapper.StandardlyMapper1;
+import com.boman.web.core.mapper.StandardlyMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,7 +27,7 @@ public class BaseUpdateServiceImpl implements IBaseUpdateService {
     private static final Logger LOGGER = LoggerFactory.getLogger(BaseUpdateServiceImpl.class);
 
     @Autowired
-    private StandardlyMapper1 mapper;
+    private StandardlyMapper mapper;
 
     /**
      * 功能描述: 批量修改, 默认需要更改的model,更改的字段类型和字段值都是一致的

+ 2 - 2
boman-web-core/src/main/java/com/boman/web/core/utils/IdUtils.java

@@ -4,7 +4,7 @@ import com.boman.common.core.utils.SpringUtils;
 import com.boman.common.redis.RedisKey;
 import com.boman.common.redis.service.RedisService;
 import com.boman.gen.domain.GenTableColumn;
-import com.boman.web.core.mapper.StandardlyMapper1;
+import com.boman.web.core.mapper.StandardlyMapper;
 import org.apache.commons.collections.CollectionUtils;
 
 import java.util.List;
@@ -28,7 +28,7 @@ public class IdUtils {
         }
 
         // 查数据库
-        StandardlyMapper1 mapper = SpringUtils.getBean(StandardlyMapper1.class);
+        StandardlyMapper mapper = SpringUtils.getBean(StandardlyMapper.class);
         Long maxId = mapper.selectMaxId(tableName, pkName);
         if (null == maxId || maxId <= 0) {
             maxId = 1L;

+ 1 - 0
ruoyi-ui/src/api/system/config.js

@@ -55,6 +55,7 @@ export function addConfigindex(data) {
     data: data
   })
 }
+
 export function listIndex(data) {
   return request({
     url: '/boman-web-core/p/cs/queryList',

+ 10 - 2
ruoyi-ui/src/api/system/table.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 获取表单数据
 export function getQueryList(data) {
   return request({
-    url: '/boman-web-core/p/cs/queryList',
+    url: '/boman-web-core/p/cs/table/getByTableName',
     method: 'POST',
     data
   })
@@ -16,6 +16,7 @@ export function getTableQuery(data) {
     data
   })
 }
+
 // 保存
 export function addbjectSave(data) {
   return request({
@@ -39,4 +40,11 @@ export function getByTableName(data) {
     method: 'POST',
     data
   })
-}
+}
+export function delMenu(id) {
+  return request({
+    url: 'boman-web-core/p/cs/objectDelete',
+    method: 'delete'
+  })
+}
+

+ 93 - 121
ruoyi-ui/src/components/DynamicForms/index.vue

@@ -1,70 +1,57 @@
 <template>
-    <div>
-      <el-form ref="form" :model="form" :rules="rules" label-width="160px" class="from_index">
-        <el-row>
-          <el-col :span="24"  v-for="(item,index) in formConfig.columns" :key="index">
-            <el-form-item :label="item.columnComment" style="display: inline-block;" :prop="item.columnName" v-if="item.isEdit == 1">
-              <!-- 输入框 -->
-              <el-input v-if="item.htmlType == 'input'" v-model="config[item.columnName]" :placeholder="'请输入'+item.columnComment"
-                clearable @keyup.enter.native="submitForm" @change="submitForm"/>
-              <!-- 多行输入框 -->
-              <el-input v-if="item.htmlType == 'textarea'" type="textarea" v-model="config[item.columnName]" :placeholder="'请输入'+item.columnComment"
-                clearable @keyup.enter.native="submitForm" @change="submitForm"/>
-              <!-- 下拉框 -->
-              <el-select v-model="config[item.columnName]" v-if="item.htmlType == 'select'" filterable :placeholder="'请输入'+item.columnComment">
-                <el-option v-for="itemChild in item.sysDictData" :key="itemChild.dictValue" :label="itemChild.dictLabel" :value="itemChild.dictValue" @change="submitForm">
-                </el-option>
-              </el-select>
-              <!-- 复选框 -->
-              <el-checkbox-group v-model="config" v-if="item.htmlType == 'checkbox'">
-                <el-checkbox @change="submitForm" v-for="itemChild in item.sysDictData" :label="itemChild.dictValue" :key="itemChild.dictLabel" >
-                  {{itemChild.dictLabel}}
-                </el-checkbox>
-              </el-checkbox-group>
-              <!-- 单选框 -->
-              <el-radio-group v-model="config[item.columnName]" v-if="item.htmlType == 'radio'">
-                <el-radio v-for="itemChild in item.sysDictData" :key="itemChild.dictValue" :label="itemChild.dictLabel" :value="itemChild.dictValue" @change="submitForm"></el-radio>
-              </el-radio-group>
-              <!-- 时间控件 -->
-              <el-date-picker v-model="config[item.columnName]" v-if="item.htmlType == 'datetime'" type="date" :placeholder="'请输入'+item.columnComment" @change="submitForm">
-              </el-date-picker>
-              <!-- 上传图片 -->
-              <el-upload v-if="item.htmlType == 'imageUpload'" :headers="{Authorization: 'Bearer ' + getToken()}" :action="process + '/boman-file/upload'" list-type="picture-card"
-                :on-preview="handlePictureCardPreview" :on-remove="handleRemove">
-                <i class="el-icon-plus"></i>
-              </el-upload>
-              <el-dialog :visible.sync="dialogVisible" v-if="item.htmlType == 'imageUpload'">
-                <img width="100%" :src="dialogImageUrl" alt="">
-              </el-dialog>
-              <!-- 上传文件 -->
-              <el-upload
-                class="upload-demo"
-                :headers="{Authorization: 'Bearer ' + getToken()}"
-                v-if="item.htmlType == 'fileUpload'"
-                :action="process + '/boman-file/upload'"
-                :on-change="handleChange"
-                :file-list="fileList">
-                <el-button size="small" type="primary">点击上传</el-button>
-                <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
-              </el-upload>
-              <!-- 富文本 -->
-              <editor v-model="config[item.columnName]" v-if="item.htmlType == 'editor'"  :min-height="192"/>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-
-    </div>
-
+    <el-form-item :label="formConfig.columnComment" style="display: inline-block;" :prop="formConfig.columnName">
+      <!-- 输入框 -->
+      <el-input v-if="formConfig.htmlType == 'input'" v-model="config[formConfig.columnName]" :placeholder="'请输入'+formConfig.columnComment"
+        clearable @keyup.enter.native="handleQuery" />
+      <!-- 多行输入框 -->
+      <el-input v-if="formConfig.htmlType == 'textarea'" type="textarea" v-model="config[formConfig.columnName]" :placeholder="'请输入'+formConfig.columnComment"
+        clearable @keyup.enter.native="handleQuery" />
+      <!-- 下拉框 -->
+      <el-select v-model="config[formConfig.columnName]" v-if="formConfig.htmlType == 'select'" filterable :placeholder="'请输入'+formConfig.columnComment">
+        <el-option v-for="itemChild in formConfig.sysDictData" :key="itemChild.dictValue" :label="itemChild.dictLabel" :value="itemChild.dictValue">
+        </el-option>
+      </el-select>
+      <!-- 复选框 -->
+      <el-checkbox-group v-model="config" v-if="formConfig.htmlType == 'checkbox'">
+        <el-checkbox @change="handleCheckedCitiesChange" v-for="itemChild in formConfig.sysDictData" :label="itemChild.dictValue" :key="itemChild.dictLabel" >
+          {{itemChild.dictLabel}}
+        </el-checkbox>
+      </el-checkbox-group>
+      <!-- 单选框 -->
+      <el-radio-group v-model="config[formConfig.columnName]" v-if="formConfig.htmlType == 'radio'">
+        <el-radio v-for="itemChild in formConfig.sysDictData" :key="itemChild.dictValue" :label="itemChild.dictValue">{{itemChild.dictLabel}}</el-radio>
+      </el-radio-group>
+      <!-- 时间控件 -->
+      <el-date-picker  v-model="config[formConfig.columnName]" v-if="formConfig.htmlType == 'datetime'" type="date" :placeholder="'请输入'+formConfig.columnComment">
+      </el-date-picker>
+      <!-- 上传图片 -->
+      <el-upload v-if="formConfig.htmlType == 'imageUpload'" :headers="{Authorization: 'Bearer ' + getToken()}" :action="process + '/boman-file/upload'" :file-list="config" list-type="picture-card"
+        :on-preview="handlePictureCardPreview" :on-success="upImageFn" :on-remove="reseImage" >
+        <i class="el-icon-plus"></i>
+      </el-upload>
+      <el-dialog :visible.sync="dialogVisible" v-if="formConfig.htmlType == 'imageUpload'">
+        <img width="100%" :src="dialogImageUrl" alt="">
+      </el-dialog>
+      <!-- 上传文件 -->
+      <el-upload
+        class="upload-demo"
+        :headers="{Authorization: 'Bearer ' + getToken()}"
+        v-if="formConfig.htmlType == 'fileUpload'"
+        :action="process + '/boman-file/upload'"
+        :on-change="handleChange"
+        :on-success="upImageFn"
+         :on-remove="reseImage"
+        :file-list="config">
+        <el-button size="small" type="primary">点击上传</el-button>
+        <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
+      </el-upload>
+      <!-- 富文本 -->
+      <editor v-model="config[formConfig.columnName]" v-if="formConfig.htmlType == 'editor'" :min-height="192"/>
+    </el-form-item>
 </template>
 
 <script>
   const defaultSettings = require('@/settings.js')
-  import { addConfigindex } from "@/api/system/config";
   import Editor from '@/components/Editor';
   import { getToken } from "@/utils/auth";
   export default {
@@ -77,32 +64,38 @@
         dialogVisible: false,
         disabled: false,
         config: {},
-        form:{},
-        // 表单校验
-        rules: {
-        },
-        open:false
       }
     },
     components: {
       Editor
     },
     props: {
-      formConfig: {},
-      nummer:0
+      formConfig: {
+        type: Object,
+        required: true,
+        'default': {
+          sysDictData: []
+        }
+      },
     },
     created() {
+      this.config = {}
       this.init()
     },
     mounted() {
     },
     methods: {
+      upImageFn(res, file){
+        this.config.push({
+          name: res.data.name,
+          url: res.data.url,
+        });
+      },
       init() {
-        // if(this.formConfig.htmlType == 'checkbox'){
-        //   this.config = []
-        // }
+        if(this.formConfig.htmlType == 'checkbox' || this.formConfig.htmlType == 'imageUpload' || this.formConfig.htmlType == 'fileUpload'){
+          this.config = []
+        }
         console.log(this.config,99888)
-        console.log(this.nummer)
       },
       handleChange(file, fileList) {
         this.fileList = fileList.slice(-3);
@@ -110,8 +103,31 @@
       getToken() {
         return getToken()
       },
-      handleRemove(file, fileList) {
-        console.log(file, fileList);
+      reseImage(file, fileList) {
+        let urls = ""
+        if(file.response){
+          urls = file.response.url
+        }else{
+          urls = file.url
+        }
+        for (let i = this.config.length - 1; i >= 0; i--) {
+          if (this.config[i].url == urls) {
+            this.config.splice(i, 1);
+          }
+        }
+      },
+      reseImage1(file, fileList) {
+        let urls = ""
+        if(file.response){
+          urls = file.response.url
+        }else{
+          urls = file.url
+        }
+        for (let i = this.config.length - 1; i >= 0; i--) {
+          if (this.config[i].url == urls) {
+            this.config.splice(i, 1);
+          }
+        }
       },
       handlePictureCardPreview(file) {
         this.dialogImageUrl = file.url;
@@ -121,36 +137,9 @@
         console.log(file);
       },
       handleQuery() {
+        
         this.$emit('btns')
       },
-      submitForm(value){
-        console.log(1243)
-        console.log(this.config,value)
-        this.form.fixedData = this.config
-        this.form.table = 'sys_schedule'
-        this.form.objId = -1
-        this.$refs["form"].validate(valid => {
-          if (valid) {
-            // if (this.form.id != undefined) {
-            //   updateNotice(this.form).then(response => {
-            //     this.msgSuccess("修改成功");
-            //     this.open = false;
-            //     this.getList();
-            //   });
-            // } else {
-              addConfigindex(this.form).then(response => {
-                this.msgSuccess("新增成功");
-                // this.open = false;
-                this.cancel();
-              });
-            // }
-          }
-        });
-        // this.$emit('submitForm',this.config)
-      },
-      cancel(){
-       this.$emit('cancel',this.config)
-      },
       handleCheckedCitiesChange(value){
         console.log(this.config)
       }
@@ -158,22 +147,5 @@
   }
 </script>
 
-<style lang="scss">
-  .from_index{
-    .el-form-item{
-      width: 93%;
-    }
-    .el-input{
-      width: 100%;
-    }
-    .el-select{
-      width: 100%;
-    }
-  }
-</style>
-<style scoped lang="scss">
-  .dialog-footer{
-    display: flex;
-    justify-content: flex-end;
-  }
+<style>
 </style>

+ 179 - 0
ruoyi-ui/src/components/MemoranDum/index.vue

@@ -0,0 +1,179 @@
+<template>
+    <div>
+      <el-form ref="form" :model="form" :rules="rules" label-width="160px" class="from_index">
+        <el-row>
+          <el-col :span="24"  v-for="(item,index) in formConfig.columns" :key="index">
+            <el-form-item :label="item.columnComment" style="display: inline-block;" :prop="item.columnName" v-if="item.isEdit == 1">
+              <!-- 输入框 -->
+              <el-input v-if="item.htmlType == 'input'" v-model="config[item.columnName]" :placeholder="'请输入'+item.columnComment"
+                clearable @keyup.enter.native="submitForm" />
+              <!-- 多行输入框 -->
+              <el-input v-if="item.htmlType == 'textarea'" type="textarea" v-model="config[item.columnName]" :placeholder="'请输入'+item.columnComment"
+                clearable @keyup.enter.native="submitForm" @change="submitForm"/>
+              <!-- 下拉框 -->
+              <el-select v-model="config[item.columnName]" v-if="item.htmlType == 'select'" filterable :placeholder="'请输入'+item.columnComment">
+                <el-option v-for="itemChild in item.sysDictData" :key="itemChild.dictValue" :label="itemChild.dictLabel" :value="itemChild.dictValue" @change="submitForm">
+                </el-option>
+              </el-select>
+              <!-- 复选框 -->
+              <el-checkbox-group v-model="config" v-if="item.htmlType == 'checkbox'">
+                <el-checkbox @change="submitForm" v-for="itemChild in item.sysDictData" :label="itemChild.dictValue" :key="itemChild.dictLabel" >
+                  {{itemChild.dictLabel}}
+                </el-checkbox>
+              </el-checkbox-group>
+              <!-- 单选框 -->
+              <el-radio-group v-model="config[item.columnName]" v-if="item.htmlType == 'radio'">
+                <el-radio v-for="itemChild in item.sysDictData" :key="itemChild.dictValue" :label="itemChild.dictLabel" :value="itemChild.dictValue" @change="submitForm"></el-radio>
+              </el-radio-group>
+              <!-- 时间控件 -->
+              <el-date-picker v-model="config[item.columnName]" v-if="item.htmlType == 'datetime'" type="date" :placeholder="'请输入'+item.columnComment" @change="submitForm">
+              </el-date-picker>
+              <!-- 上传图片 -->
+              <el-upload v-if="item.htmlType == 'imageUpload'" :headers="{Authorization: 'Bearer ' + getToken()}" :action="process + '/boman-file/upload'" list-type="picture-card"
+                :on-preview="handlePictureCardPreview" :on-remove="handleRemove">
+                <i class="el-icon-plus"></i>
+              </el-upload>
+              <el-dialog :visible.sync="dialogVisible" v-if="item.htmlType == 'imageUpload'">
+                <img width="100%" :src="dialogImageUrl" alt="">
+              </el-dialog>
+              <!-- 上传文件 -->
+              <el-upload
+                class="upload-demo"
+                :headers="{Authorization: 'Bearer ' + getToken()}"
+                v-if="item.htmlType == 'fileUpload'"
+                :action="process + '/boman-file/upload'"
+                :on-change="handleChange"
+                :file-list="fileList">
+                <el-button size="small" type="primary">点击上传</el-button>
+                <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
+              </el-upload>
+              <!-- 富文本 -->
+              <editor v-model="config[item.columnName]" v-if="item.htmlType == 'editor'"  :min-height="192"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+
+    </div>
+
+</template>
+
+<script>
+  const defaultSettings = require('@/settings.js')
+  import { addConfigindex } from "@/api/system/config";
+  import Editor from '@/components/Editor';
+  import { getToken } from "@/utils/auth";
+  export default {
+    data() {
+      return {
+        fileList: [],
+        defaultSettings,
+        dialogImageUrl: '',
+        process: process.env.VUE_APP_BASE_API,
+        dialogVisible: false,
+        disabled: false,
+        config: {},
+        form:{},
+        // 表单校验
+        rules: {
+        },
+        open:false
+      }
+    },
+    components: {
+      Editor
+    },
+    props: {
+      formConfig: {},
+      nummer:0
+    },
+    created() {
+      this.init()
+    },
+    mounted() {
+    },
+    methods: {
+      init() {
+        // if(this.formConfig.htmlType == 'checkbox'){
+        //   this.config = []
+        // }
+        console.log(this.config,99888)
+        console.log(this.nummer)
+      },
+      handleChange(file, fileList) {
+        this.fileList = fileList.slice(-3);
+      },
+      getToken() {
+        return getToken()
+      },
+      handleRemove(file, fileList) {
+        console.log(file, fileList);
+      },
+      handlePictureCardPreview(file) {
+        this.dialogImageUrl = file.url;
+        this.dialogVisible = true;
+      },
+      handleDownload(file) {
+        console.log(file);
+      },
+      handleQuery() {
+        this.$emit('btns')
+      },
+      submitForm(value){
+        console.log(1243)
+        console.log(this.config,value)
+        this.form.fixedData = this.config
+        this.form.table = 'sys_memorandum'
+        this.form.objId = -1
+        this.$refs["form"].validate(valid => {
+          if (valid) {
+            // if (this.form.id != undefined) {
+            //   updateNotice(this.form).then(response => {
+            //     this.msgSuccess("修改成功");
+            //     this.open = false;
+            //     this.getList();
+            //   });
+            // } else {
+              addConfigindex(this.form).then(response => {
+                this.msgSuccess("新增成功");
+                // this.open = false;
+                this.cancel();
+              });
+            // }
+          }
+        });
+        // this.$emit('submitForm',this.config)
+      },
+      cancel(){
+       this.$emit('cancel',this.config)
+      },
+      handleCheckedCitiesChange(value){
+        console.log(this.config)
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  .from_index{
+    .el-form-item{
+      width: 93%;
+    }
+    .el-input{
+      width: 100%;
+    }
+    .el-select{
+      width: 100%;
+    }
+  }
+</style>
+<style scoped lang="scss">
+  .dialog-footer{
+    display: flex;
+    justify-content: flex-end;
+  }
+</style>

+ 2 - 0
ruoyi-ui/src/main.js

@@ -23,6 +23,7 @@ import Pagination from "@/components/Pagination";
 import RightToolbar from "@/components/RightToolbar"
 import DynamicForm from "@/components/DynamicForm"
 import DynamicForms from "@/components/DynamicForms"
+import MemoranDum from "@/components/MemoranDum"
 
 // 全局方法挂载
 Vue.prototype.getDicts = getDicts
@@ -52,6 +53,7 @@ Vue.component('Pagination', Pagination)
 Vue.component('RightToolbar', RightToolbar)
 Vue.component('DynamicForm', DynamicForm)
 Vue.component('DynamicForms', DynamicForms)
+Vue.component('MemoranDum', MemoranDum)
 
 Vue.use(permission)
 

+ 197 - 35
ruoyi-ui/src/views/index.vue

@@ -238,13 +238,32 @@
     <!-- <el-divider /> -->
   <!-- 添加或修改公告对话框 -->
   <el-dialog :title="title" :visible.sync="open" width="980px" append-to-body>
-            <dynamic-forms :config="form" @inputs = "changeFn" :formConfig="queryData" :open="open" @submitForm="submitForm($event)" @cancel="cancel($event)" :nummer = "nummer" />
+           <el-form ref="form" :model="form" :rules="rules" label-width="160px" class="from_index">
+             <el-row>
+               <el-col :span="24" >
+                <dynamic-forms   :ref="item.columnName" :config="form.fixedData" @inputs = "changeFn" :formConfig="item" v-for="(item,index) in queryData.columns" :key='index' />
+               </el-col>
+             </el-row>
+           </el-form>
+           <div slot="footer" class="dialog-footer">
+             <el-button type="primary" @click="handleQuery">确 定</el-button>
+             <el-button @click="cancel">取 消</el-button>
+           </div>
+            <!-- if(){ -->
+              <!-- 日历 -->
+
+              <!-- <dynamic-forms v-if="nummer == 0" :config="form" @inputs = "changeFn" :formConfig="queryData" :open="open" @submitForm="submitForm($event)" @cancel="cancel($event)" :nummer = "nummer" /> -->
+            <!-- }else if(){ -->
+              <!-- 备忘录 -->
+              <!-- <memoran-dum v-if="nummer == 1" :config="form" @inputs = "changeFn" :formConfig="queryDatatwo" :open="open"  @cancel="cancel($event)" :nummer = "nummer" /> -->
+            <!-- } -->
+
   </el-dialog>
   </div>
 </template>
 
 <script>
-import { listIndex, listIndextwo, listIndextherr, listIndexfou, listIndextanl, getConfig, delConfig, addConfig, updateConfig, clearCache } from "@/api/system/config";
+import { listIndex, listIndextwo, listIndextherr, listIndexfou, listIndextanl, getConfig, delConfig, addConfig, addConfigindex, updateConfig, clearCache } from "@/api/system/config";
 import Editor from '@/components/Editor';
 export default {
   name: "index",
@@ -348,11 +367,13 @@ export default {
       },
       //日历弹框
       calendaradd:{
-        table:'sys_schedule'
+        table:'sys_schedule',
+        isUi:false
       },
       //备忘录弹框
       calendaraddmer:{
-        table:'sys_memorandum'
+        table:'sys_memorandum',
+        isUi:false
       },
       // input
       inputList:[],
@@ -366,7 +387,16 @@ export default {
       selectList:[],
       editorList:[],
       queryData: {},
-      nummer:0   //0 是日历  1 是备忘录
+      queryDatatwo:{},
+      nummer:0   ,//0 是日历  1 是备忘录
+      forme:{
+        table:'',
+        objId:-1,
+        fixedData:{}
+      },
+      rjtu:[],
+      truew:[],
+      fales:[]
     };
   },
 
@@ -387,13 +417,26 @@ export default {
      brightDate () {
        // let ary = []
        var that =  this
-       console.log(that.calendarData)
+       // console.log(that.calendarData,887)
        for (var i = 0 ; i < that.calendarData.length; i++) {
          // that.ary.push(that.calendarData[i].startDate)
          // that.ary.push(that.calendarData[i].begin_time.slice(0,10))
-         that.ary = that.calendarData[i].all_date
-         console.log(that.calendarData[i].begin_time)
+         // that.ary.push(that.calendarData[i].all_date.split(','))
+         that.calendarData[i].love="yu"
+         if(that.calendarData[i].all_date !== undefined){
+           // that.rjtu.concat(that.calendarData[i].all_date.join(','))
+           that.ary.push(that.calendarData[i].all_date.join(','))
+           // that.calendarData[i].all_date.fi
+           that.calendarData[i].all_date.filter(route => {
+             // console.log(route,9875)
+             that.ary.push(route)
+           })
+           // that.ary = that.calendarData[i].all_date
+           // console.log(that.calendarData[i].all_date.join(','),754)
+         }
+         // console.log(that.calendarData[i].all_date,754)
        }
+       // console.log( that.rjtu,7545)
        console.log(that.ary)
        return that.ary
      }
@@ -403,17 +446,109 @@ export default {
       // Tooltip 文字提示
         content (date) {
           console.log(date,37645)
+          let data = date
           let content = ''
+          let conert = ''
+          let conertre = ''
+          let nujue= 0
+          let nujeug = []
+          let setre = []
+          this.truew = []
+          console.log(this.calendarData)
           // console.log(data,37645)
           for (var i = 0 ; i < this.calendarData.length; i++) {
-          // this.calendarData[i].begin_time = this.calendarData[i].begin_time.slice(0,10)
-            console.log(this.calendarData[i].begin_time,123)
             // if (date === this.calendarData[i].begin_time) {
-              content = this.calendarData[i].remind_type
+              // console.log(this.calendarData[i])
+              if(this.calendarData[i].all_date !== undefined){
+                console.log(this.calendarData[i].all_date.includes(data))
+                if(this.calendarData[i].all_date.includes(data) == true){
+                 console.log(this.calendarData[i].all_date.includes(data))
+                 this.truew.push(this.calendarData[i].all_date.includes(data))
+                 console.log(this.truew)
+                 if(this.truew.length >1){
+                    content  = content + ',' + this.calendarData[i].schedule_content
+                    // nujeug = content.split(',')
+                    // setre = [...new set(nujeug)]
+                    // conert = setre.join(',')
+                 }else{
+                   content  = this.calendarData[i].schedule_content
+                 }
+
+                  // content  = this.calendarData[i].schedule_content
+                  // return content
+                }
+                console.log(content)
+                //  if(this.calendarData[i].all_date.includes(data) == false){
+                //    console.log(this.calendarData[i].all_date.includes(data))
+                //   // this.rjtu.push(this.calendarData[i].schedule_content)
+                //   // content  = this.calendarData[i].schedule_content
+
+                // }
+                //
+                }
+                // return content
+              // }
+
+              // if(this.calendarData[i].all_date !== undefined){
+              //   for(var j= 0 ; j<this.calendarData[i].all_date.length; j++){
+              //     // if(data == this.calendarData[i].all_date[j]){
+              //     //   // console.log(124)
+              //     //   // console.log(this.calendarData[i])
+              //     //   // content  = this.calendarData[i].schedule_content
+              //     //   // console.log(content)
+              //     // }else if(data !== this.calendarData[i].all_date[j]){
+              //     //   content  = this.calendarData[i].schedule_content
+              //     //   console.log(876543)
+              //     //   console.log(content)
+              //     // }
+              //   }
+              //   // this.calendarData[i].all_date.filter(route => {
+              //   //   if(data == route){
+              //   //     console.log(124)
+              //   //     console.log(route.schedule_content)
+              //   //     content  = route.schedule_content
+              //   //     console.log(content)
+              //   //   }else{
+              //   //     console.log(876543)
+              //   //   }
+              //   // })
+              // }
+
+                // console.log(route,9875)
+                // that.ary.push(route)
+
+              // if(this.calendarData[i].schedule_content !== undefined){
+              //   nujue = nujue +1
+              //   if(this.calendarData[i].schedule_content !== this.calendarData[nujue].schedule_content){
+              //     // this.rjtu.push(this.calendarData[i].schedule_content)
+              //   }
+              //   // content = this.rjtu.join(',')
+
+              // }
+
             // }
           }
+          // this.calendarData.filter(route =>{
+          //   if(route.schedule_content !== undefined){
+          //     // if(date == route.all_date)
+
+          //     console.log(route.schedule_content,23456)
+          //     content  = route.schedule_content
+          //   }
+
+          // })
+          // if(content.length >1){
+          //   for(var k = 0 ; k < content.length; k++){
+          //     console.log(content[i])
+          //     // if(conertre.indexOf(conert[i])==-1){
+          //     // conertre+=conert[i];
+          //     }
+          // }
+
           console.log(content)
-          return content
+          // console.log(this.rjtu,12345)
+          // content = this.rjtu.join(',')
+         return content
         },
     //数据  第一部分列表
     getList() {
@@ -528,6 +663,7 @@ export default {
    //日历新增弹框数据
    getLisalendaraddd() {
      this.loading = true;
+     this.queryData = []
      listIndextanl(this.calendaradd).then(response => {
          if(response.data !== undefined){
            this.queryData = response.data
@@ -553,6 +689,7 @@ export default {
    //备忘录新增弹框数据
    getLisalendaradddmer() {
      this.loading = true;
+     this.queryData = []
      listIndextanl(this.calendaraddmer).then(response => {
          if(response.data !== undefined){
            this.queryData = response.data
@@ -622,8 +759,8 @@ export default {
     },
     // 表单重置
     reset() {
-      this.form = {
-      };
+      this.form ={
+      },
       this.resetForm("form");
     },
     // 取消按钮
@@ -636,36 +773,61 @@ export default {
       this.nummer = 0
       console.log(this.open)
       this.reset();
+      this.form ={
+      }
       this.getLisalendaraddd()
       this.open = true;
       this.title = "添加日历";
     },
-    /** 提交按钮 */
-    submitForm: function(data) {
-      console.log(this.form,data)
-      // this.$refs["form"].validate(valid => {
-      //   if (valid) {
-      //     if (this.form.id != undefined) {
-      //       updateNotice(this.form).then(response => {
-      //         this.msgSuccess("修改成功");
-      //         this.open = false;
-      //         this.getList();
-      //       });
-      //     } else {
-      //       addNotice(this.form).then(response => {
-      //         this.msgSuccess("新增成功");
-      //         this.open = false;
-      //         this.getList();
-      //       });
-      //     }
-      //   }
-      // });
+    /** 提交按钮操作 */
+    handleQuery() {
+      for(let item of this.queryData.columns){
+        if(item.htmlType == 'checkbox' || item.htmlType == 'imageUpload' || item.htmlType == 'fileUpload'){
+          this.form[item.columnName] = this.$refs[item.columnName][0].config
+        } else{
+          this.form[item.columnName] = this.$refs[item.columnName][0].config[item.columnName]
+        }
+      }
+      // this.forme = this.form
+      if(this.nummer == 0){
+        this.forme.table = 'sys_schedule'
+        this.forme.objId = -1
+        this.forme.fixedData = this.form
+        if(this.forme.fixedData.remind_type !== undefined){
+          this.forme.fixedData.remind_type = this.forme.fixedData.remind_type.join(',');
+        }
+        //日历
+        console.log(this.forme.fixedData,this.forme)
+        addConfigindex(this.forme).then(response => {
+          this.msgSuccess("新增成功");
+          // this.open = false;
+          this.getLisalendar()
+          this.cancel();
+        });
+      }else if(this.nummer == 1){
+        // this.form.table = 'sys_memorandum'
+        this.forme.table = 'sys_memorandum'
+        this.forme.objId = -1
+        this.forme.fixedData = this.form
+        if(this.forme.fixedData.remind_type !== undefined){
+          this.forme.fixedData.remind_type = this.forme.fixedData.remind_type.join(',');
+        }
+        //备忘录
+       addConfigindex(this.forme).then(response => {
+         this.msgSuccess("新增成功");
+         // this.open = false;
+         this.getLismemorandum()
+         this.cancel();
+       });
+      }
+      console.log(this.form.fixedData,22311)
+      // this.getList();
     },
     // 弹框
     changeFn(obj) {
       console.log(obj)
       for(let key in obj){
-        this.form[key] = obj[key]
+        this.form.fixedData[key] = obj[key]
       }
     },
     // 新增备忘录

+ 57 - 33
ruoyi-ui/src/views/system/table/index.vue

@@ -4,44 +4,29 @@
       <p>单表</p>
       <el-divider></el-divider>
       <div class="table_headerBtun" v-if="queryData.buttonList">
-        <el-button type="primary" plain v-for="(item,index) in queryData.buttonList.split('')" :key="index">{{item | btnConversion}}</el-button>
+        <el-button type="primary" plain v-for="(item,index) in queryData.buttonList.split('')" :key="index" @click="handleQuery()">{{item | btnConversion}}</el-button>
       </div>
-
     </div>
     <!-- 内容 -->
     <div class="table_nav headertable_nav">
       <el-collapse v-model="activeNames" @change="handleChange">
-        <el-collapse-item :title="title" :name="index" v-for="(item,index) in 4" :key="index">
+        <el-collapse-item :title="item.columnComment" :name="index" v-for="(item,index) in taleLisst" :key="index">
           <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="120px">
             <el-row :gutter="0">
               <el-col :span="24"  :key="index">
-                  <dynamic-forms :config="queryParams" @inputs = "changeFn" :formConfig="item" v-for="(item,index) in queryData.queryList" :key='index' />
+                  <dynamic-forms :ref="items.columnName" :config="queryParams" @inputs = "changeFn" :formConfig="items" v-for="(items,indexs) in item.hrChildren" :key='indexs' />
               </el-col>
-              <!-- <el-col :span="6" v-for="(item,index) in 12" :key="index">
-                  <el-form-item :label="labletit" prop="dictName">
-                   <el-input
-                       v-model="queryParams.dictName"
-                       placeholder="请输入字典名称"
-                       clearable
-                       size="small"
-                       @keyup.enter.native="handleQuery"
-                  />
-                 </el-form-item>
-              </el-col> -->
             </el-row>
           </el-form>
         </el-collapse-item>
-
       </el-collapse>
     </div>
-
   </div>
-
 </template>
-
 <script>
   import {
-    getTableQuery
+    getTableQuery,
+    getQueryList
   } from '@/api/system/table.js'
   export default {
     name: "index",
@@ -51,13 +36,21 @@
         showSearch: true,
         activeNames: ['1'],
         title: '单表1',
+        tabledeLise:{
+          table:'obj_test',
+          isUi:true
+        },
         queryData: {},
         // 查询参数
         queryParams: {
           pageNum: 1,
           pageSize: 10,
         },
-        labletit: '查询参数1233'
+        labletit: '查询参数1233',
+        tableZbie:{
+          table:'obj_test'
+        },
+        taleLisst:[]
       };
     },
     filters:{
@@ -84,6 +77,7 @@
     },
     mounted() {
       this.init()
+      this.tablsie()
     },
     methods: {
       changeFn(obj) {
@@ -96,6 +90,14 @@
       },
       /** 搜索按钮操作 */
       handleQuery() {
+         console.log(this.taleLisst,4)
+        for(let item of this.taleLisst){
+          if(item.htmlType == 'checkbox' || item.htmlType == 'imageUpload' || item.htmlType == 'fileUpload'){
+            this.queryParams[item.columnName] = this.$refs[item.columnName][0].config
+          } else{
+            this.queryParams[item.columnName] = this.$refs[item.columnName][0].config[item.columnName]
+          }
+        }
         console.log(this.queryParams)
         // this.getList();
       },
@@ -103,24 +105,46 @@
 
       },
       init() {
-        getTableQuery({
-          table: 'obj_test'
-        }).then(res => {
+        getTableQuery(
+          this.tableZbie
+        ).then(res => {
           let data = res.data
           this.queryData = data
-          console.log( this.queryData.queryList)
-          this.queryData.queryList.filter(route => {
-            if(route.htmlType == 'checkbox'){
-              route.sysDictDatatwo = []
-              route.sysDictDatatwo.push(route.columnName)
-              console.log(route.sysDictDatatwo,846)
-            }
-          })
-          console.log(this.queryData.queryList)
+          console.log(this.queryData,567)
+        })
+      },
+      tablsie(){
+        console.log(1234)
+        getQueryList(
+          this.tabledeLise
+        ).then(res => {
+          let data = res.data
+          this.taleLisst = data
+          // console.log(this.queryData.queryList)
         })
       },
       handleChange(val) {
         console.log(val);
+      },
+      // 按钮点击
+      delet(index){
+      console.log(index)
+      if(index == 'D'){
+        this.handleDelete(index)
+      }
+      },
+      //删除
+      handleDelete(row) {
+        this.$confirm('是否确认删除名称为"' + row + '"的数据项?', "警告", {
+            confirmButtonText: "确定",
+            cancelButtonText: "取消",
+            type: "warning"
+          }).then(function() {
+            // return delMenu(row.id);
+          }).then(() => {
+            // this.getList();
+            this.msgSuccess("删除成功");
+          })
       }
     },
   };