Compare commits

...

294 Commits

Author SHA1 Message Date
奔跑的面条
1a00993ee8 Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-08-19 14:46:49 +08:00
奔跑的面条
177fa6bfbe fix: 处理注册之后,位置错误的问题 2022-08-19 14:44:40 +08:00
奔跑的面条
cb7e887c36 fix: 补充代码合并丢失的枚举 2022-08-19 11:43:23 +08:00
奔跑的面条
255b14a597 perf: 优化500错误页重定向 2022-08-19 11:34:38 +08:00
奔跑的面条
3f462c1bee feat: 合并多选功能,解决冲突,升级版本到2.0.4 2022-08-19 10:44:44 +08:00
奔跑的面条
a6d1baec3e fix: 解决动态变更颜色,部分组件不会更新的问题 2022-08-19 10:02:09 +08:00
奔跑的面条
8ddc85738a perf: 优化拖拽的节流大小 2022-08-18 22:45:30 +08:00
奔跑的面条
52c1eabf1e feat: 新增框选功能 2022-08-18 22:41:34 +08:00
奔跑的面条
6cd30283e7 fix: 解决对其线消失的bug 2022-08-18 22:16:23 +08:00
奔跑的面条
2380c6ec60 fix: 修改快捷键说明 2022-08-18 20:40:18 +08:00
奔跑的面条
f02e92a58e feat: 新增页面框选效果 2022-08-18 20:30:02 +08:00
奔跑的面条
a54a007c5a build: 升级版本到1.0.7 2022-08-17 18:02:13 +08:00
奔跑的面条
2ad3677fdc perf: 优化层级中分组的右键功能 2022-08-17 17:56:20 +08:00
奔跑的面条
d09d1b96be style: 修改代码样式 2022-08-17 17:49:04 +08:00
奔跑的面条
e4e1fee8b4 Merge branch 'dev-feat-multi-select' of https://gitee.com/MTrun/go-view into dev 2022-08-17 17:12:38 +08:00
奔跑的面条
e348caaa0c feat: 处理数据导入,ID更新的可控功能 2022-08-17 16:56:58 +08:00
奔跑的面条
1ee76efeb8 fix: 处理分组前进后退的问题 2022-08-17 16:18:00 +08:00
奔跑的面条
716379fc9f fix: 处理无数据删除会报错的bug 2022-08-16 21:06:55 +08:00
奔跑的面条
01c2a20a0f feat: 新增多选的历史记录处理 2022-08-16 20:41:41 +08:00
奔跑的面条
4c353136d5 fix: 处理历史记录无法展示多组件的bug 2022-08-15 20:39:30 +08:00
奔跑的面条
c293c43862 fix: 处理层级右键拖拽的问题 2022-08-15 20:11:04 +08:00
奔跑的面条
45dcd1885d style: 优化枚举代码 2022-08-15 17:37:16 +08:00
奔跑的面条
a4690c21cf feat: 新增多选删除功能 2022-08-15 16:50:52 +08:00
奔跑的面条
0ca908c8d5 feat: 新增多选组件同时移动 2022-08-15 16:19:36 +08:00
奔跑的面条
e40a1f87f9 style: 修改注释写反的问题 2022-08-15 14:42:31 +08:00
奔跑的面条
09ebd67c37 fix: 处理 TS 报错 2022-08-15 11:43:32 +08:00
奔跑的面条
bad7e37f5a fix: 修复右键会出现对其线条的bug 2022-08-14 14:19:21 +08:00
奔跑的面条
99b344bdef feat: 处理层级区域分组右键,多选等 2022-08-14 02:36:48 +08:00
奔跑的面条
3b7f9e5dec fix: 处理右键不统一的问题 2022-08-14 01:04:03 +08:00
奔跑的面条
2928eaa4ae fix: 修改右键类型操作 2022-08-14 00:20:21 +08:00
奔跑的面条
77ef4c05b9 fix: 处理层级右键多选的问题 2022-08-13 18:38:36 +08:00
奔跑的面条
f55a2b94e7 feat: 处理分组与其它单组件/分组之间的成组 2022-08-12 21:41:42 +08:00
奔跑的面条
5fba293245 fix: 处理ts类型错误 2022-08-12 20:46:17 +08:00
奔跑的面条
e380ead651 fix: 处理分组预览和动态引入的问题 2022-08-12 20:39:20 +08:00
奔跑的面条
57798b9000 fix: 处理分组编辑会选择数据上的问题 2022-08-12 17:09:28 +08:00
奔跑的面条
eb774f9d41 docs: 修改 readme 图片展示 2022-08-10 16:05:34 +08:00
奔跑的面条
e2a0478357 fix: 新增分组的动画 2022-08-10 16:01:46 +08:00
奔跑的面条
0bd5587e65 perf: 处理分组属性的展示 2022-08-09 21:08:25 +08:00
奔跑的面条
96d8cb0006 perf: 处理注册时的分组场景 2022-08-09 21:06:09 +08:00
奔跑的面条
b0e4383a43 feat: 新增多选快捷键处理 2022-08-09 20:12:44 +08:00
奔跑的面条
5cadcc8259 feat: 新增多选的右键处理 2022-08-09 19:50:03 +08:00
奔跑的面条
fbc689b235 feat: 新增解除组件还原位置 2022-08-08 00:02:58 +08:00
奔跑的面条
0779aeca6a feat: 新增多选的选中框 2022-08-07 17:24:05 +08:00
奔跑的面条
9aca371e9c perf: 新增异常兜底处理 2022-08-06 18:21:50 +08:00
奔跑的面条
9ea4858770 feat: 处理分组展示,多选右键展示 2022-08-06 18:16:48 +08:00
奔跑的面条
d7b74ed90d feat: 新增成组,解组,图层处理 2022-08-06 17:20:56 +08:00
奔跑的面条
ffb6b2f68c fix: 新增 isGroup 标识 2022-08-06 13:04:25 +08:00
奔跑的面条
4d560ab937 fix: 新增多选的全部列表添加, 结构设计 2022-08-05 21:12:05 +08:00
奔跑的面条
857f811685 fix: 处理右键多选的问题 2022-08-05 10:58:46 +08:00
奔跑的面条
0bce64c867 Merge branch 'dev' into dev-feat-multi-select 2022-08-05 08:42:47 +08:00
奔跑的面条
cacc99683d Merge branch 'dev' into master-fetch 2022-08-05 08:42:22 +08:00
奔跑的面条
0998fc5376 fix: 处理预览背景图展示问题 2022-08-05 08:32:21 +08:00
奔跑的面条
d3a9f7d60f Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-07-26 16:12:31 +08:00
奔跑的面条
ba52c55158 fix: 修改背景图覆盖不全的问题 2022-07-26 15:35:23 +08:00
奔跑的面条
27d78c6b4d perf: 修改错误单词 2022-07-21 14:38:32 +08:00
奔跑的面条
8d4dd3160d Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-07-21 11:46:54 +08:00
奔跑的面条
1b68c39d5d fix: 处理打包 ts 类型错误 2022-07-21 11:43:42 +08:00
奔跑的面条
6847f7d966 feat: 合并 1.0.6 版本代码 2022-07-21 11:03:04 +08:00
奔跑的面条
8c01974494 build: 升级版本到 1.0.6 2022-07-21 10:35:16 +08:00
奔跑的面条
c74322e783 fix: 解决编辑器失焦报错的问题 2022-07-21 10:33:41 +08:00
奔跑的面条
b7d8225dbd style: 去除多余icon代码 2022-07-20 21:44:48 +08:00
奔跑的面条
48e9165483 perf: 去除全局设置中的数据配置 2022-07-20 21:44:17 +08:00
奔跑的面条
b37c8114d8 fix: 解决预览请求错误问题 2022-07-20 21:30:32 +08:00
奔跑的面条
997790e653 perf: 修改tag的圆角 2022-07-20 21:10:04 +08:00
奔跑的面条
3b12503e77 fix: 修改数据内容二次过滤的问题 2022-07-20 20:55:45 +08:00
奔跑的面条
f6d605da62 perf: 修改复制提示 2022-07-20 20:42:24 +08:00
奔跑的面条
35fda2b9a9 fix: 解决组件聚焦数据就会报错的问题 2022-07-20 20:34:28 +08:00
奔跑的面条
2d76991d27 perf: 修改输入URL的文案 2022-07-20 20:09:22 +08:00
奔跑的面条
c9b2fc2674 fix: 去除 status校验 2022-07-20 18:36:22 +08:00
奔跑的面条
6c65e419e2 fix: 修复请求间隔问题 2022-07-20 18:14:11 +08:00
奔跑的面条
288bb264e0 perf: 修改编辑文字说明 2022-07-20 12:57:04 +08:00
奔跑的面条
33a741ca0e Merge branch 'dev-feat-request' of https://gitee.com/MTrun/go-view into dev 2022-07-20 12:26:15 +08:00
奔跑的面条
5f80fa8aa4 feat: 完成自定义请求功能 2022-07-20 12:19:24 +08:00
奔跑的面条
506412175e style: 删除多余文件 2022-07-19 19:11:30 +08:00
奔跑的面条
06c3765d9d style: 修改注释 2022-07-19 17:54:43 +08:00
奔跑的面条
66f22551c4 build: 升级axios版本到0.27.2 2022-07-19 17:53:04 +08:00
奔跑的面条
d30f60a972 !26 小组件数字翻牌颜色前缀变量绑定错修复
Merge pull request !26 from daidai/dev
2022-07-17 14:01:16 +00:00
奔跑的面条
bf69ba91d5 style: 新增自定义http函数定义 2022-07-17 21:51:28 +08:00
奔跑的面条
15ff1d2912 perf: 优化请求展示区域 2022-07-16 21:02:32 +08:00
奔跑的面条
740f471ff4 feat: 处理请求展示的位置 2022-07-16 20:57:01 +08:00
奔跑的面条
d1de5f0c4c perf: 全局内容默认不展示 2022-07-16 19:01:53 +08:00
奔跑的面条
f178b0e0ca feat: 新增全局请求数据处理 2022-07-16 19:01:05 +08:00
奔跑的面条
d4bfdd1e91 feat: 新增请求编辑页面 2022-07-15 00:11:42 +08:00
wei
539db3c56b fix: 小组件数字翻牌颜色前缀问题 2022-07-13 15:01:43 +08:00
奔跑的面条
2ac2d79966 !24 docs: update README
Merge pull request !24 from daidai/dev
2022-07-13 06:14:04 +00:00
wei
4db0ba4714 docs: update README 2022-07-13 11:06:42 +08:00
wei
6b0df75357 docs: update README 2022-07-13 11:00:14 +08:00
奔跑的面条
e9c2ca0989 feat: 编写请求配置页 2022-07-11 09:01:19 +08:00
奔跑的面条
35204898fc Merge branch 'dev' into master-fetch 2022-07-08 18:12:33 +08:00
奔跑的面条
bb32edf264 Merge branch 'dev' 2022-07-08 18:11:26 +08:00
奔跑的面条
db00fcf372 Merge branch 'dev' into dev-feat-multi-select 2022-07-08 18:08:58 +08:00
奔跑的面条
801f6e8d18 feat: 新增组件更新单独设置功能 2022-07-08 17:53:52 +08:00
奔跑的面条
88abcf8a4a feat: 新增组件单独请求时间配置 2022-07-08 11:45:39 +08:00
奔跑的面条
410dc4fc58 style: 修改请求键名 data 为 request 2022-07-08 11:43:49 +08:00
奔跑的面条
ddee396cea Merge branch 'dev' into dev-feat-multi-select 2022-07-07 19:56:12 +08:00
奔跑的面条
7fe743d624 fix: 合并编辑功能的修改 2022-07-07 19:54:53 +08:00
奔跑的面条
2cb65c623e Merge branch 'dev' 2022-07-07 19:45:30 +08:00
奔跑的面条
f612b62b0a perf: 优化编辑器内容 2022-07-07 19:42:35 +08:00
奔跑的面条
84fd1b2181 Merge branch 'dev' into dev-feat-multi-select 2022-07-07 13:15:13 +08:00
奔跑的面条
6a285f610c Merge branch 'dev' into master-fetch 2022-07-07 13:14:53 +08:00
奔跑的面条
ce925e0f45 Merge branch 'dev' 2022-07-07 13:14:02 +08:00
奔跑的面条
67da33931a perf: 优化编辑器按钮展示 2022-07-07 13:13:26 +08:00
奔跑的面条
a4c0450f7a fix: 补充合并代码丢失的icon图标 2022-07-06 22:12:24 +08:00
奔跑的面条
a81f016e3f build: 合并dev 1.0.5 版本, 修改fetch分支为2.0.2 2022-07-06 21:58:28 +08:00
奔跑的面条
a58eb4a53c Merge branch 'dev' into dev-feat-multi-select 2022-07-06 21:51:11 +08:00
奔跑的面条
3f3caae4fc Merge branch 'dev' 2022-07-06 21:49:05 +08:00
奔跑的面条
417821b72d style: 还原请求间隔 2022-07-06 21:48:41 +08:00
奔跑的面条
b1ae4c3712 build: 升级版本到1.0.5 2022-07-06 21:42:24 +08:00
奔跑的面条
0705fb8b0f Merge branch 'dev' 2022-07-06 21:41:56 +08:00
奔跑的面条
6a90d1a043 perf: 优化编辑器的页面 2022-07-06 20:48:59 +08:00
奔跑的面条
74e30390cf fix: 解决过滤器的错误处理 2022-07-06 20:14:41 +08:00
奔跑的面条
4ba3d8803a style: 去除环形图多余引入 2022-07-06 17:25:59 +08:00
奔跑的面条
f53f4d57f2 perf: 修改数据展示为动态获取 2022-07-06 17:18:38 +08:00
奔跑的面条
33d78ffcda fix: 解决编辑器不能正常执行worker的问题 2022-07-06 14:40:35 +08:00
奔跑的面条
9e6873e1da fix: 解决编辑器的问题 2022-07-06 14:13:27 +08:00
奔跑的面条
47f6fc87c7 feat: 新增动态接口过滤器功能 2022-07-05 21:44:16 +08:00
奔跑的面条
2ee2783a9c style: 修改单词拼写错误 2022-06-29 09:55:44 +08:00
奔跑的面条
3a066fc9bb feat: 新增组件多选和右键成组按钮 2022-06-28 21:57:29 +08:00
奔跑的面条
ee5fed4cd0 Merge branch 'dev' into master-fetch 2022-06-27 21:42:24 +08:00
奔跑的面条
16b703f317 Merge branch 'dev' 2022-06-27 21:42:06 +08:00
奔跑的面条
3537427846 fix: 修改数字翻牌错误 2022-06-27 21:41:48 +08:00
奔跑的面条
3fb0fe43bb Merge branch 'dev' into master-fetch 2022-06-27 21:38:27 +08:00
奔跑的面条
8693a11a32 Merge branch 'dev' 2022-06-27 21:36:37 +08:00
奔跑的面条
2259545094 feat: 新增 X轴 / Y轴 字体大小、单位编辑 2022-06-27 21:35:27 +08:00
奔跑的面条
f1f5f9cca9 fix: 修改合并冲突错误的代码 2022-06-27 20:42:17 +08:00
奔跑的面条
2ce17c3974 perf: 合并dev分支,解决组件无法更新数据的问题 2022-06-27 20:37:26 +08:00
奔跑的面条
e09d014fa6 Merge branch 'dev' 2022-06-27 20:28:56 +08:00
奔跑的面条
8c74b8e8df fix: 修改NaiveUI环形组件图片 2022-06-27 20:26:54 +08:00
奔跑的面条
c3b6bcec65 fix: 解决组件数据无法更新的问题 2022-06-27 20:26:24 +08:00
奔跑的面条
633bf987ab fix: 修改图片组件不能动态更新的问题 2022-06-26 15:35:40 +08:00
奔跑的面条
bf1b81e554 feat: 新增图片 mock 地址 2022-06-26 15:26:57 +08:00
奔跑的面条
729021f37c docs: update README 2022-06-26 15:11:52 +08:00
奔跑的面条
bde2634ef3 feat: 添加组件的框架属性分类 2022-06-25 20:55:41 +08:00
奔跑的面条
d6da6f759d fix: 解决环形组件不会自动更新的问题 2022-06-25 20:34:50 +08:00
奔跑的面条
32f851e57b perf: 修改请求hook逻辑 2022-06-25 20:29:42 +08:00
奔跑的面条
30e7e7ab7c feat: 添加组件分类标识 2022-06-25 17:44:21 +08:00
奔跑的面条
cfa69baaa3 style: 去除多余代码 2022-06-25 17:30:46 +08:00
奔跑的面条
78626b3c04 perf: 优化获取数据 hooks 函数 2022-06-25 17:03:03 +08:00
奔跑的面条
340492f784 fix: 解决渐变文本不能换行的问题 2022-06-25 15:52:04 +08:00
奔跑的面条
6cecbb6ec2 feat: 新增进度条多个配置项 2022-06-25 15:51:38 +08:00
奔跑的面条
665ebd7b17 feat: 新增mock接口 2022-06-25 15:51:03 +08:00
奔跑的面条
c07d7c7c28 style: 修改错误备注 2022-06-25 11:18:04 +08:00
奔跑的面条
1d7e40950f style: 去除多余代码 2022-06-24 11:44:26 +08:00
奔跑的面条
91bda457e7 docs: 修改文档 2022-06-23 09:53:01 +08:00
奔跑的面条
68aeea70cf feat: 新增保存按钮 2022-06-22 18:50:15 +08:00
奔跑的面条
a0c8bc7fe5 feat: 新增键盘按键记录功能 2022-06-22 14:31:53 +08:00
奔跑的面条
0f73536ce0 feat: 新增多选中的前置处理,选中存储对象修改成数组形式 2022-06-21 17:39:16 +08:00
奔跑的面条
455e387a62 style: 去除多余代码 2022-06-21 11:01:01 +08:00
奔跑的面条
99467f87ff style: 修改错误单词 2022-06-21 10:54:05 +08:00
奔跑的面条
f7d3a0b499 perf: 修改导入合并代码位置,优化结构 2022-06-20 15:35:03 +08:00
奔跑的面条
7a19346700 build: 升级依赖 2022-06-20 15:13:50 +08:00
奔跑的面条
8d2269df78 build: 合并dev分支 2022-06-20 15:11:13 +08:00
奔跑的面条
1c54b81212 perf:优化http请求代码 2022-06-20 14:35:19 +08:00
奔跑的面条
b133cbdfea feat: 新增排名列表字体大小控制功能 2022-06-17 14:13:14 +08:00
奔跑的面条
6d6fa04a4b docs: 更新 READE.ME 图表说明 2022-06-17 14:11:13 +08:00
奔跑的面条
954de6d58b fix: 解决滚动排名列表预览之后数据无法变更的问题 2022-06-17 11:42:57 +08:00
奔跑的面条
a0ecfa7264 feat: 新增滚动排名列表增加设置字体大小配置
Merge pull request !21 from 王志强/master
2022-06-17 01:25:36 +00:00
wangzhiqiang
54f9c065c8 滚动排名列表增加设置字体大小配置 2022-06-16 14:57:34 +08:00
奔跑的面条
f45d4ca5af build: 修改版本到 2.0.1 2022-06-16 10:48:42 +08:00
奔跑的面条
b8705c4f31 build: 修改版本号到1.0.4 2022-06-16 10:47:23 +08:00
奔跑的面条
d96e7f71d7 fix: 解决打包之后无法加载页面的问题 2022-06-15 17:54:49 +08:00
奔跑的面条
24fee76237 feat: 新增 preview 模式,修改打包后路径指向 2022-06-15 17:48:16 +08:00
奔跑的面条
588cc380cd fix: 解决 login 背景打包后消失的问题 2022-06-15 17:36:06 +08:00
奔跑的面条
5eca551271 feat: 新增 preview 模式 2022-06-15 17:30:24 +08:00
奔跑的面条
d59193bc33 feat: 新增commitlint 2022-06-15 17:18:39 +08:00
奔跑的面条
6928a70d9f docs: 更新文档 2022-06-15 17:15:29 +08:00
奔跑的面条
e0796280f5 doc: 文档更新 2022-06-15 17:14:27 +08:00
奔跑的面条
5522837b00 feat: 新增 commitlint,修改部分规则 2022-06-15 17:09:40 +08:00
奔跑的面条
5d803e3fa6 feat: 新增渐变文本组件 2022-06-15 16:20:25 +08:00
奔跑的面条
29fd85254b docs: 修改说明文档 2022-06-15 16:15:49 +08:00
奔跑的面条
749c0a2f39 build:升级依赖 2022-06-15 16:11:58 +08:00
奔跑的面条
737504cef5 fix: 解决npm,yarn 安装依赖报错的问题 2022-06-15 16:08:59 +08:00
奔跑的面条
61af1674b9 fix: 修改npm,yarn打包问题,升级依赖文件 2022-06-15 16:01:31 +08:00
奔跑的面条
d8ccff8de5 fix: 解决 npm ,yarn 安装依赖报错的问题 2022-06-15 15:45:55 +08:00
奔跑的面条
e29c427f8d chore: 优化渐变文本展示图 2022-06-15 09:46:53 +08:00
Ryker
b8d0d1a2ff feat: 新增信息-文字-新增【渐变文字】组件
feat: 新增信息-文字-新增【渐变文字】组件
2022-06-15 01:43:07 +00:00
奔跑的面条
8115950893 fix: 补充丢失的图片 2022-06-14 12:46:07 +08:00
奔跑的面条
f458a21a2f feat:新增数字滚动组件动态获取数据功能 2022-06-14 12:31:46 +08:00
奔跑的面条
13a9675894 feat: 新增表格滚动组件 2022-06-14 12:31:20 +08:00
奔跑的面条
77b5a41af9 fix:解决边框04展示不全的bug 2022-06-14 12:30:29 +08:00
奔跑的面条
ffa127593a fix: 修改滚动表格组件TS报错问题 2022-06-14 12:14:44 +08:00
奔跑的面条
f9c17c732a Merge pull request !19 from 王志强/master 2022-06-14 03:27:49 +00:00
wangzhiqiang
427c5589b2 修改小组件边框-04下边框缺失bug 2022-06-14 11:02:58 +08:00
王志强
b618f9e865 新增滚动列表
新增滚动列表
2022-06-14 02:46:52 +00:00
wangzhiqiang
2182c7d34a Merge branch 'master' of https://gitee.com/assxy/go-view 2022-06-14 09:13:28 +08:00
wangzhiqiang
9482e9aba3 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
奔跑的面条
6d5651fd1d !17 fit: 数字翻牌-动态数据
Merge pull request !17 from Ryker/number
2022-06-14 01:02:55 +00:00
13050022537
c195b69003 添加滚动列表 2022-06-13 20:51:15 +08:00
wangzhiqiang
8216cd7604 增加轮播表--未完成 2022-06-13 20:51:12 +08:00
ryker
8d691f2d69 数字翻牌动态数据 2022-06-13 18:04:01 +08:00
奔跑的面条
09d8c58e73 style: 优化水球图代码结构 2022-06-13 17:30:17 +08:00
奔跑的面条
2bf895ad3d feat:新增水球图设置项 2022-06-13 17:29:39 +08:00
Ryker
0823bf1d9c feat:新增水球图的形状、文字大小配置
水球图的形状、文字大小配置
2022-06-13 09:09:28 +00:00
奔跑的面条
6a5abd6762 fix: 修改列表页展示问题 2022-06-13 14:28:58 +08:00
奔跑的面条
5cb458c45b feat: 新增环形图,新增NaiveUI-进度组件 2022-06-13 13:18:30 +08:00
王志强
43e8b9939b feat:小组件-数字翻牌-增加精度参数
小组件-数字翻牌-增加精度参数
2022-06-13 05:12:24 +00:00
奔跑的面条
c792482c60 chore: 优化进度条组件内容 2022-06-13 13:05:41 +08:00
奔跑的面条
e48ca421d8 chore: 优化【饼图-环形】展示图 2022-06-13 12:02:43 +08:00
alex
ac23d4c8dc feat: PieCircle
新增饼图环形
2022-06-13 03:59:29 +00:00
wangzhiqiang
68b49ea710 小组件-数字翻牌-增加精度参数 2022-06-13 11:55:13 +08:00
wangzhiqiang
99287497cc Merge branch 'master' of https://gitee.com/MTrun/go-view 2022-06-13 09:07:13 +08:00
奔跑的面条
f828c48ab6 feat: 新增进度条组件 2022-06-12 18:47:47 +08:00
奔跑的面条
2626bc794f fix: 解决缩放比例展示不全的问题 2022-06-12 18:45:31 +08:00
奔跑的面条
70f9df7650 fix: 解决缩放比例展示不全的问题 2022-06-12 18:44:53 +08:00
奔跑的面条
8b39ec2773 style: 优化进度条组件 2022-06-12 18:25:44 +08:00
奔跑的面条
eafbcb2cde 新增Naive UI 进度条
Merge pull request !11 from alex/chart
2022-06-12 09:39:08 +00:00
alex li
f8f5bc7688 添加naive ui的进度条 2022-06-11 23:53:01 +08:00
wangzhiqiang
0335b379ea Merge branch 'master' of https://gitee.com/MTrun/go-view 2022-06-11 15:54:23 +08:00
奔跑的面条
734dd68607 chore: 优化拖拽锚点 2022-06-11 15:15:38 +08:00
奔跑的面条
3c221345dd chore: 优化拖拽锚点 2022-06-11 15:09:42 +08:00
wangzhiqiang
13bcf3c649 修改gitgnore 2022-06-11 15:05:21 +08:00
奔跑的面条
19f53f705c fix:修改请求地址为null时引起的异常bug 2022-06-11 14:37:22 +08:00
奔跑的面条
58fee4a86f fix:修改请求地址为null时引起的异常bug 2022-06-11 14:36:19 +08:00
奔跑的面条
b93caf1386 chore: 优化发布弹窗 2022-06-11 14:23:16 +08:00
奔跑的面条
aa613e2805 build: 依赖基本升级 2022-06-11 14:15:28 +08:00
奔跑的面条
616584fc19 fix: 修改双折线图X轴无法变更的问题 2022-06-11 14:13:32 +08:00
奔跑的面条
a22e4b814b fix: 修改双折线图X轴无法变化的问题 2022-06-11 14:08:25 +08:00
奔跑的面条
c249c120c1 build: 升级NaiveUI到2.30.3 2022-06-11 14:03:41 +08:00
奔跑的面条
c8d016e1b4 Merge branch 'master' into dev 2022-06-10 16:28:07 +08:00
奔跑的面条
2e6d87ab80 update README.md. 2022-06-10 08:27:34 +00:00
奔跑的面条
5c07885a4e fix: 解决列表页布局问题 2022-06-09 09:07:39 +08:00
奔跑的面条
5f8db36888 fix: 解决列表页布局错误问题 2022-06-09 09:00:39 +08:00
奔跑的面条
ce34a7ed2a fix: 解决导出图片白边的问题 2022-06-09 08:59:36 +08:00
奔跑的面条
a5e83bfe9f fix: 解决项目列表信息栏会换行的问题 2022-06-09 08:49:07 +08:00
奔跑的面条
1252d266dd fix:解决截图有白边的问题 2022-06-09 08:48:28 +08:00
奔跑的面条
3c820d53a6 fix: 修改复制失败的提示类型错误的问题 2022-06-06 10:43:14 +08:00
奔跑的面条
f0525c7522 chore: 新增路由白名单 2022-06-06 10:42:55 +08:00
奔跑的面条
600f1b2dd2 chore:优化搜索结果列表UI 2022-06-05 11:41:57 +08:00
奔跑的面条
b3422eaede chore: 优化搜索结果列表UI 2022-06-05 11:40:32 +08:00
奔跑的面条
757b79514a chore:优化 dialog 的全局封装代码 2022-06-04 16:25:37 +08:00
奔跑的面条
8b57ffa124 chore: 修改发布文案提示,修改 dialog 全局封装 2022-06-04 16:17:11 +08:00
奔跑的面条
cf8121eb00 build:修改 fetch 版本号 2022-06-04 15:44:26 +08:00
奔跑的面条
faf2d44fbb chore: 优化页面 UI 2022-06-03 20:21:35 +08:00
奔跑的面条
dcbaf37a69 Merge branch 'dev' 2022-06-03 20:11:07 +08:00
奔跑的面条
741ba1a039 style: 优化类名,页面UI细节 2022-06-03 20:10:52 +08:00
奔跑的面条
80176e5737 docs: 更新md说明 2022-06-03 19:56:03 +08:00
奔跑的面条
88516d9491 fix: 修改自动复制粘贴的问题 2022-06-03 18:53:37 +08:00
奔跑的面条
88dbbe03ea fix: 新增发布页面处理 2022-06-03 14:48:58 +08:00
奔跑的面条
ae1fd2e7cf chore: 优化了标题展示和大小样式 2022-06-03 11:19:29 +08:00
奔跑的面条
d3931f47bc type: 修改类型错误 2022-06-01 23:00:28 +08:00
奔跑的面条
bf9bd59b63 fix:处理列表页标题过长的展示问题 2022-06-01 22:58:22 +08:00
奔跑的面条
fb0ff50837 type: 定义全局返回值类型 2022-06-01 22:41:11 +08:00
奔跑的面条
93727a0ac7 build: 修改版本号 0.0.9 2022-06-01 22:28:46 +08:00
奔跑的面条
2641e70c78 chore:优化了路由写法,修改了错误页面的展示,新增未发布提示页面 2022-06-01 22:20:05 +08:00
奔跑的面条
bc44584698 feat: 新增动态预览功能 2022-06-01 22:19:03 +08:00
奔跑的面条
82394dd7a3 fix: 修改组件注册会报错的问题 2022-06-01 22:14:33 +08:00
奔跑的面条
2e688ad686 build:升级依赖包 2022-06-01 22:13:49 +08:00
奔跑的面条
9b998e0c6d fix: 解决列表图片展示缓存问题 2022-06-01 20:16:38 +08:00
奔跑的面条
1045588301 fix: 解决获取数据,但是配置模块不完整的问题 2022-06-01 19:01:05 +08:00
奔跑的面条
ba86399fd3 build: 修改请求地址 2022-05-31 11:19:17 +08:00
奔跑的面条
a89164f885 fix: 修改oss接口不会动态更改的问题 2022-05-31 11:18:34 +08:00
奔跑的面条
7f2344c82c chore:修改请求地址 2022-05-29 16:04:07 +08:00
奔跑的面条
3c8e430533 docs: 修改文档说明 2022-05-29 15:23:04 +08:00
奔跑的面条
f7209fba53 feat: 新增背景图文件上传保存 2022-05-29 14:54:35 +08:00
奔跑的面条
9fae683d8b chore: 去除生成预览图时的标尺 2022-05-28 17:58:07 +08:00
奔跑的面条
79a2b98a1a feat: 新增首页预览图展示 2022-05-28 16:39:27 +08:00
奔跑的面条
98b28a631a Merge branch 'dev' into master-fetch 2022-05-28 15:58:06 +08:00
奔跑的面条
6fec64f515 fix: 修改自动保存预览图无法存储的问题 2022-05-28 15:46:07 +08:00
奔跑的面条
01d5890b35 branch: 合并锚点样式修改 2022-05-28 12:46:32 +08:00
奔跑的面条
fea583eb5b feat: 保存预览图 2022-05-28 11:50:17 +08:00
奔跑的面条
bfe5039a1c fix: 解决打包后无法发送请求的bug 2022-05-28 00:32:32 +08:00
奔跑的面条
7a57d944c8 feat: 新增上传文件接口 2022-05-27 20:09:48 +08:00
奔跑的面条
ca27e87241 chore: 修改项目信息结构 2022-05-27 11:49:25 +08:00
奔跑的面条
e674a1ece4 feat: 新增项目信息修改功能 2022-05-26 01:01:59 +08:00
奔跑的面条
dfb63346d3 fix: 修改导入组件id会重复的问题 2022-05-25 23:00:36 +08:00
奔跑的面条
4d899d48dc feat: 新增快捷键展示 2022-05-24 18:17:41 +08:00
奔跑的面条
fa3a3dfcb0 faet: 新增保存快捷键 2022-05-24 18:16:33 +08:00
奔跑的面条
e36210aa27 feat: 新增自动同步功能 2022-05-24 17:42:49 +08:00
奔跑的面条
20a599594c feat: 新增数据保存接口 2022-05-24 15:05:51 +08:00
奔跑的面条
70f8dbae53 Merge branch 'dev' into master-fetch 2022-05-24 12:28:14 +08:00
奔跑的面条
d8022b2682 feat: 新增获取项目数据功能,新增同步数据功能 2022-05-23 23:50:35 +08:00
奔跑的面条
0d7c5b8ace Merge branch 'dev' into master-fetch 2022-05-23 16:06:13 +08:00
奔跑的面条
88c9850c44 Merge branch 'dev' into master-fetch 2022-05-22 23:27:39 +08:00
奔跑的面条
f1ed62cdca feat: 新增获取项目数据接口 2022-05-22 22:11:56 +08:00
奔跑的面条
bfac86d5dd feat:新增发布和取消发布接口 2022-05-22 16:38:22 +08:00
奔跑的面条
341015c584 style: 调整代码格式,去除多余代码 2022-05-22 15:39:30 +08:00
奔跑的面条
7c5a66978e feat: 新增删除接口 2022-05-22 15:25:07 +08:00
奔跑的面条
b21fc3f5e7 feat: 新增首页列表接口 2022-05-22 15:06:45 +08:00
奔跑的面条
0e52628842 Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-05-22 14:09:38 +08:00
奔跑的面条
f7922cafa5 feat: 新增项目列表接口 2022-05-22 14:05:57 +08:00
奔跑的面条
8c5496829e Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-05-22 13:36:30 +08:00
奔跑的面条
8514f051a7 fix: 修改新建项目id错误问题 2022-05-21 21:04:10 +08:00
奔跑的面条
61feb29fe2 fix: 修改i18n错误提示 2022-05-21 19:46:44 +08:00
奔跑的面条
fa29881f04 chore: 修改提示内容 2022-05-21 18:04:52 +08:00
奔跑的面条
46cb8e7d0b feat: 新增创建接口,修改i8n部分内容 2022-05-21 18:03:15 +08:00
奔跑的面条
b6143bc75e feat: 新增退出登录接口,新增全局接口封装,修改登录接口内容 2022-05-21 17:31:01 +08:00
奔跑的面条
92e1ec05d2 Merge branch 'master' of https://gitee.com/MTrun/go-view into master-fetch 2022-05-21 14:01:53 +08:00
奔跑的面条
75f23bb1bf Merge branch 'dev' into master-fetch 2022-05-21 13:44:25 +08:00
奔跑的面条
5f5731f813 feat: 新增登录接口请求 2022-05-20 16:12:27 +08:00
奔跑的面条
55159be0dc fix: 修改plop的问题 2022-05-20 16:12:09 +08:00
奔跑的面条
0c4e1dc7ae Merge branch 'dev' of https://gitee.com/MTrun/go-view into master-fetch 2022-05-20 10:25:46 +08:00
奔跑的面条
b4abdeb246 update README.md. 2022-05-19 01:56:30 +00:00
奔跑的面条
7e61dda4aa update README.md. 2022-05-16 10:38:39 +00:00
奔跑的面条
283aafb27d update README.md. 2022-05-16 04:23:10 +00:00
214 changed files with 8716 additions and 2464 deletions

3
.commitlintrc.js Normal file
View File

@@ -0,0 +1,3 @@
module.exports = {
extends: ["@commitlint/config-conventional"]
};

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'

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@ node_modules
dist
dist-ssr
*.local
.vscode

4
.husky/commit-msg Normal file
View File

@@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx --no-install commitlint -e

View File

@@ -6,15 +6,20 @@ dev:
dist:
npm run build
view:
npm run preview
lint:
npm run lint
new:
npm run new
help:
@echo " make dev [npm run dev] 开发模式"
@echo " make dist [npm run build] 编译模式"
@echo " make view [npm run preview] 预览打包文件"
@echo " make new [npm run lint] 通过自动化流程创建代码"
@echo " make lint [npm run new] 格式校验"

176
README.md
View File

@@ -1,113 +1,127 @@
## 总览
![logo](readme/logo-t-y.png)
GoView 是一个高效的拖拽式低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可制作数据大屏,减少心智负担。当然低代码也不是 “银弹”,希望所有人员都能理智看待此技术。
**`master-fetch` 分支是带有后端接口请求的分支**
项目纯前端-Demo 地址:[https://www.mtruning.club](https://www.mtruning.club)
**后端项目地址:[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)**
项目带后端-Demo 地址(开发中~[后端 Demo 地址](http://1.117.240.165:8080/goview/#/login)
**接口说明地址:[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)**
文档-在线地址:[http://www.mtruning.club:81/](http://www.mtruning.club:81/)
## 使用
文档-源码地址:[https://gitee.com/MTrun/go-view-doc](https://gitee.com/MTrun/go-view-doc)
所有的接口地址位置:`src\api\path\*`
纯前端分支:`master`
接口地址修改:`.env`
携带后端请求分支: `master-fetch`
### 🤯 后端项目
技术点:
后端项目gitee地址[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)
- 框架:基于 `Vue3` 框架编写,使用 `hooks` 写法抽离部分逻辑,使代码结构更加清晰;
- 类型:使用 `TypeScript` 进行类型约束,减少未知错误发生概率,可以大胆修改逻辑内容;
- 性能:多处性能优化,使用页面懒加载、组件动态注册、数据滚动加载等方式,提升页面渲染速度;
- 存储:拥有本地记忆,部分配置项采用 `storage` 存储本地,提升使用体验;
- 封装:项目进行了详细的工具类封装如:路由、存储、加/解密、文件处理、主题、NaiveUI 全局方法、组件等
项目截图:
![项目截图](readme/goView-canvas.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 |
已完成图表:
| 分类 | 名称 | 名称 | 名称 |
| ------ | ---------------- | ---------- | ------ |
| 图表 | 柱状图 | 横向柱状图 | 折线图 |
| \* | 单/多 折线面积图 | 饼图 | 水球图 |
| 信息 | 文字 | 图片 | 😶 |
| 列表 | 滚动排名列表 | 🤠 | 🤓 |
| 小组件 | 边框-01~13 | 装饰-01~05 | 数字翻牌 |
## 浏览器支持
开发和测试平台均在 `Google` 和最新版 `EDGE` 上完成,暂未测试 `IE11` 等其它浏览器,如有需求请自行测试与兼容。
## 安装
本项目采用` pnpm` 进行包管理,经反馈若采用 `npm/yarn` 等方式安装依赖会导致错误,请使用 `pnpm` 安装依赖包。
接口说明地址:[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)
```shell
#pnpm建议使用nrm切换到淘宝源
pnpm install
# port
VITE_DEV_PORT = '8080'
# development path
VITE_DEV_PATH = 'http://127.0.0.1:8080'
# production path
VITE_PRO_PATH = 'http://127.0.0.1:8080'
```
## 启动
公共前缀修改:`src\settings\httpSetting.ts`
```shell
#pnpm
pnpm dev
# npm
npm run dev
#yarn
yarn dev
#Makefile
make dev
// 请求前缀
export const axiosPre = '/api/goview'
```
## 编译
接口封装:`src\api\http.ts`
```shell
#pnpm
pnpm run build
```ts
import axiosInstance from './axios'
import { RequestHttpEnum, ContentTypeEnum } from '@/enums/httpEnum'
# npm
npm run build
export const get = (url: string, params?: object) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.GET,
params: params,
})
}
#yarn
yarn run build
export const post = (url: string, data?: object, headersType?: string) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.POST,
data: data,
headers: {
'Content-Type': headersType || ContentTypeEnum.JSON
}
})
}
#Makefile
make dist
export const put = (url: string, data?: object, headersType?: string) => {
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.PUT:
return put
case RequestHttpEnum.DELETE:
return del
default:
return get
}
}
```
## 代码提交
* feat: 新功能
* fix: 修复 Bug
* docs: 文档修改
* perf: 性能优化
* revert: 版本回退
* ci: CICD集成相关
* test: 添加测试代码
* refactor: 代码重构
* build: 影响项目构建或依赖修改
* style: 不影响程序逻辑的代码修改
* chore: 不属于以上类型的其他类型(日常事务)
## 交流
QQ 群1030129384
![QQ群](readme/goView-QQ.png)
![QQ群](readme/go-view-qq.png)
![渲染海报](readme/logo-poster.png)

View File

@@ -1,4 +1,7 @@
export const OUTPUT_DIR = 'dist';
export const OUTPUT_DIR = 'dist'
// monaco-editor 路径
export const prefix = `monaco-editor/esm/vs`
// chunk 警告大小
export const chunkSizeWarningLimit = 2000
@@ -11,7 +14,14 @@ export const rollupOptions = {
output: {
chunkFileNames: 'static/js/[name]-[hash].js',
entryFileNames: 'static/js/[name]-[hash].js',
assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
manualChunks: {
jsonWorker: [`${prefix}/language/json/json.worker`],
cssWorker: [`${prefix}/language/css/css.worker`],
htmlWorker: [`${prefix}/language/html/html.worker`],
tsWorker: [`${prefix}/language/typescript/ts.worker`],
editorWorker: [`${prefix}/editor/editor.worker`]
}
}
}
@@ -22,4 +32,4 @@ export const terserOptions = {
drop_console: true,
drop_debugger: 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,34 +1,40 @@
{
"name": "go-view",
"version": "1.0.3",
"version": "2.0.4",
"scripts": {
"dev": "vite --host",
"build": "vue-tsc --noEmit && vite build",
"new": "plop --plopfile ./plop/plopfile.js"
"preview": "vite preview",
"new": "plop --plopfile ./plop/plopfile.js",
"postinstall": "husky install"
},
"dependencies": {
"@types/color": "^3.0.3",
"@types/crypto-js": "^4.1.1",
"@types/keymaster": "^1.6.30",
"animate.css": "^4.1.1",
"axios": "0.23.0",
"axios": "^0.27.2",
"color": "^4.2.3",
"crypto-js": "^4.1.1",
"echarts-liquidfill": "^3.1.0",
"highlight.js": "^11.5.0",
"html2canvas": "^1.4.1",
"keymaster": "^1.6.2",
"naive-ui": "^2.29.0",
"monaco-editor": "^0.33.0",
"naive-ui": "2.30.3",
"pinia": "^2.0.13",
"screenfull": "^6.0.1",
"vue": "^3.2.31",
"vue-i18n": "9.1.9",
"vue-demi": "^0.13.1",
"vue-i18n": "9.1.10",
"vue-router": "4.0.12",
"vue3-lazyload": "^0.2.5-beta",
"vue3-sketch-ruler": "^1.3.3",
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@commitlint/cli": "^17.0.2",
"@commitlint/config-conventional": "^17.0.2",
"@types/node": "^16.11.26",
"@typescript-eslint/eslint-plugin": "^5.18.0",
"@typescript-eslint/parser": "^5.18.0",
@@ -38,6 +44,7 @@
"@vitejs/plugin-vue-jsx": "^1.3.9",
"@vue/compiler-sfc": "^3.2.31",
"@vueuse/core": "^7.7.1",
"commitlint": "^17.0.2",
"default-passive-events": "^2.0.0",
"echarts": "^5.3.2",
"eslint": "^8.12.0",
@@ -45,6 +52,7 @@
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^8.5.0",
"husky": "^8.0.1",
"lodash": "~4.17.21",
"mockjs": "^1.1.0",
"plop": "^3.0.5",
@@ -56,6 +64,7 @@
"vite-plugin-compression": "^0.5.1",
"vite-plugin-importer": "^0.2.5",
"vite-plugin-mock": "^2.9.6",
"vite-plugin-monaco-editor": "^1.1.0",
"vue-echarts": "^6.0.2",
"vue-tsc": "^0.28.10"
}

2411
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
module.exports = {
printWidth: 80,
printWidth: 120,
tabWidth: 2,
useTabs: false,
singleQuote: true,
semi: false,
trailingComma: "es5",
trailingComma: "none",
bracketSpacing: true,
jsxSingleQuote: true,
jsxBracketSameLine: false,

View File

Before

Width:  |  Height:  |  Size: 398 KiB

After

Width:  |  Height:  |  Size: 398 KiB

BIN
readme/go-view-color.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

BIN
readme/go-view-fetch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

BIN
readme/go-view-filter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

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>

14
src/api/axios.config.ts Normal file
View File

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

View File

@@ -1,20 +1,37 @@
import axios, { AxiosResponse, AxiosRequestConfig } from 'axios'
import { ResultEnum } from "@/enums/httpEnum"
import { ErrorPageNameMap } from "@/enums/pageEnum"
import { redirectErrorPage } from '@/utils'
import { ResultEnum, RequestHttpHeaderEnum } 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.DEV ? import.meta.env.VITE_DEV_PATH : import.meta.env.VITE_PRO_PATH,
baseURL: `${import.meta.env.PROD ? import.meta.env.VITE_PRO_PATH : ''}${axiosPre}`,
timeout: ResultEnum.TIMEOUT,
})
axiosInstance.interceptors.request.use(
(config: AxiosRequestConfig) => {
config.headers = {}
// 白名单校验
if (includes(fetchAllowList, config.url)) return config
// 获取 token
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
// 重新登录
if (!info) {
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
return config
}
config.headers = {
...config.headers,
[RequestHttpHeaderEnum.TOKEN]: info[SystemStoreEnum.USER_INFO][SystemStoreUserInfoEnum.USER_TOKEN] || ''
}
return config
},
(error: AxiosRequestConfig) => {
Promise.reject(error)
(err: AxiosRequestConfig) => {
Promise.reject(err)
}
)
@@ -22,13 +39,31 @@ 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 (ErrorPageNameMap.get(code)) redirectErrorPage(code)
// 成功
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) => {
window['$message'].error('接口异常,请检查!')
httpErrorHandle()
Promise.reject(err)
}
)

View File

@@ -1,25 +1,45 @@
import axiosInstance from './axios'
import { RequestHttpEnum, ContentTypeEnum } from '@/enums/httpEnum'
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) => {
export const get = (url: string, params?: object) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.GET,
params: params,
})
}
export const post = (url: string, params: object, headersType?: string) => {
export const post = (url: string, data?: object, headersType?: string) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.POST,
data: params,
data: data,
headers: {
'Content-Type': headersType || ContentTypeEnum.JSON
}
})
}
export const put = (url: string, data?: object, headersType?: string) => {
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,
@@ -30,7 +50,7 @@ export const put = (url: string, data?: object, headersType?: string) => {
})
}
export const del = (url: string, params: object) => {
export const del = (url: string, params?: object) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.DELETE,
@@ -47,6 +67,9 @@ export const http = (type?: RequestHttpEnum) => {
case RequestHttpEnum.POST:
return post
case RequestHttpEnum.PATCH:
return patch
case RequestHttpEnum.PUT:
return put
@@ -57,3 +80,111 @@ export const http = (type?: RequestHttpEnum) => {
return get
}
}
/**
* * 自定义请求
* @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
}
// 处理头部
const headers: RequestParamsObjType = {
...globalRequestParams.Header,
...targetRequestParams.Header,
}
// data 参数
let data: RequestParamsObjType | FormData | string = {}
// params 参数
let params: RequestParamsObjType = targetRequestParams.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 = JSON.parse(targetRequestParams.Body['json'])
// json 赋值给 data
break
case RequestBodyEnum.XML:
headers['Content-Type'] = ContentTypeEnum.XML
// xml 字符串赋值给 data
data = 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, 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, bodyFormUrlencoded[i])
}
// FormData 赋值给 data
data = formData
break
}
// sql 处理
if (requestContentType === RequestContentTypeEnum.SQL) {
headers['Content-Type'] = ContentTypeEnum.JSON
data = requestSQLContent
}
return axiosInstance({
url: `${requestOriginUrl}${requestUrl}`,
method: requestHttpType,
data,
params,
headers
})
}

View File

@@ -4,27 +4,51 @@ import { RequestHttpEnum } from '@/enums/httpEnum'
// 单个X数据
export const chartDataUrl = '/mock/chartData'
export const rankListUrl = '/mock/RankList'
export const numberUrl = '/mock/number'
export const numberFloatUrl = '/mock/number/float'
export const numberIntUrl = '/mock/number/int'
export const textUrl = '/mock/text'
export const imageUrl = '/mock/image'
export const rankListUrl = '/mock/rankList'
export const scrollBoardUrl = '/mock/scrollBoard'
const mockObject: MockMethod[] = [
{
// 正则
// url: /\/mock\/mockData(|\?\S*)$/,
url: '/mock/chartData',
url: chartDataUrl,
method: RequestHttpEnum.GET,
response: () => test.fetchMockData,
response: () => test.fetchMockData
},
{
url: '/mock/rankList',
url: numberFloatUrl,
method: RequestHttpEnum.GET,
response: () => test.fetchRankList,
response: () => test.fetchNumberFloat
},
{
url: '/mock/number',
url: numberIntUrl,
method: RequestHttpEnum.GET,
response: () => test.fetchNumber,
response: () => test.fetchNumberInt
},
{
url: textUrl,
method: RequestHttpEnum.GET,
response: () => test.fetchText
},
{
url: imageUrl,
method: RequestHttpEnum.GET,
response: () => test.fetchImage(Math.round(Math.random() * 10))
},
{
url: rankListUrl,
method: RequestHttpEnum.GET,
response: () => test.fetchRankList
},
{
url: scrollBoardUrl,
method: RequestHttpEnum.GET,
response: () => test.fetchScrollBoard
}
]
export default mockObject

View File

@@ -10,35 +10,35 @@ export default {
{
product: '@name',
'dataOne|100-900': 3,
'dataTwo|100-900': 3,
'dataTwo|100-900': 3
},
{
product: '@name',
'dataOne|100-900': 3,
'dataTwo|100-900': 3,
'dataTwo|100-900': 3
},
{
product: '@name',
'dataOne|100-900': 3,
'dataTwo|100-900': 3,
'dataTwo|100-900': 3
},
{
product: '@name',
'dataOne|100-900': 3,
'dataTwo|100-900': 3,
'dataTwo|100-900': 3
},
{
product: '@name',
'dataOne|100-900': 3,
'dataTwo|100-900': 3,
'dataTwo|100-900': 3
},
{
product: '@name',
'dataOne|100-900': 3,
'dataTwo|100-900': 3,
},
],
},
'dataTwo|100-900': 3
}
]
}
},
// 排名列表
fetchRankList: {
@@ -58,14 +58,50 @@ export default {
{ name: '@name', 'value|100-900': 5 },
{ name: '@name', 'value|100-900': 5 },
{ name: '@name', 'value|100-900': 5 },
{ name: '@name', 'value|100-900': 5 },
],
{ name: '@name', 'value|100-900': 5 }
]
},
// 获取数字
fetchNumber: {
// 轮播表格
fetchScrollBoard: {
code: 0,
status: 200,
msg: '请求成功',
data: '@float(0, 0.99)',
data: [
['行1列1', '行1列2', '1'],
['行2列1', '行2列2', '2'],
['行3列1', '行3列2', '3'],
['行4列1', '行4列2', '4'],
['行5列1', '行5列2', '5'],
['行6列1', '行6列2', '6'],
['行7列1', '行7列2', '行7列3'],
['行8列1', '行8列2', '行8列3'],
['行9列1', '行9列2', '行9列3'],
['行10列1', '行10列2', '行10列3']
]
},
// 获取数字
fetchNumberFloat: {
code: 0,
status: 200,
msg: '请求成功',
data: '@float(0, 0.99, 1, 4)'
},
fetchNumberInt: {
code: 0,
status: 200,
msg: '请求成功',
data: '@integer(0, 100)'
},
fetchText: {
code: 0,
status: 200,
msg: '请求成功',
data: '@paragraph(1, 10)'
},
fetchImage: (num: number) => ({
code: 0,
status: 200,
msg: '请求成功',
data: `https://robohash.org/${num}`
})
}

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: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -47,13 +47,30 @@
size="small"
></n-switch>
</template>
<setting-item-box name="名称">
<setting-item-box name="单位">
<setting-item name="名称">
<n-input v-model:value="xAxis.name" size="small"></n-input>
</setting-item>
<setting-item name="颜色">
<n-color-picker
size="small"
v-model:value="xAxis.nameTextStyle.color"
></n-color-picker>
</setting-item>
<setting-item name="大小">
<n-input-number
v-model:value="xAxis.nameTextStyle.fontSize"
:min="12"
size="small"
></n-input-number>
</setting-item>
<setting-item name="偏移量">
<n-input-number
v-model:value="xAxis.nameGap"
:min="5"
size="small"
></n-input-number>
</setting-item>
</setting-item-box>
<setting-item-box name="标签">
<setting-item v-show="inChart" name="展示">
@@ -70,6 +87,13 @@
v-model:value="xAxis.axisLabel.color"
></n-color-picker>
</setting-item>
<setting-item name="大小">
<n-input-number
v-model:value="xAxis.axisLabel.fontSize"
:min="8"
size="small"
></n-input-number>
</setting-item>
</setting-item-box>
<setting-item-box name="轴线">
<setting-item name="颜色">
@@ -93,6 +117,11 @@
></n-switch>
</n-space>
</setting-item>
<setting-item v-show="inChart" name="反向">
<n-space>
<n-switch v-model:value="xAxis.inverse" size="small"></n-switch>
</n-space>
</setting-item>
</setting-item-box>
<setting-item-box name="刻度">
<setting-item v-show="inChart" name="展示">
@@ -155,13 +184,30 @@
size="small"
></n-switch>
</template>
<setting-item-box name="名称">
<setting-item-box name="单位">
<setting-item name="名称">
<n-input v-model:value="yAxis.name" size="small"></n-input>
</setting-item>
<setting-item name="颜色">
<n-color-picker
size="small"
v-model:value="yAxis.nameTextStyle.color"
></n-color-picker>
</setting-item>
<setting-item name="大小">
<n-input-number
v-model:value="yAxis.nameTextStyle.fontSize"
:min="8"
size="small"
></n-input-number>
</setting-item>
<setting-item name="偏移量">
<n-input-number
v-model:value="yAxis.nameGap"
:min="5"
size="small"
></n-input-number>
</setting-item>
</setting-item-box>
<setting-item-box name="标签">
<setting-item v-show="inChart" name="展示">
@@ -178,6 +224,13 @@
v-model:value="yAxis.axisLabel.color"
></n-color-picker>
</setting-item>
<setting-item name="大小">
<n-input-number
v-model:value="yAxis.axisLabel.fontSize"
:min="8"
size="small"
></n-input-number>
</setting-item>
</setting-item-box>
<setting-item-box name="轴线">
<setting-item v-show="inChart" name="展示">
@@ -206,6 +259,11 @@
></n-switch>
</n-space>
</setting-item>
<setting-item v-show="inChart" name="反向">
<n-space>
<n-switch v-model:value="yAxis.inverse" size="small"></n-switch>
</n-space>
</setting-item>
</setting-item-box>
<setting-item-box name="刻度">
<setting-item v-show="inChart" name="展示">

View File

@@ -8,9 +8,9 @@
</n-text>
<div
class="item-right"
justify="space-between"
:style="{
gridTemplateColumns: alone ? '1fr' : '1fr 1fr'
gridTemplateColumns: alone ? '1fr' : '1fr 1fr',
...itemRightStyle
}"
>
<slot></slot>
@@ -28,6 +28,11 @@ defineProps({
type: Boolean,
default: false,
required: false
},
itemRightStyle: {
type: Object,
default: () => {},
required: false
}
})
</script>
@@ -48,7 +53,6 @@ $leftWidth: 60px;
.item-right {
display: grid;
grid-column-gap: 10px;
grid-template-columns: 1fr 1fr;
width: calc(100% - #{$leftWidth});
}
}

View File

@@ -3,6 +3,7 @@
<n-input-number
v-model:value="chartAttr.w"
:min="50"
:disabled="isGroup"
size="small"
placeholder="px"
>
@@ -13,6 +14,7 @@
<n-input-number
v-model:value="chartAttr.h"
:min="50"
:disabled="isGroup"
size="small"
placeholder="px"
>
@@ -32,6 +34,10 @@ const props = defineProps({
chartAttr: {
type: Object as PropType<Omit<PickCreateComponentType<'attr'>, 'node' | 'conNode'>>,
required: true
},
isGroup: {
type: Boolean,
required: false
}
})
</script>

View File

@@ -1,4 +1,9 @@
<template>
<div v-show="isGroup">
<n-divider n-divider style="margin: 10px 0"></n-divider>
<n-tag type="warning"> 解散分组 {{ isCanvas ? '滤镜' : '滤镜 / 变换' }} 也将消失!</n-tag>
</div>
<collapse-item :name="isCanvas ? '滤镜' : '滤镜 / 变换'">
<setting-item-box name="色相" :alone="true">
<setting-item :name="`值:${chartStyles.hueRotate}deg`">
@@ -13,9 +18,7 @@
</setting-item>
</setting-item-box>
<setting-item-box name="饱和度" :alone="true">
<setting-item
:name="`值:${(parseFloat(String(chartStyles.saturate)) * 100).toFixed(0)}%`"
>
<setting-item :name="`值:${(parseFloat(String(chartStyles.saturate)) * 100).toFixed(0)}%`">
<!-- 透明度 -->
<n-slider
v-model:value="chartStyles.saturate"
@@ -27,9 +30,7 @@
</setting-item>
</setting-item-box>
<setting-item-box name="对比度" :alone="true">
<setting-item
:name="`值:${(parseFloat(String(chartStyles.contrast)) * 100).toFixed(0)}%`"
>
<setting-item :name="`值:${(parseFloat(String(chartStyles.contrast)) * 100).toFixed(0)}%`">
<!-- 透明度 -->
<n-slider
v-model:value="chartStyles.contrast"
@@ -41,9 +42,7 @@
</setting-item>
</setting-item-box>
<setting-item-box name="亮度" :alone="true">
<setting-item
:name="`值:${(parseFloat(String(chartStyles.brightness)) * 100).toFixed(0)}%`"
>
<setting-item :name="`值:${(parseFloat(String(chartStyles.brightness)) * 100).toFixed(0)}%`">
<!-- 透明度 -->
<n-slider
v-model:value="chartStyles.brightness"
@@ -55,9 +54,7 @@
</setting-item>
</setting-item-box>
<setting-item-box name="透明度" :alone="true">
<setting-item
:name="`值:${(parseFloat(String(chartStyles.opacity)) * 100).toFixed(0)}%`"
>
<setting-item :name="`值:${(parseFloat(String(chartStyles.opacity)) * 100).toFixed(0)}%`">
<!-- 透明度 -->
<n-slider
v-model:value="chartStyles.opacity"
@@ -68,7 +65,7 @@
></n-slider>
</setting-item>
</setting-item-box>
<!-- 变换 -->
<setting-item-box v-if="!isCanvas" name="旋转°">
<setting-item name="Z轴(平面) - 旋转">
@@ -130,21 +127,21 @@
<script setup lang="ts">
import { PropType } from 'vue'
import { PickCreateComponentType } from '@/packages/index.d'
import {
SettingItemBox,
SettingItem,
CollapseItem,
} from '@/components/Pages/ChartItemSetting'
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
const props = defineProps({
isGroup: {
type: Boolean,
required: false
},
isCanvas: {
type: Boolean,
default: false
},
chartStyles: {
type: Object as PropType<Omit<PickCreateComponentType<'styles'>, 'animations'>>,
required: true,
},
required: true
}
})
// 百分比格式化persen

View File

@@ -0,0 +1,24 @@
<template></template>
<script setup>
import * as monaco from 'monaco-editor'
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'
import jsonWorker from 'monaco-editor/esm/vs/language/json/json.worker?worker'
import tsWorker from 'monaco-editor/esm/vs/language/typescript/ts.worker?worker'
import htmlWorker from 'monaco-editor/esm/vs/language/html/html.worker?worker'
self.MonacoEnvironment = {
getWorker(workerId, label) {
if (label === 'json') {
return new jsonWorker()
}
if (label === 'typescript' || label === 'javascript') {
return new tsWorker()
}
if (label === 'html') {
return new htmlWorker()
}
return new editorWorker()
}
}
</script>

View File

@@ -0,0 +1,76 @@
import { ref, onBeforeUnmount, nextTick } from 'vue'
import { useDesignStore } from '@/store/modules/designStore/designStore'
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
export const useMonacoEditor = (language = 'javascript') => {
const designStore = useDesignStore()
let monacoEditor: monaco.editor.IStandaloneCodeEditor | null = null
let initReadOnly = false
const el = ref<HTMLElement | null>(null)
// 格式化
const onFormatDoc = async () => {
await monacoEditor?.getAction('monacoEditor.action.formatDocument')?.run()
}
// 更新
const updateVal = (val: string) => {
nextTick(async () => {
monacoEditor?.setValue(val)
initReadOnly && monacoEditor?.updateOptions({ readOnly: false })
await onFormatDoc()
initReadOnly && monacoEditor?.updateOptions({ readOnly: true })
})
}
// 创建实例
const createEditor = (editorOption: monaco.editor.IStandaloneEditorConstructionOptions = {}) => {
if (!el.value) return
const javascriptModel = monaco.editor.createModel('', language)
initReadOnly = !!editorOption.readOnly
// 创建
monacoEditor = monaco.editor.create(el.value, {
model: javascriptModel,
// 是否启用预览图
minimap: { enabled: false },
// 圆角
roundedSelection: true,
// 主题
theme: designStore.getDarkTheme ? 'vs-dark' : 'vs',
// 主键
multiCursorModifier: 'ctrlCmd',
// 滚动条
scrollbar: {
verticalScrollbarSize: 8,
horizontalScrollbarSize: 8
},
// 行号
lineNumbers: 'off',
// tab大小
tabSize: 2,
//字体大小
fontSize: 16,
// 控制编辑器在用户键入、粘贴、移动或缩进行时是否应自动调整缩进
autoIndent: 'advanced',
// 自动布局
automaticLayout: true,
...editorOption
})
return monacoEditor
}
// 卸载
onBeforeUnmount(() => {
if (monacoEditor) monacoEditor.dispose()
})
return {
el,
updateVal,
getEditor: () => monacoEditor,
createEditor,
onFormatDoc
}
}

View File

@@ -0,0 +1,4 @@
import MonacoEditor from './index.vue';
import EditorWorker from './EditorWorker.vue';
export { MonacoEditor, EditorWorker };

View File

@@ -0,0 +1,92 @@
<template>
<div ref="el" class="go-editor-area" :style="{ width, height }"></div>
<EditorWorker></EditorWorker>
</template>
<script lang="ts" setup>
import { onMounted, watch, PropType } from 'vue'
import { useMonacoEditor } from './index.hook'
import { EditorWorker } from './index'
const props = defineProps({
width: {
type: String as PropType<string>,
default: '100%'
},
height: {
type: String as PropType<string>,
default: '90vh'
},
language: {
type: String as PropType<string>,
default: 'typescript'
},
preComment: {
type: String as PropType<string>,
default: ''
},
modelValue: {
type: String as PropType<string>,
default: ''
},
editorOptions: {
type: Object as PropType<object>,
default: () => ({})
}
})
const emits = defineEmits(['blur', 'update:modelValue'])
const { el, updateVal, getEditor, createEditor } = useMonacoEditor(props.language)
const updateMonacoVal = (_val?: string) => {
const { modelValue, preComment } = props
const val = preComment ? `${preComment}\n${_val || modelValue}` : _val || modelValue
updateVal(val)
}
onMounted(() => {
const monacoEditor = createEditor(props.editorOptions)
monacoEditor!.onDidChangeModelContent(() => {
emits('update:modelValue', monacoEditor!.getValue())
})
monacoEditor!.onDidBlurEditorText(() => {
emits('blur')
})
updateMonacoVal()
})
watch(
() => props.modelValue,
(val: string) => {
val !== getEditor()?.getValue() && updateMonacoVal(val)
}
)
</script>
<style lang="scss" scoped>
.go-editor-area {
position: relative;
border-radius: 4px;
overflow: hidden;
padding: 5px;
padding-left: 0;
box-sizing: border-box;
background-color: rgba(0, 0, 0, 0);
@include deep() {
.margin,
.monaco-editor,
.inputarea.ime-input {
background-color: rgba(0, 0, 0, 0);
}
.monaco-editor-background {
background-color: rgba(0, 0, 0, 0);
@include fetch-bg-color('filter-color-shallow');
}
.margin {
@include fetch-bg-color('filter-color-shallow');
}
}
}
</style>

View File

@@ -20,7 +20,7 @@
<div class="content-right">
<div class="color-name-detail">
<n-text v-if="appThemeDetail" class="color-name">{{ appThemeDetail.name }}</n-text>
<n-text v-else="appThemeDetail" class="color-name">中国色</n-text>
<n-text v-else class="color-name">中国色</n-text>
<n-text
v-if="appThemeDetail"
class="color-name-Pinyin"

View File

@@ -1,25 +1,47 @@
// 页面拖拽键名
export enum DragKeyEnum {
DROG_KEY = 'ChartData'
// 鼠标点击左右键
export enum MouseEventButton {
LEFT = 1,
RIGHT = 2,
}
// 右键枚举
// 页面拖拽键名
export enum DragKeyEnum {
DRAG_KEY = 'ChartData'
}
// 操作枚举
export enum MenuEnum {
// 移动
ARROW_UP = 'up',
ARROW_RIGHT = 'right',
ARROW_DOWN = 'down',
ARROW_LEFT = 'left',
// 删除
DELETE = 'delete',
// 复制
COPY = 'copy',
// 剪切
CUT = 'cut',
// 粘贴
PARSE = 'parse',
// 置顶
TOP = 'top',
// 置底
BOTTOM = 'bottom',
// 上移
UP = 'up',
// 下移
DOWN = 'down',
// 清空剪贴板
CLEAR = 'clear',
// 成组
GROUP = 'group',
// 解组
UN_GROUP = 'unGroup',
// 后退
BACK = 'back',
FORWORD = 'forward'
FORWORD = 'forward',
SAVE = 'save'
}
// Win 键盘枚举
@@ -27,6 +49,9 @@ export enum WinKeyboard {
CTRL = 'ctrl',
SHIFT = 'shift',
ALT = ' alt',
CTRL_SOURCE_KEY = "control",
SHIFT_SOURCE_KEY = "shift",
ALT_SOURCE_KEY = "alt"
}
// Mac 键盘枚举
@@ -35,4 +60,19 @@ export enum MacKeyboard {
CTRL = '⌘',
SHIFT = '⇧',
ALT = '⌥',
}
CTRL_SOURCE_KEY = "⌘",
SHIFT_SOURCE_KEY = "⇧",
ALT_SOURCE_KEY = "⌥"
}
// 同步状态枚举
export enum SyncEnum {
// 等待
PENDING,
// 开始
START,
// 成功
SUCCESS,
// 失败
FAILURE
}

View File

@@ -1,12 +1,17 @@
/**
* @description: 请求结果集
*/
// 模块 Path 前缀分类
export enum ModuleTypeEnum {
SYSTEM = 'sys',
PROJECT = 'project',
}
// 请求结果集
export enum ResultEnum {
DATA_SUCCESS = 0,
SUCCESS = 200,
SERVER_ERROR = 500,
SERVER_FORBIDDEN = 403,
NOT_FOUND = 404,
TOKEN_OVERDUE = 886,
TIMEOUT = 10042,
}
@@ -15,30 +20,114 @@ export enum RequestDataTypeEnum {
// 静态数据
STATIC = 0,
// 请求数据
AJAX = 1,
AJAX = 1
}
/**
* @description: 请求方法
*/
// 请求主体类型
export enum RequestContentTypeEnum {
// 普通请求
DEFAULT = 0,
// SQL请求
SQL = 1
}
// 头部
export enum RequestHttpHeaderEnum {
TOKEN = 'Token',
COOKIE = 'Cookie'
}
// 请求方法
export enum RequestHttpEnum {
GET = 'get',
POST = 'post',
PATCH = 'patch',
PUT = 'put',
DELETE = 'delete',
DELETE = 'delete'
}
/**
* @description: 常用的contentTyp类型
* @description: 请求间隔
*/
export enum RequestHttpIntervalEnum {
// 秒
SECOND = 'second',
// 分
MINUTE = 'minute',
// 时
HOUR = 'hour',
// 天
DAY = 'day'
}
/**
* @description: 请求间隔名称
*/
export const SelectHttpTimeNameObj = {
[RequestHttpIntervalEnum.SECOND]: '秒',
[RequestHttpIntervalEnum.MINUTE]: '分',
[RequestHttpIntervalEnum.HOUR]: '时',
[RequestHttpIntervalEnum.DAY]: '天'
}
/**
* @description: 请求头部类型
*/
export enum RequestBodyEnum {
NONE = 'none',
FORM_DATA = 'form-data',
X_WWW_FORM_URLENCODED = 'x-www-form-urlencoded',
JSON = 'json',
XML = 'xml'
}
/**
* @description: 请求头部类型数组
*/
export const RequestBodyEnumList = [
RequestBodyEnum.NONE,
RequestBodyEnum.FORM_DATA,
RequestBodyEnum.X_WWW_FORM_URLENCODED,
RequestBodyEnum.JSON,
RequestBodyEnum.XML
]
/**
* @description: 请求参数类型
*/
export enum RequestParamsTypeEnum {
PARAMS = 'Params',
BODY = 'Body',
HEADER = 'Header',
}
/**
* @description: 请求参数主体
*/
export type RequestParamsObjType = {
[T: string]: string
}
export type RequestParams = {
[RequestParamsTypeEnum.PARAMS]: RequestParamsObjType
[RequestParamsTypeEnum.HEADER]: RequestParamsObjType
[RequestParamsTypeEnum.BODY]: {
[RequestBodyEnum.FORM_DATA]: RequestParamsObjType
[RequestBodyEnum.X_WWW_FORM_URLENCODED]: RequestParamsObjType
[RequestBodyEnum.JSON]: string
[RequestBodyEnum.XML]: string
}
}
// 常用的contentTyp类型
export enum ContentTypeEnum {
// json
JSON = 'application/json;charset=UTF-8',
// json
// text
TEXT = 'text/plain;charset=UTF-8',
// form-data 一般配合qs
// xml
XML = 'application/xml;charset=UTF-8',
// application/x-www-form-urlencoded 一般配合qs
FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
// form-data 上传
FORM_DATA = 'multipart/form-data;charset=UTF-8',
FORM_DATA = 'multipart/form-data;charset=UTF-8'
}

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,10 +1,8 @@
export enum StorageEnum {
// 全局设置
GO_SYSTEM_SETTING_STORE = 'GO_SYSTEM_SETTING',
// token 等信息
GO_ACCESS_TOKEN_STORE = 'GO_ACCESS_TOKEN',
GO_SETTING_STORE = 'GO_SETTING',
// 登录信息
GO_LOGIN_INFO_STORE = 'GO_LOGIN_INFO',
GO_SYSTEM_STORE = 'GO_SYSTEM',
// 语言
GO_LANG_STORE = 'GO_LANG',
// 当前选择的主题

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/useSystemInit.hook'

View File

@@ -1,10 +1,10 @@
import { ref, toRefs, watchEffect, nextTick } from 'vue'
import { ref, toRefs, toRaw } from 'vue'
import type VChart from 'vue-echarts'
import { http } from '@/api/http'
import { CreateComponentType, PackagesCategoryEnum } from '@/packages/index.d'
import { customizeHttp } from '@/api/http'
import { CreateComponentType, ChartFrameEnum } from '@/packages/index.d'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { RequestDataTypeEnum } from '@/enums/httpEnum'
import { isPreview } from '@/utils'
import { isPreview, newFunctionHandle, intervalUnitHandle } from '@/utils'
// 获取类型
type ChartEditStoreType = typeof useChartEditStore
@@ -17,60 +17,81 @@ type ChartEditStoreType = typeof useChartEditStore
*/
export const useChartDataFetch = (
targetComponent: CreateComponentType,
useChartEditStore: ChartEditStoreType,
useChartEditStore: ChartEditStoreType,
updateCallback?: (...args: any) => any
) => {
const vChartRef = ref<typeof VChart | null>(null)
let fetchInterval: any = 0
isPreview() &&
watchEffect(() => {
clearInterval(fetchInterval)
const requestIntervalFn = () => {
const chartEditStore = useChartEditStore()
// 全局数据
const {
requestOriginUrl,
requestIntervalUnit: globalUnit,
requestInterval: globalRequestInterval
} = toRefs(chartEditStore.getRequestGlobalConfig)
const chartEditStore = useChartEditStore()
const { requestOriginUrl, requestInterval } = toRefs(
chartEditStore.getRequestGlobalConfig
)
const { requestDataType, requestHttpType, requestUrl } = toRefs(
targetComponent.data
)
if (requestDataType.value !== RequestDataTypeEnum.AJAX) return
// 目标组件
const {
requestDataType,
requestUrl,
requestIntervalUnit: targetUnit,
requestInterval: targetInterval
} = toRefs(targetComponent.request)
// 组件类型
const { chartFrame } = targetComponent.chartConfig
// 非请求类型
if (requestDataType.value !== RequestDataTypeEnum.AJAX) return
try {
// 处理地址
if (requestUrl?.value && requestInterval.value > 0) {
// @ts-ignore
if (requestUrl?.value) {
// requestOriginUrl 允许为空
const completePath =
requestOriginUrl && requestOriginUrl.value + requestUrl.value
const completePath = requestOriginUrl && requestOriginUrl.value + requestUrl.value
if (!completePath) return
fetchInterval = setInterval(async () => {
const res:any = await http(requestHttpType.value)(completePath || '', {})
if (res.data) {
// 是否是 Echarts 组件
const isECharts =
targetComponent.chartConfig.package ===
PackagesCategoryEnum.CHARTS
clearInterval(fetchInterval)
const fetchFn = async () => {
const res = await customizeHttp(toRaw(targetComponent.request), toRaw(chartEditStore.requestGlobalConfig))
if (res && res.data) {
try {
if (isECharts && vChartRef?.value?.setOption) {
nextTick(() => {
if (vChartRef.value) {
vChartRef.value.setOption({ dataset: res.data })
}
})
} else {
// 若遵守规范使用 datase 作为数据 key则省自动赋值数据
targetComponent.option.dataset && (targetComponent.option.dataset = res.data)
}
const filter = targetComponent.filter
// 更新回调函数
if (updateCallback) {
updateCallback(res.data)
updateCallback(newFunctionHandle(res.data, filter))
} else {
// eCharts 组件配合 vChart 库更新方式
if (chartFrame === ChartFrameEnum.ECHARTS) {
if (vChartRef.value) {
vChartRef.value.setOption({ dataset: newFunctionHandle(res.data, filter) })
}
}
}
} catch (error) {
console.error(error)
}
}
}, requestInterval.value * 1000)
}
})
}
// 立即调用
fetchFn()
// 定时时间
const time = targetInterval && targetInterval.value ? targetInterval.value : globalRequestInterval.value
// 单位
const unit = targetInterval && targetInterval.value ? targetUnit.value : globalUnit.value
// 开启轮询
if (time) fetchInterval = setInterval(fetchFn, intervalUnitHandle(time, unit))
}
} catch (error) {}
}
isPreview() && requestIntervalFn()
return { vChartRef }
}

View File

@@ -0,0 +1,23 @@
import { useSystemStore } from '@/store/modules/systemStore/systemStore'
import { SystemStoreEnum } from '@/store/modules/systemStore/systemStore.d'
import { ResultEnum } from '@/enums/httpEnum'
import { ossUrlApi } from '@/api/path/'
// * 初始化
export const useSystemInit = async () => {
const systemStore = useSystemStore()
// 获取 OSS 信息
const getOssUrl = async () => {
const res = await ossUrlApi({}) as unknown as MyResponseType
if (res.code === ResultEnum.SUCCESS) {
systemStore.setItem(SystemStoreEnum.FETCH_INFO, {
OSSUrl: res.data?.bucketURL
})
}
}
// 执行
getOssUrl()
}

View File

@@ -11,6 +11,8 @@ const global = {
help: 'Help',
contact: 'Contact Us',
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

@@ -7,6 +7,8 @@ import { setupNaive, setupDirectives, setupCustomComponents } from '@/plugins'
import { GoAppProvider } from '@/components/GoAppProvider/index'
import { setHtmlTheme } from '@/utils'
// 引入全局样式
import '@/styles/pages/index.scss'
// 引入动画
import 'animate.css/animate.min.css'
// 引入标尺

View File

@@ -1,5 +1,5 @@
import image from '@/assets/images/chart/charts/bar_x.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const BarCommonConfig: ConfigType = {
@@ -10,5 +10,6 @@ export const BarCommonConfig: ConfigType = {
category: ChatCategoryEnum.BAR,
categoryName: ChatCategoryEnumName.BAR,
package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.ECHARTS,
image
}

View File

@@ -1,5 +1,5 @@
import image from '@/assets/images/chart/charts/bar_y.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const BarCrossrangeConfig: ConfigType = {
@@ -10,5 +10,6 @@ export const BarCrossrangeConfig: ConfigType = {
category: ChatCategoryEnum.BAR,
categoryName: ChatCategoryEnumName.BAR,
package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.ECHARTS,
image
}

View File

@@ -1,5 +1,5 @@
import image from '@/assets/images/chart/charts/line.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const LineCommonConfig: ConfigType = {
@@ -10,5 +10,6 @@ export const LineCommonConfig: ConfigType = {
category: ChatCategoryEnum.LINE,
categoryName: ChatCategoryEnumName.LINE,
package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.ECHARTS,
image
}

View File

@@ -1,5 +1,5 @@
import image from '@/assets/images/chart/charts/line_gradient_single.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const LineGradientSingleConfig: ConfigType = {
@@ -10,5 +10,6 @@ export const LineGradientSingleConfig: ConfigType = {
category: ChatCategoryEnum.LINE,
categoryName: ChatCategoryEnumName.LINE,
package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.ECHARTS,
image
}

View File

@@ -21,7 +21,6 @@ const option = {
xAxis: {
show: true,
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
show: true,

View File

@@ -1,5 +1,5 @@
import image from '@/assets/images/chart/charts/line_gradient2.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const LineGradientsConfig: ConfigType = {
@@ -10,5 +10,6 @@ export const LineGradientsConfig: ConfigType = {
category: ChatCategoryEnum.LINE,
categoryName: ChatCategoryEnumName.LINE,
package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.ECHARTS,
image
}

View File

@@ -0,0 +1,61 @@
import { publicConfig } from '@/packages/public'
import { CreateComponentType } from '@/packages/index.d'
import { ProcessConfig } from './index'
import { chartInitConfig } from '@/settings/designSetting'
import cloneDeep from 'lodash/cloneDeep'
export const types = [
{
label: '线形',
value: 'line'
},
{
label: '圆形',
value: 'circle'
},
{
label: '仪表盘',
value: 'dashboard'
},
]
export const indicatorPlacements = [
{
label: '内部',
value: 'inside'
},
{
label: '外部',
value: 'outside'
}
]
export const option = {
dataset: 36,
// 默认类型
type: types[2].value,
// 进行时效果
processing: true,
// 主颜色
color: '#4992FFFF',
// 轨道颜色
railColor: '#3e3e3f',
// 指标
unit: '%',
// 指标大小
indicatorTextSize: 34,
// 指标位置(线条时可用)
indicatorPlacement: 'outside',
// 指标颜色
indicatorTextColor: '#FFFFFFFF',
// 偏移角度
offsetDegree: 0
}
export default class Config extends publicConfig implements CreateComponentType {
public key = ProcessConfig.key
public attr = { ...chartInitConfig, h: 500, zIndex: -1 }
public chartConfig = cloneDeep(ProcessConfig)
public option = cloneDeep(option)
}

View File

@@ -0,0 +1,65 @@
<template>
<!-- 默认展开 -->
<CollapseItem name="进度条" :expanded="true">
<SettingItemBox name="内容">
<SettingItem name="数值">
<!-- config.ts 里的 option 对应 --><!-- n-input-number NaiveUI 的控件 -->
<n-input-number v-model:value="optionData.dataset" size="small" :min="0" placeholder="进度值"></n-input-number>
</SettingItem>
<setting-item name="单位">
<n-input v-model:value="optionData.unit" size="small"></n-input>
</setting-item>
</SettingItemBox>
<SettingItemBox name="轨道">
<SettingItem name="形状">
<n-select v-model:value="optionData.type" :options="types" placeholder="选择形状" />
</SettingItem>
<!-- 颜色粗细等等... -->
<SettingItem name="进度条颜色">
<n-color-picker size="small" :modes="['hex']" v-model:value="optionData.color"></n-color-picker>
</SettingItem>
<SettingItem name="轨道颜色">
<n-color-picker size="small" :modes="['hex']" v-model:value="optionData.railColor"></n-color-picker>
</SettingItem>
<setting-item name="偏移角度" v-if="optionData.type !== types[0].value">
<n-input-number v-model:value="optionData.offsetDegree" size="small"></n-input-number>
</setting-item>
<SettingItem v-if="optionData.type == types[0].value">
<n-space>
<n-switch v-model:value="optionData.processing" size="small" />
<n-text>进行时动画</n-text>
</n-space>
</SettingItem>
</SettingItemBox>
<SettingItemBox name="指标">
<SettingItem name="位置" v-if="optionData.type == types[0].value">
<n-select v-model:value="optionData.indicatorPlacement" :options="indicatorPlacements" placeholder="选择形状" />
</SettingItem>
<SettingItem name="文本颜色">
<n-color-picker size="small" :modes="['hex']" v-model:value="optionData.indicatorTextColor"></n-color-picker>
</SettingItem>
<setting-item name="文本大小">
<n-input-number v-model:value="optionData.indicatorTextSize" size="small"></n-input-number>
</setting-item>
</SettingItemBox>
</CollapseItem>
</template>
<script setup lang="ts">
import { PropType } from 'vue'
// 以下是封装的设置模块布局组件,具体效果可在官网查看
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
// 获取 option 的数据,便于使用 typeof 获取类型
import { option, types, indicatorPlacements } from './config'
const props = defineProps({
optionData: {
type: Object as PropType<typeof option>,
required: true
}
})
</script>

View File

@@ -0,0 +1,25 @@
// 展示图片
import image from '@/assets/images/chart/charts/process.png'
// 公共类型声明
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
// 当前[信息模块]分类声明
import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d'
export const ProcessConfig: ConfigType = {
// 唯一key
key: 'Process',
// 图表组件渲染 Components 格式: V + key
chartKey: 'VProcess',
// 配置组件渲染 Components 格式: VC + key
conKey: 'VCProcess',
// 名称
title: 'NaiveUI-进度',
// 子分类目录
category: ChatCategoryEnum.MORE,
// 子分类目录
categoryName: ChatCategoryEnumName.MORE,
// 包分类
package: PackagesCategoryEnum.CHARTS,
// 图片
image: image
}

View File

@@ -0,0 +1,67 @@
<template>
<n-progress
:type="type"
:height="h"
:processing="processing"
:percentage="option.dataset"
:indicator-placement="indicatorPlacement"
:color="color"
:rail-color="railColor"
:offset-degree="offsetDegree"
>
<n-text
:style="{
color: indicatorTextColor,
fontSize: `${indicatorTextSize}px`
}"
>
{{ option.dataset }} {{ unit }}
</n-text>
</n-progress>
</template>
<script setup lang="ts">
import { PropType, toRefs, watch, shallowReactive } from 'vue'
import { useChartDataFetch } from '@/hooks'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import config, { option as configOption } from './config'
import { toNumber } from '@/utils'
const props = defineProps({
chartConfig: {
type: Object as PropType<config>,
required: true
}
})
// 取配置数据
const { w, h } = toRefs(props.chartConfig.attr)
const {
type,
unit,
color,
processing,
railColor,
indicatorTextColor,
indicatorPlacement,
indicatorTextSize,
offsetDegree,
dataset
} = toRefs(props.chartConfig.option)
const option = shallowReactive({
dataset: configOption.dataset
})
// 手动更新
watch(
() => props.chartConfig.option.dataset,
(newData: any) => {
option.dataset = toNumber(newData, 2)
}
)
// 预览更新
useChartDataFetch(props.chartConfig, useChartEditStore, (newData: number) => {
option.dataset = toNumber(newData, 2)
})
</script>

View File

@@ -3,6 +3,37 @@ import { CreateComponentType } from '@/packages/index.d'
import { WaterPoloConfig } from './index'
import cloneDeep from 'lodash/cloneDeep'
export const shapes = [
{
label: '圆形',
value: 'circle'
},
{
label: '正方形',
value: 'rect'
},
{
label: '带圆角的正方形',
value: 'roundRect'
},
{
label: '正三角形',
value: 'triangle'
},
{
label: '菱形',
value: 'diamond'
},
{
label: '水滴',
value: 'pin'
},
{
label: '箭头',
value: 'arrow'
},
]
export const includes = []
export const option = {
@@ -10,6 +41,7 @@ export const option = {
series: [
{
type: 'liquidFill',
shape: shapes[0].value,
radius: '90%',
data: [0],
center: ['50%', '50%'],

View File

@@ -15,19 +15,26 @@
placeholder="水球数值"
></n-input-number>
</SettingItem>
<SettingItem name="形状">
<n-select v-model:value="item.shape" :options="shapes" placeholder="选择形状" />
</SettingItem>
<SettingItem name="文本">
<n-input-number v-model:value="item.label.normal.textStyle.fontSize" :min="0" :step="1" size="small" placeholder="文字大小">
</n-input-number>
</SettingItem>
<SettingItem name="颜色1">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.color[0].colorStops[0].color"
></n-color-picker>
></n-color-picker>
</SettingItem>
<SettingItem name="颜色2">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.color[0].colorStops[1].color"
></n-color-picker>
></n-color-picker>
</SettingItem>
</SettingItemBox>
<SettingItemBox name="背景" :alone="true">
@@ -44,7 +51,7 @@
<script setup lang="ts">
import { PropType, computed } from 'vue'
import { option } from './config'
import { option, shapes } from './config'
import {
CollapseItem,
SettingItemBox,

View File

@@ -1,5 +1,5 @@
import image from '@/assets/images/chart/charts/water_WaterPolo.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const WaterPoloConfig: ConfigType = {
@@ -10,5 +10,6 @@ export const WaterPoloConfig: ConfigType = {
category: ChatCategoryEnum.MORE,
categoryName: ChatCategoryEnumName.MORE,
package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.ECHARTS,
image
}

View File

@@ -1,11 +1,5 @@
<template>
<v-chart
ref="vChartRef"
:theme="themeColor"
:option="option.value"
:manual-update="isPreview()"
autoresize
></v-chart>
<v-chart :theme="themeColor" :option="option.value" autoresize></v-chart>
</template>
<script setup lang="ts">
@@ -15,8 +9,8 @@ import { use } from 'echarts/core'
import 'echarts-liquidfill/src/liquidFill.js'
import { CanvasRenderer } from 'echarts/renderers'
import { GridComponent } from 'echarts/components'
import config from './config'
import { isPreview } from '@/utils'
import config from './config'
import { isPreview, isString } from '@/utils'
import { chartColorsSearch, defaultTheme } from '@/settings/chartThemes/index'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useChartDataFetch } from '@/hooks'
@@ -24,16 +18,16 @@ import { useChartDataFetch } from '@/hooks'
const props = defineProps({
themeSetting: {
type: Object,
required: true,
required: true
},
themeColor: {
type: Object,
required: true,
required: true
},
chartConfig: {
type: Object as PropType<config>,
required: true,
},
required: true
}
})
use([CanvasRenderer, GridComponent])
@@ -41,7 +35,7 @@ use([CanvasRenderer, GridComponent])
const chartEditStore = useChartEditStore()
const option = reactive({
value: {},
value: {}
})
// 渐变色处理
@@ -53,36 +47,45 @@ watch(
// 背景颜色
props.chartConfig.option.series[0].backgroundStyle.color = themeColor[2]
// 水球颜色
props.chartConfig.option.series[0].color[0].colorStops = [
props.chartConfig.option.series[0].color[0].colorStops = [
{
offset: 0,
color: themeColor[0],
color: themeColor[0]
},
{
offset: 1,
color: themeColor[1],
},
color: themeColor[1]
}
]
}
option.value = props.chartConfig.option
},
{
immediate: true,
immediate: true
}
)
const updateDataset = (newData: string | number) => {
props.chartConfig.option.series[0].data = [parseFloat(`${newData}`).toFixed(2)]
option.value = props.chartConfig.option
// 数据处理
const dataHandle = (newData: number | string) => {
newData = isString(newData) ? parseFloat(newData) : newData
return parseFloat(newData.toFixed(2))
}
// 编辑
watch(
() => props.chartConfig.option.dataset,
newData => updateDataset(newData),
newData => {
props.chartConfig.option.series[0].data = [dataHandle(newData)]
option.value = props.chartConfig.option
},
{
immediate: true,
immediate: true
}
)
const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore)
// 预览
useChartDataFetch(props.chartConfig, useChartEditStore, (newData: number) => {
// @ts-ignore
option.value.series[0].data = [dataHandle(newData)]
})
</script>

View File

@@ -1,3 +1,4 @@
import { ProcessConfig } from './Process/index'
import { RadarConfig } from './Radar/index'
import { FunnelConfig } from './Funnel/index'
import { HeatmapConfig } from './Heatmap/index'
@@ -5,4 +6,4 @@ import { PointConfig } from './Point/index'
import { WaterPoloConfig } from './WaterPolo/index'
import { TreeMapConfig } from './TreeMap/index'
export default [RadarConfig, FunnelConfig, HeatmapConfig,PointConfig, WaterPoloConfig, TreeMapConfig]
export default [ProcessConfig, RadarConfig, FunnelConfig, HeatmapConfig, PointConfig, WaterPoloConfig, TreeMapConfig]

View File

@@ -0,0 +1,64 @@
import { echartOptionProfixHandle, publicConfig } from '@/packages/public'
import { PieCircleConfig } from './index'
import { CreateComponentType } from '@/packages/index.d'
export const includes = []
const option = {
tooltip: {
show: true,
trigger: 'item'
},
legend: {
show: true,
},
dataset: 0.25,
title: {
text: 25 + "%",
x: "center",
y: "center",
textStyle: {
color: "#56B9F8",
fontSize: 30
}
},
series: [
{
type: "pie",
radius: ["75%", "80%"],
center: ["50%", "50%"],
hoverAnimation: true,
color: ["#00bcd44a", "transparent"],
label: {
show: false
},
data: [
{
value: [25],
itemStyle: {
color: "#03a9f4",
shadowBlur: 10,
shadowColor:"#97e2f5"
}
},
{
value: [75],
itemStyle: {
color: "#00bcd44a",
shadowBlur: 0,
shadowColor:"#00bcd44a"
}
}
]
},
]
}
export default class Config extends publicConfig implements CreateComponentType {
public key: string = PieCircleConfig.key
public chartConfig = PieCircleConfig
// 图表配置项
public option = echartOptionProfixHandle(option, includes)
}

View File

@@ -0,0 +1,89 @@
<template>
<!-- 遍历 seriesList -->
<CollapseItem v-for="(item, index) in config.series" :key="index" :name="`圆环`" :expanded="true">
<SettingItemBox name="数据">
<SettingItem name="数值">
<n-input-number v-model:value="config.dataset" :min="0" :max="1" :step="0.01" size="small" placeholder="数值">
</n-input-number>
</SettingItem>
</SettingItemBox>
<!-- Echarts 全局设置 -->
<SettingItemBox name="进度条">
<SettingItem name="颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.data[0].itemStyle.color"
></n-color-picker>
</SettingItem>
<SettingItem name="阴影模糊等级">
<n-input-number v-model:value="item.data[0].itemStyle.shadowBlur" :min="0" :max="50" :step="1" size="small" placeholder="阴影模糊等级">
</n-input-number>
</SettingItem>
<SettingItem name="阴影颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.data[0].itemStyle.shadowColor"
></n-color-picker>
</SettingItem>
</SettingItemBox>
<!-- 中心标题 -->
<SettingItemBox v-if="config.title" name="标题">
<SettingItem name="颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="config.title.textStyle.color"
></n-color-picker>
</SettingItem>
<SettingItem name="字体大小">
<n-input-number v-model:value="config.title.textStyle.fontSize" :min="0" :step="1" size="small" placeholder="字体大小">
</n-input-number>
</SettingItem>
</SettingItemBox>
<!-- 其他样式 -->
<SettingItemBox name="轨道样式">
<SettingItem name="颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.data[1].itemStyle.color"
></n-color-picker>
</SettingItem>
<SettingItem name="阴影模糊等级">
<n-input-number v-model:value="item.data[1].itemStyle.shadowBlur" :min="0" :step="1" size="small" placeholder="阴影模糊等级">
</n-input-number>
</SettingItem>
<SettingItem name="阴影颜色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="item.data[1].itemStyle.shadowColor"
></n-color-picker>
</SettingItem>
</SettingItemBox>
</CollapseItem>
</template>
<script setup lang="ts">
import { PropType, computed } from 'vue'
// 以下是封装的设置模块布局组件,具体效果可在官网查看
import {
CollapseItem,
SettingItemBox,
SettingItem
} from '@/components/Pages/ChartItemSetting'
import { GlobalThemeJsonType } from '@/settings/chartThemes'
const props = defineProps({
optionData: {
type: Object as PropType<GlobalThemeJsonType>,
required: true
}
})
const config = computed(() => {
return props.optionData
})
</script>

View File

@@ -0,0 +1,15 @@
import image from '@/assets/images/chart/charts/pie-circle.png'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const PieCircleConfig: ConfigType = {
key: 'PieCircle',
chartKey: 'VPieCircle',
conKey: 'VCPieCircle',
title: '饼图-环形',
category: ChatCategoryEnum.PIE,
categoryName: ChatCategoryEnumName.PIE,
package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.ECHARTS,
image
}

View File

@@ -0,0 +1,67 @@
<template>
<v-chart :theme="themeColor" :option="option.value" autoresize> </v-chart>
</template>
<script setup lang="ts">
import { PropType, reactive, watch } from 'vue'
import VChart from 'vue-echarts'
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { PieChart } from 'echarts/charts'
import { mergeTheme } from '@/packages/public/chart'
import config, { includes } from './config'
import { useChartDataFetch } from '@/hooks'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { DatasetComponent, GridComponent, TooltipComponent, LegendComponent, TitleComponent } from 'echarts/components'
const props = defineProps({
themeSetting: {
type: Object,
required: true
},
themeColor: {
type: Object,
required: true
},
chartConfig: {
type: Object as PropType<config>,
required: true
}
})
use([DatasetComponent, CanvasRenderer, PieChart, GridComponent, TooltipComponent, LegendComponent, TitleComponent])
const option = reactive({
value: {}
})
const dataHandle = (newData: any) => {
const d = parseFloat(`${newData}`) * 100
let config = props.chartConfig.option
config.title.text = d.toFixed(2) + '%'
config.series[0].data[0].value[0] = d
config.series[0].data[1].value[0] = 100 - d
option.value = mergeTheme(props.chartConfig.option, props.themeSetting, includes)
option.value = props.chartConfig.option
}
// 配置时
watch(
() => props.chartConfig.option.dataset,
newData => dataHandle(newData),
{
immediate: true
}
)
// 预览时
useChartDataFetch(props.chartConfig, useChartEditStore, (resData: number) => {
let d = parseFloat(`${resData}`) * 100
// @ts-ignore
option.value.title.text = d.toFixed(2) + '%'
// @ts-ignore
option.value.series[0].data[0].value[0] = d
// @ts-ignore
option.value.series[0].data[1].value[0] = 100 - d
})
</script>

View File

@@ -1,5 +1,5 @@
import image from '@/assets/images/chart/charts/pie.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const PieCommonConfig: ConfigType = {
@@ -10,5 +10,6 @@ export const PieCommonConfig: ConfigType = {
category: ChatCategoryEnum.PIE,
categoryName: ChatCategoryEnumName.PIE,
package: PackagesCategoryEnum.CHARTS,
chartFrame: ChartFrameEnum.ECHARTS,
image
}

View File

@@ -1,3 +1,4 @@
import { PieCommonConfig } from './PieCommon/index'
import { PieCircleConfig } from './PieCircle/index'
export default [PieCommonConfig]
export default [PieCommonConfig, PieCircleConfig]

View File

@@ -4,4 +4,4 @@ import Lines from './Lines'
import Mores from './Mores'
import Maps from './Maps'
export const ChartList = [...Bars, ...Pies, ...Lines, ...Maps , ...Mores]
export const ChartList = [...Bars, ...Pies, ...Lines, ...Maps, ...Mores]

View File

@@ -2,7 +2,7 @@
<div class="go-border-box">
<svg :width="w" :height="h">
<defs>
<filter :id="filterId" h="150%" width="150%" x="-25%" y="-25%">
<filter :id="filterId" height="150%" width="150%" x="-25%" y="-25%">
<feMorphology
operator="dilate"
radius="2"

View File

@@ -4,11 +4,13 @@ import { NumberConfig } from './index'
import cloneDeep from 'lodash/cloneDeep'
export const option = {
from: 50000,
to: 100000,
// 数据说明
dataset: 100000,
from: 0,
dur: 3,
precision: 0,
showSeparator: true,
numberSize: 24,
numberSize: 34,
numberColor: '#4a9ef8',
prefixText: '¥',
prefixColor: '#4a9ef8',

View File

@@ -1,16 +1,9 @@
<template>
<CollapseItem name="内容" :expanded="true">
<SettingItemBox name="数值">
<SettingItem name="起始值">
<n-input-number
v-model:value="optionData.from"
size="small"
:min="0"
></n-input-number>
</SettingItem>
<SettingItem name="终点值">
<n-input-number
v-model:value="optionData.to"
v-model:value="optionData.dataset"
size="small"
:min="1"
></n-input-number>
@@ -22,6 +15,13 @@
:min="1"
></n-input-number>
</SettingItem>
<SettingItem name="精度">
<n-input-number
v-model:value="optionData.precision"
size="small"
:min="0"
></n-input-number>
</SettingItem>
<SettingItem>
<n-space>
<n-switch v-model:value="optionData.showSeparator" size="small" />
@@ -44,7 +44,7 @@
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="optionData.suffixColor"
v-model:value="optionData.prefixColor"
></n-color-picker>
</SettingItem>
<SettingItem name="后缀">

View File

@@ -6,12 +6,8 @@
</span>
</template>
<span :style="`color:${numberColor};font-size:${numberSize}px`">
<n-number-animation
:from="from"
:to="to"
:duration="dur * 1000"
:show-separator="showSeparator"
></n-number-animation>
<n-number-animation :from="option.from" :to="option.dataset" :duration="dur * 1000" :show-separator="showSeparator"
:precision="precision"></n-number-animation>
</span>
<template #suffix>
<span :style="`color:${suffixColor};font-size:${numberSize}px`">
@@ -22,8 +18,10 @@
</template>
<script setup lang="ts">
import { PropType, toRefs } from 'vue'
import { PropType, toRefs, ref, reactive, watch } from 'vue'
import { CreateComponentType } from '@/packages/index.d'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { useChartDataFetch } from '@/hooks'
const props = defineProps({
chartConfig: {
@@ -31,21 +29,46 @@ const props = defineProps({
required: true,
},
})
const option = reactive({
from: 0,
dataset: 0,
})
const { w, h } = toRefs(props.chartConfig.attr)
const {
let {
dur,
showSeparator,
prefixText,
prefixColor,
suffixText,
suffixColor,
from,
to,
precision,
numberSize,
numberColor,
} = toRefs(props.chartConfig.option)
const updateNumber = (newData: number) => {
// 原来的目标值作为新的数字动画的起始值
option.from = option.dataset
option.dataset = newData
}
watch(
() => props.chartConfig.option.from,
() => {
option.from = props.chartConfig.option.from
}, { immediate: true }
)
watch(
() => props.chartConfig.option.dataset,
() => {
option.dataset = props.chartConfig.option.dataset
}, { immediate: true }
)
useChartDataFetch(props.chartConfig, useChartEditStore, updateNumber)
</script>
<style lang="scss" scoped>
@include go('decorates-number') {
display: flex;

View File

@@ -1,5 +1,5 @@
<template>
<collapse-item name="图片" :expanded="true">
<collapse-item name="属性" :expanded="true">
<setting-item-box name="路径" :alone="true">
<setting-item>
<n-input v-model:value="optionData.dataset" size="small"></n-input>

View File

@@ -1,42 +1,57 @@
<template>
<div class="go-packages-image">
<div :style="getStyle(borderRadius)">
<n-image
:object-fit="fit"
preview-disabled
:src="dataset"
:fallback-src="requireErrorImg()"
:width="w"
:height="h"
></n-image>
</div>
<div :style="getStyle(borderRadius)">
<n-image
:object-fit="fit"
preview-disabled
:src="option.dataset"
:fallback-src="requireErrorImg()"
:width="w"
:height="h"
></n-image>
</div>
</template>
<script setup lang="ts">
import { PropType, computed, toRefs } from 'vue'
import { CreateComponentType } from '@/packages/index.d'
import { PropType, shallowReactive, watch, toRefs } from 'vue'
import { requireErrorImg } from '@/utils'
import { useChartDataFetch } from '@/hooks'
import { CreateComponentType } from '@/packages/index.d'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
const props = defineProps({
chartConfig: {
type: Object as PropType<CreateComponentType>,
required: true,
},
required: true
}
})
const { w, h } = toRefs(props.chartConfig.attr)
const { dataset, fit, borderRadius } = toRefs(props.chartConfig.option)
const option = shallowReactive({
dataset: ''
})
const getStyle = (radius: number) => {
return {
borderRadius: `${radius}px`,
overflow: 'hidden',
overflow: 'hidden'
}
}
</script>
<style lang="scss" scoped>
.go-packages-image {
}
</style>
// 编辑更新
watch(
() => props.chartConfig.option.dataset,
(newData: any) => {
option.dataset = newData
},
{
immediate: true
}
)
// 预览更新
useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => {
option.dataset = newData
})
</script>

View File

@@ -15,19 +15,22 @@
background-color:${backgroundColor}`"
>
{{ dataset }}
{{ option.dataset }}
</div>
</div>
</template>
<script setup lang="ts">
import { PropType, toRefs } from 'vue'
import { PropType, toRefs, shallowReactive, watch } from 'vue'
import { CreateComponentType } from '@/packages/index.d'
import { useChartDataFetch } from '@/hooks'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { option as configOption } from './config'
const props = defineProps({
chartConfig: {
type: Object as PropType<CreateComponentType>,
required: true,
},
required: true
}
})
const { w, h } = toRefs(props.chartConfig.attr)
@@ -42,8 +45,27 @@ const {
borderColor,
borderRadius,
writingMode,
backgroundColor,
backgroundColor
} = toRefs(props.chartConfig.option)
const option = shallowReactive({
dataset: configOption.dataset
})
// 手动更新
watch(
() => props.chartConfig.option.dataset,
(newData: any) => {
option.dataset = newData
}, {
immediate: true
}
)
// 预览更新
useChartDataFetch(props.chartConfig, useChartEditStore, (newData: string) => {
option.dataset = newData
})
</script>
<style lang="scss" scoped>

View File

@@ -0,0 +1,20 @@
import { publicConfig } from '@/packages/public'
import { CreateComponentType } from '@/packages/index.d'
import { TextGradientConfig } from './index'
import cloneDeep from 'lodash/cloneDeep'
export const option = {
dataset: '我是渐变文本',
size: 20,
gradient: {
from: '#0000FFFF',
to: '#00FF00FF',
deg: 45
}
}
export default class Config extends publicConfig implements CreateComponentType {
public key = TextGradientConfig.key
public chartConfig = cloneDeep(TextGradientConfig)
public option = cloneDeep(option)
}

View File

@@ -0,0 +1,45 @@
<template>
<collapse-item name="信息" :expanded="true">
<setting-item-box name="文字" :alone="true">
<setting-item>
<n-input v-model:value="optionData.dataset" size="small"></n-input>
</setting-item>
</setting-item-box>
</collapse-item>
<collapse-item name="样式" :expanded="true">
<setting-item-box name="文字">
<setting-item name="字体大小">
<n-input-number v-model:value="optionData.size" size="small" placeholder="字体大小"></n-input-number>
</setting-item>
</setting-item-box>
<setting-item-box name="渐变色参数">
<setting-item name="起始值">
<n-color-picker size="small" :modes="['hex']" v-model:value="optionData.gradient.from"></n-color-picker>
</setting-item>
<setting-item name="结束值">
<n-color-picker size="small" :modes="['hex']" v-model:value="optionData.gradient.to"></n-color-picker>
</setting-item>
<setting-item name="偏移角度">
<n-input-number v-model:value="optionData.gradient.deg" size="small" placeholder="颜色旋转"></n-input-number>
</setting-item>
</setting-item-box>
</collapse-item>
</template>
<script setup lang="ts">
import { PropType } from 'vue'
import { option } from './config'
import {
CollapseItem,
SettingItemBox,
SettingItem
} from '@/components/Pages/ChartItemSetting'
const props = defineProps({
optionData: {
type: Object as PropType<typeof option>,
required: true
}
})
</script>

View File

@@ -0,0 +1,15 @@
import image from '@/assets/images/chart/informations/text_gradient.png'
import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d'
import { ChatCategoryEnum,ChatCategoryEnumName } from '../../index.d'
export const TextGradientConfig: ConfigType = {
key: 'TextGradient',
chartKey: 'VTextGradient',
conKey: 'VCTextGradient',
title: '渐变文字',
category: ChatCategoryEnum.TEXT,
categoryName: ChatCategoryEnumName.TEXT,
package: PackagesCategoryEnum.INFORMATIONS,
chartFrame: ChartFrameEnum.NAIVE_UI,
image
}

View File

@@ -0,0 +1,51 @@
<template>
<div class="go-text-box">
<n-gradient-text :size="size" :gradient="gradient">
{{ option.dataset }}
</n-gradient-text>
</div>
</template>
<script setup lang="ts">
import { PropType, toRefs, shallowReactive, watch } from 'vue'
import { CreateComponentType } from '@/packages/index.d'
import { useChartDataFetch } from '@/hooks'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import { option as configOption } from './config'
const props = defineProps({
chartConfig: {
type: Object as PropType<CreateComponentType>,
required: true
}
})
const option = shallowReactive({
dataset: configOption.dataset
})
const { w, h } = toRefs(props.chartConfig.attr)
const { size, gradient } = toRefs(props.chartConfig.option)
watch(
() => props.chartConfig.option.dataset,
(newData: any) => {
option.dataset = newData
}
)
useChartDataFetch(props.chartConfig, useChartEditStore, (newData: any) => {
option.dataset = newData
})
</script>
<style lang="scss" scoped>
@include go('text-box') {
display: flex;
align-items: center;
justify-content: center;
.n-gradient-text {
white-space: initial;
}
}
</style>

View File

@@ -1,3 +1,4 @@
import { TextCommonConfig } from './TextCommon/index'
import { TextGradientConfig } from './TextGradient/index'
export default [TextCommonConfig]
export default [TextCommonConfig, TextGradientConfig]

View File

@@ -19,6 +19,12 @@ export const option = {
textColor: '#CDD2F8FF',
borderColor: '#1370fb80',
carousel: 'single',
//序号字体大小
indexFontSize: 12,
//左侧数据字体大小
leftFontSize: 12,
//右侧数据字体大小
rightFontSize: 12,
// 格式化
valueFormatter(item: { value: any}) { return item.value}
}

View File

@@ -49,6 +49,31 @@
></n-color-picker>
</SettingItem>
</SettingItemBox>
<SettingItemBox name="字体样式">
<SettingItem name="序号字体">
<n-input-number
size="small"
v-model:value="optionData.indexFontSize"
:min="12"
/>
</SettingItem>
<SettingItem name="左侧数据字体">
<n-input-number
size="small"
v-model:value="optionData.leftFontSize"
:min="12"
/>
</SettingItem>
<SettingItem name="右侧数据字体">
<n-input-number
size="small"
v-model:value="optionData.rightFontSize"
:min="12"
/>
</SettingItem>
</SettingItemBox>
</CollapseItem>
</template>

View File

@@ -7,9 +7,9 @@
:style="`height: ${status.heights[i]}px;`"
>
<div class="ranking-info">
<div class="rank" :style="`color: ${color}`">No.{{ item.ranking }}</div>
<div class="info-name" v-html="item.name" />
<div class="ranking-value" :style="`color: ${textColor}`">
<div class="rank" :style="`color: ${color};font-size: ${indexFontSize}px`">No.{{ item.ranking }}</div>
<div class="info-name" :style="`font-size: ${leftFontSize}px`" v-html="item.name" />
<div class="ranking-value" :style="`color: ${textColor};font-size: ${rightFontSize}px`">
{{
status.mergedConfig.valueFormatter
? status.mergedConfig.valueFormatter(item)
@@ -43,7 +43,7 @@ const props = defineProps({
},
})
const { w, h } = toRefs(props.chartConfig.attr)
const { rowNum, unit, color, textColor, borderColor } = toRefs(
const { rowNum, unit, color, textColor, borderColor, indexFontSize, leftFontSize, rightFontSize } = toRefs(
props.chartConfig.option
)
@@ -164,7 +164,7 @@ watch(
}
)
// 数据更新
// 数据更新(配置时触发)
watch(
() => props.chartConfig.option.dataset,
() => {
@@ -172,7 +172,11 @@ watch(
}
)
useChartDataFetch(props.chartConfig, useChartEditStore)
// 数据callback处理预览时触发
useChartDataFetch(props.chartConfig, useChartEditStore, (resData: any[]) => {
props.chartConfig.option.dataset = resData
onRestart()
})
onUnmounted(() => {
stopAnimation()
@@ -197,9 +201,10 @@ onUnmounted(() => {
display: flex;
width: 100%;
font-size: 13px;
align-items: center;
.rank {
width: 40px;
margin-right: 5px;
}
.info-name {

View File

@@ -0,0 +1,29 @@
import { publicConfig } from '@/packages/public'
import { CreateComponentType } from '@/packages/index.d'
import { TableScrollBoardConfig } from './index'
import cloneDeep from 'lodash/cloneDeep'
import dataJson from './data.json'
export const option = {
header: ['列1', '列2', '列3'],
dataset: dataJson,
index: true,
columnWidth: [30, 100, 100],
align: ['center','right','right','right'],
rowNum: 5,
waitTime: 2,
headerHeight: 35,
carousel: 'single',
headerBGC: '#00BAFF',
oddRowBGC: '#003B51',
evenRowBGC: '#0A2732',
}
export default class Config
extends publicConfig
implements CreateComponentType
{
public key = TableScrollBoardConfig.key
public chartConfig = cloneDeep(TableScrollBoardConfig)
public option = cloneDeep(option)
}

View File

@@ -0,0 +1,121 @@
<template>
<CollapseItem name="列表" :expanded="true">
<SettingItemBox name="基础">
<SettingItem name="表行数">
<n-input-number
v-model:value="optionData.rowNum"
:min="1"
size="small"
placeholder="请输入自动计算"
></n-input-number>
</SettingItem>
<SettingItem name="轮播时间(s)">
<n-input-number
v-model:value="optionData.waitTime"
:min="1"
size="small"
placeholder="请输入轮播时间"
></n-input-number>
</SettingItem>
<SettingItem name="表头高度">
<n-input-number
v-model:value="optionData.headerHeight"
:min="1"
size="small"
placeholder="请输入表头高度"
></n-input-number>
</SettingItem>
<SettingItem name="显示行号">
<n-switch size="small" v-model:value="optionData.index" />
</SettingItem>
</SettingItemBox>
<SettingItemBox name="配置" :alone="true">
<SettingItem name="表头数据">
<n-input
v-model:value="header"
:min="1"
size="small"
placeholder="表头数据(英文','分割)"
></n-input>
</SettingItem>
<SettingItem name="列对齐方式">
<n-input
v-model:value="align"
:min="1"
size="small"
placeholder="对齐方式(英文','分割)"
></n-input>
</SettingItem>
<SettingItem name="列宽度">
<n-input
v-model:value="columnWidth"
:min="1"
size="small"
placeholder="列宽度(英文','分割)"
></n-input>
</SettingItem>
</SettingItemBox>
<SettingItemBox name="样式">
<SettingItem name="表头背景色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="optionData.headerBGC"
></n-color-picker>
</SettingItem>
<SettingItem name="奇数行背景色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="optionData.oddRowBGC"
></n-color-picker>
</SettingItem>
<SettingItem name="偶数行背景色">
<n-color-picker
size="small"
:modes="['hex']"
v-model:value="optionData.evenRowBGC"
></n-color-picker>
</SettingItem>
</SettingItemBox>
</CollapseItem>
</template>
<script setup lang="ts">
import { PropType, ref, watch } from 'vue'
import {
CollapseItem,
SettingItemBox,
SettingItem,
} from '@/components/Pages/ChartItemSetting'
import { option } from './config'
const props = defineProps({
optionData: {
type: Object as PropType<typeof option>,
required: true,
},
})
const header = ref(props.optionData.header.toString())
const align = ref(props.optionData.align.toString())
const columnWidth = ref(props.optionData.columnWidth.toString())
watch([header, align, columnWidth],([headerNew,alignNew,columnWidthNew],[headerOld,alignOld,columnWidthOld])=>{
if(headerNew !== headerOld){
props.optionData.header = headerNew.split(',')
}
if(alignNew !== alignOld){
props.optionData.align = alignNew.split(',')
}
if(columnWidthNew !== columnWidthOld){
// @ts-ignore
props.optionData.columnWidth = columnWidthNew.split(',')
}
})
</script>

View File

@@ -0,0 +1,12 @@
[
["行1列1", "行1列2", "行1列3"],
["行2列1", "行2列2", "行2列3"],
["行3列1", "行3列2", "行3列3"],
["行4列1", "行4列2", "行4列3"],
["行5列1", "行5列2", "行5列3"],
["行6列1", "行6列2", "行6列3"],
["行7列1", "行7列2", "行7列3"],
["行8列1", "行8列2", "行8列3"],
["行9列1", "行9列2", "行9列3"],
["行10列1", "行10列2", "行10列3"]
]

View File

@@ -0,0 +1,14 @@
import image from '@/assets/images/chart/tables/table_scrollboard.png'
import { ConfigType, PackagesCategoryEnum } from '@/packages/index.d'
import { ChatCategoryEnum, ChatCategoryEnumName } from '../../index.d'
export const TableScrollBoardConfig: ConfigType = {
key: 'TableScrollBoard',
chartKey: 'VTableScrollBoard',
conKey: 'VCTableScrollBoard',
title: '轮播列表',
category: ChatCategoryEnum.TABLE,
categoryName: ChatCategoryEnumName.TABLE,
package: PackagesCategoryEnum.TABLES,
image
}

View File

@@ -0,0 +1,358 @@
<template>
<div class="dv-scroll-board">
<div class="header" v-if="status.header.length && status.mergedConfig"
:style="`background-color: ${status.mergedConfig.headerBGC};`">
<div class="header-item" v-for="(headerItem, i) in status.header" :key="`${headerItem}${i}`" :style="`
height: ${status.mergedConfig.headerHeight}px;
line-height: ${status.mergedConfig.headerHeight}px;
width: ${status.widths[i]}px;
`" :align="status.aligns[i]" v-html="headerItem" />
</div>
<div v-if="status.mergedConfig" class="rows"
:style="`height: ${h - (status.header.length ? status.mergedConfig.headerHeight : 0)}px;`">
<div class="row-item" v-for="(row, ri) in status.rows" :key="`${row.toString()}${row.scroll}`" :style="`
height: ${status.heights[ri]}px;
line-height: ${status.heights[ri]}px;
background-color: ${status.mergedConfig[row.rowIndex % 2 === 0 ? 'evenRowBGC' : 'oddRowBGC']};
`">
<div class="ceil" v-for="(ceil, ci) in row.ceils" :key="`${ceil}${ri}${ci}`"
:style="`width: ${status.widths[ci]}px;`" :align="status.aligns[ci]" v-html="ceil" />
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { PropType, onUnmounted, reactive, toRefs, watch, onMounted } from 'vue'
import { CreateComponentType } from '@/packages/index.d'
import { useChartDataFetch } from '@/hooks'
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
import merge from 'lodash/merge'
import cloneDeep from 'lodash/cloneDeep'
const props = defineProps({
chartConfig: {
type: Object as PropType<CreateComponentType>,
required: true,
},
})
// 这里能拿到图表宽高等
const { w, h } = toRefs(props.chartConfig.attr)
// 这里能拿到上面 config.ts 里的 option 数据
// const { rowNum, headerHeight, index, backgroundColor } = toRefs(props.chartConfig.option)
const status = reactive({
defaultConfig: {
/**
* @description Board header
* @type {Array<String>}
* @default header = []
* @example header = ['column1', 'column2', 'column3']
*/
header: [],
/**
* @description Board dataset
* @type {Array<Array>}
* @default dataset = []
*/
dataset: [],
/**
* @description Row num
* @type {Number}
* @default rowNum = 5
*/
rowNum: 5,
/**
* @description Header background color
* @type {String}
* @default headerBGC = '#00BAFF'
*/
headerBGC: '#00BAFF',
/**
* @description Odd row background color
* @type {String}
* @default oddRowBGC = '#003B51'
*/
oddRowBGC: '#003B51',
/**
* @description Even row background color
* @type {String}
* @default evenRowBGC = '#003B51'
*/
evenRowBGC: '#0A2732',
/**
* @description Scroll wait time
* @type {Number}
* @default waitTime = 2
*/
waitTime: 2,
/**
* @description Header height
* @type {Number}
* @default headerHeight = 35
*/
headerHeight: 35,
/**
* @description Column width
* @type {Array<Number>}
* @default columnWidth = []
*/
columnWidth: [],
/**
* @description Column align
* @type {Array<String>}
* @default align = []
* @example align = ['left', 'center', 'right']
*/
align: [],
/**
* @description Show index
* @type {Boolean}
* @default index = false
*/
index: false,
/**
* @description index Header
* @type {String}
* @default indexHeader = '#'
*/
indexHeader: '#',
/**
* @description Carousel type
* @type {String}
* @default carousel = 'single'
* @example carousel = 'single' | 'page'
*/
carousel: 'single',
/**
* @description Pause scroll when mouse hovered
* @type {Boolean}
* @default hoverPause = true
* @example hoverPause = true | false
*/
hoverPause: true
},
mergedConfig: props.chartConfig.option,
header: [],
rowsData: [],
rows: [{
ceils: [],
rowIndex: 0,
scroll: 0
}],
widths: [],
heights: [0],
avgHeight: 0,
aligns: [],
animationIndex: 0,
animationHandler: 0,
updater: 0,
needCalc: false
})
const calcData = () => {
mergeConfig()
calcHeaderData()
calcRowsData()
calcWidths()
calcHeights()
calcAligns()
animation(true)
}
onMounted(()=> {
calcData()
})
const mergeConfig = () => {
status.mergedConfig = merge(cloneDeep(status.defaultConfig), props.chartConfig.option)
}
const calcHeaderData = () => {
let { header, index, indexHeader } = status.mergedConfig
if (!header.length) {
status.header = []
return
}
header = [...header]
if (index) header.unshift(indexHeader)
status.header = header
}
const calcRowsData = () => {
let { dataset, index, headerBGC, rowNum } = status.mergedConfig
if (index) {
dataset = dataset.map((row:any, i:number) => {
row = [...row]
const indexTag = `<span class="index" style="background-color: ${headerBGC};border-radius: 3px;padding: 0px 3px;">${i + 1}</span>`
row.unshift(indexTag)
return row
})
}
dataset = dataset.map((ceils:any, i:number) => ({ ceils, rowIndex: i }))
const rowLength = dataset.length
if (rowLength > rowNum && rowLength < 2 * rowNum) {
dataset = [...dataset, ...dataset]
}
dataset = dataset.map((d:any, i:number) => ({ ...d, scroll: i }))
status.rowsData = dataset
status.rows = dataset
}
const calcWidths = () => {
const { mergedConfig, rowsData } = status
const { columnWidth, header } = mergedConfig
const usedWidth = columnWidth.reduce((all:any, ws:number) => all + ws, 0)
let columnNum = 0
if (rowsData[0]) {
columnNum = (rowsData[0] as any).ceils.length
} else if (header.length) {
columnNum = header.length
}
const avgWidth = (w.value - usedWidth) / (columnNum - columnWidth.length)
const widths = new Array(columnNum).fill(avgWidth)
status.widths = merge(widths, columnWidth)
}
const calcHeights = (onresize = false) => {
const { mergedConfig, header } = status
const { headerHeight, rowNum, dataset } = mergedConfig
let allHeight = h.value
if (header.length) allHeight -= headerHeight
const avgHeight = allHeight / rowNum
status.avgHeight = avgHeight
if (!onresize) status.heights = new Array(dataset.length).fill(avgHeight)
}
const calcAligns = () => {
const { header, mergedConfig } = status
const columnNum = header.length
let aligns = new Array(columnNum).fill('left')
const { align } = mergedConfig
status.aligns = merge(aligns, align)
}
const animation = async (start = false) => {
const { needCalc } = status
if (needCalc) {
calcRowsData()
calcHeights()
status.needCalc = false
}
let { avgHeight, animationIndex, mergedConfig, rowsData, updater } = status
const { waitTime, carousel, rowNum } = mergedConfig
const rowLength = rowsData.length
if (rowNum >= rowLength) return
if (start) {
await new Promise(resolve => setTimeout(resolve, waitTime*1000))
if (updater !== status.updater) return
}
const animationNum = carousel === 'single' ? 1 : rowNum
let rows = rowsData.slice(animationIndex)
rows.push(...rowsData.slice(0, animationIndex))
status.rows = rows.slice(0, carousel === 'page' ? rowNum * 2 : rowNum + 1)
status.heights = new Array(rowLength).fill(avgHeight)
await new Promise(resolve => setTimeout(resolve, 300))
if (updater !== status.updater) return
status.heights.splice(0, animationNum, ...new Array(animationNum).fill(0))
animationIndex += animationNum
const back = animationIndex - rowLength
if (back >= 0) animationIndex = back
status.animationIndex = animationIndex
status.animationHandler = setTimeout(animation, waitTime*1000 - 300) as any
}
const stopAnimation = () => {
status.updater = (status.updater + 1) % 999999
if (!status.animationHandler) return
clearTimeout(status.animationHandler)
}
const onRestart = async () => {
if (!status.mergedConfig) return
stopAnimation()
calcData()
}
watch(
() => w.value,
() => {
onRestart()
}
)
watch(
() => h.value,
() => {
onRestart()
}
)
// 数据更新
watch(
() => props.chartConfig.option,
() => {
onRestart()
},
{deep:true}
)
// 数据更新 (默认更新 dataset若更新之后有其它操作可添加回调函数)
useChartDataFetch(props.chartConfig, useChartEditStore, (resData: any[]) => {
props.chartConfig.option.dataset = resData
onRestart()
})
onUnmounted(() => {
stopAnimation()
})
</script>
<style lang="scss" scoped>
.dv-scroll-board {
position: relative;
width: 100%;
height: 100%;
color: #fff;
.text {
padding: 0 10px;
box-sizing: border-box;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.header {
display: flex;
flex-direction: row;
font-size: 15px;
.header-item {
transition: all 0.3s;
}
}
.rows {
overflow: hidden;
.row-item {
display: flex;
font-size: 14px;
transition: all 0.3s;
overflow: hidden;
}
}
}
</style>

View File

@@ -1,5 +1,6 @@
import { TableListConfig } from './TableList'
import { TableCommonConfig } from './TableCommon'
import { TableCategoryConfig } from './TableCategory'
import { TableScrollBoardConfig } from './TableScrollBoard'
export default [TableListConfig, TableCommonConfig, TableCategoryConfig]
export default [TableListConfig, TableScrollBoardConfig, TableCommonConfig, TableCategoryConfig]

View File

@@ -1,6 +1,17 @@
import type { GlobalThemeJsonType } from '@/settings/chartThemes/index'
import type { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
export enum ChartFrameEnum {
// echarts 框架
ECHARTS = 'echarts',
// UI 组件框架
NAIVE_UI = 'naiveUI',
// 自定义带数据组件
COMMON = 'common',
// 无数据变更
STATIC = 'static'
}
// 组件配置
export type ConfigType = {
key: string
@@ -10,19 +21,18 @@ export type ConfigType = {
category: string
categoryName: string
package: string
chartFrame?: ChartFrameEnum
image: string | (() => Promise<typeof import('*.png')>)
}
// 数据请求
interface requestConfig {
data: RequestConfigType,
// 暂时约定为数据存储区域(未使用)
requestData: any
request: RequestConfigType
}
// Echarts 数据类型
interface EchartsDataType {
dimensions: string[],
dimensions: string[]
source: any[]
}
@@ -46,41 +56,47 @@ export enum FilterEnum {
// 倾斜
SKEW_X = 'skewX',
SKEW_Y = 'skewY',
SKEW_Y = 'skewY'
}
// 组件实例类
export interface PublicConfigType extends requestConfig {
export interface PublicConfigType {
id: string
rename?: string
isGroup: boolean
attr: { x: number; y: number; w: number; h: number; zIndex: number }
styles: {
[FilterEnum.OPACITY]: number;
[FilterEnum.SATURATE]: number;
[FilterEnum.CONTRAST]: number;
[FilterEnum.HUE_ROTATE]: number;
[FilterEnum.BRIGHTNESS]: number;
[FilterEnum.OPACITY]: number
[FilterEnum.SATURATE]: number
[FilterEnum.CONTRAST]: number
[FilterEnum.HUE_ROTATE]: number
[FilterEnum.BRIGHTNESS]: number
[FilterEnum.ROTATE_Z]: number;
[FilterEnum.ROTATE_X]: number;
[FilterEnum.ROTATE_Y]: number;
[FilterEnum.ROTATE_Z]: number
[FilterEnum.ROTATE_X]: number
[FilterEnum.ROTATE_Y]: number
[FilterEnum.SKEW_X]: number;
[FilterEnum.SKEW_Y]: number;
[FilterEnum.SKEW_X]: number
[FilterEnum.SKEW_Y]: number
// 动画
animations: string[]
}
filter?: string
setPosition: Function
}
export interface CreateComponentType extends PublicConfigType {
export interface CreateComponentType extends PublicConfigType, requestConfig {
key: string
chartConfig: ConfigType
option: GlobalThemeJsonType
}
// 组件成组实例类
export interface CreateComponentGroupType extends CreateComponentType {
groupList: Array<CreateComponentType>
}
// 获取组件实例类中某个key对应value类型的方法
export type PickCreateComponentType<T extends keyof CreateComponentType> = Pick<CreateComponentType,T>[T]
export type PickCreateComponentType<T extends keyof CreateComponentType> = Pick<CreateComponentType, T>[T]
// 包分类枚举
export enum PackagesCategoryEnum {

View File

@@ -10,12 +10,8 @@ import { globalThemeJson } from '@/settings/chartThemes/index'
* @param excludes 排除元素
* @returns object
*/
export const mergeTheme = <T, U>(
option: T,
themeSetting: U,
includes: string[]
) => {
return option = merge({}, pick(themeSetting, includes), option)
export const mergeTheme = <T, U>(option: T, themeSetting: U, includes: string[]) => {
return (option = merge({}, pick(themeSetting, includes), option))
}
/**

View File

@@ -1,18 +1,44 @@
import { getUUID } from '@/utils'
import { PublicConfigType } from '@/packages/index.d'
import { ChartFrameEnum, PublicConfigType, CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
import { RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
import { RequestHttpEnum, RequestDataTypeEnum } from '@/enums/httpEnum'
import { groupTitle } from '@/settings/designSetting'
import {
RequestHttpEnum,
RequestDataTypeEnum,
RequestHttpIntervalEnum,
RequestContentTypeEnum,
RequestBodyEnum
} from '@/enums/httpEnum'
import { chartInitConfig } from '@/settings/designSetting'
// 请求基础属性
const requestConfig: RequestConfigType = {
requestDataType: RequestDataTypeEnum.STATIC,
requestHttpType: RequestHttpEnum.GET
requestHttpType: RequestHttpEnum.GET,
requestUrl: '',
requestInterval: undefined,
requestIntervalUnit: RequestHttpIntervalEnum.SECOND,
requestContentType: RequestContentTypeEnum.DEFAULT,
requestParamsBodyType: RequestBodyEnum.NONE,
requestSQLContent: {
sql: 'select * from where'
},
requestParams: {
Body: {
'form-data': {},
'x-www-form-urlencoded': {},
json: '',
xml: ''
},
Header: {},
Params: {}
}
}
// 单实例类
export class publicConfig implements PublicConfigType {
public id = getUUID()
// 重命名
public rename = undefined
public isGroup = false
// 基本信息
public attr = { ...chartInitConfig, zIndex: -1 }
// 基本样式
@@ -36,14 +62,14 @@ export class publicConfig implements PublicConfigType {
// 倾斜
skewX: 0,
skewY: 0,
// 动画
animations: []
}
// 数据
public data = { ...requestConfig }
// 数据获取
public requestData = []
// 请求
public request = { ...requestConfig }
// 数据过滤
public filter = undefined
// 设置坐标
public setPosition(x: number, y: number): void {
@@ -51,3 +77,32 @@ export class publicConfig implements PublicConfigType {
this.attr.y = y
}
}
// 成组类 (部分属性不需要, 不继承 publicConfig)
export class PublicGroupConfigClass extends publicConfig implements CreateComponentGroupType {
// 成组
public isGroup = true
// 名称
public chartConfig = {
key: 'group',
chartKey: 'group',
conKey: 'group',
category: 'group',
categoryName: 'group',
package: 'group',
chartFrame: ChartFrameEnum.COMMON,
title: groupTitle,
image: ''
}
// 组成员列表
public groupList: Array<CreateComponentType> = []
// ---- 原有 ---
// key
public key = 'group'
// 配置
public option = {}
// 标识
public id = getUUID()
// 基本信息
public attr = { w: 0, h: 0, x: 0, y: 0, zIndex: -1 }
}

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

@@ -52,7 +52,13 @@ import {
ArrowBack as ArrowBackIcon,
ArrowForward as ArrowForwardIcon,
Planet as PawIcon,
Search as SearchIcon
Search as SearchIcon,
Reload as ReloadIcon,
ChevronUpOutline as ChevronUpOutlineIcon,
ChevronDownOutline as ChevronDownOutlineIcon,
Pulse as PulseIcon,
Folder as FolderIcon,
FolderOpen as FolderOpenIcon
} from '@vicons/ionicons5'
import {
@@ -80,7 +86,12 @@ import {
Scale as ScaleIcon,
FitToScreen as FitToScreenIcon,
FitToHeight as FitToHeightIcon,
FitToWidth as FitToWidthIcon
FitToWidth as FitToWidthIcon,
Save as SaveIcon,
Carbon3DCursor as Carbon3DCursorIcon,
Carbon3DSoftware as Carbon3DSoftwareIcon,
Filter as FilterIcon,
FilterEdit as FilterEditIcon
} from '@vicons/carbon'
const ionicons5 = {
@@ -190,7 +201,21 @@ const ionicons5 = {
// 狗爪
PawIcon,
// 搜索(放大镜)
SearchIcon
SearchIcon,
// 加载
ReloadIcon,
// 过滤器
FilterIcon,
// 向上
ChevronUpOutlineIcon,
// 向下
ChevronDownOutlineIcon,
// 脉搏
PulseIcon,
// 文件夹
FolderIcon,
// 文件夹打开
FolderOpenIcon
}
const carbon = {
@@ -234,7 +259,16 @@ const carbon = {
ScaleIcon,
FitToScreenIcon,
FitToHeightIcon,
FitToWidthIcon
FitToWidthIcon,
// 保存
SaveIcon,
// 成组
Carbon3DCursorIcon,
// 解组
Carbon3DSoftwareIcon,
// 过滤器
FilterIcon,
FilterEditIcon
}
// https://www.xicons.org/#/ 还有很多

Some files were not shown because too many files have changed in this diff Show More