Commit a397a57bfa101e7df678ec1aba5dacfbaac08fcc

Authored by 芋道源码
Committed by Gitee
2 parents 745d386e fb45a70b

!403 集成 Go-View 大屏设计器

Merge pull request !403 from 芋道源码/feature/dev-yunai
Showing 54 changed files with 1116 additions and 150 deletions
README.md
... ... @@ -34,7 +34,7 @@
34 34 * 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验
35 35 * 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款
36 36 * 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务
37   -* 集成报表设计器,支持数据报表、图形报表、打印设计等
  37 +* 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏
38 38  
39 39 | 项目名 | 说明 | 传送门 |
40 40 |----------------------|------------------------|-------------------------------------------------------------------------------------------------------------------------------------|
... ... @@ -171,10 +171,10 @@ ps:核心功能已经实现,正在对接微信小程序中...
171 171  
172 172 ### 数据报表
173 173  
174   -| | 功能 | 描述 |
175   -|-----|----------|----------------------------------------------|
176   -| 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 |
177   -| 🚀 | 大屏设计器 | 建设中... 拖拽式实现可视化数据大屏 |
  174 +| | 功能 | 描述 |
  175 +|-----|-------|--------------------|
  176 +| 🚀 | 报表设计器 | 支持数据报表、图形报表、打印设计等 |
  177 +| 🚀 | 大屏设计器 | 拖拽生成数据大屏,内置几十种图表组件 |
178 178  
179 179 ### 微信公众号
180 180  
... ... @@ -207,23 +207,23 @@ ps:核心功能已经实现,正在对接微信小程序中...
207 207  
208 208 ## 🐨 技术栈
209 209  
210   -| 项目 | 说明 |
211   -|------------------------------|--------------------|
212   -| `yudao-dependencies` | Maven 依赖版本管理 |
213   -| `yudao-framework` | Java 框架拓展 |
214   -| `yudao-server` | 管理后台 + 用户 APP 的服务端 |
215   -| `yudao-ui-admin` | 管理后台的 Vue2 前端项目 |
216   -| `yudao-ui-admin-vue3` | 管理后台的 Vue3 前端项目 |
217   -| `yudao-ui-admin-uniapp` | 管理后台的 uni-app 多端项目 |
218   -| `yudao-ui-app` | 用户 APP 的 UI 界面 |
219   -| `yudao-module-system` | 系统功能的 Module 模块 |
220   -| `yudao-module-member` | 会员中心的 Module 模块 |
221   -| `yudao-module-infra` | 基础设施的 Module 模块 |
222   -| `yudao-module-bpm` | 工作流程的 Module 模块 |
223   -| `yudao-module-pay` | 支付系统的 Module 模块 |
224   -| `yudao-module-mall` | 商城系统的 Module 模块 |
225   -| `yudao-module-mp` | 微信公众号的 Module 模块 |
226   -| `yudao-module-visualization` | 大屏报表 Module 模块 |
  210 +| 项目 | 说明 |
  211 +|-------------------------|--------------------|
  212 +| `yudao-dependencies` | Maven 依赖版本管理 |
  213 +| `yudao-framework` | Java 框架拓展 |
  214 +| `yudao-server` | 管理后台 + 用户 APP 的服务端 |
  215 +| `yudao-ui-admin` | 管理后台的 Vue2 前端项目 |
  216 +| `yudao-ui-admin-vue3` | 管理后台的 Vue3 前端项目 |
  217 +| `yudao-ui-admin-uniapp` | 管理后台的 uni-app 多端项目 |
  218 +| `yudao-ui-app` | 用户 APP 的 UI 界面 |
  219 +| `yudao-module-system` | 系统功能的 Module 模块 |
  220 +| `yudao-module-member` | 会员中心的 Module 模块 |
  221 +| `yudao-module-infra` | 基础设施的 Module 模块 |
  222 +| `yudao-module-bpm` | 工作流程的 Module 模块 |
  223 +| `yudao-module-pay` | 支付系统的 Module 模块 |
  224 +| `yudao-module-mall` | 商城系统的 Module 模块 |
  225 +| `yudao-module-mp` | 微信公众号的 Module 模块 |
  226 +| `yudao-module-report` | 大屏报表 Module 模块 |
227 227  
228 228 ### 后端
229 229  
... ... @@ -324,9 +324,10 @@ ps:核心功能已经实现,正在对接微信小程序中...
324 324  
325 325 ### 数据报表
326 326  
327   -| 模块 | biu | biu | biu |
328   -|---------|------------------------------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------------|
  327 +| 模块 | biu | biu | biu |
  328 +|-------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------|
329 329 | 报表设计器 | ![数据报表](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) |
  330 +| 大屏设计器 | ![大屏列表](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) |
330 331  
331 332 ### 移动端(管理后台)
332 333  
... ...
... ... @@ -18,7 +18,7 @@
18 18 <module>yudao-module-infra</module>
19 19 <module>yudao-module-pay</module>
20 20 <!-- <module>yudao-module-bpm</module>-->
21   -<!-- <module>yudao-module-visualization</module>-->
  21 +<!-- <module>yudao-module-report</module>-->
22 22 <!-- <module>yudao-module-mp</module>-->
23 23 <!-- <module>yudao-module-mall</module>-->
24 24 <!-- 示例项目 -->
... ...
sql/mysql/optional/go-view.sql 0 → 100644
  1 +/*
  2 + Navicat Premium Data Transfer
  3 +
  4 + Source Server : 127.0.0.1 MySQL
  5 + Source Server Type : MySQL
  6 + Source Server Version : 80026
  7 + Source Host : localhost:3306
  8 + Source Schema : ruoyi-vue-pro
  9 +
  10 + Target Server Type : MySQL
  11 + Target Server Version : 80026
  12 + File Encoding : 65001
  13 +
  14 + Date: 07/02/2023 22:00:03
  15 +*/
  16 +
  17 +SET NAMES utf8mb4;
  18 +SET FOREIGN_KEY_CHECKS = 0;
  19 +
  20 +-- ----------------------------
  21 +-- Table structure for report_go_view_project
  22 +-- ----------------------------
  23 +DROP TABLE IF EXISTS `report_go_view_project`;
  24 +CREATE TABLE `report_go_view_project` (
  25 + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  26 + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '项目名称',
  27 + `pic_url` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '预览图片 URL',
  28 + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '报表内容',
  29 + `status` tinyint NOT NULL COMMENT '发布状态',
  30 + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '项目备注',
  31 + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
  32 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  33 + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
  34 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  35 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  36 + `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
  37 + PRIMARY KEY (`id`) USING BTREE
  38 +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = 'GoView 项目表';
  39 +
  40 +-- ----------------------------
  41 +-- Records of report_go_view_project
  42 +-- ----------------------------
  43 +BEGIN;
  44 +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);
  45 +COMMIT;
  46 +
  47 +SET FOREIGN_KEY_CHECKS = 1;
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/exception/enums/ServiceErrorCodeRange.java
... ... @@ -31,6 +31,7 @@ public class ServiceErrorCodeRange {
31 31  
32 32 // 模块 infra 错误码区间 [1-001-000-000 ~ 1-002-000-000)
33 33 // 模块 system 错误码区间 [1-002-000-000 ~ 1-003-000-000)
  34 + // 模块 report 错误码区间 [1-003-000-000 ~ 1-004-000-000)
34 35 // 模块 member 错误码区间 [1-004-000-000 ~ 1-005-000-000)
35 36 // 模块 pay 错误码区间 [1-007-000-000 ~ 1-008-000-000)
36 37 // 模块 bpm 错误码区间 [1-009-000-000 ~ 1-010-000-000)
... ...
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 {
33 33 "https://t.zsxq.com/02B6ujIee");
34 34  
35 35 // 数据报表
36   - if (isNotPresent("cn.iocoder.yudao.module.visualization.framework.security.config.SecurityConfiguration")) {
37   - System.out.println("[报表模块 yudao-module-visualization - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]");
  36 + if (isNotPresent("cn.iocoder.yudao.module.report.framework.security.config.SecurityConfiguration")) {
  37 + System.out.println("[报表模块 yudao-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]");
38 38 }
39 39 // 工作流
40 40 if (isNotPresent("cn.iocoder.yudao.framework.flowable.config.YudaoFlowableConfiguration")) {
... ... @@ -44,9 +44,9 @@ public class BannerApplicationRunner implements ApplicationRunner {
44 44 if (isNotPresent("cn.iocoder.yudao.module.mp.framework.mp.config.MpConfiguration")) {
45 45 System.out.println("[微信公众号 yudao-module-mp - 已禁用][参考 https://doc.iocoder.cn/mp/build/ 开启]");
46 46 }
47   - // 微信公众号
  47 + // 商城
48 48 if (isNotPresent("cn.iocoder.yudao.module.trade.framework.web.config.TradeWebConfiguration")) {
49   - System.out.println("[商城 yudao-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]");
  49 + System.out.println("[商城系统 yudao-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]");
50 50 }
51 51 });
52 52 }
... ...
yudao-module-visualization/pom.xml renamed to yudao-module-report/pom.xml
... ... @@ -9,15 +9,15 @@
9 9 </parent>
10 10 <modelVersion>4.0.0</modelVersion>
11 11 <modules>
12   - <module>yudao-module-visualization-api</module>
13   - <module>yudao-module-visualization-biz</module>
  12 + <module>yudao-module-report-api</module>
  13 + <module>yudao-module-report-biz</module>
14 14 </modules>
15   - <artifactId>yudao-module-visualization</artifactId>
  15 + <artifactId>yudao-module-report</artifactId>
16 16 <packaging>pom</packaging>
17 17  
18 18 <name>${project.artifactId}</name>
19 19 <description>
20   - visualization 模块,主要实现数据可视化报表等功能。
  20 + report 模块,主要实现数据可视化报表等功能。
21 21 </description>
22 22  
23   -</project>
24 23 \ No newline at end of file
  24 +</project>
... ...
yudao-module-visualization/yudao-module-visualization-api/pom.xml renamed to yudao-module-report/yudao-module-report-api/pom.xml
... ... @@ -4,17 +4,17 @@
4 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 5 <parent>
6 6 <groupId>cn.iocoder.boot</groupId>
7   - <artifactId>yudao-module-visualization</artifactId>
  7 + <artifactId>yudao-module-report</artifactId>
8 8 <version>${revision}</version>
9 9 </parent>
10 10 <modelVersion>4.0.0</modelVersion>
11 11  
12   - <artifactId>yudao-module-visualization-api</artifactId>
  12 + <artifactId>yudao-module-report-api</artifactId>
13 13 <packaging>jar</packaging>
14 14  
15 15 <name>${project.artifactId}</name>
16 16 <description>
17   - visualization 模块 API,暴露给其它模块调用
  17 + report 模块 API,暴露给其它模块调用
18 18 </description>
19 19  
20 20 <dependencies>
... ... @@ -23,4 +23,4 @@
23 23 <artifactId>yudao-common</artifactId>
24 24 </dependency>
25 25 </dependencies>
26   -</project>
27 26 \ No newline at end of file
  27 +</project>
... ...
yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/api/package-info.java 0 → 100644
  1 +/**
  2 + * 占位,避免 api 目录无文件时,git 无法提交
  3 + */
  4 +package cn.iocoder.yudao.module.report.api;
... ...
yudao-module-report/yudao-module-report-api/src/main/java/cn/iocoder/yudao/module/report/enums/ErrorCodeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.enums;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ErrorCode;
  4 +
  5 +/**
  6 + * Report 错误码枚举类
  7 + *
  8 + * system 系统,使用 1-003-000-000 段
  9 + */
  10 +public interface ErrorCodeConstants {
  11 +
  12 + // ========== AUTH 模块 1003000000 ==========
  13 + ErrorCode GO_VIEW_PROJECT_NOT_EXISTS = new ErrorCode(1003000000, "GoView 项目不存在");
  14 +
  15 +}
... ...
yudao-module-visualization/yudao-module-visualization-biz/pom.xml renamed to yudao-module-report/yudao-module-report-biz/pom.xml
... ... @@ -4,23 +4,23 @@
4 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 5 <parent>
6 6 <groupId>cn.iocoder.boot</groupId>
7   - <artifactId>yudao-module-visualization</artifactId>
  7 + <artifactId>yudao-module-report</artifactId>
8 8 <version>${revision}</version>
9 9 </parent>
10 10 <modelVersion>4.0.0</modelVersion>
11 11  
12   - <artifactId>yudao-module-visualization-biz</artifactId>
  12 + <artifactId>yudao-module-report-biz</artifactId>
13 13 <packaging>jar</packaging>
14 14  
15 15 <name>${project.artifactId}</name>
16 16 <description>
17   - visualization 模块,主要实现数据可视化报表等功能:
  17 + report 模块,主要实现数据可视化报表等功能:
18 18 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。
19 19 </description>
20 20 <dependencies>
21 21 <dependency>
22 22 <groupId>cn.iocoder.boot</groupId>
23   - <artifactId>yudao-module-visualization-api</artifactId>
  23 + <artifactId>yudao-module-report-api</artifactId>
24 24 <version>${revision}</version>
25 25 </dependency>
26 26  
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/ajreport/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.controller.admin.ajreport;
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewDataController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.controller.admin.goview;
  2 +
  3 +import cn.hutool.core.map.MapUtil;
  4 +import cn.hutool.core.util.RandomUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  6 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  7 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.data.GoViewDataGetBySqlReqVO;
  8 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.data.GoViewDataRespVO;
  9 +import cn.iocoder.yudao.module.report.service.goview.GoViewDataService;
  10 +import io.swagger.v3.oas.annotations.Operation;
  11 +import io.swagger.v3.oas.annotations.tags.Tag;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
  13 +import org.springframework.validation.annotation.Validated;
  14 +import org.springframework.web.bind.annotation.RequestBody;
  15 +import org.springframework.web.bind.annotation.RequestMapping;
  16 +import org.springframework.web.bind.annotation.RequestParam;
  17 +import org.springframework.web.bind.annotation.RestController;
  18 +
  19 +import javax.annotation.Resource;
  20 +import javax.validation.Valid;
  21 +
  22 +import java.util.*;
  23 +
  24 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  25 +
  26 +@Tag(name = "管理后台 - GoView 数据", description = "提供 SQL、HTTP 等数据查询的能力")
  27 +@RestController
  28 +@RequestMapping("/report/go-view/data")
  29 +@Validated
  30 +public class GoViewDataController {
  31 +
  32 + @Resource
  33 + private GoViewDataService goViewDataService;
  34 +
  35 + @RequestMapping("/get-by-sql")
  36 + @Operation(summary = "使用 SQL 查询数据")
  37 + @PreAuthorize("@ss.hasPermission('report:go-view-data:get-by-sql')")
  38 + @OperateLog(enable = false) // 不记录操作日志,因为不需要
  39 + public CommonResult<GoViewDataRespVO> getDataBySQL(@Valid @RequestBody GoViewDataGetBySqlReqVO reqVO) {
  40 + return success(goViewDataService.getDataBySQL(reqVO.getSql()));
  41 + }
  42 +
  43 + @RequestMapping("/get-by-http")
  44 + @Operation(summary = "使用 HTTP 查询数据", description = "这个只是示例接口,实际应该每个查询,都要写一个接口")
  45 + @PreAuthorize("@ss.hasPermission('report:go-view-data:get-by-http')")
  46 + @OperateLog(enable = false) // 不记录操作日志,因为不需要
  47 + public CommonResult<GoViewDataRespVO> getDataByHttp(
  48 + @RequestParam(required = false) Map<String, String> params,
  49 + @RequestBody(required = false) String body) { // params、body 按照需要去接收,这里仅仅是示例
  50 + GoViewDataRespVO respVO = new GoViewDataRespVO();
  51 + // 1. 数据维度
  52 + respVO.setDimensions(Arrays.asList("日期", "PV", "UV")); // PV 是每天访问次数;UV 是每天访问人数
  53 + // 2. 明细数据列表
  54 + // 目前通过随机的方式生成。一般来说,这里你可以写逻辑来实现数据的返回
  55 + respVO.setSource(new LinkedList<>());
  56 + for (int i = 1; i <= 12; i++) {
  57 + String date = "2021-" + (i < 10 ? "0" + i : i);
  58 + Integer pv = RandomUtil.randomInt(1000, 10000);
  59 + Integer uv = RandomUtil.randomInt(100, 1000);
  60 + respVO.getSource().add(MapUtil.<String, Object>builder().put("日期", date)
  61 + .put("PV", pv).put("UV", uv).build());
  62 + }
  63 + return success(respVO);
  64 + }
  65 +
  66 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/GoViewProjectController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.controller.admin.goview;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectCreateReqVO;
  7 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectRespVO;
  8 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectUpdateReqVO;
  9 +import cn.iocoder.yudao.module.report.convert.goview.GoViewProjectConvert;
  10 +import cn.iocoder.yudao.module.report.dal.dataobject.goview.GoViewProjectDO;
  11 +import cn.iocoder.yudao.module.report.service.goview.GoViewProjectService;
  12 +import io.swagger.v3.oas.annotations.Operation;
  13 +import io.swagger.v3.oas.annotations.Parameter;
  14 +import io.swagger.v3.oas.annotations.tags.Tag;
  15 +import org.springframework.jdbc.core.JdbcTemplate;
  16 +import org.springframework.security.access.prepost.PreAuthorize;
  17 +import org.springframework.validation.annotation.Validated;
  18 +import org.springframework.web.bind.annotation.*;
  19 +
  20 +import javax.annotation.Resource;
  21 +import javax.validation.Valid;
  22 +
  23 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  24 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  25 +
  26 +@Tag(name = "管理后台 - GoView 项目")
  27 +@RestController
  28 +@RequestMapping("/report/go-view/project")
  29 +@Validated
  30 +public class GoViewProjectController {
  31 +
  32 + @Resource
  33 + private GoViewProjectService goViewProjectService;
  34 +
  35 + @PostMapping("/create")
  36 + @Operation(summary = "创建项目")
  37 + @PreAuthorize("@ss.hasPermission('report:go-view-project:create')")
  38 + public CommonResult<Long> createProject(@Valid @RequestBody GoViewProjectCreateReqVO createReqVO) {
  39 + return success(goViewProjectService.createProject(createReqVO));
  40 + }
  41 +
  42 + @PutMapping("/update")
  43 + @Operation(summary = "更新项目")
  44 + @PreAuthorize("@ss.hasPermission('report:go-view-project:update')")
  45 + public CommonResult<Boolean> updateProject(@Valid @RequestBody GoViewProjectUpdateReqVO updateReqVO) {
  46 + goViewProjectService.updateProject(updateReqVO);
  47 + return success(true);
  48 + }
  49 +
  50 + @DeleteMapping("/delete")
  51 + @Operation(summary = "删除 GoView 项目")
  52 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  53 + @PreAuthorize("@ss.hasPermission('report:go-view-project:delete')")
  54 + public CommonResult<Boolean> deleteProject(@RequestParam("id") Long id) {
  55 + goViewProjectService.deleteProject(id);
  56 + return success(true);
  57 + }
  58 +
  59 + @GetMapping("/get")
  60 + @Operation(summary = "获得项目")
  61 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  62 + @PreAuthorize("@ss.hasPermission('report:go-view-project:query')")
  63 + public CommonResult<GoViewProjectRespVO> getProject(@RequestParam("id") Long id) {
  64 + GoViewProjectDO project = goViewProjectService.getProject(id);
  65 + return success(GoViewProjectConvert.INSTANCE.convert(project));
  66 + }
  67 +
  68 + @GetMapping("/my-page")
  69 + @Operation(summary = "获得我的项目分页")
  70 + @PreAuthorize("@ss.hasPermission('report:go-view-project:query')")
  71 + public CommonResult<PageResult<GoViewProjectRespVO>> getMyProjectPage(@Valid PageParam pageVO) {
  72 + PageResult<GoViewProjectDO> pageResult = goViewProjectService.getMyProjectPage(
  73 + pageVO, getLoginUserId());
  74 + return success(GoViewProjectConvert.INSTANCE.convertPage(pageResult));
  75 + }
  76 +
  77 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/data/GoViewDataGetBySqlReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.controller.admin.goview.vo.data;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotEmpty;
  7 +
  8 +@Schema(description = "管理后台 - GoView 使用 SQL 查询数据 Request VO")
  9 +@Data
  10 +public class GoViewDataGetBySqlReqVO {
  11 +
  12 + @Schema(description = "SQL 语句", required = true, example = "SELECT * FROM user")
  13 + @NotEmpty(message = "SQL 语句不能为空")
  14 + private String sql;
  15 +
  16 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/data/GoViewDataRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.controller.admin.goview.vo.data;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.util.List;
  7 +import java.util.Map;
  8 +
  9 +@Schema(description = "管理后台 - GoView 数据 Response VO")
  10 +@Data
  11 +public class GoViewDataRespVO {
  12 +
  13 + @Schema(description = "数据维度", required = true, example = "['product', 'data1', 'data2']")
  14 + private List<String> dimensions;
  15 +
  16 + @Schema(description = "数据明细列表", required = true)
  17 + private List<Map<String, Object>> source;
  18 +
  19 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/project/GoViewProjectCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.controller.admin.goview.vo.project;
  2 +
  3 +import lombok.*;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import javax.validation.constraints.*;
  6 +
  7 +@Schema(description = "管理后台 - GoView 项目创建 Request VO")
  8 +@Data
  9 +public class GoViewProjectCreateReqVO {
  10 +
  11 + @Schema(description = "项目名称", required = true, example = "王五")
  12 + @NotEmpty(message = "项目名称不能为空")
  13 + private String name;
  14 +
  15 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/project/GoViewProjectRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.controller.admin.goview.vo.project;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.*;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - GoView 项目 Response VO")
  9 +@Data
  10 +public class GoViewProjectRespVO {
  11 +
  12 + @Schema(description = "编号", required = true, example = "18993")
  13 + private Long id;
  14 +
  15 + @Schema(description = "项目名称", required = true, example = "王五")
  16 + private String name;
  17 +
  18 + @Schema(description = "发布状态", required = true, example = "1")
  19 + private Integer status;
  20 +
  21 + @Schema(description = "报表内容") // JSON 格式
  22 + private String content;
  23 +
  24 + @Schema(description = "预览图片 URL", example = "https://www.iocoder.cn")
  25 + private String picUrl;
  26 +
  27 + @Schema(description = "项目备注", example = "你猜")
  28 + private String remark;
  29 +
  30 + @Schema(description = "创建人编号", required = true, example = "1024")
  31 + private String creator;
  32 +
  33 + @Schema(description = "创建时间", required = true)
  34 + private LocalDateTime createTime;
  35 +
  36 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/admin/goview/vo/project/GoViewProjectUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.controller.admin.goview.vo.project;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import lombok.*;
  7 +
  8 +import javax.validation.constraints.*;
  9 +
  10 +@Schema(description = "管理后台 - GoView 项目更新 Request VO")
  11 +@Data
  12 +public class GoViewProjectUpdateReqVO {
  13 +
  14 + @Schema(description = "编号", required = true, example = "18993")
  15 + @NotNull(message = "编号不能为空")
  16 + private Long id;
  17 +
  18 + @Schema(description = "项目名称", required = true, example = "王五")
  19 + private String name;
  20 +
  21 + @Schema(description = "发布状态", required = true, example = "1")
  22 + @InEnum(value = CommonStatusEnum.class, message = "发布状态必须是 {value}")
  23 + private Integer status;
  24 +
  25 + @Schema(description = "报表内容") // JSON 格式
  26 + private String content;
  27 +
  28 + @Schema(description = "预览图片 URL", example = "https://www.iocoder.cn")
  29 + private String picUrl;
  30 +
  31 + @Schema(description = "项目备注", example = "你猜")
  32 + private String remark;
  33 +
  34 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/controller/package-info.java 0 → 100644
  1 +/**
  2 + * 提供 RESTful API 给前端:
  3 + * 1. admin 包:提供给管理后台 yudao-ui-admin 前端项目
  4 + * 2. app 包:提供给用户 APP yudao-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分
  5 + */
  6 +package cn.iocoder.yudao.module.report.controller;
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/convert/ajreport/package-info.java 0 → 100644
  1 +/**
  2 + * TODO 占位,后续删除
  3 + */
  4 +package cn.iocoder.yudao.module.report.convert.ajreport;
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/convert/goview/GoViewProjectConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.convert.goview;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectCreateReqVO;
  5 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectRespVO;
  6 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectUpdateReqVO;
  7 +import cn.iocoder.yudao.module.report.dal.dataobject.goview.GoViewProjectDO;
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.factory.Mappers;
  10 +
  11 +@Mapper
  12 +public interface GoViewProjectConvert {
  13 +
  14 + GoViewProjectConvert INSTANCE = Mappers.getMapper(GoViewProjectConvert.class);
  15 +
  16 + GoViewProjectDO convert(GoViewProjectCreateReqVO bean);
  17 +
  18 + GoViewProjectDO convert(GoViewProjectUpdateReqVO bean);
  19 +
  20 + GoViewProjectRespVO convert(GoViewProjectDO bean);
  21 +
  22 + PageResult<GoViewProjectRespVO> convertPage(PageResult<GoViewProjectDO> page);
  23 +
  24 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/ajreport/package-info.java 0 → 100644
  1 +/**
  2 + * TODO 芋艿:占位,待删除
  3 + */
  4 +package cn.iocoder.yudao.module.report.dal.dataobject.ajreport;
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/dataobject/goview/GoViewProjectDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.dal.dataobject.goview;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import com.baomidou.mybatisplus.annotation.KeySequence;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.*;
  8 +
  9 +/**
  10 + * GoView 项目表
  11 + *
  12 + * 每个大屏图标,对应一个项目
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +@TableName(value = "report_go_view_project", autoResultMap = true) // 由于 SQL Server 的 system_user 是关键字,所以使用 system_users
  17 +@KeySequence("report_go_view_project_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  18 +@Data
  19 +@EqualsAndHashCode(callSuper = true)
  20 +@Builder
  21 +@NoArgsConstructor
  22 +@AllArgsConstructor
  23 +public class GoViewProjectDO extends BaseDO {
  24 +
  25 + /**
  26 + * 编号,数据库自增
  27 + */
  28 + @TableId
  29 + private Long id;
  30 + /**
  31 + * 项目名称
  32 + */
  33 + private String name;
  34 + /**
  35 + * 预览图片 URL
  36 + */
  37 + private String picUrl;
  38 + /**
  39 + * 报表内容
  40 + *
  41 + * JSON 配置,使用字符串存储
  42 + */
  43 + private String content;
  44 + /**
  45 + * 发布状态
  46 + *
  47 + * 0 - 已发布
  48 + * 1 - 未发布
  49 + *
  50 + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
  51 + */
  52 + private Integer status;
  53 + /**
  54 + * 项目备注
  55 + */
  56 + private String remark;
  57 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/mysql/ajreport/package-info.java 0 → 100644
  1 +/**
  2 + * TODO 芋艿:占位,待删除
  3 + */
  4 +package cn.iocoder.yudao.module.report.dal.mysql.ajreport;
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/dal/mysql/goview/GoViewProjectMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.dal.mysql.goview;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  6 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  7 +import cn.iocoder.yudao.module.report.dal.dataobject.goview.GoViewProjectDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +@Mapper
  11 +public interface GoViewProjectMapper extends BaseMapperX<GoViewProjectDO> {
  12 +
  13 + default PageResult<GoViewProjectDO> selectPage(PageParam reqVO, Long userId) {
  14 + return selectPage(reqVO, new LambdaQueryWrapperX<GoViewProjectDO>()
  15 + .eq(GoViewProjectDO::getCreator, userId)
  16 + .orderByDesc(GoViewProjectDO::getId));
  17 + }
  18 +
  19 +}
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/config/JmReportConfiguration.java renamed to yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/jmreport/config/JmReportConfiguration.java
1   -package cn.iocoder.yudao.module.visualization.framework.jmreport.config;
  1 +package cn.iocoder.yudao.module.report.framework.jmreport.config;
2 2  
3 3 import cn.iocoder.yudao.framework.security.config.SecurityProperties;
4 4 import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi;
5   -import cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl;
  5 +import cn.iocoder.yudao.module.report.framework.jmreport.core.service.JmReportTokenServiceImpl;
6 6 import org.jeecg.modules.jmreport.api.JmReportTokenServiceI;
7 7 import org.springframework.context.annotation.Bean;
8 8 import org.springframework.context.annotation.ComponentScan;
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/service/JmReportTokenServiceImpl.java renamed to yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/jmreport/core/service/JmReportTokenServiceImpl.java
1   -package cn.iocoder.yudao.module.visualization.framework.jmreport.core.service;
  1 +package cn.iocoder.yudao.module.report.framework.jmreport.core.service;
2 2  
3 3 import cn.hutool.core.util.ObjectUtil;
4 4 import cn.hutool.core.util.StrUtil;
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/jmreport/core/web/package-info.java renamed to yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/jmreport/core/web/package-info.java
1 1 /**
2   - * 占位,后续会基于 Filter 实现积木报表的认证等功能,替代 {@link cn.iocoder.yudao.module.visualization.framework.jmreport.core.service.JmReportTokenServiceImpl}
  2 + * 占位,后续会基于 Filter 实现积木报表的认证等功能,替代 {@link cn.iocoder.yudao.module.report.framework.jmreport.core.service.JmReportTokenServiceImpl}
3 3 */
4   -package cn.iocoder.yudao.module.visualization.framework.jmreport.core.web;
  4 +package cn.iocoder.yudao.module.report.framework.jmreport.core.web;
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/package-info.java renamed to yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/package-info.java
1 1 /**
2   - * 属于 visualization 模块的 framework 封装
  2 + * 属于 report 模块的 framework 封装
3 3 *
4 4 * @author 芋道源码
5 5 */
6   -package cn.iocoder.yudao.module.visualization.framework;
  6 +package cn.iocoder.yudao.module.report.framework;
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/security/config/SecurityConfiguration.java renamed to yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/security/config/SecurityConfiguration.java
1   -package cn.iocoder.yudao.module.visualization.framework.security.config;
  1 +package cn.iocoder.yudao.module.report.framework.security.config;
2 2  
3 3 import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
4 4 import org.springframework.context.annotation.Bean;
... ... @@ -7,12 +7,12 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
7 7 import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
8 8  
9 9 /**
10   - * Visualization 模块的 Security 配置
  10 + * Report 模块的 Security 配置
11 11 */
12   -@Configuration("visualizationSecurityConfiguration")
  12 +@Configuration("reportSecurityConfiguration")
13 13 public class SecurityConfiguration {
14 14  
15   - @Bean("visualizationAuthorizeRequestsCustomizer")
  15 + @Bean("reportAuthorizeRequestsCustomizer")
16 16 public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
17 17 return new AuthorizeRequestsCustomizer() {
18 18  
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/security/core/package-info.java renamed to yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/security/core/package-info.java
1 1 /**
2 2 * 占位
3 3 */
4   -package cn.iocoder.yudao.module.visualization.framework.security.core;
  4 +package cn.iocoder.yudao.module.report.framework.security.core;
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/framework/ureport/package-info.java renamed to yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/framework/ureport/package-info.java
... ... @@ -4,4 +4,4 @@
4 4 * ureport2 和 jimurepot 是相同类型的产品,不过停更了,最好发布时间是 2018 年。
5 5 * 它们之间的功能对比,可见 https://juejin.cn/post/6939836480269320200 地址
6 6 */
7   -package cn.iocoder.yudao.module.visualization.framework.ureport;
  7 +package cn.iocoder.yudao.module.report.framework.ureport;
... ...
yudao-module-visualization/yudao-module-visualization-biz/src/main/java/cn/iocoder/yudao/module/visualization/package-info.java renamed to yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/package-info.java
1 1 /**
2   - * visualization 模块,主要实现数据可视化报表等功能:
  2 + * report 模块,主要实现数据可视化报表等功能:
3 3 * 1. 基于「积木报表」实现,打印设计、报表设计、图形设计、大屏设计等。URL 前缀是 /jmreport,表名前缀是 jimu_
4 4 *
5 5 * 由于「积木报表」的大屏设计器需要收费,后续会自研,对应的是:
6   - * 1. Controller URL:以 /visualization/ 开头,避免和其它 Module 冲突
7   - * 2. DataObject 表名:以 visualization_ 开头,方便在数据库中区分
  6 + * 1. Controller URL:以 /report/ 开头,避免和其它 Module 冲突
  7 + * 2. DataObject 表名:以 report_ 开头,方便在数据库中区分
8 8 */
9   -package cn.iocoder.yudao.module.visualization;
  9 +package cn.iocoder.yudao.module.report;
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/ajreport/package-info.java 0 → 100644
  1 +/**
  2 + * TODO 芋艿:占位,待删除
  3 + */
  4 +package cn.iocoder.yudao.module.report.service.ajreport;
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/goview/GoViewDataService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.service.goview;
  2 +
  3 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.data.GoViewDataRespVO;
  4 +
  5 +/**
  6 + * GoView 数据 Service 接口
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface GoViewDataService {
  11 +
  12 + /**
  13 + * 使用 SQL 查询数据
  14 + *
  15 + * @param sql SQL 语句
  16 + * @return 数据
  17 + */
  18 + GoViewDataRespVO getDataBySQL(String sql);
  19 +
  20 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/goview/GoViewDataServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.service.goview;
  2 +
  3 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.data.GoViewDataRespVO;
  4 +import com.google.common.collect.Maps;
  5 +import org.springframework.jdbc.core.JdbcTemplate;
  6 +import org.springframework.jdbc.support.rowset.SqlRowSet;
  7 +import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
  8 +import org.springframework.stereotype.Service;
  9 +import org.springframework.validation.annotation.Validated;
  10 +
  11 +import javax.annotation.Resource;
  12 +import java.util.Arrays;
  13 +import java.util.LinkedList;
  14 +import java.util.Map;
  15 +
  16 +/**
  17 + * GoView 数据 Service 实现类
  18 + *
  19 + * 补充说明:
  20 + * 1. 目前默认使用 jdbcTemplate 查询项目配置的数据源。如果你想查询其它数据源,可以新建对应数据源的 jdbcTemplate 来实现。
  21 + * 2. 默认数据源是 MySQL 关系数据源,可能数据量比较大的情况下,会比较慢,可以考虑后续使用 Click House 等等。
  22 + *
  23 + * @author 芋道源码
  24 + */
  25 +@Service
  26 +@Validated
  27 +public class GoViewDataServiceImpl implements GoViewDataService {
  28 +
  29 + @Resource
  30 + private JdbcTemplate jdbcTemplate;
  31 +
  32 + @Override
  33 + public GoViewDataRespVO getDataBySQL(String sql) {
  34 + // 1. 执行查询
  35 + SqlRowSet sqlRowSet = jdbcTemplate.queryForRowSet(sql);
  36 +
  37 + // 2. 构建返回结果
  38 + GoViewDataRespVO respVO = new GoViewDataRespVO();
  39 + // 2.1 解析元数据
  40 + SqlRowSetMetaData metaData = sqlRowSet.getMetaData();
  41 + String[] columnNames = metaData.getColumnNames();
  42 + respVO.setDimensions(Arrays.asList(columnNames));
  43 + // 2.2 解析数据明细
  44 + respVO.setSource(new LinkedList<>()); // 由于数据量不确认,使用 LinkedList 虽然内存占用大一点,但是不存在扩容复制的问题
  45 + while (sqlRowSet.next()) {
  46 + Map<String, Object> data = Maps.newHashMapWithExpectedSize(columnNames.length);
  47 + for (String columnName : columnNames) {
  48 + data.put(columnName, sqlRowSet.getObject(columnName));
  49 + }
  50 + respVO.getSource().add(data);
  51 + }
  52 + return respVO;
  53 + }
  54 +
  55 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/goview/GoViewProjectService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.service.goview;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectCreateReqVO;
  6 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectUpdateReqVO;
  7 +import cn.iocoder.yudao.module.report.dal.dataobject.goview.GoViewProjectDO;
  8 +
  9 +import javax.validation.Valid;
  10 +
  11 +/**
  12 + * GoView 项目 Service 接口
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +public interface GoViewProjectService {
  17 +
  18 + /**
  19 + * 创建项目
  20 + *
  21 + * @param createReqVO 创建信息
  22 + * @return 编号
  23 + */
  24 + Long createProject(@Valid GoViewProjectCreateReqVO createReqVO);
  25 +
  26 + /**
  27 + * 更新项目
  28 + *
  29 + * @param updateReqVO 更新信息
  30 + */
  31 + void updateProject(@Valid GoViewProjectUpdateReqVO updateReqVO);
  32 +
  33 + /**
  34 + * 删除项目
  35 + *
  36 + * @param id 编号
  37 + */
  38 + void deleteProject(Long id);
  39 +
  40 + /**
  41 + * 获得项目
  42 + *
  43 + * @param id 编号
  44 + * @return 项目
  45 + */
  46 + GoViewProjectDO getProject(Long id);
  47 +
  48 + /**
  49 + * 获得我的项目分页
  50 + *
  51 + * @param pageReqVO 分页查询
  52 + * @param userId 用户编号
  53 + * @return GoView 项目分页
  54 + */
  55 + PageResult<GoViewProjectDO> getMyProjectPage(PageParam pageReqVO, Long userId);
  56 +
  57 +}
... ...
yudao-module-report/yudao-module-report-biz/src/main/java/cn/iocoder/yudao/module/report/service/goview/GoViewProjectServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.service.goview;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectCreateReqVO;
  7 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectUpdateReqVO;
  8 +import cn.iocoder.yudao.module.report.convert.goview.GoViewProjectConvert;
  9 +import cn.iocoder.yudao.module.report.dal.dataobject.goview.GoViewProjectDO;
  10 +import cn.iocoder.yudao.module.report.dal.mysql.goview.GoViewProjectMapper;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.validation.annotation.Validated;
  13 +
  14 +import javax.annotation.Resource;
  15 +
  16 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  17 +import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.GO_VIEW_PROJECT_NOT_EXISTS;
  18 +
  19 +/**
  20 + * GoView 项目 Service 实现类
  21 + *
  22 + * @author 芋道源码
  23 + */
  24 +@Service
  25 +@Validated
  26 +public class GoViewProjectServiceImpl implements GoViewProjectService {
  27 +
  28 + @Resource
  29 + private GoViewProjectMapper goViewProjectMapper;
  30 +
  31 + @Override
  32 + public Long createProject(GoViewProjectCreateReqVO createReqVO) {
  33 + // 插入
  34 + GoViewProjectDO goViewProject = GoViewProjectConvert.INSTANCE.convert(createReqVO)
  35 + .setStatus(CommonStatusEnum.DISABLE.getStatus());
  36 + goViewProjectMapper.insert(goViewProject);
  37 + // 返回
  38 + return goViewProject.getId();
  39 + }
  40 +
  41 + @Override
  42 + public void updateProject(GoViewProjectUpdateReqVO updateReqVO) {
  43 + // 校验存在
  44 + validateProjectExists(updateReqVO.getId());
  45 + // 更新
  46 + GoViewProjectDO updateObj = GoViewProjectConvert.INSTANCE.convert(updateReqVO);
  47 + goViewProjectMapper.updateById(updateObj);
  48 + }
  49 +
  50 + @Override
  51 + public void deleteProject(Long id) {
  52 + // 校验存在
  53 + validateProjectExists(id);
  54 + // 删除
  55 + goViewProjectMapper.deleteById(id);
  56 + }
  57 +
  58 + private void validateProjectExists(Long id) {
  59 + if (goViewProjectMapper.selectById(id) == null) {
  60 + throw exception(GO_VIEW_PROJECT_NOT_EXISTS);
  61 + }
  62 + }
  63 +
  64 + @Override
  65 + public GoViewProjectDO getProject(Long id) {
  66 + return goViewProjectMapper.selectById(id);
  67 + }
  68 +
  69 + @Override
  70 + public PageResult<GoViewProjectDO> getMyProjectPage(PageParam pageReqVO, Long userId) {
  71 + return goViewProjectMapper.selectPage(pageReqVO, userId);
  72 + }
  73 +
  74 +}
... ...
yudao-module-report/yudao-module-report-biz/src/test/java/cn/iocoder/yudao/module/report/service/goview/GoViewDataServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.service.goview;
  2 +
  3 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.data.GoViewDataRespVO;
  5 +import org.junit.jupiter.api.Test;
  6 +import org.springframework.boot.test.mock.mockito.MockBean;
  7 +import org.springframework.context.annotation.Import;
  8 +import org.springframework.jdbc.core.JdbcTemplate;
  9 +import org.springframework.jdbc.support.rowset.SqlRowSet;
  10 +import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
  11 +
  12 +import javax.annotation.Resource;
  13 +import java.util.Arrays;
  14 +
  15 +import static org.junit.jupiter.api.Assertions.assertEquals;
  16 +import static org.mockito.ArgumentMatchers.eq;
  17 +import static org.mockito.Mockito.mock;
  18 +import static org.mockito.Mockito.when;
  19 +
  20 +@Import(GoViewDataServiceImpl.class)
  21 +public class GoViewDataServiceImplTest extends BaseDbUnitTest {
  22 +
  23 + @Resource
  24 + private GoViewDataServiceImpl goViewDataService;
  25 +
  26 + @MockBean
  27 + private JdbcTemplate jdbcTemplate;
  28 +
  29 + @Test
  30 + public void testGetDataBySQL() {
  31 + // 准备参数
  32 + String sql = "SELECT id, name FROM system_users";
  33 + // mock 方法
  34 + SqlRowSet sqlRowSet = mock(SqlRowSet.class);
  35 + when(jdbcTemplate.queryForRowSet(eq(sql))).thenReturn(sqlRowSet);
  36 + // mock 元数据
  37 + SqlRowSetMetaData metaData = mock(SqlRowSetMetaData.class);
  38 + when(sqlRowSet.getMetaData()).thenReturn(metaData);
  39 + when(metaData.getColumnNames()).thenReturn(new String[]{"id", "name"});
  40 + // mock 数据明细
  41 + when(sqlRowSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
  42 + when(sqlRowSet.getObject("id")).thenReturn(1L).thenReturn(2L);
  43 + when(sqlRowSet.getObject("name")).thenReturn("芋道源码").thenReturn("芋道");
  44 +
  45 + // 调用
  46 + GoViewDataRespVO dataBySQL = goViewDataService.getDataBySQL(sql);
  47 + // 断言
  48 + assertEquals(Arrays.asList("id", "name"), dataBySQL.getDimensions());
  49 + assertEquals(2, dataBySQL.getDimensions().size());
  50 + assertEquals(2, dataBySQL.getSource().get(0).size());
  51 + assertEquals(1L, dataBySQL.getSource().get(0).get("id"));
  52 + assertEquals("芋道源码", dataBySQL.getSource().get(0).get("name"));
  53 + assertEquals(2, dataBySQL.getSource().get(1).size());
  54 + assertEquals(2L, dataBySQL.getSource().get(1).get("id"));
  55 + assertEquals("芋道", dataBySQL.getSource().get(1).get("name"));
  56 + }
  57 +
  58 +}
... ...
yudao-module-report/yudao-module-report-biz/src/test/java/cn/iocoder/yudao/module/report/service/goview/GoViewProjectServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.report.service.goview;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  6 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectCreateReqVO;
  7 +import cn.iocoder.yudao.module.report.controller.admin.goview.vo.project.GoViewProjectUpdateReqVO;
  8 +import cn.iocoder.yudao.module.report.dal.dataobject.goview.GoViewProjectDO;
  9 +import cn.iocoder.yudao.module.report.dal.mysql.goview.GoViewProjectMapper;
  10 +import org.junit.jupiter.api.Test;
  11 +import org.springframework.context.annotation.Import;
  12 +
  13 +import javax.annotation.Resource;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  16 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  17 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  18 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
  19 +import static cn.iocoder.yudao.module.report.enums.ErrorCodeConstants.GO_VIEW_PROJECT_NOT_EXISTS;
  20 +import static org.junit.jupiter.api.Assertions.*;
  21 +
  22 +/**
  23 + * {@link GoViewProjectServiceImpl} 的单元测试类
  24 + *
  25 + * @author 芋道源码
  26 + */
  27 +@Import(GoViewProjectServiceImpl.class)
  28 +public class GoViewProjectServiceImplTest extends BaseDbUnitTest {
  29 +
  30 + @Resource
  31 + private GoViewProjectServiceImpl goViewProjectService;
  32 +
  33 + @Resource
  34 + private GoViewProjectMapper goViewProjectMapper;
  35 +
  36 + @Test
  37 + public void testCreateProject_success() {
  38 + // 准备参数
  39 + GoViewProjectCreateReqVO reqVO = randomPojo(GoViewProjectCreateReqVO.class);
  40 +
  41 + // 调用
  42 + Long goViewProjectId = goViewProjectService.createProject(reqVO);
  43 + // 断言
  44 + assertNotNull(goViewProjectId);
  45 + // 校验记录的属性是否正确
  46 + GoViewProjectDO goViewProject = goViewProjectMapper.selectById(goViewProjectId);
  47 + assertPojoEquals(reqVO, goViewProject);
  48 + }
  49 +
  50 + @Test
  51 + public void testUpdateProject_success() {
  52 + // mock 数据
  53 + GoViewProjectDO dbGoViewProject = randomPojo(GoViewProjectDO.class);
  54 + goViewProjectMapper.insert(dbGoViewProject);// @Sql: 先插入出一条存在的数据
  55 + // 准备参数
  56 + GoViewProjectUpdateReqVO reqVO = randomPojo(GoViewProjectUpdateReqVO.class, o -> {
  57 + o.setId(dbGoViewProject.getId()); // 设置更新的 ID
  58 + o.setStatus(randomCommonStatus());
  59 + });
  60 +
  61 + // 调用
  62 + goViewProjectService.updateProject(reqVO);
  63 + // 校验是否更新正确
  64 + GoViewProjectDO goViewProject = goViewProjectMapper.selectById(reqVO.getId()); // 获取最新的
  65 + assertPojoEquals(reqVO, goViewProject);
  66 + }
  67 +
  68 + @Test
  69 + public void testUpdateProject_notExists() {
  70 + // 准备参数
  71 + GoViewProjectUpdateReqVO reqVO = randomPojo(GoViewProjectUpdateReqVO.class);
  72 +
  73 + // 调用, 并断言异常
  74 + assertServiceException(() -> goViewProjectService.updateProject(reqVO), GO_VIEW_PROJECT_NOT_EXISTS);
  75 + }
  76 +
  77 + @Test
  78 + public void testDeleteProject_success() {
  79 + // mock 数据
  80 + GoViewProjectDO dbGoViewProject = randomPojo(GoViewProjectDO.class);
  81 + goViewProjectMapper.insert(dbGoViewProject);// @Sql: 先插入出一条存在的数据
  82 + // 准备参数
  83 + Long id = dbGoViewProject.getId();
  84 +
  85 + // 调用
  86 + goViewProjectService.deleteProject(id);
  87 + // 校验数据不存在了
  88 + assertNull(goViewProjectMapper.selectById(id));
  89 + }
  90 +
  91 + @Test
  92 + public void testDeleteProject_notExists() {
  93 + // 准备参数
  94 + Long id = randomLongId();
  95 +
  96 + // 调用, 并断言异常
  97 + assertServiceException(() -> goViewProjectService.deleteProject(id), GO_VIEW_PROJECT_NOT_EXISTS);
  98 + }
  99 +
  100 + @Test
  101 + public void testGetProject() {
  102 + // mock 数据
  103 + GoViewProjectDO dbGoViewProject = randomPojo(GoViewProjectDO.class);
  104 + goViewProjectMapper.insert(dbGoViewProject);// @Sql: 先插入出一条存在的数据
  105 + // 准备参数
  106 + Long id = dbGoViewProject.getId();
  107 +
  108 + // 调用
  109 + GoViewProjectDO goViewProject = goViewProjectService.getProject(id);
  110 + // 断言
  111 + assertPojoEquals(dbGoViewProject, goViewProject);
  112 + }
  113 +
  114 + @Test
  115 + public void testGetMyGoViewProjectPage() {
  116 + // mock 数据
  117 + GoViewProjectDO dbGoViewProject = randomPojo(GoViewProjectDO.class, o -> { // 等会查询到
  118 + o.setCreator("1");
  119 + });
  120 + goViewProjectMapper.insert(dbGoViewProject);
  121 + // 测试 userId 不匹配
  122 + goViewProjectMapper.insert(cloneIgnoreId(dbGoViewProject, o -> o.setCreator("2")));
  123 + // 准备参数
  124 + PageParam reqVO = new PageParam();
  125 + Long userId = 1L;
  126 +
  127 + // 调用
  128 + PageResult<GoViewProjectDO> pageResult = goViewProjectService.getMyProjectPage(reqVO, userId);
  129 + // 断言
  130 + assertEquals(1, pageResult.getTotal());
  131 + assertEquals(1, pageResult.getList().size());
  132 + assertPojoEquals(dbGoViewProject, pageResult.getList().get(0));
  133 + }
  134 +
  135 +}
... ...
yudao-module-report/yudao-module-report-biz/src/test/resources/application-unit-test.yaml 0 → 100644
  1 +spring:
  2 + main:
  3 + lazy-initialization: true # 开启懒加载,加快速度
  4 + banner-mode: off # 单元测试,禁用 Banner
  5 +
  6 +--- #################### 数据库相关配置 ####################
  7 +
  8 +spring:
  9 + # 数据源配置项
  10 + datasource:
  11 + name: ruoyi-vue-pro
  12 + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false;NON_KEYWORDS=value; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
  13 + driver-class-name: org.h2.Driver
  14 + username: sa
  15 + password:
  16 + druid:
  17 + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
  18 + initial-size: 1 # 单元测试,配置为 1,提升启动速度
  19 + sql:
  20 + init:
  21 + schema-locations: classpath:/sql/create_tables.sql
  22 +
  23 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
  24 + redis:
  25 + host: 127.0.0.1 # 地址
  26 + port: 16379 # 端口(单元测试,使用 16379 端口)
  27 + database: 0 # 数据库索引
  28 +
  29 +
  30 +mybatis:
  31 + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
  32 +
  33 +--- #################### 定时任务相关配置 ####################
  34 +
  35 +--- #################### 配置中心相关配置 ####################
  36 +
  37 +--- #################### 服务保障相关配置 ####################
  38 +
  39 +# Lock4j 配置项(单元测试,禁用 Lock4j)
  40 +
  41 +# Resilience4j 配置项
  42 +
  43 +--- #################### 监控相关配置 ####################
  44 +
  45 +--- #################### 芋道相关配置 ####################
  46 +
  47 +# 芋道配置项,设置当前项目所有自定义的配置
  48 +yudao:
  49 + info:
  50 + base-package: cn.iocoder.yudao.module
  51 + captcha:
  52 + timeout: 5m
  53 + width: 160
  54 + height: 60
  55 + enable: true
... ...
yudao-module-report/yudao-module-report-biz/src/test/resources/logback.xml 0 → 100644
  1 +<configuration>
  2 + <!-- 引用 Spring Boot 的 logback 基础配置 -->
  3 + <include resource="org/springframework/boot/logging/logback/defaults.xml" />
  4 +</configuration>
... ...
yudao-module-report/yudao-module-report-biz/src/test/resources/sql/clean.sql 0 → 100644
  1 +DELETE FROM "report_go_view_project";
... ...
yudao-module-report/yudao-module-report-biz/src/test/resources/sql/create_tables.sql 0 → 100644
  1 +CREATE TABLE IF NOT EXISTS "report_go_view_project" (
  2 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  3 + "name" varchar NOT NULL,
  4 + "pic_url" varchar,
  5 + "content" varchar,
  6 + "status" varchar NOT NULL,
  7 + "remark" varchar,
  8 + "creator" varchar DEFAULT '',
  9 + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  10 + "updater" varchar DEFAULT '',
  11 + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  12 + "deleted" bit NOT NULL DEFAULT FALSE,
  13 + PRIMARY KEY ("id")
  14 +) COMMENT 'GoView 项目表';
... ...
yudao-server/pom.xml
... ... @@ -44,7 +44,7 @@
44 44 <!-- 数据报表 -->
45 45 <!-- <dependency>-->
46 46 <!-- <groupId>cn.iocoder.boot</groupId>-->
47   -<!-- <artifactId>yudao-module-visualization-biz</artifactId>-->
  47 +<!-- <artifactId>yudao-module-report-biz</artifactId>-->
48 48 <!-- <version>${revision}</version>-->
49 49 <!-- </dependency>-->
50 50 <!-- 工作流 -->
... ...
yudao-server/src/main/java/cn/iocoder/yudao/server/controller/DefaultController.java
... ... @@ -32,7 +32,14 @@ public class DefaultController {
32 32 "/admin-api/promotion/**"}) // 营销中心
33 33 public CommonResult<Boolean> mall404() {
34 34 return CommonResult.error(NOT_IMPLEMENTED.getCode(),
35   - "[商城 yudao-module-mp - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]");
  35 + "[商城系统 yudao-module-mall - 已禁用][参考 https://doc.iocoder.cn/mall/build/ 开启]");
  36 + }
  37 +
  38 + @RequestMapping(value = {"/admin-api/report/**",
  39 + "/jmreport/**"})
  40 + public CommonResult<Boolean> report404() {
  41 + return CommonResult.error(NOT_IMPLEMENTED.getCode(),
  42 + "[报表模块 yudao-module-report - 已禁用][参考 https://doc.iocoder.cn/report/ 开启]");
36 43 }
37 44  
38 45 }
... ...
yudao-ui-admin-vue3/.env.dev
... ... @@ -4,10 +4,10 @@ NODE_ENV=production
4 4 VITE_DEV=false
5 5  
6 6 # 请求路径
7   -VITE_BASE_URL='http://localhost:58080'
  7 +VITE_BASE_URL='http://localhost:48080'
8 8  
9 9 # 上传路径
10   -VITE_UPLOAD_URL='http://localhost:58080/admin-api/infra/file/upload'
  10 +VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
11 11  
12 12 # 接口前缀
13 13 VITE_API_BASEPATH=/dev-api
... ...
yudao-ui-admin-vue3/.env.pro
... ... @@ -4,10 +4,10 @@ NODE_ENV=production
4 4 VITE_DEV=false
5 5  
6 6 # 请求路径
7   -VITE_BASE_URL='http://localhost:58080'
  7 +VITE_BASE_URL='http://localhost:48080'
8 8  
9 9 # 上传路径
10   -VITE_UPLOAD_URL='http://localhost:58080/admin-api/infra/file/upload'
  10 +VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
11 11  
12 12 # 接口前缀
13 13 VITE_API_BASEPATH=
... ...
yudao-ui-admin-vue3/.env.test
... ... @@ -4,10 +4,10 @@ NODE_ENV=production
4 4 VITE_DEV=false
5 5  
6 6 # 请求路径
7   -VITE_BASE_URL='http://localhost:58080'
  7 +VITE_BASE_URL='http://localhost:48080'
8 8  
9 9 # 上传路径
10   -VITE_UPLOAD_URL='http://localhost:58080/admin-api/infra/file/upload'
  10 +VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
11 11  
12 12 # 接口前缀
13 13 VITE_API_BASEPATH=
... ...
yudao-ui-admin-vue3/pnpm-lock.yaml
1   -lockfileVersion: 5.4
  1 +lockfileVersion: 5.3
2 2  
3 3 specifiers:
4 4 '@commitlint/cli': ^17.4.2
... ... @@ -103,7 +103,7 @@ dependencies:
103 103 '@iconify/iconify': 3.1.0
104 104 '@vueuse/core': 9.12.0_vue@3.2.47
105 105 '@wangeditor/editor': 5.1.23
106   - '@wangeditor/editor-for-vue': 5.1.12_77ywgcaevzgjoxs6yixvgo4fve
  106 + '@wangeditor/editor-for-vue': 5.1.12_fff1630804ae4c975e5ec22f533b85a9
107 107 '@zxcvbn-ts/core': 2.2.0
108 108 animate.css: 4.1.1
109 109 axios: 1.3.2
... ... @@ -124,7 +124,7 @@ dependencies:
124 124 min-dash: 4.0.0
125 125 mitt: 3.0.0
126 126 nprogress: 0.2.0
127   - pinia: 2.0.30_hmuptsblhheur2tugfgucj7gc4
  127 + pinia: 2.0.30_typescript@4.9.5+vue@3.2.47
128 128 qrcode: 1.5.1
129 129 qs: 6.11.0
130 130 steady-xml: 0.1.0
... ... @@ -151,8 +151,8 @@ devDependencies:
151 151 '@types/nprogress': 0.2.0
152 152 '@types/qrcode': 1.5.0
153 153 '@types/qs': 6.9.7
154   - '@typescript-eslint/eslint-plugin': 5.50.0_go4drrxstycfikanvu45pi4vgq
155   - '@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
  154 + '@typescript-eslint/eslint-plugin': 5.50.0_33b838c6f29e0454280dad39d7a39534
  155 + '@typescript-eslint/parser': 5.50.0_eslint@8.33.0+typescript@4.9.5
156 156 '@vitejs/plugin-legacy': 4.0.1_terser@5.16.3+vite@4.1.1
157 157 '@vitejs/plugin-vue': 4.0.0_vite@4.1.1+vue@3.2.47
158 158 '@vitejs/plugin-vue-jsx': 3.0.0_vite@4.1.1+vue@3.2.47
... ... @@ -163,7 +163,7 @@ devDependencies:
163 163 eslint: 8.33.0
164 164 eslint-config-prettier: 8.6.0_eslint@8.33.0
165 165 eslint-define-config: 1.15.0
166   - eslint-plugin-prettier: 4.2.1_jqplj6qf3uqpxpu4gdyhwwasnq
  166 + eslint-plugin-prettier: 4.2.1_4c1eb4fa05dd20fbbe9c30f07b58126c
167 167 eslint-plugin-vue: 9.9.0_eslint@8.33.0
168 168 lint-staged: 13.1.0
169 169 postcss: 8.4.21
... ... @@ -174,17 +174,17 @@ devDependencies:
174 174 rollup: 3.14.0
175 175 sass: 1.58.0
176 176 stylelint: 14.16.1
177   - stylelint-config-html: 1.1.0_kbto3rg3njmczth2rrsgfnlsqa
  177 + stylelint-config-html: 1.1.0_5066edc4db6a582cccfa8c6462b57280
178 178 stylelint-config-prettier: 9.0.4_stylelint@14.16.1
179 179 stylelint-config-recommended: 9.0.0_stylelint@14.16.1
180 180 stylelint-config-standard: 29.0.0_stylelint@14.16.1
181 181 stylelint-order: 6.0.1_stylelint@14.16.1
182 182 terser: 5.16.3
183 183 typescript: 4.9.5
184   - unplugin-auto-import: 0.13.0_z2glzmrjcar3r3i7v53oix2lwa
  184 + unplugin-auto-import: 0.13.0_ce8cbcb2291023b8ed1faf76e45f4bb0
185 185 unplugin-element-plus: 0.6.0_rollup@3.14.0
186 186 unplugin-vue-components: 0.23.0_rollup@3.14.0+vue@3.2.47
187   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  187 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
188 188 vite-plugin-compression: 0.5.1_vite@4.1.1
189 189 vite-plugin-ejs: 1.6.4
190 190 vite-plugin-eslint: 1.8.1_eslint@8.33.0+vite@4.1.1
... ... @@ -1732,12 +1732,12 @@ packages:
1732 1732 '@types/node': 18.11.19
1733 1733 chalk: 4.1.2
1734 1734 cosmiconfig: 8.0.0
1735   - cosmiconfig-typescript-loader: 4.2.0_q6dimmvgduffavfq3obt6abtea
  1735 + cosmiconfig-typescript-loader: 4.2.0_87868632a61d0a5054b0db833f003320
1736 1736 lodash.isplainobject: 4.0.6
1737 1737 lodash.merge: 4.6.2
1738 1738 lodash.uniq: 4.5.0
1739 1739 resolve-from: 5.0.0
1740   - ts-node: 10.9.1_qqdszkrtcshgbphghj7vnvrrby
  1740 + ts-node: 10.9.1_84072caa33148e60bce63a7f56d6310e
1741 1741 typescript: 4.9.5
1742 1742 transitivePeerDependencies:
1743 1743 - '@swc/core'
... ... @@ -1818,7 +1818,7 @@ packages:
1818 1818 '@jridgewell/trace-mapping': 0.3.9
1819 1819 dev: true
1820 1820  
1821   - /@csstools/selector-specificity/2.0.2_wajs5nedgkikc5pcuwett7legi:
  1821 + /@csstools/selector-specificity/2.0.2_b0132eb4833290a175e2a58939fd6432:
1822 1822 resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==}
1823 1823 engines: {node: ^12 || ^14 || >=16}
1824 1824 peerDependencies:
... ... @@ -2232,12 +2232,14 @@ packages:
2232 2232 '@intlify/message-compiler': 9.2.2
2233 2233 '@intlify/shared': 9.2.2
2234 2234 '@intlify/vue-devtools': 9.2.2
  2235 + dev: false
2235 2236  
2236 2237 /@intlify/devtools-if/9.2.2:
2237 2238 resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==}
2238 2239 engines: {node: '>= 14'}
2239 2240 dependencies:
2240 2241 '@intlify/shared': 9.2.2
  2242 + dev: false
2241 2243  
2242 2244 /@intlify/message-compiler/9.2.2:
2243 2245 resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==}
... ... @@ -2245,6 +2247,7 @@ packages:
2245 2247 dependencies:
2246 2248 '@intlify/shared': 9.2.2
2247 2249 source-map: 0.6.1
  2250 + dev: false
2248 2251  
2249 2252 /@intlify/message-compiler/9.3.0-beta.16:
2250 2253 resolution: {integrity: sha512-CGQI3xRcs1ET75eDQ0DUy3MRYOqTauRIIgaMoISKiF83gqRWg93FqN8lGMKcpBqaF4tI0JhsfosCaGiBL9+dnw==}
... ... @@ -2257,6 +2260,7 @@ packages:
2257 2260 /@intlify/shared/9.2.2:
2258 2261 resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==}
2259 2262 engines: {node: '>= 14'}
  2263 + dev: false
2260 2264  
2261 2265 /@intlify/shared/9.3.0-beta.16:
2262 2266 resolution: {integrity: sha512-kXbm4svALe3lX+EjdJxfnabOphqS4yQ1Ge/iIlR8tvUiYRCoNz3hig1M4336iY++Dfx5ytEQJPNjIcknNIuvig==}
... ... @@ -2301,6 +2305,7 @@ packages:
2301 2305 dependencies:
2302 2306 '@intlify/core-base': 9.2.2
2303 2307 '@intlify/shared': 9.2.2
  2308 + dev: false
2304 2309  
2305 2310 /@jridgewell/gen-mapping/0.1.1:
2306 2311 resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz}
... ... @@ -2572,8 +2577,9 @@ packages:
2572 2577  
2573 2578 /@types/web-bluetooth/0.0.16:
2574 2579 resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
  2580 + dev: false
2575 2581  
2576   - /@typescript-eslint/eslint-plugin/5.50.0_go4drrxstycfikanvu45pi4vgq:
  2582 + /@typescript-eslint/eslint-plugin/5.50.0_33b838c6f29e0454280dad39d7a39534:
2577 2583 resolution: {integrity: sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==}
2578 2584 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
2579 2585 peerDependencies:
... ... @@ -2584,10 +2590,10 @@ packages:
2584 2590 typescript:
2585 2591 optional: true
2586 2592 dependencies:
2587   - '@typescript-eslint/parser': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
  2593 + '@typescript-eslint/parser': 5.50.0_eslint@8.33.0+typescript@4.9.5
2588 2594 '@typescript-eslint/scope-manager': 5.50.0
2589   - '@typescript-eslint/type-utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
2590   - '@typescript-eslint/utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
  2595 + '@typescript-eslint/type-utils': 5.50.0_eslint@8.33.0+typescript@4.9.5
  2596 + '@typescript-eslint/utils': 5.50.0_eslint@8.33.0+typescript@4.9.5
2591 2597 debug: 4.3.4
2592 2598 eslint: 8.33.0
2593 2599 grapheme-splitter: 1.0.4
... ... @@ -2601,7 +2607,7 @@ packages:
2601 2607 - supports-color
2602 2608 dev: true
2603 2609  
2604   - /@typescript-eslint/parser/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64:
  2610 + /@typescript-eslint/parser/5.50.0_eslint@8.33.0+typescript@4.9.5:
2605 2611 resolution: {integrity: sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==}
2606 2612 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
2607 2613 peerDependencies:
... ... @@ -2629,7 +2635,7 @@ packages:
2629 2635 '@typescript-eslint/visitor-keys': 5.50.0
2630 2636 dev: true
2631 2637  
2632   - /@typescript-eslint/type-utils/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64:
  2638 + /@typescript-eslint/type-utils/5.50.0_eslint@8.33.0+typescript@4.9.5:
2633 2639 resolution: {integrity: sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==}
2634 2640 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
2635 2641 peerDependencies:
... ... @@ -2640,7 +2646,7 @@ packages:
2640 2646 optional: true
2641 2647 dependencies:
2642 2648 '@typescript-eslint/typescript-estree': 5.50.0_typescript@4.9.5
2643   - '@typescript-eslint/utils': 5.50.0_4vsywjlpuriuw3tl5oq6zy5a64
  2649 + '@typescript-eslint/utils': 5.50.0_eslint@8.33.0+typescript@4.9.5
2644 2650 debug: 4.3.4
2645 2651 eslint: 8.33.0
2646 2652 tsutils: 3.21.0_typescript@4.9.5
... ... @@ -2675,7 +2681,7 @@ packages:
2675 2681 - supports-color
2676 2682 dev: true
2677 2683  
2678   - /@typescript-eslint/utils/5.50.0_4vsywjlpuriuw3tl5oq6zy5a64:
  2684 + /@typescript-eslint/utils/5.50.0_eslint@8.33.0+typescript@4.9.5:
2679 2685 resolution: {integrity: sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==}
2680 2686 engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
2681 2687 peerDependencies:
... ... @@ -2759,7 +2765,7 @@ packages:
2759 2765 regenerator-runtime: 0.13.11
2760 2766 systemjs: 6.13.0
2761 2767 terser: 5.16.3
2762   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  2768 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
2763 2769 transitivePeerDependencies:
2764 2770 - supports-color
2765 2771 dev: true
... ... @@ -2774,7 +2780,7 @@ packages:
2774 2780 '@babel/core': 7.20.5
2775 2781 '@babel/plugin-transform-typescript': 7.20.2_@babel+core@7.20.5
2776 2782 '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.20.5
2777   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  2783 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
2778 2784 vue: 3.2.47
2779 2785 transitivePeerDependencies:
2780 2786 - supports-color
... ... @@ -2787,7 +2793,7 @@ packages:
2787 2793 vite: ^4.0.0
2788 2794 vue: ^3.2.25
2789 2795 dependencies:
2790   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  2796 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
2791 2797 vue: 3.2.47
2792 2798 dev: true
2793 2799  
... ... @@ -2867,6 +2873,7 @@ packages:
2867 2873 '@vue/shared': 3.2.47
2868 2874 estree-walker: 2.0.2
2869 2875 source-map: 0.6.1
  2876 + dev: false
2870 2877  
2871 2878 /@vue/compiler-dom/3.2.45:
2872 2879 resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==}
... ... @@ -2880,6 +2887,7 @@ packages:
2880 2887 dependencies:
2881 2888 '@vue/compiler-core': 3.2.47
2882 2889 '@vue/shared': 3.2.47
  2890 + dev: false
2883 2891  
2884 2892 /@vue/compiler-sfc/3.2.45:
2885 2893 resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==}
... ... @@ -2909,6 +2917,7 @@ packages:
2909 2917 magic-string: 0.25.9
2910 2918 postcss: 8.4.21
2911 2919 source-map: 0.6.1
  2920 + dev: false
2912 2921  
2913 2922 /@vue/compiler-ssr/3.2.45:
2914 2923 resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==}
... ... @@ -2922,9 +2931,11 @@ packages:
2922 2931 dependencies:
2923 2932 '@vue/compiler-dom': 3.2.47
2924 2933 '@vue/shared': 3.2.47
  2934 + dev: false
2925 2935  
2926 2936 /@vue/devtools-api/6.4.5:
2927 2937 resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npm.taobao.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz}
  2938 + dev: false
2928 2939  
2929 2940 /@vue/reactivity-transform/3.2.45:
2930 2941 resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==}
... ... @@ -2944,6 +2955,7 @@ packages:
2944 2955 '@vue/shared': 3.2.47
2945 2956 estree-walker: 2.0.2
2946 2957 magic-string: 0.25.9
  2958 + dev: false
2947 2959  
2948 2960 /@vue/reactivity/3.2.45:
2949 2961 resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==}
... ... @@ -2955,12 +2967,14 @@ packages:
2955 2967 resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==}
2956 2968 dependencies:
2957 2969 '@vue/shared': 3.2.47
  2970 + dev: false
2958 2971  
2959 2972 /@vue/runtime-core/3.2.47:
2960 2973 resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==}
2961 2974 dependencies:
2962 2975 '@vue/reactivity': 3.2.47
2963 2976 '@vue/shared': 3.2.47
  2977 + dev: false
2964 2978  
2965 2979 /@vue/runtime-dom/3.2.47:
2966 2980 resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==}
... ... @@ -2968,6 +2982,7 @@ packages:
2968 2982 '@vue/runtime-core': 3.2.47
2969 2983 '@vue/shared': 3.2.47
2970 2984 csstype: 2.6.21
  2985 + dev: false
2971 2986  
2972 2987 /@vue/server-renderer/3.2.47_vue@3.2.47:
2973 2988 resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==}
... ... @@ -2977,6 +2992,7 @@ packages:
2977 2992 '@vue/compiler-ssr': 3.2.47
2978 2993 '@vue/shared': 3.2.47
2979 2994 vue: 3.2.47
  2995 + dev: false
2980 2996  
2981 2997 /@vue/shared/3.2.45:
2982 2998 resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==}
... ... @@ -2984,6 +3000,7 @@ packages:
2984 3000  
2985 3001 /@vue/shared/3.2.47:
2986 3002 resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==}
  3003 + dev: false
2987 3004  
2988 3005 /@vueuse/core/9.12.0_vue@3.2.47:
2989 3006 resolution: {integrity: sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==}
... ... @@ -2995,9 +3012,11 @@ packages:
2995 3012 transitivePeerDependencies:
2996 3013 - '@vue/composition-api'
2997 3014 - vue
  3015 + dev: false
2998 3016  
2999 3017 /@vueuse/metadata/9.12.0:
3000 3018 resolution: {integrity: sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==}
  3019 + dev: false
3001 3020  
3002 3021 /@vueuse/shared/9.12.0_vue@3.2.47:
3003 3022 resolution: {integrity: sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==}
... ... @@ -3006,8 +3025,9 @@ packages:
3006 3025 transitivePeerDependencies:
3007 3026 - '@vue/composition-api'
3008 3027 - vue
  3028 + dev: false
3009 3029  
3010   - /@wangeditor/basic-modules/1.1.7_j7icpicfeimtkldwmemjnpdjs4:
  3030 + /@wangeditor/basic-modules/1.1.7_4fd027a0452219352c76611896bc6997:
3011 3031 resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==}
3012 3032 peerDependencies:
3013 3033 '@wangeditor/core': 1.x
... ... @@ -3017,7 +3037,7 @@ packages:
3017 3037 slate: ^0.72.0
3018 3038 snabbdom: ^3.1.0
3019 3039 dependencies:
3020   - '@wangeditor/core': 1.1.19_qokc4m5r26t2nkvzejrgzroa7e
  3040 + '@wangeditor/core': 1.1.19_83942e33b1d7a7a6aab922626cc5c0f9
3021 3041 dom7: 3.0.0
3022 3042 is-url: 1.2.4
3023 3043 lodash.throttle: 4.1.1
... ... @@ -3026,7 +3046,7 @@ packages:
3026 3046 snabbdom: 3.5.1
3027 3047 dev: false
3028 3048  
3029   - /@wangeditor/code-highlight/1.0.3_tztyh2vh7kwzpeloifaekkk3my:
  3049 + /@wangeditor/code-highlight/1.0.3_9e6783eaa7faad97916e414045295b66:
3030 3050 resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==}
3031 3051 peerDependencies:
3032 3052 '@wangeditor/core': 1.x
... ... @@ -3034,14 +3054,14 @@ packages:
3034 3054 slate: ^0.72.0
3035 3055 snabbdom: ^3.1.0
3036 3056 dependencies:
3037   - '@wangeditor/core': 1.1.19_qokc4m5r26t2nkvzejrgzroa7e
  3057 + '@wangeditor/core': 1.1.19_83942e33b1d7a7a6aab922626cc5c0f9
3038 3058 dom7: 3.0.0
3039 3059 prismjs: 1.29.0
3040 3060 slate: 0.72.8
3041 3061 snabbdom: 3.5.1
3042 3062 dev: false
3043 3063  
3044   - /@wangeditor/core/1.1.19_qokc4m5r26t2nkvzejrgzroa7e:
  3064 + /@wangeditor/core/1.1.19_83942e33b1d7a7a6aab922626cc5c0f9:
3045 3065 resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==}
3046 3066 peerDependencies:
3047 3067 '@uppy/core': ^2.1.1
... ... @@ -3081,7 +3101,7 @@ packages:
3081 3101 snabbdom: 3.5.1
3082 3102 dev: false
3083 3103  
3084   - /@wangeditor/editor-for-vue/5.1.12_77ywgcaevzgjoxs6yixvgo4fve:
  3104 + /@wangeditor/editor-for-vue/5.1.12_fff1630804ae4c975e5ec22f533b85a9:
3085 3105 resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==}
3086 3106 peerDependencies:
3087 3107 '@wangeditor/editor': '>=5.1.0'
... ... @@ -3096,13 +3116,13 @@ packages:
3096 3116 dependencies:
3097 3117 '@uppy/core': 2.3.4
3098 3118 '@uppy/xhr-upload': 2.1.3_@uppy+core@2.3.4
3099   - '@wangeditor/basic-modules': 1.1.7_j7icpicfeimtkldwmemjnpdjs4
3100   - '@wangeditor/code-highlight': 1.0.3_tztyh2vh7kwzpeloifaekkk3my
3101   - '@wangeditor/core': 1.1.19_qokc4m5r26t2nkvzejrgzroa7e
3102   - '@wangeditor/list-module': 1.0.5_tztyh2vh7kwzpeloifaekkk3my
3103   - '@wangeditor/table-module': 1.1.4_2dde2uzwslfxq2cqrl35sl4erm
3104   - '@wangeditor/upload-image-module': 1.0.2_dwqga4onuah5imhngzkgmw6t5a
3105   - '@wangeditor/video-module': 1.1.4_i6gxywmu7tvxmjxypclnjlcil4
  3119 + '@wangeditor/basic-modules': 1.1.7_4fd027a0452219352c76611896bc6997
  3120 + '@wangeditor/code-highlight': 1.0.3_9e6783eaa7faad97916e414045295b66
  3121 + '@wangeditor/core': 1.1.19_83942e33b1d7a7a6aab922626cc5c0f9
  3122 + '@wangeditor/list-module': 1.0.5_9e6783eaa7faad97916e414045295b66
  3123 + '@wangeditor/table-module': 1.1.4_d0c64d533692cb7868508af7d92f848b
  3124 + '@wangeditor/upload-image-module': 1.0.2_1da06071cda00fd430ed3654665bd3e8
  3125 + '@wangeditor/video-module': 1.1.4_478d7c5994fceb7626f87896d4ac485f
3106 3126 dom7: 3.0.0
3107 3127 is-hotkey: 0.2.0
3108 3128 lodash.camelcase: 4.3.0
... ... @@ -3117,7 +3137,7 @@ packages:
3117 3137 snabbdom: 3.5.1
3118 3138 dev: false
3119 3139  
3120   - /@wangeditor/list-module/1.0.5_tztyh2vh7kwzpeloifaekkk3my:
  3140 + /@wangeditor/list-module/1.0.5_9e6783eaa7faad97916e414045295b66:
3121 3141 resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==}
3122 3142 peerDependencies:
3123 3143 '@wangeditor/core': 1.x
... ... @@ -3125,13 +3145,13 @@ packages:
3125 3145 slate: ^0.72.0
3126 3146 snabbdom: ^3.1.0
3127 3147 dependencies:
3128   - '@wangeditor/core': 1.1.19_qokc4m5r26t2nkvzejrgzroa7e
  3148 + '@wangeditor/core': 1.1.19_83942e33b1d7a7a6aab922626cc5c0f9
3129 3149 dom7: 3.0.0
3130 3150 slate: 0.72.8
3131 3151 snabbdom: 3.5.1
3132 3152 dev: false
3133 3153  
3134   - /@wangeditor/table-module/1.1.4_2dde2uzwslfxq2cqrl35sl4erm:
  3154 + /@wangeditor/table-module/1.1.4_d0c64d533692cb7868508af7d92f848b:
3135 3155 resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==}
3136 3156 peerDependencies:
3137 3157 '@wangeditor/core': 1.x
... ... @@ -3142,7 +3162,7 @@ packages:
3142 3162 slate: ^0.72.0
3143 3163 snabbdom: ^3.1.0
3144 3164 dependencies:
3145   - '@wangeditor/core': 1.1.19_qokc4m5r26t2nkvzejrgzroa7e
  3165 + '@wangeditor/core': 1.1.19_83942e33b1d7a7a6aab922626cc5c0f9
3146 3166 dom7: 3.0.0
3147 3167 lodash.isequal: 4.5.0
3148 3168 lodash.throttle: 4.1.1
... ... @@ -3151,7 +3171,7 @@ packages:
3151 3171 snabbdom: 3.5.1
3152 3172 dev: false
3153 3173  
3154   - /@wangeditor/upload-image-module/1.0.2_dwqga4onuah5imhngzkgmw6t5a:
  3174 + /@wangeditor/upload-image-module/1.0.2_1da06071cda00fd430ed3654665bd3e8:
3155 3175 resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==}
3156 3176 peerDependencies:
3157 3177 '@uppy/core': ^2.0.3
... ... @@ -3165,15 +3185,15 @@ packages:
3165 3185 dependencies:
3166 3186 '@uppy/core': 2.3.4
3167 3187 '@uppy/xhr-upload': 2.1.3_@uppy+core@2.3.4
3168   - '@wangeditor/basic-modules': 1.1.7_j7icpicfeimtkldwmemjnpdjs4
3169   - '@wangeditor/core': 1.1.19_qokc4m5r26t2nkvzejrgzroa7e
  3188 + '@wangeditor/basic-modules': 1.1.7_4fd027a0452219352c76611896bc6997
  3189 + '@wangeditor/core': 1.1.19_83942e33b1d7a7a6aab922626cc5c0f9
3170 3190 dom7: 3.0.0
3171 3191 lodash.foreach: 4.5.0
3172 3192 slate: 0.72.8
3173 3193 snabbdom: 3.5.1
3174 3194 dev: false
3175 3195  
3176   - /@wangeditor/video-module/1.1.4_i6gxywmu7tvxmjxypclnjlcil4:
  3196 + /@wangeditor/video-module/1.1.4_478d7c5994fceb7626f87896d4ac485f:
3177 3197 resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==}
3178 3198 peerDependencies:
3179 3199 '@uppy/core': ^2.1.4
... ... @@ -3186,7 +3206,7 @@ packages:
3186 3206 dependencies:
3187 3207 '@uppy/core': 2.3.4
3188 3208 '@uppy/xhr-upload': 2.1.3_@uppy+core@2.3.4
3189   - '@wangeditor/core': 1.1.19_qokc4m5r26t2nkvzejrgzroa7e
  3209 + '@wangeditor/core': 1.1.19_83942e33b1d7a7a6aab922626cc5c0f9
3190 3210 dom7: 3.0.0
3191 3211 nanoid: 3.3.4
3192 3212 slate: 0.72.8
... ... @@ -3608,8 +3628,6 @@ packages:
3608 3628 snapdragon-node: 2.1.1
3609 3629 split-string: 3.1.0
3610 3630 to-regex: 3.0.2
3611   - transitivePeerDependencies:
3612   - - supports-color
3613 3631 dev: true
3614 3632  
3615 3633 /braces/3.0.2:
... ... @@ -3957,8 +3975,8 @@ packages:
3957 3975 engines: {node: '>=10'}
3958 3976 hasBin: true
3959 3977 dependencies:
3960   - JSONStream: 1.3.5
3961 3978 is-text-path: 1.0.1
  3979 + JSONStream: 1.3.5
3962 3980 lodash: 4.17.21
3963 3981 meow: 8.1.2
3964 3982 split2: 3.2.2
... ... @@ -4002,7 +4020,7 @@ packages:
4002 4020 vary: 1.1.2
4003 4021 dev: true
4004 4022  
4005   - /cosmiconfig-typescript-loader/4.2.0_q6dimmvgduffavfq3obt6abtea:
  4023 + /cosmiconfig-typescript-loader/4.2.0_87868632a61d0a5054b0db833f003320:
4006 4024 resolution: {integrity: sha512-NkANeMnaHrlaSSlpKGyvn2R4rqUDeE/9E5YHx+b4nwo0R8dZyAqcih8/gxpCZvqWP9Vf6xuLpMSzSgdVEIM78g==}
4007 4025 engines: {node: '>=12', npm: '>=6'}
4008 4026 peerDependencies:
... ... @@ -4013,7 +4031,7 @@ packages:
4013 4031 dependencies:
4014 4032 '@types/node': 18.11.19
4015 4033 cosmiconfig: 8.0.0
4016   - ts-node: 10.9.1_qqdszkrtcshgbphghj7vnvrrby
  4034 + ts-node: 10.9.1_84072caa33148e60bce63a7f56d6310e
4017 4035 typescript: 4.9.5
4018 4036 dev: true
4019 4037  
... ... @@ -4113,6 +4131,7 @@ packages:
4113 4131  
4114 4132 /csstype/2.6.21:
4115 4133 resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
  4134 + dev: false
4116 4135  
4117 4136 /d/1.0.1:
4118 4137 resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
... ... @@ -4136,11 +4155,6 @@ packages:
4136 4155  
4137 4156 /debug/2.6.9:
4138 4157 resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
4139   - peerDependencies:
4140   - supports-color: '*'
4141   - peerDependenciesMeta:
4142   - supports-color:
4143   - optional: true
4144 4158 dependencies:
4145 4159 ms: 2.0.0
4146 4160 dev: true
... ... @@ -4427,7 +4441,7 @@ packages:
4427 4441 escape-html: 1.0.3
4428 4442 lodash: 4.17.21
4429 4443 lodash-es: 4.17.21
4430   - lodash-unified: 1.0.3_3ib2ivapxullxkx3xftsimdk7u
  4444 + lodash-unified: 1.0.3_da03a4540fbd16bbaafbb96724306afd
4431 4445 memoize-one: 6.0.0
4432 4446 normalize-wheel-es: 1.2.0
4433 4447 vue: 3.2.47
... ... @@ -4583,7 +4597,7 @@ packages:
4583 4597 engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13', pnpm: '>= 7.0.0'}
4584 4598 dev: true
4585 4599  
4586   - /eslint-plugin-prettier/4.2.1_jqplj6qf3uqpxpu4gdyhwwasnq:
  4600 + /eslint-plugin-prettier/4.2.1_4c1eb4fa05dd20fbbe9c30f07b58126c:
4587 4601 resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
4588 4602 engines: {node: '>=12.0.0'}
4589 4603 peerDependencies:
... ... @@ -4823,8 +4837,6 @@ packages:
4823 4837 regex-not: 1.0.2
4824 4838 snapdragon: 0.8.2
4825 4839 to-regex: 3.0.2
4826   - transitivePeerDependencies:
4827   - - supports-color
4828 4840 dev: true
4829 4841  
4830 4842 /ext/1.7.0:
... ... @@ -4860,8 +4872,6 @@ packages:
4860 4872 regex-not: 1.0.2
4861 4873 snapdragon: 0.8.2
4862 4874 to-regex: 3.0.2
4863   - transitivePeerDependencies:
4864   - - supports-color
4865 4875 dev: true
4866 4876  
4867 4877 /fast-deep-equal/3.1.3:
... ... @@ -5876,7 +5886,7 @@ packages:
5876 5886 resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
5877 5887 dev: false
5878 5888  
5879   - /lodash-unified/1.0.3_3ib2ivapxullxkx3xftsimdk7u:
  5889 + /lodash-unified/1.0.3_da03a4540fbd16bbaafbb96724306afd:
5880 5890 resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
5881 5891 peerDependencies:
5882 5892 '@types/lodash-es': '*'
... ... @@ -6134,8 +6144,6 @@ packages:
6134 6144 regex-not: 1.0.2
6135 6145 snapdragon: 0.8.2
6136 6146 to-regex: 3.0.2
6137   - transitivePeerDependencies:
6138   - - supports-color
6139 6147 dev: true
6140 6148  
6141 6149 /micromatch/4.0.5:
... ... @@ -6355,8 +6363,6 @@ packages:
6355 6363 regex-not: 1.0.2
6356 6364 snapdragon: 0.8.2
6357 6365 to-regex: 3.0.2
6358   - transitivePeerDependencies:
6359   - - supports-color
6360 6366 dev: true
6361 6367  
6362 6368 /natural-compare-lite/1.4.0:
... ... @@ -6630,7 +6636,7 @@ packages:
6630 6636 hasBin: true
6631 6637 dev: true
6632 6638  
6633   - /pinia/2.0.30_hmuptsblhheur2tugfgucj7gc4:
  6639 + /pinia/2.0.30_typescript@4.9.5+vue@3.2.47:
6634 6640 resolution: {integrity: sha512-q6DUmxWwe/mQgg+55QQjykpKC+aGeGdaJV3niminl19V08dE+LRTvSEuqi6/NLSGCKHI49KGL6tMNEOssFiMyA==}
6635 6641 peerDependencies:
6636 6642 '@vue/composition-api': ^1.4.0
... ... @@ -7337,8 +7343,6 @@ packages:
7337 7343 source-map: 0.5.7
7338 7344 source-map-resolve: 0.5.3
7339 7345 use: 3.1.1
7340   - transitivePeerDependencies:
7341   - - supports-color
7342 7346 dev: true
7343 7347  
7344 7348 /sortablejs/1.14.0:
... ... @@ -7541,7 +7545,7 @@ packages:
7541 7545 resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
7542 7546 dev: true
7543 7547  
7544   - /stylelint-config-html/1.1.0_kbto3rg3njmczth2rrsgfnlsqa:
  7548 + /stylelint-config-html/1.1.0_5066edc4db6a582cccfa8c6462b57280:
7545 7549 resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==}
7546 7550 engines: {node: ^12 || >=14}
7547 7551 peerDependencies:
... ... @@ -7594,7 +7598,7 @@ packages:
7594 7598 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
7595 7599 hasBin: true
7596 7600 dependencies:
7597   - '@csstools/selector-specificity': 2.0.2_wajs5nedgkikc5pcuwett7legi
  7601 + '@csstools/selector-specificity': 2.0.2_b0132eb4833290a175e2a58939fd6432
7598 7602 balanced-match: 2.0.0
7599 7603 colord: 2.9.3
7600 7604 cosmiconfig: 7.1.0
... ... @@ -7691,8 +7695,6 @@ packages:
7691 7695 posthtml-svg-mode: 1.0.3
7692 7696 query-string: 4.3.4
7693 7697 traverse: 0.6.7
7694   - transitivePeerDependencies:
7695   - - supports-color
7696 7698 dev: true
7697 7699  
7698 7700 /svg-tags/1.0.0:
... ... @@ -7840,7 +7842,7 @@ packages:
7840 7842 engines: {node: '>=8'}
7841 7843 dev: true
7842 7844  
7843   - /ts-node/10.9.1_qqdszkrtcshgbphghj7vnvrrby:
  7845 + /ts-node/10.9.1_84072caa33148e60bce63a7f56d6310e:
7844 7846 resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
7845 7847 hasBin: true
7846 7848 peerDependencies:
... ... @@ -7936,6 +7938,7 @@ packages:
7936 7938 resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
7937 7939 engines: {node: '>=4.2.0'}
7938 7940 hasBin: true
  7941 + dev: true
7939 7942  
7940 7943 /ufo/1.0.1:
7941 7944 resolution: {integrity: sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==}
... ... @@ -8006,7 +8009,7 @@ packages:
8006 8009 engines: {node: '>= 10.0.0'}
8007 8010 dev: true
8008 8011  
8009   - /unplugin-auto-import/0.13.0_z2glzmrjcar3r3i7v53oix2lwa:
  8012 + /unplugin-auto-import/0.13.0_ce8cbcb2291023b8ed1faf76e45f4bb0:
8010 8013 resolution: {integrity: sha512-nKMxDbkjM4FRPInFfm7sWrJOKgxfKKwb5yLPP+DEGl/SG0/FtBoW1LnZL4PQfx0FXjertoHO1P/5nDf+RSip2Q==}
8011 8014 engines: {node: '>=14'}
8012 8015 peerDependencies:
... ... @@ -8159,7 +8162,7 @@ packages:
8159 8162 chalk: 4.1.2
8160 8163 debug: 4.3.4
8161 8164 fs-extra: 10.1.0
8162   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  8165 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
8163 8166 transitivePeerDependencies:
8164 8167 - supports-color
8165 8168 dev: true
... ... @@ -8180,7 +8183,7 @@ packages:
8180 8183 '@types/eslint': 8.4.10
8181 8184 eslint: 8.33.0
8182 8185 rollup: 2.79.1
8183   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  8186 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
8184 8187 dev: true
8185 8188  
8186 8189 /vite-plugin-progress/0.0.6_vite@4.1.1:
... ... @@ -8192,7 +8195,7 @@ packages:
8192 8195 picocolors: 1.0.0
8193 8196 progress: 2.0.3
8194 8197 rd: 2.0.1
8195   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  8198 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
8196 8199 dev: true
8197 8200  
8198 8201 /vite-plugin-purge-icons/0.9.2_vite@4.1.1:
... ... @@ -8204,7 +8207,7 @@ packages:
8204 8207 '@purge-icons/core': 0.9.1
8205 8208 '@purge-icons/generated': 0.9.0
8206 8209 rollup-plugin-purge-icons: 0.9.1
8207   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  8210 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
8208 8211 transitivePeerDependencies:
8209 8212 - encoding
8210 8213 - supports-color
... ... @@ -8223,7 +8226,7 @@ packages:
8223 8226 pathe: 0.2.0
8224 8227 svg-baker: 1.7.0
8225 8228 svgo: 2.8.0
8226   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  8229 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
8227 8230 transitivePeerDependencies:
8228 8231 - supports-color
8229 8232 dev: true
... ... @@ -8235,7 +8238,7 @@ packages:
8235 8238 dependencies:
8236 8239 '@vue/compiler-sfc': 3.2.45
8237 8240 magic-string: 0.25.9
8238   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  8241 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
8239 8242 dev: true
8240 8243  
8241 8244 /vite-plugin-windicss/1.8.10_vite@4.1.1:
... ... @@ -8246,13 +8249,13 @@ packages:
8246 8249 '@windicss/plugin-utils': 1.8.10
8247 8250 debug: 4.3.4
8248 8251 kolorist: 1.6.0
8249   - vite: 4.1.1_sf2ihp5jwkcy5ypowegsyojpbq
  8252 + vite: 4.1.1_917483bfa9b2858ee1eeb10d2c392f0c
8250 8253 windicss: 3.5.6
8251 8254 transitivePeerDependencies:
8252 8255 - supports-color
8253 8256 dev: true
8254 8257  
8255   - /vite/4.1.1_sf2ihp5jwkcy5ypowegsyojpbq:
  8258 + /vite/4.1.1_917483bfa9b2858ee1eeb10d2c392f0c:
8256 8259 resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==}
8257 8260 engines: {node: ^14.18.0 || >=16.0.0}
8258 8261 hasBin: true
... ... @@ -8301,6 +8304,7 @@ packages:
8301 8304 optional: true
8302 8305 dependencies:
8303 8306 vue: 3.2.47
  8307 + dev: false
8304 8308  
8305 8309 /vue-eslint-parser/9.1.0_eslint@8.33.0:
8306 8310 resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==}
... ... @@ -8331,6 +8335,7 @@ packages:
8331 8335 '@intlify/vue-devtools': 9.2.2
8332 8336 '@vue/devtools-api': 6.4.5
8333 8337 vue: 3.2.47
  8338 + dev: false
8334 8339  
8335 8340 /vue-router/4.1.6_vue@3.2.47:
8336 8341 resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==}
... ... @@ -8380,6 +8385,7 @@ packages:
8380 8385 '@vue/runtime-dom': 3.2.47
8381 8386 '@vue/server-renderer': 3.2.47_vue@3.2.47
8382 8387 '@vue/shared': 3.2.47
  8388 + dev: false
8383 8389  
8384 8390 /vuedraggable/4.1.0_vue@3.2.47:
8385 8391 resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
... ...
yudao-ui-admin-vue3/src/views/report/goview/index.vue 0 → 100644
  1 +<template>
  2 + <ContentWrap>
  3 + <IFrame :src="src" />
  4 + </ContentWrap>
  5 +</template>
  6 +<script setup lang="ts" name="GoView">
  7 +const src = 'http://127.0.0.1:3000'
  8 +</script>
... ...
yudao-ui-admin-vue3/src/views/visualization/jmreport/index.vue renamed to yudao-ui-admin-vue3/src/views/report/jmreport/index.vue
yudao-ui-admin/src/views/report/goview/index.vue 0 → 100644
  1 +<template>
  2 + <div>
  3 + <doc-alert title="大屏设计器" url="https://doc.iocoder.cn/report/screen/" />
  4 + <i-frame :src="url" />
  5 + </div>
  6 +</template>
  7 +<script>
  8 +import iFrame from "@/components/iFrame/index";
  9 +export default {
  10 + name: "GoView",
  11 + components: { iFrame },
  12 + data() {
  13 + return {
  14 + url: 'http://127.0.0.1:3000',
  15 + };
  16 + },
  17 +};
  18 +</script>
... ...
yudao-ui-admin/src/views/visualization/jmreport/index.vue renamed to yudao-ui-admin/src/views/report/jmreport/index.vue