Browse Source

提交版本

李云瑞 1 năm trước cách đây
mục cha
commit
79af98f4f2
60 tập tin đã thay đổi với 6907 bổ sung0 xóa
  1. 657 0
      db/jeecgboot-mysql-5.7.sql
  2. BIN
      db/其他数据库/jeecgboot-oracle11g.dmp
  3. 950 0
      db/其他数据库/jeecgboot-oracle11g.sql
  4. 2362 0
      db/其他数据库/jeecgboot-sqlserver2019.sql
  5. 544 0
      jeecg-boot-base-core/src/main/java/org/jeecg/common/es/JeecgElasticsearchTemplate.java
  6. 23 0
      jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBoot401Exception.java
  7. 23 0
      jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java
  8. 136 0
      jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java
  9. 203 0
      jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java
  10. 68 0
      jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/entity/JeecgEntity.java
  11. 106 0
      jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java
  12. 119 0
      jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgBaseConfig.java
  13. 23 0
      jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgCloudCondition.java
  14. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/common/es/JeecgElasticsearchTemplate.class
  15. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/common/exception/JeecgBoot401Exception.class
  16. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/common/exception/JeecgBootException.class
  17. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/common/exception/JeecgBootExceptionHandler.class
  18. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/common/system/base/controller/JeecgController.class
  19. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/common/system/base/entity/JeecgEntity.class
  20. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/common/system/util/JeecgDataAutorUtils.class
  21. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/config/JeecgBaseConfig.class
  22. BIN
      jeecg-boot-base-core/target/classes/org/jeecg/config/JeecgCloudCondition.class
  23. 471 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java
  24. 47 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.java
  25. 256 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.java
  26. 86 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java
  27. 54 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java
  28. 52 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderMain.java
  29. 57 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java
  30. 34 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java
  31. 40 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml
  32. 5 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml
  33. 116 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java
  34. 28 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDynamicDataServiceImpl.java
  35. 30 0
      jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.java
  36. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/controller/JeecgDemoController.class
  37. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.class
  38. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.class
  39. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.class
  40. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/entity/JeecgDemo.class
  41. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.class
  42. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/entity/JeecgOrderMain.class
  43. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.class
  44. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.class
  45. 40 0
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml
  46. 5 0
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml
  47. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.class
  48. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/service/impl/JeecgDynamicDataServiceImpl.class
  49. BIN
      jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.class
  50. 18 0
      jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneGUI.java
  51. 81 0
      jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneToMainUtil.java
  52. 27 0
      jeecg-module-system/jeecg-system-start/target/classes/jeecg/jeecg_database.properties
  53. BIN
      jeecg-module-system/jeecg-system-start/target/classes/org/jeecg/codegenerate/JeecgOneGUI.class
  54. BIN
      jeecg-module-system/jeecg-system-start/target/classes/org/jeecg/codegenerate/JeecgOneToMainUtil.class
  55. 57 0
      jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/JeecgGatewayApplication.java
  56. 47 0
      jeecg-server-cloud/jeecg-cloud-nacos/src/main/java/com/alibaba/nacos/JeecgNacosApplication.java
  57. 35 0
      jeecg-server-cloud/jeecg-demo-cloud-start/src/main/java/org/jeecg/JeecgDemoCloudApplication.java
  58. 27 0
      jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/jeecg/jeecg_database.properties
  59. 18 0
      jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/java/org/jeecg/monitor/JeecgMonitorApplication.java
  60. 62 0
      jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/controller/JeecgMqTestController.java

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 657 - 0
db/jeecgboot-mysql-5.7.sql


BIN
db/其他数据库/jeecgboot-oracle11g.dmp


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 950 - 0
db/其他数据库/jeecgboot-oracle11g.sql


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 2362 - 0
db/其他数据库/jeecgboot-sqlserver2019.sql


+ 544 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/es/JeecgElasticsearchTemplate.java

@@ -0,0 +1,544 @@
+package org.jeecg.common.es;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.jeecg.common.util.RestUtil;
+import org.jeecg.common.util.oConvertUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * 关于 ElasticSearch 的一些方法(创建索引、添加数据、查询等)
+ *
+ * @author sunjianlei
+ */
+@Slf4j
+@Component
+public class JeecgElasticsearchTemplate {
+    /** es服务地址 */
+    private String baseUrl;
+    private final String FORMAT_JSON = "format=json";
+    /** Elasticsearch 的版本号 */
+    private String version = null;
+
+    /**ElasticSearch 最大可返回条目数*/
+    public static final int ES_MAX_SIZE = 10000;
+
+    /**es7*/
+    public static final String IE_SEVEN = "7";
+
+    /**url not found 404*/
+    public static final String URL_NOT_FOUND = "404 Not Found";
+
+    public JeecgElasticsearchTemplate(@Value("${jeecg.elasticsearch.cluster-nodes}") String baseUrl, @Value("${jeecg.elasticsearch.check-enabled}") boolean checkEnabled) {
+        log.debug("JeecgElasticsearchTemplate BaseURL:" + baseUrl);
+        if (StringUtils.isNotEmpty(baseUrl)) {
+            this.baseUrl = baseUrl;
+            // 验证配置的ES地址是否有效
+            if (checkEnabled) {
+                try {
+                    this.getElasticsearchVersion();
+                    log.info("ElasticSearch 服务连接成功");
+                    log.info("ElasticSearch version: " + this.version);
+                } catch (Exception e) {
+                    this.version = "";
+                    log.warn("ElasticSearch 服务连接失败,原因:配置未通过。可能是BaseURL未配置或配置有误,也可能是Elasticsearch服务未启动。接下来将会拒绝执行任何方法!");
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取 Elasticsearch 的版本号信息,失败返回null
+     */
+    private void getElasticsearchVersion() {
+        if (this.version == null) {
+            String url = this.getBaseUrl().toString();
+            JSONObject result = RestUtil.get(url);
+            if (result != null) {
+                JSONObject v = result.getJSONObject("version");
+                this.version = v.getString("number");
+            }
+        }
+    }
+
+    public StringBuilder getBaseUrl(String indexName, String typeName) {
+        typeName = typeName.trim().toLowerCase();
+        return this.getBaseUrl(indexName).append("/").append(typeName);
+    }
+
+    public StringBuilder getBaseUrl(String indexName) {
+        indexName = indexName.trim().toLowerCase();
+        return this.getBaseUrl().append("/").append(indexName);
+    }
+
+    public StringBuilder getBaseUrl() {
+        return new StringBuilder("http://").append(this.baseUrl);
+    }
+
+    /**
+     * cat 查询ElasticSearch系统数据,返回json
+     */
+    private <T> ResponseEntity<T> cat(String urlAfter, Class<T> responseType) {
+        String url = this.getBaseUrl().append("/_cat").append(urlAfter).append("?").append(FORMAT_JSON).toString();
+        return RestUtil.request(url, HttpMethod.GET, null, null, null, responseType);
+    }
+
+    /**
+     * 查询所有索引
+     * <p>
+     * 查询地址:GET http://{baseUrl}/_cat/indices
+     */
+    public JSONArray getIndices() {
+        return getIndices(null);
+    }
+
+
+    /**
+     * 查询单个索引
+     * <p>
+     * 查询地址:GET http://{baseUrl}/_cat/indices/{indexName}
+     */
+    public JSONArray getIndices(String indexName) {
+        StringBuilder urlAfter = new StringBuilder("/indices");
+        if (!StringUtils.isEmpty(indexName)) {
+            urlAfter.append("/").append(indexName.trim().toLowerCase());
+        }
+        return cat(urlAfter.toString(), JSONArray.class).getBody();
+    }
+
+    /**
+     * 索引是否存在
+     */
+    public boolean indexExists(String indexName) {
+        try {
+            JSONArray array = getIndices(indexName);
+            return array != null;
+        } catch (org.springframework.web.client.HttpClientErrorException ex) {
+            if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {
+                return false;
+            } else {
+                throw ex;
+            }
+        }
+    }
+
+    /**
+     * 根据ID获取索引数据,未查询到返回null
+     * <p>
+     * 查询地址:GET http://{baseUrl}/{indexName}/{typeName}/{dataId}
+     *
+     * @param indexName 索引名称
+     * @param typeName  type,一个任意字符串,用于分类
+     * @param dataId    数据id
+     * @return
+     */
+    public JSONObject getDataById(String indexName, String typeName, String dataId) {
+        String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString();
+        log.info("url:" + url);
+        JSONObject result = RestUtil.get(url);
+        boolean found = result.getBoolean("found");
+        if (found) {
+            return result.getJSONObject("_source");
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 创建索引
+     * <p>
+     * 查询地址:PUT http://{baseUrl}/{indexName}
+     */
+    public boolean createIndex(String indexName) {
+        String url = this.getBaseUrl(indexName).toString();
+
+        /* 返回结果 (仅供参考)
+        "createIndex": {
+            "shards_acknowledged": true,
+            "acknowledged": true,
+            "index": "hello_world"
+        }
+        */
+        try {
+            return RestUtil.put(url).getBoolean("acknowledged");
+        } catch (org.springframework.web.client.HttpClientErrorException ex) {
+            if (HttpStatus.BAD_REQUEST == ex.getStatusCode()) {
+                log.warn("索引创建失败:" + indexName + " 已存在,无需再创建");
+            } else {
+                ex.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 删除索引
+     * <p>
+     * 查询地址:DELETE http://{baseUrl}/{indexName}
+     */
+    public boolean removeIndex(String indexName) {
+        String url = this.getBaseUrl(indexName).toString();
+        try {
+            return RestUtil.delete(url).getBoolean("acknowledged");
+        } catch (org.springframework.web.client.HttpClientErrorException ex) {
+            if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {
+                log.warn("索引删除失败:" + indexName + " 不存在,无需删除");
+            } else {
+                ex.printStackTrace();
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 获取索引字段映射(可获取字段类型)
+     * <p>
+     *
+     * @param indexName 索引名称
+     * @param typeName  分类名称
+     * @return
+     */
+    public JSONObject getIndexMapping(String indexName, String typeName) {
+        String url = this.getBaseUrl(indexName, typeName).append("/_mapping?").append(FORMAT_JSON).toString();
+        // 针对 es 7.x 版本做兼容
+        this.getElasticsearchVersion();
+        if (oConvertUtils.isNotEmpty(this.version) && this.version.startsWith(IE_SEVEN)) {
+            url += "&include_type_name=true";
+        }
+        log.info("getIndexMapping-url:" + url);
+        /*
+         * 参考返回JSON结构:
+         *
+         *{
+         *    // 索引名称
+         *    "[indexName]": {
+         *        "mappings": {
+         *            // 分类名称
+         *            "[typeName]": {
+         *                "properties": {
+         *                    // 字段名
+         *                    "input_number": {
+         *                        // 字段类型
+         *                        "type": "long"
+         *                    },
+         *                    "input_string": {
+         *                        "type": "text",
+         *                        "fields": {
+         *                            "keyword": {
+         *                                "type": "keyword",
+         *                                "ignore_above": 256
+         *                            }
+         *                        }
+         *                    }
+         *                 }
+         *            }
+         *        }
+         *    }
+         * }
+         */
+        try {
+            return RestUtil.get(url);
+        } catch (org.springframework.web.client.HttpClientErrorException e) {
+            String message = e.getMessage();
+            if (message != null && message.contains(URL_NOT_FOUND)) {
+                return null;
+            }
+            throw e;
+        }
+    }
+
+    /**
+     * 获取索引字段映射,返回Java实体类
+     *
+     * @param indexName
+     * @param typeName
+     * @return
+     */
+    public <T> Map<String, T> getIndexMappingFormat(String indexName, String typeName, Class<T> clazz) {
+        JSONObject mapping = this.getIndexMapping(indexName, typeName);
+        Map<String, T> map = new HashMap<>(5);
+        if (mapping == null) {
+            return map;
+        }
+        // 获取字段属性
+        JSONObject properties = mapping.getJSONObject(indexName)
+                .getJSONObject("mappings")
+                .getJSONObject(typeName)
+                .getJSONObject("properties");
+        // 封装成 java类型
+        for (String key : properties.keySet()) {
+            T entity = properties.getJSONObject(key).toJavaObject(clazz);
+            map.put(key, entity);
+        }
+        return map;
+    }
+
+    /**
+     * 保存数据,详见:saveOrUpdate
+     */
+    public boolean save(String indexName, String typeName, String dataId, JSONObject data) {
+        return this.saveOrUpdate(indexName, typeName, dataId, data);
+    }
+
+    /**
+     * 更新数据,详见:saveOrUpdate
+     */
+    public boolean update(String indexName, String typeName, String dataId, JSONObject data) {
+        return this.saveOrUpdate(indexName, typeName, dataId, data);
+    }
+
+    /**
+     * 保存或修改索引数据
+     * <p>
+     * 查询地址:PUT http://{baseUrl}/{indexName}/{typeName}/{dataId}
+     *
+     * @param indexName 索引名称
+     * @param typeName  type,一个任意字符串,用于分类
+     * @param dataId    数据id
+     * @param data      要存储的数据
+     * @return
+     */
+    public boolean saveOrUpdate(String indexName, String typeName, String dataId, JSONObject data) {
+        String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).append("?refresh=wait_for").toString();
+        /* 返回结果(仅供参考)
+       "createIndexA2": {
+            "result": "created",
+            "_shards": {
+                "total": 2,
+                "successful": 1,
+                "failed": 0
+            },
+            "_seq_no": 0,
+            "_index": "test_index_1",
+            "_type": "test_type_1",
+            "_id": "a2",
+            "_version": 1,
+            "_primary_term": 1
+        }
+         */
+
+        try {
+            // 去掉 data 中为空的值
+            Set<String> keys = data.keySet();
+            List<String> emptyKeys = new ArrayList<>(keys.size());
+            for (String key : keys) {
+                String value = data.getString(key);
+                //1、剔除空值
+                if (oConvertUtils.isEmpty(value) || "[]".equals(value)) {
+                    emptyKeys.add(key);
+                }
+                //2、剔除上传控件值(会导致ES同步失败,报异常failed to parse field [ge_pic] of type [text] )
+                if (oConvertUtils.isNotEmpty(value) && value.indexOf("[{")!=-1) {
+                    emptyKeys.add(key);
+                    log.info("-------剔除上传控件字段------------key: "+ key);
+                }
+            }
+            for (String key : emptyKeys) {
+                data.remove(key);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        try {
+            String result = RestUtil.put(url, data).getString("result");
+            return "created".equals(result) || "updated".equals(result);
+        } catch (Exception e) {
+            log.error(e.getMessage() + "\n-- url: " + url + "\n-- data: " + data.toJSONString());
+            //TODO 打印接口返回异常json
+            return false;
+        }
+    }
+
+    /**
+     * 批量保存数据
+     *
+     * @param indexName 索引名称
+     * @param typeName  type,一个任意字符串,用于分类
+     * @param dataList  要存储的数据数组,每行数据必须包含id
+     * @return
+     */
+    public boolean saveBatch(String indexName, String typeName, JSONArray dataList) {
+        String url = this.getBaseUrl().append("/_bulk").append("?refresh=wait_for").toString();
+        StringBuilder bodySb = new StringBuilder();
+        for (int i = 0; i < dataList.size(); i++) {
+            JSONObject data = dataList.getJSONObject(i);
+            String id = data.getString("id");
+            // 该行的操作
+            // {"create": {"_id":"${id}", "_index": "${indexName}", "_type": "${typeName}"}}
+            JSONObject action = new JSONObject();
+            JSONObject actionInfo = new JSONObject();
+            actionInfo.put("_id", id);
+            actionInfo.put("_index", indexName);
+            actionInfo.put("_type", typeName);
+            action.put("create", actionInfo);
+            bodySb.append(action.toJSONString()).append("\n");
+            // 该行的数据
+            data.remove("id");
+            bodySb.append(data.toJSONString()).append("\n");
+        }
+        System.out.println("+-+-+-: bodySb.toString(): " + bodySb.toString());
+        HttpHeaders headers = RestUtil.getHeaderApplicationJson();
+        RestUtil.request(url, HttpMethod.PUT, headers, null, bodySb, JSONObject.class);
+        return true;
+    }
+
+    /**
+     * 删除索引数据
+     * <p>
+     * 请求地址:DELETE http://{baseUrl}/{indexName}/{typeName}/{dataId}
+     */
+    public boolean delete(String indexName, String typeName, String dataId) {
+        String url = this.getBaseUrl(indexName, typeName).append("/").append(dataId).toString();
+        /* 返回结果(仅供参考)
+        {
+            "_index": "es_demo",
+            "_type": "docs",
+            "_id": "001",
+            "_version": 3,
+            "result": "deleted",
+            "_shards": {
+                "total": 1,
+                "successful": 1,
+                "failed": 0
+            },
+            "_seq_no": 28,
+            "_primary_term": 18
+        }
+        */
+        try {
+            return "deleted".equals(RestUtil.delete(url).getString("result"));
+        } catch (org.springframework.web.client.HttpClientErrorException ex) {
+            if (HttpStatus.NOT_FOUND == ex.getStatusCode()) {
+                return false;
+            } else {
+                throw ex;
+            }
+        }
+    }
+
+
+    /* = = = 以下关于查询和查询条件的方法 = = =*/
+
+    /**
+     * 查询数据
+     * <p>
+     * 请求地址:POST http://{baseUrl}/{indexName}/{typeName}/_search
+     */
+    public JSONObject search(String indexName, String typeName, JSONObject queryObject) {
+        String url = this.getBaseUrl(indexName, typeName).append("/_search").toString();
+
+        log.info("url:" + url + " ,search: " + queryObject.toJSONString());
+        JSONObject res = RestUtil.post(url, queryObject);
+        log.info("url:" + url + " ,return res: \n" + res.toJSONString());
+        return res;
+    }
+
+    /**
+     * @param source (源滤波器)指定返回的字段,传null返回所有字段
+     * @param query
+     * @param from    从第几条数据开始
+     * @param size    返回条目数
+     * @return { "query": query }
+     */
+    public JSONObject buildQuery(List<String> source, JSONObject query, int from, int size) {
+        JSONObject json = new JSONObject();
+        if (source != null) {
+            json.put("_source", source);
+        }
+        json.put("query", query);
+        json.put("from", from);
+        json.put("size", size);
+        return json;
+    }
+
+    /**
+     * @return { "bool" : { "must": must, "must_not": mustNot, "should": should } }
+     */
+    public JSONObject buildBoolQuery(JSONArray must, JSONArray mustNot, JSONArray should) {
+        JSONObject bool = new JSONObject();
+        if (must != null) {
+            bool.put("must", must);
+        }
+        if (mustNot != null) {
+            bool.put("must_not", mustNot);
+        }
+        if (should != null) {
+            bool.put("should", should);
+        }
+        JSONObject json = new JSONObject();
+        json.put("bool", bool);
+        return json;
+    }
+
+    /**
+     * @param field 要查询的字段
+     * @param args  查询参数,参考: *哈哈* OR *哒* NOT *呵* OR *啊*
+     * @return
+     */
+    public JSONObject buildQueryString(String field, String... args) {
+        if (field == null) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder(field).append(":(");
+        if (args != null) {
+            for (String arg : args) {
+                sb.append(arg).append(" ");
+            }
+        }
+        sb.append(")");
+        return this.buildQueryString(sb.toString());
+    }
+
+    /**
+     * @return { "query_string": { "query": query }  }
+     */
+    public JSONObject buildQueryString(String query) {
+        JSONObject queryString = new JSONObject();
+        queryString.put("query", query);
+        JSONObject json = new JSONObject();
+        json.put("query_string", queryString);
+        return json;
+    }
+
+    /**
+     * @param field      查询字段
+     * @param min        最小值
+     * @param max        最大值
+     * @param containMin 范围内是否包含最小值
+     * @param containMax 范围内是否包含最大值
+     * @return { "range" : { field : { 『 "gt『e』?containMin" : min 』?min!=null , 『 "lt『e』?containMax" : max 』}} }
+     */
+    public JSONObject buildRangeQuery(String field, Object min, Object max, boolean containMin, boolean containMax) {
+        JSONObject inner = new JSONObject();
+        if (min != null) {
+            if (containMin) {
+                inner.put("gte", min);
+            } else {
+                inner.put("gt", min);
+            }
+        }
+        if (max != null) {
+            if (containMax) {
+                inner.put("lte", max);
+            } else {
+                inner.put("lt", max);
+            }
+        }
+        JSONObject range = new JSONObject();
+        range.put(field, inner);
+        JSONObject json = new JSONObject();
+        json.put("range", range);
+        return json;
+    }
+
+}
+

+ 23 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBoot401Exception.java

@@ -0,0 +1,23 @@
+package org.jeecg.common.exception;
+
+/**
+ * @Description: jeecg-boot自定义401异常
+ * @author: jeecg-boot
+ */
+public class JeecgBoot401Exception extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+
+	public JeecgBoot401Exception(String message){
+		super(message);
+	}
+
+	public JeecgBoot401Exception(Throwable cause)
+	{
+		super(cause);
+	}
+
+	public JeecgBoot401Exception(String message, Throwable cause)
+	{
+		super(message,cause);
+	}
+}

+ 23 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootException.java

@@ -0,0 +1,23 @@
+package org.jeecg.common.exception;
+
+/**
+ * @Description: jeecg-boot自定义异常
+ * @author: jeecg-boot
+ */
+public class JeecgBootException extends RuntimeException {
+	private static final long serialVersionUID = 1L;
+
+	public JeecgBootException(String message){
+		super(message);
+	}
+	
+	public JeecgBootException(Throwable cause)
+	{
+		super(cause);
+	}
+	
+	public JeecgBootException(String message,Throwable cause)
+	{
+		super(message,cause);
+	}
+}

+ 136 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/exception/JeecgBootExceptionHandler.java

@@ -0,0 +1,136 @@
+package org.jeecg.common.exception;
+
+import cn.hutool.core.util.ObjectUtil;
+import org.apache.shiro.authz.AuthorizationException;
+import org.apache.shiro.authz.UnauthorizedException;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.enums.SentinelErrorInfoEnum;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.dao.DuplicateKeyException;
+import org.springframework.data.redis.connection.PoolException;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.multipart.MaxUploadSizeExceededException;
+import org.springframework.web.servlet.NoHandlerFoundException;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 异常处理器
+ * 
+ * @Author scott
+ * @Date 2019
+ */
+@RestControllerAdvice
+@Slf4j
+public class JeecgBootExceptionHandler {
+
+	/**
+	 * 处理自定义异常
+	 */
+	@ExceptionHandler(JeecgBootException.class)
+	public Result<?> handleJeecgBootException(JeecgBootException e){
+		log.error(e.getMessage(), e);
+		return Result.error(e.getMessage());
+	}
+
+	/**
+	 * 处理自定义微服务异常
+	 */
+	@ExceptionHandler(JeecgCloudException.class)
+	public Result<?> handleJeecgCloudException(JeecgCloudException e){
+		log.error(e.getMessage(), e);
+		return Result.error(e.getMessage());
+	}
+
+	/**
+	 * 处理自定义异常
+	 */
+	@ExceptionHandler(JeecgBoot401Exception.class)
+	@ResponseStatus(HttpStatus.UNAUTHORIZED)
+	public Result<?> handleJeecgBoot401Exception(JeecgBoot401Exception e){
+		log.error(e.getMessage(), e);
+		return new Result(401,e.getMessage());
+	}
+
+	@ExceptionHandler(NoHandlerFoundException.class)
+	public Result<?> handlerNoFoundException(Exception e) {
+		log.error(e.getMessage(), e);
+		return Result.error(404, "路径不存在,请检查路径是否正确");
+	}
+
+	@ExceptionHandler(DuplicateKeyException.class)
+	public Result<?> handleDuplicateKeyException(DuplicateKeyException e){
+		log.error(e.getMessage(), e);
+		return Result.error("数据库中已存在该记录");
+	}
+
+	@ExceptionHandler({UnauthorizedException.class, AuthorizationException.class})
+	public Result<?> handleAuthorizationException(AuthorizationException e){
+		log.error(e.getMessage(), e);
+		return Result.noauth("没有权限,请联系管理员授权");
+	}
+
+	@ExceptionHandler(Exception.class)
+	public Result<?> handleException(Exception e){
+		log.error(e.getMessage(), e);
+		//update-begin---author:zyf ---date:20220411  for:处理Sentinel限流自定义异常
+		Throwable throwable = e.getCause();
+		SentinelErrorInfoEnum errorInfoEnum = SentinelErrorInfoEnum.getErrorByException(throwable);
+		if (ObjectUtil.isNotEmpty(errorInfoEnum)) {
+			return Result.error(errorInfoEnum.getError());
+		}
+		//update-end---author:zyf ---date:20220411  for:处理Sentinel限流自定义异常
+		return Result.error("操作失败,"+e.getMessage());
+	}
+	
+	/**
+	 * @Author 政辉
+	 * @param e
+	 * @return
+	 */
+	@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+	public Result<?> httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e){
+		StringBuffer sb = new StringBuffer();
+		sb.append("不支持");
+		sb.append(e.getMethod());
+		sb.append("请求方法,");
+		sb.append("支持以下");
+		String [] methods = e.getSupportedMethods();
+		if(methods!=null){
+			for(String str:methods){
+				sb.append(str);
+				sb.append("、");
+			}
+		}
+		log.error(sb.toString(), e);
+		//return Result.error("没有权限,请联系管理员授权");
+		return Result.error(405,sb.toString());
+	}
+	
+	 /** 
+	  * spring默认上传大小100MB 超出大小捕获异常MaxUploadSizeExceededException 
+	  */
+    @ExceptionHandler(MaxUploadSizeExceededException.class)
+    public Result<?> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
+    	log.error(e.getMessage(), e);
+        return Result.error("文件大小超出10MB限制, 请压缩或降低文件质量! ");
+    }
+
+    @ExceptionHandler(DataIntegrityViolationException.class)
+    public Result<?> handleDataIntegrityViolationException(DataIntegrityViolationException e) {
+    	log.error(e.getMessage(), e);
+    	//【issues/3624】数据库执行异常handleDataIntegrityViolationException提示有误 #3624
+        return Result.error("执行数据库异常,违反了完整性例如:违反惟一约束、违反非空限制、字段内容超出长度等");
+    }
+
+    @ExceptionHandler(PoolException.class)
+    public Result<?> handlePoolException(PoolException e) {
+    	log.error(e.getMessage(), e);
+        return Result.error("Redis 连接异常!");
+    }
+
+}

+ 203 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/controller/JeecgController.java

@@ -0,0 +1,203 @@
+package org.jeecg.common.system.base.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecgframework.poi.excel.ExcelImportUtil;
+import org.jeecgframework.poi.excel.def.NormalExcelConstants;
+import org.jeecgframework.poi.excel.entity.ExportParams;
+import org.jeecgframework.poi.excel.entity.ImportParams;
+import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
+import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartHttpServletRequest;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description: Controller基类
+ * @Author: dangzhenghui@163.com
+ * @Date: 2019-4-21 8:13
+ * @Version: 1.0
+ */
+@Slf4j
+public class JeecgController<T, S extends IService<T>> {
+    /**issues/2933 JeecgController注入service时改用protected修饰,能避免重复引用service*/
+    @Autowired
+    protected S service;
+
+    @Value("${jeecg.path.upload}")
+    private String upLoadPath;
+    /**
+     * 导出excel
+     *
+     * @param request
+     */
+    protected ModelAndView exportXls(HttpServletRequest request, T object, Class<T> clazz, String title) {
+        // Step.1 组装查询条件
+        QueryWrapper<T> queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+
+        // 过滤选中数据
+        String selections = request.getParameter("selections");
+        if (oConvertUtils.isNotEmpty(selections)) {
+            List<String> selectionList = Arrays.asList(selections.split(","));
+            queryWrapper.in("id",selectionList);
+        }
+        // Step.2 获取导出数据
+        List<T> exportList = service.list(queryWrapper);
+
+        // Step.3 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        //此处设置的filename无效 ,前端会重更新设置一下
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.CLASS, clazz);
+        //update-begin--Author:liusq  Date:20210126 for:图片导出报错,ImageBasePath未设置--------------------
+        ExportParams  exportParams=new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title);
+        exportParams.setImageBasePath(upLoadPath);
+        //update-end--Author:liusq  Date:20210126 for:图片导出报错,ImageBasePath未设置----------------------
+        mv.addObject(NormalExcelConstants.PARAMS,exportParams);
+        mv.addObject(NormalExcelConstants.DATA_LIST, exportList);
+        return mv;
+    }
+    /**
+     * 根据每页sheet数量导出多sheet
+     *
+     * @param request
+     * @param object 实体类
+     * @param clazz 实体类class
+     * @param title 标题
+     * @param exportFields 导出字段自定义
+     * @param pageNum 每个sheet的数据条数
+     * @param request
+     */
+    protected ModelAndView exportXlsSheet(HttpServletRequest request, T object, Class<T> clazz, String title,String exportFields,Integer pageNum) {
+        // Step.1 组装查询条件
+        QueryWrapper<T> queryWrapper = QueryGenerator.initQueryWrapper(object, request.getParameterMap());
+        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        // Step.2 计算分页sheet数据
+        double total = service.count();
+        int count = (int)Math.ceil(total/pageNum);
+        //update-begin-author:liusq---date:20220629--for: 多sheet导出根据选择导出写法调整 ---
+        // Step.3  过滤选中数据
+        String selections = request.getParameter("selections");
+        if (oConvertUtils.isNotEmpty(selections)) {
+            List<String> selectionList = Arrays.asList(selections.split(","));
+            queryWrapper.in("id",selectionList);
+        }
+        //update-end-author:liusq---date:20220629--for: 多sheet导出根据选择导出写法调整 ---
+        // Step.4 多sheet处理
+        List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
+        for (int i = 1; i <=count ; i++) {
+            Page<T> page = new Page<T>(i, pageNum);
+            IPage<T> pageList = service.page(page, queryWrapper);
+            List<T> exportList = pageList.getRecords();
+            Map<String, Object> map = new HashMap<>(5);
+            ExportParams  exportParams=new ExportParams(title + "报表", "导出人:" + sysUser.getRealname(), title+i,upLoadPath);
+            exportParams.setType(ExcelType.XSSF);
+            //map.put("title",exportParams);
+            //表格Title
+            map.put(NormalExcelConstants.PARAMS,exportParams);
+            //表格对应实体
+            map.put(NormalExcelConstants.CLASS,clazz);
+            //数据集合
+            map.put(NormalExcelConstants.DATA_LIST, exportList);
+            listMap.add(map);
+        }
+        // Step.4 AutoPoi 导出Excel
+        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
+        //此处设置的filename无效 ,前端会重更新设置一下
+        mv.addObject(NormalExcelConstants.FILE_NAME, title);
+        mv.addObject(NormalExcelConstants.MAP_LIST, listMap);
+        return mv;
+    }
+
+
+    /**
+     * 根据权限导出excel,传入导出字段参数
+     *
+     * @param request
+     */
+    protected ModelAndView exportXls(HttpServletRequest request, T object, Class<T> clazz, String title,String exportFields) {
+        ModelAndView mv = this.exportXls(request,object,clazz,title);
+        mv.addObject(NormalExcelConstants.EXPORT_FIELDS,exportFields);
+        return mv;
+    }
+
+    /**
+     * 获取对象ID
+     *
+     * @return
+     */
+    private String getId(T item) {
+        try {
+            return PropertyUtils.getProperty(item, "id").toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    protected Result<?> importExcel(HttpServletRequest request, HttpServletResponse response, Class<T> clazz) {
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
+            // 获取上传文件对象
+            MultipartFile file = entity.getValue();
+            ImportParams params = new ImportParams();
+            params.setTitleRows(2);
+            params.setHeadRows(1);
+            params.setNeedSave(true);
+            try {
+                List<T> list = ExcelImportUtil.importExcel(file.getInputStream(), clazz, params);
+                //update-begin-author:taoyan date:20190528 for:批量插入数据
+                long start = System.currentTimeMillis();
+                service.saveBatch(list);
+                //400条 saveBatch消耗时间1592毫秒  循环插入消耗时间1947毫秒
+                //1200条  saveBatch消耗时间3687毫秒 循环插入消耗时间5212毫秒
+                log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
+                //update-end-author:taoyan date:20190528 for:批量插入数据
+                return Result.ok("文件导入成功!数据行数:" + list.size());
+            } catch (Exception e) {
+                //update-begin-author:taoyan date:20211124 for: 导入数据重复增加提示
+                String msg = e.getMessage();
+                log.error(msg, e);
+                if(msg!=null && msg.indexOf("Duplicate entry")>=0){
+                    return Result.error("文件导入失败:有重复数据!");
+                }else{
+                    return Result.error("文件导入失败:" + e.getMessage());
+                }
+                //update-end-author:taoyan date:20211124 for: 导入数据重复增加提示
+            } finally {
+                try {
+                    file.getInputStream().close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return Result.error("文件导入失败!");
+    }
+}

+ 68 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/system/base/entity/JeecgEntity.java

@@ -0,0 +1,68 @@
+package org.jeecg.common.system.base.entity;
+
+import java.io.Serializable;
+
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: Entity基类
+ * @Author: dangzhenghui@163.com
+ * @Date: 2019-4-28
+ * @Version: 1.1
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class JeecgEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "ID")
+    private java.lang.String id;
+
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    @Excel(name = "创建人", width = 15)
+    private java.lang.String createBy;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(value = "创建时间")
+    @Excel(name = "创建时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private java.util.Date createTime;
+
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    @Excel(name = "更新人", width = 15)
+    private java.lang.String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(value = "更新时间")
+    @Excel(name = "更新时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private java.util.Date updateTime;
+
+}

+ 106 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/common/system/util/JeecgDataAutorUtils.java

@@ -0,0 +1,106 @@
+package org.jeecg.common.system.util;
+
+import org.jeecg.common.system.vo.SysPermissionDataRuleModel;
+import org.jeecg.common.system.vo.SysUserCacheInfo;
+import org.jeecg.common.util.SpringContextUtils;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName: JeecgDataAutorUtils
+ * @Description: 数据权限查询规则容器工具类
+ * @Author: 张代浩
+ * @Date: 2012-12-15 下午11:27:39
+ * 
+ */
+public class JeecgDataAutorUtils {
+	
+	public static final String MENU_DATA_AUTHOR_RULES = "MENU_DATA_AUTHOR_RULES";
+	
+	public static final String MENU_DATA_AUTHOR_RULE_SQL = "MENU_DATA_AUTHOR_RULE_SQL";
+	
+	public static final String SYS_USER_INFO = "SYS_USER_INFO";
+
+	/**
+	 * 往链接请求里面,传入数据查询条件
+	 * 
+	 * @param request
+	 * @param dataRules
+	 */
+	public static synchronized void installDataSearchConditon(HttpServletRequest request, List<SysPermissionDataRuleModel> dataRules) {
+		@SuppressWarnings("unchecked")
+        // 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST
+		List<SysPermissionDataRuleModel> list = (List<SysPermissionDataRuleModel>)loadDataSearchConditon();
+		if (list==null) {
+			// 2.如果不存在,则new一个list
+			list = new ArrayList<SysPermissionDataRuleModel>();
+		}
+		for (SysPermissionDataRuleModel tsDataRule : dataRules) {
+			list.add(tsDataRule);
+		}
+        // 3.往list里面增量存指
+		request.setAttribute(MENU_DATA_AUTHOR_RULES, list);
+	}
+
+	/**
+	 * 获取请求对应的数据权限规则
+	 * 
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public static synchronized List<SysPermissionDataRuleModel> loadDataSearchConditon() {
+		return (List<SysPermissionDataRuleModel>) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULES);
+				
+	}
+
+	/**
+	 * 获取请求对应的数据权限SQL
+	 * 
+	 * @return
+	 */
+	public static synchronized String loadDataSearchConditonSqlString() {
+		return (String) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULE_SQL);
+	}
+
+	/**
+	 * 往链接请求里面,传入数据查询条件
+	 * 
+	 * @param request
+	 * @param sql
+	 */
+	public static synchronized void installDataSearchConditon(HttpServletRequest request, String sql) {
+		String ruleSql = (String) loadDataSearchConditonSqlString();
+		if (!StringUtils.hasText(ruleSql)) {
+			request.setAttribute(MENU_DATA_AUTHOR_RULE_SQL,sql);
+		}
+	}
+
+	/**
+	 * 将用户信息存到request
+	 * @param request
+	 * @param userinfo
+	 */
+	public static synchronized void installUserInfo(HttpServletRequest request, SysUserCacheInfo userinfo) {
+		request.setAttribute(SYS_USER_INFO, userinfo);
+	}
+
+	/**
+	 * 将用户信息存到request
+	 * @param userinfo
+	 */
+	public static synchronized void installUserInfo(SysUserCacheInfo userinfo) {
+		SpringContextUtils.getHttpServletRequest().setAttribute(SYS_USER_INFO, userinfo);
+	}
+
+	/**
+	 * 从request获取用户信息
+	 * @return
+	 */
+	public static synchronized SysUserCacheInfo loadUserInfo() {
+		return (SysUserCacheInfo) SpringContextUtils.getHttpServletRequest().getAttribute(SYS_USER_INFO);
+				
+	}
+}

+ 119 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgBaseConfig.java

@@ -0,0 +1,119 @@
+package org.jeecg.config;
+
+import org.jeecg.config.vo.DomainUrl;
+import org.jeecg.config.vo.Path;
+import org.jeecg.config.vo.Shiro;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 加载项目配置
+ * @author: jeecg-boot
+ */
+@Component("jeecgBaseConfig")
+@ConfigurationProperties(prefix = "jeecg")
+public class JeecgBaseConfig {
+    /**
+     * 签名密钥串(字典等敏感接口)
+     * @TODO 降低使用成本加的默认值,实际以 yml配置 为准
+     */
+    private String signatureSecret = "dd05f1c54d63749eda95f9fa6d49v442a";
+    /**
+     * 需要加强校验的接口清单
+     */
+    private String signUrls;
+    /**
+     * 上传模式  
+     * 本地:local\Minio:minio\阿里云:alioss
+     */
+    private String uploadType;
+    /**
+     * 是否启用安全模式
+     */
+    private Boolean safeMode = false;
+    /**
+     * shiro拦截排除
+     */
+    private Shiro shiro;
+    /**
+     * 上传文件配置
+     */
+    private Path path;
+
+    /**
+     * 前端页面访问地址
+     * pc: http://localhost:3100
+     * app: http://localhost:8051
+     */
+    private DomainUrl domainUrl;
+
+    /**
+     * 文件预览
+     */
+    private String fileViewDomain;
+
+    public Boolean getSafeMode() {
+        return safeMode;
+    }
+
+    public void setSafeMode(Boolean safeMode) {
+        this.safeMode = safeMode;
+    }
+
+    public String getSignatureSecret() {
+        return signatureSecret;
+    }
+
+    public void setSignatureSecret(String signatureSecret) {
+        this.signatureSecret = signatureSecret;
+    }
+
+    public Shiro getShiro() {
+        return shiro;
+    }
+
+    public void setShiro(Shiro shiro) {
+        this.shiro = shiro;
+    }
+
+    public Path getPath() {
+        return path;
+    }
+
+    public void setPath(Path path) {
+        this.path = path;
+    }
+
+    public DomainUrl getDomainUrl() {
+        return domainUrl;
+    }
+
+    public void setDomainUrl(DomainUrl domainUrl) {
+        this.domainUrl = domainUrl;
+    }
+    public String getSignUrls() {
+        return signUrls;
+    }
+
+    public void setSignUrls(String signUrls) {
+        this.signUrls = signUrls;
+    }
+
+
+    public String getFileViewDomain() {
+        return fileViewDomain;
+    }
+
+    public void setFileViewDomain(String fileViewDomain) {
+        this.fileViewDomain = fileViewDomain;
+    }
+
+    public String getUploadType() {
+        return uploadType;
+    }
+
+    public void setUploadType(String uploadType) {
+        this.uploadType = uploadType;
+    }
+}

+ 23 - 0
jeecg-boot-base-core/src/main/java/org/jeecg/config/JeecgCloudCondition.java

@@ -0,0 +1,23 @@
+package org.jeecg.config;
+
+import org.jeecg.common.constant.CommonConstant;
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+/**
+ * 微服务环境加载条件
+ * @author: jeecg-boot
+ */
+public class JeecgCloudCondition implements Condition {
+
+    @Override
+    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+        Object object = context.getEnvironment().getProperty(CommonConstant.CLOUD_SERVER_KEY);
+        //如果没有服务注册发现的配置 说明是单体应用
+        if(object==null){
+            return false;
+        }
+        return true;
+    }
+}

BIN
jeecg-boot-base-core/target/classes/org/jeecg/common/es/JeecgElasticsearchTemplate.class


BIN
jeecg-boot-base-core/target/classes/org/jeecg/common/exception/JeecgBoot401Exception.class


BIN
jeecg-boot-base-core/target/classes/org/jeecg/common/exception/JeecgBootException.class


BIN
jeecg-boot-base-core/target/classes/org/jeecg/common/exception/JeecgBootExceptionHandler.class


BIN
jeecg-boot-base-core/target/classes/org/jeecg/common/system/base/controller/JeecgController.class


BIN
jeecg-boot-base-core/target/classes/org/jeecg/common/system/base/entity/JeecgEntity.class


BIN
jeecg-boot-base-core/target/classes/org/jeecg/common/system/util/JeecgDataAutorUtils.class


BIN
jeecg-boot-base-core/target/classes/org/jeecg/config/JeecgBaseConfig.class


BIN
jeecg-boot-base-core/target/classes/org/jeecg/config/JeecgCloudCondition.class


+ 471 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDemoController.java

@@ -0,0 +1,471 @@
+package org.jeecg.modules.demo.test.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.aspect.annotation.PermissionData;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.common.util.RedisUtil;
+import org.jeecg.common.util.UUIDGenerator;
+import org.jeecg.modules.demo.test.entity.JeecgDemo;
+import org.jeecg.modules.demo.test.service.IJeecgDemoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description: 单表示例
+ * @Author: jeecg-boot
+ * @Date:2018-12-29
+ * @Version:V2.0
+ */
+@Slf4j
+@Api(tags = "单表DEMO")
+@RestController
+@RequestMapping("/test/jeecgDemo")
+public class JeecgDemoController extends JeecgController<JeecgDemo, IJeecgDemoService> {
+    @Autowired
+    private IJeecgDemoService jeecgDemoService;
+
+    @Autowired
+    private RedisUtil redisUtil;
+
+    /**
+     * 分页列表查询
+     *
+     * @param jeecgDemo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @ApiOperation(value = "获取Demo数据列表", notes = "获取所有Demo数据列表")
+    @GetMapping(value = "/list")
+    @PermissionData(pageComponent = "jeecg/JeecgDemoList")
+    public Result<?> list(JeecgDemo jeecgDemo, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                          HttpServletRequest req) {
+        QueryWrapper<JeecgDemo> queryWrapper = QueryGenerator.initQueryWrapper(jeecgDemo, req.getParameterMap());
+        queryWrapper.orderByDesc("create_time");
+        Page<JeecgDemo> page = new Page<JeecgDemo>(pageNo, pageSize);
+
+        IPage<JeecgDemo> pageList = jeecgDemoService.page(page, queryWrapper);
+        log.info("查询当前页:" + pageList.getCurrent());
+        log.info("查询当前页数量:" + pageList.getSize());
+        log.info("查询结果数量:" + pageList.getRecords().size());
+        log.info("数据总数:" + pageList.getTotal());
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 添加
+     *
+     * @param jeecgDemo
+     * @return
+     */
+    @PostMapping(value = "/add")
+    @AutoLog(value = "添加测试DEMO")
+    @ApiOperation(value = "添加DEMO", notes = "添加DEMO")
+    public Result<?> add(@RequestBody JeecgDemo jeecgDemo) {
+        jeecgDemoService.save(jeecgDemo);
+        return Result.OK("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param jeecgDemo
+     * @return
+     */
+    @AutoLog(value = "编辑DEMO", operateType = CommonConstant.OPERATE_TYPE_3)
+    @ApiOperation(value = "编辑DEMO", notes = "编辑DEMO")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<?> edit(@RequestBody JeecgDemo jeecgDemo) {
+        jeecgDemoService.updateById(jeecgDemo);
+        return Result.OK("更新成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "删除测试DEMO")
+    @DeleteMapping(value = "/delete")
+    @ApiOperation(value = "通过ID删除DEMO", notes = "通过ID删除DEMO")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        jeecgDemoService.removeById(id);
+        return Result.OK("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @DeleteMapping(value = "/deleteBatch")
+    @ApiOperation(value = "批量删除DEMO", notes = "批量删除DEMO")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.jeecgDemoService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/queryById")
+    @ApiOperation(value = "通过ID查询DEMO", notes = "通过ID查询DEMO")
+    public Result<?> queryById(@ApiParam(name = "id", value = "示例id", required = true) @RequestParam(name = "id", required = true) String id) {
+        JeecgDemo jeecgDemo = jeecgDemoService.getById(id);
+        return Result.OK(jeecgDemo);
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     */
+    @RequestMapping(value = "/exportXls")
+    @PermissionData(pageComponent = "jeecg/JeecgDemoList")
+    public ModelAndView exportXls(HttpServletRequest request, JeecgDemo jeecgDemo) {
+        //获取导出表格字段
+        String exportFields = jeecgDemoService.getExportFields();
+        //分sheet导出表格字段
+        return super.exportXlsSheet(request, jeecgDemo, JeecgDemo.class, "单表模型",exportFields,500);
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, JeecgDemo.class);
+    }
+
+    // =====Redis 示例===============================================================================================
+
+    /**
+     * redis操作 -- set
+     */
+    @GetMapping(value = "/redisSet")
+    public void redisSet() {
+        redisUtil.set("name", "张三" + DateUtils.now());
+    }
+
+    /**
+     * redis操作 -- get
+     */
+    @GetMapping(value = "/redisGet")
+    public String redisGet() {
+        return (String) redisUtil.get("name");
+    }
+
+    /**
+     * redis操作 -- setObj
+     */
+    @GetMapping(value = "/redisSetObj")
+    public void redisSetObj() {
+        JeecgDemo p = new JeecgDemo();
+        p.setAge(10);
+        p.setBirthday(new Date());
+        p.setContent("hello");
+        p.setName("张三");
+        p.setSex("男");
+        redisUtil.set("user-zdh", p);
+    }
+
+    /**
+     * redis操作 -- setObj
+     */
+    @GetMapping(value = "/redisGetObj")
+    public Object redisGetObj() {
+        return redisUtil.get("user-zdh");
+    }
+
+    /**
+     * redis操作 -- get
+     */
+    @GetMapping(value = "/redis/{id}")
+    public JeecgDemo redisGetJeecgDemo(@PathVariable("id") String id) {
+        JeecgDemo t = jeecgDemoService.getByIdCacheable(id);
+        log.info(t.toString());
+        return t;
+    }
+
+    // ===Freemaker示例================================================================================
+
+    /**
+     * freemaker方式 【页面路径: src/main/resources/templates】
+     *
+     * @param modelAndView
+     * @return
+     */
+    @RequestMapping("/html")
+    public ModelAndView ftl(ModelAndView modelAndView) {
+        modelAndView.setViewName("demo3");
+        List<String> userList = new ArrayList<String>();
+        userList.add("admin");
+        userList.add("user1");
+        userList.add("user2");
+        log.info("--------------test--------------");
+        modelAndView.addObject("userList", userList);
+        return modelAndView;
+    }
+
+
+    // ==========================================动态表单 JSON接收测试===========================================
+    /**
+     * online新增数据
+     */
+    @PostMapping(value = "/testOnlineAdd")
+    public Result<?> testOnlineAdd(@RequestBody JSONObject json) {
+        log.info(json.toJSONString());
+        return Result.OK("添加成功!");
+    }
+
+    /*----------------------------------------外部获取权限示例------------------------------------*/
+
+    /**
+     * 【数据权限示例 - 编程】mybatisPlus java类方式加载权限
+     *
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/mpList")
+    @PermissionData(pageComponent = "jeecg/JeecgDemoList")
+    public Result<?> loadMpPermissonList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                         HttpServletRequest req) {
+        QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>();
+        //编程方式,给queryWrapper装载数据权限规则
+        QueryGenerator.installAuthMplus(queryWrapper, JeecgDemo.class);
+        Page<JeecgDemo> page = new Page<JeecgDemo>(pageNo, pageSize);
+        IPage<JeecgDemo> pageList = jeecgDemoService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 【数据权限示例 - 编程】mybatis xml方式加载权限
+     *
+     * @param jeecgDemo
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/sqlList")
+    @PermissionData(pageComponent = "jeecg/JeecgDemoList")
+    public Result<?> loadSqlPermissonList(JeecgDemo jeecgDemo, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                          HttpServletRequest req) {
+        IPage<JeecgDemo> pageList = jeecgDemoService.queryListWithPermission(pageSize, pageNo);
+        return Result.OK(pageList);
+    }
+    /*----------------------------------------外部获取权限示例------------------------------------*/
+
+    /**
+     * online api增强 列表
+     * @param params
+     * @return
+     */
+    @PostMapping("/enhanceJavaListHttp")
+    public Result enhanceJavaListHttp(@RequestBody JSONObject params) {
+        log.info(" =========================================================== ");
+        log.info("params: " + params.toJSONString());
+        log.info("params.tableName: " + params.getString("tableName"));
+        log.info("params.json: " + params.getJSONObject("json").toJSONString());
+        JSONArray dataList = params.getJSONArray("dataList");
+        log.info("params.dataList: " + dataList.toJSONString());
+        log.info(" =========================================================== ");
+        return Result.OK(dataList);
+    }
+
+    /**
+     * online api增强 表单
+     * @param params
+     * @return
+     */
+    @PostMapping("/enhanceJavaFormHttp")
+    public Result enhanceJavaFormHttp(@RequestBody JSONObject params) {
+        log.info(" =========================================================== ");
+        log.info("params: " + params.toJSONString());
+        log.info("params.tableName: " + params.getString("tableName"));
+        log.info("params.json: " + params.getJSONObject("json").toJSONString());
+        log.info(" =========================================================== ");
+        return Result.OK("1");
+    }
+
+    @GetMapping(value = "/hello")
+    public String hello(HttpServletRequest req) {
+        return "hello world!";
+    }
+
+    // =====Vue3 Native  原生页面示例===============================================================================================
+    @GetMapping(value = "/oneNative/list")
+    public Result oneNativeList(@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize){
+        Object oneNative = redisUtil.get("one-native");
+        JSONArray data = new JSONArray();
+        if(null != oneNative){
+            JSONObject nativeObject = (JSONObject) oneNative;
+            data = nativeObject.getJSONArray("data");
+        }
+        IPage<JSONObject> objectPage = queryDataPage(data, pageNo, pageSize);
+        return Result.OK(objectPage);
+    }
+    
+    @PostMapping("/oneNative/add")
+    public Result<String> oneNativeAdd(@RequestBody JSONObject jsonObject){
+        Object oneNative = redisUtil.get("one-native");
+        JSONObject nativeObject = new JSONObject();
+        JSONArray data = new JSONArray();
+        if(null != oneNative){
+            nativeObject = (JSONObject) oneNative;
+            data = nativeObject.getJSONArray("data");
+        }
+        jsonObject.put("id", UUIDGenerator.generate());
+        data.add(jsonObject);
+        nativeObject.put("data",data);
+        redisUtil.set("one-native",nativeObject);
+        return Result.OK("添加成功");
+    }
+    
+    @PutMapping("/oneNative/edit")
+    public Result<String> oneNativeEdit(@RequestBody JSONObject jsonObject){
+        JSONObject oneNative = (JSONObject)redisUtil.get("one-native");
+        JSONArray data = oneNative.getJSONArray("data");
+        data = getNativeById(data,jsonObject);
+        oneNative.put("data", data);
+        redisUtil.set("one-native", oneNative);
+        return Result.OK("修改成功");
+    }
+
+    @DeleteMapping("/oneNative/delete")
+    public Result<String> oneNativeDelete(@RequestParam(name = "ids") String ids){
+        Object oneNative = redisUtil.get("one-native");
+        if(null != oneNative){
+            JSONObject nativeObject = (JSONObject) oneNative;
+            JSONArray data = nativeObject.getJSONArray("data");
+            data = deleteNativeById(data,ids);
+            nativeObject.put("data",data);
+            redisUtil.set("one-native",nativeObject);
+        }
+        return Result.OK("删除成功");
+    }
+    
+    /**
+     * 获取redis对应id的数据
+     * @param data
+     * @param jsonObject
+     * @return
+     */
+    public JSONArray getNativeById(JSONArray data,JSONObject jsonObject){
+        String dbId = "id";
+        String id = jsonObject.getString(dbId);
+        for (int i = 0; i < data.size(); i++) {
+            if(id.equals(data.getJSONObject(i).getString(dbId))){
+                data.set(i,jsonObject);
+                break;
+            }
+        }
+        return data;
+    }
+
+    /**
+     * 删除redis中包含的id数据
+     * @param data
+     * @param ids
+     * @return
+     */
+    public JSONArray deleteNativeById(JSONArray data,String ids){
+        String dbId = "id";
+        for (int i = 0; i < data.size(); i++) {
+            //如果id包含直接清除data中的数据
+            if(ids.contains(data.getJSONObject(i).getString(dbId))){
+                data.fluentRemove(i);
+            }
+            //判断data的长度是否还剩1位
+            if(data.size() == 1 && ids.contains(data.getJSONObject(0).getString(dbId))){
+                data.fluentRemove(0);
+            }
+        }
+        return data;
+    }
+
+    /**
+     * 模拟查询数据,可以根据父ID查询,可以分页
+     *
+     * @param dataList 数据列表
+     * @param pageNo   页码
+     * @param pageSize 页大小
+     * @return
+     */
+    private IPage<JSONObject> queryDataPage(JSONArray dataList, Integer pageNo, Integer pageSize) {
+        // 根据父级id查询子级
+        JSONArray dataDb = dataList;
+        // 模拟分页(实际中应用SQL自带的分页)
+        List<JSONObject> records = new ArrayList<>();
+        IPage<JSONObject> page;
+        long beginIndex, endIndex;
+        // 如果任意一个参数为null,则不分页
+        if (pageNo == null || pageSize == null) {
+            page = new Page<>(0, dataDb.size());
+            beginIndex = 0;
+            endIndex = dataDb.size();
+        } else {
+            page = new Page<>(pageNo, pageSize);
+            beginIndex = page.offset();
+            endIndex = page.offset() + page.getSize();
+        }
+        for (long i = beginIndex; (i < endIndex && i < dataDb.size()); i++) {
+            JSONObject data = dataDb.getJSONObject((int) i);
+            data = JSON.parseObject(data.toJSONString());
+            // 不返回 children
+            data.remove("children");
+            records.add(data);
+        }
+        page.setRecords(records);
+        page.setTotal(dataDb.size());
+        return page;
+    }
+    // =====Vue3 Native  原生页面示例===============================================================================================
+
+
+    /**
+     * 获取创建人
+     * @return
+     */
+    @GetMapping(value = "/groupList")
+    public Result<?> groupList() {
+        return Result.ok(jeecgDemoService.getCreateByList());
+    }
+
+}

+ 47 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.java

@@ -0,0 +1,47 @@
+package org.jeecg.modules.demo.test.controller;
+
+import io.lettuce.core.dynamic.annotation.Param;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.modules.demo.test.entity.JeecgDemo;
+import org.jeecg.modules.demo.test.service.IJeecgDemoService;
+import org.jeecg.modules.demo.test.service.IJeecgDynamicDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @Description: 动态数据源测试
+ * @Author: zyf
+ * @Date:2020-04-21
+ */
+@Slf4j
+@Api(tags = "动态数据源测试")
+@RestController
+@RequestMapping("/test/dynamic")
+public class JeecgDynamicDataController extends JeecgController<JeecgDemo, IJeecgDemoService> {
+
+    @Autowired
+    private IJeecgDynamicDataService jeecgDynamicDataService;
+
+
+    /**
+     * 动态切换数据源
+
+     * @return
+     */
+    @PostMapping(value = "/test1")
+    @AutoLog(value = "动态切换数据源")
+    @ApiOperation(value = "动态切换数据源", notes = "动态切换数据源")
+    public Result<List<JeecgDemo>> selectSpelByKey(@RequestParam(required = false) String dsName) {
+        List<JeecgDemo> list = jeecgDynamicDataService.selectSpelByKey(dsName);
+        return Result.OK(list);
+    }
+
+
+}

+ 256 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.java

@@ -0,0 +1,256 @@
+package org.jeecg.modules.demo.test.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;
+import org.jeecg.modules.demo.test.entity.JeecgOrderMain;
+import org.jeecg.modules.demo.test.entity.JeecgOrderTicket;
+import org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService;
+import org.jeecg.modules.demo.test.service.IJeecgOrderMainService;
+import org.jeecg.modules.demo.test.service.IJeecgOrderTicketService;
+import org.jeecg.modules.demo.test.vo.JeecgOrderMainPage;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+
+/**
+ * @Description: 一对多示例(ERP TAB风格)
+ * @Author: ZhiLin
+ * @Date: 2019-02-20
+ * @Version: v2.0
+ */
+@Slf4j
+@RestController
+@RequestMapping("/test/order")
+public class JeecgOrderErpMainController {
+
+    @Autowired
+    private IJeecgOrderMainService jeecgOrderMainService;
+    @Autowired
+    private IJeecgOrderCustomerService jeecgOrderCustomerService;
+    @Autowired
+    private IJeecgOrderTicketService jeecgOrderTicketService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param jeecgOrderMain
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/orderList")
+    public Result<?> respondePagedData(JeecgOrderMain jeecgOrderMain,
+                                       @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                       @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                       HttpServletRequest req) {
+        QueryWrapper<JeecgOrderMain> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderMain, req.getParameterMap());
+        Page<JeecgOrderMain> page = new Page<JeecgOrderMain>(pageNo, pageSize);
+        IPage<JeecgOrderMain> pageList = jeecgOrderMainService.page(page, queryWrapper);
+        return Result.ok(pageList);
+    }
+
+    /**
+     * 添加
+     *
+     * @param jeecgOrderMainPage
+     * @return
+     */
+    @PostMapping(value = "/add")
+    public Result<?> add(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) {
+        JeecgOrderMain jeecgOrderMain = new JeecgOrderMain();
+        BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain);
+        jeecgOrderMainService.save(jeecgOrderMain);
+        return Result.ok("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param jeecgOrderMainPage
+     * @return
+     */
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<?> edit(@RequestBody JeecgOrderMainPage jeecgOrderMainPage) {
+        JeecgOrderMain jeecgOrderMain = new JeecgOrderMain();
+        BeanUtils.copyProperties(jeecgOrderMainPage, jeecgOrderMain);
+        jeecgOrderMainService.updateById(jeecgOrderMain);
+        return Result.ok("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @DeleteMapping(value = "/delete")
+    public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
+        jeecgOrderMainService.delMain(id);
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.jeecgOrderMainService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.ok("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping(value = "/queryById")
+    public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
+        JeecgOrderMain jeecgOrderMain = jeecgOrderMainService.getById(id);
+        return Result.ok(jeecgOrderMain);
+    }
+
+
+    /**
+     * 通过id查询
+     *
+     * @param jeecgOrderCustomer
+     * @return
+     */
+    @GetMapping(value = "/listOrderCustomerByMainId")
+    public Result<?> queryOrderCustomerListByMainId(JeecgOrderCustomer jeecgOrderCustomer,
+                                                    @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                    @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                    HttpServletRequest req) {
+        QueryWrapper<JeecgOrderCustomer> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderCustomer, req.getParameterMap());
+        Page<JeecgOrderCustomer> page = new Page<JeecgOrderCustomer>(pageNo, pageSize);
+        IPage<JeecgOrderCustomer> pageList = jeecgOrderCustomerService.page(page, queryWrapper);
+        return Result.ok(pageList);
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param jeecgOrderTicket
+     * @return
+     */
+    @GetMapping(value = "/listOrderTicketByMainId")
+    public Result<?> queryOrderTicketListByMainId(JeecgOrderTicket jeecgOrderTicket,
+                                                  @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                  @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                  HttpServletRequest req) {
+        QueryWrapper<JeecgOrderTicket> queryWrapper = QueryGenerator.initQueryWrapper(jeecgOrderTicket, req.getParameterMap());
+        Page<JeecgOrderTicket> page = new Page<JeecgOrderTicket>(pageNo, pageSize);
+        IPage<JeecgOrderTicket> pageList = jeecgOrderTicketService.page(page, queryWrapper);
+        return Result.ok(pageList);
+    }
+
+    /**
+     * 添加
+     *
+     * @param jeecgOrderCustomer
+     * @return
+     */
+    @PostMapping(value = "/addCustomer")
+    public Result<?> addCustomer(@RequestBody JeecgOrderCustomer jeecgOrderCustomer) {
+        jeecgOrderCustomerService.save(jeecgOrderCustomer);
+        return Result.ok("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param jeecgOrderCustomer
+     * @return
+     */
+    @RequestMapping(value = "/editCustomer", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<?> editCustomer(@RequestBody JeecgOrderCustomer jeecgOrderCustomer) {
+        jeecgOrderCustomerService.updateById(jeecgOrderCustomer);
+        return Result.ok("添加成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @DeleteMapping(value = "/deleteCustomer")
+    public Result<?> deleteCustomer(@RequestParam(name = "id", required = true) String id) {
+        jeecgOrderCustomerService.removeById(id);
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @DeleteMapping(value = "/deleteBatchCustomer")
+    public Result<?> deleteBatchCustomer(@RequestParam(name = "ids", required = true) String ids) {
+        this.jeecgOrderCustomerService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.ok("批量删除成功!");
+    }
+
+    /**
+     * 添加
+     *
+     * @param jeecgOrderTicket
+     * @return
+     */
+    @PostMapping(value = "/addTicket")
+    public Result<?> addTicket(@RequestBody JeecgOrderTicket jeecgOrderTicket) {
+        jeecgOrderTicketService.save(jeecgOrderTicket);
+        return Result.ok("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param jeecgOrderTicket
+     * @return
+     */
+    @RequestMapping(value = "/editTicket", method = {RequestMethod.PUT,RequestMethod.POST})
+    public Result<?> editTicket(@RequestBody JeecgOrderTicket jeecgOrderTicket) {
+        jeecgOrderTicketService.updateById(jeecgOrderTicket);
+        return Result.ok("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @DeleteMapping(value = "/deleteTicket")
+    public Result<?> deleteTicket(@RequestParam(name = "id", required = true) String id) {
+        jeecgOrderTicketService.removeById(id);
+        return Result.ok("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @DeleteMapping(value = "/deleteBatchTicket")
+    public Result<?> deleteBatchTicket(@RequestParam(name = "ids", required = true) String ids) {
+        this.jeecgOrderTicketService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.ok("批量删除成功!");
+    }
+
+}

+ 86 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgDemo.java

@@ -0,0 +1,86 @@
+package org.jeecg.modules.demo.test.entity;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.Version;
+import org.jeecg.common.system.base.entity.JeecgEntity;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @Description: jeecg 测试demo 
+ * @Author: jeecg-boot 
+ * @Date:	2018-12-29 
+ * @Version:V1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="测试DEMO对象", description="测试DEMO")
+@TableName("demo")
+public class JeecgDemo extends JeecgEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+	/** 姓名 */
+	@Excel(name="姓名",width=25)
+	@ApiModelProperty(value = "姓名")
+	private java.lang.String name;
+	/** 关键词 */
+	@ApiModelProperty(value = "关键词")
+	@Excel(name="关键词",width=15)
+	private java.lang.String keyWord;
+	/** 打卡时间 */
+	@ApiModelProperty(value = "打卡时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@Excel(name="打卡时间",width=20,format="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date punchTime;
+	/** 工资 */
+	@ApiModelProperty(value = "工资",example = "0")
+	@Excel(name="工资",width=15)
+	private java.math.BigDecimal salaryMoney;
+	/** 奖金 */
+	@ApiModelProperty(value = "奖金",example = "0")
+	@Excel(name="奖金",width=15)
+	private java.lang.Double bonusMoney;
+	/** 性别 {男:1,女:2} */
+	@ApiModelProperty(value = "性别")
+	@Excel(name = "性别", width = 15, dicCode = "sex")
+	private java.lang.String sex;
+	/** 年龄 */
+	@ApiModelProperty(value = "年龄",example = "0")
+	@Excel(name="年龄",width=15)
+	private java.lang.Integer age;
+	/** 生日 */
+	@ApiModelProperty(value = "生日")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@Excel(name="生日",format="yyyy-MM-dd")
+	private java.util.Date birthday;
+	/** 邮箱 */
+	@ApiModelProperty(value = "邮箱")
+	@Excel(name="邮箱",width=30)
+	private java.lang.String email;
+	/** 个人简介 */
+	@ApiModelProperty(value = "个人简介")
+	private java.lang.String content;
+	/** 部门编码 */
+	@Excel(name="部门编码",width=25)
+	@ApiModelProperty(value = "部门编码")
+	private java.lang.String sysOrgCode;
+
+	@ApiModelProperty(value = "租户ID")
+	private java.lang.Integer tenantId;
+	/** 乐观锁字段 */
+	@Version
+	private java.lang.Integer updateCount;
+
+}

+ 54 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.java

@@ -0,0 +1,54 @@
+package org.jeecg.modules.demo.test.entity;
+
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * @Description: 订单客户
+ * @Author: jeecg-boot
+ * @Date:  2019-02-15
+ * @Version: V1.0
+ */
+@Data
+@TableName("jeecg_order_customer")
+public class JeecgOrderCustomer implements Serializable {
+    private static final long serialVersionUID = 1L;
+    
+	/**主键*/
+    @TableId(type = IdType.ASSIGN_ID)
+	private java.lang.String id;
+	/**客户名*/
+	@Excel(name="客户名字",width=15)
+	private java.lang.String name;
+	/**性别*/
+	private java.lang.String sex;
+	/**身份证号码*/
+	@Excel(name="身份证号码",width=15)
+	private java.lang.String idcard;
+	/**身份证扫描件*/
+	private java.lang.String idcardPic;
+	/**电话1*/
+	@Excel(name="电话",width=15)
+	private java.lang.String telphone;
+	/**外键*/
+	private java.lang.String orderId;
+	/**创建人*/
+	private java.lang.String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date createTime;
+	/**修改人*/
+	private java.lang.String updateBy;
+	/**修改时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date updateTime;
+}

+ 52 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/entity/JeecgOrderMain.java

@@ -0,0 +1,52 @@
+package org.jeecg.modules.demo.test.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * @Description: 订单
+ * @Author: jeecg-boot
+ * @Date:  2019-02-15
+ * @Version: V1.0
+ */
+@Data
+@TableName("jeecg_order_main")
+public class JeecgOrderMain implements Serializable {
+    private static final long serialVersionUID = 1L;
+    
+	/**主键*/
+    @TableId(type = IdType.ASSIGN_ID)
+	private java.lang.String id;
+	/**订单号*/
+	private java.lang.String orderCode;
+	/**订单类型*/
+	private java.lang.String ctype;
+	/**订单日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date orderDate;
+	/**订单金额*/
+	private java.lang.Double orderMoney;
+	/**订单备注*/
+	private java.lang.String content;
+	/**创建人*/
+	private java.lang.String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date createTime;
+	/**修改人*/
+	private java.lang.String updateBy;
+	/**修改时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	private java.util.Date updateTime;
+
+	private String bpmStatus;
+}

+ 57 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.java

@@ -0,0 +1,57 @@
+package org.jeecg.modules.demo.test.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.demo.test.entity.JeecgDemo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+/**
+ * @Description: jeecg 测试demo
+ * @Author: jeecg-boot
+ * @Date:  2018-12-29
+ * @Version: V1.0
+ */
+public interface JeecgDemoMapper extends BaseMapper<JeecgDemo> {
+
+    /**
+     * 根据姓名查询demo列表数据
+     * @param name 姓名
+     * @return demo集合
+     */
+	public List<JeecgDemo> getDemoByName(@Param("name") String name);
+	
+	/**
+	 * 查询列表数据 直接传数据权限的sql进行数据过滤
+	 * @param page
+	 * @param permissionSql
+	 * @return
+	 */
+	public IPage<JeecgDemo> queryListWithPermission(Page<JeecgDemo> page,@Param("permissionSql")String permissionSql);
+
+	/**
+	 * 根据前缀获取所有有效权限
+	 * @param permsPrefix
+	 * @return
+	 */
+	public List<String> queryAllAuth(@Param("permsPrefix")String permsPrefix);
+
+	/**
+	 * 查询用户已授权字段
+	 * @param userId
+	 * @param permsPrefix
+	 * @return
+	 */
+	public List<String> queryUserAuth(@Param("userId")String userId,@Param("permsPrefix")String permsPrefix);
+
+
+	/**
+	 * 获取创建人
+	 * @return
+	 */
+	List<String> getCreateByList();
+
+}

+ 34 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.java

@@ -0,0 +1,34 @@
+package org.jeecg.modules.demo.test.mapper;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Select;
+import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 订单客户
+ * @Author: jeecg-boot
+ * @Date:  2019-02-15
+ * @Version: V1.0
+ */
+public interface JeecgOrderCustomerMapper extends BaseMapper<JeecgOrderCustomer> {
+	
+	/**
+	 *  通过主表外键批量删除客户
+	 * @param mainId
+	 * @return
+	 */
+    @Delete("DELETE FROM JEECG_ORDER_CUSTOMER WHERE ORDER_ID = #{mainId}")
+	public boolean deleteCustomersByMainId(String mainId);
+
+    /**
+     * 通过主表订单外键查询客户
+     * @param mainId 订单id
+     * @return 订单客户集合
+     */
+    @Select("SELECT * FROM JEECG_ORDER_CUSTOMER WHERE ORDER_ID = #{mainId}")
+	public List<JeecgOrderCustomer> selectCustomersByMainId(String mainId);
+}

+ 40 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.demo.test.mapper.JeecgDemoMapper">
+
+	<!-- 根据用户名查询 -->
+	<select id="getDemoByName" resultType="org.jeecg.modules.demo.test.entity.JeecgDemo">
+		select * from  demo  where name = #{name}
+	</select>
+	
+	<!-- 根据权限sql查询数据集 -->
+	<select id="queryListWithPermission" parameterType="Object" resultType="org.jeecg.modules.demo.test.entity.JeecgDemo">
+		select * from demo where 1=1 ${permissionSql}
+	</select>
+
+	<!-- 查询所有符合前缀且有效字段 -->
+	<select id="queryAllAuth" resultType="java.lang.String">
+        select perms from sys_permission
+        where perms
+        like concat(concat('%',#{permsPrefix}),'%')
+        and del_flag=0
+        and status='1'
+    </select>
+
+	<!-- 查询用户已授权字段 -->
+	<select id="queryUserAuth" resultType="java.lang.String">
+        select DISTINCT perms from sys_user_role sur,
+        sys_role_permission srp,
+        sys_permission sp
+        where sur.role_id = srp.role_id
+        and sp.id = srp.permission_id
+        and sur.user_id = #{userId}
+        and sp.perms like concat(concat('%',#{permsPrefix}),'%')
+    </select>
+
+    <!--  获取创建人 -->
+    <select id="getCreateByList" resultType="java.lang.String">
+        select create_by from demo group by create_by
+    </select>
+    
+</mapper>

+ 5 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper">
+
+</mapper>

+ 116 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.java

@@ -0,0 +1,116 @@
+package org.jeecg.modules.demo.test.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.constant.CacheConstant;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.common.system.vo.LoginUser;
+import org.jeecg.modules.demo.test.entity.JeecgDemo;
+import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;
+import org.jeecg.modules.demo.test.service.IJeecgDemoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Description: jeecg 测试demo
+ * @Author: jeecg-boot
+ * @Date:  2018-12-29
+ * @Version: V1.0
+ */
+@Service
+public class JeecgDemoServiceImpl extends ServiceImpl<JeecgDemoMapper, JeecgDemo> implements IJeecgDemoService {
+	@Autowired
+	JeecgDemoMapper jeecgDemoMapper;
+	
+	/**
+	 * 事务控制在service层面
+	 * 加上注解:@Transactional,声明的方法就是一个独立的事务(有异常DB操作全部回滚)
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void testTran() {
+		JeecgDemo pp = new JeecgDemo();
+		pp.setAge(1111);
+		pp.setName("测试事务  小白兔 1");
+		jeecgDemoMapper.insert(pp);
+		
+		JeecgDemo pp2 = new JeecgDemo();
+		pp2.setAge(2222);
+		pp2.setName("测试事务  小白兔 2");
+		jeecgDemoMapper.insert(pp2);
+        //自定义异常
+		Integer.parseInt("hello");
+		
+		JeecgDemo pp3 = new JeecgDemo();
+		pp3.setAge(3333);
+		pp3.setName("测试事务  小白兔 3");
+		jeecgDemoMapper.insert(pp3);
+		return ;
+	}
+
+
+	/**
+	 * 缓存注解测试: redis
+	 */
+	@Override
+	@Cacheable(cacheNames = CacheConstant.TEST_DEMO_CACHE, key = "#id")
+	public JeecgDemo getByIdCacheable(String id) {
+		JeecgDemo t = jeecgDemoMapper.selectById(id);
+		System.err.println("---未读缓存,读取数据库---");
+		System.err.println(t);
+		return t;
+	}
+
+
+	@Override
+	public IPage<JeecgDemo> queryListWithPermission(int pageSize,int pageNo) {
+		Page<JeecgDemo> page = new Page<>(pageNo, pageSize);
+		//编程方式,获取当前请求的数据权限规则SQL片段
+		String sql = QueryGenerator.installAuthJdbc(JeecgDemo.class);
+		return this.baseMapper.queryListWithPermission(page, sql);
+	}
+
+	@Override
+	public String getExportFields() {
+		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+		//权限配置列导出示例
+		//1.配置前缀与菜单中配置的列前缀一致
+		List<String> noAuthList = new ArrayList<>();
+		List<String> exportFieldsList = new ArrayList<>();
+		String permsPrefix = "testdemo:";
+		//查询配置菜单有效字段
+		List<String> allAuth = this.jeecgDemoMapper.queryAllAuth(permsPrefix);
+		//查询已授权字段
+		List<String> userAuth = this.jeecgDemoMapper.queryUserAuth(sysUser.getId(),permsPrefix);
+		//列出未授权字段
+		for(String perms : allAuth){
+			if(!userAuth.contains(perms)){
+				noAuthList.add(perms.substring(permsPrefix.length()));
+			}
+		}
+		//实体类中字段与未授权字段比较,列出需导出字段
+		Field[] fileds = JeecgDemo.class.getDeclaredFields();
+		List<Field> list = new ArrayList(Arrays.asList(fileds));
+		for(Field field : list){
+			if(!noAuthList.contains(field.getName())){
+				exportFieldsList.add(field.getName());
+			}
+		}
+		return exportFieldsList != null && exportFieldsList.size()>0 ? String.join(",", exportFieldsList) : "";
+	}
+
+	@Override
+	public List<String> getCreateByList() {
+		return jeecgDemoMapper.getCreateByList();
+	}
+
+}

+ 28 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgDynamicDataServiceImpl.java

@@ -0,0 +1,28 @@
+package org.jeecg.modules.demo.test.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.demo.test.entity.JeecgDemo;
+import org.jeecg.modules.demo.test.mapper.JeecgDemoMapper;
+import org.jeecg.modules.demo.test.service.IJeecgDynamicDataService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Description: 动态数据源测试
+ * @Author: zyf
+ * @Date:2020-04-21
+ */
+@Service
+public class JeecgDynamicDataServiceImpl extends ServiceImpl<JeecgDemoMapper, JeecgDemo> implements IJeecgDynamicDataService {
+
+    @Override
+    public List<JeecgDemo> selectSpelByHeader() {
+        return list();
+    }
+
+    @Override
+    public List<JeecgDemo> selectSpelByKey(String dsName) {
+        return list();
+    }
+}

+ 30 - 0
jeecg-module-demo/src/main/java/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.java

@@ -0,0 +1,30 @@
+package org.jeecg.modules.demo.test.service.impl;
+
+import java.util.List;
+
+import org.jeecg.modules.demo.test.entity.JeecgOrderCustomer;
+import org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper;
+import org.jeecg.modules.demo.test.service.IJeecgOrderCustomerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 订单客户
+ * @Author: jeecg-boot
+ * @Date:  2019-02-15
+ * @Version: V1.0
+ */
+@Service
+public class JeecgOrderCustomerServiceImpl extends ServiceImpl<JeecgOrderCustomerMapper, JeecgOrderCustomer> implements IJeecgOrderCustomerService {
+
+	@Autowired
+	private JeecgOrderCustomerMapper jeecgOrderCustomerMapper;
+	
+	@Override
+	public List<JeecgOrderCustomer> selectCustomersByMainId(String mainId) {
+		return jeecgOrderCustomerMapper.selectCustomersByMainId(mainId);
+	}
+
+}

BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/controller/JeecgDemoController.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/controller/JeecgDynamicDataController.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/controller/JeecgOrderErpMainController.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/controller/JeecgOrderMainController.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/entity/JeecgDemo.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/entity/JeecgOrderCustomer.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/entity/JeecgOrderMain.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/mapper/JeecgDemoMapper.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/mapper/JeecgOrderCustomerMapper.class


+ 40 - 0
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/mapper/xml/JeecgDemoMapper.xml

@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.demo.test.mapper.JeecgDemoMapper">
+
+	<!-- 根据用户名查询 -->
+	<select id="getDemoByName" resultType="org.jeecg.modules.demo.test.entity.JeecgDemo">
+		select * from  demo  where name = #{name}
+	</select>
+	
+	<!-- 根据权限sql查询数据集 -->
+	<select id="queryListWithPermission" parameterType="Object" resultType="org.jeecg.modules.demo.test.entity.JeecgDemo">
+		select * from demo where 1=1 ${permissionSql}
+	</select>
+
+	<!-- 查询所有符合前缀且有效字段 -->
+	<select id="queryAllAuth" resultType="java.lang.String">
+        select perms from sys_permission
+        where perms
+        like concat(concat('%',#{permsPrefix}),'%')
+        and del_flag=0
+        and status='1'
+    </select>
+
+	<!-- 查询用户已授权字段 -->
+	<select id="queryUserAuth" resultType="java.lang.String">
+        select DISTINCT perms from sys_user_role sur,
+        sys_role_permission srp,
+        sys_permission sp
+        where sur.role_id = srp.role_id
+        and sp.id = srp.permission_id
+        and sur.user_id = #{userId}
+        and sp.perms like concat(concat('%',#{permsPrefix}),'%')
+    </select>
+
+    <!--  获取创建人 -->
+    <select id="getCreateByList" resultType="java.lang.String">
+        select create_by from demo group by create_by
+    </select>
+    
+</mapper>

+ 5 - 0
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/mapper/xml/JeecgOrderCustomerMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.demo.test.mapper.JeecgOrderCustomerMapper">
+
+</mapper>

BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/service/impl/JeecgDemoServiceImpl.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/service/impl/JeecgDynamicDataServiceImpl.class


BIN
jeecg-module-demo/target/classes/org/jeecg/modules/demo/test/service/impl/JeecgOrderCustomerServiceImpl.class


+ 18 - 0
jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneGUI.java

@@ -0,0 +1,18 @@
+package org.jeecg.codegenerate;
+
+import org.jeecgframework.codegenerate.window.CodeWindow;
+
+/**
+ * @Title: 单表代码生成器入口
+ * @Author 张代浩
+ * @site www.jeecg.com
+ * @Version:V1.0.1
+ */
+public class JeecgOneGUI {
+
+	/** 使用手册: http://doc.jeecg.com/2684691 */
+    public static void main(String[] args) {
+    	new CodeWindow().pack();
+	}
+
+}

+ 81 - 0
jeecg-module-system/jeecg-system-start/src/main/java/org/jeecg/codegenerate/JeecgOneToMainUtil.java

@@ -0,0 +1,81 @@
+package org.jeecg.codegenerate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.jeecgframework.codegenerate.generate.impl.CodeGenerateOneToMany;
+import org.jeecgframework.codegenerate.generate.pojo.onetomany.MainTableVo;
+import org.jeecgframework.codegenerate.generate.pojo.onetomany.SubTableVo;
+
+/**
+ * 代码生成器入口【一对多】
+ * @Author 张代浩
+ * @site www.jeecg.com
+ * 
+ */
+public class JeecgOneToMainUtil {
+
+	/**
+	 * 一对多(父子表)数据模型,生成方法
+	 * @param args
+	 */
+	public static void main(String[] args) {
+		//第一步:设置主表配置
+		MainTableVo mainTable = new MainTableVo();
+        //表名
+		mainTable.setTableName("jeecg_order_main");
+        //实体名
+		mainTable.setEntityName("GuiTestOrderMain");
+        //包名
+		mainTable.setEntityPackage("gui");
+        //描述
+		mainTable.setFtlDescription("GUI订单管理");
+		
+		//第二步:设置子表集合配置
+		List<SubTableVo> subTables = new ArrayList<SubTableVo>();
+		//[1].子表一
+		SubTableVo po = new SubTableVo();
+        //表名
+		po.setTableName("jeecg_order_customer");
+        //实体名
+		po.setEntityName("GuiTestOrderCustom");
+        //包名
+		po.setEntityPackage("gui");
+        //描述
+		po.setFtlDescription("客户明细");
+		//子表外键参数配置
+		/*说明: 
+		 * a) 子表引用主表主键ID作为外键,外键字段必须以_ID结尾;
+		 * b) 主表和子表的外键字段名字,必须相同(除主键ID外);
+		 * c) 多个外键字段,采用逗号分隔;
+		*/
+		po.setForeignKeys(new String[]{"order_id"});
+		subTables.add(po);
+		//[2].子表二
+		SubTableVo po2 = new SubTableVo();
+        //表名
+		po2.setTableName("jeecg_order_ticket");
+        //实体名
+		po2.setEntityName("GuiTestOrderTicket");
+        //包名
+		po2.setEntityPackage("gui");
+        //描述
+		po2.setFtlDescription("产品明细");
+		//子表外键参数配置
+		/*说明: 
+		 * a) 子表引用主表主键ID作为外键,外键字段必须以_ID结尾;
+		 * b) 主表和子表的外键字段名字,必须相同(除主键ID外);
+		 * c) 多个外键字段,采用逗号分隔;
+		*/
+		po2.setForeignKeys(new String[]{"order_id"});
+		subTables.add(po2);
+		mainTable.setSubTables(subTables);
+		
+		//第三步:一对多(父子表)数据模型,代码生成
+		try {
+			new CodeGenerateOneToMany(mainTable,subTables).generateCodeFile(null);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}

+ 27 - 0
jeecg-module-system/jeecg-system-start/target/classes/jeecg/jeecg_database.properties

@@ -0,0 +1,27 @@
+#mysql
+diver_name=com.mysql.jdbc.Driver
+url=jdbc:mysql://localhost:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8
+username=root
+password=root
+database_name=jeecg-boot
+
+#oracle
+#diver_name=oracle.jdbc.driver.OracleDriver
+#url=jdbc:oracle:thin:@192.168.1.200:1521:ORCL
+#username=scott
+#password=tiger
+#database_name=ORCL
+
+#postgre
+#diver_name=org.postgresql.Driver
+#url=jdbc:postgresql://localhost:5432/jeecg
+#username=postgres
+#password=postgres
+#database_name=jeecg
+
+#SQLServer2005\u4ee5\u4e0a
+#diver_name=org.hibernate.dialect.SQLServerDialect
+#url=jdbc:sqlserver://192.168.1.200:1433;DatabaseName=jeecg
+#username=sa
+#password=SA
+#database_name=jeecg

BIN
jeecg-module-system/jeecg-system-start/target/classes/org/jeecg/codegenerate/JeecgOneGUI.class


BIN
jeecg-module-system/jeecg-system-start/target/classes/org/jeecg/codegenerate/JeecgOneToMainUtil.class


+ 57 - 0
jeecg-server-cloud/jeecg-cloud-gateway/src/main/java/org/jeecg/JeecgGatewayApplication.java

@@ -0,0 +1,57 @@
+package org.jeecg;
+
+import org.jeecg.loader.DynamicRouteLoader;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.MediaType;
+import org.springframework.web.reactive.function.server.RouterFunction;
+import org.springframework.web.reactive.function.server.ServerResponse;
+
+import javax.annotation.Resource;
+
+import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
+import static org.springframework.web.reactive.function.server.RouterFunctions.route;
+import static org.springframework.web.reactive.function.server.ServerResponse.ok;
+
+/**
+ * @author jeecg
+ */
+@EnableFeignClients
+@EnableDiscoveryClient
+@SpringBootApplication
+public class JeecgGatewayApplication  implements CommandLineRunner {
+    @Resource
+    private DynamicRouteLoader dynamicRouteLoader;
+
+    public static void main(String[] args) {
+        ConfigurableApplicationContext applicationContext = SpringApplication.run(JeecgGatewayApplication.class, args);
+        //String userName = applicationContext.getEnvironment().getProperty("jeecg.test");
+        //System.err.println("user name :" +userName);
+    }
+
+    /**
+     * 容器初始化后加载路由
+     * @param strings
+     */
+    @Override
+    public void run(String... strings) {
+        dynamicRouteLoader.refresh(null);
+    }
+
+    /**
+     * 接口地址(通过9999端口直接访问)
+     *
+     * @param indexHtml
+     * @return
+     */
+    @Bean
+    public RouterFunction<ServerResponse> indexRouter(@Value("classpath:/META-INF/resources/doc.html") final org.springframework.core.io.Resource indexHtml) {
+        return route(GET("/"), request -> ok().contentType(MediaType.TEXT_HTML).syncBody(indexHtml));
+    }
+}

+ 47 - 0
jeecg-server-cloud/jeecg-cloud-nacos/src/main/java/com/alibaba/nacos/JeecgNacosApplication.java

@@ -0,0 +1,47 @@
+package com.alibaba.nacos;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Nacos 启动类
+ *
+ * @author zyf
+ */
+@SpringBootApplication(scanBasePackages = "com.alibaba.nacos")
+@ServletComponentScan
+@EnableScheduling
+public class JeecgNacosApplication {
+
+    /** 是否单机模式启动 */
+    private static String standalone = "true";
+    /** 是否开启鉴权 */
+    private static String enabled = "false";
+
+    public static void main(String[] args) {
+        System.setProperty("nacos.standalone", standalone);
+        System.setProperty("nacos.core.auth.enabled", enabled);
+        System.setProperty("server.tomcat.basedir","logs");
+        //自定义启动端口号
+        System.setProperty("server.port","8848");
+        SpringApplication.run(JeecgNacosApplication.class, args);
+    }
+
+    /**
+     * 默认跳转首页
+     *
+     * @param model
+     * @return
+     */
+    @GetMapping("/")
+    public String index(Model model, HttpServletResponse response) {
+        // 视图重定向 - 跳转
+        return "/nacos";
+    }
+}

+ 35 - 0
jeecg-server-cloud/jeecg-demo-cloud-start/src/main/java/org/jeecg/JeecgDemoCloudApplication.java

@@ -0,0 +1,35 @@
+package org.jeecg;
+
+import org.jeecg.common.base.BaseMap;
+import org.jeecg.common.constant.GlobalConstants;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.data.redis.core.RedisTemplate;
+
+@SpringBootApplication
+@EnableFeignClients
+public class JeecgDemoCloudApplication implements CommandLineRunner {
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    public static void main(String[] args) {
+        SpringApplication.run(JeecgDemoCloudApplication.class, args);
+    }
+
+    /**
+     * 启动的时候,触发下gateway网关刷新
+     *
+     * 解决: 先启动gateway后启动服务,Swagger接口文档访问不通的问题
+     * @param args
+     */
+    @Override
+    public void run(String... args) {
+        BaseMap params = new BaseMap();
+        params.put(GlobalConstants.HANDLER_NAME, GlobalConstants.LODER_ROUDER_HANDLER);
+        //刷新网关
+        redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params);
+    }
+}

+ 27 - 0
jeecg-server-cloud/jeecg-system-cloud-start/src/main/resources/jeecg/jeecg_database.properties

@@ -0,0 +1,27 @@
+#mysql
+diver_name=com.mysql.jdbc.Driver
+url=jdbc:mysql://localhost:3306/jeecg-boot?useUnicode=true&characterEncoding=UTF-8
+username=root
+password=root
+database_name=jeecg-boot
+
+#oracle
+#diver_name=oracle.jdbc.driver.OracleDriver
+#url=jdbc:oracle:thin:@192.168.1.200:1521:ORCL
+#username=scott
+#password=tiger
+#database_name=ORCL
+
+#postgre
+#diver_name=org.postgresql.Driver
+#url=jdbc:postgresql://localhost:5432/jeecg
+#username=postgres
+#password=postgres
+#database_name=jeecg
+
+#SQLServer2005\u4ee5\u4e0a
+#diver_name=org.hibernate.dialect.SQLServerDialect
+#url=jdbc:sqlserver://192.168.1.200:1433;DatabaseName=jeecg
+#username=sa
+#password=SA
+#database_name=jeecg

+ 18 - 0
jeecg-server-cloud/jeecg-visual/jeecg-cloud-monitor/src/main/java/org/jeecg/monitor/JeecgMonitorApplication.java

@@ -0,0 +1,18 @@
+package org.jeecg.monitor;
+
+import de.codecentric.boot.admin.server.config.EnableAdminServer;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * 监控服务
+ * @author zyf
+ * @date: 2022/4/21 10:55
+ */
+@SpringBootApplication
+@EnableAdminServer
+public class JeecgMonitorApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(JeecgMonitorApplication.class, args);
+    }
+}

+ 62 - 0
jeecg-server-cloud/jeecg-visual/jeecg-cloud-test/jeecg-cloud-test-rabbitmq/src/main/java/org/jeecg/modules/test/rabbitmq/controller/JeecgMqTestController.java

@@ -0,0 +1,62 @@
+package org.jeecg.modules.test.rabbitmq.controller;
+
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.jeecg.boot.starter.rabbitmq.client.RabbitMqClient;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.base.BaseMap;
+import org.jeecg.modules.test.rabbitmq.constant.CloudConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import cn.hutool.core.util.RandomUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+
+/**
+ * RabbitMqClient发送消息
+ * @author: zyf
+ * @date: 2022/04/21
+ */
+@RestController
+@RequestMapping("/sys/test")
+@Api(tags = "【微服务】MQ单元测试")
+public class JeecgMqTestController {
+
+    @Autowired
+    private RabbitMqClient rabbitMqClient;
+
+
+    /**
+     * 测试方法:快速点击发送MQ消息
+     *  观察三个接受者如何分配处理消息:HelloReceiver1、HelloReceiver2、HelloReceiver3,会均衡分配
+     *
+     * @param req
+     * @return
+     */
+    @GetMapping(value = "/rabbitmq")
+    @ApiOperation(value = "测试rabbitmq", notes = "测试rabbitmq")
+    public Result<?> rabbitMqClientTest(HttpServletRequest req) {
+        //rabbitmq消息队列测试
+        BaseMap map = new BaseMap();
+        map.put("orderId", RandomUtil.randomNumbers(10));
+        rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER, map);
+        rabbitMqClient.sendMessage(CloudConstant.MQ_JEECG_PLACE_ORDER_TIME, map,10);
+        return Result.OK("MQ发送消息成功");
+    }
+
+    @GetMapping(value = "/rabbitmq2")
+    @ApiOperation(value = "rabbitmq消息总线测试", notes = "rabbitmq消息总线测试")
+    public Result<?> rabbitmq2(HttpServletRequest req) {
+
+        //rabbitmq消息总线测试
+        BaseMap params = new BaseMap();
+        params.put("orderId", "123456");
+        rabbitMqClient.publishEvent(CloudConstant.MQ_DEMO_BUS_EVENT, params);
+        return Result.OK("MQ发送消息成功");
+    }
+}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác