diff --git a/README.md b/README.md
index a64d9ffa8..d564bfaf2 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@
* 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验
* 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款
* 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务
-* 集成报表设计器,支持数据报表、图形报表、打印设计等
+* 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏
| 项目名 | 说明 | 传送门 |
|----------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|
@@ -171,10 +171,10 @@ ps:核心功能已经实现,正在对接微信小程序中...
### 数据报表
-| | 功能 | 描述 |
-|-----|----------|----------------------------------------------|
-| 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 |
-| 🚀 | 大屏设计器 | 建设中... 拖拽式实现可视化数据大屏 |
+| | 功能 | 描述 |
+|-----|-------|--------------------|
+| 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 |
+| 🚀 | 大屏设计器 | 拖拽生成数据大屏,内置几十种图表组件 |
### 微信公众号
@@ -207,23 +207,23 @@ ps:核心功能已经实现,正在对接微信小程序中...
## 🐨 技术栈
-| 项目 | 说明 |
-|------------------------------|--------------------|
-| `yudao-dependencies` | Maven 依赖版本管理 |
-| `yudao-framework` | Java 框架拓展 |
-| `yudao-server` | 管理后台 + 用户 APP 的服务端 |
-| `yudao-ui-admin` | 管理后台的 Vue2 前端项目 |
-| `yudao-ui-admin-vue3` | 管理后台的 Vue3 前端项目 |
-| `yudao-ui-admin-uniapp` | 管理后台的 uni-app 多端项目 |
-| `yudao-ui-app` | 用户 APP 的 UI 界面 |
-| `yudao-module-system` | 系统功能的 Module 模块 |
-| `yudao-module-member` | 会员中心的 Module 模块 |
-| `yudao-module-infra` | 基础设施的 Module 模块 |
-| `yudao-module-bpm` | 工作流程的 Module 模块 |
-| `yudao-module-pay` | 支付系统的 Module 模块 |
-| `yudao-module-mall` | 商城系统的 Module 模块 |
-| `yudao-module-mp` | 微信公众号的 Module 模块 |
-| `yudao-module-visualization` | 大屏报表 Module 模块 |
+| 项目 | 说明 |
+|-------------------------|--------------------|
+| `yudao-dependencies` | Maven 依赖版本管理 |
+| `yudao-framework` | Java 框架拓展 |
+| `yudao-server` | 管理后台 + 用户 APP 的服务端 |
+| `yudao-ui-admin` | 管理后台的 Vue2 前端项目 |
+| `yudao-ui-admin-vue3` | 管理后台的 Vue3 前端项目 |
+| `yudao-ui-admin-uniapp` | 管理后台的 uni-app 多端项目 |
+| `yudao-ui-app` | 用户 APP 的 UI 界面 |
+| `yudao-module-system` | 系统功能的 Module 模块 |
+| `yudao-module-member` | 会员中心的 Module 模块 |
+| `yudao-module-infra` | 基础设施的 Module 模块 |
+| `yudao-module-bpm` | 工作流程的 Module 模块 |
+| `yudao-module-pay` | 支付系统的 Module 模块 |
+| `yudao-module-mall` | 商城系统的 Module 模块 |
+| `yudao-module-mp` | 微信公众号的 Module 模块 |
+| `yudao-module-report` | 大屏报表 Module 模块 |
### 后端
@@ -324,9 +324,10 @@ ps:核心功能已经实现,正在对接微信小程序中...
### 数据报表
-| 模块 | biu | biu | biu |
-|---------|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|
+| 模块 | biu | biu | biu |
+|-------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
| 报表设计器 | ![数据报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-数据报表.jpg?imageView2/2/format/webp/w/1280) | ![图形报表](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-图形报表.jpg?imageView2/2/format/webp/w/1280) | ![报表设计器-打印设计](https://static.iocoder.cn/images/ruoyi-vue-pro/报表设计器-打印设计.jpg?imageView2/2/format/webp/w/1280) |
+| 大屏设计器 | ![大屏列表](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-列表.jpg?imageView2/2/format/webp/w/1280) | ![大屏预览](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-预览.jpg?imageView2/2/format/webp/w/1280) | ![大屏编辑](https://static.iocoder.cn/images/ruoyi-vue-pro/大屏设计器-编辑.jpg?imageView2/2/format/webp/w/1280) |
### 移动端(管理后台)
diff --git a/pom.xml b/pom.xml
index 9a2cf0e72..123797c2d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
yudao-module-infra
yudao-module-pay
-
+
diff --git a/sql/mysql/optional/go-view.sql b/sql/mysql/optional/go-view.sql
new file mode 100644
index 000000000..210cff3f9
--- /dev/null
+++ b/sql/mysql/optional/go-view.sql
@@ -0,0 +1,47 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : 127.0.0.1 MySQL
+ Source Server Type : MySQL
+ Source Server Version : 80026
+ Source Host : localhost:3306
+ Source Schema : ruoyi-vue-pro
+
+ Target Server Type : MySQL
+ Target Server Version : 80026
+ File Encoding : 65001
+
+ Date: 07/02/2023 22:00:03
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for report_go_view_project
+-- ----------------------------
+DROP TABLE IF EXISTS `report_go_view_project`;
+CREATE TABLE `report_go_view_project` (
+ `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '项目名称',
+ `pic_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '预览图片 URL',
+ `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '报表内容',
+ `status` tinyint NOT NULL COMMENT '发布状态',
+ `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '项目备注',
+ `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
+ `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
+ `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+ `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'GoView 项目表';
+
+-- ----------------------------
+-- Records of report_go_view_project
+-- ----------------------------
+BEGIN;
+INSERT INTO `report_go_view_project` (`id`, `name`, `pic_url`, `content`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`) VALUES (6, 'HTTP示例', 'http://test.yudao.iocoder.cn/7c0cb26b09cfa97cae0b3e5d19b210978eed0ab184dd0bff1b66b3daf70a01fc.png', '{\n \"editCanvasConfig\": {\n \"projectName\": \"HTTP示例\",\n \"width\": 1920,\n \"height\": 1080,\n \"filterShow\": false,\n \"hueRotate\": 0,\n \"saturate\": 1,\n \"contrast\": 1,\n \"brightness\": 1,\n \"opacity\": 1,\n \"rotateZ\": 0,\n \"rotateX\": 0,\n \"rotateY\": 0,\n \"skewX\": 0,\n \"skewY\": 0,\n \"blendMode\": \"normal\",\n \"background\": null,\n \"backgroundImage\": null,\n \"selectColor\": true,\n \"chartThemeColor\": \"dark\",\n \"chartThemeSetting\": {\n \"title\": {\n \"show\": true,\n \"textStyle\": {\n \"color\": \"#BFBFBF\",\n \"fontSize\": 18\n },\n \"subtextStyle\": {\n \"color\": \"#A2A2A2\",\n \"fontSize\": 14\n }\n },\n \"xAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"bottom\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": false,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n }\n },\n \"yAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"left\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n }\n },\n \"legend\": {\n \"show\": true,\n \"top\": \"5%\",\n \"textStyle\": {\n \"color\": \"#B9B8CE\"\n }\n },\n \"grid\": {\n \"show\": false,\n \"left\": \"10%\",\n \"top\": \"60\",\n \"right\": \"10%\",\n \"bottom\": \"60\"\n },\n \"dataset\": null\n },\n \"previewScaleType\": \"fit\"\n },\n \"componentList\": [\n {\n \"id\": \"4vxgys8nh6g000\",\n \"isGroup\": false,\n \"attr\": {\n \"x\": 7,\n \"y\": 11,\n \"w\": 1898,\n \"h\": 1066,\n \"offsetX\": 0,\n \"offsetY\": 0,\n \"zIndex\": -1\n },\n \"styles\": {\n \"filterShow\": false,\n \"hueRotate\": 0,\n \"saturate\": 1,\n \"contrast\": 1,\n \"brightness\": 1,\n \"opacity\": 1,\n \"rotateZ\": 0,\n \"rotateX\": 0,\n \"rotateY\": 0,\n \"skewX\": 0,\n \"skewY\": 0,\n \"blendMode\": \"normal\",\n \"animations\": []\n },\n \"status\": {\n \"lock\": false,\n \"hide\": false\n },\n \"request\": {\n \"requestDataType\": 1,\n \"requestHttpType\": \"get\",\n \"requestUrl\": \"http://127.0.0.1:48080/admin-api/report/go-view/data/get-by-http\",\n \"requestInterval\": null,\n \"requestIntervalUnit\": \"second\",\n \"requestContentType\": 0,\n \"requestParamsBodyType\": \"none\",\n \"requestSQLContent\": {\n \"sql\": \"select * from where\"\n },\n \"requestParams\": {\n \"Body\": {\n \"form-data\": {},\n \"x-www-form-urlencoded\": {},\n \"json\": \"\",\n \"xml\": \"\"\n },\n \"Header\": {},\n \"Params\": {}\n }\n },\n \"filter\": null,\n \"events\": {\n \"baseEvent\": {\n \"click\": null,\n \"dblclick\": null,\n \"mouseenter\": null,\n \"mouseleave\": null\n },\n \"advancedEvents\": {\n \"vnodeMounted\": null,\n \"vnodeBeforeMount\": null\n }\n },\n \"key\": \"LineCommon\",\n \"chartConfig\": {\n \"key\": \"LineCommon\",\n \"chartKey\": \"VLineCommon\",\n \"conKey\": \"VCLineCommon\",\n \"title\": \"折线图\",\n \"category\": \"Lines\",\n \"categoryName\": \"折线图\",\n \"package\": \"Charts\",\n \"chartFrame\": \"echarts\",\n \"image\": \"line.png\"\n },\n \"option\": {\n \"legend\": {\n \"show\": true,\n \"top\": \"5%\",\n \"textStyle\": {\n \"color\": \"#B9B8CE\"\n }\n },\n \"xAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"bottom\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": false,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n },\n \"type\": \"category\"\n },\n \"yAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"left\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n },\n \"type\": \"value\"\n },\n \"grid\": {\n \"show\": false,\n \"left\": \"10%\",\n \"top\": \"60\",\n \"right\": \"10%\",\n \"bottom\": \"60\"\n },\n \"tooltip\": {\n \"show\": true,\n \"trigger\": \"axis\",\n \"axisPointer\": {\n \"type\": \"line\"\n }\n },\n \"dataset\": {\n \"dimensions\": [\n \"日期\",\n \"PV\",\n \"UV\"\n ],\n \"source\": [\n {\n \"UV\": 518,\n \"日期\": \"2021-01\",\n \"PV\": 7954\n },\n {\n \"UV\": 135,\n \"日期\": \"2021-02\",\n \"PV\": 9402\n },\n {\n \"UV\": 905,\n \"日期\": \"2021-03\",\n \"PV\": 1665\n },\n {\n \"UV\": 157,\n \"日期\": \"2021-04\",\n \"PV\": 2633\n },\n {\n \"UV\": 849,\n \"日期\": \"2021-05\",\n \"PV\": 7650\n },\n {\n \"UV\": 563,\n \"日期\": \"2021-06\",\n \"PV\": 2399\n },\n {\n \"UV\": 427,\n \"日期\": \"2021-07\",\n \"PV\": 9952\n },\n {\n \"UV\": 158,\n \"日期\": \"2021-08\",\n \"PV\": 9232\n },\n {\n \"UV\": 894,\n \"日期\": \"2021-09\",\n \"PV\": 3013\n },\n {\n \"UV\": 343,\n \"日期\": \"2021-10\",\n \"PV\": 6181\n },\n {\n \"UV\": 294,\n \"日期\": \"2021-11\",\n \"PV\": 8949\n },\n {\n \"UV\": 452,\n \"日期\": \"2021-12\",\n \"PV\": 8730\n }\n ]\n },\n \"series\": [\n {\n \"type\": \"line\",\n \"label\": {\n \"show\": true,\n \"position\": \"top\",\n \"color\": \"#fff\",\n \"fontSize\": 12\n },\n \"symbolSize\": 5,\n \"itemStyle\": {\n \"color\": null,\n \"borderRadius\": 0\n },\n \"lineStyle\": {\n \"type\": \"solid\",\n \"width\": 3,\n \"color\": null\n }\n },\n {\n \"type\": \"line\",\n \"label\": {\n \"show\": true,\n \"position\": \"top\",\n \"color\": \"#fff\",\n \"fontSize\": 12\n },\n \"symbolSize\": 5,\n \"itemStyle\": {\n \"color\": null,\n \"borderRadius\": 0\n },\n \"lineStyle\": {\n \"type\": \"solid\",\n \"width\": 3,\n \"color\": null\n }\n }\n ],\n \"backgroundColor\": \"rgba(0,0,0,0)\"\n }\n }\n ],\n \"requestGlobalConfig\": {\n \"requestDataPond\": [],\n \"requestOriginUrl\": \"\",\n \"requestInterval\": 30,\n \"requestIntervalUnit\": \"second\",\n \"requestParams\": {\n \"Body\": {\n \"form-data\": {},\n \"x-www-form-urlencoded\": {},\n \"json\": \"\",\n \"xml\": \"\"\n },\n \"Header\": {},\n \"Params\": {}\n }\n }\n}', 0, NULL, '1', '2023-02-07 11:38:22', '1', '2023-02-07 17:27:43', b'0', 1), (7, 'SQL示例', 'http://test.yudao.iocoder.cn/c1f570bad6ec7e7fa4a0a7c8f563da4ea158fde6e731da4dd1abe8ba9b6baeed.png', '{\n \"editCanvasConfig\": {\n \"projectName\": \"SQL示例\",\n \"width\": 1920,\n \"height\": 1080,\n \"filterShow\": false,\n \"hueRotate\": 0,\n \"saturate\": 1,\n \"contrast\": 1,\n \"brightness\": 1,\n \"opacity\": 1,\n \"rotateZ\": 0,\n \"rotateX\": 0,\n \"rotateY\": 0,\n \"skewX\": 0,\n \"skewY\": 0,\n \"blendMode\": \"normal\",\n \"background\": null,\n \"backgroundImage\": null,\n \"selectColor\": true,\n \"chartThemeColor\": \"dark\",\n \"chartThemeSetting\": {\n \"title\": {\n \"show\": true,\n \"textStyle\": {\n \"color\": \"#BFBFBF\",\n \"fontSize\": 18\n },\n \"subtextStyle\": {\n \"color\": \"#A2A2A2\",\n \"fontSize\": 14\n }\n },\n \"xAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"bottom\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": false,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n }\n },\n \"yAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"left\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n }\n },\n \"legend\": {\n \"show\": true,\n \"top\": \"5%\",\n \"textStyle\": {\n \"color\": \"#B9B8CE\"\n }\n },\n \"grid\": {\n \"show\": false,\n \"left\": \"10%\",\n \"top\": \"60\",\n \"right\": \"10%\",\n \"bottom\": \"60\"\n },\n \"dataset\": null\n },\n \"previewScaleType\": \"fit\"\n },\n \"componentList\": [\n {\n \"id\": \"5cqrghfle9g000\",\n \"isGroup\": false,\n \"attr\": {\n \"x\": 27,\n \"y\": 3,\n \"w\": 1870,\n \"h\": 1051,\n \"offsetX\": 0,\n \"offsetY\": 0,\n \"zIndex\": -1\n },\n \"styles\": {\n \"filterShow\": false,\n \"hueRotate\": 0,\n \"saturate\": 1,\n \"contrast\": 1,\n \"brightness\": 1,\n \"opacity\": 1,\n \"rotateZ\": 0,\n \"rotateX\": 0,\n \"rotateY\": 0,\n \"skewX\": 0,\n \"skewY\": 0,\n \"blendMode\": \"normal\",\n \"animations\": [\n \"headShake\"\n ]\n },\n \"status\": {\n \"lock\": false,\n \"hide\": false\n },\n \"request\": {\n \"requestDataType\": 1,\n \"requestHttpType\": \"post\",\n \"requestUrl\": \"http://127.0.0.1:48080/admin-api/report/go-view/data/get-by-sql\",\n \"requestInterval\": null,\n \"requestIntervalUnit\": \"second\",\n \"requestContentType\": 0,\n \"requestParamsBodyType\": \"none\",\n \"requestSQLContent\": {\n \"sql\": \"SELECT DATE_FORMAT(create_time, \\\"%Y-%m\\\") AS time, COUNT(*) AS \'次数\', COUNT(DISTINCT(user_id)) AS \'人数\' FROM system_login_log GROUP BY DATE_FORMAT(create_time, \\\"%Y-%m\\\")\"\n },\n \"requestParams\": {\n \"Body\": {\n \"form-data\": {},\n \"x-www-form-urlencoded\": {},\n \"json\": \"\",\n \"xml\": \"\"\n },\n \"Header\": {},\n \"Params\": {}\n }\n },\n \"filter\": null,\n \"events\": {\n \"baseEvent\": {\n \"click\": null,\n \"dblclick\": null,\n \"mouseenter\": null,\n \"mouseleave\": null\n },\n \"advancedEvents\": {\n \"vnodeMounted\": null,\n \"vnodeBeforeMount\": null\n }\n },\n \"key\": \"LineCommon\",\n \"chartConfig\": {\n \"key\": \"LineCommon\",\n \"chartKey\": \"VLineCommon\",\n \"conKey\": \"VCLineCommon\",\n \"title\": \"折线图\",\n \"category\": \"Lines\",\n \"categoryName\": \"折线图\",\n \"package\": \"Charts\",\n \"chartFrame\": \"echarts\",\n \"image\": \"line.png\"\n },\n \"option\": {\n \"legend\": {\n \"show\": true,\n \"top\": \"5%\",\n \"textStyle\": {\n \"color\": \"#B9B8CE\"\n }\n },\n \"xAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"bottom\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": false,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n },\n \"type\": \"category\"\n },\n \"yAxis\": {\n \"show\": true,\n \"name\": \"\",\n \"nameGap\": 15,\n \"nameTextStyle\": {\n \"color\": \"#B9B8CE\",\n \"fontSize\": 12\n },\n \"inverse\": false,\n \"axisLabel\": {\n \"show\": true,\n \"fontSize\": 12,\n \"color\": \"#B9B8CE\",\n \"rotate\": 0\n },\n \"position\": \"left\",\n \"axisLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#B9B8CE\",\n \"width\": 1\n },\n \"onZero\": true\n },\n \"axisTick\": {\n \"show\": true,\n \"length\": 5\n },\n \"splitLine\": {\n \"show\": true,\n \"lineStyle\": {\n \"color\": \"#484753\",\n \"width\": 1,\n \"type\": \"solid\"\n }\n },\n \"type\": \"value\"\n },\n \"grid\": {\n \"show\": false,\n \"left\": \"10%\",\n \"top\": \"60\",\n \"right\": \"10%\",\n \"bottom\": \"60\"\n },\n \"tooltip\": {\n \"show\": true,\n \"trigger\": \"axis\",\n \"axisPointer\": {\n \"type\": \"line\"\n }\n },\n \"dataset\": {\n \"dimensions\": [\n \"time\",\n \"次数\",\n \"人数\"\n ],\n \"source\": [\n {\n \"次数\": 94,\n \"time\": \"2022-05\",\n \"人数\": 5\n },\n {\n \"次数\": 120,\n \"time\": \"2022-06\",\n \"人数\": 2\n },\n {\n \"次数\": 118,\n \"time\": \"2022-07\",\n \"人数\": 5\n },\n {\n \"次数\": 37,\n \"time\": \"2022-08\",\n \"人数\": 2\n },\n {\n \"次数\": 65,\n \"time\": \"2022-09\",\n \"人数\": 2\n },\n {\n \"次数\": 35,\n \"time\": \"2022-10\",\n \"人数\": 2\n },\n {\n \"次数\": 86,\n \"time\": \"2022-11\",\n \"人数\": 1\n },\n {\n \"次数\": 49,\n \"time\": \"2022-12\",\n \"人数\": 3\n },\n {\n \"次数\": 45,\n \"time\": \"2023-01\",\n \"人数\": 1\n },\n {\n \"次数\": 70,\n \"time\": \"2023-02\",\n \"人数\": 1\n }\n ]\n },\n \"series\": [\n {\n \"type\": \"line\",\n \"label\": {\n \"show\": true,\n \"position\": \"top\",\n \"color\": \"#fff\",\n \"fontSize\": 12\n },\n \"symbolSize\": 5,\n \"itemStyle\": {\n \"color\": null,\n \"borderRadius\": 0\n },\n \"lineStyle\": {\n \"type\": \"solid\",\n \"width\": 3,\n \"color\": null\n }\n },\n {\n \"type\": \"line\",\n \"label\": {\n \"show\": true,\n \"position\": \"top\",\n \"color\": \"#fff\",\n \"fontSize\": 12\n },\n \"symbolSize\": 5,\n \"itemStyle\": {\n \"color\": null,\n \"borderRadius\": 0\n },\n \"lineStyle\": {\n \"type\": \"solid\",\n \"width\": 3,\n \"color\": null\n }\n }\n ],\n \"backgroundColor\": \"rgba(0,0,0,0)\"\n }\n }\n ],\n \"requestGlobalConfig\": {\n \"requestDataPond\": [],\n \"requestOriginUrl\": \"\",\n \"requestInterval\": 30,\n \"requestIntervalUnit\": \"second\",\n \"requestParams\": {\n \"Body\": {\n \"form-data\": {},\n \"x-www-form-urlencoded\": {},\n \"json\": \"\",\n \"xml\": \"\"\n },\n \"Header\": {},\n \"Params\": {}\n }\n }\n}', 0, NULL, '1', '2023-02-07 11:43:57', '1', '2023-02-07 17:27:40', b'0', 1), (8, '57q2gor533g000', NULL, NULL, 1, NULL, '1', '2023-02-07 19:27:09', '1', '2023-02-07 19:27:09', b'0', 1);
+COMMIT;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/enums/ServiceErrorCodeRange.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/enums/ServiceErrorCodeRange.java
index e3cfc453f..c3e504a7c 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/enums/ServiceErrorCodeRange.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/enums/ServiceErrorCodeRange.java
@@ -31,6 +31,7 @@ public class ServiceErrorCodeRange {
// 模块 infra 错误码区间 [1-001-000-000 ~ 1-002-000-000)
// 模块 system 错误码区间 [1-002-000-000 ~ 1-003-000-000)
+ // 模块 report 错误码区间 [1-003-000-000 ~ 1-004-000-000)
// 模块 member 错误码区间 [1-004-000-000 ~ 1-005-000-000)
// 模块 pay 错误码区间 [1-007-000-000 ~ 1-008-000-000)
// 模块 bpm 错误码区间 [1-009-000-000 ~ 1-010-000-000)
diff --git a/yudao-framework/yudao-spring-boot-starter-banner/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java b/yudao-framework/yudao-spring-boot-starter-banner/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java
index c01d419f4..71fd99a5f 100644
--- a/yudao-framework/yudao-spring-boot-starter-banner/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java
+++ b/yudao-framework/yudao-spring-boot-starter-banner/src/main/java/cn/iocoder/yudao/framework/banner/core/BannerApplicationRunner.java
@@ -33,8 +33,8 @@ public class BannerApplicationRunner implements ApplicationRunner {
"https://t.zsxq.com/02B6ujIee");
// 数据报表
- if (isNotPresent("cn.iocoder.yudao.module.visualization.framework.security.config.SecurityConfiguration")) {
- System.out.println("[报表模块 yudao-module-visualization - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]");
+ if (isNotPresent("cn.iocoder.yudao.module.report.framework.security.config.SecurityConfiguration")) {
+ System.out.println("[报表模块 yudao-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]");
}
// 工作流
if (isNotPresent("cn.iocoder.yudao.framework.flowable.config.YudaoFlowableConfiguration")) {
diff --git a/yudao-module-visualization/pom.xml b/yudao-module-report/pom.xml
similarity index 69%
rename from yudao-module-visualization/pom.xml
rename to yudao-module-report/pom.xml
index 63c2c6f4a..fadb0740b 100644
--- a/yudao-module-visualization/pom.xml
+++ b/yudao-module-report/pom.xml
@@ -9,15 +9,15 @@
4.0.0
- yudao-module-visualization-api
- yudao-module-visualization-biz
+ yudao-module-report-api
+ yudao-module-report-biz
- yudao-module-visualization
+ yudao-module-report
pom
${project.artifactId}
- visualization 模块,主要实现数据可视化报表等功能。
+ report 模块,主要实现数据可视化报表等功能。
-
\ No newline at end of file
+
diff --git a/yudao-module-visualization/yudao-module-visualization-api/pom.xml b/yudao-module-report/yudao-module-report-api/pom.xml
similarity index 78%
rename from yudao-module-visualization/yudao-module-visualization-api/pom.xml
rename to yudao-module-report/yudao-module-report-api/pom.xml
index 0b5217d1b..3effa4323 100644
--- a/yudao-module-visualization/yudao-module-visualization-api/pom.xml
+++ b/yudao-module-report/yudao-module-report-api/pom.xml
@@ -4,17 +4,17 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
cn.iocoder.boot
- yudao-module-visualization
+ yudao-module-report
${revision}
4.0.0
- yudao-module-visualization-api
+ yudao-module-report-api
jar
${project.artifactId}
- visualization 模块 API,暴露给其它模块调用
+ report 模块 API,暴露给其它模块调用
@@ -23,4 +23,4 @@
yudao-common
-
\ No newline at end of file
+
diff --git a/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/api/package-info.java b/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/api/package-info.java
new file mode 100644
index 000000000..827bef3fd
--- /dev/null
+++ b/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/api/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * 占位,避免 api 目录无文件时,git 无法提交
+ */
+package cn.iocoder.yudao.module.report.api;
diff --git a/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java b/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java
new file mode 100644
index 000000000..d90bed398
--- /dev/null
+++ b/yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java
@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.report.enums;
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * Report 错误码枚举类
+ *
+ * system 系统,使用 1-003-000-000 段
+ */
+public interface ErrorCodeConstants {
+
+ // ========== AUTH 模块 1003000000 ==========
+ ErrorCode GO_VIEW_PROJECT_NOT_EXISTS = new ErrorCode(1003000000, "GoView 项目不存在");
+
+}
diff --git a/yudao-module-visualization/yudao-module-visualization-biz/pom.xml b/yudao-module-report/yudao-module-report-biz/pom.xml
similarity index 90%
rename from yudao-module-visualization/yudao-module-visualization-biz/pom.xml
rename to yudao-module-report/yudao-module-report-biz/pom.xml
index a2e4818de..9308fc386 100644
--- a/yudao-module-visualization/yudao-module-visualization-biz/pom.xml
+++ b/yudao-module-report/yudao-module-report-biz/pom.xml
@@ -4,23 +4,23 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
cn.iocoder.boot
- yudao-module-visualization
+ yudao-module-report
${revision}
4.0.0
- yudao-module-visualization-biz
+ yudao-module-report-biz
jar
${project.artifactId}
- visualization 模块,主要实现数据可视化报表等功能:
+ report 模块,主要实现数据可视化报表等功能:
1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。
cn.iocoder.boot
- yudao-module-visualization-api
+ yudao-module-report-api
${revision}
diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ajreport/package-info.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ajreport/package-info.java
new file mode 100644
index 000000000..e32b8b916
--- /dev/null
+++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ajreport/package-info.java
@@ -0,0 +1 @@
+package cn.iocoder.yudao.module.report.controller.admin.ajreport;
diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewDataController.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewDataController.java
new file mode 100644
index 000000000..ee0b69225
--- /dev/null
+++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewDataController.java
@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.report.controller.admin.goview;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
+import cn.iocoder.yudao.module.report.controller.admin.goview.vo.data.GoViewDataGetBySqlReqVO;
+import cn.iocoder.yudao.module.report.controller.admin.goview.vo.data.GoViewDataRespVO;
+import cn.iocoder.yudao.module.report.service.goview.GoViewDataService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import java.util.*;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - GoView 数据", description = "提供 SQL、HTTP 等数据查询的能力")
+@RestController
+@RequestMapping("/report/go-view/data")
+@Validated
+public class GoViewDataController {
+
+ @Resource
+ private GoViewDataService goViewDataService;
+
+ @RequestMapping("/get-by-sql")
+ @Operation(summary = "使用 SQL 查询数据")
+ @PreAuthorize("@ss.hasPermission('report:go-view-data:get-by-sql')")
+ @OperateLog(enable = false) // 不记录操作日志,因为不需要
+ public CommonResult getDataBySQL(@Valid @RequestBody GoViewDataGetBySqlReqVO reqVO) {
+ return success(goViewDataService.getDataBySQL(reqVO.getSql()));
+ }
+
+ @RequestMapping("/get-by-http")
+ @Operation(summary = "使用 HTTP 查询数据", description = "这个只是示例接口,实际应该每个查询,都要写一个接口")
+ @PreAuthorize("@ss.hasPermission('report:go-view-data:get-by-http')")
+ @OperateLog(enable = false) // 不记录操作日志,因为不需要
+ public CommonResult getDataByHttp(
+ @RequestParam(required = false) Map params,
+ @RequestBody(required = false) String body) { // params、body 按照需要去接收,这里仅仅是示例
+ GoViewDataRespVO respVO = new GoViewDataRespVO();
+ // 1. 数据维度
+ respVO.setDimensions(Arrays.asList("日期", "PV", "UV")); // PV 是每天访问次数;UV 是每天访问人数
+ // 2. 明细数据列表
+ // 目前通过随机的方式生成。一般来说,这里你可以写逻辑来实现数据的返回
+ respVO.setSource(new LinkedList<>());
+ for (int i = 1; i <= 12; i++) {
+ String date = "2021-" + (i < 10 ? "0" + i : i);
+ Integer pv = RandomUtil.randomInt(1000, 10000);
+ Integer uv = RandomUtil.randomInt(100, 1000);
+ respVO.getSource().add(MapUtil.builder().put("日期", date)
+ .put("PV", pv).put("UV", uv).build());
+ }
+ return success(respVO);
+ }
+
+}
diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewProjectController.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewProjectController.java
new file mode 100644
index 000000000..8cc5f7e1f
--- /dev/null
+++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewProjectController.java
@@ -0,0 +1,77 @@
+package cn.iocoder.yudao.module.report.controller.admin.goview;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectCreateReqVO;
+import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectRespVO;
+import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectUpdateReqVO;
+import cn.iocoder.yudao.module.report.convert.goview.GoViewProjectConvert;
+import cn.iocoder.yudao.module.report.dal.dataobject.goview.GoViewProjectDO;
+import cn.iocoder.yudao.module.report.service.goview.GoViewProjectService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - GoView 项目")
+@RestController
+@RequestMapping("/report/go-view/project")
+@Validated
+public class GoViewProjectController {
+
+ @Resource
+ private GoViewProjectService goViewProjectService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建项目")
+ @PreAuthorize("@ss.hasPermission('report:go-view-project:create')")
+ public CommonResult createProject(@Valid @RequestBody GoViewProjectCreateReqVO createReqVO) {
+ return success(goViewProjectService.createProject(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新项目")
+ @PreAuthorize("@ss.hasPermission('report:go-view-project:update')")
+ public CommonResult updateProject(@Valid @RequestBody GoViewProjectUpdateReqVO updateReqVO) {
+ goViewProjectService.updateProject(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除 GoView 项目")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('report:go-view-project:delete')")
+ public CommonResult deleteProject(@RequestParam("id") Long id) {
+ goViewProjectService.deleteProject(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得项目")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('report:go-view-project:query')")
+ public CommonResult getProject(@RequestParam("id") Long id) {
+ GoViewProjectDO project = goViewProjectService.getProject(id);
+ return success(GoViewProjectConvert.INSTANCE.convert(project));
+ }
+
+ @GetMapping("/my-page")
+ @Operation(summary = "获得我的项目分页")
+ @PreAuthorize("@ss.hasPermission('report:go-view-project:query')")
+ public CommonResult> getMyProjectPage(@Valid PageParam pageVO) {
+ PageResult pageResult = goViewProjectService.getMyProjectPage(
+ pageVO, getLoginUserId());
+ return success(GoViewProjectConvert.INSTANCE.convertPage(pageResult));
+ }
+
+}
diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/data/GoViewDataGetBySqlReqVO.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/data/GoViewDataGetBySqlReqVO.java
new file mode 100644
index 000000000..598d7539f
--- /dev/null
+++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/data/GoViewDataGetBySqlReqVO.java
@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.module.report.controller.admin.goview.vo.data;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+
+@Schema(description = "管理后台 - GoView 使用 SQL 查询数据 Request VO")
+@Data
+public class GoViewDataGetBySqlReqVO {
+
+ @Schema(description = "SQL 语句", required = true, example = "SELECT * FROM user")
+ @NotEmpty(message = "SQL 语句不能为空")
+ private String sql;
+
+}
diff --git a/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/data/GoViewDataRespVO.java b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/data/GoViewDataRespVO.java
new file mode 100644
index 000000000..0d7b86138
--- /dev/null
+++ b/yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/data/GoViewDataRespVO.java
@@ -0,0 +1,19 @@
+package cn.iocoder.yudao.module.report.controller.admin.goview.vo.data;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Schema(description = "管理后台 - GoView 数据 Response VO")
+@Data
+public class GoViewDataRespVO {
+
+ @Schema(description = "数据维度", required = true, example = "['product', 'data1', 'data2']")
+ private List dimensions;
+
+ @Schema(description = "数据明细列表", required = true)
+ private List