diff --git a/dbsql/update/update202308.sql b/dbsql/update/update202308.sql new file mode 100644 index 0000000..75f1a62 --- /dev/null +++ b/dbsql/update/update202308.sql @@ -0,0 +1,47 @@ +-- 目录表增加加载顺序字段 +alter table BIANMU.B_DIRECTORY add SORT integer; +comment on column BIANMU.B_DIRECTORY.SORT is '加载顺序'; +-- 置标标签表增加加载顺序字段 +alter table BIANMU.B_DATA_LABELS add SORT integer; +comment on column BIANMU.B_DATA_LABELS.SORT is '加载顺序'; +-- 更新菜单数据 +UPDATE BIANMU.SYS_MENU t +SET t.IS_DELETE = '0', + t.MENU_NAME = '表单配置', + t.MENU_PATH = '/sys/form/config/page/index' +WHERE t.MENU_ID = '1525058137475338242'; + +CREATE TABLE "BIANMU"."SYS_FORM_CONFIG" +( + "ID" INTEGER IDENTITY(1000, 1) NOT NULL, + "FORM_TYPE" INTEGER, + "FIELD_TITLE" VARCHAR2(50), + "SHOW_TITLE" VARCHAR2(50), + "FIELD_TYPE" VARCHAR2(50), + "DEFAULT_VALUE" VARCHAR2(50) DEFAULT '', + "IS_REQUIRED" BIT DEFAULT 0, + "IS_DISABLED" BIT DEFAULT 0, + "IS_SHOW" BIT DEFAULT 1, + "SORT" INTEGER, + "CREATE_USER" VARCHAR2(50), + "CREATE_TIME" TIMESTAMP(6), + "MODIFY_USER" VARCHAR2(50), + "MODIFY_TIME" TIMESTAMP(6), + CLUSTER PRIMARY KEY("ID") +) STORAGE(ON "MAIN", CLUSTERBTR); + +COMMENT ON TABLE "BIANMU"."SYS_FORM_CONFIG" IS '系统表单配置表'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."CREATE_TIME" IS '创建时间'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."CREATE_USER" IS '创建人'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."DEFAULT_VALUE" IS '默认值'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."FIELD_TITLE" IS '字段标题'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."FIELD_TYPE" IS '字段类型'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."FORM_TYPE" IS '表单类型:1-资源注册表单,2-文件上传表单'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."ID" IS '主键'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."IS_DISABLED" IS '是否必填:0-非必填,1-必填'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."IS_REQUIRED" IS '是否禁用:0-不禁用,1-禁用'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."IS_SHOW" IS '是否显示'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."MODIFY_TIME" IS '修改时间'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."MODIFY_USER" IS '修改人'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."SHOW_TITLE" IS '显示标题'; +COMMENT ON COLUMN "BIANMU"."SYS_FORM_CONFIG"."SORT" IS '显示顺序'; diff --git a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/controller/DynamicFormController.java b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/controller/DynamicFormController.java index 35ef429..84710ef 100644 --- a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/controller/DynamicFormController.java +++ b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/controller/DynamicFormController.java @@ -157,7 +157,7 @@ public class DynamicFormController { * @return 结果 */ @PostMapping("/api/form/delete") - public Result deleteFormInfo(int id) { + public Result deleteFormInfo(int id) throws Exception { return Result.of(dynamicFormService.delete(id)); } } diff --git a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/DynamicDataService.java b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/DynamicDataService.java index 401094e..76f1555 100644 --- a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/DynamicDataService.java +++ b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/DynamicDataService.java @@ -14,6 +14,12 @@ import java.util.*; @Service public class DynamicDataService { + private final SqlExecutor sqlExecutor; + + public DynamicDataService(SqlExecutor sqlExecutor) { + this.sqlExecutor = sqlExecutor; + } + /** * 根据ID删除数据 @@ -25,7 +31,7 @@ public class DynamicDataService { */ public boolean deleteById(FormInfoPo form, Integer id) throws Exception { QueryParam param = QueryParam.builder().column("ID").eq(id).build(); - return SqlExecutor.executeUpdate(SqlHelper.deleteSql(form, param), id); + return sqlExecutor.executeUpdate(SqlHelper.deleteSql(form, param), id); } @@ -58,7 +64,7 @@ public class DynamicDataService { // 插入Sql,去除主键列 params.remove("ID"); LinkedHashMap data = new LinkedHashMap<>(params); - return SqlExecutor.executeUpdate(SqlHelper.insertSql(form, data), data.values().toArray()); + return sqlExecutor.executeUpdate(SqlHelper.insertSql(form, data), data.values().toArray()); } /** @@ -75,7 +81,7 @@ public class DynamicDataService { QueryParam queryParam = QueryParam.builder().column("ID").eq(id).build(); List paramValues = new ArrayList<>(dataMap.values()); paramValues.addAll(queryParam.getParamValues()); - return SqlExecutor.executeUpdate(SqlHelper.updateSql(form, dataMap, queryParam), paramValues.toArray()); + return sqlExecutor.executeUpdate(SqlHelper.updateSql(form, dataMap, queryParam), paramValues.toArray()); } /** @@ -88,7 +94,7 @@ public class DynamicDataService { */ public Map getById(FormInfoPo form, @NotNull Integer id) throws Exception { QueryParam param = QueryParam.builder().column("ID").eq(id).build(); - List> list = SqlExecutor.executeQuery(SqlHelper.selectSql(form, param), id); + List> list = sqlExecutor.executeQuery(SqlHelper.selectSql(form, param), id); if (list == null) { return null; } @@ -105,12 +111,12 @@ public class DynamicDataService { * @throws Exception - */ public Page> pageList(FormInfoPo form, QueryParam params) throws Exception { - List> countList = SqlExecutor.executeQuery(SqlHelper.countSql(form, params), params.getParamValues().toArray()); + List> countList = sqlExecutor.executeQuery(SqlHelper.countSql(form, params), params.getParamValues().toArray()); long count = 0; if (countList != null && countList.size() > 0) { count = (long) countList.get(0).get("COUNT"); } - List> dataList = SqlExecutor.executeQuery(SqlHelper.pageSelectSql(form, params), params.getParamValues().toArray()); + List> dataList = sqlExecutor.executeQuery(SqlHelper.pageSelectSql(form, params), params.getParamValues().toArray()); Page> page = new Page<>(params.getPage(), params.getPageSize(), count); page.setRecords(dataList); return page; @@ -124,6 +130,6 @@ public class DynamicDataService { * @throws Exception */ public List> list(FormInfoPo form) throws Exception { - return SqlExecutor.executeQuery(SqlHelper.selectSql(form, null)); + return sqlExecutor.executeQuery(SqlHelper.selectSql(form, null)); } } diff --git a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/DynamicFormService.java b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/DynamicFormService.java index 4afecec..aa919be 100644 --- a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/DynamicFormService.java +++ b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/DynamicFormService.java @@ -3,6 +3,7 @@ package com.keyware.shandan.dynacmicform.core.basic.services; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.keyware.shandan.common.util.DateUtil; import com.keyware.shandan.common.util.StringUtils; import com.keyware.shandan.dynacmicform.core.DynamicFormEventListener; import com.keyware.shandan.dynacmicform.core.basic.entity.FormInfoPo; @@ -12,6 +13,7 @@ import com.keyware.shandan.dynacmicform.core.db.parser.TableInfoParser; import com.keyware.shandan.dynacmicform.core.db.pojo.Table; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -21,11 +23,14 @@ import java.util.List; @Slf4j @Service public class DynamicFormService { + private final SqlExecutor sqlExecutor; private final FormInfoService formInfoService; - private final DynamicFormEventListener dynamicFormEventListener; - public DynamicFormService(FormInfoService formInfoService, DynamicFormEventListener dynamicFormEventListener) { + public DynamicFormService(SqlExecutor sqlExecutor, + FormInfoService formInfoService, + DynamicFormEventListener dynamicFormEventListener) { + this.sqlExecutor = sqlExecutor; this.formInfoService = formInfoService; this.dynamicFormEventListener = dynamicFormEventListener; } @@ -37,12 +42,13 @@ public class DynamicFormService { * @return boolean * @throws Exception 异常 */ + @Transactional(rollbackFor = Exception.class) public boolean saveForm(FormInfoPo form) throws Exception { FormInfoPo oldForm = formInfoService.getById(form.getId()); Table table = TableInfoParser.parseTable(form); if (oldForm == null) { - String sql = SqlHelper.createSql(table); - SqlExecutor.execute(sql); + String sql = SqlHelper.tableCreateSql(table); + sqlExecutor.execute(sql); } else { Table oldTable = TableInfoParser.parseTable(oldForm); List alterSqlList = SqlHelper.alterTableDropColumnSql(oldTable, table); @@ -51,7 +57,7 @@ public class DynamicFormService { alterSqlList.addAll(SqlHelper.alterTableAddColumnSql(oldTable, table)); alterSqlList.addAll(SqlHelper.commentTableSql(oldTable, table)); alterSqlList.addAll(SqlHelper.commentColumnSql(oldTable, table)); - SqlExecutor.executeBatch(alterSqlList); + sqlExecutor.executeBatch(alterSqlList); } if (StringUtils.isBlank(form.getQueryConfig())) { generateQueryConfig(form); @@ -65,18 +71,30 @@ public class DynamicFormService { } /** - * 删除表单信息 + * 删除表单信息,逻辑删除,并对实际数据表进行重命名备份 * * @param id * @return */ - public boolean delete(Integer id) { + @Transactional(rollbackFor = Exception.class) + public boolean delete(Integer id) throws Exception { FormInfoPo form = formInfoService.getById(id); - boolean ok = formInfoService.removeById(id); - if (ok) { - dynamicFormEventListener.onDrop(form); + if (form != null) { + // 对原始表结构进行重命名备份 + Table table = TableInfoParser.parseTable(form); + String newName = table.getName() + "_BACKUP_" + DateUtil.getFormatNowDate("yyyyMMddHHmmss"); + String sql = SqlHelper.tableRenameSql(table.getName(), newName); + sqlExecutor.execute(sql); + // 更新表名后进行逻辑删除 + form.setFormId(newName); + formInfoService.updateById(form); + boolean ok = formInfoService.removeById(id); + if (!ok) { + throw new RuntimeException("表单信息删除异常"); + } } - return ok; + dynamicFormEventListener.onDrop(form); + return true; } /** diff --git a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/impl/FormInfoServiceImpl.java b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/impl/FormInfoServiceImpl.java index bf40c33..12fbc29 100644 --- a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/impl/FormInfoServiceImpl.java +++ b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/basic/services/impl/FormInfoServiceImpl.java @@ -5,6 +5,8 @@ import com.keyware.shandan.dynacmicform.core.basic.entity.FormInfoPo; import com.keyware.shandan.dynacmicform.core.basic.mapper.FormInfoMapper; import com.keyware.shandan.dynacmicform.core.basic.services.FormInfoService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import java.io.Serializable; @@ -15,4 +17,10 @@ public class FormInfoServiceImpl extends ServiceImpl public boolean removeById(Serializable id) { return super.removeById(id); } + + /*@Override + @Transactional(rollbackFor = Exception.class, propagation = Propagation.SUPPORTS) + public boolean saveOrUpdate(FormInfoPo entity) { + return super.saveOrUpdate(entity); + }*/ } diff --git a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/SqlHelper.java b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/SqlHelper.java index ac9d068..7415843 100644 --- a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/SqlHelper.java +++ b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/SqlHelper.java @@ -1,6 +1,7 @@ package com.keyware.shandan.dynacmicform.core.db; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; import com.keyware.shandan.common.util.StreamUtil; import com.keyware.shandan.common.util.StringUtils; import com.keyware.shandan.dynacmicform.core.basic.entity.FormInfoPo; @@ -23,7 +24,7 @@ public class SqlHelper { * @param table * @return */ - public static String createSql(Table table) { + public static String tableCreateSql(Table table) { StringBuilder sqlBuilder = new StringBuilder("CREATE TABLE "); sqlBuilder.append("\"").append(table.getName()).append("\" ("); @@ -46,13 +47,17 @@ public class SqlHelper { return sqlBuilder.toString(); } + public static String tableRenameSql(String oldTableName, String newTableName) { + return StrUtil.format("alter table \"{}\" rename to \"{}\"", oldTableName, newTableName); + } + /** * 修改表的sql * * @param columns 修改的列集合 * @return */ - public static List alterSql(Map> columns) { + public static List tableAlterSql(Map> columns) { List alterSqlList = new ArrayList<>(); return alterSqlList; @@ -64,10 +69,8 @@ public class SqlHelper { * @param table * @return */ - public static String dropSql(Table table) { - StringBuilder sqlBuilder = new StringBuilder(); - - return sqlBuilder.toString(); + public static String tableDropSql(Table table) { + return "DROP TABLE \"" + table.getName() + "\""; } /** diff --git a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/executor/SqlExecutor.java b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/executor/SqlExecutor.java index 534e0b5..fc3b560 100644 --- a/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/executor/SqlExecutor.java +++ b/shandan-basedata/src/main/java/com/keyware/shandan/dynacmicform/core/db/executor/SqlExecutor.java @@ -6,8 +6,10 @@ import com.keyware.shandan.common.util.StringUtils; import com.keyware.shandan.dynacmicform.config.spring.ContextHelper; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; import java.io.IOException; import java.io.Reader; @@ -15,19 +17,24 @@ import java.sql.Date; import java.sql.*; import java.util.*; +@Component public class SqlExecutor { private static final Logger log = LoggerFactory.getLogger(SqlExecutor.class); + private final SqlSession sqlSession; + + public SqlExecutor(SqlSession sqlSession) { + this.sqlSession = sqlSession; + } + /** * 检查SQL是否可以正常执行 * * @param sql sql * @return boolean */ - public static boolean validateQuery(String sql) { - // 获取SqlSessionFactory实例 - SqlSessionFactory sqlSessionFactory = getSessionFactory(); - try (SqlSession session = sqlSessionFactory.openSession(); Connection conn = session.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { + public boolean validateQuery(String sql) { + try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { ResultSet rs = stmt.executeQuery(); rs.close(); log.debug("==> {}", sql); @@ -38,15 +45,15 @@ public class SqlExecutor { } } - public static boolean execute(String sql) throws Exception { + public boolean execute(String sql) throws Exception { if (StringUtils.isEmpty(sql)) { return false; } - // 获取SqlSessionFactory实例 - SqlSessionFactory sqlSessionFactory = getSessionFactory(); log.debug("==> SQL: " + sql); - try (SqlSession session = sqlSessionFactory.openSession(); Connection conn = session.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { + try { + Connection conn = sqlSession.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql); return stmt.execute(); } catch (Exception e) { log.error("执行sql查询异常: " + sql, e); @@ -61,15 +68,15 @@ public class SqlExecutor { * @return * @throws SQLException */ - public static int[] executeBatch(Collection sqlList) throws SQLException { + public int[] executeBatch(Collection sqlList) throws SQLException { int[] count = new int[sqlList.size()]; if (sqlList.isEmpty()) { return count; } - SqlSessionFactory sqlSessionFactory = getSessionFactory(); PreparedStatement stmt = null; - try (SqlSession session = sqlSessionFactory.openSession(); Connection conn = session.getConnection()) { + try { + Connection conn = getConnection(); conn.setAutoCommit(false); for (String sql : sqlList) { if (StringUtils.hasText(sql)) { @@ -102,12 +109,11 @@ public class SqlExecutor { * @return boolean * @throws Exception - */ - public static boolean executeUpdate(String sql, Object... params) throws Exception { + public boolean executeUpdate(String sql, Object... params) throws Exception { if (StringUtils.isEmpty(sql)) { return false; } - // 获取SqlSessionFactory实例 - SqlSessionFactory sqlSessionFactory = getSessionFactory(); + log.debug("==> SQL: " + sql); // 替换单个?参数为多个,用于拼接IN参数 if (params != null && params.length > 0) { @@ -116,7 +122,9 @@ public class SqlExecutor { log.warn("更新参数集合数量过多, size={},请检查调用是否合理!", params.length); } } - try (SqlSession session = sqlSessionFactory.openSession(); Connection conn = session.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { + try { + Connection conn = getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { stmt.setObject(i + 1, params[i]); @@ -137,12 +145,11 @@ public class SqlExecutor { * @param sql * @return */ - public static List> executeQuery(String sql, Object... params) throws Exception { + public List> executeQuery(String sql, Object... params) throws Exception { if (StringUtils.isBlank(sql)) { return null; } - // 获取SqlSessionFactory实例 - SqlSessionFactory sqlSessionFactory = getSessionFactory(); + log.debug("==> SQL: " + sql); // 替换单个?参数为多个,用于拼接IN参数 if (params != null && params.length > 0) { @@ -151,7 +158,9 @@ public class SqlExecutor { log.warn("查询参数集合数量过多, size={},请检查调用是否合理!", params.length); } } - try (SqlSession session = sqlSessionFactory.openSession(); Connection conn = session.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { + try { + Connection conn = getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { stmt.setObject(i + 1, params[i]); @@ -186,13 +195,8 @@ public class SqlExecutor { } } - private static SqlSessionFactory getSessionFactory() { - SqlSessionFactory sqlSessionFactory = ContextHelper.getBean(SqlSessionFactory.class); - if (sqlSessionFactory == null) { - log.warn("无法获取SqlSessionFactory实例,SQL将不被执行。"); - throw new RuntimeException("获取SqlSessionFactory实例异常"); - } - return sqlSessionFactory; + private Connection getConnection() throws SQLException { + return sqlSession.getConfiguration().getEnvironment().getDataSource().getConnection(); } private static String clobRsConvert(Clob clob) { diff --git a/shandan-basedata/src/main/resources/view/dynamicForm/designForm.html b/shandan-basedata/src/main/resources/view/dynamicForm/designForm.html index d1a2786..37d9da7 100644 --- a/shandan-basedata/src/main/resources/view/dynamicForm/designForm.html +++ b/shandan-basedata/src/main/resources/view/dynamicForm/designForm.html @@ -62,7 +62,7 @@ postRequest(`${ctx}/dynamic-form/api/form/save`, params).then(res => { if (res.flag) { temp_data = params; - showOkMsg('保存成功'); + saveCallback && saveCallback(); } else { showErrorMsg(res.msg) } diff --git a/shandan-basedata/src/main/resources/view/dynamicForm/formList.html b/shandan-basedata/src/main/resources/view/dynamicForm/formList.html index 597fcaf..42890ac 100644 --- a/shandan-basedata/src/main/resources/view/dynamicForm/formList.html +++ b/shandan-basedata/src/main/resources/view/dynamicForm/formList.html @@ -14,10 +14,12 @@
@@ -79,7 +81,7 @@ openFormConfigLayer(id); break; case 'delete': - formDelete(id) + formDelete(data) break; } } @@ -97,10 +99,21 @@ */ function openFormDesignPage(id) { openMaxLayer(`${ctx}/dynamic-form/view/form/design?formId=${id}`, { + success: function(layero, index){ + let iframeWin = window[layero.find('iframe')[0]['name']]; + iframeWin.saveCallback = function(){ + formListTable.reload(); + showOkMsg('保存成功'); + layer.closeAll(); + } + }, cancel: function (index, layerObj) { let iframeWin = window[layerObj.find('iframe')[0]['name']]; if (iframeWin.isChange()) { - layer.confirm('关闭窗口将不会保存更改的内容,是否继续关闭?', {title: '关闭表单设计器', btn: ['关闭', '取消']}, function () { + layer.confirm('关闭窗口将不会保存更改的内容,是否继续关闭?', { + title: '关闭表单设计器', + btn: ['关闭', '取消'] + }, function () { layer.closeAll(); }) } else { @@ -132,10 +145,14 @@ /** * 删除表单 - * @param id + * @param data */ - function formDelete(id) { - layer.confirm('是否删除该表单?', {title: '删除确认', btn: ['删除', '取消']}, function (layIndex) { + function formDelete(data) { + const {id, formId} = data; + layer.confirm(`将同时删除以下数据库表:

是否继续删除?`, { + title: '删除确认', + btn: ['删除', '取消'] + }, function (layIndex) { postRequest(`${ctx}/dynamic-form/api/form/delete`, {id}).then(res => { layer.close(layIndex); res.flag ? showOkMsg('删除成功') : showErrorMsg(res.msg); diff --git a/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/MetadataController.java b/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/MetadataController.java index ab02067..6d5edf1 100644 --- a/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/MetadataController.java +++ b/shandan-bianmu/src/main/java/com/keyware/shandan/bianmu/controller/MetadataController.java @@ -13,8 +13,11 @@ import com.keyware.shandan.common.entity.Result; import com.keyware.shandan.common.enums.SecretLevel; import com.keyware.shandan.common.util.StreamUtil; import com.keyware.shandan.common.util.StringUtils; +import com.keyware.shandan.system.constants.FormTypeEnum; import com.keyware.shandan.system.entity.SysFile; +import com.keyware.shandan.system.entity.SysFormConfig; import com.keyware.shandan.system.service.SysFileService; +import com.keyware.shandan.system.service.SysFormConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; @@ -46,6 +49,9 @@ public class MetadataController extends BaseControllerfieldMap.set(conf.fieldName, conf)); + console.info(fieldMap); const listPage = layui.listPage.init({ deleteUrl: `${ctx}/business/metadata/delete`, table: { @@ -27,23 +30,26 @@ layui.use(['layer', 'listPage', 'form', 'dict'], function () { { field: 'metadataName', title: '数据名称', + hide: !fieldMap.get('metadataName').isShow, templet: data => `${data.metadataName}` }, - {field: 'metadataComment', title: '中文注释'}, + {field: 'metadataComment', title: '中文注释',hide: fieldMap.get('metadataName').isShow}, { field: 'secretLevel', title: '密级', + hide: !fieldMap.get('secretLevel').isShow, templet: data => layui.dict.getDictDesc('secret_level', data.secretLevel) }, - {field: 'themeTask', title: '主题任务'}, + {field: 'themeTask', title: '主题任务', hide: !fieldMap.get('themeTask').isShow}, { field: 'dataFrom', title: '数据来源', + hide: !fieldMap.get('dataFrom').isShow, width: 100, templet: data => layui.dict.getDictDesc('data_source', data.dataFrom) }, - {field: 'collectionTime', title: '任务时间', width: 180, align: 'center'}, + {field: 'collectionTime', title: '任务时间', width: 180, align: 'center',hide: !fieldMap.get('collectionTime').isShow}, { field: 'used', title: '关联状态', width: 120, align: 'center', templet: (data) => { if (data.used) { diff --git a/shandan-bianmu/src/main/resources/view/business/metadata/metadataEdit.html b/shandan-bianmu/src/main/resources/view/business/metadata/metadataEdit.html index 292349c..8d13fd3 100644 --- a/shandan-bianmu/src/main/resources/view/business/metadata/metadataEdit.html +++ b/shandan-bianmu/src/main/resources/view/business/metadata/metadataEdit.html @@ -34,47 +34,28 @@
-
- -
- - -
-
-
- -
- -
-
-
- -
-
-
-
-
- -
-
-
-
-
- +
+ +
-
-
-
-
- -
- + + + + +
@@ -89,7 +70,9 @@
-
+
+
+
@@ -147,6 +130,5 @@ {{# } }} - diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/BrowserIndexController.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/BrowserIndexController.java index 7c105f5..1f2d5b6 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/BrowserIndexController.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/BrowserIndexController.java @@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.keyware.shandan.bianmu.entity.MetadataBasicVo; import com.keyware.shandan.bianmu.service.DirPermissionService; -import com.keyware.shandan.bianmu.service.DirectoryService; import com.keyware.shandan.bianmu.service.MetadataService; import com.keyware.shandan.common.enums.SystemTypes; import com.keyware.shandan.common.util.RsaUtil; @@ -13,11 +12,12 @@ import com.keyware.shandan.datasource.entity.DBTableColumnVo; import com.keyware.shandan.frame.config.security.SecurityUtil; import com.keyware.shandan.system.entity.SysSetting; import com.keyware.shandan.system.entity.SysUser; -import com.keyware.shandan.system.service.SysFileService; +import com.keyware.shandan.system.service.SysTheadConfigService; import com.keyware.shandan.system.service.SysUserService; import com.keyware.shandan.system.utils.SysSettingUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -39,9 +39,6 @@ import java.util.List; @RequestMapping("/") public class BrowserIndexController { - @Autowired - private DirectoryService directoryService; - @Autowired private MetadataService metadataService; @@ -49,10 +46,10 @@ public class BrowserIndexController { private SysUserService sysUserService; @Autowired - private SysFileService sysFileService; + private DirPermissionService permissionService; @Autowired - private DirPermissionService permissionService; + private SysTheadConfigService theadConfigService; @Value("${project.cors-lib-search:#}") private String corsLibSearchUrl; @@ -90,10 +87,11 @@ public class BrowserIndexController { } @GetMapping("/browser") - public ModelAndView browser(ModelAndView mov) { + public ModelAndView browser(ModelAndView mov, Authentication auth) { mov.setViewName("browser"); SysSetting bianmuSetting = SysSettingUtil.getSysSetting(SystemTypes.BIANMU.name()); mov.addObject("bianmuServer", bianmuSetting.getSysAddress()); + mov.addObject("theadConfig", theadConfigService.listByCreateUser(auth.getName())); return mov; } diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/SearchController.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/SearchController.java index 3e64f8f..fd192a3 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/SearchController.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/controller/SearchController.java @@ -10,6 +10,7 @@ import com.keyware.shandan.bianmu.entity.MetadataBasicVo; import com.keyware.shandan.bianmu.service.MetadataService; import com.keyware.shandan.browser.entity.PageVo; import com.keyware.shandan.browser.entity.SearchConditionVo; +import com.keyware.shandan.browser.entity.SearchResultSort; import com.keyware.shandan.browser.service.*; import com.keyware.shandan.common.entity.Result; import com.keyware.shandan.common.util.FileDownload; @@ -138,10 +139,10 @@ public class SearchController { */ @AppLog(operate = "文件全文检索查询") @GetMapping("/full/file") - public Result searchFile(PageVo page, String search, String metaId) { + public Result searchFile(PageVo page, String search, String metaId, SearchResultSort sort) { try { - return Result.of(fileSearchService.searchFile(page, search, metaId)); + return Result.of(fileSearchService.searchFile(page, search, metaId, sort)); } catch (IOException e) { e.printStackTrace(); return Result.of(null, false, "Elasticsearch 请求异常"); diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/entity/SearchConditionVo.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/entity/SearchConditionVo.java index d35edce..1ae821d 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/entity/SearchConditionVo.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/entity/SearchConditionVo.java @@ -10,7 +10,6 @@ import org.elasticsearch.search.sort.SortOrder; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -35,7 +34,7 @@ public class SearchConditionVo extends PageVo implements Serializable { //搜索条件集合 private List conditions = new ArrayList<>(); // 排序 - private Sort sort = new Sort(); + private SearchResultSort sort = new SearchResultSort(); //排序字段 @Deprecated private String sortFiled; @@ -113,35 +112,4 @@ public class SearchConditionVo extends PageVo implements Serializable { return " " + logicJoin + " \"" + table + "\".\"" + fieldName + "\" " + logicJudgement + " " + fieldValue; } } - - /** - * 排序 - */ - @Getter - @Setter - public static class Sort { - //排序字段 - private String field; - //排序方式 - private String sort; - - public String getField() { - return " " + field; - } - - public String getSort() { - return " " + sort; - } - - /** - * @return order by sql语句 - */ - public String getOrderBy() { - return isEmpty() ? Strings.EMPTY : " order by" + getField() + " " + getSort(); - } - - public boolean isEmpty() { - return StringUtils.isBlankAny(this.field, this.sort); - } - } } diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/entity/SearchResultSort.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/entity/SearchResultSort.java new file mode 100644 index 0000000..c3b7911 --- /dev/null +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/entity/SearchResultSort.java @@ -0,0 +1,34 @@ +package com.keyware.shandan.browser.entity; + + + +import com.keyware.shandan.common.util.StringUtils; +import joptsimple.internal.Strings; +import lombok.Getter; +import lombok.Setter; + +/** + * 排序 + * + * @author GuoXin + * @date 2023/8/29 + */ +@Getter +@Setter +public class SearchResultSort { + //排序字段 + private String field; + //排序方式 + private String sort; + + /** + * @return order by sql语句 + */ + public String getOrderBy() { + return isEmpty() ? Strings.EMPTY : " order by " + getField() + " " + getSort(); + } + + public boolean isEmpty() { + return StringUtils.isBlankAny(this.field, this.sort); + } +} \ No newline at end of file diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/ExportComponent.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/ExportComponent.java index 81272d5..c651e87 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/ExportComponent.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/ExportComponent.java @@ -21,14 +21,12 @@ import com.keyware.shandan.system.service.SysFileService; import com.keyware.shandan.system.utils.SysSettingUtil; import lombok.AllArgsConstructor; -import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class ExportComponent { private final String exportId; @@ -107,9 +105,8 @@ public class ExportComponent { JSONObject col = (JSONObject) json; String comment = col.getString("comment"); String colName = col.getString("columnName"); - String name = StringUtils.hasTextByDefault(comment, colName); colNameList.add(colName); - return name; + return colName + (StringUtils.hasText(comment) ? "[" + comment + "]" : ""); }).toList(); // 添加第一行 @@ -118,7 +115,13 @@ public class ExportComponent { // 遍历数据 datas.forEach(data -> { // 遍历字段列名,获取对应数据并拼接成列的集合 - List cells = StreamUtil.as(colNameList).map(col -> data.get(col).toString()).toList(); + List cells = colNameList.stream().map(col -> { + Object value = data.get(col); + if (value == null) { + return ""; + } + return String.valueOf(value); + }).collect(Collectors.toList()); rowList.add(cells); }); @@ -189,7 +192,7 @@ public class ExportComponent { private void delete(String path) { File file = new File(path); - if(file.exists()){ + if (file.exists()) { file.delete(); } } diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/FileSearchService.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/FileSearchService.java index 7888f68..3b51885 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/FileSearchService.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/FileSearchService.java @@ -1,12 +1,16 @@ package com.keyware.shandan.browser.service; +import cn.hutool.core.util.ReflectUtil; import com.keyware.shandan.bianmu.entity.DirectoryVo; import com.keyware.shandan.bianmu.enums.ReviewStatus; import com.keyware.shandan.bianmu.service.DirectoryService; import com.keyware.shandan.browser.entity.PageVo; +import com.keyware.shandan.browser.entity.SearchResultSort; import com.keyware.shandan.common.constants.DirConstant; import com.keyware.shandan.common.util.StreamUtil; import com.keyware.shandan.common.util.StringUtils; +import com.keyware.shandan.system.entity.SysFile; +import lombok.extern.slf4j.Slf4j; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; @@ -17,10 +21,15 @@ import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.elasticsearch.annotations.FieldType; import org.springframework.stereotype.Service; import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; @@ -30,6 +39,7 @@ import java.util.List; * @author Administrator * @since 2021/12/21 */ +@Slf4j @Service public class FileSearchService { @@ -38,13 +48,13 @@ public class FileSearchService { @Autowired private DirectoryService directoryService; - public PageVo searchFile(PageVo page, String text, String metaId) throws IOException { + public PageVo searchFile(PageVo page, String text, String metaId, SearchResultSort sort) throws IOException { SearchRequest request = Requests.searchRequest("shandan"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.from(page.getPage() * page.getSize() - page.getSize()).size(page.getSize()); BoolQueryBuilder builder = QueryBuilders.boolQuery(); - if(!DirConstant.DIR_ROOT_ID.equals(metaId)){ + if (!DirConstant.DIR_ROOT_ID.equals(metaId)) { List ids = new ArrayList<>(); ids.add(metaId); ids.addAll(getChildrenByDirId(metaId)); @@ -75,13 +85,38 @@ public class FileSearchService { highlightBuilder.preTags("").field("*"); highlightBuilder.forceSource(true); searchSourceBuilder.query(builder).highlighter(highlightBuilder); + + // 设置排序 + if (!sort.isEmpty()) { + String sortField = sort.getField(); + // 使用反射获取文件实体类中字段上的注解设置的字段类型 + Field field = ReflectUtil.getField(SysFile.class, sortField); + if (field != null) { + org.springframework.data.elasticsearch.annotations.Field fieldAnno = field.getAnnotation(org.springframework.data.elasticsearch.annotations.Field.class); + if(fieldAnno.type() != FieldType.Text + && fieldAnno.type() != FieldType.Object + && fieldAnno.type() != FieldType.Auto + && fieldAnno.type() != FieldType.Nested + && fieldAnno.type() != FieldType.Ip + && fieldAnno.type() != FieldType.Attachment){ + if(fieldAnno.type() == FieldType.Keyword){ + sortField = sortField.concat(".keyword"); + } + searchSourceBuilder.sort(sortField, SortOrder.fromString(sort.getSort())); + }else { + log.error("不支持的排序类型:{}:{}", sortField, fieldAnno.type()); + } + } + } request.source(searchSourceBuilder); + // 设置排序 + SearchResponse response = esClient.search(request, RequestOptions.DEFAULT); return PageVo.ofSearchHits(response.getHits(), page); } - private List getChildrenByDirId(String dirId){ + private List getChildrenByDirId(String dirId) { DirectoryVo dir = directoryService.getById(dirId); return StreamUtil.as(directoryService.childrenLists(dir, ReviewStatus.SUBMITTED)).map(DirectoryVo::getId).toList(); } diff --git a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/MetadataSearchService.java b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/MetadataSearchService.java index 6340133..a60ffe1 100644 --- a/shandan-browser/src/main/java/com/keyware/shandan/browser/service/MetadataSearchService.java +++ b/shandan-browser/src/main/java/com/keyware/shandan/browser/service/MetadataSearchService.java @@ -1,5 +1,7 @@ package com.keyware.shandan.browser.service; +import cn.hutool.core.util.ReflectUtil; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.keyware.shandan.bianmu.entity.DirectoryResource; @@ -10,14 +12,17 @@ import com.keyware.shandan.bianmu.mapper.DirectoryResourceMapper; import com.keyware.shandan.bianmu.service.DirectoryService; import com.keyware.shandan.browser.entity.PageVo; import com.keyware.shandan.browser.entity.SearchConditionVo; +import com.keyware.shandan.browser.entity.SearchResultSort; import com.keyware.shandan.common.util.StreamUtil; import com.keyware.shandan.common.util.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.Assert; +import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * @author Administrator @@ -81,22 +86,33 @@ public class MetadataSearchService { } break; case "markTag": - String tagText = item.getFieldValue(); - List tags = Arrays.asList(tagText.split(",")); - StringBuilder existsSql = new StringBuilder("select 1 from MARK_RECORD MR where MR.ENTITY_ID = V_DIRECTORY_RESOURCE.ID and ( 1 = 1 "); - tags.forEach(tagItem -> { - if (StringUtils.hasText(tagItem)) { - String[] arr = tagItem.split("-"); - existsSql.append(" and MR.MARK_VALUE like '%").append(arr[1]).append("%' "); - } - }); - existsSql.append(")"); - wrapper.exists(existsSql.toString()); + String tagIds = item.getFieldValue(); + List ids = Arrays.asList(tagIds.split(",")); + if (ids.size() > 0) { + StringBuilder existsSql = new StringBuilder("select 1 from (select ENTITY_ID, WM_CONCAT(LABEL_ID) LABEL_IDS from B_DATA_LABEL_ENTITY DLN where DLN.ENTITY_ID = V_DIRECTORY_RESOURCE.ID group by ENTITY_ID) tmp1"); + List andSqlList = ids.stream().map(id -> "tmp1.LABEL_IDS like '%" + id + "%'").collect(Collectors.toList()); + existsSql.append(" where ").append(String.join(" and ", andSqlList)); + wrapper.exists(existsSql.toString()); + } + break; default: } }); }); + + // 排序设置 + SearchResultSort sort = condition.getSort(); + if(sort != null && sort.getSort() != null ){ + // 通过反射获取资源类字段注解中的数据库表相关的列名 + Field field = ReflectUtil.getField(DirectoryResource.class, sort.getField().trim()); + if(field != null){ + TableField tableField = field.getAnnotation(TableField.class); + if(tableField != null && StringUtils.hasText(tableField.value())){ + queryWrapper.orderBy(true, sort.getSort().equalsIgnoreCase("asc"), tableField.value()); + } + } + } return queryWrapper; } diff --git a/shandan-browser/src/main/resources/application-dev.yml b/shandan-browser/src/main/resources/application-dev.yml index 2a40802..ff9912a 100644 --- a/shandan-browser/src/main/resources/application-dev.yml +++ b/shandan-browser/src/main/resources/application-dev.yml @@ -50,4 +50,5 @@ project: logging: level: - root: debug + com.keyware: debug + diff --git a/shandan-browser/src/main/resources/static/js/browser.js b/shandan-browser/src/main/resources/static/js/browser.js index 9107922..51a9108 100644 --- a/shandan-browser/src/main/resources/static/js/browser.js +++ b/shandan-browser/src/main/resources/static/js/browser.js @@ -8,15 +8,16 @@ */ // 目录树数据缓存 const dirCache = new Map(); -layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'dropdown', 'laydate', 'dict'], function () { +layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'dropdown', 'laydate', 'dict', 'datalabel'], function () { const listPage = layui.listPage, form = layui.form, element = layui.element, laydate = layui.laydate, - globalTree = layui.globalTree; - - let metaListTable, dirFileTable, tagSelector, tags = [], unchecked_tags = [], conditions = []; + globalTree = layui.globalTree, + DataLabel = layui.datalabel; + let metaListTable, dirFileTable, tagSelector, tags = [], conditions = []; + const unchecked_tags = new Set(); // 初始化 initDirectoryTree(); @@ -105,7 +106,7 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop * @param basicData */ function setCurrentPosition(basicData) { - let directoryPath = basicData.directoryPath.replaceAll('/', ' / '); + let directoryPath = basicData.directoryPath.replaceAll('/', ' / '); $('.current-position label').text(directoryPath); } @@ -133,26 +134,27 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop url: `${ctx}/search/metadata/all/page/${id}`, height: 'full-110', method: 'post', - defaultToolbar: [{ - title: '导出' //标题 - , layEvent: 'export' //事件名,用于 toolbar 事件中使用 - , icon: 'layui-icon-export' //图标类名 - }], + autoSort: false, + defaultToolbar: [ + {title: '导出', layEvent: 'export', icon: 'layui-icon-export'}, + {title: '列表配置', layEvent: 'theadSet', icon: 'layui-icon-cols'} + ], request: {pageName: 'page', limitName: 'size'}, limit: 30, cols: [[ {field: 'id', title: 'ID', hide: true}, - {field: 'resourceName', title: '数据名称', width: 300}, - {field: 'resourceComment', title: '中文注释/描述'}, - {field: 'directoryPath', title: '资源路径'}, - {field: 'themeTask', title: '主题任务', hide: true}, + {field: 'resourceName', title: '数据名称', width: 300, sort: true}, + {field: 'resourceComment', title: '中文注释/描述', sort: true}, + {field: 'directoryPath', title: '资源路径', sort: true}, + {field: 'themeTask', title: '主题任务', hide: true, sort: true}, { field: 'dataSource', title: '数据来源', width: 160, - templet: (data) => DICT.getText("data_source", data.dataSource) || data.dataSource || '' + templet: (data) => DICT.getText("data_source", data.dataSource) || data.dataSource || '', + sort: true }, - {field: 'taskTime', title: '任务时间', width: 180, align: 'center'}, + {field: 'taskTime', title: '任务时间', width: 180, align: 'center', sort: true}, {field: 'modifyTime', title: '注册时间', width: 160, align: 'center', hide: true}, {fixed: 'right', title: '操作', toolbar: '#rowToolBar', width: 100, align: 'center'} ]], @@ -171,6 +173,15 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop } }, }); + metaListTable.gtable.on('sort', function (data) { + const {field, type} = data; + let sort = type; + if (!sort || sort === 'null') { + sort = undefined; + } + metaListTable.where.sort = {field: field.trim(), sort: sort} + beginSearch(); + }) metaListTable.addTableRowEvent('export', function (obj) { if (id === DIR_ROOT_ID) { showErrorMsg('不允许导出根目录数据'); @@ -206,6 +217,8 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop openMaxLayerWithURL(`${ctx}/search/meta/${obj.id}`) } }) + + new THeadSetLayer(metaListTable, layui); } function initFileSearchTable(id) { @@ -218,32 +231,42 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop url: `${ctx}/search/full/file?metaId=${id}`, height: 'full-110', request: {pageName: 'page', limitName: 'size'}, + defaultToolbar: [ + {title: '列表配置', layEvent: 'theadSet', icon: 'layui-icon-cols'} + ], + autoSort: false, limit: 30, method: 'get', cols: [[ {field: 'id', title: 'ID', hide: true}, {field: 'fileName', title: '文件名称', minWidth: 300, fixed: 'left'}, { + field: 'source', title: '文件来源', minWidth: 160, + sort: true, templet: data => DICT.getText('data_source', data.source) || data.source || '' }, - {field: 'taskCode', title: '任务代号', minWidth: 160}, + {field: 'taskCode', title: '任务代号', sort: true, minWidth: 160}, { + field: 'taskNature', title: '任务性质', minWidth: 160, + sort: true, templet: data => DICT.getText('task_nature', data.taskNature) || data.taskNature || '' }, - {field: 'troopCode', title: '部队代号', minWidth: 160}, - {field: 'missileNumber', title: '导弹编号', minWidth: 160}, - {field: 'equipmentModel', title: '装备型号', minWidth: 160}, + {field: 'troopCode', title: '部队代号', sort: true, minWidth: 160}, + {field: 'missileNumber', title: '导弹编号', sort: true, minWidth: 160}, + {field: 'equipmentModel', title: '装备型号', sort: true, minWidth: 160}, { + field: 'targetNumber', title: '目标/靶标类型', minWidth: 160, + sort: true, templet: data => DICT.getText('target_type', data.targetNumber) || data.targetNumber || '' }, - {field: 'entryStaff', title: '录入人员', minWidth: 160}, - {field: 'inputDate', title: '收文时间', width: 160, align: 'center'}, + {field: 'entryStaff', title: '录入人员', sort: true, minWidth: 160}, + {field: 'inputDate', title: '收文时间', sort: true, width: 160, align: 'center'}, {field: 'remark', title: '文件描述', width: 300}, {field: 'text', title: '文件内容', width: 300}, {fixed: 'right', title: '操作', toolbar: '#fileRowToolBar', width: 100, align: 'center'} @@ -251,10 +274,23 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop }, }); + dirFileTable.gtable.on('sort', function (data) { + const {field, type} = data; + let sort = type; + if (!sort || sort === 'null') { + sort = undefined; + } + dirFileTable.table.where.field = field.trim(); + dirFileTable.table.where.sort = sort; + dirFileTable.reloadTable({table: dirFileTable.table}) + }) + // 查看按钮监听 dirFileTable.addTableRowEvent('details-file', function (obj) { openMaxLayerWithURL(`${ctx}/sys/file/view?fileId=${obj.id}`) }) + + new THeadSetLayer(dirFileTable, layui); } /** @@ -273,15 +309,13 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop $('#condition-div').slideToggle(100, 'linear', conditionSlideToggle) }); - if (!tagSelector) { - tagSelector = new MarkerSelector('#mark-selector-input'); - } - tagSelector.bindBtnEvent() - tagSelector.onOkBtn(data => { - tags = data - setMarkTagInputValue(); - }); + $('#mark-selector-input').on('click', function () { + DataLabel.openChooseDialog(null, null, null, true).then((labels) => { + tags = labels || []; + setMarkTagInputValue(); + }) + }) // 监听标签点击事件 element.on('tab(condition-tab)', function (data) { // 点击后移除选中样式 @@ -296,6 +330,9 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop // 监听条件标签删除事件 element.on('tabDelete(condition-tab)', function (data) { let key = $(this).parent().data('key'); + if (key === 'markTag') { + tags = []; + } let formVal = form.val('search-form'); formVal[key] = ''; form.val('search-form', formVal); @@ -310,7 +347,7 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop $('#condition-clear-btn').on('click', function () { $('#searchKeyInput').val(''); tags = []; - unchecked_tags = []; + unchecked_tags.clear(); conditions = []; beginSearch(); }); @@ -342,9 +379,7 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop function setMarkTagInputValue() { let temp = []; for (let tag of tags) { - let arr = tag.split('-'); - let text = tag.replace(arr[0] + '-' + arr[1] + '-', ''); - temp.push(text); + temp.push(tag.title); } $('#mark-selector-input').val(temp.join(', ')); } @@ -370,7 +405,7 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop let htm = ''; conditions = []; for (let key in formVal) { - if (key == 'searchKeyInput') continue; + if (key === 'searchKeyInput') continue; let fieldName = key, fieldValue = formVal[key], logicJudgement; // 如果fieldName是条件下拉框,则跳过 if (fieldName.startsWith('logic-') || fieldName === 'directoryId' || fieldName === 'metadataId') continue; @@ -397,11 +432,11 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop condition = '包含'; } - if (fieldName == 'secretLevel') { + if (fieldName === 'secretLevel') { hasText = $(`select[name="secretLevel"] option[value="${fieldValue}"]`).text(); - } else if (fieldName == 'dataFrom') { + } else if (fieldName === 'dataFrom') { hasText = $(`select[name="dataFrom"] option[value="${fieldValue}"]`).text(); - } else if (fieldName == 'dataType') { + } else if (fieldName === 'dataType') { hasText = $(`select[name="dataType"] option[value="${fieldValue}"]`).text(); } conditions.push({fieldName, fieldValue, logicJudgement}) @@ -409,40 +444,29 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop } } - let temp = []; + let tag_htm = ''; for (let tag of tags) { - let tag_arr = tag.split('-'); - let tag_type = tag_arr[1], tag_text = tag_arr[2], temp_tags = temp[tag_type]; - if (!temp_tags) { - temp_tags = [] + let checked = 'checked'; + if (unchecked_tags.has(tag.id + '')) { + checked = ''; } - temp_tags.push({id: tag_arr[0], text: tag_text}); - temp[tag_type] = temp_tags; + tag_htm += ``; } - - for (let type in temp) { - let tag_type = type, tag_items = temp[type], tag_htm = ''; - for (let item of tag_items) { - let val = item.id + '-' + item.text, checked = 'checked'; - if (unchecked_tags.includes(val)) { - checked = ''; - } - tag_htm += ``; - } - - htm += `
  • ${tag_type}:${tag_htm}
  • `; + if (tag_htm) { + htm += `
  • 置标标签:${tag_htm}
  • `; } + $('#condition-tab ul').html(htm); element.render('tab'); - $('#condition-tab ul li[data-key="markTag"] i').remove(); + $('#condition-tab ul li[data-key="markTag"] i').css({'margin-left': '-10px'}); form.render('checkbox'); $('li[data-key="markTag"] .layui-form-checkbox').on('click', function () { - let val = $(this).prev().val(), index = unchecked_tags.indexOf(val); - if (!$(this).hasClass('layui-form-checked')) { - unchecked_tags.push(val); - } else if (index > -1) { - unchecked_tags.splice(index, 1) + let val = $(this).prev().val(); + if (unchecked_tags.has(val)) { + unchecked_tags.delete(val); + } else { + unchecked_tags.add(val); } beginSearch(); }) @@ -453,7 +477,6 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop } } - function beginSearch() { setMarkTagsValue() metaListTable.where.conditions = conditions; @@ -491,4 +514,98 @@ layui.use(['layer', 'listPage', 'globalTree', 'gtable', 'form', 'element', 'drop closeBtn: 1 }); } -}) \ No newline at end of file +}) + +/** + * 表格表头配置组件 + */ +class THeadSetLayer { + constructor(pageTable, lay) { + this.layer = lay.layer; + this.form = lay.form; + this.gtable = lay.gtable; + this.pageTable = pageTable; + this.id = pageTable.id + 'Set'; + this.pageTable.addTableRowEvent('theadSet', () => this.show()) + } + + show() { + const {layer, pageTable, id} = this; + layer.open({ + id: id + 'Layer', + title: '数据列表配置', + type: 1, + area: ['1000px', '700px'], + shadeClose: true, + maxmin: false, + anim: 0, + content: `
    `, + btn: ['保存', '取消'], + success: () => { + this._renderInnerTable(); + }, + yes: (layerIndex) => { + this._saveTheadSet().then(() => { + pageTable.reloadTable(); + layer.close(layerIndex); + }) + } + }); + } + + _renderInnerTable() { + const {gtable, form, id} = this; + gtable.init({ + id, + data: [...sourceTableConfigMap.values()], + method: 'get', + toolbar: false, + height: 'full-310', + page: false, + cols: [[ + {field: 'id', hide: true}, + {field: 'colName', title: '列名'}, + {field: 'colTitle', title: '列标题', edit: 'text'}, + {field: 'colSort', title: '列顺序', edit: 'text'}, + {field: 'colWidth', title: '列宽度', edit: 'text'}, + { + field: 'isSort', + title: '是否允许排序', + templet: (data) => renderSwitch('isSort', data) + }, + { + field: 'isShow', + title: '是否显示', + templet: (data) => renderSwitch('isShow', data) + } + ]], + }); + gtable.on(`edit(${id})`, ({field, value, data}) => { + sourceTableConfigMap.get(data.id)[field] = value; + }) + // 监听switch按钮 + form.on(`switch(${id}-switch)`, ({elem}) => { + const id = $(elem).attr('id'), name = $(elem).attr('name'); + const value = sourceTableConfigMap.get(id)[name]; + sourceTableConfigMap.get(id)[name] = !value; + }); + + function renderSwitch(colName, data) { + const dataId = data.id, value = data[colName]; + return `` + } + } + + _saveTheadSet() { + return new Promise(resolve => { + Util.post(`/sys/thead/config/api/save`, {params: JSON.stringify([...sourceTableConfigMap.values()])}).then(res=>{ + if(res.flag){ + showOkMsg('保存成功') + }else{ + showErrorMsg2('保存失败:'+res.msg) + } + }) + resolve(); + }) + } +} \ No newline at end of file diff --git a/shandan-browser/src/main/resources/static/js/meta_search.js b/shandan-browser/src/main/resources/static/js/meta_search.js index 7cb5c05..dbf9bb1 100644 --- a/shandan-browser/src/main/resources/static/js/meta_search.js +++ b/shandan-browser/src/main/resources/static/js/meta_search.js @@ -36,6 +36,7 @@ layui.use(['dropdown', 'gtable', 'laydate', 'form'], function () { cols: [cols], limit: 20, toolbar: '#table-title', + request:{pageName: 'page', limitName: 'size'}, defaultToolbar: ['filter', 'print', 'exports', { title: '统计报表', layEvent: 'tong-ji', @@ -194,7 +195,7 @@ layui.use(['dropdown', 'gtable', 'laydate', 'form'], function () { let id = $(this).data('id'); $condition_list.find(`li[id="li_${id}"]`).remove(); $condition_list.find(`li:first a[name="${LOGIC_JOIN}"]`).addClass("layui-hide").data('value', 'and'); - if ($condition_list.find('li').length == 0) { + if ($condition_list.find('li').length === 0) { $condition_list.find('p.condition-none').removeClass('layui-hide'); } }); diff --git a/shandan-browser/src/main/resources/static/js/report.js b/shandan-browser/src/main/resources/static/js/report.js index ce31424..ec1d0b9 100644 --- a/shandan-browser/src/main/resources/static/js/report.js +++ b/shandan-browser/src/main/resources/static/js/report.js @@ -63,7 +63,7 @@ ReportComponent.prototype.openEchartsConfigLayer = function () { $('#echartsConfigForm').parent().css('overflow', 'visible') }, yes: function (index) { - _this.requestData(()=> layer.close(index)); + _this.requestData(() => layer.close(index)); } }); } @@ -203,12 +203,15 @@ ReportComponent.prototype.validate = function (formVal) { if (!formVal.aggregationType) { showErrorMsg('请设置聚合方式'); return; - } else { - if ((formVal.aggregationType == 'sum' || formVal.aggregationType == 'avg') && !formVal.fieldY) { - showErrorMsg('请设置聚合字段'); - return; - } } + if ((formVal.aggregationType == 'sum' || formVal.aggregationType == 'avg') && !formVal.fieldY) { + showErrorMsg('请设置聚合字段'); + return; + } + if(formVal.aggregationType == 'count' && !formVal.fieldY){ + formVal.fieldY = formVal.fieldX; + } + return true; } diff --git a/shandan-browser/src/main/resources/view/browser.html b/shandan-browser/src/main/resources/view/browser.html index f031ac5..5d8c1da 100644 --- a/shandan-browser/src/main/resources/view/browser.html +++ b/shandan-browser/src/main/resources/view/browser.html @@ -11,6 +11,18 @@ @@ -79,18 +91,23 @@
    当前位置:
    @@ -219,7 +246,6 @@ - diff --git a/shandan-control/src/main/java/com/keyware/shandan/control/config/DynamicFormListener.java b/shandan-control/src/main/java/com/keyware/shandan/control/config/DynamicFormListener.java index 2ed27f2..7b36259 100644 --- a/shandan-control/src/main/java/com/keyware/shandan/control/config/DynamicFormListener.java +++ b/shandan-control/src/main/java/com/keyware/shandan/control/config/DynamicFormListener.java @@ -7,8 +7,11 @@ import com.keyware.shandan.system.entity.SysMenu; import com.keyware.shandan.system.service.SysMenuService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; @Component +@Transactional(rollbackFor = Exception.class, propagation = Propagation.SUPPORTS) public class DynamicFormListener implements DynamicFormEventListener { @Autowired @@ -21,7 +24,7 @@ public class DynamicFormListener implements DynamicFormEventListener { menu.setMenuId(form.getId().toString()); menu.setParentMenu(parentMenu); menu.setMenuParentId(parentMenu.getMenuId()); - menu.setMenuName(form.getFormName() + "管理"); + menu.setMenuName(form.getFormName()); menu.setMenuPath("/dynamic-data/view/data/list/" + form.getId()); menu.setSystem(parentMenu.getSystem()); menu.setMenuParentName(parentMenu.getMenuName()); diff --git a/shandan-control/src/main/resources/application-dev.yml b/shandan-control/src/main/resources/application-dev.yml index a437fee..1ef106a 100644 --- a/shandan-control/src/main/resources/application-dev.yml +++ b/shandan-control/src/main/resources/application-dev.yml @@ -25,10 +25,6 @@ spring: rest: uris: http://192.168.134.128:9200 -mybatis-plus: - configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - security: oauth2: client: @@ -51,4 +47,4 @@ project: logging: level: - root: debug + com.keyware: debug diff --git a/shandan-desktop/src/main/resources/application-dev.yml b/shandan-desktop/src/main/resources/application-dev.yml index 588187e..53aaf00 100644 --- a/shandan-desktop/src/main/resources/application-dev.yml +++ b/shandan-desktop/src/main/resources/application-dev.yml @@ -48,7 +48,6 @@ security: user-authorization-uri: ${oauth.server.proxy}/oauth/authorize resource: user-info-uri: ${oauth.server.internal}/oauth/user/info - logging: level: - root: debug + com.keyware: debug diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/controller/MetadataCommonController.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/controller/MetadataCommonController.java index 46c8a8c..c8cf862 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/controller/MetadataCommonController.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/controller/MetadataCommonController.java @@ -1,6 +1,7 @@ package com.keyware.shandan.bianmu.controller; import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.keyware.shandan.bianmu.entity.DirectoryResource; import com.keyware.shandan.bianmu.entity.DirectoryVo; @@ -12,6 +13,9 @@ import com.keyware.shandan.common.util.StringUtils; import com.keyware.shandan.datasource.entity.DBTableColumnVo; import com.keyware.shandan.datasource.entity.DataSourceVo; import com.keyware.shandan.datasource.service.DataSourceService; +import com.keyware.shandan.system.constants.FormTypeEnum; +import com.keyware.shandan.system.entity.SysFormConfig; +import com.keyware.shandan.system.service.SysFormConfigService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -50,6 +54,9 @@ public class MetadataCommonController { @Autowired private DataLabelsService labelsService; + @Autowired + private SysFormConfigService formConfigService; + /** * 数据资源详细信息页面 * @@ -74,6 +81,8 @@ public class MetadataCommonController { mav.addObject("exampleList", exampleData.getRecords()); mav.addObject("LabelConfigSet", labelsService.formConfigList()); + + mav.addObject("metadataFormConfig", formConfigService.listByFormType(FormTypeEnum.metadataEditForm)); return mav; } diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/DataLabelsVo.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/DataLabelsVo.java index 6166c69..3fd300e 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/DataLabelsVo.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/DataLabelsVo.java @@ -3,7 +3,6 @@ package com.keyware.shandan.bianmu.entity; import com.baomidou.mybatisplus.annotation.*; import com.keyware.shandan.common.entity.BaseEntity; import com.keyware.shandan.common.util.StringUtils; -import com.keyware.shandan.system.utils.StringUtil; import lombok.*; import java.util.Date; @@ -74,6 +73,13 @@ public class DataLabelsVo extends BaseEntity { @OrderBy(isDesc = false, sort = 1) private Boolean isLabel; + /** + * 渲染顺序 + */ + @TableField(value = "SORT") + @OrderBy(isDesc = false) + private Integer sort; + /** * 创建时间 */ @@ -91,7 +97,7 @@ public class DataLabelsVo extends BaseEntity { return ""; } - public String getTitlePathWithSelf(){ + public String getTitlePathWithSelf() { if (StringUtils.hasText(titlePath)) { return titlePath + title + "/"; } diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/DirectoryVo.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/DirectoryVo.java index 67abf19..09bc7a8 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/DirectoryVo.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/DirectoryVo.java @@ -130,21 +130,9 @@ public class DirectoryVo extends BaseEntity { @OrderBy(isDesc = false) private Date createTime; - /** - * 所属部门对象 - */ - /*@TableField(exist = false) - private SysOrg org;*/ - @TableField(exist = false) private String modifyUserName; - /** - * 是否有子级 - */ - /*@TableField(exist = false) - private Boolean hasChild;*/ - /** * 子级目录 */ @@ -157,6 +145,12 @@ public class DirectoryVo extends BaseEntity { @TableField(exist = false) private boolean applyChild; + /** + * 目录顺序 + */ + @TableField(value = "SORT") + private Integer sort; + /** * 创建人名称 */ diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/LabelEntity.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/LabelEntity.java index 861d8e8..268bc42 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/LabelEntity.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/entity/LabelEntity.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.keyware.shandan.common.util.MD5Util; import lombok.*; +import org.apache.ibatis.annotations.One; import org.springframework.util.StringUtils; import java.io.Serializable; @@ -42,6 +43,9 @@ public class LabelEntity implements Serializable { @TableField("LABEL") private String label; + @TableField(exist = false) + private DataLabelsVo data; + public String getId() { if (StringUtils.hasText(id)) { return id; diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/mapper/LabelEntityMapper.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/mapper/LabelEntityMapper.java index 01c8ccc..2210dda 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/mapper/LabelEntityMapper.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/mapper/LabelEntityMapper.java @@ -2,9 +2,9 @@ package com.keyware.shandan.bianmu.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.keyware.shandan.bianmu.entity.LabelEntity; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.*; +import java.io.Serializable; import java.util.List; /** @@ -14,6 +14,21 @@ import java.util.List; @Mapper public interface LabelEntityMapper extends BaseMapper { + @Override + @Results(id="all_result_map", value = { + @Result(id = true, column = "ID", property = "id"), + @Result(column = "ENTITY_ID", property = "entityId"), + @Result(column = "ENTITY_TYPE", property = "entityType"), + @Result(column = "LABEL_ID", property = "labelId"), + @Result(column = "FIELD_TITLE", property = "fieldTitle"), + @Result(column = "LABEL", property = "label"), + @Result(column = "LABEL_ID", property = "data", one = @One(select = "com.keyware.shandan.bianmu.mapper.DataLabelsMapper.selectById")) + }) + @Select("SELECT * FROM B_DATA_LABEL_ENTITY WHERE ID = #{id}") + LabelEntity selectById(Serializable id); + + @ResultMap(value = {"all_result_map"}) @Select("SELECT * FROM B_DATA_LABEL_ENTITY WHERE ENTITY_ID = #{entityId}") List selectByEntityId(String entityId); + } diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/service/DirectoryTreeService.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/service/DirectoryTreeService.java index 9e8eda5..a5434d8 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/service/DirectoryTreeService.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/service/DirectoryTreeService.java @@ -53,15 +53,41 @@ public class DirectoryTreeService { if (StringUtils.hasText(pid)) { parentDir = directoryService.getById(pid); } + // 获取子级节点 List directoryList = getDirectoryList(parentDir, allChild, hasMetadata, busType); + // 审核状态 ReviewStatus status = StringUtils.hasText(reviewStatus) ? ReviewStatus.valueOf(reviewStatus) : null; + // 当前用户 SysUser user = SecurityUtil.getLoginSysUser(); + // 根据权限类型获取权限范围内的数据的ID集合 Set permisDis = "write".equals(permis) ? dirPermissionService.getByWritePermis(user) : dirPermissionService.getByReadPermis(user); + // 判断权限范围 List permisDirectoryList = StreamUtil.as(directoryList).filter(dir -> { - if (status == null) { - return permisDis.contains(dir.getId()); + if (dir.getDirectoryType() == DirectoryType.FILE + || dir.getDirectoryType() == DirectoryType.LINK_FILE + || dir.getDirectoryType() == DirectoryType.METADATA + || dir.getDirectoryType() == DirectoryType.LINK_METADATA) { + return true; } - return dir.getReviewStatus() == status && permisDis.contains(dir.getId()); + + if (dir.getReviewStatus() == status || status == null) { + boolean permisAllow = permisDis.contains(dir.getId()); + if (permisAllow) { + return true; + } + // 如果权限不允许,则需要判断当前节点的所有子级节点是否有允许的目录,如果有则需要返回到前端的树组件中 + Set childrenIds = getDirectoryList(dir, true, false, busType) + .stream() + .map(DirectoryVo::getId) + .collect(Collectors.toSet()); + for (String id : childrenIds) { + if (permisDis.contains(id)) { + return true; + } + } + return false; + } + return false; }).toList(); DirectoryParentBuilder dpb = new DirectoryParentBuilder(directoryList, permisDirectoryList); @@ -87,9 +113,9 @@ public class DirectoryTreeService { */ private List getDirectoryList(DirectoryVo parentDir, boolean allChild, boolean hasResource, int busType) { QueryWrapper wrapper = new QueryWrapper<>(); - if(parentDir == null){ + if (parentDir == null) { wrapper.eq("ID", "ROOT"); - }else { + } else { wrapper.in(!hasResource, "DIRECTORY_TYPE", DirectoryType.DIRECTORY, DirectoryType.LINK_DIR).eq("IS_BASIC_DIR", busType); if (parentDir != null) { if (allChild) { diff --git a/shandan-system/src/main/java/com/keyware/shandan/bianmu/utils/DirectoryUtil.java b/shandan-system/src/main/java/com/keyware/shandan/bianmu/utils/DirectoryUtil.java index 75873ec..0257989 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/bianmu/utils/DirectoryUtil.java +++ b/shandan-system/src/main/java/com/keyware/shandan/bianmu/utils/DirectoryUtil.java @@ -29,13 +29,14 @@ public class DirectoryUtil { tree.setType("DIRECTORY"); tree.setPath(dir.getDirectoryPath()); tree.setBasicData(dir); - if(dir.getDirectoryType() == DirectoryType.FILE || dir.getDirectoryType() == DirectoryType.LINK_FILE){ + tree.setSort(dir.getSort() == null ? Integer.MAX_VALUE : dir.getSort()); + if (dir.getDirectoryType() == DirectoryType.FILE || dir.getDirectoryType() == DirectoryType.LINK_FILE) { tree.setIconClass("dtree-icon-normal-file"); tree.setLast(true); - }else if(dir.getDirectoryType() == DirectoryType.METADATA || dir.getDirectoryType() == DirectoryType.LINK_METADATA){ + } else if (dir.getDirectoryType() == DirectoryType.METADATA || dir.getDirectoryType() == DirectoryType.LINK_METADATA) { tree.setIconClass("dtree-icon-sort"); tree.setLast(true); - }else{ + } else { tree.setLast(false); } } diff --git a/shandan-system/src/main/java/com/keyware/shandan/frame/aspect/SafetyAspect.java b/shandan-system/src/main/java/com/keyware/shandan/frame/aspect/SafetyAspect.java index 7742803..85a0e98 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/frame/aspect/SafetyAspect.java +++ b/shandan-system/src/main/java/com/keyware/shandan/frame/aspect/SafetyAspect.java @@ -6,8 +6,10 @@ import com.keyware.shandan.common.entity.Result; import com.keyware.shandan.common.util.*; import com.keyware.shandan.frame.config.security.SecurityUtil; import com.keyware.shandan.frame.properties.CustomProperties; +import com.keyware.shandan.system.entity.SysFormConfig; import com.keyware.shandan.system.entity.SysRole; import com.keyware.shandan.system.entity.SysUser; +import com.keyware.shandan.system.service.SysFormConfigService; import com.keyware.shandan.system.service.SysRoleService; import com.keyware.shandan.system.utils.SysSettingUtil; import lombok.extern.slf4j.Slf4j; @@ -25,7 +27,9 @@ import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; /** * AES + RSA 加解密AOP处理 @@ -44,6 +48,9 @@ public class SafetyAspect { @Autowired private SysRoleService sysRoleService; + @Autowired + private SysFormConfigService formConfigService; + /** * Pointcut 切入点 */ @@ -80,7 +87,7 @@ public class SafetyAspect { Object result = joinPoint.proceed(AspectUtil.parseJoinPointArgs(joinPoint, request)); //执行方法之前解密,且只拦截post请求 - if ("post".equalsIgnoreCase(request.getMethod()) && !ServletFileUpload.isMultipartContent(request)) { + if ("post".equalsIgnoreCase(request.getMethod()) && !ServletFileUpload.isMultipartContent(request) && StringUtils.hasText(publicKey)) { // 返回之前对结果进行加密 //每次响应之前随机获取AES的key,加密data数据 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); @@ -98,7 +105,7 @@ public class SafetyAspect { ModelAndView modelAndView = (ModelAndView) result; modelAndView.addObject("publicKey", RsaUtil.getPublicKey()); modelAndView.addObject("sys", SysSettingUtil.getCurrentSysSetting()); - SysUser loginUser = SecurityUtil.getLoginSysUser(); + SysUser loginUser = SecurityUtil.getLoginSysUser(); loginUser.setPassword(null); modelAndView.addObject("loginUser", loginUser); //登录用户角色信息 @@ -121,6 +128,10 @@ public class SafetyAspect { } //展示用户角色 modelAndView.addObject("userRole", userRoles.get(index)); + List formConfigList = formConfigService.list(); + + modelAndView.addObject("metadataFormConfig", formConfigList.stream().filter(conf -> conf.getFormType() == 1).collect(Collectors.toList())); + modelAndView.addObject("uploadFormConfig", formConfigList.stream().filter(conf -> conf.getFormType() == 2).collect(Collectors.toList())); setStaticResourceAddress(request, modelAndView); } return result; diff --git a/shandan-system/src/main/java/com/keyware/shandan/mark/controller/MarkViewController.java b/shandan-system/src/main/java/com/keyware/shandan/mark/controller/MarkViewController.java index 19cba39..0f1d607 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/mark/controller/MarkViewController.java +++ b/shandan-system/src/main/java/com/keyware/shandan/mark/controller/MarkViewController.java @@ -1,6 +1,6 @@ package com.keyware.shandan.mark.controller; -import com.keyware.shandan.mark.constant.FormTypeEnum; +import com.keyware.shandan.system.constants.FormTypeEnum; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/shandan-system/src/main/java/com/keyware/shandan/mark/services/MarkService.java b/shandan-system/src/main/java/com/keyware/shandan/mark/services/MarkService.java index b99b51a..b8fa53f 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/mark/services/MarkService.java +++ b/shandan-system/src/main/java/com/keyware/shandan/mark/services/MarkService.java @@ -1,7 +1,7 @@ package com.keyware.shandan.mark.services; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.keyware.shandan.mark.constant.FormTypeEnum; +import com.keyware.shandan.system.constants.FormTypeEnum; import com.keyware.shandan.mark.pojo.FormMark; import com.keyware.shandan.mark.pojo.MarkRecord; import com.keyware.shandan.mark.pojo.MarkType; diff --git a/shandan-system/src/main/java/com/keyware/shandan/mark/constant/FormTypeEnum.java b/shandan-system/src/main/java/com/keyware/shandan/system/constants/FormTypeEnum.java similarity index 72% rename from shandan-system/src/main/java/com/keyware/shandan/mark/constant/FormTypeEnum.java rename to shandan-system/src/main/java/com/keyware/shandan/system/constants/FormTypeEnum.java index 66e1b51..bb0cf37 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/mark/constant/FormTypeEnum.java +++ b/shandan-system/src/main/java/com/keyware/shandan/system/constants/FormTypeEnum.java @@ -1,5 +1,6 @@ -package com.keyware.shandan.mark.constant; +package com.keyware.shandan.system.constants; +import com.baomidou.mybatisplus.annotation.EnumValue; import lombok.AllArgsConstructor; import lombok.Getter; @@ -16,16 +17,19 @@ public enum FormTypeEnum { /** * 数据资源注册表单 */ - metadataEditForm("数据资源注册表单"), + metadataEditForm(1,"数据资源注册表单"), /** * 文件上传表单 */ - fileUploadForm("文件上传表单"), + fileUploadForm(2, "文件上传表单"), /** * 文件夹上传表单 */ @Deprecated - dirUploadForm("文件夹上传表单"); + dirUploadForm(3, "文件夹上传表单"); + + @EnumValue + private final Integer value; /** * 描述 diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/controller/SysFileController.java b/shandan-system/src/main/java/com/keyware/shandan/system/controller/SysFileController.java index f60521e..547b942 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/system/controller/SysFileController.java +++ b/shandan-system/src/main/java/com/keyware/shandan/system/controller/SysFileController.java @@ -8,10 +8,12 @@ import com.keyware.shandan.common.controller.BaseController; import com.keyware.shandan.common.entity.Result; import com.keyware.shandan.common.util.FileDownload; import com.keyware.shandan.frame.properties.CustomProperties; +import com.keyware.shandan.system.constants.FormTypeEnum; import com.keyware.shandan.system.entity.SysFile; import com.keyware.shandan.system.entity.SysFileChunk; import com.keyware.shandan.system.entity.SysSetting; import com.keyware.shandan.system.service.SysFileService; +import com.keyware.shandan.system.service.SysFormConfigService; import com.keyware.shandan.system.service.SysSettingService; import com.keyware.shandan.system.utils.FileChunkUploadUtil; import org.apache.tomcat.util.http.ResponseUtil; @@ -57,12 +59,16 @@ public class SysFileController extends BaseController getById(@PathVariable String id) { + return Result.of(formConfigService.getById(id)); + } + + @GetMapping("/api/list/{formType}") + public Result> list(@PathVariable String formType) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("FORM_TYPE", formType); + return Result.of(formConfigService.list(query)); + } + + @PostMapping(value = "/api/save") + public Result save(String params) { + JSONArray jsonArray = JSONUtil.parseArray(params); + List list = jsonArray.toList(SysFormConfig.class); + return Result.of(formConfigService.saveOrUpdateBatch(list)); + } +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/controller/SysTheadConfigController.java b/shandan-system/src/main/java/com/keyware/shandan/system/controller/SysTheadConfigController.java new file mode 100644 index 0000000..cc2e3e6 --- /dev/null +++ b/shandan-system/src/main/java/com/keyware/shandan/system/controller/SysTheadConfigController.java @@ -0,0 +1,42 @@ +package com.keyware.shandan.system.controller; + +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.keyware.shandan.common.entity.Result; +import com.keyware.shandan.common.util.StringUtils; +import com.keyware.shandan.system.entity.SysTheadConfig; +import com.keyware.shandan.system.service.SysTheadConfigService; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 前端数据表格表头配置前端控制器 + * + * @author GuoXin + * @date 2023/8/30 + */ +@RestController +@RequestMapping("/sys/thead/config") +public class SysTheadConfigController { + private final SysTheadConfigService theadConfigService; + + public SysTheadConfigController(SysTheadConfigService theadConfigService) { + this.theadConfigService = theadConfigService; + } + + @PostMapping(value = "/api/save") + public Result save(String params, Authentication auth) { + JSONArray jsonArray = JSONUtil.parseArray(params); + List list = jsonArray.toList(SysTheadConfig.class); + list.forEach(item->{ + if(!StringUtils.hasText(item.getId())){ + item.genId(auth.getName()); + } + }); + return Result.of(theadConfigService.saveOrUpdateBatch(list)); + } +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/entity/SysFormConfig.java b/shandan-system/src/main/java/com/keyware/shandan/system/entity/SysFormConfig.java new file mode 100644 index 0000000..b6d4f83 --- /dev/null +++ b/shandan-system/src/main/java/com/keyware/shandan/system/entity/SysFormConfig.java @@ -0,0 +1,66 @@ +package com.keyware.shandan.system.entity; + +import com.baomidou.mybatisplus.annotation.OrderBy; +import com.keyware.shandan.common.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 系统表单配置实体类 + * + * @author GuoXin + * @date 2023/8/23 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class SysFormConfig extends BaseEntity { + + private static final long serialVersionUID = 6628747783449277117L; + + /** + * 主键 + */ + private Integer id; + /** + * 表单类型:1-资源注册表单,2-文件上传表单 + */ + private Integer formType; + /** + * 字段名 + */ + private String fieldName; + /** + * 字段显示标题 + */ + private String showTitle; + /** + * 字段类型 + */ + private String fieldType; + /** + * 数据字典类型,只有当fieldType为"dict"时才有效 + */ + private String dictType; + /** + * 默认值 + */ + private String defaultValue; + /** + * 是否必填:0-非必填,1-必填 + */ + private Boolean isRequired; + /** + * 是否禁用:0-不禁用,1-禁用 + */ + private Boolean isDisabled; + /** + * 是否禁用:0-不禁用,1-禁用 + */ + private Boolean isShow; + /** + * 显示顺序 + */ + @OrderBy(isDesc = false) + private Integer sort; + +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/entity/SysTheadConfig.java b/shandan-system/src/main/java/com/keyware/shandan/system/entity/SysTheadConfig.java new file mode 100644 index 0000000..ae2e581 --- /dev/null +++ b/shandan-system/src/main/java/com/keyware/shandan/system/entity/SysTheadConfig.java @@ -0,0 +1,65 @@ +package com.keyware.shandan.system.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.OrderBy; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.keyware.shandan.common.entity.BaseEntity; +import com.keyware.shandan.common.util.MD5Util; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 前端数据表格表头配置实体类 + * + * @author GuoXin + * @date 2023/8/30 + */ +@Data +@Builder +@EqualsAndHashCode(callSuper = true) +@TableName("SYS_THEAD_CONFIG") +public class SysTheadConfig extends BaseEntity { + + private static final long serialVersionUID = 1480474706145625172L; + /** + * 主键 + */ + @TableId(type = IdType.INPUT) + private String id; + /** + * 数据表ID,对应前端页面上的layui中table组件的id + */ + private String tableId; + /** + * 列名 + */ + private String colName; + /** + * 列标题 + */ + private String colTitle; + /** + * 列顺序 + */ + @OrderBy(isDesc = false, sort = 2) + private Integer colSort; + /** + * 列宽度 + */ + private String colWidth; + /** + * 是否显示 + */ + @OrderBy(sort = 1) + private Boolean isShow; + /** + * 是否允许排序 + */ + private Boolean isSort; + + public void genId(String userName) { + this.id = MD5Util.getMD5(tableId + colName + userName); + } +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/mapper/SysFormConfigMapper.java b/shandan-system/src/main/java/com/keyware/shandan/system/mapper/SysFormConfigMapper.java new file mode 100644 index 0000000..5fd966e --- /dev/null +++ b/shandan-system/src/main/java/com/keyware/shandan/system/mapper/SysFormConfigMapper.java @@ -0,0 +1,15 @@ +package com.keyware.shandan.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.keyware.shandan.system.entity.SysFormConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统表单配置数据库操作映射 + * + * @author GuoXin + * @date 2023/8/23 + */ +@Mapper +public interface SysFormConfigMapper extends BaseMapper { +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/mapper/SysTheadConfigMapper.java b/shandan-system/src/main/java/com/keyware/shandan/system/mapper/SysTheadConfigMapper.java new file mode 100644 index 0000000..8a7a15e --- /dev/null +++ b/shandan-system/src/main/java/com/keyware/shandan/system/mapper/SysTheadConfigMapper.java @@ -0,0 +1,15 @@ +package com.keyware.shandan.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.keyware.shandan.system.entity.SysTheadConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * 前端数据表格表头配置数据库操作映射接口 + * + * @author GuoXin + * @date 2023/8/30 + */ +@Mapper +public interface SysTheadConfigMapper extends BaseMapper { +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/service/SysFormConfigService.java b/shandan-system/src/main/java/com/keyware/shandan/system/service/SysFormConfigService.java new file mode 100644 index 0000000..f946f45 --- /dev/null +++ b/shandan-system/src/main/java/com/keyware/shandan/system/service/SysFormConfigService.java @@ -0,0 +1,18 @@ +package com.keyware.shandan.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.keyware.shandan.system.constants.FormTypeEnum; +import com.keyware.shandan.system.entity.SysFormConfig; + +import java.util.List; + +/** + * 系统表单配置服务接口类 + * + * @author GuoXin + * @date 2023/8/23 + */ +public interface SysFormConfigService extends IService { + + List listByFormType(FormTypeEnum formTypeEnum); +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/service/SysTheadConfigService.java b/shandan-system/src/main/java/com/keyware/shandan/system/service/SysTheadConfigService.java new file mode 100644 index 0000000..77ec5c5 --- /dev/null +++ b/shandan-system/src/main/java/com/keyware/shandan/system/service/SysTheadConfigService.java @@ -0,0 +1,16 @@ +package com.keyware.shandan.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.keyware.shandan.system.entity.SysTheadConfig; + +import java.util.List; + +/** + * 前端数据表格表头配置数据库操作接口 + * + * @author GuoXin + * @date 2023/8/30 + */ +public interface SysTheadConfigService extends IService { + List listByCreateUser(String userId); +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/service/impl/SysDictServiceImpl.java b/shandan-system/src/main/java/com/keyware/shandan/system/service/impl/SysDictServiceImpl.java index f79747b..8661a0e 100644 --- a/shandan-system/src/main/java/com/keyware/shandan/system/service/impl/SysDictServiceImpl.java +++ b/shandan-system/src/main/java/com/keyware/shandan/system/service/impl/SysDictServiceImpl.java @@ -33,7 +33,7 @@ public class SysDictServiceImpl extends BaseServiceImpl implements SysFormConfigService { + @Override + public List listByFormType(FormTypeEnum formTypeEnum) { + QueryWrapper query = new QueryWrapper<>(); + query.eq("FORM_TYPE", formTypeEnum.getValue()); + return list(query); + } +} diff --git a/shandan-system/src/main/java/com/keyware/shandan/system/service/impl/SysTheadConfigServiceImpl.java b/shandan-system/src/main/java/com/keyware/shandan/system/service/impl/SysTheadConfigServiceImpl.java new file mode 100644 index 0000000..0676e04 --- /dev/null +++ b/shandan-system/src/main/java/com/keyware/shandan/system/service/impl/SysTheadConfigServiceImpl.java @@ -0,0 +1,78 @@ +package com.keyware.shandan.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.keyware.shandan.common.util.StringUtils; +import com.keyware.shandan.system.entity.SysTheadConfig; +import com.keyware.shandan.system.mapper.SysTheadConfigMapper; +import com.keyware.shandan.system.service.SysTheadConfigService; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * 前端数据表格表头配置数据库操作接口实现类 + * + * @author GuoXin + * @date 2023/8/30 + */ +@Service +public class SysTheadConfigServiceImpl extends ServiceImpl implements SysTheadConfigService { + static final String resourceTableId = "browser_resource_table", fileTableId = "browser_file_table"; + static List defaultConfig = new ArrayList<>(); + + static { + SysTheadConfig.SysTheadConfigBuilder builder = SysTheadConfig.builder(); + // 初始化综合浏览系统资源查询数据表表头默认配置 + defaultConfig.add(builder.tableId(resourceTableId).colName("resourceName").colTitle("资源名称").colSort(1).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(resourceTableId).colName("resourceComment").colTitle("资源注释").colSort(2).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(resourceTableId).colName("directoryPath").colTitle("目录路径").colSort(3).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(resourceTableId).colName("themeTask").colTitle("主题任务").colSort(4).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(resourceTableId).colName("dataSource").colTitle("数据来源").colSort(5).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(resourceTableId).colName("taskTime").colTitle("任务时间").colSort(6).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(resourceTableId).colName("dataType").colTitle("数据类型").colSort(7).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(resourceTableId).colName("secretLevel").colTitle("数据密级").colSort(8).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(resourceTableId).colName("resourceType").colTitle("资源类型").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + // 初始化综合浏览系统文件全文检索数据表表头默认配置 + defaultConfig.add(builder.tableId(fileTableId).colName("fileName").colTitle("文件名称").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("fileType").colTitle("文件类型").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("fileSize").colTitle("文件大小").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("remark").colTitle("文件描述").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("exerciseData").colTitle("是否演训数据").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("entryStaff").colTitle("录入人员").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("equipmentModel").colTitle("装备型号").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("inputDate").colTitle("任务时间").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("source").colTitle("文件来源").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("taskCode").colTitle("任务代号").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("taskNature").colTitle("任务性质").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("troopCode").colTitle("部队代号").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("targetNumber").colTitle("目标/靶标类型").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("missileNumber").colTitle("导弹编号").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("themeTask").colTitle("主题任务").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + defaultConfig.add(builder.tableId(fileTableId).colName("secretLevel").colTitle("文件密级").colSort(9).colWidth("100").isShow(true).isSort(false).build()); + } + + @Override + public List listByCreateUser(String userId) { + if (StringUtils.hasText(userId)) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(SysTheadConfig::getCreateUser, userId); + List list = list(query); + if (list.size() == 0) { + // 为默认数据生成包含用户主键的ID + defaultConfig.forEach(conf -> conf.genId(userId)); + return defaultConfig; + } + return list; + } + return Collections.emptyList(); + } + + @Override + public boolean saveOrUpdateBatch(Collection entityList, int batchSize) { + return super.saveOrUpdateBatch(entityList, batchSize); + } +} diff --git a/shandan-system/src/main/resources/mybatis/mapper/bianmu/DirectoryMapper.xml b/shandan-system/src/main/resources/mybatis/mapper/bianmu/DirectoryMapper.xml index 84290ff..233f71c 100644 --- a/shandan-system/src/main/resources/mybatis/mapper/bianmu/DirectoryMapper.xml +++ b/shandan-system/src/main/resources/mybatis/mapper/bianmu/DirectoryMapper.xml @@ -14,6 +14,7 @@ + diff --git a/shandan-system/src/main/resources/static/css/sys/file/fileView.css b/shandan-system/src/main/resources/static/css/sys/file/fileView.css index f25595e..1ad2dd8 100644 --- a/shandan-system/src/main/resources/static/css/sys/file/fileView.css +++ b/shandan-system/src/main/resources/static/css/sys/file/fileView.css @@ -51,6 +51,8 @@ ul.file-viewer-tab li:hover { } .file-property .field-name{ width: 70px; + text-align: right; + padding-right: 10px; } .file-property .field-value{ flex: 1; diff --git a/shandan-system/src/main/resources/static/js/business/datalabels/managerIndex.js b/shandan-system/src/main/resources/static/js/business/datalabels/managerIndex.js index a97fca5..4afcbe2 100644 --- a/shandan-system/src/main/resources/static/js/business/datalabels/managerIndex.js +++ b/shandan-system/src/main/resources/static/js/business/datalabels/managerIndex.js @@ -289,6 +289,12 @@ layui.use(['layer', 'form', 'gtable', 'globalTree'], function () { +
    +
    + + +
    +
    diff --git a/shandan-system/src/main/resources/static/js/business/directory/dirCommon.js b/shandan-system/src/main/resources/static/js/business/directory/dirCommon.js index 4cea208..1f5bb85 100644 --- a/shandan-system/src/main/resources/static/js/business/directory/dirCommon.js +++ b/shandan-system/src/main/resources/static/js/business/directory/dirCommon.js @@ -117,11 +117,15 @@ function openDirectoryEditLayer(data, callback, view) {
    -
    +
    ${data.createUserName || user.userName}
    +
    + + +
    `, success: function () { @@ -137,12 +141,12 @@ function openDirectoryEditLayer(data, callback, view) { click: dirOwnerChangeCallback }); layui.dict.render(); - if(!data || !data.secretLevel){ + if (!data || !data.secretLevel) { data['secretLevel'] = 0; } layui.dict.setData('dict-secret-level', data) $('div.dict-component').css({'margin-top': '5px', 'width': '380px', 'margin-left': '4px'}) - if(view){ + if (view) { layui.dict.setReadonly(); } // 目录成员管理事件 @@ -166,7 +170,9 @@ function openDirectoryEditLayer(data, callback, view) { applyChildCheckbox(isEdit); }, yes: function (index) { - if(view){return;} + if (view) { + return; + } saveDirectory(index, callback); } }) @@ -174,10 +180,16 @@ function openDirectoryEditLayer(data, callback, view) { function saveDirectory(index, callback) { form.on('submit(directoryEditForm)', function ({elem, field}) { - if(field.secretLevel > user.secretLevel){ - layer.alert('禁止上传超过自身涉密等级的文件,您的涉密等级为【'+ DICT.getText('secret_level', user.secretLevel) +'】', {icon:2}) + if (field.secretLevel > user.secretLevel) { + layer.alert('禁止上传超过自身涉密等级的文件,您的涉密等级为【' + DICT.getText('secret_level', user.secretLevel) + '】', {icon: 2}) return; } + + if (isNaN(parseInt(field.sort))) { + layer.alert('目录顺序只能为数字'); + return; + } + // 转换数据类型 field.basicDir = field.basicDir === '1'; // 如果是基础数据目录,则自动为提交状态 diff --git a/shandan-system/src/main/resources/static/js/sys/file/dirUpload.js b/shandan-system/src/main/resources/static/js/sys/file/dirUpload.js index 183f83d..952ad68 100644 --- a/shandan-system/src/main/resources/static/js/sys/file/dirUpload.js +++ b/shandan-system/src/main/resources/static/js/sys/file/dirUpload.js @@ -131,7 +131,7 @@ layui.use(['layer', 'uploader', 'element', 'form', 'laydate', 'dict', 'datalabel function bindDatetimePlugins() { //日期选择器 laydate.render({ - elem: '#input-data', + elem: 'input[name="inputDate"]', format: "yyyy-MM-dd HH:mm:ss", type: 'datetime', value: new Date(), diff --git a/shandan-system/src/main/resources/static/js/sys/file/view.js b/shandan-system/src/main/resources/static/js/sys/file/view.js index bb8b4b2..7e580a5 100644 --- a/shandan-system/src/main/resources/static/js/sys/file/view.js +++ b/shandan-system/src/main/resources/static/js/sys/file/view.js @@ -9,6 +9,9 @@ layui.use(['layer', 'laytpl', 'dropdown', 'carousel', 'form', 'datalabel'], function () { for (let col in file) { switch (col) { + case 'secretLevel': + $(`label[name="${col}"]`).text(DICT.getText('secret_level', file[col])); + break; case 'taskNature': $(`label[name="${col}"]`).text(DICT.getText('task_nature', file[col])); break; @@ -26,7 +29,10 @@ layui.use(['layer', 'laytpl', 'dropdown', 'carousel', 'form', 'datalabel'], func } } break; - case 'secretLevel': + case 'exerciseData': + $(`label[name="${col}"]`).text(file[col] == 0 ? '否' : '是'); + break; + case '': $(`label[name="${col}"]`).text(DICT.getText('secret_level', file[col])); break; default: diff --git a/shandan-system/src/main/resources/static/js/sys/form/formConfig.js b/shandan-system/src/main/resources/static/js/sys/form/formConfig.js new file mode 100644 index 0000000..9badef6 --- /dev/null +++ b/shandan-system/src/main/resources/static/js/sys/form/formConfig.js @@ -0,0 +1,88 @@ +class FormConfigComponent { + constructor(formType, elemId, lay) { + this.formType = formType; + this.elemId = elemId; + this.lay = lay; + this.dataMap = new Map(); + this.renderTable(); + } + + renderTable() { + const {lay, formType, elemId} = this, {form, gtable} = lay; + gtable.init({ + id: elemId, + url: `${ctx}/sys/form/config/api/list/${formType}`, + method: 'get', + toolbar: '#tableTool', + height: 'full-125', + page: false, + cols: [[ + {field: 'id', hide: true}, + {field: 'fieldName', title: '字段名'}, + {field: 'showTitle', title: '显示的标题', edit: 'text'}, + {field: 'fieldType', title: '字段类型', hide: true}, + {field: 'dictType', title: '数据字典', hide: true}, + {field: 'defaultValue', title: '默认值', edit: 'text', hide: true}, + { + field: 'isRequired', + title: '是否必填', + templet: (data) => renderSwitch('isRequired', data) + }, + { + field: 'isDisabled', + title: '是否禁用', + templet: (data) => renderSwitch('isDisabled', data) + }, + { + field: 'isShow', + title: '是否显示', + templet: (data) => renderSwitch('isShow', data) + }, + {field: 'sort', title: '显示顺序', edit: 'text'} + ]], + done: (res) => this.tableLoadDoneListen(res), + onToolBarTable: ({event, config})=> { + if(event === 'save'){ + const datas = [...this.dataMap.values()]; + Util.post(`/sys/form/config/api/save`, {params: JSON.stringify(datas)}).then(res=>{ + if(res.flag){ + showOkMsg('保存成功') + }else{ + showErrorMsg2('保存失败:'+res.msg) + } + }) + } + } + }); + + gtable.on(`edit(${elemId})`, ({field, value, data}) => { + this.dataMap.get(data.id)[field] = value; + }) + + // 监听switch按钮 + form.on(`switch(${elemId}-switch)`, (data) => this.switchChangeListen(data)); + + function renderSwitch(fieldName, data) { + const id = data.id, value = data[fieldName]; + return `` + } + } + + tableLoadDoneListen(res) { + if (res.flag) { + res.records.map(record => this.dataMap.set(record.id + '', record)); + } + } + + switchChangeListen({elem}) { + const id = $(elem).attr('id'), name = $(elem).attr('name'); + const value = this.dataMap.get(id)[name]; + this.dataMap.get(id)[name] = !value; + } +} + +layui.use(['form', 'gtable', 'dropdown', 'element'], function () { + const metadataForm = new FormConfigComponent(1, 'metadataFormTable', layui); + const fileUploadForm = new FormConfigComponent(2, 'fileUploadFormTable', layui); +}); + diff --git a/shandan-system/src/main/resources/view/business/metadata/details.html b/shandan-system/src/main/resources/view/business/metadata/details.html index e1563ab..41cc5ea 100644 --- a/shandan-system/src/main/resources/view/business/metadata/details.html +++ b/shandan-system/src/main/resources/view/business/metadata/details.html @@ -47,56 +47,40 @@
    - +
    - +
    -
    - -
    - -
    -
    -
    - -
    -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    -
    -
    -
    -
    - +
    +
    -
    -
    -
    -
    - -
    - + + + + + + + + +
    +
    +
    + +
    + +
    +
    diff --git a/shandan-system/src/main/resources/view/sys/file/dirUploadLayer.html b/shandan-system/src/main/resources/view/sys/file/dirUploadLayer.html index e83768e..b871de0 100644 --- a/shandan-system/src/main/resources/view/sys/file/dirUploadLayer.html +++ b/shandan-system/src/main/resources/view/sys/file/dirUploadLayer.html @@ -8,32 +8,10 @@ @@ -60,125 +37,73 @@
    -
    -
    -
    - -
    -
    -
    -
    -
    - -
    - - -
    -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    +
    +
    + + +
    + + + + + + + + +
    -
    -
    - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - -
    - -
    +
    + +
    +
    -
    - -
    - +
    + +
    +
    -
    - -
    -
    -
    - -
    -