Compare commits

..

1021 Commits

Author SHA1 Message Date
奔跑的面条
fa84ee778c !88 feat-unify-test 试验后端工厂和事件机制
Merge pull request !88 from Kenjjj201377/feat-unify-test
2022-10-25 02:23:17 +00:00
金建
0eb75fbba4 fix: 整理文档 2022-10-25 00:05:52 +08:00
金建
6858f5bd39 fix: 保存进程移除 2022-10-24 23:37:41 +08:00
jinjian
b9f6ed95ab feat: 代码整合 2022-10-24 17:21:58 +08:00
奔跑的面条
8039213380 build: 修改版本号为2.1.0 2022-10-15 17:28:23 +08:00
奔跑的面条
c5a704767d fix: 修改版本号到2.0.10 2022-10-15 17:22:06 +08:00
奔跑的面条
20be7f2e45 Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch-dev 2022-10-15 17:20:05 +08:00
奔跑的面条
fa476b6186 perf: 去除grid多余配置,添加散点图、热力图的grid 2022-10-15 16:51:16 +08:00
奔跑的面条
9c9bc98216 !80 feat: 折线图和柱状图添加网格配置,xy轴标签偏移量
Merge pull request !80 from jiangcheng/dev
2022-10-15 02:09:47 +00:00
蒋承
362456bdea feat: x,y轴标签偏移量 2022-10-14 17:09:26 +08:00
蒋承
ffceed63ca feat: 网格容器配置 2022-10-14 16:50:06 +08:00
蒋承
3cb4dbb12b feat: 柱状图折线图添加网格配置 2022-10-14 16:46:41 +08:00
奔跑的面条
5a981109de fix: 解决导入时顺序不对的问题 2022-10-14 14:33:14 +08:00
奔跑的面条
e6b7a868a2 perf: 优化导入失败提示 2022-10-14 09:37:31 +08:00
奔跑的面条
0aa3f68f6d perf: 优化亮色模式图层提示 2022-10-14 09:37:12 +08:00
奔跑的面条
796bfd2c98 fix: 解决 分组复制 id 会重复的问题 2022-10-13 21:10:32 +08:00
奔跑的面条
df0728ea12 perf: 优化按下文案tishi 2022-10-13 20:48:12 +08:00
奔跑的面条
7c745c5613 perf: 优化键盘按下的提示 2022-10-13 20:45:51 +08:00
奔跑的面条
73090a6f1e perf: 优化报错信息捕获,去除setPosition自带函数 2022-10-13 20:21:33 +08:00
奔跑的面条
e46ee17914 perf: 优化格式 2022-10-13 19:52:41 +08:00
奔跑的面条
93e5b38491 !78 feat: 过滤方法增加api返回顶级对象作为参数,增强过滤器兼容性
Merge pull request !78 from dodu/dev-api-filter
2022-10-13 10:05:39 +00:00
奔跑的面条
37593bc257 perf: 优化异常处理 2022-10-12 21:57:30 +08:00
奔跑的面条
b2eb54ca4b !77 feat: 折线图和柱状图配置label选项
Merge pull request !77 from jiangcheng/dev
2022-10-12 13:35:36 +00:00
奔跑的面条
bfbc7edd31 fix: 新增三维组件限制 2022-10-12 21:30:08 +08:00
奔跑的面条
a43b9fbdec perf: 优化三维地球内存泄漏 2022-10-12 21:15:08 +08:00
奔跑的面条
5c4df5c824 feat: 新增三维地球 2022-10-12 21:08:24 +08:00
tnt group
5cc10c4198 fix: 移除开发标记 2022-10-12 16:50:25 +08:00
tnt group
b6d366e86d feat: 过滤方法增加api返回顶级对象作为参数,增强过滤器兼容性 2022-10-12 16:41:49 +08:00
jiangcheng
6e1740d2e2 Merge branch 'dev' of https://gitee.com/jiang_cheng_1/go-view into dev 2022-10-12 11:31:05 +08:00
jiangcheng
2c6493105a fix: 格式问题 2022-10-12 11:30:54 +08:00
奔跑的面条
c290d407a3 perf: 优化补丁的判单方式 2022-10-11 16:02:43 +08:00
奔跑的面条
43713ba7dc perf: 修改ctrl默认值 2022-10-11 15:15:03 +08:00
奔跑的面条
5e28c513a4 perf: 优化 ctrl 监听 2022-10-10 18:47:07 +08:00
奔跑的面条
d43823794d fix: 修复导入组件数据会错乱的问题 2022-10-09 16:39:10 +08:00
蒋承
318a90f709 feat: 折线图和柱状图配置label 2022-10-09 16:04:29 +08:00
蒋承
5326405a38 feat: 更新 2022-10-09 15:50:46 +08:00
蒋承
f8ec88ea64 Merge branch 'dev' of https://gitee.com/jiang_cheng_1/go-view into dev 2022-10-09 15:36:00 +08:00
奔跑的面条
0d5e6d6e53 !72 在框选结束时,勿操作鼠标往选框内移动,选框不消失
Merge pull request !72 from 关宏荣/dev
2022-10-09 07:33:45 +00:00
奔跑的面条
c24e77d3af build: 新增小版本1.1.11 2022-10-09 15:25:40 +08:00
奔跑的面条
02e4ebf884 build: 修改版本1.1.1 2022-10-09 15:24:34 +08:00
奔跑的面条
03b22f4af1 fix: 修复导入组件数据会错乱的问题 2022-10-09 15:23:51 +08:00
蒋承
324edc27e1 feat: 动态数据维度不同,导致整合维度bug 2022-10-09 13:58:29 +08:00
hguan
cf63d5d086 fix: 🐛 修复框选选框不消失问题
鼠标抬起的时候,结束节流函数
2022-10-09 10:34:09 +08:00
奔跑的面条
5e09105a70 Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch-dev 2022-10-09 09:29:40 +08:00
奔跑的面条
f5c3f51db2 build: 升级naive-ui到2.33.4 2022-10-09 09:27:51 +08:00
奔跑的面条
7d2a98ab85 build: 修改正确版本到 2.0.8 2022-10-08 21:27:21 +08:00
奔跑的面条
2d302bb468 build: 升级版本到 2.0.9 2022-10-08 21:09:47 +08:00
奔跑的面条
789328b02e Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch-dev 2022-10-08 21:06:06 +08:00
奔跑的面条
db9dca09e8 style: 修改错误注释 2022-10-08 21:05:32 +08:00
奔跑的面条
b93a2a516a feat: 合并1.1.1 2022-10-08 21:04:41 +08:00
奔跑的面条
3e10592a74 perf: 优化混合提示的展示方式 2022-10-08 20:58:48 +08:00
奔跑的面条
3e5e1a9b41 style: 优化代码 2022-10-08 20:49:08 +08:00
奔跑的面条
9ee62dffca fix: 解决右键解锁无法使用的问题 2022-10-08 20:48:52 +08:00
奔跑的面条
778be20ddc perf: 优化首页样式 2022-10-08 20:32:36 +08:00
奔跑的面条
23e76a93f4 !68 feat: 组件公共属性滤镜中增添混合模式设置
Merge pull request !68 from dodu/dev-commet
2022-10-08 11:38:12 +00:00
奔跑的面条
29eee8fa48 !71 地图南海群岛bug
Merge pull request !71 from daidai/dev
2022-10-08 09:46:13 +00:00
刘嘉威
8bf3c3bb75 fix: 解决地图编辑不显示南海群岛 预览时仍显示 2022-10-08 14:52:56 +08:00
tnt group
4c2ca2b635 fix: 修复分组未应用混合模式 2022-10-08 12:56:07 +08:00
tnt group
a20f540027 fix: 修复画布不使用旋转属性配置 2022-10-08 11:54:54 +08:00
tnt group
bd7d3fe23e fix: 修复因画布未默认设置背景色或背景图片导致预览时的混合状态未生效问题 2022-10-08 11:44:56 +08:00
tnt group
f0f8c86b0d fix: 替换 BLEND_MODE 2022-10-08 11:43:38 +08:00
奔跑的面条
0138db1b4f perf: 优化超时时间 2022-10-08 09:17:42 +08:00
奔跑的面条
a7d433b62d fix: 优化Naive编译之后页面不对的bug 2022-10-07 18:56:31 +08:00
tnt group
6f93b1f599 feat: 组件公共属性滤镜中增添混合模式设置 2022-10-05 21:56:43 +08:00
奔跑的面条
2a9983047a fix: 修改切换轮播表格配置不会变的问题 2022-10-05 17:08:52 +08:00
奔跑的面条
e81d7e8b20 !67 feat: 新增 数字翻牌 和 倒计时(翻牌效果) 组件
Merge pull request !67 from dodu/dev-countdown
2022-10-03 08:40:10 +00:00
tnt group
2c0658ce50 fix: 修复倒计时组件 Extraneous non-props attributes 问题 2022-10-02 23:06:23 +08:00
奔跑的面条
f97112f117 perf: 修改图层类型图标 2022-10-02 20:28:21 +08:00
tnt group
7cf39a0e58 fix: 移除多余注释 2022-10-01 22:50:17 +08:00
tnt group
4c290d64ba fix: 修复 naive-ui 引用版本造成倒计时异常 2022-10-01 22:49:27 +08:00
奔跑的面条
9707e4af0f feat: 新增图层展示类型持久化存储 2022-10-01 21:10:06 +08:00
奔跑的面条
9161374320 perf: 修改颜色默认展示,格式化代码 2022-10-01 20:34:24 +08:00
奔跑的面条
8d81ed3870 fix: 解决前进撤回中锁定/隐藏无法正常实现的问题 2022-10-01 19:59:57 +08:00
奔跑的面条
ef7dbba3ce style: 去除多余代码 2022-10-01 17:27:06 +08:00
奔跑的面条
e9e5b798e7 perf: 去除屏幕大小处理 2022-10-01 17:26:52 +08:00
tnt group
d0f3490bd5 style: 调整缩略图和默认颜色配置 2022-10-01 10:27:11 +08:00
tnt group
2036a509f0 style: 调整翻牌默认大小 2022-09-30 22:25:08 +08:00
奔跑的面条
3c802d44f4 perf: 无数据时候的禁止下载和导入 2022-09-30 16:21:52 +08:00
奔跑的面条
96def0107d perf: 优化部分组件接口返回错误数据,页面会卡死的问题 2022-09-30 16:03:35 +08:00
奔跑的面条
f96a9c9d6f fix: 修改饼图环形数值不出现的问题 2022-09-30 15:43:58 +08:00
tnt group
5220cae94a style: 优化调整属性分类 2022-09-30 12:18:46 +08:00
tnt group
4048d4a418 feat: 加入缩略图,完成倒计时功能 2022-09-30 11:39:41 +08:00
tnt group
872382b4a3 feat: 完成数字翻牌组件 2022-09-30 09:22:56 +08:00
tnt group
77a763db75 chore: 基本完成翻牌器 2022-09-30 01:29:48 +08:00
tnt group
73ce3a8551 fix: 修复中 2022-09-29 19:25:29 +08:00
tnt group
a56ddc9415 perf: 优化翻牌组件 2022-09-29 19:11:54 +08:00
奔跑的面条
122635248e !66 fix: 丰富地图配置
Merge pull request !66 from jiangcheng/dev
2022-09-29 09:19:32 +00:00
蒋承
01bf37ce38 feat: 丰富地图配置 2022-09-29 15:23:32 +08:00
tnt group
4a75cc4d11 chore: 调整倒计时组件 2022-09-29 15:21:22 +08:00
tnt group
d0260041ce fix: 引入 naiveui NCountdown 组件 2022-09-29 15:21:04 +08:00
tnt group
e3d5860a41 fix: 调整翻牌器样式控制 2022-09-29 15:20:23 +08:00
奔跑的面条
650ee93368 !64 fix: 修复隐藏组件预览状态下的异常
Merge pull request !64 from dodu/dev-commet
2022-09-29 06:59:34 +00:00
蒋承
ac85b72be8 feat: 丰富地图配置 2022-09-29 12:37:19 +08:00
tnt group
fd8aeba700 fix: 调整预览状态下控制状态样式 2022-09-29 11:35:35 +08:00
奔跑的面条
dad4d41894 feat: 新增锁定/隐藏快捷键处理 2022-09-29 10:47:07 +08:00
tnt group
144ef06cd1 feat: 增加倒计时组件(测试中) 2022-09-29 10:34:29 +08:00
tnt group
885387cb5a feat: 增加通用翻牌器组件 2022-09-29 10:32:17 +08:00
奔跑的面条
dd13a0844b style: 优化代码 2022-09-29 10:10:54 +08:00
奔跑的面条
b66205eda9 perf: 优化层级展示, 优化失焦隐藏代码 2022-09-29 09:55:11 +08:00
奔跑的面条
6ea3f0701e perf: 优化层级UI展示 2022-09-29 09:12:05 +08:00
tnt group
1aade9c4b8 fix: 修复隐藏组件预览状态下的异常 2022-09-28 22:16:08 +08:00
奔跑的面条
6f5d1d9459 feat: 新增锁定和隐藏失焦 2022-09-28 21:39:31 +08:00
奔跑的面条
a8211c6a41 perf: 优化层级的 UI 样式,支持点击图标完成功能 2022-09-28 21:31:41 +08:00
奔跑的面条
752cb744c0 !63 feat: 增加图层隐藏锁定功能,图层列表模式控制
Merge pull request !63 from dodu/dev-layers
2022-09-28 13:30:35 +00:00
tnt group
c22d559195 feat: 隐藏锁定操作,支持历史记录回退和前进 2022-09-28 18:43:55 +08:00
tnt group
2c834c1d62 feat: 锁定组件不能选中和拖动 2022-09-28 17:51:59 +08:00
tnt group
cc97672fcc feat: 锁定和隐藏组件不能被框选 2022-09-28 17:38:15 +08:00
tnt group
e49cf3dea2 feat: 增加 锁定组件 hover 和 select 样式控制 2022-09-28 17:37:09 +08:00
tnt group
abbf678e89 fix: 隐藏后,立即取消选中组件 2022-09-28 17:34:11 +08:00
tnt group
634b5c2bea feat: 增加右键菜单功能及处理逻辑 2022-09-28 16:47:12 +08:00
tnt group
e559ca928a chore: 完成锁定及隐藏,列表方式功能占位 2022-09-28 11:21:29 +08:00
奔跑的面条
c8662537ca feat: 合并1.1.1,升级版本到2.0.8 2022-09-27 20:28:47 +08:00
tnt group
04539d605d feat: 添加图层模式控制选项 2022-09-27 20:14:00 +08:00
奔跑的面条
ddf067560a perf: 去除不生效的配置代码 2022-09-27 20:08:43 +08:00
奔跑的面条
7e036261e8 perf: 优化性能,去除组件中多余注册内容 2022-09-27 20:02:35 +08:00
奔跑的面条
b083bd9724 style: 去除无用代码,设置默认值 2022-09-27 19:53:55 +08:00
奔跑的面条
0481d42f36 !62 fix: 文本组件新增字体加粗选项
Merge pull request !62 from jiangcheng/dev
2022-09-27 03:32:12 +00:00
蒋承
6bac8e10ba feat: 新增文本字体加粗 2022-09-27 10:56:26 +08:00
奔跑的面条
5fd6870cfe perf: 优化用户体验,完成接口配置后调用保存接口 2022-09-27 10:33:30 +08:00
奔跑的面条
ce9d59896c perf: 打印错误ri'zrizhi 2022-09-27 10:18:20 +08:00
奔跑的面条
e6da8d8b9f Merge branch 'dev' of https://gitee.com/MTrun/go-view into dev 2022-09-27 10:03:32 +08:00
奔跑的面条
d8fcf4e7d3 fix: 处理文字预览不更新的问题 2022-09-27 10:01:43 +08:00
奔跑的面条
56c3b9f935 !61 fix: 修复文本设置链接时,字体样式丢失问题,并增加水平对齐配置
Merge pull request !61 from dodu/dev-commet
2022-09-27 01:46:33 +00:00
tnt group
7c871c775c fix: 修复文本设置链接时,字体样式丢失问题,并增加水平对齐配置 2022-09-27 08:56:49 +08:00
奔跑的面条
c0e38e64db feat: 新增基础树图 2022-09-26 21:18:01 +08:00
奔跑的面条
26eb3aef27 !60 饼图新增类型可修改
Merge pull request !60 from jiangcheng/dev
2022-09-26 12:38:22 +00:00
奔跑的面条
5d8d2cde3f perf: 优化 lock 2022-09-26 20:32:27 +08:00
奔跑的面条
369614af1e !59 feat: 新增 标题装饰 和 时钟 组件
Merge pull request !59 from dodu/dev-clock
2022-09-26 12:25:09 +00:00
奔跑的面条
55d5f160a5 perf: 词云优化 2022-09-26 20:00:39 +08:00
奔跑的面条
f25217c394 !57 feat: 添加词云组件
Merge pull request !57 from dodu/dev-commet
2022-09-26 11:59:53 +00:00
奔跑的面条
d7bc1b6d5c perf: 去除组件默认滤镜和变换,避免模糊问题 2022-09-26 19:40:46 +08:00
蒋承
f101b476fb feat: 饼图新增类型 2022-09-26 17:34:33 +08:00
tnt group
44a5e2dc4b perf: 强化chartConfig类型 2022-09-26 17:12:16 +08:00
tnt group
1ece3072a0 perf: 优化时钟,移除无用元素 2022-09-26 17:07:12 +08:00
tnt group
8e1b56d74c perf: 调整装饰3的默认大小 2022-09-26 16:44:19 +08:00
tnt group
ba0cc9cd82 feat: 新增装饰6组件 2022-09-26 16:44:02 +08:00
tnt group
1b5d0ee955 feat: 新增 clock 小组件 2022-09-26 15:00:47 +08:00
蒋承
ae42dec906 feat: 饼图类型新增可选 2022-09-26 11:17:00 +08:00
tnt group
31be6737f2 perf: 移除文件内eslint注释 2022-09-25 22:18:42 +08:00
tnt group
5987e83a12 fix: 修复合并时遗漏的冲突 2022-09-25 22:10:42 +08:00
tnt group
73955aef09 Merge branch 'dev-wordcloud' into dev-commet 2022-09-25 22:06:29 +08:00
奔跑的面条
0ddbdfce57 !54 fix: 添加lint规则运行脚本,修复lint错误
Merge pull request !54 from dodu/dev-lint-commet
2022-09-25 10:47:34 +00:00
奔跑的面条
3af6bf3a4f perf: 优化新地图组件 2022-09-25 17:48:51 +08:00
奔跑的面条
3b8280ed3a !56 新增可选省份地图组件
Merge pull request !56 from daidai/dev
2022-09-25 09:40:37 +00:00
daidai
644d761cba perf: 可选省份地图组件异步加载geojson 2022-09-24 18:54:05 +08:00
奔跑的面条
4d68a81ab4 !51 1、接口请求参数js动态获取
Merge pull request !51 from 潘潘/dev
2022-09-22 11:47:00 +00:00
奔跑的面条
b9e3053fe3 perf: 优化视频组件 2022-09-22 19:38:35 +08:00
奔跑的面条
a48bdd08ff !50 feat: 新增视频组件
Merge pull request !50 from dodu/dev-video
2022-09-22 11:30:40 +00:00
奔跑的面条
ad29bf5f26 feat: 新增文本跳转功能 2022-09-22 19:17:26 +08:00
奔跑的面条
e0bc13cccb !52 文本组件添加链接功能
Merge pull request !52 from 自由/wu
2022-09-22 11:16:25 +00:00
刘嘉威
aabc907864 feat: 增加可选省份地图(异步会有问题) 2022-09-22 17:16:54 +08:00
刘嘉威
df75da275b feat: 增加可选省份地图 2022-09-22 17:09:26 +08:00
奔跑的面条
9004a55b8c Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch-dev 2022-09-22 14:15:18 +08:00
奔跑的面条
3087606a5d build: 修改依赖 2022-09-22 14:13:14 +08:00
tnt group
c653006045 Merge branch 'dev-lint' into dev-lint-commet 2022-09-22 10:08:25 +08:00
tnt group
a6e7158800 fix: 修复默认值冲突,导致旋转属性不生效的问题 2022-09-22 09:27:06 +08:00
tnt group
97e81d8d99 fix: 修复自定义属性异常 2022-09-22 09:20:36 +08:00
tnt group
99cad606e7 fix: 增加 mock api,修复预览模式下动态数据更新问题 2022-09-22 09:01:19 +08:00
tnt group
c4a7c673f8 feat: 初步添加词云组件 2022-09-22 01:01:54 +08:00
奔跑的面条
c349e6384e Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch-dev 2022-09-21 19:56:56 +08:00
奔跑的面条
b23d8504d2 perf: 去除多余图片,修改展示图 2022-09-21 19:46:02 +08:00
wuyuting1
662c2fd4dd feat: 文字组件添加链接功能 2022-09-21 17:27:50 +08:00
wuyuting1
ae77a32c87 feat: text组件增加点击链接弹框 2022-09-20 17:51:41 +08:00
panjianhua
d1b9c1764d feat: 请求参数动态配置 2022-09-19 23:26:14 +08:00
奔跑的面条
4e298efaa0 Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch-dev 2022-09-19 20:46:53 +08:00
奔跑的面条
deca505b9c fix: 解决组件数据配置会互相影响的问题 2022-09-19 20:46:13 +08:00
奔跑的面条
185936467d fix: 解决修改完配置会调用两次接口的问题 2022-09-19 20:39:30 +08:00
奔跑的面条
c7cbb9b72a Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch-dev 2022-09-19 20:14:40 +08:00
奔跑的面条
c3d1c4312c fix: 解决图表组件直接切换,请求配置信息未更新的bug 2022-09-19 19:49:49 +08:00
奔跑的面条
55119bee93 perf: 优化工具栏样式 2022-09-19 19:34:32 +08:00
奔跑的面条
bd5e06350d perf: 优化滤镜模糊问题,默认不开启 2022-09-19 17:51:12 +08:00
tnt group
be992ab9b1 fix: 去掉示例资源,默认使用本地资源,增加属性 2022-09-19 17:43:15 +08:00
奔跑的面条
352a97d5c1 perf: 优化滤镜模糊问题,默认不开启 2022-09-19 17:32:19 +08:00
tnt group
491246205e fix: 修复使用视频组件时保存画板缩略图的异常 2022-09-19 16:12:35 +08:00
tnt group
f2087205c1 fix: 修复预览模式下组件的混合模式 2022-09-19 12:33:14 +08:00
tnt group
4f55b881db fix: 完成视频组件,并支持属性实时控制video状态 2022-09-19 12:32:27 +08:00
奔跑的面条
c311dd08e3 fix: 修改请求接口 token 名称 2022-09-18 17:45:59 +08:00
奔跑的面条
504a1f4703 build: 升级版本到2.0.7 2022-09-18 17:23:16 +08:00
奔跑的面条
2f24548cb1 feat: 新增映射组件颜色配置 2022-09-18 16:47:50 +08:00
奔跑的面条
a67cc9f876 !47 修复在编辑项目之前加载数据异常,自动保存导致项目数据清空问题。
Merge pull request !47 from 秋名山路霸/master-fetch
2022-09-18 07:53:47 +00:00
奔跑的面条
92c7e1fce5 !46 fix: 组件ChartsItemBox支持双击添加图表到画布
Merge pull request !46 from dodu/dev-temp
2022-09-18 07:38:28 +00:00
tnt group
a2e2373dfd feat: 新增视频组件(支持混合模式视频背景透明) 2022-09-18 13:07:44 +08:00
秋名山路霸
e0d2e8031d fix: 修复在编辑项目之前加载数据异常,自动保存导致项目数据清空问题。 2022-09-18 11:56:26 +08:00
奔跑的面条
ef4beff52a perf: 优化工具栏图标展示方式 2022-09-17 22:45:36 +08:00
奔跑的面条
7121a6b2f8 perf: 优化工具栏展示方式 2022-09-17 22:40:24 +08:00
奔跑的面条
489560e670 fix: 解决配置接口点击确定会立即调用两次接口的bug 2022-09-17 21:54:10 +08:00
奔跑的面条
bad3e31b0a perf: 优化散点图,新增数据mock 2022-09-17 21:43:20 +08:00
奔跑的面条
854f7f15a4 perf: 补充列表的分类 2022-09-17 16:11:26 +08:00
奔跑的面条
d3d3cb440e !42 feat: 增加多个散点图,散点图单独作为分类从More提出
Merge pull request !42 from dodu/dev-commet
2022-09-17 08:10:28 +00:00
奔跑的面条
c04f53a9c4 feat: 新增热力图mock,解决热力图无法响应式更新的问题 2022-09-17 12:12:22 +08:00
奔跑的面条
cfc2055af8 perf: 优化热力图展示,新增全局映射配置 2022-09-17 11:18:57 +08:00
tnt group
94ae80419d Merge branch 'dev-commet' into dev-temp 2022-09-16 12:58:41 +08:00
tnt group
988153aaad Merge branch 'dev-commet' into dev-lint 2022-09-16 12:55:07 +08:00
tnt group
77076136a6 fix: 修复 ecStat.transform 编译错误 2022-09-16 12:52:44 +08:00
tnt group
628d66e80e fix: 添加lint规则运行脚本,修复lint错误 2022-09-16 12:26:12 +08:00
tnt group
d4ba828d08 feat: 组件ChartsItemBox支持双击添加图标 2022-09-16 10:30:53 +08:00
tnt group
05849a3d92 chore: 调整属性名称 2022-09-16 09:46:49 +08:00
奔跑的面条
e7c227f4ae !43 feat: 提交热力图
Merge pull request !43 from Furoe/dev
2022-09-16 01:35:25 +00:00
tnt group
04cf44a528 fix: 调整散点图的tooltip配置 2022-09-16 08:41:27 +08:00
yangwq7
c1d9702c58 fix: 修复热力图默认X、Y轴显示问题 2022-09-15 20:25:18 +08:00
yangwq7
884a70168d feat: 提交热力图 2022-09-15 20:01:07 +08:00
tnt group
e24a029a78 Merge branch 'dev-echarts-scatter' into dev-commet 2022-09-15 18:52:17 +08:00
tnt group
c7d6403a09 feat: 完成散点图的属性及配置优化 2022-09-15 18:41:17 +08:00
tnt group
6804a52e76 feat: 添加多种的散点图支持 2022-09-15 12:07:01 +08:00
奔跑的面条
82a55b75b8 fix: 修改非 window 环境打包路径报错的问题 2022-09-15 11:48:39 +08:00
tnt group
47aba057fd fix: 完成基本内容 2022-09-15 01:28:57 +08:00
tnt group
e6211cd523 feat: 初步创建散点图 2022-09-14 19:09:59 +08:00
奔跑的面条
9c9ab6c734 perf: 修改展示图片 2022-09-14 16:22:13 +08:00
奔跑的面条
abfcbe27de fix: 修改双折线渐变图编辑问题 2022-09-14 15:31:56 +08:00
奔跑的面条
bcec26374f build: 升级依赖,锁定TS 版本 2022-09-12 01:20:27 +08:00
奔跑的面条
a2bd41cd57 build: 升级依赖,锁定TS版本 2022-09-12 01:14:15 +08:00
奔跑的面条
cab509b9a3 build: 升级版本到 1.0.9 2022-09-12 01:05:19 +08:00
奔跑的面条
a5981a4387 feat: 升级版本到 2.0.6 2022-09-12 00:49:22 +08:00
奔跑的面条
0d26dce512 fix: 合并1.0.9 2022-09-12 00:31:52 +08:00
奔跑的面条
ee1b55cad9 style: 优化类命名,格式化代码结构,优化注释 2022-09-12 00:28:13 +08:00
奔跑的面条
27020b2920 perf: 优化图标展示,修复 dataset 的问题(我TM就不该相信这个半成品),优化性能监听 2022-09-11 22:53:00 +08:00
奔跑的面条
99aea4b9d3 fix: 解决部分图表改成层级丢失响应式的 bug 2022-09-11 01:26:55 +08:00
奔跑的面条
e1521a31ac fix: 修复雷达图预览无法更新的问题 2022-09-10 18:50:20 +08:00
奔跑的面条
97df12ee5f fix: 修改水球图类型 2022-09-08 21:23:23 +08:00
奔跑的面条
b9783b168f perf: 优化页面交互操作 2022-09-08 21:04:13 +08:00
奔跑的面条
7b3012d8da fix: 优化漏斗图使用,解决预览数据变更页面的问题 2022-09-08 20:47:34 +08:00
奔跑的面条
455a9735e7 perf: 新增单数据mock接口,优化漏斗图展示 2022-09-08 20:23:01 +08:00
奔跑的面条
b277bd63c6 fix: 处理打包TS报错 2022-09-08 17:33:46 +08:00
奔跑的面条
1c170bbb8a fix: 修复生成组件时 toRef 报错的问题 2022-09-08 17:33:31 +08:00
奔跑的面条
2234861cff fix: 修改雷达预览不会更新数据的问题 2022-09-08 17:01:43 +08:00
奔跑的面条
0f30ac9694 feat: 新增雷达mock 2022-09-08 17:01:21 +08:00
奔跑的面条
b618ecfef2 fix: 修改打包TS报错 2022-09-08 16:34:55 +08:00
奔跑的面条
56b96bfe44 perf: 优化漏斗代码 2022-09-08 16:31:26 +08:00
奔跑的面条
c0bc170422 !41 feat: 完善漏斗图组件
Merge pull request !41 from dodu/dev-commet
2022-09-08 08:18:40 +00:00
奔跑的面条
0f24b44269 perf: 优化雷达图展示 2022-09-08 16:07:16 +08:00
tnt group
0064a39403 Merge branch 'dev-echarts-funnel' into dev-commet 2022-09-07 19:27:07 +08:00
tnt group
4004b2e45e feat: 完善漏斗图组件 2022-09-07 18:31:22 +08:00
奔跑的面条
932aa038bb !40 feat: 完善雷达组件
Merge pull request !40 from dodu/dev-commet
2022-09-07 09:54:14 +00:00
tnt group
73488e9704 Merge branch 'dev-echarts' into dev-commet 2022-09-07 12:31:52 +08:00
奔跑的面条
88764d77a8 perf: 优化无数据源数据展示 2022-09-07 11:46:14 +08:00
tnt group
94295a35bc fix: 完成数据监控,更新图表 2022-09-07 11:22:13 +08:00
奔跑的面条
530bb98782 perf: 优化通用时间图案 2022-09-07 11:05:43 +08:00
奔跑的面条
47adc1378f !39 通用时间控件
Merge pull request !39 from jiangcheng/dev
2022-09-07 03:01:06 +00:00
tnt group
a2389a5d99 fix: 完成属性面板功能 2022-09-07 10:44:01 +08:00
奔跑的面条
b618f17978 !38 fix: 中国地图组件支持配置是否显示海南群岛
Merge pull request !38 from dodu/dev
2022-09-07 01:49:13 +00:00
蒋承
563680f066 feat: 通用时间控件 2022-09-06 16:19:54 +08:00
蒋承
b462bd6f25 Merge branch 'dev' of https://gitee.com/jiang_cheng_1/go-view into dev 2022-09-06 16:12:48 +08:00
tnt group
7cac99dd80 chore: 尝试雷达图组件开发 2022-09-06 15:52:41 +08:00
tnt group
87d5c9ffb7 chore: 回复与线上dev文件同步 2022-09-06 15:01:44 +08:00
tnt group
7fa4319bd1 fix: 修复不显示南海群岛时的小方块 2022-09-06 12:49:25 +08:00
tnt group
05a048e5a8 chore: 回复与线上dev文件同步 2022-09-05 17:54:12 +08:00
tnt group
a5dcc3d360 fix: 中国地图组件支持配置是否显示海南群岛 2022-09-05 17:44:40 +08:00
tnt group
0193431c6d Merge branch 'dev' of https://gitee.com/dodu/go-view into dev 2022-09-05 15:15:05 +08:00
奔跑的面条
6c8d12f4e1 !35 修复 computed 定义 isFull 的错误使用
Merge pull request !35 from dodu/dev-back
2022-09-05 01:20:19 +00:00
奔跑的面条
ceffd2ef0c perf: 处理地图数据更新 2022-09-03 21:57:26 +08:00
奔跑的面条
1aa56d844a feat: 新增无热力图覆盖的中国地图组件 2022-09-03 21:44:21 +08:00
tnt group
101a4ea27c fix: 修复 computed 定义 isFull 的错误使用 2022-09-03 16:45:46 +08:00
tnt group
8b1c775178 fix: eslint-plugin-vue v8.0+ 模式下统一处理 lint 报 defineProps 未定义问题 2022-09-03 16:44:35 +08:00
奔跑的面条
b3c1d83aed !34 地图控件
Merge pull request !34 from jiangcheng/dev-jc
2022-09-03 06:22:23 +00:00
tnt group
3adda1e3a4 fix: eslint-plugin-vue v8.0+ 模式下统一处理 lint 报 defineProps 未定义问题 2022-09-01 17:46:46 +08:00
tnt group
610a8170ef chore: 添加 lint/lint:fix 命令 2022-09-01 17:43:20 +08:00
tnt group
9e21a1d036 fix: 修复几处 eslint 的报错 2022-09-01 17:41:10 +08:00
蒋承
305be7a187 feat: 打包报错 2022-09-01 17:26:39 +08:00
奔跑的面条
1652bfedae style: 修改提示 2022-09-01 11:23:33 +08:00
蒋承
6ebdceeafb Merge remote-tracking branch 'origin/dev-jc' into dev 2022-09-01 11:05:24 +08:00
蒋承
5815ea9a0a feat: 地图控件添加点标记 2022-09-01 10:52:09 +08:00
奔跑的面条
c1bd7168e2 perf: 优化出现弹窗后会复制图表的交互 2022-08-31 17:15:33 +08:00
蒋承
a10e9db14f feat: 地图控件 2022-08-31 16:37:00 +08:00
奔跑的面条
50e789ee11 !30 编辑项目标题,支持回车
Merge pull request !30 from dodu/dev
2022-08-31 06:53:15 +00:00
tnt group
c48b7ddc10 fix: 编辑项目标题,支持回车 2022-08-31 14:27:06 +08:00
奔跑的面条
6359ec15b3 feat: 新增移动撤回 2022-08-30 19:14:52 +08:00
奔跑的面条
b818df2ba0 Merge branch 'dev' of https://gitee.com/MTrun/go-view 2022-08-30 19:14:03 +08:00
奔跑的面条
7f49e83557 fix: 处理多个组件选中移动无法撤回的 bug 2022-08-30 19:02:25 +08:00
奔跑的面条
6d38d61816 fix: 处理移动记录的类型错误bug 2022-08-30 18:48:48 +08:00
奔跑的面条
f0e860f306 style: 格式化代,修改单词错误 2022-08-30 17:28:21 +08:00
奔跑的面条
31f67232ae !29 fix: 解决组件移动未加入历史栈
Merge pull request !29 from Furoe/dev
2022-08-30 07:27:30 +00:00
奔跑的面条
7fdc53e921 Merge branch 'dev' of https://gitee.com/MTrun/go-view 2022-08-30 15:05:43 +08:00
奔跑的面条
0624c60010 build: 升级版本到1.0.8 2022-08-30 15:05:11 +08:00
奔跑的面条
32ca138e6a build: 升级版本到 2.0.5 2022-08-30 15:04:29 +08:00
奔跑的面条
171e0aa408 perf: 完善首页预览功能 2022-08-30 15:03:25 +08:00
Furoe
b1062d4673 Merge branch 'dev' of gitee.com:MTrun/go-view into dev
Signed-off-by: Furoe <furo_yang@163.com>
2022-08-30 06:19:04 +00:00
yangwq7
f691bb8437 perf: 解耦移动相关后退、前进逻辑 2022-08-30 14:14:56 +08:00
奔跑的面条
52009a415b Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-08-30 12:19:57 +08:00
奔跑的面条
80fc026483 Merge branch 'dev' 2022-08-30 12:18:52 +08:00
奔跑的面条
b512328a70 fix: 解决渐变组件预览无法更新的问题 2022-08-30 12:18:15 +08:00
奔跑的面条
709d8196fc perf: 优化设置 2022-08-30 12:13:58 +08:00
奔跑的面条
5e2621ca7c build: 升级依赖 vite-2.9.9 2022-08-30 11:27:16 +08:00
奔跑的面条
f6086f40e0 update README.md.
Signed-off-by: 奔跑的面条 <1262327911@qq.com>
2022-08-30 02:02:34 +00:00
奔跑的面条
520f46adc3 fix: 尝试处理背景图片无法截图的问题 2022-08-29 21:37:32 +08:00
奔跑的面条
da809f13b3 fix: 尝试解决背景图片无法截图的问题 2022-08-29 21:35:51 +08:00
奔跑的面条
be3e7b58b3 update LICENSE.
Signed-off-by: 奔跑的面条 <1262327911@qq.com>
2022-08-29 12:19:15 +00:00
奔跑的面条
801aa1f82f update LICENSE.
Signed-off-by: 奔跑的面条 <1262327911@qq.com>
2022-08-29 10:13:37 +00:00
奔跑的面条
f23433091a update LICENSE.
Signed-off-by: 奔跑的面条 <1262327911@qq.com>
2022-08-29 10:09:45 +00:00
yangwq7
8fdb068023 fix: 解决渐变文本组件修改内容后预览未更新 2022-08-26 09:50:46 +08:00
yangwq7
0db49d055f fix: 解决组件移动未加入历史栈 2022-08-25 20:27:57 +08:00
奔跑的面条
72c26b71f3 perf: 优化参考线的展示方式 2022-08-21 14:52:30 +08:00
奔跑的面条
3b8181ae10 Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-08-21 14:49:32 +08:00
奔跑的面条
a7edef16f4 perf: 优化标尺的展示方式 2022-08-21 14:42:31 +08:00
奔跑的面条
c2a9642393 Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-08-19 14:46:49 +08:00
奔跑的面条
1b01fd81a8 fix: 处理注册之后,位置错误的问题 2022-08-19 14:44:40 +08:00
奔跑的面条
3c04f81147 fix: 补充代码合并丢失的枚举 2022-08-19 11:43:23 +08:00
奔跑的面条
ec28ccf09c perf: 优化500错误页重定向 2022-08-19 11:34:38 +08:00
奔跑的面条
fa34300401 feat: 合并多选功能,解决冲突,升级版本到2.0.4 2022-08-19 10:44:44 +08:00
奔跑的面条
32743391f8 fix: 解决动态变更颜色,部分组件不会更新的问题 2022-08-19 10:02:09 +08:00
奔跑的面条
6aa439c991 perf: 优化拖拽的节流大小 2022-08-18 22:45:30 +08:00
奔跑的面条
33ed0fa468 feat: 新增框选功能 2022-08-18 22:41:34 +08:00
奔跑的面条
c1b1436473 fix: 解决对其线消失的bug 2022-08-18 22:16:23 +08:00
奔跑的面条
006b28ba38 fix: 修改快捷键说明 2022-08-18 20:40:18 +08:00
奔跑的面条
c987dd8816 feat: 新增页面框选效果 2022-08-18 20:30:02 +08:00
奔跑的面条
23bbac7318 build: 升级版本到1.0.7 2022-08-17 18:02:13 +08:00
奔跑的面条
4b21e598db perf: 优化层级中分组的右键功能 2022-08-17 17:56:20 +08:00
奔跑的面条
26e77dd46c style: 修改代码样式 2022-08-17 17:49:04 +08:00
奔跑的面条
88728357d8 Merge branch 'dev-feat-multi-select' of https://gitee.com/MTrun/go-view into dev 2022-08-17 17:12:38 +08:00
奔跑的面条
580f5b1a3f feat: 处理数据导入,ID更新的可控功能 2022-08-17 16:56:58 +08:00
奔跑的面条
2236100e3d fix: 处理分组前进后退的问题 2022-08-17 16:18:00 +08:00
奔跑的面条
5dd6f88a42 fix: 处理无数据删除会报错的bug 2022-08-16 21:06:55 +08:00
奔跑的面条
57be88e8aa feat: 新增多选的历史记录处理 2022-08-16 20:41:41 +08:00
奔跑的面条
26d249f942 fix: 处理历史记录无法展示多组件的bug 2022-08-15 20:39:30 +08:00
奔跑的面条
0d3585503b fix: 处理层级右键拖拽的问题 2022-08-15 20:11:04 +08:00
奔跑的面条
f70576bbdc style: 优化枚举代码 2022-08-15 17:37:16 +08:00
奔跑的面条
dcb7806847 feat: 新增多选删除功能 2022-08-15 16:50:52 +08:00
奔跑的面条
8832da10c9 feat: 新增多选组件同时移动 2022-08-15 16:19:36 +08:00
奔跑的面条
46f93ffb86 style: 修改注释写反的问题 2022-08-15 14:42:31 +08:00
奔跑的面条
96e427ee08 fix: 处理 TS 报错 2022-08-15 11:43:32 +08:00
奔跑的面条
dd824a8ca6 fix: 修复右键会出现对其线条的bug 2022-08-14 14:19:21 +08:00
奔跑的面条
ca2d70df6e feat: 处理层级区域分组右键,多选等 2022-08-14 02:36:48 +08:00
奔跑的面条
7eba381512 fix: 处理右键不统一的问题 2022-08-14 01:04:03 +08:00
奔跑的面条
498743e965 fix: 修改右键类型操作 2022-08-14 00:20:21 +08:00
奔跑的面条
4460a3269b fix: 处理层级右键多选的问题 2022-08-13 18:38:36 +08:00
奔跑的面条
d2d35e717d feat: 处理分组与其它单组件/分组之间的成组 2022-08-12 21:41:42 +08:00
奔跑的面条
774c005306 fix: 处理ts类型错误 2022-08-12 20:46:17 +08:00
奔跑的面条
e51a635445 fix: 处理分组预览和动态引入的问题 2022-08-12 20:39:20 +08:00
奔跑的面条
643eed4858 fix: 处理分组编辑会选择数据上的问题 2022-08-12 17:09:28 +08:00
奔跑的面条
ceac00f3eb docs: 修改 readme 图片展示 2022-08-10 16:05:34 +08:00
奔跑的面条
12e85b61d2 fix: 新增分组的动画 2022-08-10 16:01:46 +08:00
奔跑的面条
f539b09361 perf: 处理分组属性的展示 2022-08-09 21:08:25 +08:00
奔跑的面条
0aac4efa1b perf: 处理注册时的分组场景 2022-08-09 21:06:09 +08:00
奔跑的面条
1fac9e5254 feat: 新增多选快捷键处理 2022-08-09 20:12:44 +08:00
奔跑的面条
41454cda38 feat: 新增多选的右键处理 2022-08-09 19:50:03 +08:00
奔跑的面条
31a84e4d87 feat: 新增解除组件还原位置 2022-08-08 00:02:58 +08:00
奔跑的面条
42659a7360 feat: 新增多选的选中框 2022-08-07 17:24:05 +08:00
奔跑的面条
83f73aab8d perf: 新增异常兜底处理 2022-08-06 18:21:50 +08:00
奔跑的面条
2030fcc711 feat: 处理分组展示,多选右键展示 2022-08-06 18:16:48 +08:00
奔跑的面条
32488a03cd feat: 新增成组,解组,图层处理 2022-08-06 17:20:56 +08:00
奔跑的面条
6d4cfe29ba fix: 新增 isGroup 标识 2022-08-06 13:04:25 +08:00
奔跑的面条
451913f087 fix: 新增多选的全部列表添加, 结构设计 2022-08-05 21:12:05 +08:00
奔跑的面条
7d3267959f fix: 处理右键多选的问题 2022-08-05 10:58:46 +08:00
奔跑的面条
e6209cc008 Merge branch 'dev' into dev-feat-multi-select 2022-08-05 08:42:47 +08:00
奔跑的面条
f506ccd2e4 Merge branch 'dev' into master-fetch 2022-08-05 08:42:22 +08:00
奔跑的面条
3eb3527226 fix: 处理预览背景图展示问题 2022-08-05 08:32:21 +08:00
奔跑的面条
f379f7652c Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-07-26 16:12:31 +08:00
奔跑的面条
2de57e93f5 fix: 修改背景图覆盖不全的问题 2022-07-26 15:35:23 +08:00
奔跑的面条
0067d4fd5a perf: 修改错误单词 2022-07-21 14:38:32 +08:00
奔跑的面条
e8760c81ac Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-07-21 11:46:54 +08:00
奔跑的面条
f47c890d2f fix: 处理打包 ts 类型错误 2022-07-21 11:43:42 +08:00
奔跑的面条
a9bb294f60 feat: 合并 1.0.6 版本代码 2022-07-21 11:03:04 +08:00
奔跑的面条
2096665118 build: 升级版本到 1.0.6 2022-07-21 10:35:16 +08:00
奔跑的面条
102e50be8f fix: 解决编辑器失焦报错的问题 2022-07-21 10:33:41 +08:00
奔跑的面条
7ed8fbfcbf style: 去除多余icon代码 2022-07-20 21:44:48 +08:00
奔跑的面条
93b85f09d8 perf: 去除全局设置中的数据配置 2022-07-20 21:44:17 +08:00
奔跑的面条
c05f851e02 fix: 解决预览请求错误问题 2022-07-20 21:30:32 +08:00
奔跑的面条
072918fc6f perf: 修改tag的圆角 2022-07-20 21:10:04 +08:00
奔跑的面条
7218fe57fc fix: 修改数据内容二次过滤的问题 2022-07-20 20:55:45 +08:00
奔跑的面条
942ff14d82 perf: 修改复制提示 2022-07-20 20:42:24 +08:00
奔跑的面条
dc5186fb69 fix: 解决组件聚焦数据就会报错的问题 2022-07-20 20:34:28 +08:00
奔跑的面条
857879d700 perf: 修改输入URL的文案 2022-07-20 20:09:22 +08:00
奔跑的面条
144b2aa81c fix: 去除 status校验 2022-07-20 18:36:22 +08:00
奔跑的面条
3bfdfea016 fix: 修复请求间隔问题 2022-07-20 18:14:11 +08:00
奔跑的面条
e3984e672d perf: 修改编辑文字说明 2022-07-20 12:57:04 +08:00
奔跑的面条
6875bcdbb8 Merge branch 'dev-feat-request' of https://gitee.com/MTrun/go-view into dev 2022-07-20 12:26:15 +08:00
奔跑的面条
ca587c9ee3 feat: 完成自定义请求功能 2022-07-20 12:19:24 +08:00
奔跑的面条
2abbac8b52 style: 删除多余文件 2022-07-19 19:11:30 +08:00
奔跑的面条
0415a68352 style: 修改注释 2022-07-19 17:54:43 +08:00
奔跑的面条
5a259269ce build: 升级axios版本到0.27.2 2022-07-19 17:53:04 +08:00
奔跑的面条
ace8c1c411 !26 小组件数字翻牌颜色前缀变量绑定错修复
Merge pull request !26 from daidai/dev
2022-07-17 14:01:16 +00:00
奔跑的面条
b196b5aee2 style: 新增自定义http函数定义 2022-07-17 21:51:28 +08:00
奔跑的面条
3db217e687 perf: 优化请求展示区域 2022-07-16 21:02:32 +08:00
奔跑的面条
4107477b9b feat: 处理请求展示的位置 2022-07-16 20:57:01 +08:00
奔跑的面条
ce0c439f06 perf: 全局内容默认不展示 2022-07-16 19:01:53 +08:00
奔跑的面条
5d9b3d5a9b feat: 新增全局请求数据处理 2022-07-16 19:01:05 +08:00
奔跑的面条
20b196a12a feat: 新增请求编辑页面 2022-07-15 00:11:42 +08:00
wei
54555ece08 fix: 小组件数字翻牌颜色前缀问题 2022-07-13 15:01:43 +08:00
奔跑的面条
4c38abd198 !24 docs: update README
Merge pull request !24 from daidai/dev
2022-07-13 06:14:04 +00:00
wei
5e502eed6d docs: update README 2022-07-13 11:06:42 +08:00
wei
1c54bd836a docs: update README 2022-07-13 11:00:14 +08:00
奔跑的面条
46f80ea907 feat: 编写请求配置页 2022-07-11 09:01:19 +08:00
奔跑的面条
0b5f35752b Merge branch 'dev' into master-fetch 2022-07-08 18:12:33 +08:00
奔跑的面条
1688c6bf38 Merge branch 'dev' 2022-07-08 18:11:26 +08:00
奔跑的面条
56a98c4d11 Merge branch 'dev' into dev-feat-multi-select 2022-07-08 18:08:58 +08:00
奔跑的面条
88bb915161 feat: 新增组件更新单独设置功能 2022-07-08 17:53:52 +08:00
奔跑的面条
594c8f215f feat: 新增组件单独请求时间配置 2022-07-08 11:45:39 +08:00
奔跑的面条
15166b6490 style: 修改请求键名 data 为 request 2022-07-08 11:43:49 +08:00
奔跑的面条
0bd22db048 Merge branch 'dev' into dev-feat-multi-select 2022-07-07 19:56:12 +08:00
奔跑的面条
7322817cb5 fix: 合并编辑功能的修改 2022-07-07 19:54:53 +08:00
奔跑的面条
ec572f8f04 Merge branch 'dev' 2022-07-07 19:45:30 +08:00
奔跑的面条
8654a45e9b perf: 优化编辑器内容 2022-07-07 19:42:35 +08:00
奔跑的面条
10c4729383 Merge branch 'dev' into dev-feat-multi-select 2022-07-07 13:15:13 +08:00
奔跑的面条
437ad1bd9f Merge branch 'dev' into master-fetch 2022-07-07 13:14:53 +08:00
奔跑的面条
74a03b905c Merge branch 'dev' 2022-07-07 13:14:02 +08:00
奔跑的面条
a295cb44f0 perf: 优化编辑器按钮展示 2022-07-07 13:13:26 +08:00
奔跑的面条
cd20e68480 fix: 补充合并代码丢失的icon图标 2022-07-06 22:12:24 +08:00
奔跑的面条
35968475b9 build: 合并dev 1.0.5 版本, 修改fetch分支为2.0.2 2022-07-06 21:58:28 +08:00
奔跑的面条
84c9e73e7b Merge branch 'dev' into dev-feat-multi-select 2022-07-06 21:51:11 +08:00
奔跑的面条
6ba668c5f8 Merge branch 'dev' 2022-07-06 21:49:05 +08:00
奔跑的面条
55dcb43329 style: 还原请求间隔 2022-07-06 21:48:41 +08:00
奔跑的面条
5ed7374592 build: 升级版本到1.0.5 2022-07-06 21:42:24 +08:00
奔跑的面条
578c177141 Merge branch 'dev' 2022-07-06 21:41:56 +08:00
奔跑的面条
bd63169cbb perf: 优化编辑器的页面 2022-07-06 20:48:59 +08:00
奔跑的面条
831ae3a3db fix: 解决过滤器的错误处理 2022-07-06 20:14:41 +08:00
奔跑的面条
5cbd15992a style: 去除环形图多余引入 2022-07-06 17:25:59 +08:00
奔跑的面条
d00ba1fdaa perf: 修改数据展示为动态获取 2022-07-06 17:18:38 +08:00
奔跑的面条
6a5fe679be fix: 解决编辑器不能正常执行worker的问题 2022-07-06 14:40:35 +08:00
奔跑的面条
6da5c613de fix: 解决编辑器的问题 2022-07-06 14:13:27 +08:00
奔跑的面条
8d0615bc95 feat: 新增动态接口过滤器功能 2022-07-05 21:44:16 +08:00
奔跑的面条
503c9d6fca style: 修改单词拼写错误 2022-06-29 09:55:44 +08:00
奔跑的面条
8a10a9cf82 feat: 新增组件多选和右键成组按钮 2022-06-28 21:57:29 +08:00
奔跑的面条
78eb3ccc3f Merge branch 'dev' into master-fetch 2022-06-27 21:42:24 +08:00
奔跑的面条
30b43cdb82 Merge branch 'dev' 2022-06-27 21:42:06 +08:00
奔跑的面条
1d1dd07c2f fix: 修改数字翻牌错误 2022-06-27 21:41:48 +08:00
奔跑的面条
7cccbabca4 Merge branch 'dev' into master-fetch 2022-06-27 21:38:27 +08:00
奔跑的面条
c2aeb420b2 Merge branch 'dev' 2022-06-27 21:36:37 +08:00
奔跑的面条
b10bc2edc4 feat: 新增 X轴 / Y轴 字体大小、单位编辑 2022-06-27 21:35:27 +08:00
奔跑的面条
cdccfa3e12 fix: 修改合并冲突错误的代码 2022-06-27 20:42:17 +08:00
奔跑的面条
e8c5455748 perf: 合并dev分支,解决组件无法更新数据的问题 2022-06-27 20:37:26 +08:00
奔跑的面条
2561c18dec Merge branch 'dev' 2022-06-27 20:28:56 +08:00
奔跑的面条
ce6f618ba8 fix: 修改NaiveUI环形组件图片 2022-06-27 20:26:54 +08:00
奔跑的面条
2d05e8054c fix: 解决组件数据无法更新的问题 2022-06-27 20:26:24 +08:00
奔跑的面条
3ad3d8d9a0 fix: 修改图片组件不能动态更新的问题 2022-06-26 15:35:40 +08:00
奔跑的面条
0e83597ddc feat: 新增图片 mock 地址 2022-06-26 15:26:57 +08:00
奔跑的面条
8f4ae6f3ba docs: update README 2022-06-26 15:11:52 +08:00
奔跑的面条
3c65fa806e feat: 添加组件的框架属性分类 2022-06-25 20:55:41 +08:00
奔跑的面条
48a6b14537 fix: 解决环形组件不会自动更新的问题 2022-06-25 20:34:50 +08:00
奔跑的面条
de0404705b perf: 修改请求hook逻辑 2022-06-25 20:29:42 +08:00
奔跑的面条
f13b3ca630 feat: 添加组件分类标识 2022-06-25 17:44:21 +08:00
奔跑的面条
84361cb5f5 style: 去除多余代码 2022-06-25 17:30:46 +08:00
奔跑的面条
34e0b6e610 perf: 优化获取数据 hooks 函数 2022-06-25 17:03:03 +08:00
奔跑的面条
6c941ffed5 fix: 解决渐变文本不能换行的问题 2022-06-25 15:52:04 +08:00
奔跑的面条
012eed6f67 feat: 新增进度条多个配置项 2022-06-25 15:51:38 +08:00
奔跑的面条
3eac0d1592 feat: 新增mock接口 2022-06-25 15:51:03 +08:00
奔跑的面条
ea8a2b59d9 style: 修改错误备注 2022-06-25 11:18:04 +08:00
奔跑的面条
8e40416e72 style: 去除多余代码 2022-06-24 11:44:26 +08:00
奔跑的面条
d058361e01 docs: 修改文档 2022-06-23 09:53:01 +08:00
奔跑的面条
2491f7ff57 feat: 新增保存按钮 2022-06-22 18:50:15 +08:00
奔跑的面条
f84c72dc71 feat: 新增键盘按键记录功能 2022-06-22 14:31:53 +08:00
奔跑的面条
d735bc93ce feat: 新增多选中的前置处理,选中存储对象修改成数组形式 2022-06-21 17:39:16 +08:00
奔跑的面条
4355c766fd style: 去除多余代码 2022-06-21 11:01:01 +08:00
奔跑的面条
2b47817d26 style: 修改错误单词 2022-06-21 10:54:05 +08:00
奔跑的面条
5f5b7bf2e3 perf: 修改导入合并代码位置,优化结构 2022-06-20 15:35:03 +08:00
奔跑的面条
c5908f6d92 build: 升级依赖 2022-06-20 15:13:50 +08:00
奔跑的面条
7e64d30258 build: 合并dev分支 2022-06-20 15:11:13 +08:00
奔跑的面条
64d9fbb989 perf:优化http请求代码 2022-06-20 14:35:19 +08:00
奔跑的面条
437818abce feat: 新增排名列表字体大小控制功能 2022-06-17 14:13:14 +08:00
奔跑的面条
ffe7911d4b docs: 更新 READE.ME 图表说明 2022-06-17 14:11:13 +08:00
奔跑的面条
aad72ec5b6 fix: 解决滚动排名列表预览之后数据无法变更的问题 2022-06-17 11:42:57 +08:00
奔跑的面条
d0436ec478 feat: 新增滚动排名列表增加设置字体大小配置
Merge pull request !21 from 王志强/master
2022-06-17 01:25:36 +00:00
wangzhiqiang
5568c3cd2d 滚动排名列表增加设置字体大小配置 2022-06-16 14:57:34 +08:00
奔跑的面条
5197eb9292 build: 修改版本到 2.0.1 2022-06-16 10:48:42 +08:00
奔跑的面条
a84f8f4411 build: 修改版本号到1.0.4 2022-06-16 10:47:23 +08:00
奔跑的面条
3cf01f0c51 fix: 解决打包之后无法加载页面的问题 2022-06-15 17:54:49 +08:00
奔跑的面条
db815661e8 feat: 新增 preview 模式,修改打包后路径指向 2022-06-15 17:48:16 +08:00
奔跑的面条
fcdc26e9eb fix: 解决 login 背景打包后消失的问题 2022-06-15 17:36:06 +08:00
奔跑的面条
fa061c42ad feat: 新增 preview 模式 2022-06-15 17:30:24 +08:00
奔跑的面条
6edbb7c8a7 feat: 新增commitlint 2022-06-15 17:18:39 +08:00
奔跑的面条
799c445c4b docs: 更新文档 2022-06-15 17:15:29 +08:00
奔跑的面条
70fbf5de3e doc: 文档更新 2022-06-15 17:14:27 +08:00
奔跑的面条
db3c38a333 feat: 新增 commitlint,修改部分规则 2022-06-15 17:09:40 +08:00
奔跑的面条
73c7697443 feat: 新增渐变文本组件 2022-06-15 16:20:25 +08:00
奔跑的面条
919117c408 docs: 修改说明文档 2022-06-15 16:15:49 +08:00
奔跑的面条
8092edab81 build:升级依赖 2022-06-15 16:11:58 +08:00
奔跑的面条
ef4f45ddb0 fix: 解决npm,yarn 安装依赖报错的问题 2022-06-15 16:08:59 +08:00
奔跑的面条
2ff867ba5f fix: 修改npm,yarn打包问题,升级依赖文件 2022-06-15 16:01:31 +08:00
奔跑的面条
4f26fc2763 fix: 解决 npm ,yarn 安装依赖报错的问题 2022-06-15 15:45:55 +08:00
奔跑的面条
0c5b5f96f1 chore: 优化渐变文本展示图 2022-06-15 09:46:53 +08:00
Ryker
3f5f827550 feat: 新增信息-文字-新增【渐变文字】组件
feat: 新增信息-文字-新增【渐变文字】组件
2022-06-15 01:43:07 +00:00
奔跑的面条
3e969e4ae5 fix: 补充丢失的图片 2022-06-14 12:46:07 +08:00
奔跑的面条
bcd1dfd7bd feat:新增数字滚动组件动态获取数据功能 2022-06-14 12:31:46 +08:00
奔跑的面条
c1dfd78d18 feat: 新增表格滚动组件 2022-06-14 12:31:20 +08:00
奔跑的面条
39aa1645c9 fix:解决边框04展示不全的bug 2022-06-14 12:30:29 +08:00
奔跑的面条
797a3e3f5b fix: 修改滚动表格组件TS报错问题 2022-06-14 12:14:44 +08:00
奔跑的面条
53e740bb1d Merge pull request !19 from 王志强/master 2022-06-14 03:27:49 +00:00
wangzhiqiang
11d09c4d63 修改小组件边框-04下边框缺失bug 2022-06-14 11:02:58 +08:00
王志强
76bb4c4038 新增滚动列表
新增滚动列表
2022-06-14 02:46:52 +00:00
wangzhiqiang
ccac647ecc Merge branch 'master' of https://gitee.com/assxy/go-view 2022-06-14 09:13:28 +08:00
wangzhiqiang
39692e3b8b Merge branch 'master' of https://gitee.com/MTrun/go-view
# Conflicts:
#	src/packages/components/Decorates/Mores/Number/index.vue
2022-06-14 09:12:46 +08:00
奔跑的面条
7aeebff5df !17 fit: 数字翻牌-动态数据
Merge pull request !17 from Ryker/number
2022-06-14 01:02:55 +00:00
13050022537
62dc625363 添加滚动列表 2022-06-13 20:51:15 +08:00
wangzhiqiang
1784e79c83 增加轮播表--未完成 2022-06-13 20:51:12 +08:00
ryker
a5374ee746 数字翻牌动态数据 2022-06-13 18:04:01 +08:00
奔跑的面条
a71bd16103 style: 优化水球图代码结构 2022-06-13 17:30:17 +08:00
奔跑的面条
d3afea8c5e feat:新增水球图设置项 2022-06-13 17:29:39 +08:00
Ryker
bfa16ec438 feat:新增水球图的形状、文字大小配置
水球图的形状、文字大小配置
2022-06-13 09:09:28 +00:00
奔跑的面条
2499cbdd44 fix: 修改列表页展示问题 2022-06-13 14:28:58 +08:00
奔跑的面条
3cc3714e94 feat: 新增环形图,新增NaiveUI-进度组件 2022-06-13 13:18:30 +08:00
王志强
5abfcfdd1b feat:小组件-数字翻牌-增加精度参数
小组件-数字翻牌-增加精度参数
2022-06-13 05:12:24 +00:00
奔跑的面条
ca8cac3f1a chore: 优化进度条组件内容 2022-06-13 13:05:41 +08:00
奔跑的面条
3dc745d4ad chore: 优化【饼图-环形】展示图 2022-06-13 12:02:43 +08:00
alex
6c871b071f feat: PieCircle
新增饼图环形
2022-06-13 03:59:29 +00:00
wangzhiqiang
87bc0aaced 小组件-数字翻牌-增加精度参数 2022-06-13 11:55:13 +08:00
wangzhiqiang
3584c1c95c Merge branch 'master' of https://gitee.com/MTrun/go-view 2022-06-13 09:07:13 +08:00
奔跑的面条
be0aa6d099 feat: 新增进度条组件 2022-06-12 18:47:47 +08:00
奔跑的面条
34d27c1004 fix: 解决缩放比例展示不全的问题 2022-06-12 18:45:31 +08:00
奔跑的面条
6ee2bdcddb fix: 解决缩放比例展示不全的问题 2022-06-12 18:44:53 +08:00
奔跑的面条
2a9d8e0845 style: 优化进度条组件 2022-06-12 18:25:44 +08:00
奔跑的面条
47296f2607 新增Naive UI 进度条
Merge pull request !11 from alex/chart
2022-06-12 09:39:08 +00:00
alex li
6b913545db 添加naive ui的进度条 2022-06-11 23:53:01 +08:00
wangzhiqiang
3836808d97 Merge branch 'master' of https://gitee.com/MTrun/go-view 2022-06-11 15:54:23 +08:00
奔跑的面条
85f3b4e9e3 chore: 优化拖拽锚点 2022-06-11 15:15:38 +08:00
奔跑的面条
85beabe7c8 chore: 优化拖拽锚点 2022-06-11 15:09:42 +08:00
wangzhiqiang
0109bcbfb9 修改gitgnore 2022-06-11 15:05:21 +08:00
奔跑的面条
0fb9a79df9 fix:修改请求地址为null时引起的异常bug 2022-06-11 14:37:22 +08:00
奔跑的面条
b39bcd864c fix:修改请求地址为null时引起的异常bug 2022-06-11 14:36:19 +08:00
奔跑的面条
6b805fbdfb chore: 优化发布弹窗 2022-06-11 14:23:16 +08:00
奔跑的面条
abe76aeb59 build: 依赖基本升级 2022-06-11 14:15:28 +08:00
奔跑的面条
5f49bc1aa8 fix: 修改双折线图X轴无法变更的问题 2022-06-11 14:13:32 +08:00
奔跑的面条
54d2125067 fix: 修改双折线图X轴无法变化的问题 2022-06-11 14:08:25 +08:00
奔跑的面条
7c86560f68 build: 升级NaiveUI到2.30.3 2022-06-11 14:03:41 +08:00
奔跑的面条
c7f5508e07 Merge branch 'master' into dev 2022-06-10 16:28:07 +08:00
奔跑的面条
b7618693b4 update README.md. 2022-06-10 08:27:34 +00:00
奔跑的面条
b1870296c0 fix: 解决列表页布局问题 2022-06-09 09:07:39 +08:00
奔跑的面条
d3e1cd2fdb fix: 解决列表页布局错误问题 2022-06-09 09:00:39 +08:00
奔跑的面条
79a35423c7 fix: 解决导出图片白边的问题 2022-06-09 08:59:36 +08:00
奔跑的面条
71807be01d fix: 解决项目列表信息栏会换行的问题 2022-06-09 08:49:07 +08:00
奔跑的面条
e74f796203 fix:解决截图有白边的问题 2022-06-09 08:48:28 +08:00
奔跑的面条
041d7da9d8 fix: 修改复制失败的提示类型错误的问题 2022-06-06 10:43:14 +08:00
奔跑的面条
a99d949b29 chore: 新增路由白名单 2022-06-06 10:42:55 +08:00
奔跑的面条
c2a9e2a469 chore:优化搜索结果列表UI 2022-06-05 11:41:57 +08:00
奔跑的面条
2e6c1f2431 chore: 优化搜索结果列表UI 2022-06-05 11:40:32 +08:00
奔跑的面条
80b05db764 chore:优化 dialog 的全局封装代码 2022-06-04 16:25:37 +08:00
奔跑的面条
ce28a96504 chore: 修改发布文案提示,修改 dialog 全局封装 2022-06-04 16:17:11 +08:00
奔跑的面条
340cab11b7 build:修改 fetch 版本号 2022-06-04 15:44:26 +08:00
奔跑的面条
712233c215 chore: 优化页面 UI 2022-06-03 20:21:35 +08:00
奔跑的面条
a84e922bc6 Merge branch 'dev' 2022-06-03 20:11:07 +08:00
奔跑的面条
947ffb45d7 style: 优化类名,页面UI细节 2022-06-03 20:10:52 +08:00
奔跑的面条
5dd14761b7 docs: 更新md说明 2022-06-03 19:56:03 +08:00
奔跑的面条
b9b915e913 fix: 修改自动复制粘贴的问题 2022-06-03 18:53:37 +08:00
奔跑的面条
044143571f fix: 新增发布页面处理 2022-06-03 14:48:58 +08:00
奔跑的面条
06fe805736 chore: 优化了标题展示和大小样式 2022-06-03 11:19:29 +08:00
奔跑的面条
c149ea9449 Merge branch 'dev' 2022-06-01 23:08:54 +08:00
奔跑的面条
c003ce76ad fix: 修改列表页标题过长的展示问题 2022-06-01 23:08:36 +08:00
奔跑的面条
077881e499 type: 修改类型错误 2022-06-01 23:00:28 +08:00
奔跑的面条
f655a57e61 fix:处理列表页标题过长的展示问题 2022-06-01 22:58:22 +08:00
奔跑的面条
0b04bf4929 type: 定义全局返回值类型 2022-06-01 22:41:11 +08:00
奔跑的面条
2fcd3b1132 build: 修改版本号 0.0.9 2022-06-01 22:28:46 +08:00
奔跑的面条
a8c2a989cb Merge branch 'dev' 2022-06-01 22:28:10 +08:00
奔跑的面条
f287cf68ab build: 修改版本为1.0.3 2022-06-01 22:27:59 +08:00
奔跑的面条
190d2c60a8 Merge branch 'dev' 2022-06-01 22:27:14 +08:00
奔跑的面条
b981640eae fix: 解决导入组件后控制组件不会出现的bug 2022-06-01 22:26:52 +08:00
奔跑的面条
568fd6c105 chore:优化了路由写法,修改了错误页面的展示,新增未发布提示页面 2022-06-01 22:20:05 +08:00
奔跑的面条
221351ec11 feat: 新增动态预览功能 2022-06-01 22:19:03 +08:00
奔跑的面条
6ab34a0996 fix: 修改组件注册会报错的问题 2022-06-01 22:14:33 +08:00
奔跑的面条
6b551ae68b build:升级依赖包 2022-06-01 22:13:49 +08:00
奔跑的面条
2917cde2e5 fix: 解决列表图片展示缓存问题 2022-06-01 20:16:38 +08:00
奔跑的面条
294a4a6cdf fix: 解决获取数据,但是配置模块不完整的问题 2022-06-01 19:01:05 +08:00
奔跑的面条
6ecd12ed07 update README.md. 2022-05-31 09:01:51 +00:00
奔跑的面条
8ec1626c1e docs: 修改MD说明 2022-05-31 11:40:06 +08:00
奔跑的面条
23381fea37 docs: 修改首页说明 2022-05-31 11:36:26 +08:00
奔跑的面条
1e678b7492 build: 修改请求地址 2022-05-31 11:19:17 +08:00
奔跑的面条
2ceca7287f fix: 修改oss接口不会动态更改的问题 2022-05-31 11:18:34 +08:00
奔跑的面条
7f4dd5295b chore:修改请求地址 2022-05-29 16:04:07 +08:00
奔跑的面条
cf1e4a0f8a docs: 更新说明文档 2022-05-29 15:45:45 +08:00
奔跑的面条
ffd628fa82 docs: 修改文档说明 2022-05-29 15:23:04 +08:00
奔跑的面条
d639e445eb feat: 新增背景图文件上传保存 2022-05-29 14:54:35 +08:00
奔跑的面条
b263681dda chore: 去除生成预览图时的标尺 2022-05-28 17:58:07 +08:00
奔跑的面条
e16413b570 feat: 新增首页预览图展示 2022-05-28 16:39:27 +08:00
奔跑的面条
63b5186c3e Merge branch 'dev' into master-fetch 2022-05-28 15:58:06 +08:00
奔跑的面条
3c6f6e70ef chore: 修改拖拽锚点样式 2022-05-28 15:57:44 +08:00
奔跑的面条
ba20316761 fix: 修改自动保存预览图无法存储的问题 2022-05-28 15:46:07 +08:00
奔跑的面条
437dd1c411 branch: 合并锚点样式修改 2022-05-28 12:46:32 +08:00
奔跑的面条
674f748d20 chore:修改拖拽标点样式 2022-05-28 12:43:07 +08:00
奔跑的面条
d0d5f5b77d feat: 保存预览图 2022-05-28 11:50:17 +08:00
奔跑的面条
c095e15d6c chore: 新增put请求类型 2022-05-28 00:40:22 +08:00
奔跑的面条
efd9228cc9 fix: 解决打包后无法发送请求的bug 2022-05-28 00:32:32 +08:00
奔跑的面条
ebd6132385 feat: 新增上传文件接口 2022-05-27 20:09:48 +08:00
奔跑的面条
9098443c83 chore: 修改项目信息结构 2022-05-27 11:49:25 +08:00
奔跑的面条
423890a4df feat: 新增项目信息修改功能 2022-05-26 01:01:59 +08:00
奔跑的面条
15fc418fc4 fix: 修改导入id重复的问题 2022-05-25 23:04:39 +08:00
奔跑的面条
fb2edeb7d2 fix: 修改导入组件id会重复的问题 2022-05-25 23:00:36 +08:00
奔跑的面条
b861587f01 feat: 新增快捷键展示 2022-05-24 18:17:41 +08:00
奔跑的面条
c3738fab45 faet: 新增保存快捷键 2022-05-24 18:16:33 +08:00
奔跑的面条
24fba75f28 feat: 新增自动同步功能 2022-05-24 17:42:49 +08:00
奔跑的面条
00b6b63e1e feat: 新增数据保存接口 2022-05-24 15:05:51 +08:00
奔跑的面条
5dab8fa7d9 Merge branch 'dev' into master-fetch 2022-05-24 12:28:14 +08:00
奔跑的面条
2460fe4e86 chore: 优化 error 错误页面 2022-05-24 12:27:39 +08:00
奔跑的面条
9a5d71fb5c feat: 新增获取项目数据功能,新增同步数据功能 2022-05-23 23:50:35 +08:00
奔跑的面条
c930efba0c Merge branch 'dev' into master-fetch 2022-05-23 16:06:13 +08:00
奔跑的面条
908f33c849 schore: 修改屏幕过小,会破坏布局的问题 2022-05-23 16:05:41 +08:00
奔跑的面条
ff7c820b1f Merge branch 'dev' into master-fetch 2022-05-22 23:27:39 +08:00
奔跑的面条
11b5eee86a style: 去除多余入参代码 2022-05-22 22:43:06 +08:00
奔跑的面条
4252725d9d feat: 新增获取项目数据接口 2022-05-22 22:11:56 +08:00
奔跑的面条
deeb3a472c feat:新增发布和取消发布接口 2022-05-22 16:38:22 +08:00
奔跑的面条
763173de44 style: 调整代码格式,去除多余代码 2022-05-22 15:39:30 +08:00
奔跑的面条
f46e6ad8c8 feat: 新增删除接口 2022-05-22 15:25:07 +08:00
奔跑的面条
09b31547e1 feat: 新增首页列表接口 2022-05-22 15:06:45 +08:00
奔跑的面条
dee2ff8dee Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-05-22 14:09:38 +08:00
奔跑的面条
fc26544a85 feat: 新增首页项目列表分页效果 2022-05-22 14:09:20 +08:00
奔跑的面条
0c4974ca1d fix: 修改vue动画名称错误 2022-05-22 14:06:52 +08:00
奔跑的面条
7f315b95ce feat: 新增项目列表接口 2022-05-22 14:05:57 +08:00
奔跑的面条
093e7d1edb Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-05-22 13:36:30 +08:00
奔跑的面条
00ee150c5d build: 升级naiveUI到2.29 2022-05-22 13:29:01 +08:00
奔跑的面条
a4e18f8893 fix: 修改新建项目id错误问题 2022-05-21 21:04:10 +08:00
奔跑的面条
c754a36ee5 fix: 修改i18n错误提示 2022-05-21 19:46:44 +08:00
奔跑的面条
a07d4daed5 chore: 修改提示内容 2022-05-21 18:04:52 +08:00
奔跑的面条
39023832e3 feat: 新增创建接口,修改i8n部分内容 2022-05-21 18:03:15 +08:00
奔跑的面条
5b8dda60bd feat: 新增退出登录接口,新增全局接口封装,修改登录接口内容 2022-05-21 17:31:01 +08:00
奔跑的面条
f7ade54e93 Merge branch 'master' of https://gitee.com/MTrun/go-view into master-fetch 2022-05-21 14:01:53 +08:00
奔跑的面条
ea40cce9a4 fix: 修改 pnpm7.x 版本打包时的类型错误 2022-05-21 14:01:26 +08:00
奔跑的面条
2524b0ad2d Merge branch 'dev' 2022-05-21 13:49:52 +08:00
奔跑的面条
4ae7e9dd2e Merge branch 'dev' into master-fetch 2022-05-21 13:44:25 +08:00
奔跑的面条
8220f4b366 fix: 修改plop模板的错误 2022-05-21 13:43:31 +08:00
奔跑的面条
7e237b508a feat: 新增登录接口请求 2022-05-20 16:12:27 +08:00
奔跑的面条
28bb82e579 fix: 修改plop的问题 2022-05-20 16:12:09 +08:00
奔跑的面条
bcabcb0831 Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-05-20 10:25:46 +08:00
奔跑的面条
c24b03f3da update README.md. 2022-05-19 01:56:30 +00:00
奔跑的面条
63dd03e755 update README.md. 2022-05-16 10:38:39 +00:00
奔跑的面条
f3f1f57b01 update README.md. 2022-05-16 04:23:10 +00:00
奔跑的面条
8da1a074a2 update README.md. 2022-05-16 04:22:49 +00:00
奔跑的面条
8fd7561971 update README.md. 2022-05-16 04:21:08 +00:00
奔跑的面条
c69f9b09ec chore: 修改下载按钮,修改复制文案为克隆 2022-05-16 00:32:10 +08:00
奔跑的面条
875c267181 feat: 新增 sass 循环样式类,新增接口下载提示 2022-05-14 22:40:48 +08:00
奔跑的面条
acd705da88 !10 update README.md.
Merge pull request !10 from Mr.cao/N/A
2022-05-12 04:07:03 +00:00
Mr.cao
6ade215ea5 update README.md. 2022-05-12 04:06:49 +00:00
奔跑的面条
cabd46268e !9 update README.md.
Merge pull request !9 from 雪花酥/N/A
2022-05-12 04:06:18 +00:00
雪花酥
93540d4234 update README.md. 2022-05-12 04:05:56 +00:00
奔跑的面条
7564f816fc !8 update README.md.
Merge pull request !8 from 雪花酥/N/A
2022-05-12 04:05:24 +00:00
雪花酥
278782b0f8 update README.md. 2022-05-12 04:05:11 +00:00
奔跑的面条
d604f97b4c !7 update README.md.
Merge pull request !7 from 雪花酥/N/A
2022-05-12 04:04:54 +00:00
雪花酥
18a1304e5c update README.md. 2022-05-12 04:04:31 +00:00
奔跑的面条
ce308cf772 !6 update README.md.
Merge pull request !6 from Wang Kejiang/N/A
2022-05-12 03:45:32 +00:00
Wang Kejiang
cb3b7e424e update README.md. 2022-05-12 03:45:12 +00:00
奔跑的面条
18f799cfd6 !5 合并dev
Merge pull request !5 from 奔跑的面条/dev
2022-05-12 03:22:08 +00:00
奔跑的面条
1c6c32f5f7 !4 update README.md.
Merge pull request !4 from zhanghan966/N/A
2022-05-12 03:21:01 +00:00
zhanghan966
5983fa4de0 update README.md. 2022-05-12 03:20:36 +00:00
奔跑的面条
74c6443a86 !3 合并master
Merge pull request !3 from 奔跑的面条/master
2022-05-12 03:19:21 +00:00
奔跑的面条
4bb3739588 update README.md. 2022-05-11 02:05:03 +00:00
奔跑的面条
7f5153f5fa chore: 修改工具条默认状态为侧边 2022-05-10 19:26:08 +08:00
奔跑的面条
2c0b1955af chore: 新增mock数据返回值 2022-05-10 19:17:30 +08:00
奔跑的面条
290150fc5e !2 fix: 解决文件夹名字问题
Merge pull request !2 from 奔跑的面条/master
2022-05-10 10:24:19 +00:00
奔跑的面条
6e1921d9eb 重命名 src/packages/components/Tables/Tables/tableCommon 为 src/packages/components/Tables/Tables/TableCommon 2022-05-10 10:23:24 +00:00
奔跑的面条
d75697af0c fix: 解决文件名称大小写问题 2022-05-10 18:21:50 +08:00
奔跑的面条
01bb9a8939 Merge branch 'dev' of https://gitee.com/MTrun/go-view 2022-05-10 18:11:24 +08:00
奔跑的面条
df7e07c3e8 fix: 解决文件夹名称大小写问题 2022-05-10 18:11:12 +08:00
奔跑的面条
50907035b8 style: 去除多余代码 2022-05-10 18:10:54 +08:00
奔跑的面条
b4da5a925d Merge branch 'dev' of https://gitee.com/MTrun/go-view 2022-05-10 17:57:00 +08:00
奔跑的面条
00f392eae0 fix: 修改文件名称大小写的问题 2022-05-10 17:56:45 +08:00
奔跑的面条
eb14531567 Merge branch 'dev' of https://gitee.com/MTrun/go-view 2022-05-10 17:50:57 +08:00
奔跑的面条
18b6acaed1 fix: 解决文件名称大小写的问题 2022-05-10 17:50:43 +08:00
奔跑的面条
b2437e56ca !1 fix: 修改文件夹大写不同步的问题
Merge pull request !1 from 奔跑的面条/dev
2022-05-10 09:38:36 +00:00
奔跑的面条
348de945e3 重命名 src/views/chart/contentHeader 为 src/views/chart/ContentHeader 2022-05-10 09:37:00 +00:00
奔跑的面条
3ec36194c7 style: 去除多余代码 2022-05-10 14:41:02 +08:00
奔跑的面条
f0f414400f fix: 解决折线图预览不会展示的问题 2022-05-09 18:05:14 +08:00
奔跑的面条
79a438bc96 build: 升级 naiveUI 到最新版2.28.2 2022-05-09 17:10:01 +08:00
奔跑的面条
caf8586c7e release:升级版本号到 1.0.1 2022-05-09 17:08:03 +08:00
奔跑的面条
c168eaa58e perf: 修改工作区域默认配置展示逻辑 2022-05-09 09:58:27 +08:00
奔跑的面条
0ef0b65b02 perf: 修改位置区域文案,修改水球图颜色文案 2022-05-09 09:47:54 +08:00
奔跑的面条
d3caa77ba3 chore: 修改命令 2022-05-07 10:58:37 +08:00
奔跑的面条
84864b759c fix: 修改标尺和水印定位的问题 2022-05-06 20:29:35 +08:00
奔跑的面条
6169d841ee docs: 修改文档路径 2022-05-06 20:23:08 +08:00
奔跑的面条
e9363df523 chore: 去除多余依赖和配置 2022-05-06 20:13:49 +08:00
奔跑的面条
99517313f7 fix: 修改item说明 2022-05-05 11:47:22 +08:00
奔跑的面条
219f57f037 fix: 修改名称 2022-05-04 21:00:40 +08:00
奔跑的面条
d183d1120e fix:修改冲突 2022-05-04 20:59:33 +08:00
奔跑的面条
1cafb9e84b fix: 修改 QQ 群二维码 2022-05-04 20:58:15 +08:00
奔跑的面条
e4776a1522 update README.md. 2022-05-04 12:45:25 +00:00
奔跑的面条
56e82d96c6 fix: 去除多余图片 2022-05-04 20:32:22 +08:00
奔跑的面条
57dba3f9a2 update README.md. 2022-05-04 12:29:15 +00:00
奔跑的面条
3836131a27 fix: 修改logo图片 2022-05-04 20:21:04 +08:00
奔跑的面条
dd8ad88f96 fix: 修改图标 2022-05-04 20:20:09 +08:00
奔跑的面条
7b262d8b5b update README.md. 2022-05-04 06:41:13 +00:00
奔跑的面条
a151d12a99 fix:删除多余 doc 文件 2022-05-04 14:38:08 +08:00
奔跑的面条
a913fd9b2f update README.md. 2022-05-04 06:35:50 +00:00
奔跑的面条
c67df66098 fix: 去除错误位置图片 2022-05-04 13:55:24 +08:00
奔跑的面条
5badafce62 update README.md. 2022-05-04 05:55:06 +00:00
奔跑的面条
5d48eea29b update README.md. 2022-05-04 05:53:23 +00:00
奔跑的面条
b6893d1208 doc: update README 2022-05-04 13:50:40 +08:00
奔跑的面条
b402969a44 fix: 解决全局滤镜导致TS打包报错问题,修改壁纸不更随滤镜变换的问题 2022-05-04 13:21:27 +08:00
奔跑的面条
3d1ed95bed feat: 新增页面预览方式 2022-05-04 01:46:56 +08:00
奔跑的面条
4b2370f229 feat: 新增滤镜同步变化功能 2022-05-03 16:43:23 +08:00
奔跑的面条
ab93fa0adf fix: 提取滤镜,变换,动画方法到全局 2022-05-03 16:29:53 +08:00
奔跑的面条
b608897742 feat:新增旋转功能 2022-05-03 16:24:31 +08:00
奔跑的面条
0681e9217d fix: 处理渐变图表的配置和水球背景的全局主题跟随 2022-05-03 15:36:35 +08:00
奔跑的面条
6ed7c130cb fix: 修改水球图编辑和颜色跟随变换 2022-05-02 23:33:39 +08:00
奔跑的面条
7b8d996ef6 feat: 新增水球图数据变化和样式设置 2022-05-02 23:10:47 +08:00
奔跑的面条
0423d66596 fix:修改图表名称 2022-05-02 19:32:36 +08:00
奔跑的面条
829a98e4e1 fix: 修改全局 dialog 提示 2022-05-02 17:33:51 +08:00
奔跑的面条
4e7e1e62b6 fix:修改 @mixin 名称 2022-05-02 17:18:18 +08:00
奔跑的面条
b678e389df fix: 修改组件命名不规范的问题 2022-05-02 16:30:45 +08:00
奔跑的面条
5b88c7dae5 feat:新增图片组件,修改文件组件 2022-05-01 17:36:23 +08:00
奔跑的面条
ca7bd08b57 fix: 修改备注 2022-04-30 21:20:51 +08:00
奔跑的面条
afaccad16c fix: 去除多余代码 2022-04-28 15:09:26 +08:00
奔跑的面条
98ce49ee03 feat: 新增图片组件模板 2022-04-27 17:45:40 +08:00
奔跑的面条
66b4c457bf fix: 修改历史记录展示顺序,修改滚动条的问题 2022-04-26 18:21:58 +08:00
奔跑的面条
f0751499b3 fix: 修改全局样式配置的样式 2022-04-26 11:44:24 +08:00
奔跑的面条
a43d5778cb type:解决类型问题 2022-04-26 11:37:25 +08:00
奔跑的面条
9d3f53c315 fix: 修改注释 2022-04-25 16:50:20 +08:00
奔跑的面条
e02dad5e2c fix: 新增全局滤镜 2022-04-25 16:17:22 +08:00
奔跑的面条
b4972eed39 fix: 修改滤镜名称 2022-04-25 15:13:54 +08:00
奔跑的面条
f641889edd feat: 新增文字侧边Padding控制 2022-04-24 20:02:22 +08:00
奔跑的面条
a0d0a5e214 fix: 修改打包错误, 回退I18N版本 2022-04-22 16:40:46 +08:00
奔跑的面条
2222af12c3 fix: 新增搜索选择 2022-04-22 10:04:55 +08:00
奔跑的面条
9ba6d71780 fix: 新增组件搜索功能 2022-04-21 22:35:28 +08:00
奔跑的面条
8c297737c0 fix: 修改滤镜名称 2022-04-20 09:28:14 +08:00
奔跑的面条
8e815e90ab feat:新增图表颜色滤镜 2022-04-19 22:07:54 +08:00
奔跑的面条
03628fd46b fix: 去除 axios data的设置 2022-04-18 10:16:56 +08:00
奔跑的面条
d067560776 fix: 修改文档英文翻译 2022-04-18 09:32:01 +08:00
奔跑的面条
b4aa89e810 feat: 新增赞助链接 2022-04-17 15:16:47 +08:00
奔跑的面条
0f0c631f2a fix: 修改版本冲突导致报错的问题 2022-04-15 17:48:02 +08:00
奔跑的面条
28c4a133a6 feat: 新增文档 2022-04-14 21:58:07 +08:00
奔跑的面条
5abdddc2e6 fix:升级 VITE版本 2022-04-14 15:57:50 +08:00
奔跑的面条
defb71569d fix: 修改文件建构 2022-04-14 10:05:57 +08:00
奔跑的面条
efba045ad0 fix: 修改数据加密解密,新增登录校验,新增底部备案号 2022-04-13 21:31:18 +08:00
奔跑的面条
77a6b50307 fix: 修改装饰2的bug 2022-04-13 19:48:10 +08:00
奔跑的面条
dc7e3f5a06 feat: 新增快捷键列表关闭功能 2022-04-13 11:41:45 +08:00
奔跑的面条
3c6c059e2a fix: 修改 Makefile 文件 2022-04-13 11:18:51 +08:00
奔跑的面条
00ba6554b1 fix: 修改快捷键页面展示 2022-04-13 11:13:37 +08:00
奔跑的面条
dc347aeb0f fix: 修改方向键快捷键 2022-04-13 11:03:30 +08:00
奔跑的面条
15564813bc fix:修改快捷键列表间距 2022-04-13 10:48:19 +08:00
奔跑的面条
7ebe986b17 fix: 修改快捷键展示弹窗 2022-04-13 10:35:15 +08:00
奔跑的面条
9f0ee71310 fix: 修改description 2022-04-12 17:33:59 +08:00
奔跑的面条
6f22bc6127 fix: 修改快捷键 2022-04-12 12:01:40 +08:00
奔跑的面条
e9c263728b fix: 修改拖拽的问题 2022-04-11 18:17:09 +08:00
奔跑的面条
100ec84d57 fix: 新增导入数据脏数据的过滤 2022-04-11 17:07:06 +08:00
奔跑的面条
8a30a763f0 fix: 修改历史记录的最大值的设定位置 2022-04-11 17:06:41 +08:00
奔跑的面条
295115b6be fix: 抽离水印的组件 2022-04-11 17:06:04 +08:00
奔跑的面条
383b7c3cd5 fix: 去除多余的引入 2022-04-11 12:42:49 +08:00
MTrun
895d1c8ac8 fix: 修改aside展示时机 2022-04-10 21:22:28 +08:00
MTrun
0b2a7920ae fix: 修改aside展示动画 2022-04-10 21:16:30 +08:00
MTrun
3a698e96be fix: 修改任务栏 2022-04-10 20:56:05 +08:00
MTrun
a5f54fd31f fix: 修改header层级 2022-04-10 19:05:14 +08:00
MTrun
123b5a6073 fix: 修改类型错误 2022-04-10 18:01:19 +08:00
MTrun
d1bb15b883 feat: 新增导入导出功能😍 2022-04-10 17:56:51 +08:00
MTrun
c7a9c24871 fix: 新增dialog的属性控制 2022-04-10 17:40:43 +08:00
MTrun
0d5a592e1d fix:修改名称错误问题 2022-04-10 16:17:00 +08:00
MTrun
68a37cc95d fix: 修改侧边栏mb的问题 2022-04-10 00:17:33 +08:00
MTrun
6706710d3c feat: 新增侧边栏 2022-04-09 23:55:09 +08:00
MTrun
8be1eff5b4 fix: 修改系统设置下拉框的宽度 2022-04-09 16:56:09 +08:00
MTrun
69fca60836 fix:修改工具栏不会动态更新的问题 2022-04-09 16:54:01 +08:00
MTrun
5904d04e2e feat: 新增工具栏模块, 修改系统设置初始化结构 2022-04-09 16:40:57 +08:00
奔跑的面条
5e6ecfc3e5 fix: 修改导出名称 2022-04-07 19:54:17 +08:00
奔跑的面条
879c1f3332 fix: 去除多余测试代码 2022-04-07 19:46:40 +08:00
奔跑的面条
b36cf2bc7e fix: 解决canvas圆角不展示的问题 2022-04-07 19:33:49 +08:00
奔跑的面条
70e606c071 fix: 修改editbox的样式问题 2022-04-07 19:33:14 +08:00
奔跑的面条
77aae79bac fix: 修改图表编辑区域底部展示问题 2022-04-07 15:52:27 +08:00
奔跑的面条
2fafb3d7de fix: 修改监听的内容设置 2022-04-07 15:28:25 +08:00
奔跑的面条
38a49d68e5 fix: 修改类型错误 2022-04-07 14:52:48 +08:00
奔跑的面条
525941512e fix: 降低 vue-i18n 的版本,有问题 2022-04-07 14:41:54 +08:00
奔跑的面条
079fc2bdb9 fix: 修改TS报错问题,抽离水印文案 2022-04-07 14:20:18 +08:00
奔跑的面条
34177e00af feat: 新增导出水印功能 2022-04-07 11:24:40 +08:00
奔跑的面条
bb2b11edf2 fix: 修改预览页面位置不对的问题,修改文字配置项的顺序 2022-04-07 09:57:00 +08:00
奔跑的面条
a41104118e feat: 新增文字边框 2022-04-06 21:53:00 +08:00
奔跑的面条
f2d32d8256 fix: 修改展示的错误 2022-04-06 19:55:31 +08:00
奔跑的面条
5d585994ca fix: 修改折线图不展示,不会动态变更的bug 2022-04-06 13:38:19 +08:00
奔跑的面条
536faa2778 fix: 修复option类型错误问题 2022-04-06 10:42:11 +08:00
奔跑的面条
793f4098b7 feat: 修改下载功能 2022-04-05 20:16:59 +08:00
奔跑的面条
0d482ad9c4 feat:新增图片导出功能 2022-04-05 19:01:52 +08:00
奔跑的面条
eee2611c4e fix: 解决多组数据会同步修改的bug 2022-04-05 16:04:52 +08:00
奔跑的面条
9d04515977 fix: 修复对齐线会一直存在的问题 2022-04-05 15:04:13 +08:00
奔跑的面条
19c62d7b78 feat:新增拖拽改变层级功能 2022-04-03 15:06:32 +08:00
奔跑的面条
5861e38056 fix: 修改列表初始化会卡顿的问题 2022-04-02 11:46:50 +08:00
奔跑的面条
6cd2a06974 fix: 新增列表数据更新,修改数据更新 hook 函数 2022-04-02 11:34:54 +08:00
奔跑的面条
f0b21b3bf9 fix: 新增列表组件 2022-04-01 16:49:17 +08:00
奔跑的面条
7654d29d10 feat: 新增轮播图表 2022-04-01 16:36:22 +08:00
奔跑的面条
c03b4c0263 feat:新增数字滚动 2022-04-01 12:52:11 +08:00
奔跑的面条
daf5537aea feat: 新增移动快捷键与全局设置 2022-04-01 10:25:13 +08:00
mtrun
b2ed8a57a7 fix:修改装饰5的内容 2022-03-31 18:07:57 +08:00
mtrun
7a1d64c7e2 feat: 新增装饰4 -5 2022-03-31 18:02:45 +08:00
mtrun
504c461c57 fix:新增边框02,03 2022-03-31 16:40:11 +08:00
mtrun
2725f136fe fix: 修改装饰组件名称 2022-03-31 10:00:23 +08:00
mtrun
00af3f90d8 feat: 新增装饰组件01 2022-03-31 09:59:42 +08:00
MTrun
a4c1b08ca1 feat:新增装饰组件 2022-03-30 08:06:59 +08:00
mtrun
8f419cbbbb fix:修改右键bug 2022-03-28 17:32:49 +08:00
mtrun
8110173d8a fix: 修改右键问题 2022-03-28 17:24:56 +08:00
mtrun
70b4af4a65 新增右键自定义列表 2022-03-28 17:19:50 +08:00
mtrun
851a4d58ec fix:修改右键逻辑 2022-03-28 17:17:44 +08:00
mtrun
cd360a1833 fix: 新增水球 2022-03-28 15:44:55 +08:00
mtrun
96ea54a413 fix: 修改水波图的图片名字错误问题 2022-03-28 14:39:56 +08:00
mtrun
0d873e4ffa fix: 修改水波图的名称 2022-03-28 14:36:05 +08:00
mtrun
4b21f3a753 feat: 新增前进后退按钮,修改粘贴的位置问题 2022-03-28 11:38:44 +08:00
MTrun
7d5f607b92 feat:新增border13 2022-03-27 01:18:22 +08:00
MTrun
d7185522c0 fix: 新增边框12 2022-03-27 01:09:22 +08:00
MTrun
f5ca879bff feat: 新增边框10 2022-03-27 00:58:00 +08:00
MTrun
ddb541ade9 feat: 新增边框8 2022-03-27 00:34:30 +08:00
MTrun
4cb9597ad9 fix: 新增边框4的设置 2022-03-26 23:24:13 +08:00
MTrun
1ae22cafa3 feat: 新增边框7 2022-03-26 23:14:12 +08:00
MTrun
06f80a4645 feat: 新增边框背景色修改 2022-03-26 22:52:03 +08:00
MTrun
7d744bb621 fix: 新增边框6 2022-03-26 21:46:41 +08:00
MTrun
bb8f7c5ed4 feat: 新增边框05 2022-03-26 21:22:09 +08:00
MTrun
aec646b5b0 feat: 新增边框 2022-03-26 20:59:20 +08:00
MTrun
91e041ba97 feat:新增边框13 2022-03-26 16:42:58 +08:00
MTrun
ab487d2a1d fix:去除border多余class样式 2022-03-26 15:38:52 +08:00
MTrun
0faf7e24af feat: 新增 border 样式修改,修改全部设置引入方式 2022-03-26 15:36:52 +08:00
MTrun
ef74947572 fix: 解决多余导出错误 2022-03-26 11:32:58 +08:00
MTrun
b5e862e740 feat: 新增 border 2022-03-26 11:31:14 +08:00
MTrun
0053daed2f fix: 修改useChartHistoryStoreStore命名错误 2022-03-25 20:00:21 +08:00
MTrun
43b9b72369 fix: 修改图表数据接口的hooks 2022-03-25 19:58:39 +08:00
MTrun
55c500f34b fix:修改格式 2022-03-25 19:43:44 +08:00
MTrun
10c6176a16 fix: 设置图表只在预览页面进行轮询请求 2022-03-24 16:51:31 +08:00
MTrun
b98aeb1976 feat: 新增预览接口数据动态获取功能 2022-03-24 14:19:07 +08:00
MTrun
6b8b1e43ae fix: 修改mock方式 2022-03-24 09:19:14 +08:00
MTrun
2d7db3f0f6 feat: 新增编辑阶段 mock 接口轮询请求功能 2022-03-23 20:41:50 +08:00
MTrun
c42e9ad0fb fix: 修改data模块的数据调用和全局设定 2022-03-22 15:46:17 +08:00
MTrun
559bf2fe57 fix: 抽离update hook 2022-03-22 11:41:43 +08:00
MTrun
75291a9feb fix: 修改快捷键功能与提示 2022-03-22 10:33:40 +08:00
MTrun
9ca618c3c5 fix:修改请求的数据格式错误的问题 2022-03-22 09:39:53 +08:00
mtruning
bf020e3d3e fix: 新增mock数据请求功能 2022-03-21 23:03:10 +08:00
MTrun
d9ee41c892 feat: 新增数据请求接口 2022-03-21 20:56:42 +08:00
mtruning
0cb3cb3eae fix: 封装数据处理 2022-03-21 00:57:23 +08:00
mtruning
3d72d58e87 fix: 修改线条的 dataset 问题 2022-03-20 18:11:26 +08:00
mtruning
bdf7527824 fix: 修改导出的数据项 2022-03-20 16:13:33 +08:00
mtruning
2651b21b45 fix:新增数据设置小提示 2022-03-19 23:47:24 +08:00
mtruning
285fff6add feat: 新增数据校验,数据导入导出 2022-03-19 23:28:33 +08:00
mtruning
80c5856732 fix: 修改重命名可以无数据的问题 2022-03-19 21:42:07 +08:00
mtruning
15b908773d fix: 分离配置项里的名称部分数据 2022-03-19 21:29:03 +08:00
MTrun
1b133890b0 feat:新增全局接口配置,单个图表映射表,抽离柱状图数据格式, 2022-03-18 20:36:05 +08:00
MTrun
b8db165f6e feat: 新增数据请求配置 2022-03-17 20:18:46 +08:00
MTrun
a45036c935 fix: 预览页改成hook写法 2022-03-17 10:53:18 +08:00
MTrun
fe4184c6c4 fix: 修改rule坐标错误问题,缩放导致长度不足问题 2022-03-16 11:22:22 +08:00
MTrun
5f7ebcf233 fix: 修改ruler位置,解决缩放问题 2022-03-16 11:03:52 +08:00
MTrun
94672221e5 feat: 新增类型校验函数 2022-03-15 19:40:55 +08:00
MTrun
09e3140c0d fix: 添加注释 2022-03-15 19:06:19 +08:00
MTrun
c4971a9954 fix: 新增标尺 2022-03-15 17:49:02 +08:00
MTrun
b5d54ed173 fix: 修改规范性命名问题 2022-03-14 19:56:09 +08:00
MTrun
f4df648e5a fix: 修改名称规范问题 2022-03-14 19:52:01 +08:00
MTrun
b60843d3ed fix: 修改闭合组件不规范的问题 2022-03-14 16:07:35 +08:00
MTrun
db0641c937 fix: 修改 Color TS 类型出错导致无法打包的问题 2022-03-14 11:53:14 +08:00
mtruning
109a1a8d7a fix: 优化颜色列表卡顿问题 2022-03-13 13:37:25 +08:00
mtruning
8cb8e6407a feat: 新增推荐色 2022-03-13 00:42:18 +08:00
mtruning
859024056a fix: 抽离颜色列表组件 2022-03-12 23:51:03 +08:00
MTrun
58688e6e93 fix: 修复修改颜色不会存储本地的问题 2022-03-12 18:51:38 +08:00
MTrun
e2e72ff9fd feat: 新增主题颜色选择 2022-03-12 18:46:51 +08:00
MTrun
c3e5117b31 fix: 修改全局颜色配置的问题 2022-03-12 15:25:26 +08:00
MTrun
d37f316a86 fix:修改移动端提示文案字体 2022-03-12 11:46:39 +08:00
MTrun
41e7dc7ab1 fix: 解决登录页不适配大尺寸的问题 2022-03-12 11:45:19 +08:00
MTrun
524bea8744 fix: 解决不能预览渐变色的问题 2022-03-12 11:29:57 +08:00
MTrun
ea75f161a7 feat: 支持渐变色全局变换 2022-03-11 10:22:54 +08:00
MTrun
e6a7ad9776 fix: 去除模态层 2022-03-11 08:45:04 +08:00
MTrun
da38db1f4e feat: 新增渐变色根据全局变换 2022-03-10 21:35:49 +08:00
MTrun
adff55f89a fix: 解决缩放大于100%的问题 2022-03-10 20:54:02 +08:00
MTrun
55c8314613 fix: 去除配置文件里的 node 指向 2022-03-10 20:05:05 +08:00
MTrun
a96df3cc13 fix: 修改预览的存储方式为 sessionStorage 2022-03-10 18:57:18 +08:00
MTrun
4c6ed77806 fix: 修改页面 changeSize 逻辑 2022-03-10 17:55:59 +08:00
MTrun
5b5f59da91 fix: 修改组件名称大写的问题 2022-03-10 14:57:34 +08:00
MTrun
5694f61e4d fix: 修改预览页面动态注册方式 2022-03-10 14:34:26 +08:00
MTrun
87b033c633 fix: 修改引入方式,去除config文件上的node指向 2022-03-10 14:12:26 +08:00
MTrun
06caa046fa fix: 修改动态引入逻辑 2022-03-10 10:14:52 +08:00
MTrun
98100be99d feat: 新增折线图颜色控制 2022-03-09 20:27:53 +08:00
MTrun
f25ec3d6a7 fix: 修改折线图配置 2022-03-09 19:22:58 +08:00
MTrun
a33e2f29e3 fix: 取消通用样式的默认展示 2022-03-09 18:11:48 +08:00
MTrun
9bd14ebc0c feat: 新增定位和style处理 2022-03-09 17:37:32 +08:00
MTrun
5c595fdedf feat: 新增动画功能 2022-03-09 09:21:47 +08:00
MTrun
b9b7c75627 feat: 新增预览背景图 2022-03-07 15:39:40 +08:00
MTrun
c2e01b3907 fix: 修改类型报错 2022-03-07 15:21:45 +08:00
MTrun
9295b93116 fix: 解决首页注册组件的bug 2022-03-07 12:51:50 +08:00
MTrun
b0f5fd826c feat: 新增组件预览 2022-03-07 12:33:05 +08:00
mtruning
fb89f9b85b fix: 接收winopen的返回值 2022-03-07 01:04:29 +08:00
mtruning
5c797b738e fix: 提交动态注册的代码 2022-03-06 21:26:31 +08:00
mtruning
b817ee7f80 fix: 修改预览的问题 2022-03-06 20:31:45 +08:00
mtruning
33174f8208 feat:新增预览页面位置图表位置渲染功能 2022-03-06 16:54:48 +08:00
mtruning
41798a2ec6 feat: 新增预览页缩放功能 2022-03-06 15:19:18 +08:00
mtruning
bea36accff feat: 新增预览页 2022-03-06 02:08:14 +08:00
mtruning
6f74838e1e fix: 去除多余输出 2022-03-05 22:12:53 +08:00
mtruning
b2e255bb42 feat:新增吸附修改的全局设置 2022-03-05 22:11:25 +08:00
MTrun
1028ea0302 feat: 新增对齐线 2022-03-04 20:57:36 +08:00
MTrun
f767e9aaba feat: 新增事件入口 2022-03-03 14:36:58 +08:00
MTrun
620c83b1e0 fix: 优化图表列表性能 2022-03-03 11:01:52 +08:00
MTrun
19b7853057 feat: 新增尺寸控件 2022-03-03 10:25:50 +08:00
MTrun
d1db7ad494 feat: 新增组件缩放 2022-03-03 10:19:41 +08:00
MTrun
5298b8267f fix: 修改自适应比例 2022-03-03 09:57:48 +08:00
MTrun
7f729d141f feat:新增动画配置项目 2022-03-02 17:34:45 +08:00
MTrun
1f405b5055 fix:修改屏幕适配的代码 2022-03-02 16:18:34 +08:00
MTrun
516723e252 fix: 移动打包配置位置 2022-03-01 16:46:48 +08:00
MTrun
6e0ab15e47 feat: 图表组件图片换成懒加载 2022-03-01 16:39:04 +08:00
MTrun
977f1cade0 feat: 新增移动端拦截 2022-03-01 15:58:39 +08:00
MTrun
4075064384 build: 优化图片大小 2022-03-01 15:43:01 +08:00
MTrun
26315f3424 fix: 全局设置新增关闭按钮 2022-03-01 15:39:13 +08:00
MTrun
f2af017925 fix: 修改 footer 位置的 doc 链接地址 2022-03-01 14:09:34 +08:00
MTrun
e3575d0f43 fix: 修改首页图片和地址指向 2022-02-28 21:15:57 +08:00
MTrun
cee302f208 build: 修改打包配置 2022-02-28 20:26:41 +08:00
MTrun
922afd8310 fix: 修改图片引入打包报错的问题 2022-02-28 20:26:04 +08:00
MTrun
cab18e29f5 feat: 补齐配置文件 2022-02-28 16:08:25 +08:00
MTrun
6dbe603fcd type: 修改编译错误的type类型 2022-02-28 11:00:33 +08:00
MTrun
9ed848e21f feat: 加密登录数据,修改折线图表UI 2022-02-28 10:30:51 +08:00
mtruning
4e9e492c29 feat: 新增图表独立配置混合 2022-02-26 17:38:24 +08:00
MTrun
f8095ca52a feat: 动态注册组件,优化首页出现性能 2022-02-25 22:10:18 +08:00
MTrun
211e7b08c4 fix: 左侧使用异步加载 2022-02-25 21:45:14 +08:00
MTrun
6678b2858d feat: 新增图表位置处理 2022-02-25 21:26:56 +08:00
MTrun
8e9905816e fix: 修改类型报错的问题 2022-02-25 15:51:19 +08:00
MTrun
edfdcee3a4 feat:新增渐变背景色 2022-02-25 11:19:51 +08:00
MTrun
8fce610ec7 build: 升级依赖 2022-02-25 11:19:37 +08:00
MTrun
3923b49c9e feat: 新增折线图,修改legend位置 2022-02-24 21:02:08 +08:00
MTrun
1b7ee5cb2e fix: 修改组件不会一起变更的问题 2022-02-24 20:19:08 +08:00
MTrun
166b2bb98f feat: 新增组件重命名 2022-02-24 20:11:38 +08:00
MTrun
2690b06eff fix: 修改 show 开关的问题 2022-02-24 17:55:29 +08:00
MTrun
14010cce8f feat: 修改组件展示,支持单个组件数据编辑 2022-02-24 17:23:20 +08:00
MTrun
2bdc489827 fix: 修改图表类型错误 2022-02-24 10:21:33 +08:00
MTrun
b8639ceb7e fix: 解决页面销毁Dom没有绑定的内存泄漏 2022-02-23 16:22:18 +08:00
MTrun
eb685d3af4 fix: 新增主题色配置 2022-02-23 15:49:00 +08:00
MTrun
6f68cc58d3 feat:新增全局属性配置 2022-02-23 15:23:09 +08:00
MTrun
b550c3e541 fix: 去除不正确图片 2022-02-23 14:44:10 +08:00
MTrun
40a129aafd feat: 新增全局测试 2022-02-23 14:11:33 +08:00
MTrun
c071cb5a49 feat: 新增全局设置通用组件 2022-02-22 15:50:50 +08:00
MTrun
adb5f353bf feat: 新增全局样式修改 2022-02-22 15:32:57 +08:00
MTrun
52418d7f70 build: 升级naive包 2022-02-22 10:10:39 +08:00
MTrun
3745e2afcd feat: 新增样式按需引入 2022-02-21 21:30:35 +08:00
MTrun
aa71bb545e fix: 解决合并会修改原属性的bug 2022-02-21 21:21:52 +08:00
MTrun
d74fb21c9e fix: 修改全局设置不触发的问题 2022-02-21 21:16:44 +08:00
MTrun
b980c79ab4 feat: 新增全局样式设置 2022-02-21 19:45:11 +08:00
MTrun
f91b1d7f8a fix:提取AttrType类型 2022-02-16 20:06:51 +08:00
MTrun
0b58dd4d17 fix: 解决重叠拖拽放置位置错误的bug 2022-02-16 19:18:39 +08:00
MTrun
c968853092 fix: 修改加载样式 2022-02-16 15:54:23 +08:00
MTrun
b32e06e03b fix: 修改上传图片不会自动展示的问题 2022-02-15 15:42:59 +08:00
MTrun
69faf8db75 fix: 修改filter透明度 2022-02-14 09:41:44 +08:00
mtruning
d689698ddd fix: 修改类型错误,调整页面细节,新增拖拽上传图片 2022-02-12 12:16:00 +08:00
MTrun
7e4eb8eed2 fix: 去除多余属性 2022-02-11 20:42:03 +08:00
MTrun
7d01528703 style: 修改名称 2022-02-10 20:01:22 +08:00
MTrun
88f9f9efe1 perf: 优化大屏的背景渲染方式,提升性能 2022-02-10 16:34:34 +08:00
MTrun
23f09d33a2 fix: 修改注释 2022-02-10 09:26:50 +08:00
MTrun
de1652973c fix: 修改工具类名称 2022-02-09 20:37:00 +08:00
MTrun
830d475215 fix: 新增 const 约束 2022-02-09 20:30:10 +08:00
MTrun
c8437fd3ea fix: 修改 TS 问题 2022-02-09 20:12:54 +08:00
MTrun
df2c9eea98 fix:新增dev host 接口 2022-02-09 17:40:23 +08:00
MTrun
09e253e833 fix: 修改标题 2022-02-09 09:16:34 +08:00
MTrun
9d541d5ac3 fix: 修改全局配置展示 2022-02-08 19:39:57 +08:00
MTrun
6d04bb8eea fix: 优化历史记录性能 2022-02-08 11:29:33 +08:00
MTrun
ec5e74019b fix: 修改图层顺序 2022-02-07 21:02:49 +08:00
MTrun
8f15b0a32f fix: 修改右键 2022-02-07 20:55:40 +08:00
MTrun
0ce954588e feat: 新增自定义背景图 2022-02-06 21:35:38 +08:00
MTrun
0a7d817e60 feat:修改色版展示 2022-02-06 11:21:43 +08:00
MTrun
483d1eb5e8 feat: 新增主题色选项 2022-02-06 01:04:05 +08:00
MTrun
27f416a46e feat: 新增撤回前进功能 2022-02-04 18:28:02 +08:00
MTrun
5e2f0ab6df feat: 清空剪贴板 2022-02-04 13:22:00 +08:00
MTrun
c3096ed486 fix: 格式 2022-02-04 12:19:02 +08:00
MTrun
abaf8f07ad feat: 新增剪切 2022-02-04 12:17:50 +08:00
MTrun
47a7ce9d6e feat: 新增复制粘贴功能 2022-02-03 22:54:31 +08:00
MTrun
41711b174f fix: 新增图表类型 2022-02-02 18:17:45 +08:00
MTrun
9876c7a802 fix: 修改拖拽之后未选中的问题 2022-02-02 14:18:39 +08:00
MTrun
cd91047b6e fix:新增横向柱状图 2022-02-02 00:46:42 +08:00
MTrun
c5b1380299 feat:新增层级移动功能 2022-02-01 20:57:54 +08:00
MTrun
7ec0af42b8 feat: 新增置顶和置底功能 2022-02-01 17:12:16 +08:00
MTrun
b9501cee37 fix:修改删除的bug 2022-02-01 01:20:00 +08:00
MTrun
c92510863f fix: 修改右键封装逻辑 2022-02-01 00:31:28 +08:00
MTrun
47456fb801 feat: 新增图层列表右键菜单 2022-01-31 23:43:45 +08:00
MTrun
c6a7be352b fix: 修改右键判定区域,新增历史记录store 2022-01-31 23:37:43 +08:00
MTrun
0a223afab2 fix: 修改plop模板数据 2022-01-31 23:37:08 +08:00
MTrun
9f4e893290 fix:修改图表拖拽的位置预留 2022-01-30 22:56:29 +08:00
MTrun
ce6843f6a2 fix: 修改选中效果的动画 2022-01-30 19:38:12 +08:00
MTrun
ae78ced3dd feat: 新增拖拽功能 2022-01-30 14:20:28 +08:00
MTrun
1749680268 fix: 修改注释 2022-01-30 00:43:37 +08:00
MTrun
379a6d259f fix: 新增选择联动 2022-01-29 23:58:56 +08:00
MTrun
ab8c84e1b9 featr: 新增图层选中的样式 2022-01-29 21:44:22 +08:00
MTrun
b3d723d323 fix: 新增图层 2022-01-29 11:44:51 +08:00
MTrun
9659027502 fix:新增图层处理 2022-01-28 21:17:49 +08:00
MTrun
9a1e23c661 fix: 修复滚动条的bug 2022-01-28 21:05:07 +08:00
MTrun
66bcf066e0 fix: 约束自动缩放的最大比例 2022-01-28 20:54:13 +08:00
MTrun
5e07c2ca6d fix: 新增图表居中拖拽 2022-01-27 23:16:51 +08:00
MTrun
f57fa702d9 fix: 新增右键和删除功能 2022-01-27 22:30:35 +08:00
MTrun
f44d119f16 feat: 新增图表外层 2022-01-27 20:47:22 +08:00
MTrun
be28b2990f fix: 去除多余的引入 2022-01-27 19:10:04 +08:00
MTrun
a71180b71b fix: 位置处理提取 2022-01-26 17:38:16 +08:00
MTrun
1e915bc873 fix: 修改文件结构 2022-01-26 15:46:25 +08:00
mtruning
8faa6d516c fix: 处理位置定位的问题 2022-01-25 22:41:12 +08:00
mtruning
43e557253f feat: 新增柱状图图表 2022-01-25 22:29:44 +08:00
MTrun
7a3af81d7a fix: 新增组件拖拽 2022-01-25 18:19:44 +08:00
MTrun
bbeba4a8d8 fix: 修改配置项目 2022-01-25 11:09:32 +08:00
MTrun
953b8c3486 fix: 编写拖拽信息 2022-01-24 21:12:18 +08:00
MTrun
0fc4d44ba2 fix: 修改命名 2022-01-24 16:25:43 +08:00
MTrun
e1a41a2853 fix: 修改一点类型错误的问题 2022-01-24 14:28:31 +08:00
mtruning
3e4b3001ef fix: 修改类型 2022-01-23 19:22:54 +08:00
mtruning
5db0119bb6 feat: 新增resize时的边框变色交互 2022-01-23 01:12:49 +08:00
MTrun
4fc4cbf593 fix: 修改缩放的联动 2022-01-21 17:55:35 +08:00
MTrun
a8338ec49e feat: 新增滚动条控制 2022-01-20 22:13:51 +08:00
MTrun
20a1866923 feat: 新增工作区域内容模块 2022-01-20 21:25:35 +08:00
MTrun
cb14424110 fix: 新增 plop 自动化生成工具 2022-01-19 21:29:04 +08:00
MTrun
56d00831d3 feat: 图表组件注册 2022-01-19 19:59:11 +08:00
MTrun
ec5fccb945 处理开始拖拽时的数据 2022-01-19 09:19:17 +08:00
MTrun
7262c4af22 fix: 修改左侧图表列表的中文键名问题 2022-01-18 21:41:52 +08:00
mtruning
d54c9d2388 fix: 修改key 2022-01-16 22:17:34 +08:00
mtruning
5550e75893 fix: 修改图标 2022-01-16 15:54:59 +08:00
mtruning
6af050efb2 fix: 修改图标和页面 2022-01-16 15:28:33 +08:00
mtruning
fec6c6f23e feat:新增组件 2022-01-15 22:35:32 +08:00
mtruning
5843388d0b feat:新增图表 2022-01-15 21:54:04 +08:00
mtruning
81881a8ed4 feat: 新增左侧图表数据 2022-01-15 21:05:11 +08:00
mtruning
4bf319dcb4 fix: 抽离全局设置的位置 2022-01-15 16:07:46 +08:00
mtruning
d2fabeae5f fix: 新增组件 2022-01-15 14:56:48 +08:00
mtruning
b7a372e50f fix: 完成左侧列表的其余内容 2022-01-15 12:50:00 +08:00
MTrun
6850dd467d feat: 新增种类数量识别 2022-01-14 22:18:47 +08:00
MTrun
c4953e7afd fix: 处理缺失的类型 2022-01-14 22:10:59 +08:00
MTrun
0f7fbfcce8 fix: 优化组件渲染方式 2022-01-14 22:07:02 +08:00
MTrun
8bdacd82c7 fix: 修改边距 2022-01-14 16:27:23 +08:00
MTrun
b03a495712 feat: 新增chart组件数据内容 2022-01-14 16:17:14 +08:00
MTrun
95e2cdc689 fix: 修改颜色的深浅 2022-01-13 18:01:33 +08:00
MTrun
ea32cb1810 fix: 新增图表列表数据 2022-01-13 16:20:25 +08:00
MTrun
3a87f0dd30 fix: 修改左侧的渲染样式 2022-01-12 10:41:26 +08:00
MTrun
5030cfe099 feat:新增图表组件的切换 2022-01-11 20:56:19 +08:00
MTrun
67b613dabf fix: 修改拖拽区域名称 2022-01-11 14:15:14 +08:00
MTrun
e8057361d6 fix: 修改icon警告信息 2022-01-10 09:49:08 +08:00
MTrun
7200242386 fix: 修改英语的翻译间隔 2022-01-10 09:03:31 +08:00
mtruning
d5d5a72126 fix: 修改语言获取位置 2022-01-09 21:35:46 +08:00
mtruning
c582f72ea7 fix: 修改语言挂载问题 2022-01-09 19:22:55 +08:00
mtruning
f665b75fc4 fix: 修改绘制界面样式,新增返回首页按钮 2022-01-09 17:12:35 +08:00
MTrun
a0fdd752d4 fix: 修改收缩功能 2022-01-08 21:01:52 +08:00
MTrun
072b8668fd fix: 设置菜单折叠宽度 2022-01-08 15:00:52 +08:00
MTrun
9c74c26219 fix: 修改本地存储变量名 2022-01-08 14:27:56 +08:00
MTrun
8c64abbe51 fix: 修改切换语言不会同步的问题 2022-01-08 10:30:45 +08:00
MTrun
3d9cd8013d fix: 修改语言切换不会同步的问题 2022-01-08 09:31:14 +08:00
MTrun
dcb2214c04 fix: 处理界面展示相关联的问题 2022-01-07 22:02:13 +08:00
MTrun
b349f3440b fix🐛: 解决切换语言不会监听的问题 2022-01-07 12:25:23 +08:00
MTrun
c8098f429d fix: 修改底部颜色 2022-01-06 19:21:48 +08:00
MTrun
7c1bba409a fix: 新增切换按钮 2022-01-06 15:37:44 +08:00
MTrun
fcc6b20fb6 feat:完整布局封装 2022-01-06 13:45:51 +08:00
MTrun
698b5264ba fix: 去除 layout 文件夹 2022-01-05 21:12:38 +08:00
MTrun
a1d743aa74 fix: 新增 store 控制 2022-01-05 21:05:55 +08:00
MTrun
1a659d4a60 feat: 新增顶部功能 2022-01-05 20:52:49 +08:00
MTrun
2194ca5cd6 fix: 新增 chart 顶部按钮 2022-01-05 18:04:41 +08:00
MTrun
d9641d6690 fix: 修改侧边栏缩小后的宽度 2021-12-23 15:13:05 +08:00
mtruning
291290d7f1 新增modal跳转 2021-12-23 12:17:25 +08:00
MTrun
5cbdbf137d fix: 修改语言切换 2021-12-22 15:31:20 +08:00
MTrun
5cfdcc68b7 语言切换 2021-12-22 10:38:57 +08:00
MTrun
8951dcb60d 编辑注释 2021-12-21 15:57:39 +08:00
MTrun
4647caf383 完成编辑和新建的跳转 2021-12-21 15:56:35 +08:00
MTrun
1ae9197d89 fix: 新增chart页路由参数 2021-12-21 15:09:39 +08:00
MTrun
0881225fda feat: 完成新开页的设计 2021-12-21 14:57:31 +08:00
MTrun
3ee85b7c7b fix: 抽离弹出框 hoo,解决bug 2021-12-21 10:06:03 +08:00
MTrun
11763d14c7 新增时间 2021-12-20 19:54:24 +08:00
MTrun
cf4e15c31e fix: 修改路由title 2021-12-20 19:26:23 +08:00
MTrun
035dac762c fix: 修改删除按钮,压缩图片 2021-12-20 18:20:12 +08:00
MTrun
a8de985e88 处理图片引入 2021-12-20 18:06:08 +08:00
98 changed files with 3371 additions and 607 deletions

12
.env
View File

@@ -1,14 +1,8 @@
# port
VITE_DEV_PORT = '8001'
VITE_DEV_PORT = '8080'
# development path
VITE_DEV_PATH = '/'
VITE_DEV_PATH = 'http://1.117.240.165:8080'
# production path
VITE_PRO_PATH = '/'
# spa-title
VITE_GLOB_APP_TITLE = GoView
# spa shortname
VITE_GLOB_APP_SHORT_NAME = GoView
VITE_PRO_PATH = 'http://1.117.240.165:8080'

201
README.md
View File

@@ -2,150 +2,73 @@
![logo](readme/logo-t-y.png)
GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可制作数据大屏,减少心智负担。
**`master-fetch` 分支是带有后端接口请求的分支**
### 😶 纯 **前端** 分支: **`master`**
### 👻 携带 **后端** 请求分支: **`master-fetch`**
### feat-unify-test 分支目标
+ 实现 backend 后端工厂
将后端业务逻辑集中到 backend 了,控制 BackEndFactory 就可以适配不同的后端。
伪代码如下:
export const BackEndFactory = ():IBackend=>{
switch(项目后端配置){
case "无数据库":
return new MockBackend() // 等同: -master ,没有存储
case "indexdb":
return new IndexDbBackend() // 这次开发的,用 indexdb 做测试
case "java":
return new JavaBackend() // 等同: -fetch 没 java 环境,还没做
case "python":
return new PythonBackend() // 自定义开发的后端
。。。 其他 oss 、云平台的后端 。。。
}}
意义:
1 unify 统一 -fetch 和 master 分支,消除分支之间的差异。
2 方便接入不同的自定义后端平台。
3 前端存储功能让测试工作更加方便
### 📚 GoView **文档** 地址:[http://www.mtruning.club:81/](http://www.mtruning.club:81/)
+ 完善事件处理机制
在事件中修改图表配置
在事件中修改图表数据
在事件中调用图表 exposed 函数
数据驱动界面
项目纯前端-Demo 地址:[https://www.mtruning.club](https://www.mtruning.club)
### 试验功能1Backend 后端工厂
+ 对比 -fetch 分支,梳理后端逻辑到 backend 目录的 ibackend 接口
+ 登录 - login
+ 登出 - logout
+ 预览token 注入或单点登陆 - checkToken
+ 显示项目列表和分页 - projectList
+ 保存、发布、修改名称 - updateProject
+ 复制项目 - copyProject
+ 图表内的图片上传 - uploadFile
+ 上传图片显示处理 - getFileUrl
+ IndexDbBackend 用indexdb浏览器数据库实现了 project 相关所有功能。
+ Todo: 统一后端错误处理
+ Todo开发 javabackend适配现有的后端
项目带后端-Demo 地址:[后端 Demo 地址](http://1.117.240.165:8080/goview/#/login)
### 试验功能2事件处理机制
+ 实现最常用的互动:找到图表元素、显示或隐藏、修改数据
+ 核心代码useLifeHandler.hook.ts
+ 在事件代码中通过 runtime 实现运行时刻的图表管理,提供基础函数:
+ selectComponents 选择多个图表
+ selectOneComponent 选择一个图表
+ getChartConfig 读取图表
+ setChartConfig 设置图表
+ callExposed 调用图表 exposed 的函数
+ 以下例子可以在点击事件中加入代码并预览,测试效果。
文档-在线地址:[http://www.mtruning.club:81/](http://www.mtruning.club:81/)
+ 例子1 切换显示名称为 饼图 和 柱状图 的图表:
const range = runtime.fn.selectComponents("饼图 柱状图")
const h = runtime.fn.getChartConfig(range, "hide")
runtime.fn.setChartConfig(range, "hide", !h)
文档-源码地址:[https://gitee.com/MTrun/go-view-doc](https://gitee.com/MTrun/go-view-doc)
+ 例子2 修改一个名称 柱状图001 组件id 2wolqibrx3c000 的图表数据,以下两句等效
runtime.fn.setChartConfig("柱状图001", "dataset", {"dimensions":["product","data1","data2"],"source":[{"product":"Mon","data1":120,"data2":130}]})
runtime.fn.setChartConfig("#2wolqibrx3c000", "dataset", {"dimensions":["product","data1","data2"],"source":[{"product":"Mon","data1":120,"data2":230}]})
### 🤯 后端项目
后端项目gitee地址[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)
接口说明地址:[https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb)
技术点:
- 框架:基于 `Vue3` 框架编写,使用 `hooks` 写法抽离部分逻辑,使代码结构更加清晰;
- 类型:使用 `TypeScript` 进行类型约束,减少未知错误发生概率,可以大胆修改逻辑内容;
- 性能:多处性能优化,使用页面懒加载、组件动态注册、数据滚动加载等方式,提升页面渲染速度;
- 存储:拥有本地记忆,部分配置项采用 `storage` 存储本地,提升使用体验;
- 封装:项目进行了详细的工具类封装如:路由、存储、加/解密、文件处理、主题、NaiveUI 全局方法、组件等
工作台:
![项目截图](readme/go-view-canvas.png)
请求配置:
![项目截图](readme/go-view-fetch.png)
数据过滤:
![项目截图](readme/go-view-filter.png)
主题色:
![项目截图](readme/go-view-color.png)
主要技术栈为:
| 名称 | 版本 | 名称 | 版本 |
| ------------------- | ----- | ----------- | ------ |
| Vue | 3.2.x | TypeScript4 | 4.6.x |
| Vite | 2.9.x | NaiveUI | 2.27.x |
| ECharts | 5.3.x | Pinia | 2.0.x |
| 详见 `package.json` | 😁 | 🥰 | 🤗 |
开发环境:
| 名称 | 版本 | 名称 | 版本 |
| ---- | ------- | ------- | ----- |
| node | 16.14.x | npm | 8.5.x |
| pnpm | 7.1.x | windows | 11 |
已完成图表:
| 分类 | 名称 | 名称 | 名称 |
| ------ | ---------------- | ---------------- | -------- |
| 图表 | 柱状图 | 横向柱状图 | 折线图 |
| \* | 单/多 折线面积图 | 饼图 | 水球图 |
| \* | 环形图 | NaiveUI 多种进度 | 🤠 |
| 信息 | 文字 | 图片 | 😶 |
| 列表 | 滚动排名列表 | 滚动表格 | 🤓 |
| 小组件 | 边框-01~13 | 装饰-01~05 | 数字翻牌 |
## 浏览器支持
开发和测试平台均在 `Google` 和最新版 `EDGE` 上完成,暂未测试 `IE11` 等其它浏览器,如有需求请自行测试与兼容。
## 安装
本项目采用` pnpm` 进行包管理
```shell
#建议使用 nrm 切换到淘宝源 https://registry.npmmirror.com/
#pnpm
pnpm install
#yarn
yarn install
#npm
npm install
```
## 启动
```shell
#pnpm
pnpm dev
# npm
npm run dev
#yarn
yarn dev
#Makefile
make dev
```
## 编译
```shell
#pnpm
pnpm run build
# npm
npm run build
#yarn
yarn run build
#Makefile
make dist
```
## 代码提交
- feat: 新功能
- fix: 修复 Bug
- docs: 文档修改
- perf: 性能优化
- revert: 版本回退
- ci: CICD 集成相关
- test: 添加测试代码
- refactor: 代码重构
- build: 影响项目构建或依赖修改
- style: 不影响程序逻辑的代码修改
- chore: 不属于以上类型的其他类型(日常事务)
## 交流
QQ 群1030129384
![QQ群](readme/go-view-qq.png)
![渲染海报](readme/logo-poster.png)
+ 例子3 找到一个组并隐藏
const c = runtime.fn.selectOneComponent("分组")
if(c){
console.log(runtime.fn.getChartConfig(c, "isGroup" ))
runtime.fn.setChartConfig(c, "hide", true)
}

View File

@@ -1,9 +0,0 @@
/**
* Get the configuration file variable name
* @param env
*/
export const getConfigFileName = (env: Record<string, any>) => {
return `__PRODUCTION__${env.VITE_GLOB_APP_SHORT_NAME || '__APP'}__CONF__`
.toUpperCase()
.replace(/\s/g, '');
};

View File

@@ -1,6 +1,6 @@
{
"name": "go-view",
"version": "1.1.11",
"version": "2.1.0",
"scripts": {
"dev": "vite --host",
"build": "vue-tsc --noEmit && vite build",
@@ -33,7 +33,7 @@
"three": "^0.145.0",
"vue": "^3.2.31",
"vue-demi": "^0.13.1",
"vue-i18n": "9.1.9",
"vue-i18n": "9.1.10",
"vue-router": "4.0.12",
"vue3-lazyload": "^0.2.5-beta",
"vue3-sketch-ruler": "^1.3.3",

72
pnpm-lock.yaml generated
View File

@@ -57,7 +57,7 @@ specifiers:
vue: ^3.2.31
vue-demi: ^0.13.1
vue-echarts: ^6.0.2
vue-i18n: 9.1.9
vue-i18n: 9.1.10
vue-router: 4.0.12
vue-tsc: ^0.28.10
vue3-lazyload: ^0.2.5-beta
@@ -87,7 +87,7 @@ dependencies:
three: 0.145.0
vue: 3.2.37
vue-demi: 0.13.1_vue@3.2.37
vue-i18n: 9.1.9_vue@3.2.37
vue-i18n: 9.1.10_vue@3.2.37
vue-router: 4.0.12_vue@3.2.37
vue3-lazyload: 0.2.5-beta_2yymnzrok6eda47acnj2yjm3ae
vue3-sketch-ruler: 1.3.4_vue@3.2.37
@@ -659,60 +659,60 @@ packages:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true
/@intlify/core-base/9.1.9:
resolution: {integrity: sha512-x5T0p/Ja0S8hs5xs+ImKyYckVkL4CzcEXykVYYV6rcbXxJTe2o58IquSqX9bdncVKbRZP7GlBU1EcRaQEEJ+vw==}
/@intlify/core-base/9.1.10:
resolution: {integrity: sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==}
engines: {node: '>= 10'}
dependencies:
'@intlify/devtools-if': 9.1.9
'@intlify/message-compiler': 9.1.9
'@intlify/message-resolver': 9.1.9
'@intlify/runtime': 9.1.9
'@intlify/shared': 9.1.9
'@intlify/vue-devtools': 9.1.9
'@intlify/devtools-if': 9.1.10
'@intlify/message-compiler': 9.1.10
'@intlify/message-resolver': 9.1.10
'@intlify/runtime': 9.1.10
'@intlify/shared': 9.1.10
'@intlify/vue-devtools': 9.1.10
dev: false
/@intlify/devtools-if/9.1.9:
resolution: {integrity: sha512-oKSMKjttG3Ut/1UGEZjSdghuP3fwA15zpDPcjkf/1FjlOIm6uIBGMNS5jXzsZy593u+P/YcnrZD6cD3IVFz9vQ==}
/@intlify/devtools-if/9.1.10:
resolution: {integrity: sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==}
engines: {node: '>= 10'}
dependencies:
'@intlify/shared': 9.1.9
'@intlify/shared': 9.1.10
dev: false
/@intlify/message-compiler/9.1.9:
resolution: {integrity: sha512-6YgCMF46Xd0IH2hMRLCssZI3gFG4aywidoWQ3QP4RGYQXQYYfFC54DxhSgfIPpVoPLQ+4AD29eoYmhiHZ+qLFQ==}
/@intlify/message-compiler/9.1.10:
resolution: {integrity: sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==}
engines: {node: '>= 10'}
dependencies:
'@intlify/message-resolver': 9.1.9
'@intlify/shared': 9.1.9
'@intlify/message-resolver': 9.1.10
'@intlify/shared': 9.1.10
source-map: 0.6.1
dev: false
/@intlify/message-resolver/9.1.9:
resolution: {integrity: sha512-Lx/DBpigeK0sz2BBbzv5mu9/dAlt98HxwbG7xLawC3O2xMF9MNWU5FtOziwYG6TDIjNq0O/3ZbOJAxwITIWXEA==}
/@intlify/message-resolver/9.1.10:
resolution: {integrity: sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==}
engines: {node: '>= 10'}
dev: false
/@intlify/runtime/9.1.9:
resolution: {integrity: sha512-XgPw8+UlHCiie3fI41HPVa/VDJb3/aSH7bLhY1hJvlvNV713PFtb4p4Jo+rlE0gAoMsMCGcsiT982fImolSltg==}
/@intlify/runtime/9.1.10:
resolution: {integrity: sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==}
engines: {node: '>= 10'}
dependencies:
'@intlify/message-compiler': 9.1.9
'@intlify/message-resolver': 9.1.9
'@intlify/shared': 9.1.9
'@intlify/message-compiler': 9.1.10
'@intlify/message-resolver': 9.1.10
'@intlify/shared': 9.1.10
dev: false
/@intlify/shared/9.1.9:
resolution: {integrity: sha512-xKGM1d0EAxdDFCWedcYXOm6V5Pfw/TMudd6/qCdEb4tv0hk9EKeg7lwQF1azE0dP2phvx0yXxrt7UQK+IZjNdw==}
/@intlify/shared/9.1.10:
resolution: {integrity: sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==}
engines: {node: '>= 10'}
dev: false
/@intlify/vue-devtools/9.1.9:
resolution: {integrity: sha512-YPehH9uL4vZcGXky4Ev5qQIITnHKIvsD2GKGXgqf+05osMUI6WSEQHaN9USRa318Rs8RyyPCiDfmA0hRu3k7og==}
/@intlify/vue-devtools/9.1.10:
resolution: {integrity: sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==}
engines: {node: '>= 10'}
dependencies:
'@intlify/message-resolver': 9.1.9
'@intlify/runtime': 9.1.9
'@intlify/shared': 9.1.9
'@intlify/message-resolver': 9.1.10
'@intlify/runtime': 9.1.10
'@intlify/shared': 9.1.10
dev: false
/@jridgewell/gen-mapping/0.1.1:
@@ -5373,15 +5373,15 @@ packages:
- supports-color
dev: true
/vue-i18n/9.1.9_vue@3.2.37:
resolution: {integrity: sha512-JeRdNVxS2OGp1E+pye5XB6+M6BBkHwAv9C80Q7+kzoMdUDGRna06tjC0vCB/jDX9aWrl5swxOMFcyAr7or8XTA==}
/vue-i18n/9.1.10_vue@3.2.37:
resolution: {integrity: sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==}
engines: {node: '>= 10'}
peerDependencies:
vue: ^3.0.0
dependencies:
'@intlify/core-base': 9.1.9
'@intlify/shared': 9.1.9
'@intlify/vue-devtools': 9.1.9
'@intlify/core-base': 9.1.10
'@intlify/shared': 9.1.10
'@intlify/vue-devtools': 9.1.10
'@vue/devtools-api': 6.1.4
vue: 3.2.37
dev: false

View File

@@ -18,7 +18,7 @@ import { zhCN, dateZhCN, NConfigProvider } from 'naive-ui'
import { GoAppProvider } from '@/components/GoAppProvider'
import { I18n } from '@/components/I18n'
import { useDarkThemeHook, useThemeOverridesHook, useCode } from '@/hooks'
import { useSystemInit, useDarkThemeHook, useThemeOverridesHook, useCode } from '@/hooks'
// 暗黑主题
const darkTheme = useDarkThemeHook()
@@ -28,4 +28,7 @@ const overridesTheme = useThemeOverridesHook()
// 代码主题
const hljsTheme = useCode()
// 系统全局数据初始化
useSystemInit()
</script>

View File

@@ -21,7 +21,7 @@ axiosInstance.interceptors.request.use(
axiosInstance.interceptors.response.use(
(res: AxiosResponse) => {
const { code } = res.data as { code: number }
if (code === ResultEnum.DATA_SUCCESS) return Promise.resolve(res.data)
if (code === ResultEnum.SUCCESS) return Promise.resolve(res.data)
// 重定向
if (ErrorPageNameMap.get(code)) redirectErrorPage(code)
return Promise.resolve(res.data)

2
src/api/path/index.ts Normal file
View File

@@ -0,0 +1,2 @@
export * from '@/api/path/project.api'
export * from '@/api/path/system.api'

View File

@@ -0,0 +1,84 @@
import { http } from '@/api/http'
import { httpErrorHandle } from '@/utils'
import { ContentTypeEnum, RequestHttpEnum, ModuleTypeEnum } from '@/enums/httpEnum'
// * 项目列表
export const projectListApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.GET)(`${ModuleTypeEnum.PROJECT}/list`, data);
return res;
} catch {
httpErrorHandle();
}
}
// * 新增项目
export const createProjectApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.POST)(`${ModuleTypeEnum.PROJECT}/create`, data);
return res;
} catch {
httpErrorHandle();
}
}
// * 获取项目
export const fetchProjectApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.GET)(`${ModuleTypeEnum.PROJECT}/getData`, data);
return res;
} catch {
httpErrorHandle();
}
}
// * 保存项目
export const saveProjectApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.POST)(`${ModuleTypeEnum.PROJECT}/save/data`, data, ContentTypeEnum.FORM_URLENCODED);
return res;
} catch {
httpErrorHandle();
}
}
// * 修改项目基础信息
export const updateProjectApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.POST)(`${ModuleTypeEnum.PROJECT}/edit`, data);
return res;
} catch {
httpErrorHandle();
}
}
// * 删除项目
export const deleteProjectApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.DELETE)(`${ModuleTypeEnum.PROJECT}/delete`, data);
return res;
} catch {
httpErrorHandle();
}
}
// * 修改发布状态 [-1未发布,1发布]
export const changeProjectReleaseApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/publish`, data);
return res;
} catch {
httpErrorHandle();
}
}
// * 上传文件
export const uploadFile = async (url:string, data: object) => {
try {
const res = await http(RequestHttpEnum.POST)(url, data, ContentTypeEnum.FORM_DATA);
return res;
} catch {
httpErrorHandle();
}
}

View File

@@ -0,0 +1,33 @@
import { http } from '@/api/http'
import { httpErrorHandle } from '@/utils'
import { RequestHttpEnum, ModuleTypeEnum } from '@/enums/httpEnum'
// * 登录
export const loginApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.POST)(`${ModuleTypeEnum.SYSTEM}/login`, data);
return res;
} catch(err) {
httpErrorHandle();
}
}
// * 登出
export const logoutApi = async () => {
try {
const res = await http(RequestHttpEnum.GET)(`${ModuleTypeEnum.SYSTEM}/logout`);
return res;
} catch(err) {
httpErrorHandle();
}
}
// * 获取 oss 上传接口
export const ossUrlApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.GET)(`${ModuleTypeEnum.SYSTEM}/getOssInfo`, data);
return res;
} catch(err) {
httpErrorHandle();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
src/assets/videos/earth.mp4 Normal file

Binary file not shown.

146
src/backend/ibackend.ts Normal file
View File

@@ -0,0 +1,146 @@
/**
* 后端接口,相关功能对应表:
* 登录 - login
* 登出 - logout
* 预览token 注入或单点登陆 - checkToken
* 显示项目列表和分页 - projectList
* 保存、发布、修改名称 - updateProject
* 复制项目 - copyProject
* 图表内的图片上传 - uploadFile
* 上传图片显示处理 - getFileUrl
* 所有接口返回格式MyResponseType
*/
import { IndexDbBackend } from "./indexdb/indexdbbackend";
// import { PythonBackend } from "./python/pythonbackend";
export interface MyResponseType {
code: number; // 状态200 表示接口调用成功参考HttpEnum
msg: string; // 提示信息,配合 data 和 code
data: any; // data = null 表示接口结果错误,错误原因放在 msg
}
export class MyResponse implements MyResponseType {
code: number = 200;
msg: string = "";
data: any = {};
}
/**
* 实现 IBackend 后端接口
* 错误处理:
*/
export interface IBackend {
/**
* 初始化后端系统测试后端连接oss地址等
* @param data 可选,备用
*/
init(data:any):any
/**
* 登陆
* @param data {} .username .password
* @return MyResponseType
* .data 须包含:
* token:{tokenValue:"", tokenName:""},
* userinfo:{nickname:"", username: "", id: 用户ID}
* 错误处理:
* 1 接口错误 .code 不为 200 .msg 可选,后端反馈错误信息
* 2 登陆错误 .code=200 .data = null, msg 可选,反馈不能登陆的原因
* 登陆信息.data 记录:
* setLocalStorage(GO_LOGIN_INFO_STORE, res.data)
*/
login(data:any):any
/**
* 通知后端登出
*/
logout():any
/**
* 检查Token是否有效配合预览页面和单点登陆备用
* @param data {tokenValue, tokenName}
* @return 同 login()
*/
checkToken(data:any):any
/**
* 项目列表
* @param data {} .page, .limit
* @return [项目],字段名称需要进行 map
* id: projectId
* title:projectName
* release,
* label:remarks
* image:indexImage 如果需要挂刷新,在这里处理。如果需要拼接 urlgetFileUrl也在这里处理好。
*/
projectList(data:any):any
/**
* 新增项目
* @param data
* .projectName
* @return id 新项目 ID
*/
createProject(data: any):any
/**
* 获取项目
* @param data .projectId
* @return
id:projectId
projectName,
state: release,
remarks,
content
*/
fetchProject(data: any):any
/**
* 修改项目
* @param data
* .projectId 必须
* .projectName 可选
* .release 可选
* .content 可选
* .object File 可选 对象
* .remarks 可选
* @return
*/
updateProject(data: any):any
/**
* 复制项目
* @param data
* .copyId 需要复制的项目ID
* .projectName
* @return id 新项目ID
*/
copyProject(data: any):any
/**
* 删除项目
* @param data
* .projectId
* @return
*/
deleteProject(data: any):any
/**
* 文件上传
* @param file File 图片对象
* @param params 备用 Todo: 上传文件可带上项目ID和其他附加信息以便后端文件管理
* @return .uri 文件对象 uri。建议在图表中保存相对地址通过 getFileUrl 得到完整地址
*/
uploadFile(file: File, params: any):any
/**
* 文件地址转换,处理 uploadFile 的返回地址。如果是绝对地址,可以不处理
* @param uploadUri 上传返回的 uri
* @return 供 image.src 使用的地址信息
*/
getFileUrl(uploadUri:string):string
}
export const BackEndFactory = new IndexDbBackend();
// export const BackEndFactory = new MockBackend();
// export const BackEndFactory = new PythonBackend();

View File

@@ -0,0 +1,147 @@
/**
* IndexDb 帮助类
*/
const win: { [k: string]: any } = window || globalThis;
const indexedDB =
win.indexedDB || win.mozIndexedDB || win.webkitIndexedDB || win.msIndexedDB;
const dbs: { [k: string]: IDBDatabase } = {};
let databaseName: string;
let request: IDBOpenDBRequest;
interface AnyEvent {
[k: string]: any;
}
export interface TableOption {
storeName: string;
option: { [K: string]: any };
index: { [K: string]: any }[];
}
export const createDB = (
name: string,
version?: string,
options?: TableOption[],
) =>
new Promise<IDBDatabase>((resolve, reject) => {
if (!indexedDB) reject('浏览器不支持indexedDB');
databaseName = name;
if (dbs?.[name]) {
resolve(dbs[name]);
return;
}
request = indexedDB.open(name, version);
createTable(options)?.then((db: IDBDatabase) => resolve(db));
request.onsuccess = (event: AnyEvent) => {
// IDBDatabase
const db = event.target.result;
// 缓存起来
dbs[name] = db;
resolve(db);
};
request.onerror = (event: AnyEvent) => reject(event);
});
export const createTable = (options?: TableOption[]) => {
if (!options) return;
return new Promise<IDBDatabase>((resolve) => {
request.onupgradeneeded = (event: AnyEvent) => {
const db = event.target.result;
dbs[databaseName] = db;
for (const i in options) {
// 判断是否存在表
if (!db.objectStoreNames.contains(options[i].storeName)) {
const objectStore = db.createObjectStore(
options[i].storeName,
options[i].option,
);
for (const j of options[i].index) {
objectStore.createIndex(j.name, j.keyPath, {
unique: j.unique,
});
}
}
}
resolve(db);
};
});
};
const getTransaction = async (name: string, version?: string) => {
let db: IDBDatabase;
// 先从缓存获取
if (dbs[databaseName]) {
db = dbs[databaseName];
} else {
db = await createDB(databaseName, version);
}
return db.transaction(name, 'readwrite');
};
const getObjectStore = async (
name: string,
version?: string,
): Promise<IDBObjectStore> => {
const transaction = await getTransaction(name, version);
return transaction.objectStore(name);
};
const getStore = (name: string, type: string, data: any) =>
new Promise<IDBDatabase>((resolve) => {
getObjectStore(name).then((objectStore: IDBObjectStore | any) => {
const request = objectStore[type](data);
request.onsuccess = (event: AnyEvent) =>
resolve(event.target.result);
});
});
const findStore = (
name: string,
start: any,
end: any,
startInclude: any,
endInclude: any,
) =>
new Promise<IDBDatabase>((resolve, reject) => {
getObjectStore(name).then((objectStore: IDBObjectStore) => {
const request = objectStore.openCursor(
IDBKeyRange.bound(start, end, startInclude, endInclude),
);
request.onsuccess = (event: AnyEvent) =>
resolve(event.target.result);
request.onerror = (event: AnyEvent) => reject(event);
});
});
export interface DBSelect {
add: (data: any) => Promise<IDBDatabase>;
get: (data: any) => Promise<IDBDatabase>;
getAll: () => Promise<IDBDatabase>;
del: (data: any) => Promise<IDBDatabase>;
clear: (data: any) => Promise<IDBDatabase>;
put: (data: any) => Promise<IDBDatabase>;
find: (
start: any,
end: any,
startInclude: any,
endInclude: any,
) => Promise<IDBDatabase>;
}
// 获取一个store
export const onDBSelect = async (
name: string,
version: string
): Promise<DBSelect> => {
const add = (data: any) => getStore(name, 'add', data);
const get = (data: any) => getStore(name, 'get', data);
const getAll = () => getStore(name, 'getAll', null);
const del = (data: any) => getStore(name, 'delete', data);
const clear = (data: any) => getStore(name, 'clear', data);
const put = (data: any) => getStore(name, 'put', data);
const find = (start: any, end: any, startInclude: any, endInclude: any) =>
findStore(name, start, end, startInclude, endInclude);
const options: DBSelect = { add, get, getAll, clear, del, put, find };
getObjectStore(name, version);
return options;
};

View File

@@ -0,0 +1,155 @@
import { MyResponse, IBackend } from '../ibackend'
import { createDB, DBSelect, onDBSelect } from '../indexdb/indexdb'
import { fileToUrl, fileToBlob } from "@/utils"
const PROJECT_TABLE = "project"
const IMAGE_TABLE = "image" // 保存图片未实现Todo
const DB_NAME = "goview"
const DB_VER = "1"
export class IndexDbBackend implements IBackend {
public async init(data: any) {
let rtn:MyResponse = new MyResponse;
const db:IDBDatabase = await createDB(DB_NAME, DB_VER, [
{
storeName: PROJECT_TABLE,
option: {
keyPath: "projectId", autoIncrement:true
},
index: [
{name: 'projectId', keyPath: "projectId", unique: true},
{name: 'projectName', keyPath: "projectName", unique: false},
{name: 'release', keyPath: "release", unique: false},
{name: 'remarks', keyPath: "remarks", unique: false},
{name: 'content', keyPath: "content", unique: false},
{name: 'indexImage', keyPath: "indexImage", unique: false}
]
}
])
return rtn;
}
public async login(data:any) {
let rtn:MyResponse = new MyResponse;
if(data.password == "123456" && data.username == "admin"){
rtn.data = {
token:{tokenValue:"mockToken", tokenName:"name"},
userinfo:{nickname:"nickname", username:data.username, id:1}
}
}else{
rtn.data = null
rtn.msg = "admin 和 123456"
}
return rtn;
}
public async logout() {
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async checkToken(data: any) {
let rtn:MyResponse = new MyResponse;
console.log("CheckToken: " + data.token)
rtn.data = {
token:{tokenValue:"mockToken", tokenName:"name"},
userinfo:{nickname:"nickname", username:data.username, id:1}
}
return rtn;
}
public async projectList(data:any){
let rtn:MyResponse = new MyResponse;
const db:DBSelect = await onDBSelect(PROJECT_TABLE, DB_VER)
const r:any = await db.getAll()
rtn.data = []
r.map(function (item: any) {
let url = ""
if(item.indexImage){
const Url = URL || window.URL || window.webkitURL
url = Url.createObjectURL(item.indexImage)
}
rtn.data.push({
id: item.projectId,
title: item.projectName,
release: item.release == 1,
label:item.remarks,
image:url
})
})
return rtn;
}
public async createProject(data: any){
let rtn:MyResponse = new MyResponse;
const db:DBSelect = await onDBSelect(PROJECT_TABLE, DB_VER)
rtn.data.id = await db.add({ projectName:data.projectName })
return rtn;
}
public async fetchProject(data: any){
let rtn:MyResponse = new MyResponse;
const db:DBSelect = await onDBSelect(PROJECT_TABLE, DB_VER)
const r:any = await db.get(parseInt(data.projectId))
rtn.data = {
id:r.projectId,
projectName: r.projectName,
state: r.release,
remarks: r.remarks,
content: r.content
}
return rtn;
}
public async updateProject(data: any){
let rtn:MyResponse = new MyResponse;
const db:DBSelect = await onDBSelect(PROJECT_TABLE, DB_VER)
const row:any = await db.get(parseInt(data.projectId))
if("content" in data) row.content = data.content
if("projectName" in data) row.projectName = data.projectName
if("release" in data) row.release = data.release
if("remarks" in data) row.remarks = data.remarks
if("object" in data) {
row.indexImage = await fileToBlob(data.object)
}
await db.put(row)
return rtn;
}
public async copyProject(data: any){
let rtn:MyResponse = new MyResponse;
const db:DBSelect = await onDBSelect(PROJECT_TABLE, DB_VER)
const row:any = await db.get(parseInt(data.copyId))
rtn.data.id =await db.add({
projectName:data.projectName,
content:row.content,
indexImage:row.indexImage,
remarks:row.remarks
})
return rtn;
}
public async deleteProject(data: any){
let rtn:MyResponse = new MyResponse;
const db:DBSelect = await onDBSelect(PROJECT_TABLE, DB_VER)
await db.del(parseInt(data.projectId))
return rtn;
}
public async changeProjectRelease(data: any){
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async uploadFile(data: File, params:any){
// Todo: 图片可以保存在表中
let rtn:MyResponse = new MyResponse;
rtn.data.uri = fileToUrl(data)
return rtn;
}
public getFileUrl(uploadUri:string){
return uploadUri;
}
}

View File

@@ -0,0 +1,17 @@
export enum ModuleTypeEnum {
SYSTEM = 'sys',
PROJECT = 'project',
}
// 接口白名单(免登录)
export const fetchAllowList = [
// 登录
`${ModuleTypeEnum.SYSTEM}/login`,
// 获取 OSS 接口
`${ModuleTypeEnum.SYSTEM}/getOssInfo`,
// 预览获取数据
`${ModuleTypeEnum.PROJECT}/getData`,
]
// 接口黑名单
export const fetchBlockList = []

71
src/backend/java/axios.ts Normal file
View File

@@ -0,0 +1,71 @@
import axios, { AxiosResponse, AxiosRequestConfig } from 'axios'
import { ResultEnum } from "@/enums/httpEnum"
import { PageEnum, ErrorPageNameMap } from "@/enums/pageEnum"
import { StorageEnum } from '@/enums/storageEnum'
import { axiosPre } from '@/settings/httpSetting'
import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d'
import { redirectErrorPage, getLocalStorage, routerTurnByName, httpErrorHandle } from '@/utils'
import { fetchAllowList } from './axios.config'
import includes from 'lodash/includes'
const axiosInstance = axios.create({
baseURL: `${import.meta.env.PROD ? import.meta.env.VITE_PRO_PATH : ''}${axiosPre}`,
timeout: ResultEnum.TIMEOUT,
})
axiosInstance.interceptors.request.use(
(config: AxiosRequestConfig) => {
// 白名单校验
if (includes(fetchAllowList, config.url)) return config
// 获取 token
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
// 重新登录
if (!info) {
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
return config
}
const userInfo = info[SystemStoreEnum.USER_INFO]
config.headers = {
...config.headers,
[userInfo[SystemStoreUserInfoEnum.TOKEN_NAME] || 'token']: userInfo[SystemStoreUserInfoEnum.USER_TOKEN] || ''
}
return config
},
(err: AxiosRequestConfig) => {
Promise.reject(err)
}
)
// 响应拦截器
axiosInstance.interceptors.response.use(
(res: AxiosResponse) => {
const { code } = res.data as { code: number }
// 成功
if (code === ResultEnum.SUCCESS) {
return Promise.resolve(res.data)
}
// 登录过期
if (code === ResultEnum.TOKEN_OVERDUE) {
window['$message'].error(window['$t']('http.token_overdue_message'))
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
return Promise.resolve(res.data)
}
// 固定错误码重定向
if (ErrorPageNameMap.get(code)) {
redirectErrorPage(code)
return Promise.resolve(res.data)
}
// 提示错误
window['$message'].error(window['$t']((res.data as any).msg))
return Promise.resolve(res.data)
},
(err: AxiosResponse) => {
Promise.reject(err)
}
)
export default axiosInstance

226
src/backend/java/http.ts Normal file
View File

@@ -0,0 +1,226 @@
import axiosInstance from './axios'
import {
RequestHttpEnum,
ContentTypeEnum,
RequestBodyEnum,
RequestDataTypeEnum,
RequestContentTypeEnum,
RequestParamsObjType
} from '@/enums/httpEnum'
import type { RequestGlobalConfigType, RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
export const get = (url: string, params?: object) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.GET,
params: params,
})
}
export const post = (url: string, data?: object, headersType?: string) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.POST,
data: data,
headers: {
'Content-Type': headersType || ContentTypeEnum.JSON
}
})
}
export const patch = (url: string, data?: object, headersType?: string) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.PATCH,
data: data,
headers: {
'Content-Type': headersType || ContentTypeEnum.JSON
}
})
}
export const put = (url: string, data?: object, headersType?: ContentTypeEnum) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.PUT,
data: data,
headers: {
'Content-Type': headersType || ContentTypeEnum.JSON
}
})
}
export const del = (url: string, params?: object) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.DELETE,
params
})
}
// 获取请求函数默认get
export const http = (type?: RequestHttpEnum) => {
switch (type) {
case RequestHttpEnum.GET:
return get
case RequestHttpEnum.POST:
return post
case RequestHttpEnum.PATCH:
return patch
case RequestHttpEnum.PUT:
return put
case RequestHttpEnum.DELETE:
return del
default:
return get
}
}
const prefix = 'javascript:'
// 对输入字符进行转义处理
export const translateStr = (target: string | object) => {
if (typeof target === 'string') {
if (target.startsWith(prefix)) {
const funcStr = target.split(prefix)[1]
let result;
try {
result = new Function(`${funcStr}`)()
} catch (error) {
console.log(error)
window['$message'].error('js内容解析有误')
}
return result
} else {
return target
}
}
for (const key in target) {
if (Object.prototype.hasOwnProperty.call(target, key)) {
const subTarget = (target as any)[key];
(target as any)[key] = translateStr(subTarget)
}
}
return target
}
/**
* * 自定义请求
* @param targetParams 当前组件参数
* @param globalParams 全局参数
*/
export const customizeHttp = (targetParams: RequestConfigType, globalParams: RequestGlobalConfigType) => {
if (!targetParams || !globalParams) {
return
}
// 全局
const {
// 全局请求源地址
requestOriginUrl,
// 全局请求内容
requestParams: globalRequestParams
} = globalParams
// 目标组件(优先级 > 全局组件)
const {
// 请求地址
requestUrl,
// 普通 / sql
requestContentType,
// 获取数据的方式
requestDataType,
// 请求方式 get/post/del/put/patch
requestHttpType,
// 请求体类型 none / form-data / x-www-form-urlencoded / json /xml
requestParamsBodyType,
// SQL 请求对象
requestSQLContent,
// 请求内容 params / cookie / header / body: 同 requestParamsBodyType
requestParams: targetRequestParams
} = targetParams
// 静态排除
if (requestDataType === RequestDataTypeEnum.STATIC) return
if (!requestUrl) {
return
}
// 处理头部
let headers: RequestParamsObjType = {
...globalRequestParams.Header,
...targetRequestParams.Header
}
headers = translateStr(headers)
// data 参数
let data: RequestParamsObjType | FormData | string = {}
// params 参数
let params: RequestParamsObjType = { ...targetRequestParams.Params }
params = translateStr(params)
// form 类型处理
let formData: FormData = new FormData()
formData.set('default', 'defaultData')
// 类型处理
switch (requestParamsBodyType) {
case RequestBodyEnum.NONE:
break
case RequestBodyEnum.JSON:
headers['Content-Type'] = ContentTypeEnum.JSON
data = translateStr(JSON.parse(targetRequestParams.Body['json']))
// json 赋值给 data
break
case RequestBodyEnum.XML:
headers['Content-Type'] = ContentTypeEnum.XML
// xml 字符串赋值给 data
data = translateStr(targetRequestParams.Body['xml'])
break
case RequestBodyEnum.X_WWW_FORM_URLENCODED: {
headers['Content-Type'] = ContentTypeEnum.FORM_URLENCODED
const bodyFormData = targetRequestParams.Body['x-www-form-urlencoded']
for (const i in bodyFormData) formData.set(i, translateStr(bodyFormData[i]))
// FormData 赋值给 data
data = formData
break
}
case RequestBodyEnum.FORM_DATA: {
headers['Content-Type'] = ContentTypeEnum.FORM_DATA
const bodyFormUrlencoded = targetRequestParams.Body['form-data']
for (const i in bodyFormUrlencoded) {
formData.set(i, translateStr(bodyFormUrlencoded[i]))
}
// FormData 赋值给 data
data = formData
break
}
}
// sql 处理
if (requestContentType === RequestContentTypeEnum.SQL) {
headers['Content-Type'] = ContentTypeEnum.JSON
data = requestSQLContent
}
try {
const url = (new Function("return `" + `${requestOriginUrl}${requestUrl}`.trim() + "`"))();
return axiosInstance({
url,
method: requestHttpType,
data,
params,
headers
})
} catch (error) {
console.log(error)
window['$message'].error('URL地址格式有误')
}
}

View File

@@ -0,0 +1,130 @@
import { MyResponse, IBackend } from './ibackend'
import { fileToUrl } from '@/utils'
/**
* MockBackend
* 模拟纯前端,不会保存,也不报错。
*/
export class MockBackend implements IBackend {
public async init(data: any) {
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async login(data:any) {
let rtn:MyResponse = new MyResponse;
if(data.password == "123456" && data.username == "admin"){
rtn.data = {
token:{tokenValue:"mockToken", tokenName:"name"},
userinfo:{nickname:"nickname", username:data.username, id:1}
}
}else{
rtn.data = null
rtn.msg = "用户名或密码错误!"
}
return rtn;
}
public async logout() {
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async checkToken(data:any){
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async projectList(data:any){
let rtn:MyResponse = new MyResponse;
rtn.data =[
{
id: 1,
title: '假数据不可用',
release: true,
label: '官方案例'
},
{
id: 2,
title: '物料2-假数据不可用',
release: false,
label: '官方案例'
},
{
id: 3,
title: '物料3-假数据不可用',
release: false,
label: '官方案例'
},
{
id: 4,
title: '物料4-假数据不可用',
release: false,
label: '官方案例'
},
{
id: 5,
title: '物料5-假数据不可用',
release: false,
label: '官方案例'
}
];
return rtn;
}
public async createProject(data: any){
let rtn:MyResponse = new MyResponse;
rtn.data.id = "newId"
return rtn;
}
public async fetchProject(data: any){
let rtn:MyResponse = new MyResponse;
rtn.data = {
id:data.projectId,
projectName: '假数据不可用',
indexImage:'',
state: 0,
remarks: '官方案例',
content: null
}
return rtn;
}
public async saveProject(data: object){
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async updateProject(data: any){
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async copyProject(data: any){
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async deleteProject(data: any){
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async changeProjectRelease(data: any){
let rtn:MyResponse = new MyResponse;
return rtn;
}
public async uploadFile(data: File, params:any){
let rtn:MyResponse = new MyResponse;
rtn.data.uri = fileToUrl(data)
return rtn;
}
public getFileUrl(uploadUri:string){
return uploadUri;
}
}

View File

@@ -40,8 +40,9 @@ export enum MenuEnum {
UN_GROUP = 'unGroup',
// 后退
BACK = 'back',
// 前进
FORWORD = 'forward',
// 保存
SAVE = 'save',
// 锁定
LOCK = 'lock',
// 解除锁定
@@ -72,3 +73,15 @@ export enum MacKeyboard {
SHIFT_SOURCE_KEY = '⇧',
ALT_SOURCE_KEY = '⌥'
}
// 同步状态枚举
export enum SyncEnum {
// 等待
PENDING,
// 开始
START,
// 成功
SUCCESS,
// 失败
FAILURE
}

View File

@@ -7,6 +7,7 @@ export enum ResultEnum {
SERVER_ERROR = 500,
SERVER_FORBIDDEN = 403,
NOT_FOUND = 404,
TOKEN_OVERDUE = 886,
TIMEOUT = 60000
}
@@ -26,6 +27,12 @@ export enum RequestContentTypeEnum {
SQL = 1
}
// 头部
export enum RequestHttpHeaderEnum {
TOKEN = 'Token',
COOKIE = 'Cookie'
}
/**
* @description: 请求方法
*/

View File

@@ -20,10 +20,15 @@ export enum PageEnum {
//重定向
REDIRECT = '/redirect',
REDIRECT_NAME = 'Redirect',
// 未发布
REDIRECT_UN_PUBLISH = '/redirect/unPublish',
REDIRECT_UN_PUBLISH_NAME = 'redirect-un-publish',
// 重载
RELOAD = '/reload',
RELOAD_NAME = 'Reload',
// 首页
BASE_HOME = '/project',
BASE_HOME_NAME = 'Project',

View File

@@ -1,4 +1,5 @@
export * from '@/hooks/useTheme.hook'
export * from '@/hooks/usePreviewScale.hook'
export * from '@/hooks/useCode.hook'
export * from '@/hooks/useChartDataFetch.hook'
export * from '@/hooks/useChartDataFetch.hook'
export * from '@/hooks/useLifeHandler.hook'

View File

@@ -0,0 +1,280 @@
import { CreateComponentType, EventLife } from '@/packages/index.d'
import * as echarts from 'echarts'
import { BackEndFactory } from '@/backend/ibackend'
import { reactive, toRef , watch, computed} from 'vue';
/**
* 事件测试:
*
切换显示名称为 饼图 和 柱状图 的图标
const range = runtime.fn.selectComponents("饼图 柱状图")
const h = runtime.fn.getChartConfig(range, "hide")
runtime.fn.setChartConfig(range, "hide", !h)
修改一个名称 柱状图001 组件id 2wolqibrx3c000 的图表数据,以下两句等效
runtime.fn.setChartConfig("柱状图001", "dataset", {"dimensions":["product","data1","data2"],"source":[{"product":"Mon","data1":120,"data2":130}]})
runtime.fn.setChartConfig("#2wolqibrx3c000", "dataset", {"dimensions":["product","data1","data2"],"source":[{"product":"Mon","data1":120,"data2":230}]})
找到一个组并隐藏
const c = runtime.fn.selectOneComponent("分组")
if(c){
console.log(runtime.fn.getChartConfig(c, "isGroup" ))
runtime.fn.setChartConfig(c, "hide", true)
}
调用组件 exposed 函数的例子
组件中增加: defineExpose({ actionTest:actionTest })
以下调用名称为 柱状图 组件的 actionTest
runtime.fn.callExposed("柱状图", "actionTest")
数据驱动界面:
图表A 的 MOUNTED 加入对 status1 的 Watch = "0" 隐藏
watch(()=>runtime.variables.status1, newValue => runtime.fn.setChartConfig(this, "hide", newValue == "0"))
图表B 的 MOUNTED 也加入对 status1 的 Watch = "1" 隐藏
watch(()=>runtime.variables.status1, newValue => runtime.fn.setChartConfig(this, "hide", newValue == "1"))
点击事件代码实现图表A 和 图表B 的切换显示:
if(runtime.variables.status1 == "0"){
runtime.variables.status1 = "1"
} else{
runtime.variables.status1 = "0"
}
图表A 的 MOUNTED 加入对 data1 的 Watch
watch(()=>runtime.datasets.data1,
newValue => runtime.fn.setChartConfig(this, "dataset", newValue))
图表B 的 MOUNTED 加入对 data1 的 Watch
watch(()=>runtime.datasets.data1,
newValue => runtime.fn.setChartConfig(this, "dataset", newValue))
点击事件代码修改datasets.data1同时更新图表A 和 图表B 的数据
runtime.datasets.data1 = {"dimensions":["product","data1","data2"],"source":[{"product":"Mon","data1":120,"data2":230}]}
*
*/
// * 初始化
export const useSystemInit = async () => {
const res = await BackEndFactory.init({}) as any;
}
const getOneChartConfig = (component:any, configName:string, params?:any)=>{
let root = null
if(component.proxy.chartConfig) root = component.proxy.chartConfig
else if (component.proxy.groupData) root = component.proxy.groupData
// if(!root) return null
switch(configName){
case "hide":
return root.status.hide
break;
case "dataset":
return root.option.dataset
break;
case "isGroup":
return root.isGroup
break;
case "key":
return root.key
break;
case "attr":
return root.attr
break;
case "name":
return root.chartConfig.title
}
}
const setOneChartConfig = (component:any, configName:string, newValue:any, params?:any)=>{
let root = null
if(component.proxy.chartConfig) root = component.proxy.chartConfig
else if (component.proxy.groupData) root = component.proxy.groupData
switch(configName){
case "hide":
root.status.hide = newValue
break;
case "dataset":
root.option.dataset = newValue
break;
}
}
/**
* 选择器语法:参考 css selectors
* 名称 组件名称,不能有空格和特殊字符(. # 引号等)
* [name=名称] Todo
* #id 组件编号
* .key 组件类型 Todo
* @param selectors
* @returns []
*/
const getComponentsBySelectors = (selectors:string):any[]=>{
// 返回:数组,可能多个
let rtn:any[] = []
const ar = selectors.split(" ")
for(let a of ar){
rtn = rtn.concat(getComponentsBySelector(a))
}
return rtn
}
const getComponentsBySelector = (selector:string):any[]=>{
// 返回:数组,可能多个
const rtn:any[] = []
if(selector.substring(0,1) == "#")
{
const key = selector.substring(1)
if(key in components){
return [components[key]]
}
return rtn
}
for (let key in components) {
if(getOneChartConfig(components[key], "name") == selector){
rtn.push(components[key])
}
}
return rtn
}
// 所有图表组件集合对象
const components: { [K in string]?: any } = {}
const runtime = {
// 变量,管理各种状态
variables:reactive({}),
// 数据集
datasets:reactive({}),
// 组件列表 {}
components:components,
// 帮助类
fn:{
/**
* 选择一个组件
* @param selectors string 选择器语法 | component | [component]
* @return 第一个符合要求的 component 或 null
*/
selectOneComponent:(selectors:any)=>{
const cList = runtime.fn.selectComponents(selectors)
if(cList.length > 0){
return cList[0]
}
return null
},
/**
* 选择组件
* @param selectors string 选择器语法 | component | [component]
* @return 要求的 [component] 或 []
*/
selectComponents:(selectors:any):any[]=>{
if(!selectors) return []
if(typeof selectors == "string") return getComponentsBySelectors(selectors)
if(Array.isArray(selectors)) return selectors
return [selectors]
},
/**
* 获取组件的值,如果多个,使用第一个
* @param selectors string 选择器语法 | component | [component]
* @param configName 配置名称
* @param params 备用参数,可选
* @returns 配置的值
*/
getChartConfig:(selectors:any, configName:string, params?:any)=>{
const component:any = runtime.fn.selectOneComponent(selectors)
if(!component && !component.proxy) return null
return getOneChartConfig(component, configName, params)
},
/**
* 设置组件的值,支持多个
* @param selectors string 选择器语法 | component | [component]
* @param configName 配置名称
* @param newValue 新值
* @param params 备用参数,可选
* @returns 配置的值
*/
setChartConfig:(selectors:any, configName:string, newValue:any, params?:any)=>{
const cList:any[] = runtime.fn.selectComponents(selectors)
for(let c of cList){
if(!c && !c.proxy) return null
setOneChartConfig(c, configName, newValue, params)
}
},
/**
* 调用组件暴露的函数,组件中使用 defineExpose 进行定义
* @param selectors string 选择器语法 | component | [component]
* @param action 组件中 defineExpose 的函数名
* @param params 调用的参数只支持一个参数或没有参数
* @returns 无
*/
callExposed:(selectors:any, action:string, params?:any)=>{
const cList:any[] = runtime.fn.selectComponents(selectors)
for(let c of cList){
if(!c && !c.exposed) return null
if(typeof c.exposed[action] == "function") c.exposed[action](params)
}
}
}
}
// 项目提供的npm 包变量
export const npmPkgs = { echarts, toRef , watch, computed, runtime }
export const useLifeHandler = (chartConfig: CreateComponentType) => {
const events = chartConfig.events || {}
console.log("chartConfig.events")
console.log(chartConfig.events)
// 生成生命周期事件
let lifeEvents = {
[EventLife.BEFORE_MOUNT](e: any) {
// 存储组件
components[chartConfig.id] = e.component
const fnStr = (events[EventLife.BEFORE_MOUNT] || '').trim()
generateFunc(fnStr, e, e.component)
},
[EventLife.MOUNTED](e: any) {
const fnStr = (events[EventLife.MOUNTED] || '').trim()
generateFunc(fnStr, e, e.component)
}
}
// 遍历,按需侦听
for(let key in EventLife)
{
if(key != "BEFORE_MOUNT" && key != "MOUNTED"){
const k = EventLife[key as keyof typeof EventLife]
const fnStr = (events[<EventLife>k] || '').trim()
if(fnStr){
lifeEvents[k as keyof typeof lifeEvents] = (e:any) => {
const fnStr = (events[<EventLife>k] || '').trim()
generateFunc(fnStr, e, components[chartConfig.id])
}
}
}
}
return lifeEvents
}
/**
*
* @param fnStr 用户方法体代码
* @param e 执行生命周期的动态组件实例
*/
function generateFunc(fnStr: string, e: any, component:any) {
if(fnStr == "") return
try {
// npmPkgs 便于拷贝 echarts 示例时设置option 的formatter等相关内容
Function(`
"use strict";
return (
async function(e, components, node_modules){
const {${Object.keys(npmPkgs).join()}} = node_modules;
${fnStr}
}
)`)().bind(component)(e, components, npmPkgs)
} catch (error) {
console.error(error)
}
}

View File

@@ -11,6 +11,8 @@ const global = {
help: 'Help',
contact: 'About Software',
logout: 'Logout',
logout_success: 'Logout success',
logout_failure: 'Logout Failed',
// system setting
sys_set: 'System Setting',
lang_set: 'Language Setting',
@@ -26,8 +28,14 @@ const global = {
r_more: 'More',
}
const http = {
error_message: 'The interface is abnormal, please check the interface!',
token_overdue_message: 'Login expired, please log in again!'
}
export default {
global,
http,
login,
project
}

View File

@@ -2,6 +2,6 @@ export default {
desc: "Login",
form_auto: "Sign in automatically",
form_button: "Login",
login_success: "Login success",
login_message: "Please complete the letter",
login_success: "Login success!",
login_message: "Please complete the letter!",
}

View File

@@ -1,6 +1,8 @@
export default {
create_btn: 'Creat',
create_tip: 'Please select a content for development',
create_success: 'Creat Success!',
create_failure: 'Failed to create, please try again later',
create_tip: 'Please select a content for development!',
project: 'Project',
my: 'My',
new_project: 'New Project',

View File

@@ -11,6 +11,8 @@ const global = {
help: '帮助中心',
contact: '关于软件',
logout: '退出登录',
logout_success: '退出成功!',
logout_failure: '退出失败!',
// 系统设置
sys_set: '系统设置',
lang_set: '语言设置',
@@ -18,16 +20,27 @@ const global = {
r_edit: '编辑',
r_preview: '预览',
r_copy: '克隆',
r_copy_success: '克隆成功!',
r_rename: '重命名',
r_rename_success: '重命名成功!',
r_publish: '发布',
r_publish_success: '成功发布!',
r_unpublish: '取消发布',
r_unpublish_success: '取消成功!',
r_download: '下载',
r_delete: '删除',
r_delete_success: '删除成功!',
r_more: '更多',
}
const http = {
error_message: '获取数据失败,请稍后重试!',
token_overdue_message: '登录过期,请重新登录!'
}
export default {
global,
http,
login,
project
}

View File

@@ -2,6 +2,6 @@ export default {
desc: "登录",
form_auto: "自动登录",
form_button: "登录",
login_success: "登录成功",
login_message: "请填写完整信息",
login_success: "登录成功!",
}

View File

@@ -1,6 +1,8 @@
export default {
// aside
create_btn: '新建',
create_success: '新建成功!',
create_failure: '新建失败,请稍后重试!',
create_tip: '从哪里出发好呢?',
project: '项目',
my: '我的',

View File

@@ -90,6 +90,21 @@ export const BlendModeEnumList = [
{ label: '亮度', value: 'luminosity' }
]
// vue3 生命周期事件
export enum EventLife {
// 渲染之后
MOUNTED = 'vnodeMounted',
// 渲染之前
BEFORE_MOUNT = 'vnodeBeforeMount',
// 鼠标事件
MOUSE_CLICK = 'click',
MOUSE_OVER = "mouseover",
MOUSE_LEAVE = "mouseleave",
// 图表事件
ECHART_LEGEND_SELECT_CHANGED = "legendselectchanged",
ECHART_HIGH_LIGHT = "highlight"
}
// 组件实例类
export interface PublicConfigType {
id: string
@@ -115,6 +130,9 @@ export interface PublicConfigType {
}
filter?: string
status: StatusType
events?: {
[K in EventLife]?: string
}
}
export interface CreateComponentType extends PublicConfigType, requestConfig {

View File

@@ -81,6 +81,8 @@ export class PublicConfigClass implements PublicConfigType {
public request = cloneDeep(requestConfig)
// 数据过滤
public filter = undefined
// 事件
public events = undefined
}
// 多选成组类

View File

@@ -8,7 +8,10 @@ import { SketchRule } from 'vue3-sketch-ruler'
* @param app
*/
export function setupCustomComponents(app: App) {
// 骨架屏
app.component('GoSkeleton', GoSkeleton)
// 加载
app.component('GoLoading', GoLoading)
// 标尺
app.component('SketchRule', SketchRule)
}

View File

@@ -53,6 +53,7 @@ import {
ArrowForward as ArrowForwardIcon,
Planet as PawIcon,
Search as SearchIcon,
Reload as ReloadIcon,
ChevronUpOutline as ChevronUpOutlineIcon,
ChevronDownOutline as ChevronDownOutlineIcon,
Pulse as PulseIcon,
@@ -91,6 +92,7 @@ import {
FitToScreen as FitToScreenIcon,
FitToHeight as FitToHeightIcon,
FitToWidth as FitToWidthIcon,
Save as SaveIcon,
Carbon3DCursor as Carbon3DCursorIcon,
Carbon3DSoftware as Carbon3DSoftwareIcon,
Filter as FilterIcon,
@@ -205,6 +207,8 @@ const ionicons5 = {
PawIcon,
// 搜索(放大镜)
SearchIcon,
// 加载
ReloadIcon,
// 过滤器
FilterIcon,
// 向上
@@ -270,6 +274,8 @@ const carbon = {
FitToScreenIcon,
FitToHeightIcon,
FitToWidthIcon,
// 保存
SaveIcon,
// 成组
Carbon3DCursorIcon,
// 解组

View File

@@ -1,13 +1,13 @@
import { RouteRecordRaw } from 'vue-router'
import type { AppRouteRecordRaw } from '@/router/types';
import { ErrorPage404, ErrorPage403, ErrorPage500, Layout } from '@/router/constant';
import { ErrorPage404, ErrorPage403, ErrorPage500, Layout, RedirectHome, RedirectUnPublish } from '@/router/constant';
import { PageEnum } from '@/enums/pageEnum'
import { GoReload } from '@/components/GoReload'
export const LoginRoute: RouteRecordRaw = {
path: '/login',
name: 'Login',
path: PageEnum.BASE_LOGIN,
name: PageEnum.BASE_LOGIN_NAME,
component: () => import('@/views/login/index.vue'),
meta: {
title: '登录',
@@ -60,22 +60,21 @@ export const ReloadRoute: AppRouteRecordRaw = {
},
}
export const RedirectRoute: AppRouteRecordRaw = {
path: PageEnum.REDIRECT,
name: PageEnum.REDIRECT_NAME,
component: Layout,
meta: {
title: PageEnum.REDIRECT_NAME,
},
children: [
{
path: '/redirect/:path(.*)',
name: PageEnum.REDIRECT_NAME,
component: () => import('@/views/redirect/index.vue'),
meta: {
title: PageEnum.REDIRECT_NAME,
hideBreadcrumb: true,
},
export const RedirectRoute: RouteRecordRaw[] = [
{
path: PageEnum.REDIRECT,
name: PageEnum.REDIRECT_NAME,
component: RedirectHome,
meta: {
title: PageEnum.REDIRECT_NAME,
},
],
};
},
{
path: PageEnum.REDIRECT_UN_PUBLISH,
name: PageEnum.REDIRECT_UN_PUBLISH_NAME,
component: RedirectUnPublish,
meta: {
title: PageEnum.REDIRECT_UN_PUBLISH_NAME,
},
},
]

View File

@@ -4,6 +4,10 @@ export const ErrorPage403 = () => import('@/views/exception/403.vue');
export const ErrorPage500 = () => import('@/views/exception/500.vue');
export const RedirectHome = () => import('@/views/redirect/index.vue');
export const RedirectUnPublish = () => import('@/views/redirect/UnPublish.vue');
export const Layout = () => import('@/layout/index.vue');
export const ParentLayout = () => import('@/layout/parentLayout.vue');

View File

@@ -1,9 +1,8 @@
import type { App } from 'vue'
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
import { RedirectRoute } from '@/router/base'
import { createRouterGuards } from './router-guards'
import { PageEnum } from '@/enums/pageEnum'
import { HttpErrorPage, LoginRoute, ReloadRoute } from '@/router/base'
import { HttpErrorPage, LoginRoute, ReloadRoute, RedirectRoute } from '@/router/base'
import { Layout } from '@/router/constant'
import modules from '@/router/modules'
@@ -19,6 +18,7 @@ const RootRoute: Array<RouteRecordRaw> = [
},
children: [
...HttpErrorPage,
...RedirectRoute,
modules.projectRoutes,
modules.chartRoutes,
modules.previewRoutes
@@ -27,7 +27,7 @@ const RootRoute: Array<RouteRecordRaw> = [
]
export const constantRouter: any[] = [LoginRoute, ...RootRoute, RedirectRoute, ReloadRoute];
export const constantRouter: any[] = [LoginRoute, ...RootRoute, ReloadRoute];
const router = createRouter({
history: createWebHashHistory(''),

View File

@@ -1,7 +1,15 @@
import { Router } from 'vue-router';
import { PageEnum } from '@/enums/pageEnum'
import { PageEnum, PreviewEnum } from '@/enums/pageEnum'
import { loginCheck } from '@/utils'
// 路由白名单
const routerAllowList = [
// 登录
PageEnum.BASE_LOGIN_NAME,
// 预览
PreviewEnum.CHART_PREVIEW_NAME
]
export function createRouterGuards(router: Router) {
// 前置
router.beforeEach(async (to, from, next) => {
@@ -10,13 +18,13 @@ export function createRouterGuards(router: Router) {
const isErrorPage = router.getRoutes().findIndex((item) => item.name === to.name);
if (isErrorPage === -1) {
next({ name: PageEnum.ERROR_PAGE_NAME_404 })
return
}
if (!loginCheck()) {
if (to.name === PageEnum.BASE_LOGIN_NAME) {
next()
}
// @ts-ignore
if (!routerAllowList.includes(to.name) && !loginCheck()) {
next({ name: PageEnum.BASE_LOGIN_NAME })
return
}
next()
})

View File

@@ -55,9 +55,12 @@ export const backgroundImageSize = 5
// 预览展示方式
export const previewScaleType = PreviewScaleEnum.FIT
// 数据请求间隔
// 数据请求间隔s
export const requestInterval = 30
// 工作台自动保存间隔s
export const saveInterval = 30
// 数据请求间隔单位
export const requestIntervalUnit = RequestHttpIntervalEnum.SECOND

View File

@@ -0,0 +1,2 @@
// 请求前缀
export const axiosPre = '/api/goview'

View File

@@ -1,5 +1,6 @@
import { CreateComponentType, CreateComponentGroupType, FilterEnum } from '@/packages/index.d'
import { HistoryActionTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
import { SyncEnum } from '@/enums/editPageEnum'
import {
RequestHttpEnum,
RequestContentTypeEnum,
@@ -12,6 +13,29 @@ import {
import { PreviewScaleEnum } from '@/enums/styleEnum'
import type { ChartColorsNameType, GlobalThemeJsonType } from '@/settings/chartThemes/index'
// 项目数据枚举
export enum ProjectInfoEnum {
// ID
PROJECT_ID = "projectId",
// 名称
PROJECT_NAME = 'projectName',
// 描述
REMARKS = 'remarks',
// 缩略图
THUMBNAIL= 'thumbnail',
// 是否公开发布
RELEASE = 'release'
}
// 项目数据
export type ProjectInfoType = {
[ProjectInfoEnum.PROJECT_ID]: string,
[ProjectInfoEnum.PROJECT_NAME]: string,
[ProjectInfoEnum.REMARKS]: string,
[ProjectInfoEnum.THUMBNAIL]: string,
[ProjectInfoEnum.RELEASE]: boolean
}
// 编辑画布属性
export enum EditCanvasTypeEnum {
EDIT_LAYOUT_DOM = 'editLayoutDom',
@@ -20,12 +44,13 @@ export enum EditCanvasTypeEnum {
SCALE = 'scale',
USER_SCALE = 'userScale',
LOCK_SCALE = 'lockScale',
SAVE_STATUS = 'saveStatus',
IS_CREATE = 'isCreate',
IS_DRAG = 'isDrag',
IS_SELECT = 'isSelect'
}
// 编辑区域
// 编辑区域(临时)
export type EditCanvasType = {
// 编辑区域 DOM
[EditCanvasTypeEnum.EDIT_LAYOUT_DOM]: HTMLElement | null
@@ -42,11 +67,13 @@ export type EditCanvasType = {
[EditCanvasTypeEnum.IS_CREATE]: boolean
// 拖拽中
[EditCanvasTypeEnum.IS_DRAG]: boolean
// 保存状态
[EditCanvasTypeEnum.SAVE_STATUS]: SyncEnum
// 框选中
[EditCanvasTypeEnum.IS_SELECT]: boolean
}
// 滤镜/背景色/宽高主题等
// 画布数据/滤镜/背景色/宽高主题等
export enum EditCanvasConfigEnum {
WIDTH = 'width',
HEIGHT = 'height',
@@ -58,7 +85,14 @@ export enum EditCanvasConfigEnum {
PREVIEW_SCALE_TYPE = 'previewScaleType'
}
export interface EditCanvasConfigType {
// 画布属性(需保存)
export type EditCanvasConfigType = {
// ID
[EditCanvasConfigEnum.PROJECT_ID]: string,
// 项目名称
[EditCanvasConfigEnum.PROJECT_NAME]: string,
// 项目描述
[EditCanvasConfigEnum.REMARKS]: string,
// 滤镜-启用
[FilterEnum.FILTERS_SHOW]: boolean
// 滤镜-色相
@@ -130,6 +164,7 @@ export type RecordChartType = {
// Store 枚举
export enum ChartEditStoreEnum {
PROJECT_INFO = 'projectInfo',
EDIT_RANGE = 'editRange',
EDIT_CANVAS = 'editCanvas',
RIGHT_MENU_SHOW = 'rightMenuShow',
@@ -180,6 +215,7 @@ export interface RequestConfigType extends RequestPublicConfigType {
// Store 类型
export interface ChartEditStoreType {
[ChartEditStoreEnum.PROJECT_INFO]: ProjectInfoType
[ChartEditStoreEnum.EDIT_CANVAS]: EditCanvasType
[ChartEditStoreEnum.EDIT_CANVAS_CONFIG]: EditCanvasConfigType
[ChartEditStoreEnum.RIGHT_MENU_SHOW]: boolean

View File

@@ -10,14 +10,22 @@ import { requestInterval, previewScaleType, requestIntervalUnit } from '@/settin
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
// 全局设置
import { useSettingStore } from '@/store/modules/settingStore/settingStore'
// 历史类型
import { HistoryActionTypeEnum, HistoryItemType, HistoryTargetTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
// 画布枚举
import { MenuEnum, SyncEnum } from '@/enums/editPageEnum'
import {
HistoryActionTypeEnum,
HistoryItemType,
HistoryTargetTypeEnum
} from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
import { MenuEnum } from '@/enums/editPageEnum'
import { getUUID, loadingStart, loadingFinish, loadingError, isString, isArray } from '@/utils'
getUUID,
loadingStart,
loadingFinish,
loadingError,
isString,
isArray
} from '@/utils'
import {
ProjectInfoType,
ChartEditStoreEnum,
ChartEditStorage,
ChartEditStoreType,
@@ -36,6 +44,14 @@ const settingStore = useSettingStore()
export const useChartEditStore = defineStore({
id: 'useChartEditStore',
state: (): ChartEditStoreType => ({
// 项目数据
projectInfo: {
projectId: '',
projectName: '',
remarks: '',
thumbnail: '',
release: false
},
// 画布属性
editCanvas: {
// 编辑区域 Dom
@@ -54,7 +70,9 @@ export const useChartEditStore = defineStore({
// 拖拽中
isDrag: false,
// 框选中
isSelect: false
isSelect: false,
// 同步中
saveStatus: SyncEnum.PENDING
},
// 右键菜单
rightMenuShow: false,
@@ -131,6 +149,9 @@ export const useChartEditStore = defineStore({
componentList: []
}),
getters: {
getProjectInfo(): ProjectInfoType {
return this.projectInfo
},
getMousePosition(): MousePositionType {
return this.mousePosition
},
@@ -165,6 +186,10 @@ export const useChartEditStore = defineStore({
}
},
actions: {
// * 设置 peojectInfo 数据项
setProjectInfo<T extends keyof ProjectInfoType, K extends ProjectInfoType[T]>(key: T, value: K) {
this.projectInfo[key] = value
},
// * 设置 editCanvas 数据项
setEditCanvas<T extends keyof EditCanvasType, K extends EditCanvasType[T]>(key: T, value: K) {
this.editCanvas[key] = value

View File

@@ -0,0 +1,31 @@
export enum SystemStoreUserInfoEnum {
USER_TOKEN = 'userToken',
TOKEN_NAME = 'tokenName',
USER_ID = 'userId',
USER_NAME = 'userName',
NICK_NAME = 'nickName',
}
export interface UserInfoType {
[SystemStoreUserInfoEnum.USER_TOKEN]?: string,
[SystemStoreUserInfoEnum.TOKEN_NAME]?: string,
[SystemStoreUserInfoEnum.USER_ID]?: string,
[SystemStoreUserInfoEnum.USER_NAME]?: string,
[SystemStoreUserInfoEnum.NICK_NAME]?: string,
}
export interface FetchInfoType {
OSSUrl?: string,
}
export enum SystemStoreEnum {
// 用户
USER_INFO = 'userInfo',
// 请求
FETCH_INFO = 'fetchInfo'
}
export interface SystemStoreType {
[SystemStoreEnum.USER_INFO]: UserInfoType
[SystemStoreEnum.FETCH_INFO]: FetchInfoType
}

View File

@@ -0,0 +1,40 @@
import { defineStore } from 'pinia'
import { SystemStoreType, UserInfoType, FetchInfoType } from './systemStore.d'
import { setLocalStorage, getLocalStorage } from '@/utils'
import { StorageEnum } from '@/enums/storageEnum'
const { GO_SYSTEM_STORE } = StorageEnum
const storageSystem: SystemStoreType = getLocalStorage(GO_SYSTEM_STORE)
// 系统数据记录
export const useSystemStore = defineStore({
id: 'useSystemStore',
state: (): SystemStoreType => storageSystem || {
userInfo: {
userId: undefined,
userName: undefined,
userToken: undefined,
nickName: undefined
},
fetchInfo: {
OSSUrl: undefined
}
},
getters: {
getUserInfo(): UserInfoType {
return this.userInfo
},
getFetchInfo(): FetchInfoType {
return this.fetchInfo
},
},
actions: {
setItem<T extends keyof SystemStoreType, K extends SystemStoreType[T]>(key: T, value: K): void {
this.$patch(state => {
state[key] = value
});
setLocalStorage(GO_SYSTEM_STORE, this.$state)
}
}
})

View File

@@ -1,3 +1,82 @@
/**
* * base64转file
* @param dataurl
* @param fileName
* @returns
*/
export const base64toFile = (dataurl: string, fileName: string) => {
let dataArr = dataurl.split(","),
mime = (dataArr as any[])[0].match(/:(.*?);/)[1],
bstr = atob(dataArr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], fileName, { type: mime });
}
/**
* * file转url
*/
export const fileToUrl = (file: File): string => {
const Url = URL || window.URL || window.webkitURL
const ImageUrl = Url.createObjectURL(file)
return ImageUrl
}
/**
* file转 blob
* @param { File } file 文件对象
*/
export const fileToBlob = (file:File) =>{
return new Promise<Blob>(function (resolve, reject) {
let reader = new FileReader()
reader.readAsArrayBuffer(file)
reader.onload = function (e: ProgressEvent<FileReader>) {
if(e.target){
const blob = new Blob([<ArrayBuffer>e.target.result], { type: file.type });
resolve(blob);
}
}
})
}
/**
* * url转file
*/
export const urlToFile = (fileUrl: string, fileName = `${new Date().getTime()}`): File => {
const dataArr = fileUrl.split(',')
const mime = (dataArr as any[])[0].match(/:(.*);/)[1]
const originStr = atob(dataArr[1])
return new File([originStr], `${fileName}`, { type: mime })
}
/**
* * file转base64
* @param file 文件数据
* @param callback 回调函数
*/
export const fileTobase64 = (file: File, callback: Function) => {
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = function (e: ProgressEvent<FileReader>) {
if (e.target) {
let base64 = e.target.result
callback(base64)
}
}
}
/**
* * canvas转file
* @param canvas
*/
export const canvastoFile = (canvas: HTMLCanvasElement, name?: string) => {
const dataurl = canvas.toDataURL('image/png')
return urlToFile(dataurl, name)
}
/**
* *获取上传的文件数据
* @param { File } file 文件对象
@@ -51,4 +130,4 @@ export const downloadTextFile = (
// 字符内容转变成blob地址
const blob = new Blob([content])
downloadByA(URL.createObjectURL(blob), filename, fileSuffix)
}
}

27
src/utils/http.ts Normal file
View File

@@ -0,0 +1,27 @@
/**
* 请求失败统一处理allowRoute 允许跳转。
* @param MyResponse MyResponseType可以为空。
* @return
*/
import { ResultEnum } from "@/enums/httpEnum"
import { PageEnum, ErrorPageNameMap } from "@/enums/pageEnum"
import { redirectErrorPage, routerTurnByName } from '@/utils'
export const httpErrorHandle = (MyResponse?:any, allowRoute:boolean = true) => {
if(MyResponse){
const {code, msg} = MyResponse
if (MyResponse.code === ResultEnum.TOKEN_OVERDUE) {
window['$message'].error(msg || window['$t']('http.token_overdue_message'))
if(allowRoute) routerTurnByName(PageEnum.BASE_LOGIN_NAME)
return
}
if (MyResponse.code != ResultEnum.SUCCESS) {
// 其他错误处理 Todo
if (ErrorPageNameMap.get(code) && allowRoute) {
redirectErrorPage(code)
}
}
}
window['$message'].error(window['$t']('http.error_message'))
}

View File

@@ -7,3 +7,4 @@ export * from '@/utils/plugin'
export * from '@/utils/components'
export * from '@/utils/type'
export * from '@/utils/file'
export * from '@/utils/http'

View File

@@ -35,7 +35,7 @@ export const loadingError = () => {
* })
* ```
*/
export const goDialog = (
export const goDialog = (
params: {
// 基本
type?: DialogEnum

View File

@@ -1,11 +1,11 @@
import { useRoute } from 'vue-router'
import { ResultEnum } from '@/enums/httpEnum'
import { ErrorPageNameMap, PageEnum } from '@/enums/pageEnum'
import { ResultEnum, RequestHttpHeaderEnum } from '@/enums/httpEnum'
import { ErrorPageNameMap, PageEnum, PreviewEnum } from '@/enums/pageEnum'
import { docPath, giteeSourceCodePath } from '@/settings/pathConst'
import { cryptoDecode } from './crypto'
import { StorageEnum } from '@/enums/storageEnum'
import { clearLocalStorage, getLocalStorage } from './storage'
import { clearLocalStorage, getLocalStorage, clearCookie } from './storage'
import router from '@/router'
import { BackEndFactory } from '@/backend/ibackend'
/**
* * 根据名字跳转路由
@@ -101,11 +101,20 @@ export const reloadRoutePage = () => {
}
/**
* * 退出
* * 退出登录
*/
export const logout = () => {
clearLocalStorage(StorageEnum.GO_LOGIN_INFO_STORE)
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
export const logout = async () => {
try {
const res = await BackEndFactory.logout() as any
if(res.code === ResultEnum.SUCCESS) {
window['$message'].success(window['$t']('global.logout_success'))
clearCookie(RequestHttpHeaderEnum.COOKIE)
clearLocalStorage(StorageEnum.GO_LOGIN_INFO_STORE)
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
}
} catch (error) {
window['$message'].success(window['$t']('global.logout_failure'))
}
}
/**
@@ -137,7 +146,8 @@ export const openGiteeSourceCode = () => {
* @returns boolean
*/
export const isPreview = () => {
return document.location.hash.includes('preview')
return false
//return document.location.hash.includes('preview')
}
/**
@@ -153,6 +163,28 @@ export const fetchRouteParams = () => {
}
}
export const fetchRouteQuery = () => {
try {
const route = useRoute()
return route.query
} catch (error) {
window['$message'].warning('查询路由信息失败,请联系管理员!')
}
}
/**
* * 通过硬解析获取当前路由下的参数
* @returns object
*/
export const fetchRouteParamsLocation = () => {
try {
return document.location.hash.split('/').pop() || ''
} catch (error) {
window['$message'].warning('查询路由信息失败,请联系管理员!')
return ''
}
}
/**
* * 回到主页面
* @param confirm
@@ -162,19 +194,28 @@ export const goHome = () => {
}
/**
* * 判断是否登录(现阶段是有 login 数据即可)
* * 判断是否登录
* @return boolean
*/
export const loginCheck = () => {
export const loginCheck = () => {
try {
const info = getLocalStorage(StorageEnum.GO_LOGIN_INFO_STORE)
if (!info) return false
const decodeInfo = cryptoDecode(info)
if (decodeInfo) {
return true
}
// 检查 Token ?
if(info.token && info.userinfo) return true
return false
} catch (error) {
return false
}
}
}
/**
* * 预览地址
* @returns
*/
export const previewPath = (id?: string | number) => {
const { origin, pathname } = document.location
const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href')
const previewPath = `${origin}${pathname}${path}/${id || fetchRouteParamsLocation()}`
return previewPath
}

View File

@@ -68,3 +68,41 @@ export const getSessionStorage: (k: string) => any = (k: string) => {
export const clearSessioStorage = (name: string) => {
window.sessionStorage.removeItem(name)
}
/**
* * 设置 cookie
* @param name 键名
* @param cvalue 键值
* @param exdays 过期时间
*/
export const setCookie = (name: string, cvalue: string, exdays: number) => {
const d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
const expires = "expires=" + d.toUTCString();
document.cookie = name + "=" + cvalue + "; " + expires;
}
/**
* * 获取 cookie
* @param cname 键名
* @returns string
*/
export const getCookie = (cname: string) => {
const name = cname + "=";
const ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1);
if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
}
return "";
}
/**
* * 清除 cookie
* @param name 键名
* @returns string
*/
export const clearCookie = (name: string) => {
setCookie(name, "", -1);
}

View File

@@ -113,29 +113,6 @@ export const isMac = () => {
return /macintosh|mac os x/i.test(navigator.userAgent)
}
/**
* * file转url
*/
export const fileToUrl = (file: File): string => {
const Url = URL || window.URL || window.webkitURL
const ImageUrl = Url.createObjectURL(file)
return ImageUrl
}
/**
* * file转base64
*/
export const fileTobase64 = (file: File, callback: Function) => {
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = function (e: ProgressEvent<FileReader>) {
if (e.target) {
let base64 = e.target.result
callback(base64)
}
}
}
/**
* * 挂载监听
*/

View File

@@ -30,7 +30,7 @@
:onBeforeUpload="beforeUploadHandle"
>
<n-upload-dragger>
<img v-if="canvasConfig.backgroundImage" class="upload-show" :src="canvasConfig.backgroundImage" alt="背景" />
<img v-if="canvasConfig.backgroundImage" class="upload-show" :src="BackEndFactory.getFileUrl(canvasConfig.backgroundImage)" alt="背景" />
<div class="upload-img" v-show="!canvasConfig.backgroundImage">
<img src="@/assets/images/canvas/noImage.png" />
<n-text class="upload-desc" depth="3">
@@ -133,9 +133,12 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore
import { EditCanvasConfigEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
import { StylesSetting } from '@/components/Pages/ChartItemSetting'
import { UploadCustomRequestOptions } from 'naive-ui'
import { fileToUrl, loadAsyncComponent } from '@/utils'
import { fileToUrl, loadAsyncComponent, fetchRouteParamsLocation } from '@/utils'
import { PreviewScaleEnum } from '@/enums/styleEnum'
import { ResultEnum } from '@/enums/httpEnum'
import { icon } from '@/plugins'
import { BackEndFactory } from '@/backend/ibackend'
const { ColorPaletteIcon } = icon.ionicons5
const { ScaleIcon, FitToScreenIcon, FitToHeightIcon, FitToWidthIcon } = icon.carbon
@@ -268,11 +271,21 @@ const clearColor = () => {
// 自定义上传操作
const customRequest = (options: UploadCustomRequestOptions) => {
const { file } = options
nextTick(() => {
nextTick(async () => {
if (file.file) {
const ImageUrl = fileToUrl(file.file)
chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, ImageUrl)
chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false)
const uploadRes = await BackEndFactory.uploadFile(file.file, null) as any
if(uploadRes.code === ResultEnum.SUCCESS) {
chartEditStore.setEditCanvasConfig(
EditCanvasConfigEnum.BACKGROUND_IMAGE,
uploadRes.data.uri
)
chartEditStore.setEditCanvasConfig(
EditCanvasConfigEnum.SELECT_COLOR,
false
)
return
}
window['$message'].error('添加图片失败,请稍后重试!')
} else {
window['$message'].error('添加图片失败,请稍后重试!')
}

View File

@@ -1,5 +1,5 @@
<template>
<n-modal class="go-chart-data-request" v-model:show="modelShow" :mask-closable="false">
<n-modal class="go-chart-data-request" v-model:show="modelShow" :mask-closable="false" @esc="escHandler">
<n-card :bordered="false" role="dialog" size="small" aria-modal="true" style="width: 1000px; height: 800px">
<template #header></template>
<template #header-extra> </template>
@@ -32,10 +32,12 @@ import { RequestContentTypeEnum } from '@/enums/httpEnum'
import { useTargetData } from '../../../hooks/useTargetData.hook'
import { RequestGlobalConfig } from './components/RequestGlobalConfig'
import { RequestTargetConfig } from './components/RequestTargetConfig'
import { useSync } from '@/views/chart/hooks/useSync.hook'
const emit = defineEmits(['update:modelShow', 'sendHandle'])
const { targetData } = useTargetData()
const { dataSyncUpdate } = useSync()
// 解构基础配置
const { chartConfig } = toRefs(targetData.value)
const { requestContentType } = toRefs(targetData.value.request)
@@ -51,6 +53,10 @@ defineProps({
const closeHandle = () => {
emit('update:modelShow', false)
emit('sendHandle')
dataSyncUpdate()
}
const escHandler = ()=>{
emit('update:modelShow', false)
}
</script>

View File

@@ -0,0 +1,177 @@
// 获取实例
const eTemplateString = `
console.log(e)
`
// 获取全局 echarts 实例
const echartsTemplateString = `
console.log(echarts)
`
// 获取当前组件图表集合
const componentsTemplateString = `
console.log(components)
`
// 获取 nodeModules 实例
const nodeModulesTemplateString = `
console.log(node_modules)
`
// 异步引入
const importTemplateString = `
await import('https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/lodash.js/4.17.21/lodash.js')
// lodash 默认赋值给 "_"
console.log('isEqual', _.isEqual(['1'], ['1']))
`
// 修改图表 tooltip
const tooltipTemplateString =
`
// 获取echart实例
const chart = this.refs.vChartRef.chart
// 图表设置tooltip
chart.setOption({
tooltip: {
trigger: 'axis', //item
enterable: true,
formatter (params) {
return` +
'`' +
`
<div>
<img src="https://portrait.gitee.com/uploads/avatars/user/1654/4964818_MTrun_1653229420.png!avatar30">
<b><a href="https://gitee.com/dromara/go-view">《这是一个自定义的tooltip》</a></b>
<div>
<div style='border-radius:35px;color:#666'>
` +
'$' +
`{Object.entries(params[0].value).map(kv => ` +
'`' +
`<div>` +
'$' +
`{kv[0]}:` +
'$' +
`{kv[1]}</div>` +
'`' +
`).join('')}
</div>
` +
'`;' +
`
},
}
})
`
// 添加【轮播列表】样式
const addStyleString =
`
// 组件样式作用域标识
const scoped = this.subTree.scopeId
function loadStyleString(css){
let style = document.createElement('style')
style.type = 'text/css'
style.appendChild(document.createTextNode(css))
let head = document.getElementsByTagName('head')[0]
head.appendChild(style)
}
loadStyleString(` +
'`' +
`
.dv-scroll-board[` +
'$' +
`{scoped}] {
position: relative;
overflow: hidden;
}
.dv-scroll-board[` +
'$' +
`{scoped}]::before {
content: '';
display: block;
position: absolute;
top: -20%;
left: -100%;
width: 550px;
height: 60px;
transform: rotate(-45deg);
background-image: linear-gradient(rgba(0, 0, 0, 0), rgba(255, 255, 255, 0.3), rgba(0, 0, 0, 0));
animation: cross 2s infinite;
}
@keyframes cross{
to{
top: 80%;
left: 100%;
transform: rotate(-45deg);
}
}
` +
'`' +
`)
`
// 修改地图原点大小
const editMapPointString = `
const chart = this.refs.vChartRef.chart
// 定义地图原点大小 同理可自定义标签等等内容
this.props.chartConfig.option.series[0].symbolSize = (val) => {
return Math.sqrt(val[2]) / 3;
}
this.setupState.vEchartsSetOption();
let i = 0; // 当前轮播索引
const len = 3; // 轮播部分提示
(function showTips() {
const action = (type, dataIndex) => {
chart.dispatchAction({
type,
dataIndex,
seriesIndex: 0,
});
}
setInterval(() => {
action("downplay", i);
action("hideTip", i);
if (i === len) i = 0;
i++;
action("highlight", i);
action("showTip", i);
}, 2000);
})()
`
export const templateList = [
{
description: '获取当前组件实例',
code: eTemplateString
},
{
description: '获取全局 echarts 实例',
code: echartsTemplateString
},
{
description: '获取组件图表集合',
code: componentsTemplateString
},
{
description: '获取 nodeModules 实例',
code: nodeModulesTemplateString
},
{
description: '获取远程 CDN 库',
code: importTemplateString
},
{
description: '修改图表 tooltip',
code: tooltipTemplateString
},
{
description: '添加【轮播列表】样式',
code: addStyleString
},
{
description: '修改【地图】圆点,新增提示自动轮播',
code: editMapPointString
}
]

View File

@@ -0,0 +1,3 @@
import ChartEventMonacoEditor from './index.vue'
export { ChartEventMonacoEditor }

View File

@@ -0,0 +1,290 @@
<template>
<n-collapse-item title="高级事件配置" name="2">
<template #header-extra>
<n-button type="primary" tertiary size="small" @click.stop="showModal = true">
<template #icon>
<n-icon>
<pencil-icon />
</n-icon>
</template>
编辑
</n-button>
</template>
<n-card>
<!-- 函数体 -->
<div v-for="eventName in EventLife" :key="eventName">
<p>
<span class="func-keyword">async {{ eventName }}</span> (e, components, echarts, node_modules) {
</p>
<p class="go-ml-4"><n-code :code="(targetData.events || {})[eventName]" language="typescript"></n-code></p>
<p>}<span>,</span></p>
</div>
</n-card>
</n-collapse-item>
<!-- 弹窗 -->
<n-modal class="go-chart-data-monaco-editor" v-model:show="showModal" :mask-closable="false">
<n-card :bordered="false" role="dialog" size="small" aria-modal="true" style="width: 1200px; height: 700px">
<template #header>
<n-space>
<n-text>高级事件编辑器配合源码使用</n-text>
</n-space>
</template>
<template #header-extra> </template>
<n-layout has-sider sider-placement="right">
<n-layout style="height: 580px; padding-right: 20px">
<n-tabs v-model:value="editTab" type="card" tab-style="min-width: 100px;">
<!-- 提示 -->
<template #suffix>
<n-text class="tab-tip" type="warning">tips: {{ EventLifeTip[editTab] }}</n-text>
</template>
<n-tab-pane
v-for="(eventName, index) in EventLife"
:key="index"
:tab="`${EventLifeName[eventName]}-${eventName}`"
:name="eventName"
>
<!-- 函数名称 -->
<p class="go-pl-3">
<span class="func-keyword">async function &nbsp;&nbsp;</span>
<span class="func-keyNameWord">{{ eventName }}(e, components, echarts, node_modules)&nbsp;&nbsp;{</span>
</p>
<!-- 编辑主体 -->
<monaco-editor v-model:modelValue="events[eventName]" height="480px" language="javascript" />
<!-- 函数结束 -->
<p class="go-pl-3 func-keyNameWord">}</p>
</n-tab-pane>
</n-tabs>
</n-layout>
<n-layout-sider
:collapsed-width="14"
:width="340"
show-trigger="bar"
collapse-mode="transform"
content-style="padding: 12px 12px 0px 12px;margin-left: 3px;"
>
<n-tabs default-value="1" justify-content="space-evenly" type="segment">
<!-- 验证结果 -->
<n-tab-pane tab="验证结果" name="1" size="small">
<n-scrollbar trigger="none" style="max-height: 505px">
<n-collapse class="go-px-3" arrow-placement="right" :default-expanded-names="[1, 2, 3]">
<template v-for="error in [validEvents()]" :key="error">
<n-collapse-item title="错误函数" :name="1">
<n-text depth="3">{{ error.errorFn || '暂无' }}</n-text>
</n-collapse-item>
<n-collapse-item title="错误信息" :name="2">
<n-text depth="3">{{ error.name || '暂无' }}</n-text>
</n-collapse-item>
<n-collapse-item title="堆栈信息" :name="3">
<n-text depth="3">{{ error.message || '暂无' }}</n-text>
</n-collapse-item>
</template>
</n-collapse>
</n-scrollbar>
</n-tab-pane>
<!-- 辅助说明 -->
<n-tab-pane tab="变量说明" name="2">
<n-scrollbar trigger="none" style="max-height: 505px">
<n-collapse class="go-px-3" arrow-placement="right" :default-expanded-names="[1, 2, 3, 4]">
<n-collapse-item title="e" :name="1">
<n-text depth="3">触发对应生命周期事件时接收的参数</n-text>
</n-collapse-item>
<n-collapse-item title="this" :name="2">
<n-text depth="3">图表组件实例</n-text>
<br />
<n-tag class="go-m-1" v-for="prop in ['refs', 'setupState', 'ctx', 'props', '...']" :key="prop">{{
prop
}}</n-tag>
</n-collapse-item>
<n-collapse-item title="components" :name="3">
<n-text depth="3"
>当前大屏内所有组件的集合id 图表组件中的配置id可以获取其他图表组件进行控制</n-text
>
<n-code :code="`{\n [id]: component\n}`" language="typescript"></n-code>
</n-collapse-item>
<n-collapse-item title="node_modules" :name="4">
<n-text depth="3">以下是内置在代码环境中可用的包变量</n-text>
<br />
<n-tag class="go-m-1" v-for="pkg in Object.keys(npmPkgs || {})" :key="pkg">{{ pkg }}</n-tag>
</n-collapse-item>
</n-collapse>
</n-scrollbar>
</n-tab-pane>
<!-- 介绍案例 -->
<n-tab-pane tab="介绍案例" name="3">
<n-scrollbar trigger="none" style="max-height: 505px">
<n-collapse arrow-placement="right">
<n-collapse-item
v-for="(item, index) in templateList"
:key="index"
:title="`案例${index + 1}${item.description}`"
:name="index"
>
<n-code :code="item.code" language="typescript"></n-code>
</n-collapse-item>
</n-collapse>
</n-scrollbar>
</n-tab-pane>
</n-tabs>
</n-layout-sider>
</n-layout>
<template #action>
<n-space justify="space-between">
<div class="go-flex-items-center">
<n-tag :bordered="false" type="primary">
<template #icon>
<n-icon :component="DocumentTextIcon" />
</template>
提示
</n-tag>
<n-text class="go-ml-2" depth="2">通过提供的参数可为图表增加定制化的tooltip交互事件等等</n-text>
</div>
<n-space>
<n-button size="medium" @click="closeEvents">取消</n-button>
<n-button size="medium" type="primary" @click="saveEvents">保存</n-button>
</n-space>
</n-space>
</template>
</n-card>
</n-modal>
</template>
<script lang="ts" setup>
import { ref, computed, watch, toRefs, toRaw } from 'vue'
import { MonacoEditor } from '@/components/Pages/MonacoEditor'
import { useTargetData } from '../../../hooks/useTargetData.hook'
import { templateList } from './importTemplate'
import { npmPkgs } from '@/hooks'
import { icon } from '@/plugins'
import { goDialog, toString } from '@/utils'
import { CreateComponentType, EventLife } from '@/packages/index.d'
import { Script } from 'vm'
const { targetData, chartEditStore } = useTargetData()
const { DocumentTextIcon, ChevronDownIcon, PencilIcon } = icon.ionicons5
const EventLifeName = {
[EventLife.BEFORE_MOUNT]: '渲染之前',
[EventLife.MOUNTED]: '渲染之后',
[EventLife.MOUSE_CLICK] : '点击',
[EventLife.MOUSE_OVER] : "进入",
[EventLife.MOUSE_LEAVE] : "离开",
[EventLife.ECHART_LEGEND_SELECT_CHANGED] : "选择图例",
[EventLife.ECHART_HIGH_LIGHT] : "高亮"
}
const EventLifeTip = {
[EventLife.BEFORE_MOUNT]: '此时组件 DOM 还未存在',
[EventLife.MOUNTED]: '此时组件 DOM 已经存在'
}
// 受控弹窗
const showModal = ref(false)
// 编辑区域控制
const editTab = ref(EventLife.MOUNTED as EventLife.MOUNTED)
// events 函数模板
let events = ref({ ...targetData.value.events })
// 事件错误标识
const errorFlag = ref(false)
// 验证语法
const validEvents = () => {
let errorFn = ''
let message = ''
let name = ''
errorFlag.value = Object.entries(events.value).every(([eventName, str]) => {
try {
// 支持await验证语法
const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor
new AsyncFunction(str)
return true
} catch (error: any) {
message = error.message
name = error.name
errorFn = eventName
return false
}
})
return {
errorFn,
message,
name
}
}
// 关闭事件
const closeEvents = () => {
showModal.value = false
}
// 新增事件
const saveEvents = () => {
if (validEvents().errorFn) {
window['$message'].error('事件函数错误,无法进行保存')
return
}
if (Object.values(events.value).join('').trim() === '') {
// 清空事件
targetData.value.events = undefined
} else {
targetData.value.events = { ...events.value }
}
closeEvents()
}
watch(
() => showModal.value,
(newData: boolean) => {
if (newData) {
events.value = { ...targetData.value.events }
}
}
)
</script>
<style lang="scss" scoped>
/* 外层也要使用 */
.func-keyword {
color: #b478cf;
}
@include go('chart-data-monaco-editor') {
.func-keyNameWord {
color: #70c0e8;
}
.tab-tip {
font-size: 12px;
}
&.n-card.n-modal,
.n-card {
@extend .go-background-filter;
}
}
@include deep() {
.n-layout,
.n-layout-sider {
background-color: transparent;
}
.go-editor-area {
max-height: 530px;
}
.checkbox--hidden:checked {
& + label {
.n-icon {
transition: all 0.3s;
transform: rotate(180deg);
}
}
& ~ .go-editor-area {
display: none;
}
}
// 优化代码换行
.n-code > pre {
white-space: break-spaces;
}
}
</style>

View File

@@ -0,0 +1,24 @@
<template>
<!-- 事件配置 -->
<n-collapse class="go-mt-3" arrow-placement="right" :default-expanded-names="['1', '2']">
<n-text depth="3">
组件 id
<n-text>{{ targetData.id }}</n-text>
</n-text>
<n-collapse-item title="基础事件配置" name="1">
<div class="go-event">
<n-text depth="3"> 单击双击移入移出尽情期待 </n-text>
</div>
</n-collapse-item>
<chart-event-monaco-editor></chart-event-monaco-editor>
</n-collapse>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { ChartEventMonacoEditor } from './components/ChartEventMonacoEditor'
import { useTargetData } from '../hooks/useTargetData.hook'
const { targetData } = useTargetData()
const showModal = ref(false)
</script>

View File

@@ -3,4 +3,5 @@ export enum TabsEnum {
CHART_SETTING = 'chartSetting',
CHART_ANIMATION = 'chartAnimation',
CHART_DATA = 'chartData',
CHART_EVENT = 'chartEvent'
}

View File

@@ -75,12 +75,13 @@ const { getDetails } = toRefs(useChartLayoutStore())
const { setItem } = useChartLayoutStore()
const chartEditStore = useChartEditStore()
const { ConstructIcon, FlashIcon, DesktopOutlineIcon, LeafIcon } = icon.ionicons5
const { ConstructIcon, FlashIcon, DesktopOutlineIcon, LeafIcon, RocketIcon } = icon.ionicons5
const ContentEdit = loadAsyncComponent(() => import('../ContentEdit/index.vue'))
const CanvasPage = loadAsyncComponent(() => import('./components/CanvasPage/index.vue'))
const ChartSetting = loadAsyncComponent(() => import('./components/ChartSetting/index.vue'))
const ChartData = loadAsyncComponent(() => import('./components/ChartData/index.vue'))
const ChartEvent = loadAsyncComponent(() => import('./components/ChartEvent/index.vue'))
const ChartAnimation = loadAsyncComponent(() => import('./components/ChartAnimation/index.vue'))
const collapsed = ref<boolean>(getDetails.value)
@@ -148,6 +149,12 @@ const chartsTabList = [
title: '数据',
icon: FlashIcon,
render: ChartData
},
{
key: TabsEnum.CHART_EVENT,
title: '事件',
icon: RocketIcon,
render: ChartEvent
}
]
</script>

View File

@@ -5,6 +5,8 @@
<edit-history></edit-history>
<!-- CTRL按键触发展示 -->
<n-text id="keyboard-dress-show" depth="3"></n-text>
<n-divider vertical />
<edit-data-sync></edit-data-sync>
</n-space>
<n-space class="bottom-ri">
@@ -55,7 +57,8 @@
import { reactive, ref, toRefs, watchEffect } from 'vue'
import { icon } from '@/plugins'
import { EditHistory } from '../EditHistory/index'
import EditShortcutKey from '../EditShortcutKey/index.vue'
import { EditShortcutKey } from '../EditShortcutKey/index'
import { EditDataSync } from '../EditDataSync/index'
import { useDesignStore } from '@/store/modules/designStore/designStore'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
@@ -136,12 +139,13 @@ watchEffect(() => {
<style lang="scss" scoped>
$min-width: 500px;
@include go('edit-bottom') {
width: 100%;
min-width: $min-width;
padding: 0 10px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 10px;
width: 100%;
min-width: $min-width;
height: 40px;
.bottom-ri {
position: relative;
top: 15px;

View File

@@ -0,0 +1,3 @@
import EditDataSync from './index.vue'
export { EditDataSync }

View File

@@ -0,0 +1,97 @@
<template>
<div class="go-edit-data-sync go-flex-items-center">
<n-tooltip trigger="hover">
<template #trigger>
<n-text class="status-desc go-ml-2" :type="descType" depth="3">
{{ statusDesc }}
</n-text>
</template>
<span>{{saveInterval}}s 更新一次</span>
</n-tooltip>
<n-spin
v-show="statusDesc === statusDescObj[1]['text']"
class="go-ml-2"
size="small"
>
<template #icon>
<n-icon size="13">
<reload-icon />
</n-icon>
</template>
</n-spin>
</div>
</template>
<script lang="ts" setup>
import { ref, toRefs, watch } from 'vue'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useDesignStore } from '@/store/modules/designStore/designStore'
import { SyncEnum } from '@/enums/editPageEnum'
import { icon } from '@/plugins'
import { saveInterval } from '@/settings/designSetting'
const { ReloadIcon } = icon.ionicons5
const chartEditStore = useChartEditStore()
const designStore = useDesignStore()
const { saveStatus } = toRefs(chartEditStore.getEditCanvas)
const themeColor = ref(designStore.getAppTheme)
const statusDesc = ref('')
const descType = ref('')
let setTimeoutIns: NodeJS.Timeout = setTimeout(() => {})
const statusDescObj = {
[SyncEnum.PENDING]: {
text: '等待自动同步',
type: '',
},
[SyncEnum.START]: {
text: '正在同步中',
type: 'success',
},
[SyncEnum.SUCCESS]: {
text: '同步成功!',
type: 'success',
},
[SyncEnum.FAILURE]: {
text: '同步失败!',
type: 'error',
},
}
watch(
() => saveStatus.value,
newData => {
clearTimeout(setTimeoutIns)
statusDesc.value = statusDescObj[newData]['text']
descType.value = statusDescObj[newData]['type']
// 3秒重置展示
setTimeoutIns = setTimeout(() => {
statusDesc.value = statusDescObj[SyncEnum.PENDING]['text']
descType.value = statusDescObj[SyncEnum.PENDING]['type']
}, 3000)
},
{
immediate: true,
}
)
</script>
<style lang="scss" scoped>
@include go('edit-data-sync') {
@include deep() {
.n-spin {
width: 13px;
height: 13px;
}
}
.status-desc {
cursor: default;
color: v-bind('themeColor');
font-size: 12px;
opacity: 0.8;
}
}
</style>

View File

@@ -133,9 +133,6 @@ const options = computed(() => {
</script>
<style lang="scss" scoped>
.mr-10 {
margin-right: 10px;
}
.edit-history-popover {
.btn-text {
font-size: 12px;

View File

@@ -113,20 +113,25 @@ const shortcutKeyOptions = [
win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + Z `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + ${MacKeyboard.SHIFT.toUpperCase()} + Z `
},
{
label: '保存',
win: `${WinKeyboard.CTRL.toUpperCase()} + S `,
mac: `${MacKeyboard.CTRL.toUpperCase()} + S `,
},
{
label: '多选',
win: `${WinKeyboard.CTRL.toUpperCase()} + 🖱️ `,
mac: `${MacKeyboard.CTRL_SOURCE_KEY.toUpperCase()} + 🖱️ `
mac: `${MacKeyboard.CTRL.toUpperCase()} + 🖱️ `
},
{
label: '创建分组',
win: `${WinKeyboard.CTRL.toUpperCase()} + G / 🖱️ `,
mac: `${MacKeyboard.CTRL_SOURCE_KEY.toUpperCase()} + G / 🖱️`
mac: `${MacKeyboard.CTRL.toUpperCase()} + G / 🖱️`
},
{
label: '解除分组',
win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + G `,
mac: `${MacKeyboard.CTRL_SOURCE_KEY.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + G `
mac: `${MacKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + G `
}
]
const closeHandle = () => {

View File

@@ -1,2 +1,3 @@
import EditShortcutKey from './index.vue'
export { EditShortcutKey }

View File

@@ -7,7 +7,6 @@ import { useSync } from '@/views/chart/hooks/useSync.hook'
export const useFile = () => {
const importUploadFileListRef = ref()
const { updateComponent } = useSync()
// 上传-前置
//@ts-ignore
const importBeforeUpload = ({ file }) => {

View File

@@ -9,7 +9,7 @@ export const exportHandle = () => {
// 导出数据
downloadTextFile(
JSON.stringify(chartEditStore.getStorageInfo || [], (k, v) => {
JSON.stringify(chartEditStore.getStorageInfo || {}, (k, v) => {
return v === undefined ? null : v
}),
undefined,

View File

@@ -91,6 +91,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore
import { useLayout } from './hooks/useLayout.hook'
import { useAddKeyboard } from '../hooks/useKeyboard.hook'
import { useSync } from '../hooks/useSync.hook'
import { dragHandle, dragoverHandle, mousedownHandleUnStop, useMouseHandle } from './hooks/useDrag.hook'
import { useComponentStyle, useSizeStyle } from './hooks/useStyle.hook'
@@ -101,9 +102,11 @@ import { EditRule } from './components/EditRule'
import { EditBottom } from './components/EditBottom'
import { EditShapeBox } from './components/EditShapeBox'
import { EditTools } from './components/EditTools'
import { BackEndFactory } from '@/backend/ibackend'
const chartEditStore = useChartEditStore()
const { handleContextMenu } = useContextMenu()
const { dataSyncFetch, intervalDataSyncUpdate } = useSync()
// 布局处理
useLayout()
@@ -156,7 +159,7 @@ const filterShow = computed(() => {
const rangeStyle = computed(() => {
// 设置背景色和图片背景
const background = chartEditStore.getEditCanvasConfig.background
const backgroundImage = chartEditStore.getEditCanvasConfig.backgroundImage
const backgroundImage = BackEndFactory.getFileUrl(chartEditStore.getEditCanvasConfig.backgroundImage as string)
const selectColor = chartEditStore.getEditCanvasConfig.selectColor
const backgroundColor = background ? background : undefined
@@ -172,9 +175,13 @@ const rangeStyle = computed(() => {
}
})
// 键盘事件
onMounted(() => {
// 键盘事件
useAddKeyboard()
// 获取数据
dataSyncFetch()
// 定时更新数据
intervalDataSyncUpdate()
})
</script>

View File

@@ -29,26 +29,44 @@
</template>
<span>{{ item.title }}</span>
</n-tooltip>
<n-divider vertical />
<!-- 保存 -->
<n-tooltip placement="bottom" trigger="hover">
<template #trigger>
<div class="save-btn" >
<n-button size="small" type="primary" ghost @click="dataSyncUpdate()">
<template #icon>
<n-icon>
<SaveIcon></SaveIcon>
</n-icon>
</template>
</n-button>
</div>
</template>
<span>保存</span>
</n-tooltip>
</n-space>
</n-space>
</template>
<script setup lang="ts">
import { toRefs, Ref, reactive, computed } from 'vue'
import { toRefs, ref, Ref, reactive, computed } from 'vue'
import { renderIcon, goDialog, goHome } from '@/utils'
import { icon } from '@/plugins'
import { useRemoveKeyboard } from '../../hooks/useKeyboard.hook'
import { useSync } from '../../hooks/useSync.hook'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
import { HistoryStackEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
const { LayersIcon, BarChartIcon, PrismIcon, HomeIcon, ArrowBackIcon, ArrowForwardIcon } = icon.ionicons5
const { SaveIcon } = icon.carbon
const { setItem } = useChartLayoutStore()
const { dataSyncUpdate, removeIntervalDataSync } = useSync()
const { getLayers, getCharts, getDetails } = toRefs(useChartLayoutStore())
const chartEditStore = useChartEditStore()
const chartHistoryStore = useChartHistoryStore()
@@ -130,11 +148,12 @@ const clickHistoryHandle = (item: ItemType<HistoryStackEnum>) => {
// 返回首页
const goHomeHandle = () => {
goDialog({
message: '返回将不会保存任何操作',
message: '确定已保存了数据Ctrl / ⌘ + S并返回到首页吗',
isMaskClosable: true,
onPositiveCallback: () => {
goHome()
useRemoveKeyboard()
removeIntervalDataSync()
}
})
}

View File

@@ -1,29 +1,98 @@
<template>
<n-space class="go-mt-0">
<n-button v-for="item in btnList" :key="item.title" ghost @click="item.event">
<n-space>
<n-button
v-for="item in btnList"
:key="item.key"
:type="item.type()"
ghost
@click="item.event"
>
<template #icon>
<component :is="item.icon"></component>
</template>
<span>{{ item.title }}</span>
<span>{{ item.title() }}</span>
</n-button>
</n-space>
<!-- 发布管理弹窗 -->
<n-modal v-model:show="modelShow" @afterLeave="closeHandle">
<n-list bordered class="go-system-setting">
<template #header>
<n-space justify="space-between">
<n-h3 class="go-mb-0">发布管理</n-h3>
<n-icon size="20" class="go-cursor-pointer" @click="closeHandle">
<close-icon></close-icon>
</n-icon>
</n-space>
</template>
<n-list-item>
<n-space :size="10">
<n-alert :show-icon="false" title="预览地址:" type="success">
{{ previewPath() }}
</n-alert>
<n-space vertical>
<n-button tertiary type="primary" @click="copyPreviewPath()">
复制地址
</n-button>
<n-button :type="release ? 'warning' : 'primary'" @click="sendHandle">
{{ release ? '取消发布' : '发布大屏' }}
</n-button>
</n-space>
</n-space>
</n-list-item>
<n-list-item>
<n-space :size="10">
<n-button @click="modelShowHandle">关闭弹窗</n-button>
</n-space>
</n-list-item>
</n-list>
</n-modal>
</template>
<script setup lang="ts">
import { shallowReactive } from 'vue'
import { renderIcon, goDialog, fetchPathByName, routerTurnByPath, setSessionStorage, getLocalStorage } from '@/utils'
import { ref, shallowReactive, watchEffect } from 'vue'
import { useRoute } from 'vue-router'
import { useClipboard } from '@vueuse/core'
import { PreviewEnum } from '@/enums/pageEnum'
import { StorageEnum } from '@/enums/storageEnum'
import { useRoute } from 'vue-router'
import { ResultEnum } from '@/enums/httpEnum'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
import { ProjectInfoEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
import { BackEndFactory } from '@/backend/ibackend'
import {
previewPath,
renderIcon,
fetchPathByName,
routerTurnByPath,
setSessionStorage,
getLocalStorage,
httpErrorHandle,
fetchRouteParamsLocation,
} from '@/utils'
import { icon } from '@/plugins'
const { BrowsersOutlineIcon, SendIcon } = icon.ionicons5
const { BrowsersOutlineIcon, SendIcon, CloseIcon } = icon.ionicons5
const chartEditStore = useChartEditStore()
const previewPathRef = ref(previewPath())
const { copy, isSupported } = useClipboard({ source: previewPathRef })
const routerParamsInfo = useRoute()
const modelShow = ref<boolean>(false)
const release = ref<boolean>(false)
watchEffect(() => {
release.value = chartEditStore.getProjectInfo.release || false
})
// 关闭弹窗
const closeHandle = () => {
modelShow.value = false
}
// 预览
const previewHandle = () => {
const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href')
@@ -32,55 +101,100 @@ const previewHandle = () => {
// id 标识
const previewId = typeof id === 'string' ? id : id[0]
const storageInfo = chartEditStore.getStorageInfo
const sessionStorageInfo = getLocalStorage(StorageEnum.GO_CHART_STORAGE_LIST) || []
const sessionStorageInfo =
getLocalStorage(StorageEnum.GO_CHART_STORAGE_LIST) || []
if (sessionStorageInfo?.length) {
const repeateIndex = sessionStorageInfo.findIndex((e: { id: string }) => e.id === previewId)
const repeateIndex = sessionStorageInfo.findIndex(
(e: { id: string }) => e.id === previewId
)
// 重复替换
if (repeateIndex !== -1) {
sessionStorageInfo.splice(repeateIndex, 1, { id: previewId, ...storageInfo })
sessionStorageInfo.splice(repeateIndex, 1, {
id: previewId,
...storageInfo,
})
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, sessionStorageInfo)
} else {
sessionStorageInfo.push({
id: previewId, ...storageInfo
id: previewId,
...storageInfo,
})
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, sessionStorageInfo)
}
} else {
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ id: previewId, ...storageInfo }])
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [
{ id: previewId, ...storageInfo },
])
}
// 跳转
routerTurnByPath(path, [previewId], undefined, true)
}
// 模态弹窗
const modelShowHandle = () => {
modelShow.value = !modelShow.value
}
// 复制预览地址
const copyPreviewPath = (successText?: string, failureText?: string) => {
if (isSupported) {
copy()
window['$message'].success(successText || '复制成功!')
} else {
window['$message'].error(failureText || '复制失败!')
}
}
// 发布
const sendHandle = () => {
goDialog({
message: '想体验发布功能,请前往 master-fetch 分支查看: https://gitee.com/MTrun/go-view/tree/master-fetch',
positiveText: '了然',
closeNegativeText: true,
onPositiveCallback: () => {}
})
const sendHandle = async () => {
const res = (await BackEndFactory.updateProject({
projectId: fetchRouteParamsLocation(),
// 反过来
release: release.value ? -1 : 1,
})) as any
if (res.code === ResultEnum.SUCCESS) {
modelShowHandle()
if (!release.value) {
copyPreviewPath('发布成功!已复制地址到剪贴板~', '发布成功!')
} else {
window['$message'].success(`已取消发布`)
}
chartEditStore.setProjectInfo(ProjectInfoEnum.RELEASE, !release.value)
} else {
httpErrorHandle()
}
}
const btnList = shallowReactive([
{
select: true,
title: '预览',
key: 'preview',
title: () => '预览',
type: () => 'default',
icon: renderIcon(BrowsersOutlineIcon),
event: previewHandle
event: previewHandle,
},
{
select: true,
title: '发布',
key: 'release',
title: () => (release.value ? '已发布' : '发布'),
icon: renderIcon(SendIcon),
event: sendHandle
}
type: () => (release.value ? 'primary' : 'default'),
event: modelShowHandle,
},
])
</script>
<style lang="scss" scoped>
.align-center {
margin-top: -4px;
@include go('system-setting') {
@extend .go-background-filter;
min-width: 100px;
max-width: 60vw;
padding-bottom: 20px;
@include deep() {
.n-list-item:not(:last-child) {
border-bottom: 0;
}
}
}
</style>

View File

@@ -6,9 +6,7 @@
<n-text @click="handleFocus">
工作空间 -
<n-button v-show="!focus" secondary round size="tiny">
<span class="title">
{{ comTitle }}
</span>
<span class="title">{{ comTitle }}</span>
</n-button>
</n-text>
@@ -29,31 +27,32 @@
</template>
<script setup lang="ts">
import { ref, nextTick, computed } from 'vue'
import { fetchRouteParams } from '@/utils'
import { ref, nextTick, computed, watchEffect } from 'vue'
import { ResultEnum } from '@/enums/httpEnum'
import { fetchRouteParamsLocation, httpErrorHandle } from '@/utils'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { ProjectInfoEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
import { useSync } from '../../hooks/useSync.hook'
import { icon } from '@/plugins'
import { BackEndFactory } from '@/backend/ibackend'
const chartEditStore = useChartEditStore()
const { dataSyncUpdate } = useSync()
const { FishIcon } = icon.ionicons5
const focus = ref<boolean>(false)
const inputInstRef = ref(null)
// 根据路由 id 参数获取项目信息
const fetchProhectInfoById = () => {
const routeParamsRes = fetchRouteParams()
if (!routeParamsRes) return
const { id } = routeParamsRes
if (id.length) {
return id[0]
}
return ''
}
const title = ref<string>(fetchRouteParamsLocation())
const title = ref<string>(fetchProhectInfoById() || '')
watchEffect(() => {
title.value = chartEditStore.getProjectInfo.projectName || ''
})
const comTitle = computed(() => {
// eslint-disable-next-line vue/no-side-effects-in-computed-properties
title.value = title.value.replace(/\s/g, '')
return title.value.length ? title.value : '新项目'
title.value = title.value && title.value.replace(/\s/g, '')
return title.value.length ? title.value : fetchRouteParamsLocation()
})
const handleFocus = () => {
@@ -63,8 +62,18 @@ const handleFocus = () => {
})
}
const handleBlur = () => {
const handleBlur = async () => {
focus.value = false
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_NAME, title.value || '')
const res = (await BackEndFactory.updateProject({
projectId: fetchRouteParamsLocation(),
projectName: title.value
})) as any
if (res.code === ResultEnum.SUCCESS) {
dataSyncUpdate()
} else {
httpErrorHandle()
}
}
</script>
<style lang="scss" scoped>

View File

@@ -1,4 +1,5 @@
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useSync } from './useSync.hook'
import { WinKeyboard, MacKeyboard, MenuEnum } from '@/enums/editPageEnum'
import throttle from 'lodash/throttle'
import debounce from 'lodash/debounce'
@@ -7,7 +8,7 @@ import { setKeyboardDressShow } from '@/utils'
// Keymaster可以支持识别以下组合键shiftoptionaltctrlcontrolcommand和⌘
const chartEditStore = useChartEditStore()
const useSyncIns = useSync()
const winCtrlMerge = (e: string) => `${WinKeyboard.CTRL}+${e}`
const winShiftMerge = (e: string) => `${WinKeyboard.SHIFT}+${e}`
const winAltMerge = (e: string) => `${WinKeyboard.ALT}+${e}`
@@ -23,6 +24,7 @@ export const winKeyboardValue = {
[MenuEnum.DELETE]: 'delete',
[MenuEnum.BACK]: winCtrlMerge('z'),
[MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')),
[MenuEnum.SAVE]: winCtrlMerge('s'),
[MenuEnum.GROUP]: winCtrlMerge('g'),
[MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')),
[MenuEnum.LOCK]: winCtrlMerge('l'),
@@ -48,6 +50,7 @@ export const macKeyboardValue = {
[MenuEnum.DELETE]: macCtrlMerge('backspace'),
[MenuEnum.BACK]: macCtrlMerge('z'),
[MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')),
[MenuEnum.SAVE]: macCtrlMerge('s'),
[MenuEnum.GROUP]: macCtrlMerge('g'),
[MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')),
[MenuEnum.LOCK]: macCtrlMerge('l'),
@@ -71,6 +74,7 @@ const winKeyList: Array<string> = [
winKeyboardValue.back,
winKeyboardValue.forward,
winKeyboardValue.save,
winKeyboardValue.group,
winKeyboardValue.unGroup,
@@ -96,6 +100,7 @@ const macKeyList: Array<string> = [
macKeyboardValue.back,
macKeyboardValue.forward,
macKeyboardValue.save,
macKeyboardValue.group,
macKeyboardValue.unGroup,
@@ -203,6 +208,11 @@ export const useAddKeyboard = () => {
case keyboardValue.show:
keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime))
break;
// 保存 ct+s
case keyboardValue.save:
keymaster(e, throttle(() => { useSyncIns.dataSyncUpdate(); return false }, 200))
break;
}
}
winKeyList.forEach((key: string) => {

View File

@@ -1,8 +1,19 @@
import { getUUID } from '@/utils'
import { onUnmounted } from 'vue';
import html2canvas from 'html2canvas'
import { getUUID, httpErrorHandle, fetchRouteParamsLocation, base64toFile } from '@/utils'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { ChartEditStoreEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
import { EditCanvasTypeEnum, ChartEditStoreEnum, ProjectInfoEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
//import { useSystemStore } from '@/store/modules/systemStore/systemStore'
import { fetchChartComponent, fetchConfigComponent, createComponent } from '@/packages/index'
import { saveInterval } from '@/settings/designSetting'
import throttle from 'lodash/throttle'
// 接口状态
import { ResultEnum } from '@/enums/httpEnum'
// 接口
import { BackEndFactory } from '@/backend/ibackend'
// 画布枚举
import { SyncEnum } from '@/enums/editPageEnum'
import { CreateComponentType, CreateComponentGroupType, ConfigType } from '@/packages/index.d'
import { PublicGroupConfigClass } from '@/packages/public/publicConfig'
import merge from 'lodash/merge'
@@ -41,7 +52,7 @@ export const useSync = () => {
* @param isReplace 是否替换数据
* @returns
*/
const updateComponent = async (projectData: ChartEditStorage, isReplace = false, changeId = false) => {
const updateComponent = async (projectData: ChartEditStorage, isReplace = false, changeId = false, isHistory = true) => {
if (isReplace) {
// 清除列表
chartEditStore.componentList = []
@@ -85,10 +96,10 @@ export const useSync = () => {
chartEditStore.addComponentList(
componentMerge(newComponent, { ..._componentInstance, id: getUUID() }),
false,
true
isHistory
)
} else {
chartEditStore.addComponentList(componentMerge(newComponent, _componentInstance), false, true)
chartEditStore.addComponentList(componentMerge(newComponent, _componentInstance), false, isHistory)
}
}
}
@@ -117,7 +128,7 @@ export const useSync = () => {
groupClass.groupList = targetList
// 分组插入到列表
chartEditStore.addComponentList(groupClass, false, true)
chartEditStore.addComponentList(groupClass, false, isHistory)
} else {
await create(comItem as CreateComponentType)
}
@@ -130,7 +141,119 @@ export const useSync = () => {
}
}
/**
* * 赋值全局数据
* @param projectData 项目数据
* @returns
*/
const updateStoreInfo = (projectData: {
id: string,
projectName: string,
indexImage: string,
remarks: string,
state: number
}) => {
const { id, projectName, remarks, indexImage, state } = projectData
// ID
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_ID, id)
// 名称
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_NAME, projectName)
// 描述
chartEditStore.setProjectInfo(ProjectInfoEnum.REMARKS, remarks)
// 缩略图
chartEditStore.setProjectInfo(ProjectInfoEnum.THUMBNAIL, indexImage)
// 发布
chartEditStore.setProjectInfo(ProjectInfoEnum.RELEASE, state === 1)
}
// * 数据获取
const dataSyncFetch = async () => {
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
try {
const res = await BackEndFactory.fetchProject({ projectId: fetchRouteParamsLocation() }) as any
if (res.code === ResultEnum.SUCCESS) {
if (res.data) {
updateStoreInfo(res.data)
// 更新全局数据
if(res.data.content && res.data.content != "{}"){
await updateComponent(JSON.parse(res.data.content), true, false, false)
return
}
}
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_ID, fetchRouteParamsLocation())
setTimeout(() => {
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
}, 1000)
return
}
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
} catch (error) {
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
httpErrorHandle()
}
}
// * 数据保存
const dataSyncUpdate = throttle(async () => {
if(!fetchRouteParamsLocation()) return
let projectId = chartEditStore.getProjectInfo[ProjectInfoEnum.PROJECT_ID];
if(projectId === null || projectId === ''){
window['$message'].error('数据初未始化成功,请刷新页面!')
return
}
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
// 获取缩略图片
const range = document.querySelector('.go-edit-range') as HTMLElement
// 生成图片
const canvasImage: HTMLCanvasElement = await html2canvas(range, {
backgroundColor: null,
allowTaint: true,
useCORS: true
})
// 保存数据和预览图
const res= await BackEndFactory.updateProject({
projectId,
content:JSON.stringify(chartEditStore.getStorageInfo || {}),
object:base64toFile(canvasImage.toDataURL(), `${fetchRouteParamsLocation()}_index_preview.png`)
}) as any
if (res.code === ResultEnum.SUCCESS) {
// 成功状态
setTimeout(() => {
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
}, 1000)
return
}
//提示
window['$message'].success(window['$t']('global.r_save_fail'))
// 失败状态
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
}, 3000)
let syncTiming:any
// * 定时处理
const intervalDataSyncUpdate = () => {
// 定时获取数据
syncTiming = setInterval(() => {
dataSyncUpdate()
}, saveInterval * 1000)
}
// 卸载监听事件
const removeIntervalDataSync = () => {
clearInterval(syncTiming)
}
return {
updateComponent
updateComponent,
updateStoreInfo,
dataSyncFetch,
dataSyncUpdate,
intervalDataSyncUpdate,
removeIntervalDataSync
}
}

View File

@@ -4,7 +4,7 @@
<img src="~@/assets/images/exception/403.svg" alt="" />
</div>
<div class="text-center">
<h1 class="text-base text-gray-500">抱歉你无权访问该页面</h1>
<h1>抱歉你无权访问该页面</h1>
</div>
<n-button type="primary" @click="goHome">回到首页</n-button>
</div>

View File

@@ -4,7 +4,7 @@
<img src="~@/assets/images/exception/404.svg" alt="" />
</div>
<div class="text-center">
<h1 class="text-base text-gray-500">抱歉你访问的页面不存在</h1>
<h1>抱歉你访问的页面不存在</h1>
</div>
<n-button type="primary" @click="goHome">回到首页</n-button>
</div>

View File

@@ -4,9 +4,9 @@
<img src="~@/assets/images/exception/500.svg" alt="" />
</div>
<div class="text-center">
<h1 class="text-base text-gray-500">抱歉服务器出错了</h1>
<h1>抱歉服务器出错了</h1>
</div>
<n-button type="primary" secondary @click="goHome">回到首页</n-button>
<n-button type="primary" secondary @click="goLogin">重新登录</n-button>
</div>
</template>
@@ -14,8 +14,8 @@
import { PageEnum } from '@/enums/pageEnum'
import { routerTurnByName } from '@/utils'
function goHome() {
routerTurnByName(PageEnum.BASE_HOME_NAME)
function goLogin() {
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
}
</script>

View File

@@ -124,9 +124,13 @@ import { GoLangSelect } from '@/components/GoLangSelect'
import { LayoutHeader } from '@/layout/components/LayoutHeader'
import { LayoutFooter } from '@/layout/components/LayoutFooter'
import { PageEnum } from '@/enums/pageEnum'
import { ResultEnum } from '@/enums/httpEnum'
import { icon } from '@/plugins'
import { StorageEnum } from '@/enums/storageEnum'
import { routerTurnByName, cryptoEncode, setLocalStorage } from '@/utils'
import { routerTurnByName, cryptoEncode, setLocalStorage, clearLocalStorage } from '@/utils'
import { BackEndFactory } from '@/backend/ibackend'
const { GO_LOGIN_INFO_STORE } = StorageEnum
const { PersonOutlineIcon, LockClosedOutlineIcon } = icon.ionicons5
@@ -210,17 +214,22 @@ const handleSubmit = (e: Event) => {
if (!errors) {
const { username, password } = formInline
loading.value = true
setLocalStorage(
GO_LOGIN_INFO_STORE,
cryptoEncode(
JSON.stringify({
username,
password,
})
)
)
window['$message'].success(`${t('login.login_success')}!`)
routerTurnByName(PageEnum.BASE_HOME_NAME, true)
clearLocalStorage(GO_LOGIN_INFO_STORE)
const res = await BackEndFactory.login({
username,
password
}) as any
loading.value = false
if(res.code=== ResultEnum.SUCCESS && res.data) {
// const { tokenValue, tokenName } = res.data.token
// const { nickname, username, id } = res.data.userinfo
// 保存登陆信息
setLocalStorage( GO_LOGIN_INFO_STORE, res.data)
window['$message'].success(t('login.login_success'))
routerTurnByName(PageEnum.BASE_HOME_NAME, true)
}else{
window['$message'].error(res.msg ||`${t('login.login_error')}!`)
}
} else {
window['$message'].error(`${t('login.login_message')}!`)
}

View File

@@ -18,6 +18,7 @@
:themeSetting="themeSetting"
:themeColor="themeColor"
:style="{ ...getSizeStyle(item.attr) }"
v-on="useLifeHandler(item)"
></component>
</div>
</template>
@@ -27,7 +28,7 @@ import { PropType } from 'vue'
import { CreateComponentGroupType } from '@/packages/index.d'
import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils'
import { getSizeStyle, getComponentAttrStyle, getStatusStyle } from '../../utils'
import { useLifeHandler } from '@/hooks'
const props = defineProps({
groupData: {
type: Object as PropType<CreateComponentGroupType>,

View File

@@ -1,7 +1,7 @@
<template>
<div
class="chart-item"
v-for="(item, index) in localStorageInfo.componentList"
v-for="(item, index) in reactiveList"
:class="animationsClass(item.styles.animations)"
:key="item.id"
:style="{
@@ -19,6 +19,7 @@
:groupIndex="index"
:themeSetting="themeSetting"
:themeColor="themeColor"
v-on="useLifeHandler(item)"
></preview-render-group>
<!-- 单组件 -->
@@ -29,19 +30,20 @@
:themeSetting="themeSetting"
:themeColor="themeColor"
:style="{ ...getSizeStyle(item.attr) }"
v-on="useLifeHandler(item)"
></component>
</div>
</template>
<script setup lang="ts">
import { PropType, computed } from 'vue'
import { PropType, computed, reactive } from 'vue'
import { ChartEditStorageType } from '../../index.d'
import { PreviewRenderGroup } from '../PreviewRenderGroup/index'
import { CreateComponentGroupType } from '@/packages/index.d'
import { chartColors } from '@/settings/chartThemes/index'
import { animationsClass, getFilterStyle, getTransformStyle, getBlendModeStyle } from '@/utils'
import { getSizeStyle, getComponentAttrStyle, getStatusStyle } from '../../utils'
import { useLifeHandler } from '@/hooks'
const props = defineProps({
localStorageInfo: {
type: Object as PropType<ChartEditStorageType>,
@@ -49,6 +51,7 @@ const props = defineProps({
}
})
const reactiveList = reactive(props.localStorageInfo.componentList)
// 主题色
const themeSetting = computed(() => {
const chartThemeSetting = props.localStorageInfo.editCanvasConfig.chartThemeSetting

View File

@@ -8,7 +8,7 @@ export const useComInstall = (localStorageInfo: ChartEditStorageType) => {
// 注册组件(一开始无法获取window['$vue'])
const intervalTiming = setInterval(() => {
if (window['$vue'].component) {
if (window['$vue']?.component) {
clearInterval(intervalTiming)
const intComponent = (target: CreateComponentType) => {

View File

@@ -4,6 +4,7 @@ import type { ChartEditStorageType } from '../index.d'
import { PreviewScaleEnum } from '@/enums/styleEnum'
export const useScale = (localStorageInfo: ChartEditStorageType) => {
const entityRef = ref()
const previewRef = ref()
const width = ref(localStorageInfo.editCanvasConfig.width)

View File

@@ -1,5 +1,6 @@
import { ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
export interface ChartEditStorageType extends ChartEditStorage {
id: string
id: string,
isRelease?: boolean
}

View File

@@ -1,91 +1,9 @@
<template>
<div :class="`go-preview ${localStorageInfo.editCanvasConfig.previewScaleType}`">
<template v-if="showEntity">
<!-- 实体区域 -->
<div ref="entityRef" class="go-preview-entity">
<!-- 缩放层 -->
<div ref="previewRef" class="go-preview-scale">
<!-- 展示层 -->
<div :style="previewRefStyle" v-if="show">
<!-- 渲染层 -->
<preview-render-list :localStorageInfo="localStorageInfo"></preview-render-list>
</div>
</div>
</div>
</template>
<template v-else>
<!-- 缩放层 -->
<div ref="previewRef" class="go-preview-scale">
<!-- 展示层 -->
<div :style="previewRefStyle" v-if="show">
<!-- 渲染层 -->
<preview-render-list :localStorageInfo="localStorageInfo"></preview-render-list>
</div>
</div>
</template>
</div>
<suspense>
<suspense-index></suspense-index>
</suspense>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { PreviewRenderList } from './components/PreviewRenderList'
import { getFilterStyle } from '@/utils'
import { getEditCanvasConfigStyle, getSessionStorageInfo } from './utils'
import { useComInstall } from './hooks/useComInstall.hook'
import { useScale } from './hooks/useScale.hook'
import { useStore } from './hooks/useStore.hook'
import { PreviewScaleEnum } from '@/enums/styleEnum'
import type { ChartEditStorageType } from './index.d'
const localStorageInfo: ChartEditStorageType = getSessionStorageInfo() as ChartEditStorageType
const previewRefStyle = computed(() => {
return {
...getEditCanvasConfigStyle(localStorageInfo.editCanvasConfig),
...getFilterStyle(localStorageInfo.editCanvasConfig)
}
})
const showEntity = computed(() => {
const type = localStorageInfo.editCanvasConfig.previewScaleType
return type === PreviewScaleEnum.SCROLL_Y || type === PreviewScaleEnum.SCROLL_X
})
useStore(localStorageInfo)
const { entityRef, previewRef } = useScale(localStorageInfo)
const { show } = useComInstall(localStorageInfo)
import suspenseIndex from './suspenseIndex.vue'
</script>
<style lang="scss" scoped>
@include go('preview') {
position: relative;
height: 100vh;
width: 100vw;
@include background-image('background-image');
&.fit,
&.full {
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
.go-preview-scale {
transform-origin: center center;
}
}
&.scrollY {
overflow-x: hidden;
.go-preview-scale {
transform-origin: left top;
}
}
&.scrollX {
overflow-y: hidden;
.go-preview-scale {
transform-origin: left top;
}
}
.go-preview-entity {
overflow: hidden;
}
}
</style>

View File

@@ -0,0 +1,110 @@
<template>
<div
:class="`go-preview ${localStorageInfo.editCanvasConfig.previewScaleType}`"
>
<template v-if="showEntity">
<!-- 实体区域 -->
<div ref="entityRef" class="go-preview-entity">
<!-- 缩放层 -->
<div ref="previewRef" class="go-preview-scale">
<!-- 展示层 -->
<div :style="previewRefStyle" v-if="show">
<!-- 渲染层 -->
<preview-render-list
:localStorageInfo="localStorageInfo"
></preview-render-list>
</div>
</div>
</div>
</template>
<template v-else>
<!-- 缩放层 -->
<div ref="previewRef" class="go-preview-scale">
<!-- 展示层 -->
<div :style="previewRefStyle" v-if="show">
<!-- 渲染层 -->
<preview-render-list
:localStorageInfo="localStorageInfo"
></preview-render-list>
</div>
</div>
</template>
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { PreviewRenderList } from './components/PreviewRenderList'
import { getFilterStyle, routerTurnByName, getSessionStorage } from '@/utils'
import { getEditCanvasConfigStyle, getSessionStorageInfo } from './utils'
import { PageEnum } from '@/enums/pageEnum'
import { StorageEnum } from '@/enums/storageEnum'
import { useScale } from './hooks/useScale.hook'
import { useStore } from './hooks/useStore.hook'
import { PreviewScaleEnum } from '@/enums/styleEnum'
import { useComInstall } from './hooks/useComInstall.hook'
import type { ChartEditStorageType } from './index.d'
const storageList: ChartEditStorageType[] = getSessionStorage(
StorageEnum.GO_CHART_STORAGE_LIST
)
const localStorageInfo = await getSessionStorageInfo() as ChartEditStorageType
// @ts-ignore
if(localStorageInfo.isRelease === false) {
routerTurnByName(PageEnum.REDIRECT_UN_PUBLISH_NAME, true, false)
}
const previewRefStyle = computed(() => {
return {
...getEditCanvasConfigStyle(localStorageInfo.editCanvasConfig),
...getFilterStyle(localStorageInfo.editCanvasConfig.filterShow ? localStorageInfo.editCanvasConfig : undefined),
}
})
const showEntity = computed(() => {
const type = localStorageInfo.editCanvasConfig.previewScaleType
return (
type === PreviewScaleEnum.SCROLL_Y || type === PreviewScaleEnum.SCROLL_X
)
})
useStore(localStorageInfo)
const { entityRef, previewRef } = useScale(localStorageInfo)
const { show } = useComInstall(localStorageInfo)
</script>
<style lang="scss" scoped>
@include go('preview') {
position: relative;
height: 100vh;
width: 100vw;
@include background-image('background-image');
&.fit,
&.full {
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
.go-preview-scale {
transform-origin: center center;
}
}
&.scrollY {
overflow-x: hidden;
.go-preview-scale {
transform-origin: left top;
}
}
&.scrollX {
overflow-y: hidden;
.go-preview-scale {
transform-origin: left top;
}
}
.go-preview-entity {
overflow: hidden;
}
}
</style>

View File

@@ -1,23 +1,58 @@
import { getSessionStorage } from '@/utils'
import { loginCheck, getSessionStorage, fetchRouteParamsLocation, httpErrorHandle, fetchRouteParams, fetchRouteQuery, setLocalStorage } from '@/utils'
import { ResultEnum } from '@/enums/httpEnum'
import { StorageEnum } from '@/enums/storageEnum'
import { ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
import { BackEndFactory } from '@/backend/ibackend'
export interface ChartEditStorageType extends ChartEditStorage {
id: string
}
// 根据路由 id 获取存储数据的信息
export const getSessionStorageInfo = () => {
const urlHash = document.location.hash
const toPathArray = urlHash.split('/')
const id = toPathArray && toPathArray[toPathArray.length - 1]
export const getSessionStorageInfo = async () => {
let id:string = fetchRouteParamsLocation()
if(id.indexOf("?") > 0){
id = id.substring(0, id.indexOf("?"))
}
const storageList: ChartEditStorageType[] = getSessionStorage(
StorageEnum.GO_CHART_STORAGE_LIST
)
if(!storageList) return
// 是否本地预览
if (!storageList || storageList.findIndex(e => e.id === id.toString()) === -1) {
// 处理 Token 注入
const q = fetchRouteQuery();
if(q && q.token && !loginCheck()){
// Token 注入
const rt = await BackEndFactory.checkToken({ token: q.token }) as any
if (rt.code === ResultEnum.SUCCESS && rt.data) {
// 记录登陆信息
setLocalStorage( StorageEnum.GO_LOGIN_INFO_STORE, rt.data)
}else{
httpErrorHandle()
return {}
}
}
// 接口调用
const res = await BackEndFactory.fetchProject({ projectId: id }) as any
if (res.code === ResultEnum.SUCCESS && res.data) {
const { content, state } = res.data
if (state === -1) {
// 跳转未发布页
return { isRelease: false }
}
return { ...JSON.parse(content), id }
} else {
httpErrorHandle()
// 错误处理Todo
return {}
}
}
// 本地读取
for (let i = 0; i < storageList.length; i++) {
if (id.toString() === storageList[i]['id']) {
return storageList[i]

View File

@@ -7,7 +7,7 @@
<mac-os-control-btn
class="top-btn"
:hidden="['remove']"
@close="deleteHanlde"
@close="deleteHandle"
@resize="resizeHandle"
></mac-os-control-btn>
</div>
@@ -17,9 +17,7 @@
object-fit="contain"
height="180"
preview-disabled
:src="
requireUrl('project/moke-20211219181327.png')
"
:src="`${cardData.image}`"
:alt="cardData.title"
:fallback-src="requireErrorImg()"
></n-image>
@@ -27,8 +25,8 @@
</div>
<template #action>
<div class="go-flex-items-center list-footer" justify="space-between">
<n-text class="go-ellipsis-1" :title="cardData.title">
{{ cardData.title || '' }}
<n-text class="go-ellipsis-1">
{{ cardData.title || cardData.id || '未命名' }}
</n-text>
<!-- 工具 -->
<div class="go-flex-items-center list-footer-ri">
@@ -75,8 +73,8 @@
</n-tooltip>
</template>
</n-space>
</div>
<!-- end -->
</div>
</div>
</template>
</n-card>
@@ -100,17 +98,12 @@ const {
SendIcon
} = icon.ionicons5
const emit = defineEmits(['delete', 'resize', 'edit'])
const emit = defineEmits(['preview', 'delete', 'resize', 'edit','copy', 'release'])
const props = defineProps({
cardData: Object as PropType<Chartype>
})
// 处理url获取
const requireUrl = (name: string) => {
return new URL(`../../../../../assets/images/${name}`, import.meta.url).href
}
const fnBtnList = reactive([
{
label: renderLang('global.r_edit'),
@@ -133,12 +126,13 @@ const selectOptions = ref([
{
label: renderLang('global.r_copy'),
key: 'copy',
icon: renderIcon(CopyIcon)
icon: renderIcon(CopyIcon),
},
{
label: renderLang('global.r_rename'),
key: 'rename',
icon: renderIcon(PencilIcon)
icon: renderIcon(PencilIcon),
disabled: true
},
{
type: 'divider',
@@ -148,13 +142,14 @@ const selectOptions = ref([
label: props.cardData?.release
? renderLang('global.r_unpublish')
: renderLang('global.r_publish'),
key: 'send',
key: 'release',
icon: renderIcon(SendIcon)
},
{
label: renderLang('global.r_download'),
key: 'download',
icon: renderIcon(DownloadIcon)
icon: renderIcon(DownloadIcon),
disabled: true
},
{
type: 'divider',
@@ -169,8 +164,17 @@ const selectOptions = ref([
const handleSelect = (key: string) => {
switch (key) {
case 'preview':
previewHandle()
break
case 'delete':
deleteHanlde()
deleteHandle()
break
case 'copy':
emit('copy', props.cardData)
break;
case 'release':
releaseHandle()
break
case 'edit':
editHandle()
@@ -178,8 +182,13 @@ const handleSelect = (key: string) => {
}
}
// 预览处理
const previewHandle = () => {
emit('preview', props.cardData)
}
// 删除处理
const deleteHanlde = () => {
const deleteHandle = () => {
emit('delete', props.cardData)
}
@@ -188,6 +197,11 @@ const editHandle = () => {
emit('edit', props.cardData)
}
// 编辑处理
const releaseHandle = () => {
emit('release', props.cardData)
}
// 放大处理
const resizeHandle = () => {
emit('resize', props.cardData)

View File

@@ -1,58 +1,131 @@
import { ref } from 'vue'
import { goDialog } from '@/utils'
import { ref, reactive } from 'vue';
import { goDialog, httpErrorHandle } from '@/utils'
import { DialogEnum } from '@/enums/pluginEnum'
import { ChartList } from '../../..'
import { BackEndFactory } from '@/backend/ibackend'
import { Chartype, ChartList } from '../../../index.d'
import { ResultEnum } from '@/enums/httpEnum'
// 数据初始化
export const useDataListInit = () => {
const list = ref<ChartList>([
{
id: 1,
title: '物料1-假数据不可用',
release: true,
label: '官方案例'
},
{
id: 2,
title: '物料2-假数据不可用',
release: false,
label: '官方案例'
},
{
id: 3,
title: '物料3-假数据不可用',
release: false,
label: '官方案例'
},
{
id: 4,
title: '物料4-假数据不可用',
release: false,
label: '官方案例'
},
{
id: 5,
title: '物料5-假数据不可用',
release: false,
label: '官方案例'
}
])
// 删除
const deleteHandle = (cardData: object, index: number) => {
const loading = ref(true)
const paginat = reactive({
// 当前页数
page: 1,
// 每页值
limit: 12,
// 总数
count: 10,
})
const list = ref<ChartList>([])
// 数据请求
const fetchList = async () => {
loading.value = true
const res = await BackEndFactory.projectList({
page: paginat.page,
limit: paginat.limit
}) as any
if (res.code==ResultEnum.SUCCESS) {
const { count } = res
paginat.count = count
list.value = res.data;
setTimeout(() => {
loading.value = false
}, 500)
return
}
httpErrorHandle()
}
// 修改页数
const changePage = (_page: number) => {
paginat.page = _page
fetchList()
}
// 修改大小
const changeSize = (_size: number) => {
paginat.limit = _size
fetchList()
}
// 删除处理
const deleteHandle = (cardData: Chartype) => {
goDialog({
type: DialogEnum.DELETE,
promise: true,
onPositiveCallback: () =>
new Promise(res => setTimeout(() => res(1), 1000)),
promiseResCallback: (e: any) => {
window.$message.success('删除成功')
list.value.splice(index, 1)
onPositiveCallback: () => new Promise(res => {
res(BackEndFactory.deleteProject({
projectId: cardData.id
}))
}),
promiseResCallback: (res: any) => {
if (res.code === ResultEnum.SUCCESS) {
window['$message'].success(window['$t']('global.r_delete_success'))
fetchList()
return
}
httpErrorHandle()
}
})
}
// 复制项目
const copyHandle = async (cardData: Chartype) => {
const { id, title } = cardData
const res = await BackEndFactory.copyProject({
copyId: id,
projectName: '复制-' + title
}) as any
if (res.code === ResultEnum.SUCCESS) {
list.value = []
fetchList()
window['$message'].success("复制项目成功!")
return
}
httpErrorHandle()
}
// 发布处理
const releaseHandle = async (cardData: Chartype, index: number) => {
const { id, release } = cardData
const res = await BackEndFactory.updateProject({
projectId: id,
// [-1未发布, 1发布]
release: !release ? 1 : -1
}) as any
if (res.code === ResultEnum.SUCCESS) {
list.value = []
fetchList()
// 发布 -> 未发布
if (release) {
window['$message'].success(window['$t']('global.r_unpublish_success'))
return
}
// 未发布 -> 发布
window['$message'].success(window['$t']('global.r_publish_success'))
return
}
httpErrorHandle()
}
// 立即请求
fetchList()
return {
loading,
paginat,
list,
fetchList,
copyHandle,
releaseHandle,
changeSize,
changePage,
deleteHandle
}
}

View File

@@ -1,7 +1,7 @@
import { ref, Ref } from 'vue'
import { ref } from 'vue'
import { ChartEnum } from '@/enums/pageEnum'
import { fetchPathByName, routerTurnByPath } from '@/utils'
import { Chartype } from '../../..'
import { fetchPathByName, routerTurnByPath, openNewWindow, previewPath } from '@/utils'
import { Chartype } from '../../../index.d'
export const useModalDataInit = () => {
const modalShow = ref<boolean>(false)
const modalData = ref<Chartype | null>(null)
@@ -12,25 +12,31 @@ export const useModalDataInit = () => {
modalData.value = null
}
// 打开 modal
// 缩放处理
const resizeHandle = (cardData: Chartype) => {
if(!cardData) return
if (!cardData) return
modalShow.value = true
modalData.value = cardData
}
// 打开 modal
// 编辑处理
const editHandle = (cardData: Chartype) => {
if(!cardData) return
if (!cardData) return
const path = fetchPathByName(ChartEnum.CHART_HOME_NAME, 'href')
routerTurnByPath(path, [cardData.id], undefined, true)
}
// 预览处理
const previewHandle = (cardData: Chartype) => {
openNewWindow(previewPath(cardData.id))
}
return {
modalData,
modalShow,
closeModal,
resizeHandle,
editHandle
editHandle,
previewHandle
}
}

View File

@@ -1,28 +1,41 @@
<template>
<div class="go-items-list">
<n-grid
:x-gap="20"
:y-gap="20"
cols="2 s:2 m:3 l:4 xl:4 xxl:4"
responsive="screen"
>
<n-grid-item v-for="(item, index) in list" :key="item.id">
<project-items-card
:cardData="item"
@resize="resizeHandle"
@delete="deleteHandle($event, index)"
@edit="editHandle"
></project-items-card>
</n-grid-item>
</n-grid>
<!-- 加载 -->
<div v-show="loading">
<go-loading></go-loading>
</div>
<!-- 列表 -->
<div v-show="!loading">
<n-grid :x-gap="20" :y-gap="20" cols="2 s:2 m:3 l:4 xl:4 xxl:4" responsive="screen">
<n-grid-item v-for="(item, index) in list" :key="item.id">
<project-items-card
:cardData="item"
@preview="previewHandle"
@resize="resizeHandle"
@delete="deleteHandle(item)"
@release="releaseHandle(item, index)"
@copy="copyHandle(item)"
@edit="editHandle"
></project-items-card>
</n-grid-item>
</n-grid>
</div>
<!-- 分页 -->
<div class="list-pagination">
<n-pagination
:item-count="10"
:page-sizes="[10, 20, 30, 40]"
:page="paginat.page"
:page-size="paginat.limit"
:item-count="paginat.count"
:page-sizes="[12, 24, 36, 48]"
@update:page="changePage"
@update:page-size="changeSize"
show-size-picker
/>
</div>
</div>
<!-- model -->
<project-items-modal-card
v-if="modalData"
v-model:modalShow="modalShow"
@@ -40,9 +53,8 @@ import { useModalDataInit } from './hooks/useModal.hook'
import { useDataListInit } from './hooks/useData.hook'
const { CopyIcon, EllipsisHorizontalCircleSharpIcon } = icon.ionicons5
const { list, deleteHandle } = useDataListInit()
const { modalData, modalShow, closeModal, resizeHandle, editHandle } =
useModalDataInit()
const { modalData, modalShow, closeModal, previewHandle, resizeHandle, editHandle } = useModalDataInit()
const { loading, paginat, list, changeSize, changePage, releaseHandle, copyHandle, deleteHandle } = useDataListInit()
</script>
<style lang="scss" scoped>
@@ -51,7 +63,7 @@ $contentHeight: 250px;
display: flex;
flex-direction: column;
justify-content: space-between;
min-height: calc(100vh - #{$--header-height} * 2 - 2px);
min-height: calc(100vh - #{$--header-height} - 40px - 2px);
.list-content {
position: relative;
height: $contentHeight;

View File

@@ -11,7 +11,7 @@
<n-space class="list-content-top go-px-0" justify="center">
<n-space>
<n-text>
{{ cardData?.title || '' }}
{{ cardData?.title || cardData?.id || '未命名' }}
</n-text>
</n-space>
</n-space>
@@ -26,9 +26,7 @@
<!-- 中间 -->
<div class="list-content-img">
<img
:src="
requireUrl('project/moke-20211219181327.png')
"
:src="cardData?.image"
:alt="cardData?.title"
/>
</div>
@@ -75,10 +73,11 @@
</template>
<script setup lang="ts">
import { reactive } from 'vue'
import { reactive, PropType } from 'vue'
import { renderIcon, renderLang } from '@/utils'
import { icon } from '@/plugins'
import { MacOsControlBtn } from '@/components/Tips/MacOsControlBtn'
import { Chartype } from '../../index.d'
const { HammerIcon } = icon.ionicons5
@@ -86,14 +85,9 @@ const emit = defineEmits(['close', 'edit'])
const props = defineProps({
modalShow: Boolean,
cardData: Object
cardData: Object as PropType<Chartype>
})
// 处理url获取
const requireUrl = (name: string) => {
return new URL(`../../../../../assets/images/${name}`, import.meta.url).href
}
const fnBtnList = reactive([
{
label: renderLang('global.r_edit'),
@@ -124,12 +118,14 @@ const closeHandle = () => {
<style lang="scss" scoped>
$padding: 30px;
$contentHeight: calc(80vh);
$imageHeight: calc(80vh - 110px);
$contentWidth: calc(82vw);
@include go('modal-box') {
width: $contentWidth;
height: $contentHeight;
.list-content {
margin-top: 28px;
margin-top: 20px;
border-radius: $--border-radius-base;
overflow: hidden;
@include background-image('background-point');
@@ -144,8 +140,9 @@ $contentWidth: calc(82vw);
}
&-img {
@extend .go-flex-center;
padding: 6px 0;
img {
max-height: $contentHeight;
height: $imageHeight;
min-height: 200px;
max-width: 100%;
@extend .go-border-radius;

View File

@@ -2,7 +2,10 @@ export type Chartype = {
id: number | string
title: string // 标题
label: string // 标签
release: boolean // 0未发布 | 1已发布
time: string, // 时间
image: string, // 预览图地址
createId: string, // 创建者
release: boolean // false 未发布 | true 已发布
}
export type ChartList = Chartype[]

View File

@@ -10,6 +10,6 @@ import { ProjectItemsList } from './components/ProjectItemsList'
<style lang="scss" scoped>
@include go(project-items) {
padding: 30px 20px;
padding: 20px 20px;
}
</style>

View File

@@ -18,7 +18,7 @@
:disabled="item.disabled"
v-for="item in typeList"
:key="item.key"
@click="btnHandle"
@click="btnHandle(item.key)"
>
<component :is="item.title"></component>
<template #icon>
@@ -35,10 +35,12 @@
</template>
<script lang="ts" setup>
import { watch, reactive } from 'vue'
import { watch } from 'vue'
import { icon } from '@/plugins'
import { PageEnum, ChartEnum } from '@/enums/pageEnum'
import { ResultEnum } from '@/enums/httpEnum'
import { fetchPathByName, routerTurnByPath, renderLang, getUUID } from '@/utils'
import { BackEndFactory } from '@/backend/ibackend'
const { FishIcon, CloseIcon } = icon.ionicons5
const { StoreIcon, ObjectStorageIcon } = icon.carbon
@@ -48,7 +50,7 @@ const props = defineProps({
show: Boolean
})
const typeList = reactive([
const typeList = [
{
title: renderLang('project.new_project'),
key: ChartEnum.CHART_HOME_NAME,
@@ -67,7 +69,7 @@ const typeList = reactive([
icon: StoreIcon,
disabled: true
}
])
]
// 解决点击模态层不会触发 @on-after-leave 的问题
watch(props, newValue => {
@@ -82,11 +84,32 @@ const closeHandle = () => {
}
// 处理按钮点击
const btnHandle = (key: string) => {
closeHandle()
const id = getUUID()
const path = fetchPathByName(ChartEnum.CHART_HOME_NAME, 'href')
routerTurnByPath(path, [id], undefined, true)
const btnHandle = async (key: string) => {
switch (key) {
case ChartEnum.CHART_HOME_NAME:
try {
// 新增项目
const res = await BackEndFactory.createProject({
// 项目名称
projectName: getUUID(),
// remarks
remarks: null,
// 图片地址
indexImage: null,
}) as any
if(res.code === ResultEnum.SUCCESS) {
window['$message'].success(window['$t']('project.create_success'))
const { id } = res.data
const path = fetchPathByName(ChartEnum.CHART_HOME_NAME, 'href')
routerTurnByPath(path, [id], undefined, true)
closeHandle()
}
} catch (error) {
window['$message'].error(window['$t']('project.create_failure'))
}
break;
}
}
</script>
<style lang="scss" scoped>

View File

@@ -0,0 +1,35 @@
<template>
<div class="go-redirect-un-publish">
<div class="text-center">
<img src="~@/assets/images/exception/nodata.svg" alt="" />
</div>
<div class="text-center">
<h1>当前项目暂未发布</h1>
</div>
</div>
</template>
<style lang="scss" scoped>
@include go(redirect-un-publish) {
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
width: 100vw;
height: 100vh;
overflow: hidden;
padding: 100px 0;
@include background-image('background-image');
.text-center {
h1 {
color: #666;
padding: 20px 0;
}
}
img {
width: 350px;
margin: 0 auto;
}
}
</style>

7
types/global.d.ts vendored
View File

@@ -9,4 +9,11 @@ interface Window {
$KeyboardActive?: { [T: string]: boolean }
}
declare interface MyResponseType {
code: number;
msg: string;
data: any;
}
declare type Recordable<T = any> = Record<string, T>

2
types/vite-env.d.ts vendored
View File

@@ -1,8 +1,6 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
// 标题
VITE_GLOB_APP_TITLE: string;
// 端口
VITE_DEV_PORT: string;
// 开发地址

View File

@@ -1,8 +1,9 @@
import { defineConfig } from 'vite'
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import { OUTPUT_DIR, brotliSize, chunkSizeWarningLimit, terserOptions, rollupOptions } from './build/constant'
import viteCompression from 'vite-plugin-compression'
import { axiosPre } from './src/settings/httpSetting'
import { viteMockServe } from 'vite-plugin-mock'
import monacoEditorPlugin from 'vite-plugin-monaco-editor'
@@ -10,8 +11,8 @@ function pathResolve(dir: string) {
return resolve(process.cwd(), '.', dir)
}
export default defineConfig({
base: '/',
export default ({ mode }) => defineConfig({
base: process.env.NODE_ENV === 'production' ? './' : '/',
// 路径重定向
resolve: {
alias: [
@@ -35,6 +36,21 @@ export default defineConfig({
}
}
},
// 开发服务器配置
server: {
host: true,
open: true,
port: 3000,
proxy: {
[axiosPre]: {
// @ts-ignore
target: loadEnv(mode, process.cwd()).VITE_DEV_PATH,
changeOrigin: true,
ws: true,
secure: true,
}
}
},
plugins: [
vue(),
monacoEditorPlugin({