Compare commits
282 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
895bca92ee | ||
|
|
1460ceb07e | ||
|
|
30bb48f294 | ||
|
|
d5eb3ec4e2 | ||
|
|
7eff3a29c1 | ||
|
|
33ca7af62d | ||
|
|
915e4a69e8 | ||
|
|
0546b37186 | ||
|
|
9e0736c693 | ||
|
|
bd7960b09a | ||
|
|
ddc09da8cb | ||
|
|
d84e47faa9 | ||
|
|
23efce86fe | ||
|
|
6abeef182f | ||
|
|
e3d388b5d9 | ||
|
|
7cf9c29a34 | ||
|
|
e7ab632a92 | ||
|
|
1681513d68 | ||
|
|
bd53c68ee2 | ||
|
|
40673dddb3 | ||
|
|
460aa47ee5 | ||
|
|
1237e16142 | ||
|
|
1565249e2a | ||
|
|
ffd4e165e5 | ||
|
|
60c7c36800 | ||
|
|
186538afc9 | ||
|
|
76f0183acc | ||
|
|
2e74522cc3 | ||
|
|
2d8e99bed6 | ||
|
|
afd42fb1fe | ||
|
|
980b91401b | ||
|
|
ba1868eb8b | ||
|
|
82f026a1b5 | ||
|
|
5213ea0273 | ||
|
|
0308004a61 | ||
|
|
d030f89895 | ||
|
|
2386687f2e | ||
|
|
f0f9905583 | ||
|
|
8d57af2dab | ||
|
|
98b1380d0d | ||
|
|
a448bb678b | ||
|
|
ca580db132 | ||
|
|
b248f73a88 | ||
|
|
8bff2f9b12 | ||
|
|
aa1b11d9f0 | ||
|
|
d5fb0b54de | ||
|
|
3d88a39a02 | ||
|
|
873c6fef53 | ||
|
|
b2f53a7123 | ||
|
|
2a850e4249 | ||
|
|
0b89aeca82 | ||
|
|
126c7ce5d2 | ||
|
|
e2ba151794 | ||
|
|
92dcd7fecd | ||
|
|
e841d3db17 | ||
|
|
800a0141a5 | ||
|
|
c92d7cab97 | ||
|
|
86de4e105e | ||
|
|
62a2ed2b4a | ||
|
|
e8e05033cd | ||
|
|
3790bc0207 | ||
|
|
8c4e3e8965 | ||
|
|
b03107d8cb | ||
|
|
e9a4ebe38f | ||
|
|
a702decfd4 | ||
|
|
0eecc1e19d | ||
|
|
182b2c508a | ||
|
|
2907d1b514 | ||
|
|
7bda46021a | ||
|
|
6d91262faa | ||
|
|
1672978730 | ||
|
|
36a6bb4214 | ||
|
|
14b37d82d0 | ||
|
|
4300b1f617 | ||
|
|
de4bd655ed | ||
|
|
0434c779cd | ||
|
|
aa0578776c | ||
|
|
3bd8cbe535 | ||
|
|
c81aff2c57 | ||
|
|
59eaed5b09 | ||
|
|
5d0c6f4487 | ||
|
|
c903b607df | ||
|
|
ec5bed5b13 | ||
|
|
ec97340c25 | ||
|
|
7bbf285e8e | ||
|
|
d652b06137 | ||
|
|
e55e63bca1 | ||
|
|
9b47d353c0 | ||
|
|
c3f9a470fc | ||
|
|
bd2557f3e4 | ||
|
|
730099efb9 | ||
|
|
c5706f839e | ||
|
|
faa0d6538f | ||
|
|
f15e0cd15f | ||
|
|
aa17e93966 | ||
|
|
feb9796449 | ||
|
|
e4b641a9c9 | ||
|
|
352a1742cf | ||
|
|
1af7ae865d | ||
|
|
7bc6ff7619 | ||
|
|
67f6dcd1fe | ||
|
|
de60c7cde5 | ||
|
|
889e5075ba | ||
|
|
2bba1dcae0 | ||
|
|
9d81159141 | ||
|
|
f8ebaa60b1 | ||
|
|
02ec3c78d6 | ||
|
|
8230757bd1 | ||
|
|
c1de1f9db6 | ||
|
|
1b0591ee62 | ||
|
|
3ee5faa248 | ||
|
|
ab9b79e8a8 | ||
|
|
b6a78c64ed | ||
|
|
9855d28e33 | ||
|
|
16fb258908 | ||
|
|
52ed72e502 | ||
|
|
6f9993e9e8 | ||
|
|
3347e3b12a | ||
|
|
b4a5ff7935 | ||
|
|
e75e2ccfe6 | ||
|
|
3d568f08de | ||
|
|
5cc20e9b19 | ||
|
|
dec1130ace | ||
|
|
e3a294eb00 | ||
|
|
104551b600 | ||
|
|
5c6bf57de1 | ||
|
|
b0cb3addbd | ||
|
|
77ff4cdffd | ||
|
|
dde92bfe60 | ||
|
|
a8bcc93aed | ||
|
|
b6903a777a | ||
|
|
f7cbc75e22 | ||
|
|
0e1ae71b78 | ||
|
|
7fcfb953bd | ||
|
|
a76ad93600 | ||
|
|
f9ed391c81 | ||
|
|
8ab64846d4 | ||
|
|
a82cc840b5 | ||
|
|
2171843c61 | ||
|
|
934bac7201 | ||
|
|
ed2a46a3ef | ||
|
|
766a3a8ede | ||
|
|
f3ec85050e | ||
|
|
ba54d934a2 | ||
|
|
d6ecad6467 | ||
|
|
74cab1e9af | ||
|
|
a823851541 | ||
|
|
618d1d77cb | ||
|
|
17c48608ec | ||
|
|
6d5dfbced0 | ||
|
|
c773bd8010 | ||
|
|
5746da73dd | ||
|
|
60bbfd9c92 | ||
|
|
12d92f3aa4 | ||
|
|
2edb1caf18 | ||
|
|
75067221da | ||
|
|
3358e164a1 | ||
|
|
94cde3f517 | ||
|
|
a2c8827a35 | ||
|
|
172a3163aa | ||
|
|
4d189e954c | ||
|
|
8a1f3ac2ef | ||
|
|
68dbf3e9ef | ||
|
|
0aece46d91 | ||
|
|
094c7ed392 | ||
|
|
c48517a89b | ||
|
|
68c68e96b1 | ||
|
|
36b1f37f3f | ||
|
|
51e5c756a7 | ||
|
|
8df951992e | ||
|
|
1a00993ee8 | ||
|
|
cb7e887c36 | ||
|
|
255b14a597 | ||
|
|
3f462c1bee | ||
|
|
cacc99683d | ||
|
|
d3a9f7d60f | ||
|
|
8d4dd3160d | ||
|
|
6847f7d966 | ||
|
|
35204898fc | ||
|
|
7fe743d624 | ||
|
|
6a285f610c | ||
|
|
a4c0450f7a | ||
|
|
a81f016e3f | ||
|
|
ee5fed4cd0 | ||
|
|
3fb0fe43bb | ||
|
|
f1f5f9cca9 | ||
|
|
2ce17c3974 | ||
|
|
1d7e40950f | ||
|
|
91bda457e7 | ||
|
|
68aeea70cf | ||
|
|
7a19346700 | ||
|
|
8d2269df78 | ||
|
|
b133cbdfea | ||
|
|
f45d4ca5af | ||
|
|
d96e7f71d7 | ||
|
|
24fee76237 | ||
|
|
d59193bc33 | ||
|
|
6928a70d9f | ||
|
|
e0796280f5 | ||
|
|
5d803e3fa6 | ||
|
|
749c0a2f39 | ||
|
|
737504cef5 | ||
|
|
8115950893 | ||
|
|
f458a21a2f | ||
|
|
13a9675894 | ||
|
|
77b5a41af9 | ||
|
|
2bf895ad3d | ||
|
|
6a5abd6762 | ||
|
|
5cb458c45b | ||
|
|
f828c48ab6 | ||
|
|
2626bc794f | ||
|
|
734dd68607 | ||
|
|
19f53f705c | ||
|
|
b93caf1386 | ||
|
|
aa613e2805 | ||
|
|
616584fc19 | ||
|
|
a5e83bfe9f | ||
|
|
1252d266dd | ||
|
|
3c820d53a6 | ||
|
|
f0525c7522 | ||
|
|
600f1b2dd2 | ||
|
|
757b79514a | ||
|
|
cf8121eb00 | ||
|
|
faf2d44fbb | ||
|
|
88516d9491 | ||
|
|
88dbbe03ea | ||
|
|
ae1fd2e7cf | ||
|
|
d3931f47bc | ||
|
|
bf9bd59b63 | ||
|
|
fb0ff50837 | ||
|
|
93727a0ac7 | ||
|
|
2641e70c78 | ||
|
|
bc44584698 | ||
|
|
82394dd7a3 | ||
|
|
2e688ad686 | ||
|
|
9b998e0c6d | ||
|
|
1045588301 | ||
|
|
ba86399fd3 | ||
|
|
a89164f885 | ||
|
|
7f2344c82c | ||
|
|
3c8e430533 | ||
|
|
f7209fba53 | ||
|
|
9fae683d8b | ||
|
|
79a2b98a1a | ||
|
|
98b28a631a | ||
|
|
6fec64f515 | ||
|
|
01d5890b35 | ||
|
|
fea583eb5b | ||
|
|
bfe5039a1c | ||
|
|
7a57d944c8 | ||
|
|
ca27e87241 | ||
|
|
e674a1ece4 | ||
|
|
dfb63346d3 | ||
|
|
4d899d48dc | ||
|
|
fa3a3dfcb0 | ||
|
|
e36210aa27 | ||
|
|
20a599594c | ||
|
|
70f8dbae53 | ||
|
|
d8022b2682 | ||
|
|
0d7c5b8ace | ||
|
|
88c9850c44 | ||
|
|
f1ed62cdca | ||
|
|
bfac86d5dd | ||
|
|
341015c584 | ||
|
|
7c5a66978e | ||
|
|
b21fc3f5e7 | ||
|
|
0e52628842 | ||
|
|
f7922cafa5 | ||
|
|
8c5496829e | ||
|
|
8514f051a7 | ||
|
|
61feb29fe2 | ||
|
|
fa29881f04 | ||
|
|
46cb8e7d0b | ||
|
|
b6143bc75e | ||
|
|
92e1ec05d2 | ||
|
|
75f23bb1bf | ||
|
|
5f5731f813 | ||
|
|
55159be0dc | ||
|
|
0c4e1dc7ae | ||
|
|
b4abdeb246 | ||
|
|
7e61dda4aa | ||
|
|
283aafb27d |
12
.env
@@ -1,14 +1,8 @@
|
|||||||
# port
|
# port
|
||||||
VITE_DEV_PORT = '8001'
|
VITE_DEV_PORT = '8080'
|
||||||
|
|
||||||
# development path
|
# development path
|
||||||
VITE_DEV_PATH = '/'
|
VITE_DEV_PATH = 'https://demo.mtruning.club'
|
||||||
|
|
||||||
# production path
|
# production path
|
||||||
VITE_PRO_PATH = '/'
|
VITE_PRO_PATH = 'https://demo.mtruning.club'
|
||||||
|
|
||||||
# spa-title
|
|
||||||
VITE_GLOB_APP_TITLE = GoView
|
|
||||||
|
|
||||||
# spa shortname
|
|
||||||
VITE_GLOB_APP_SHORT_NAME = GoView
|
|
||||||
243
README.md
@@ -1,184 +1,119 @@
|
|||||||
#### 总览
|
## 总览
|
||||||
|
|
||||||
<p align="center">
|
**`master-fetch` 分支是带有后端接口请求的分支**
|
||||||
<img src="readme/logo-t-y.png" alt="go-view" />
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<h4 align="center">开源、精美、便捷的「数据可视化」低代码开发平台</h4>
|
**后端项目地址:[https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve)**
|
||||||
|
|
||||||
#### 长期赞助商
|
**接口说明地址:[https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3#3e053622-1e76-43f9-a039-756aee822dbb)**
|
||||||
|
|
||||||
<div>
|
## 使用
|
||||||
<div align="center" style="column-gap: 20px;">
|
|
||||||
<a
|
|
||||||
href="http://www.ccflow.org/?from=goviewGitee"
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
padding: 10px 20px;
|
|
||||||
display: inline-block;
|
|
||||||
border-radius: 10px;
|
|
||||||
background: #f9f9f9;
|
|
||||||
">
|
|
||||||
<img src="readme/sponsors/ccflow-banner.png" alt="go-view" style="width: 250px;" width="250px" />
|
|
||||||
</a>
|
|
||||||
<span> </span>
|
|
||||||
<a
|
|
||||||
href="https://fastbee.cn/"
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
padding: 10px 20px;
|
|
||||||
display: inline-block;
|
|
||||||
border-radius: 10px;
|
|
||||||
background: #f9f9f9;
|
|
||||||
">
|
|
||||||
<img src="readme/sponsors/fb-banner.gif" alt="go-view" style="width: 250px;" width="250px"/>
|
|
||||||
</a>
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
<a
|
|
||||||
href="https://www.qeasy.cloud/"
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
padding: 10px 20px;
|
|
||||||
display: inline-block;
|
|
||||||
border-radius: 10px;
|
|
||||||
background: #f9f9f9;
|
|
||||||
">
|
|
||||||
<img src="readme/sponsors/qyy-banner.png" alt="go-view" style="width: 250px;" width="250px"/>
|
|
||||||
</a>
|
|
||||||
<span> </span>
|
|
||||||
<a
|
|
||||||
href="http://doc.zyplayer.com/#/integrate/zyplayer-doc?utm=goview"
|
|
||||||
target="_blank"
|
|
||||||
style="
|
|
||||||
padding: 10px 20px;
|
|
||||||
display: inline-block;
|
|
||||||
border-radius: 10px;
|
|
||||||
background: #f9f9f9;
|
|
||||||
">
|
|
||||||
<img src="readme/sponsors/zyplayer-banner.png" alt="go-view" style="width: 250px;" width="250px"/>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
#### 😶 **纯前端** 分支: **`master`**
|
所有的接口地址位置:`src\api\path\*`
|
||||||
|
|
||||||
#### 👻 携带 **后端** 请求分支: **`master-fetch`**
|
接口地址修改:`.env`
|
||||||
|
|
||||||
#### 📚 GoView **文档** 地址:[https://www.mtruning.club/](https://www.mtruning.club/)
|
```shell
|
||||||
|
# port
|
||||||
|
VITE_DEV_PORT = '8080'
|
||||||
|
|
||||||
项目纯前端-Demo 地址:[https://vue.mtruning.club/](https://vue.mtruning.club/)
|
# development path
|
||||||
|
VITE_DEV_PATH = 'http://127.0.0.1:8080'
|
||||||
|
|
||||||
项目带后端-Demo 地址:[https://demo.mtruning.club/](https://demo.mtruning.club/)
|
# production path
|
||||||
|
VITE_PRO_PATH = 'http://127.0.0.1:8080'
|
||||||
|
```
|
||||||
|
|
||||||
Cloud IDE 代码在线预览地址:[https://idegitee.com/dromara/go-view](https://idegitee.com/dromara/go-view)
|
公共前缀修改:`src\settings\httpSetting.ts`
|
||||||
|
|
||||||
#### 🤯 后端项目看这里!
|
```shell
|
||||||
|
// 请求前缀
|
||||||
|
export const axiosPre = '/api/goview'
|
||||||
|
```
|
||||||
|
|
||||||
后端地址(社区实现,仅供参考):
|
接口封装:`src\api\http.ts`
|
||||||
|
|
||||||
- `JAVA` [https://gitee.com/MTrun/go-view-serve](https://gitee.com/MTrun/go-view-serve) (当前使用)
|
```ts
|
||||||
- `.NET` [https://gitee.com/sun_xiang_yu/go-view-dotnet](https://gitee.com/sun_xiang_yu/go-view-dotnet)
|
import axiosInstance from './axios'
|
||||||
- `NODE` [https://gitee.com/qwdingyu/led](https://gitee.com/qwdingyu/led)
|
import { RequestHttpEnum, ContentTypeEnum } from '@/enums/httpEnum'
|
||||||
- `Docker 镜像` [https://gitee.com/AHEAD4/go-view-docker](https://gitee.com/AHEAD4/go-view-docker)
|
|
||||||
- `接口文档`[https://docs.apipost.cn](https://docs.apipost.cn/preview/5aa85d10a59d66ce/ddb813732007ad2b?target_id=84dbc5b0-158f-4bcb-8f74-793ac604ada3) (不是最新, 以前端代码为准)
|
|
||||||
|
|
||||||
#### 整体介绍
|
export const get = (url: string, params?: object) => {
|
||||||
|
return axiosInstance({
|
||||||
|
url: url,
|
||||||
|
method: RequestHttpEnum.GET,
|
||||||
|
params: params,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
- 框架:基于 `Vue3` 框架编写,使用 `hooks` 写法抽离部分逻辑,使代码结构更加清晰;
|
export const post = (url: string, data?: object, headersType?: string) => {
|
||||||
|
return axiosInstance({
|
||||||
|
url: url,
|
||||||
|
method: RequestHttpEnum.POST,
|
||||||
|
data: data,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': headersType || ContentTypeEnum.JSON
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
- 类型:使用 `TypeScript` 进行类型约束,减少未知错误发生概率,可以大胆修改逻辑内容;
|
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
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
- 存储:拥有本地记忆,部分配置项采用 `storage` 存储本地,提升使用体验;
|
// 获取请求函数,默认get
|
||||||
|
export const http = (type?: RequestHttpEnum) => {
|
||||||
|
switch (type) {
|
||||||
|
case RequestHttpEnum.GET:
|
||||||
|
return get
|
||||||
|
|
||||||
- 封装:项目进行了详细的工具类封装如:路由、存储、加/解密、文件处理、主题、NaiveUI 全局方法、组件等
|
case RequestHttpEnum.POST:
|
||||||
|
return post
|
||||||
|
|
||||||
- 入选 NaiveUI 社区精选资源推荐:[查看 NaiveUI 推荐列表](https://www.naiveui.com/zh-CN/light/docs/community)
|
case RequestHttpEnum.PUT:
|
||||||
|
return put
|
||||||
|
|
||||||
说明文档:
|
case RequestHttpEnum.DELETE:
|
||||||

|
return del
|
||||||
|
|
||||||
工作台:
|
default:
|
||||||

|
return get
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
请求配置:
|
```
|
||||||

|
|
||||||
|
|
||||||
数据过滤:
|
|
||||||

|
|
||||||
|
|
||||||
高级事件编辑:
|
|
||||||

|
|
||||||
|
|
||||||
自定义组件颜色:
|
|
||||||

|
|
||||||
|
|
||||||
快捷主页:
|
|
||||||

|
|
||||||
|
|
||||||
主题色:
|
|
||||||

|
|
||||||
|
|
||||||
亮白主题:
|
|
||||||

|
|
||||||
|
|
||||||
主要技术栈为:
|
|
||||||
|
|
||||||
| 名称 | 版本 | 名称 | 版本 |
|
|
||||||
| ------------------- | ----- | ----------- | ------ |
|
|
||||||
| Vue | 3.2.x | TypeScript4 | 4.6.x |
|
|
||||||
| Vite | 4.2.x | NaiveUI | 2.34.x |
|
|
||||||
| ECharts | 5.3.x | Pinia | 2.0.x |
|
|
||||||
| 详见 `package.json` | 😁 | 🥰 | 🤗 |
|
|
||||||
|
|
||||||
开发环境:
|
|
||||||
|
|
||||||
| 名称 | 版本 | 名称 | 版本 |
|
|
||||||
| ---- | ------- | ------- | ----- |
|
|
||||||
| node | 16.16.x | npm | 8.5.x |
|
|
||||||
| pnpm | 7.1.x | windows | 11 |
|
|
||||||
|
|
||||||
已完成图表:
|
|
||||||
|
|
||||||
| 分类 | 名称 | 名称 | 名称 | 名称 |
|
|
||||||
| ------ | ---------------- | ---------- | -------------- | ------------------------ |
|
|
||||||
| 图表 | 柱状图 | 横向柱状图 | 折线图 | 单/多 折线面积图(渐变色) |
|
|
||||||
| \* | 饼图 | 环形图 | 水球图 | 雷达图 |
|
|
||||||
| \* | NaiveUI 多种进度 | 散点图 | 对数回归散点图 | 热力图 |
|
|
||||||
| \* | 漏斗图 | 中国地图 | 高德地图 | 🦊 |
|
|
||||||
| 信息 | 文字 | 渐变文字 | 词云 | 嵌套网页 |
|
|
||||||
| \* | 图片 | 视频 | 😺 | 🐯 |
|
|
||||||
| 列表 | 滚动排名列表 | 滚动表格 | 🐮 | 🐐 |
|
|
||||||
| 小组件 | 边框-01~13 | 装饰-01~05 | 数字翻牌 | 通用时间 |
|
|
||||||
| \* | 数字计数 | 倒计时 | 时钟 | 🦁 |
|
|
||||||
|
|
||||||
## 浏览器支持
|
|
||||||
|
|
||||||
开发和测试平台均在 `Google` 和最新版 `EDGE` 上完成,暂未测试 `IE11` 等其它浏览器,如有需求请自行测试与兼容。
|
|
||||||
|
|
||||||
## 安装
|
|
||||||
|
|
||||||
请查看文档:[https://www.mtruning.club/](https://www.mtruning.club/)
|
|
||||||
|
|
||||||
## 代码提交
|
## 代码提交
|
||||||
|
|
||||||
- feat: 新功能
|
* feat: 新功能
|
||||||
- fix: 修复 Bug
|
* fix: 修复 Bug
|
||||||
- docs: 文档修改
|
* docs: 文档修改
|
||||||
- perf: 性能优化
|
* perf: 性能优化
|
||||||
- revert: 版本回退
|
* revert: 版本回退
|
||||||
- ci: CICD 集成相关
|
* ci: CICD集成相关
|
||||||
- test: 添加测试代码
|
* test: 添加测试代码
|
||||||
- refactor: 代码重构
|
* refactor: 代码重构
|
||||||
- build: 影响项目构建或依赖修改
|
* build: 影响项目构建或依赖修改
|
||||||
- style: 不影响程序逻辑的代码修改
|
* style: 不影响程序逻辑的代码修改
|
||||||
- chore: 不属于以上类型的其他类型(日常事务)
|
* chore: 不属于以上类型的其他类型(日常事务)
|
||||||
|
|
||||||
## 交流群
|
## 交流
|
||||||
|
|
||||||
QQ 群:663629294
|
QQ 群:1030129384
|
||||||
<img width="260px" src="readme/go-view-qq.png" alt="QQ群" style="border-radius: 20px" />
|
|
||||||
|

|
||||||
|
|
||||||

|

|
||||||
|
|||||||
@@ -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, '');
|
|
||||||
};
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "go-view",
|
"name": "go-view",
|
||||||
"version": "1.2.7",
|
"version": "2.2.3",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12.0"
|
"node": ">=12.0"
|
||||||
},
|
},
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
"@types/keymaster": "^1.6.30",
|
"@types/keymaster": "^1.6.30",
|
||||||
"@types/lodash": "^4.14.184",
|
"@types/lodash": "^4.14.184",
|
||||||
"animate.css": "^4.1.1",
|
"animate.css": "^4.1.1",
|
||||||
"axios": "^0.27.2",
|
"axios": "^1.4.0",
|
||||||
"color": "^4.2.3",
|
"color": "^4.2.3",
|
||||||
"crypto-js": "^4.1.1",
|
"crypto-js": "^4.1.1",
|
||||||
"dayjs": "^1.11.7",
|
"dayjs": "^1.11.7",
|
||||||
|
|||||||
1327
pnpm-lock.yaml
generated
10
preview.yml
@@ -1,10 +0,0 @@
|
|||||||
# preview.yml
|
|
||||||
autoOpen: true # 打开工作空间时是否自动开启所有应用的预览
|
|
||||||
apps:
|
|
||||||
- port: 3000 # 应用的端口
|
|
||||||
run: npm i --registry=https://registry.npmmirror.com && npm run dev # 应用的启动命令
|
|
||||||
command: # 使用此命令启动服务,且不执行run
|
|
||||||
root: ./ # 应用的启动目录
|
|
||||||
name: GoView # 应用名称
|
|
||||||
description: 开源、精美、便捷的「数据可视化」低代码开发平台 # 应用描述
|
|
||||||
autoOpen: true # 打开工作空间时是否自动开启预览(优先级高于根级 autoOpen)
|
|
||||||
|
Before Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 292 KiB |
|
Before Width: | Height: | Size: 167 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 404 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 14 KiB |
@@ -17,7 +17,7 @@
|
|||||||
import { NConfigProvider } from 'naive-ui'
|
import { NConfigProvider } from 'naive-ui'
|
||||||
import { GoAppProvider } from '@/components/GoAppProvider'
|
import { GoAppProvider } from '@/components/GoAppProvider'
|
||||||
import { I18n } from '@/components/I18n'
|
import { I18n } from '@/components/I18n'
|
||||||
import { useDarkThemeHook, useThemeOverridesHook, useCode, useLang } from '@/hooks'
|
import { useSystemInit, useDarkThemeHook, useThemeOverridesHook, useCode, useLang } from '@/hooks'
|
||||||
|
|
||||||
// 暗黑主题
|
// 暗黑主题
|
||||||
const darkTheme = useDarkThemeHook()
|
const darkTheme = useDarkThemeHook()
|
||||||
@@ -28,6 +28,9 @@ const overridesTheme = useThemeOverridesHook()
|
|||||||
// 代码主题
|
// 代码主题
|
||||||
const hljsTheme = useCode()
|
const hljsTheme = useCode()
|
||||||
|
|
||||||
|
// 系统全局数据初始化
|
||||||
|
useSystemInit()
|
||||||
|
|
||||||
// 全局语言
|
// 全局语言
|
||||||
const { locale, dateLocale } = useLang()
|
const { locale, dateLocale } = useLang()
|
||||||
|
|
||||||
|
|||||||
14
src/api/axios.config.ts
Normal 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 = []
|
||||||
@@ -1,34 +1,93 @@
|
|||||||
import axios, { AxiosResponse, InternalAxiosRequestConfig, AxiosError } from 'axios'
|
import axios, { AxiosResponse, AxiosRequestConfig, Axios, AxiosError, InternalAxiosRequestConfig } from 'axios'
|
||||||
import { ResultEnum } from "@/enums/httpEnum"
|
import { RequestHttpHeaderEnum, ResultEnum, ModuleTypeEnum } from '@/enums/httpEnum'
|
||||||
import { ErrorPageNameMap } from "@/enums/pageEnum"
|
import { PageEnum, ErrorPageNameMap } from '@/enums/pageEnum'
|
||||||
import { redirectErrorPage } from '@/utils'
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
|
import { axiosPre } from '@/settings/httpSetting'
|
||||||
|
import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d'
|
||||||
|
import { redirectErrorPage, getLocalStorage, routerTurnByName, isPreview } from '@/utils'
|
||||||
|
import { fetchAllowList } from './axios.config'
|
||||||
|
import includes from 'lodash/includes'
|
||||||
|
|
||||||
|
export interface MyResponseType<T> {
|
||||||
|
code: ResultEnum
|
||||||
|
data: T
|
||||||
|
message: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MyRequestInstance extends Axios {
|
||||||
|
<T = any>(config: AxiosRequestConfig): Promise<MyResponseType<T>>
|
||||||
|
}
|
||||||
|
|
||||||
const axiosInstance = axios.create({
|
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,
|
timeout: ResultEnum.TIMEOUT
|
||||||
})
|
}) as unknown as MyRequestInstance
|
||||||
|
|
||||||
axiosInstance.interceptors.request.use(
|
axiosInstance.interceptors.request.use(
|
||||||
(config: InternalAxiosRequestConfig) => {
|
(config: InternalAxiosRequestConfig) => {
|
||||||
|
// 白名单校验
|
||||||
|
if (includes(fetchAllowList, config.url)) return config
|
||||||
|
// 获取 token
|
||||||
|
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
|
||||||
|
// 重新登录
|
||||||
|
if (!info) {
|
||||||
|
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
|
||||||
|
return config
|
||||||
|
}
|
||||||
|
const userInfo = info[SystemStoreEnum.USER_INFO]
|
||||||
|
config.headers[userInfo[SystemStoreUserInfoEnum.TOKEN_NAME] || 'token'] = userInfo[SystemStoreUserInfoEnum.USER_TOKEN] || ''
|
||||||
return config
|
return config
|
||||||
},
|
},
|
||||||
(error: AxiosError) => {
|
(err: AxiosError) => {
|
||||||
Promise.reject(error)
|
Promise.reject(err)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// 响应拦截器
|
// 响应拦截器
|
||||||
axiosInstance.interceptors.response.use(
|
axiosInstance.interceptors.response.use(
|
||||||
(res: AxiosResponse) => {
|
(res: AxiosResponse) => {
|
||||||
|
// 预览页面错误不进行处理
|
||||||
|
if (isPreview()) {
|
||||||
|
return Promise.resolve(res.data)
|
||||||
|
}
|
||||||
const { code } = res.data as { code: number }
|
const { code } = res.data as { code: number }
|
||||||
|
|
||||||
if (code === undefined || code === null) return Promise.resolve(res.data)
|
if (code === undefined || code === null) return Promise.resolve(res.data)
|
||||||
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)
|
return Promise.resolve(res.data)
|
||||||
},
|
},
|
||||||
(err: AxiosResponse) => {
|
(err: AxiosError) => {
|
||||||
Promise.reject(err)
|
const status = err.response?.status
|
||||||
|
switch (status) {
|
||||||
|
case 401:
|
||||||
|
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
|
||||||
|
Promise.reject(err)
|
||||||
|
break
|
||||||
|
|
||||||
|
default:
|
||||||
|
Promise.reject(err)
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -9,16 +9,16 @@ import {
|
|||||||
} from '@/enums/httpEnum'
|
} from '@/enums/httpEnum'
|
||||||
import type { RequestGlobalConfigType, RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
|
import type { RequestGlobalConfigType, RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
|
||||||
export const get = (url: string, params?: object) => {
|
export const get = <T = any>(url: string, params?: object) => {
|
||||||
return axiosInstance({
|
return axiosInstance<T>({
|
||||||
url: url,
|
url: url,
|
||||||
method: RequestHttpEnum.GET,
|
method: RequestHttpEnum.GET,
|
||||||
params: params
|
params: params,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const post = (url: string, data?: object, headersType?: string) => {
|
export const post = <T = any>(url: string, data?: object, headersType?: string) => {
|
||||||
return axiosInstance({
|
return axiosInstance<T>({
|
||||||
url: url,
|
url: url,
|
||||||
method: RequestHttpEnum.POST,
|
method: RequestHttpEnum.POST,
|
||||||
data: data,
|
data: data,
|
||||||
@@ -28,8 +28,8 @@ export const post = (url: string, data?: object, headersType?: string) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const patch = (url: string, data?: object, headersType?: string) => {
|
export const patch = <T = any>(url: string, data?: object, headersType?: string) => {
|
||||||
return axiosInstance({
|
return axiosInstance<T>({
|
||||||
url: url,
|
url: url,
|
||||||
method: RequestHttpEnum.PATCH,
|
method: RequestHttpEnum.PATCH,
|
||||||
data: data,
|
data: data,
|
||||||
@@ -39,8 +39,8 @@ export const patch = (url: string, data?: object, headersType?: string) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const put = (url: string, data?: object, headersType?: ContentTypeEnum) => {
|
export const put = <T = any>(url: string, data?: object, headersType?: ContentTypeEnum) => {
|
||||||
return axiosInstance({
|
return axiosInstance<T>({
|
||||||
url: url,
|
url: url,
|
||||||
method: RequestHttpEnum.PUT,
|
method: RequestHttpEnum.PUT,
|
||||||
data: data,
|
data: data,
|
||||||
@@ -50,8 +50,8 @@ export const put = (url: string, data?: object, headersType?: ContentTypeEnum) =
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const del = (url: string, params?: object) => {
|
export const del = <T = any>(url: string, params?: object) => {
|
||||||
return axiosInstance({
|
return axiosInstance<T>({
|
||||||
url: url,
|
url: url,
|
||||||
method: RequestHttpEnum.DELETE,
|
method: RequestHttpEnum.DELETE,
|
||||||
params
|
params
|
||||||
@@ -82,11 +82,11 @@ export const http = (type?: RequestHttpEnum) => {
|
|||||||
}
|
}
|
||||||
const prefix = 'javascript:'
|
const prefix = 'javascript:'
|
||||||
// 对输入字符进行转义处理
|
// 对输入字符进行转义处理
|
||||||
export const translateStr = (target: string | object) => {
|
export const translateStr = (target: string | Record<any, any>) => {
|
||||||
if (typeof target === 'string') {
|
if (typeof target === 'string') {
|
||||||
if (target.startsWith(prefix)) {
|
if (target.startsWith(prefix)) {
|
||||||
const funcStr = target.split(prefix)[1]
|
const funcStr = target.split(prefix)[1]
|
||||||
let result;
|
let result
|
||||||
try {
|
try {
|
||||||
result = new Function(`${funcStr}`)()
|
result = new Function(`${funcStr}`)()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -100,8 +100,8 @@ export const translateStr = (target: string | object) => {
|
|||||||
}
|
}
|
||||||
for (const key in target) {
|
for (const key in target) {
|
||||||
if (Object.prototype.hasOwnProperty.call(target, key)) {
|
if (Object.prototype.hasOwnProperty.call(target, key)) {
|
||||||
const subTarget = (target as any)[key];
|
const subTarget = target[key]
|
||||||
(target as any)[key] = translateStr(subTarget)
|
target[key] = translateStr(subTarget)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return target
|
return target
|
||||||
@@ -163,6 +163,7 @@ export const customizeHttp = (targetParams: RequestConfigType, globalParams: Req
|
|||||||
params = translateStr(params)
|
params = translateStr(params)
|
||||||
// form 类型处理
|
// form 类型处理
|
||||||
let formData: FormData = new FormData()
|
let formData: FormData = new FormData()
|
||||||
|
formData.set('default', 'defaultData')
|
||||||
// 类型处理
|
// 类型处理
|
||||||
|
|
||||||
switch (requestParamsBodyType) {
|
switch (requestParamsBodyType) {
|
||||||
|
|||||||
2
src/api/path/index.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export * from '@/api/path/project.api'
|
||||||
|
export * from '@/api/path/system.api'
|
||||||
99
src/api/path/project.api.ts
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
import { http } from '@/api/http'
|
||||||
|
import { httpErrorHandle } from '@/utils'
|
||||||
|
import { ContentTypeEnum, RequestHttpEnum, ModuleTypeEnum } from '@/enums/httpEnum'
|
||||||
|
import { ProjectItem, ProjectDetail } from './project'
|
||||||
|
|
||||||
|
// * 项目列表
|
||||||
|
export const projectListApi = async (data: object) => {
|
||||||
|
try {
|
||||||
|
const res = await http(RequestHttpEnum.GET)<ProjectItem[]>(`${ModuleTypeEnum.PROJECT}/list`, data)
|
||||||
|
return res
|
||||||
|
} catch {
|
||||||
|
httpErrorHandle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// * 新增项目
|
||||||
|
export const createProjectApi = async (data: object) => {
|
||||||
|
try {
|
||||||
|
const res = await http(RequestHttpEnum.POST)<{
|
||||||
|
/**
|
||||||
|
* 项目id
|
||||||
|
*/
|
||||||
|
id: number
|
||||||
|
}>(`${ModuleTypeEnum.PROJECT}/create`, data)
|
||||||
|
return res
|
||||||
|
} catch {
|
||||||
|
httpErrorHandle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// * 获取项目
|
||||||
|
export const fetchProjectApi = async (data: object) => {
|
||||||
|
try {
|
||||||
|
const res = await http(RequestHttpEnum.GET)<ProjectDetail>(`${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 (data: object) => {
|
||||||
|
try {
|
||||||
|
const res = await http(RequestHttpEnum.POST)<{
|
||||||
|
/**
|
||||||
|
* 文件地址
|
||||||
|
*/
|
||||||
|
fileName: string,
|
||||||
|
fileurl: string,
|
||||||
|
}>(`${ModuleTypeEnum.PROJECT}/upload`, data, ContentTypeEnum.FORM_DATA)
|
||||||
|
return res
|
||||||
|
} catch {
|
||||||
|
httpErrorHandle()
|
||||||
|
}
|
||||||
|
}
|
||||||
39
src/api/path/project.d.ts
vendored
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
export type ProjectItem = {
|
||||||
|
/**
|
||||||
|
* 项目 id
|
||||||
|
*/
|
||||||
|
id: string
|
||||||
|
/**
|
||||||
|
* 项目名称
|
||||||
|
*/
|
||||||
|
projectName: string
|
||||||
|
/**
|
||||||
|
* 项目状态:\
|
||||||
|
* -1: 未发布\
|
||||||
|
* 1: 已发布
|
||||||
|
*/
|
||||||
|
state: number
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*/
|
||||||
|
createTime: string
|
||||||
|
/**
|
||||||
|
* 预览图片url
|
||||||
|
*/
|
||||||
|
indexImage: string
|
||||||
|
/**
|
||||||
|
* 创建者 id
|
||||||
|
*/
|
||||||
|
createUserId: string
|
||||||
|
/**
|
||||||
|
* 项目备注
|
||||||
|
*/
|
||||||
|
remarks: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ProjectDetail extends ProjectItem {
|
||||||
|
/**
|
||||||
|
* 项目参数
|
||||||
|
*/
|
||||||
|
content: string
|
||||||
|
}
|
||||||
39
src/api/path/system.api.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import { http } from '@/api/http'
|
||||||
|
import { httpErrorHandle } from '@/utils'
|
||||||
|
import { RequestHttpEnum, ModuleTypeEnum } from '@/enums/httpEnum'
|
||||||
|
import { LoginResult } from './system'
|
||||||
|
|
||||||
|
// * 登录
|
||||||
|
export const loginApi = async (data: object) => {
|
||||||
|
try {
|
||||||
|
const res = await http(RequestHttpEnum.POST)<LoginResult>(`${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)<{
|
||||||
|
/**
|
||||||
|
* bucket 地址
|
||||||
|
*/
|
||||||
|
bucketURL?: string
|
||||||
|
}>(`${ModuleTypeEnum.SYSTEM}/getOssInfo`, data)
|
||||||
|
return res
|
||||||
|
} catch (err) {
|
||||||
|
httpErrorHandle()
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/api/path/system.d.ts
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
export interface LoginResult {
|
||||||
|
token: {
|
||||||
|
/**
|
||||||
|
* token 值
|
||||||
|
*/
|
||||||
|
tokenValue: string
|
||||||
|
/**
|
||||||
|
* token key
|
||||||
|
*/
|
||||||
|
tokenName: string
|
||||||
|
}
|
||||||
|
userinfo: {
|
||||||
|
/**
|
||||||
|
* 昵称
|
||||||
|
*/
|
||||||
|
nickname: string
|
||||||
|
/**
|
||||||
|
* 用户名
|
||||||
|
*/
|
||||||
|
username: string
|
||||||
|
/**
|
||||||
|
* 用户 id
|
||||||
|
*/
|
||||||
|
id: string
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,7 +27,9 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { h, ref } from 'vue'
|
import { h, ref } from 'vue'
|
||||||
import { NAvatar, NText } from 'naive-ui'
|
import { NAvatar, NText } from 'naive-ui'
|
||||||
import { renderIcon } from '@/utils'
|
import { renderIcon, getLocalStorage } from '@/utils'
|
||||||
|
import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d'
|
||||||
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
import { logout, renderLang } from '@/utils'
|
import { logout, renderLang } from '@/utils'
|
||||||
import { GoSystemSet } from '@/components/GoSystemSet/index'
|
import { GoSystemSet } from '@/components/GoSystemSet/index'
|
||||||
import { GoSystemInfo } from '@/components/GoSystemInfo/index'
|
import { GoSystemInfo } from '@/components/GoSystemInfo/index'
|
||||||
@@ -64,7 +66,17 @@ const renderUserInfo = () => {
|
|||||||
}),
|
}),
|
||||||
h('div', null, [
|
h('div', null, [
|
||||||
h('div', null, [
|
h('div', null, [
|
||||||
h(NText, { depth: 2 }, { default: () => '奔跑的面条' })
|
h(NText, { depth: 2 }, {
|
||||||
|
default: () => {
|
||||||
|
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
|
||||||
|
if (info) {
|
||||||
|
return info[SystemStoreEnum.USER_INFO][SystemStoreUserInfoEnum.USER_NAME];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 'admin';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
]
|
]
|
||||||
@@ -137,4 +149,4 @@ const handleSelect = (key: string) => {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
transform: scale(0.7);
|
transform: scale(0.7);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
@@ -391,12 +391,8 @@ const visualMap = computed(() => {
|
|||||||
// 监听legend color颜色改变type = scroll的颜色
|
// 监听legend color颜色改变type = scroll的颜色
|
||||||
watch(() => legend.value && legend.value.textStyle.color, (newVal) => {
|
watch(() => legend.value && legend.value.textStyle.color, (newVal) => {
|
||||||
if (legend.value && newVal) {
|
if (legend.value && newVal) {
|
||||||
if (!legend.value.pageTextStyle) {
|
legend.value.pageTextStyle.color = newVal
|
||||||
legend.value.pageTextStyle = { color: newVal }
|
}
|
||||||
} else {
|
|
||||||
legend.value.pageTextStyle.color = newVal
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, {
|
}, {
|
||||||
immediate: true,
|
immediate: true,
|
||||||
deep: true,
|
deep: true,
|
||||||
|
|||||||
@@ -69,22 +69,6 @@
|
|||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
<!-- 预设滤镜 -->
|
|
||||||
<div v-if="presetImageList.length" class="preset-filter">
|
|
||||||
<n-image
|
|
||||||
class="preset-img"
|
|
||||||
width="46"
|
|
||||||
preview-disabled
|
|
||||||
object-fit="scale-down"
|
|
||||||
v-for="(item, index) in presetImageList"
|
|
||||||
:key="index"
|
|
||||||
:class="{ 'active-preset': item.hueRotate === chartStyles.hueRotate }"
|
|
||||||
:style="{ filter: `hue-rotate(${item.hueRotate}deg)` }"
|
|
||||||
:src="item.src"
|
|
||||||
@click="() => (chartStyles.hueRotate = item.hueRotate)"
|
|
||||||
></n-image>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 混合模式 -->
|
<!-- 混合模式 -->
|
||||||
<setting-item-box v-if="!isCanvas" :alone="true">
|
<setting-item-box v-if="!isCanvas" :alone="true">
|
||||||
<template #name>
|
<template #name>
|
||||||
@@ -165,12 +149,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, PropType } from 'vue'
|
import { PropType } from 'vue'
|
||||||
import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d'
|
import { PickCreateComponentType, BlendModeEnumList } from '@/packages/index.d'
|
||||||
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
|
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import logoImg from '@/assets/logo.png'
|
|
||||||
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
isGroup: {
|
isGroup: {
|
||||||
@@ -193,48 +175,10 @@ const { HelpOutlineIcon } = icon.ionicons5
|
|||||||
const sliderFormatTooltip = (v: string) => {
|
const sliderFormatTooltip = (v: string) => {
|
||||||
return `${(parseFloat(v) * 100).toFixed(0)}%`
|
return `${(parseFloat(v) * 100).toFixed(0)}%`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 角度格式化
|
// 角度格式化
|
||||||
const degFormatTooltip = (v: string) => {
|
const degFormatTooltip = (v: string) => {
|
||||||
return `${v}deg`
|
return `${v}deg`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 预设滤镜
|
|
||||||
interface presetImageData {
|
|
||||||
index: number
|
|
||||||
src: string
|
|
||||||
hueRotate: number
|
|
||||||
}
|
|
||||||
|
|
||||||
const presetImageList = ref([] as presetImageData[])
|
|
||||||
for (let i = 1; i <= 12; i++) {
|
|
||||||
presetImageList.value.push({
|
|
||||||
index: i,
|
|
||||||
src: logoImg,
|
|
||||||
hueRotate: i * 30
|
|
||||||
})
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped></style>
|
||||||
// 预设滤镜
|
|
||||||
.preset-filter {
|
|
||||||
margin: 20px 0 10px 0;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-between;
|
|
||||||
.preset-img {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
padding: 2px;
|
|
||||||
border-radius: 6px;
|
|
||||||
transition: 0.2s all;
|
|
||||||
cursor: pointer;
|
|
||||||
&:hover {
|
|
||||||
box-shadow: 0 0 0 2px #66a9c9;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.active-preset {
|
|
||||||
box-shadow: 0 0 0 2px #66a9c9;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -48,7 +48,6 @@ export enum MenuEnum {
|
|||||||
UN_GROUP = 'unGroup',
|
UN_GROUP = 'unGroup',
|
||||||
// 后退
|
// 后退
|
||||||
BACK = 'back',
|
BACK = 'back',
|
||||||
// 前进
|
|
||||||
FORWORD = 'forward',
|
FORWORD = 'forward',
|
||||||
// 保存
|
// 保存
|
||||||
SAVE = 'save',
|
SAVE = 'save',
|
||||||
@@ -84,3 +83,15 @@ export enum MacKeyboard {
|
|||||||
ALT_SOURCE_KEY = '⌥',
|
ALT_SOURCE_KEY = '⌥',
|
||||||
SPACE = 'Space'
|
SPACE = 'Space'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 同步状态枚举
|
||||||
|
export enum SyncEnum {
|
||||||
|
// 等待
|
||||||
|
PENDING,
|
||||||
|
// 开始
|
||||||
|
START,
|
||||||
|
// 成功
|
||||||
|
SUCCESS,
|
||||||
|
// 失败
|
||||||
|
FAILURE
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,13 +1,18 @@
|
|||||||
/**
|
// 模块 Path 前缀分类
|
||||||
* @description: 请求结果集
|
export enum ModuleTypeEnum {
|
||||||
*/
|
SYSTEM = 'sys',
|
||||||
|
PROJECT = 'project',
|
||||||
|
}
|
||||||
|
|
||||||
|
// 请求结果集
|
||||||
export enum ResultEnum {
|
export enum ResultEnum {
|
||||||
DATA_SUCCESS = 0,
|
DATA_SUCCESS = 0,
|
||||||
SUCCESS = 200,
|
SUCCESS = 200,
|
||||||
SERVER_ERROR = 500,
|
SERVER_ERROR = 500,
|
||||||
SERVER_FORBIDDEN = 403,
|
SERVER_FORBIDDEN = 403,
|
||||||
NOT_FOUND = 404,
|
NOT_FOUND = 404,
|
||||||
TIMEOUT = 60000
|
TOKEN_OVERDUE = 886,
|
||||||
|
TIMEOUT = 60000,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 数据相关
|
// 数据相关
|
||||||
@@ -28,9 +33,13 @@ export enum RequestContentTypeEnum {
|
|||||||
SQL = 1
|
SQL = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// 头部
|
||||||
* @description: 请求方法
|
export enum RequestHttpHeaderEnum {
|
||||||
*/
|
TOKEN = 'Token',
|
||||||
|
COOKIE = 'Cookie'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 请求方法
|
||||||
export enum RequestHttpEnum {
|
export enum RequestHttpEnum {
|
||||||
GET = 'get',
|
GET = 'get',
|
||||||
POST = 'post',
|
POST = 'post',
|
||||||
@@ -111,9 +120,7 @@ export type RequestParams = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// 常用的contentTyp类型
|
||||||
* @description: 常用的contentTyp类型
|
|
||||||
*/
|
|
||||||
export enum ContentTypeEnum {
|
export enum ContentTypeEnum {
|
||||||
// json
|
// json
|
||||||
JSON = 'application/json;charset=UTF-8',
|
JSON = 'application/json;charset=UTF-8',
|
||||||
|
|||||||
@@ -26,10 +26,15 @@ export enum PageEnum {
|
|||||||
//重定向
|
//重定向
|
||||||
REDIRECT = '/redirect',
|
REDIRECT = '/redirect',
|
||||||
REDIRECT_NAME = 'Redirect',
|
REDIRECT_NAME = 'Redirect',
|
||||||
|
|
||||||
|
// 未发布
|
||||||
|
REDIRECT_UN_PUBLISH = '/redirect/unPublish',
|
||||||
|
REDIRECT_UN_PUBLISH_NAME = 'redirect-un-publish',
|
||||||
|
|
||||||
|
// 重载
|
||||||
RELOAD = '/reload',
|
RELOAD = '/reload',
|
||||||
RELOAD_NAME = 'Reload',
|
RELOAD_NAME = 'Reload',
|
||||||
|
|
||||||
|
|
||||||
// 首页
|
// 首页
|
||||||
BASE_HOME = '/project',
|
BASE_HOME = '/project',
|
||||||
BASE_HOME_NAME = 'Project',
|
BASE_HOME_NAME = 'Project',
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
export enum StorageEnum {
|
export enum StorageEnum {
|
||||||
// 全局设置
|
// 全局设置
|
||||||
GO_SYSTEM_SETTING_STORE = 'GO_SYSTEM_SETTING',
|
GO_SETTING_STORE = 'GO_SETTING',
|
||||||
// token 等信息
|
|
||||||
GO_ACCESS_TOKEN_STORE = 'GO_ACCESS_TOKEN',
|
|
||||||
// 登录信息
|
// 登录信息
|
||||||
GO_LOGIN_INFO_STORE = 'GO_LOGIN_INFO',
|
GO_SYSTEM_STORE = 'GO_SYSTEM',
|
||||||
// 语言
|
// 语言
|
||||||
GO_LANG_STORE = 'GO_LANG',
|
GO_LANG_STORE = 'GO_LANG',
|
||||||
// 当前选择的主题
|
// 当前选择的主题
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ export * from '@/hooks/useTheme.hook'
|
|||||||
export * from '@/hooks/usePreviewScale.hook'
|
export * from '@/hooks/usePreviewScale.hook'
|
||||||
export * from '@/hooks/useCode.hook'
|
export * from '@/hooks/useCode.hook'
|
||||||
export * from '@/hooks/useChartDataFetch.hook'
|
export * from '@/hooks/useChartDataFetch.hook'
|
||||||
|
export * from '@/hooks/useSystemInit.hook'
|
||||||
export * from '@/hooks/useChartDataPondFetch.hook'
|
export * from '@/hooks/useChartDataPondFetch.hook'
|
||||||
export * from '@/hooks/useLifeHandler.hook'
|
export * from '@/hooks/useLifeHandler.hook'
|
||||||
export * from '@/hooks/useLang.hook'
|
export * from '@/hooks/useLang.hook'
|
||||||
|
|||||||
@@ -90,12 +90,12 @@ export const useChartDataFetch = (
|
|||||||
|
|
||||||
// 普通初始化与组件交互处理监听
|
// 普通初始化与组件交互处理监听
|
||||||
watch(
|
watch(
|
||||||
() => targetComponent.request.requestParams,
|
() => targetComponent.request,
|
||||||
() => {
|
() => {
|
||||||
fetchFn()
|
fetchFn()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
immediate: false,
|
immediate: true,
|
||||||
deep: true
|
deep: true
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -105,11 +105,7 @@ export const useChartDataFetch = (
|
|||||||
// 单位
|
// 单位
|
||||||
const unit = targetInterval && targetInterval.value ? targetUnit.value : globalUnit.value
|
const unit = targetInterval && targetInterval.value ? targetUnit.value : globalUnit.value
|
||||||
// 开启轮询
|
// 开启轮询
|
||||||
if (time) {
|
if (time) fetchInterval = setInterval(fetchFn, intervalUnitHandle(time, unit))
|
||||||
fetchInterval = setInterval(fetchFn, intervalUnitHandle(time, unit))
|
|
||||||
} else {
|
|
||||||
fetchFn()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// eslint-disable-next-line no-empty
|
// eslint-disable-next-line no-empty
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -118,11 +114,10 @@ export const useChartDataFetch = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isPreview()) {
|
if (isPreview()) {
|
||||||
|
// 判断是否是数据池类型
|
||||||
targetComponent.request.requestDataType === RequestDataTypeEnum.Pond
|
targetComponent.request.requestDataType === RequestDataTypeEnum.Pond
|
||||||
? addGlobalDataInterface(targetComponent, useChartEditStore, updateCallback || echartsUpdateHandle)
|
? addGlobalDataInterface(targetComponent, useChartEditStore, updateCallback || echartsUpdateHandle)
|
||||||
: requestIntervalFn()
|
: requestIntervalFn()
|
||||||
} else {
|
|
||||||
requestIntervalFn()
|
|
||||||
}
|
}
|
||||||
return { vChartRef }
|
return { vChartRef }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { toRaw, watch, computed, ComputedRef } from 'vue'
|
import { toRaw } from 'vue'
|
||||||
import { customizeHttp } from '@/api/http'
|
import { customizeHttp } from '@/api/http'
|
||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
@@ -20,7 +20,7 @@ const mittDataPondMap = new Map<string, DataPondMapType[]>()
|
|||||||
// 创建单个数据项轮询接口
|
// 创建单个数据项轮询接口
|
||||||
const newPondItemInterval = (
|
const newPondItemInterval = (
|
||||||
requestGlobalConfig: RequestGlobalConfigType,
|
requestGlobalConfig: RequestGlobalConfigType,
|
||||||
requestDataPondItem: ComputedRef<RequestDataPondItemType>,
|
requestDataPondItem: RequestDataPondItemType,
|
||||||
dataPondMapItem?: DataPondMapType[]
|
dataPondMapItem?: DataPondMapType[]
|
||||||
) => {
|
) => {
|
||||||
if (!dataPondMapItem) return
|
if (!dataPondMapItem) return
|
||||||
@@ -31,7 +31,8 @@ const newPondItemInterval = (
|
|||||||
// 请求
|
// 请求
|
||||||
const fetchFn = async () => {
|
const fetchFn = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await customizeHttp(toRaw(requestDataPondItem.value.dataPondRequestConfig), toRaw(requestGlobalConfig))
|
const res = await customizeHttp(toRaw(requestDataPondItem.dataPondRequestConfig), toRaw(requestGlobalConfig))
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
try {
|
try {
|
||||||
// 遍历更新回调函数
|
// 遍历更新回调函数
|
||||||
@@ -48,32 +49,19 @@ const newPondItemInterval = (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(
|
|
||||||
() => requestDataPondItem.value.dataPondRequestConfig.requestParams.Params,
|
|
||||||
() => {
|
|
||||||
fetchFn()
|
|
||||||
},
|
|
||||||
{
|
|
||||||
immediate: false,
|
|
||||||
deep: true
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
// 立即调用
|
// 立即调用
|
||||||
fetchFn()
|
fetchFn()
|
||||||
|
|
||||||
|
const targetInterval = requestDataPondItem.dataPondRequestConfig.requestInterval
|
||||||
const targetInterval = requestDataPondItem.value.dataPondRequestConfig.requestInterval
|
const targetUnit = requestDataPondItem.dataPondRequestConfig.requestIntervalUnit
|
||||||
const targetUnit = requestDataPondItem.value.dataPondRequestConfig.requestIntervalUnit
|
|
||||||
|
|
||||||
const globalRequestInterval = requestGlobalConfig.requestInterval
|
const globalRequestInterval = requestGlobalConfig.requestInterval
|
||||||
const globalUnit = requestGlobalConfig.requestIntervalUnit
|
const globalUnit = requestGlobalConfig.requestIntervalUnit
|
||||||
|
|
||||||
// 定时时间
|
// 定时时间
|
||||||
const time = targetInterval ? targetInterval : globalRequestInterval
|
const time = targetInterval ? targetInterval : globalRequestInterval
|
||||||
// 单位
|
// 单位
|
||||||
const unit = targetInterval ? targetUnit : globalUnit
|
const unit = targetInterval ? targetUnit : globalUnit
|
||||||
// 开启轮询
|
// 开启轮询
|
||||||
if (time) fetchInterval = setInterval(fetchFn, intervalUnitHandle(time, unit))
|
if (time) fetchInterval = setInterval(fetchFn, intervalUnitHandle(time, unit))
|
||||||
}
|
}
|
||||||
@@ -108,16 +96,13 @@ export const useChartDataPondFetch = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 初始化数据池
|
// 初始化数据池
|
||||||
const initDataPond = (useChartEditStore: ChartEditStoreType) => {
|
const initDataPond = (requestGlobalConfig: RequestGlobalConfigType) => {
|
||||||
const { requestGlobalConfig } = useChartEditStore()
|
const { requestDataPond } = requestGlobalConfig
|
||||||
const chartEditStore = useChartEditStore()
|
|
||||||
// 根据 mapId 查找对应的数据池配置
|
// 根据 mapId 查找对应的数据池配置
|
||||||
for (let pondKey of mittDataPondMap.keys()) {
|
for (let pondKey of mittDataPondMap.keys()) {
|
||||||
const requestDataPondItem = computed(() => {
|
const requestDataPondItem = requestDataPond.find(item => item.dataPondId === pondKey)
|
||||||
return requestGlobalConfig.requestDataPond.find(item => item.dataPondId === pondKey)
|
|
||||||
}) as ComputedRef<RequestDataPondItemType>
|
|
||||||
if (requestDataPondItem) {
|
if (requestDataPondItem) {
|
||||||
newPondItemInterval(chartEditStore.requestGlobalConfig, requestDataPondItem, mittDataPondMap.get(pondKey))
|
newPondItemInterval(requestGlobalConfig, requestDataPondItem, mittDataPondMap.get(pondKey))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { toRefs } from 'vue'
|
import { toRefs } from 'vue'
|
||||||
import { isPreview } from '@/utils'
|
|
||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
|
||||||
@@ -13,7 +12,6 @@ export const useChartInteract = (
|
|||||||
param: { [T: string]: any },
|
param: { [T: string]: any },
|
||||||
interactEventOn: string
|
interactEventOn: string
|
||||||
) => {
|
) => {
|
||||||
if (!isPreview()) return
|
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
const { interactEvents } = chartConfig.events
|
const { interactEvents } = chartConfig.events
|
||||||
const fnOnEvent = interactEvents.filter(item => {
|
const fnOnEvent = interactEvents.filter(item => {
|
||||||
@@ -22,37 +20,20 @@ export const useChartInteract = (
|
|||||||
|
|
||||||
if (fnOnEvent.length === 0) return
|
if (fnOnEvent.length === 0) return
|
||||||
fnOnEvent.forEach(item => {
|
fnOnEvent.forEach(item => {
|
||||||
|
const index = chartEditStore.fetchTargetIndex(item.interactComponentId)
|
||||||
const globalConfigPindAprndex = chartEditStore.requestGlobalConfig.requestDataPond.findIndex(cItem =>
|
if (index === -1) return
|
||||||
cItem.dataPondId === item.interactComponentId
|
const { Params, Header } = toRefs(chartEditStore.componentList[index].request.requestParams)
|
||||||
)
|
Object.keys(item.interactFn).forEach(key => {
|
||||||
if (globalConfigPindAprndex !== -1) {
|
if (Params.value[key]) {
|
||||||
const { Params, Header } = toRefs(chartEditStore.requestGlobalConfig.requestDataPond[globalConfigPindAprndex].dataPondRequestConfig.requestParams)
|
Params.value[key] = param[item.interactFn[key]]
|
||||||
|
}
|
||||||
Object.keys(item.interactFn).forEach(key => {
|
if (Header.value[key]) {
|
||||||
if (key in Params.value) {
|
Header.value[key] = param[item.interactFn[key]]
|
||||||
Params.value[key] = param[item.interactFn[key]]
|
}
|
||||||
}
|
})
|
||||||
if (key in Header.value) {
|
|
||||||
Header.value[key] = param[item.interactFn[key]]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
const index = chartEditStore.fetchTargetIndex(item.interactComponentId)
|
|
||||||
if (index === -1) return
|
|
||||||
const { Params, Header } = toRefs(chartEditStore.componentList[index].request.requestParams)
|
|
||||||
|
|
||||||
Object.keys(item.interactFn).forEach(key => {
|
|
||||||
if (key in Params.value) {
|
|
||||||
Params.value[key] = param[item.interactFn[key]]
|
|
||||||
}
|
|
||||||
if (key in Header.value) {
|
|
||||||
Header.value[key] = param[item.interactFn[key]]
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 联动事件触发的 type 变更时,清除当前绑定内容
|
// 联动事件触发的 type 变更时,清除当前绑定内容
|
||||||
export const clearInteractEvent = (chartConfig: CreateComponentType) => {
|
export const clearInteractEvent = (chartConfig: CreateComponentType) => {
|
||||||
|
|
||||||
|
|||||||
@@ -1,218 +1,218 @@
|
|||||||
import throttle from 'lodash/throttle'
|
import throttle from 'lodash/throttle'
|
||||||
|
|
||||||
// 拆出来是为了更好的分离单独复用
|
// 拆出来是为了更好的分离单独复用
|
||||||
|
|
||||||
// * 屏幕缩放适配(两边留白)
|
// * 屏幕缩放适配(两边留白)
|
||||||
export const usePreviewFitScale = (
|
export const usePreviewFitScale = (
|
||||||
width: number,
|
width: number,
|
||||||
height: number,
|
height: number,
|
||||||
scaleDom: HTMLElement | null,
|
scaleDom: HTMLElement | null,
|
||||||
callback?: (scale: {
|
callback?: (scale: {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}) => void
|
}) => void
|
||||||
) => {
|
) => {
|
||||||
// * 画布尺寸(px)
|
// * 画布尺寸(px)
|
||||||
const baseWidth = width
|
const baseWidth = width
|
||||||
const baseHeight = height
|
const baseHeight = height
|
||||||
|
|
||||||
// * 默认缩放值
|
// * 默认缩放值
|
||||||
const scale = {
|
const scale = {
|
||||||
width: 1,
|
width: 1,
|
||||||
height: 1,
|
height: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 需保持的比例
|
// * 需保持的比例
|
||||||
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
||||||
const calcRate = () => {
|
const calcRate = () => {
|
||||||
// 当前屏幕宽高比
|
// 当前屏幕宽高比
|
||||||
const currentRate = parseFloat(
|
const currentRate = parseFloat(
|
||||||
(window.innerWidth / window.innerHeight).toFixed(5)
|
(window.innerWidth / window.innerHeight).toFixed(5)
|
||||||
)
|
)
|
||||||
if (scaleDom) {
|
if (scaleDom) {
|
||||||
if (currentRate > baseProportion) {
|
if (currentRate > baseProportion) {
|
||||||
// 表示更宽
|
// 表示更宽
|
||||||
scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5))
|
scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5))
|
||||||
scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5))
|
scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
} else {
|
} else {
|
||||||
// 表示更高
|
// 表示更高
|
||||||
scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5))
|
scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5))
|
||||||
scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5))
|
scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
}
|
}
|
||||||
if (callback) callback(scale)
|
if (callback) callback(scale)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resize = throttle(() => {
|
const resize = throttle(() => {
|
||||||
calcRate()
|
calcRate()
|
||||||
}, 200)
|
}, 200)
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 改变窗口大小重新绘制
|
||||||
const windowResize = () => {
|
const windowResize = () => {
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 卸载监听
|
// * 改变窗口大小重新绘制
|
||||||
const unWindowResize = () => {
|
const unWindowResize = () => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
calcRate,
|
calcRate,
|
||||||
windowResize,
|
windowResize,
|
||||||
unWindowResize,
|
unWindowResize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// * X轴撑满,Y轴滚动条
|
// * X轴撑满,Y轴滚动条
|
||||||
export const usePreviewScrollYScale = (
|
export const usePreviewScrollYScale = (
|
||||||
width: number,
|
width: number,
|
||||||
height: number,
|
height: number,
|
||||||
scaleDom: HTMLElement | null,
|
scaleDom: HTMLElement | null,
|
||||||
callback?: (scale: {
|
callback?: (scale: {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}) => void
|
}) => void
|
||||||
) => {
|
) => {
|
||||||
// * 画布尺寸(px)
|
// * 画布尺寸(px)
|
||||||
const baseWidth = width
|
const baseWidth = width
|
||||||
const baseHeight = height
|
const baseHeight = height
|
||||||
|
|
||||||
// * 默认缩放值
|
// * 默认缩放值
|
||||||
const scale = {
|
const scale = {
|
||||||
width: 1,
|
width: 1,
|
||||||
height: 1,
|
height: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 需保持的比例
|
// * 需保持的比例
|
||||||
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
||||||
const calcRate = () => {
|
const calcRate = () => {
|
||||||
if (scaleDom) {
|
if (scaleDom) {
|
||||||
scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5))
|
scale.height = parseFloat(((window.innerWidth / baseProportion) / baseHeight).toFixed(5))
|
||||||
scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5))
|
scale.width = parseFloat((window.innerWidth / baseWidth).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
if (callback) callback(scale)
|
if (callback) callback(scale)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resize = throttle(() => {
|
const resize = throttle(() => {
|
||||||
calcRate()
|
calcRate()
|
||||||
}, 200)
|
}, 200)
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 改变窗口大小重新绘制
|
||||||
const windowResize = () => {
|
const windowResize = () => {
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 卸载监听
|
// * 改变窗口大小重新绘制
|
||||||
const unWindowResize = () => {
|
const unWindowResize = () => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
calcRate,
|
calcRate,
|
||||||
windowResize,
|
windowResize,
|
||||||
unWindowResize,
|
unWindowResize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// * Y轴撑满,X轴滚动条
|
// * Y轴撑满,X轴滚动条
|
||||||
export const usePreviewScrollXScale = (
|
export const usePreviewScrollXScale = (
|
||||||
width: number,
|
width: number,
|
||||||
height: number,
|
height: number,
|
||||||
scaleDom: HTMLElement | null,
|
scaleDom: HTMLElement | null,
|
||||||
callback?: (scale: {
|
callback?: (scale: {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}) => void
|
}) => void
|
||||||
) => {
|
) => {
|
||||||
// * 画布尺寸(px)
|
// * 画布尺寸(px)
|
||||||
const baseWidth = width
|
const baseWidth = width
|
||||||
const baseHeight = height
|
const baseHeight = height
|
||||||
|
|
||||||
// * 默认缩放值
|
// * 默认缩放值
|
||||||
const scale = {
|
const scale = {
|
||||||
height: 1,
|
height: 1,
|
||||||
width: 1,
|
width: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 需保持的比例
|
// * 需保持的比例
|
||||||
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5))
|
||||||
const calcRate = () => {
|
const calcRate = () => {
|
||||||
if (scaleDom) {
|
if (scaleDom) {
|
||||||
scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5))
|
scale.width = parseFloat(((window.innerHeight * baseProportion) / baseWidth).toFixed(5))
|
||||||
scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5))
|
scale.height = parseFloat((window.innerHeight / baseHeight).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
if (callback) callback(scale)
|
if (callback) callback(scale)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resize = throttle(() => {
|
const resize = throttle(() => {
|
||||||
calcRate()
|
calcRate()
|
||||||
}, 200)
|
}, 200)
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 改变窗口大小重新绘制
|
||||||
const windowResize = () => {
|
const windowResize = () => {
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 卸载监听
|
// * 改变窗口大小重新绘制
|
||||||
const unWindowResize = () => {
|
const unWindowResize = () => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
calcRate,
|
calcRate,
|
||||||
windowResize,
|
windowResize,
|
||||||
unWindowResize,
|
unWindowResize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 变形内容,宽高铺满
|
// * 变形内容,宽高铺满
|
||||||
export const usePreviewFullScale = (
|
export const usePreviewFullScale = (
|
||||||
width: number,
|
width: number,
|
||||||
height: number,
|
height: number,
|
||||||
scaleDom: HTMLElement | null,
|
scaleDom: HTMLElement | null,
|
||||||
callback?: (scale: {
|
callback?: (scale: {
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
}) => void
|
}) => void
|
||||||
) => {
|
) => {
|
||||||
|
|
||||||
// * 默认缩放值
|
// * 默认缩放值
|
||||||
const scale = {
|
const scale = {
|
||||||
width: 1,
|
width: 1,
|
||||||
height: 1,
|
height: 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
const calcRate = () => {
|
const calcRate = () => {
|
||||||
if (scaleDom) {
|
if (scaleDom) {
|
||||||
scale.width = parseFloat((window.innerWidth / width).toFixed(5))
|
scale.width = parseFloat((window.innerWidth / width).toFixed(5))
|
||||||
scale.height = parseFloat((window.innerHeight / height).toFixed(5))
|
scale.height = parseFloat((window.innerHeight / height).toFixed(5))
|
||||||
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
scaleDom.style.transform = `scale(${scale.width}, ${scale.height})`
|
||||||
if (callback) callback(scale)
|
if (callback) callback(scale)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const resize = throttle(() => {
|
const resize = throttle(() => {
|
||||||
calcRate()
|
calcRate()
|
||||||
}, 200)
|
}, 200)
|
||||||
|
|
||||||
// * 改变窗口大小重新绘制
|
// * 改变窗口大小重新绘制
|
||||||
const windowResize = () => {
|
const windowResize = () => {
|
||||||
window.addEventListener('resize', resize)
|
window.addEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// * 卸载监听
|
// * 改变窗口大小重新绘制
|
||||||
const unWindowResize = () => {
|
const unWindowResize = () => {
|
||||||
window.removeEventListener('resize', resize)
|
window.removeEventListener('resize', resize)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
calcRate,
|
calcRate,
|
||||||
windowResize,
|
windowResize,
|
||||||
unWindowResize,
|
unWindowResize,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
23
src/hooks/useSystemInit.hook.ts
Normal 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 信息的 url 地址,用来拼接展示图片的地址
|
||||||
|
const getOssUrl = async () => {
|
||||||
|
const res = await ossUrlApi({})
|
||||||
|
if (res && res.code === ResultEnum.SUCCESS) {
|
||||||
|
systemStore.setItem(SystemStoreEnum.FETCH_INFO, {
|
||||||
|
OSSUrl: res.data?.bucketURL
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行
|
||||||
|
getOssUrl()
|
||||||
|
}
|
||||||
@@ -11,6 +11,8 @@ const global = {
|
|||||||
help: 'Help',
|
help: 'Help',
|
||||||
contact: 'About Software',
|
contact: 'About Software',
|
||||||
logout: 'Logout',
|
logout: 'Logout',
|
||||||
|
logout_success: 'Logout success!',
|
||||||
|
logout_failure: 'Logout Failed!',
|
||||||
// system setting
|
// system setting
|
||||||
sys_set: 'System Setting',
|
sys_set: 'System Setting',
|
||||||
lang_set: 'Language Setting',
|
lang_set: 'Language Setting',
|
||||||
@@ -26,8 +28,14 @@ const global = {
|
|||||||
r_more: 'More',
|
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 {
|
export default {
|
||||||
global,
|
global,
|
||||||
|
http,
|
||||||
login,
|
login,
|
||||||
project
|
project
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ export default {
|
|||||||
desc: "Login",
|
desc: "Login",
|
||||||
form_auto: "Sign in automatically",
|
form_auto: "Sign in automatically",
|
||||||
form_button: "Login",
|
form_button: "Login",
|
||||||
login_success: "Login success",
|
login_success: "Login success!",
|
||||||
login_message: "Please complete the letter",
|
login_message: "Please complete the letter!",
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
export default {
|
export default {
|
||||||
create_btn: 'Create',
|
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',
|
project: 'Project',
|
||||||
my: 'My',
|
my: 'My',
|
||||||
new_project: 'New Project',
|
new_project: 'New Project',
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ const global = {
|
|||||||
help: '帮助中心',
|
help: '帮助中心',
|
||||||
contact: '关于软件',
|
contact: '关于软件',
|
||||||
logout: '退出登录',
|
logout: '退出登录',
|
||||||
|
logout_success: '退出成功!',
|
||||||
|
logout_failure: '退出失败!',
|
||||||
// 系统设置
|
// 系统设置
|
||||||
sys_set: '系统设置',
|
sys_set: '系统设置',
|
||||||
lang_set: '语言设置',
|
lang_set: '语言设置',
|
||||||
@@ -18,16 +20,27 @@ const global = {
|
|||||||
r_edit: '编辑',
|
r_edit: '编辑',
|
||||||
r_preview: '预览',
|
r_preview: '预览',
|
||||||
r_copy: '克隆',
|
r_copy: '克隆',
|
||||||
|
r_copy_success: '克隆成功!',
|
||||||
r_rename: '重命名',
|
r_rename: '重命名',
|
||||||
|
r_rename_success: '重命名成功!',
|
||||||
r_publish: '发布',
|
r_publish: '发布',
|
||||||
|
r_publish_success: '成功发布!',
|
||||||
r_unpublish: '取消发布',
|
r_unpublish: '取消发布',
|
||||||
|
r_unpublish_success: '取消成功!',
|
||||||
r_download: '下载',
|
r_download: '下载',
|
||||||
r_delete: '删除',
|
r_delete: '删除',
|
||||||
|
r_delete_success: '删除成功!',
|
||||||
r_more: '更多',
|
r_more: '更多',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const http = {
|
||||||
|
error_message: '获取数据失败,请稍后重试!',
|
||||||
|
token_overdue_message: '登录过期,请重新登录!'
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
global,
|
global,
|
||||||
|
http,
|
||||||
login,
|
login,
|
||||||
project
|
project
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ export default {
|
|||||||
desc: "登录",
|
desc: "登录",
|
||||||
form_auto: "自动登录",
|
form_auto: "自动登录",
|
||||||
form_button: "登录",
|
form_button: "登录",
|
||||||
login_success: "登录成功",
|
|
||||||
login_message: "请填写完整信息",
|
login_message: "请填写完整信息",
|
||||||
|
login_success: "登录成功!",
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
export default {
|
export default {
|
||||||
// aside
|
// aside
|
||||||
create_btn: '新建',
|
create_btn: '新建',
|
||||||
|
create_success: '新建成功!',
|
||||||
|
create_failure: '新建失败,请稍后重试!',
|
||||||
create_tip: '从哪里出发好呢?',
|
create_tip: '从哪里出发好呢?',
|
||||||
project: '项目',
|
project: '项目',
|
||||||
my: '我的',
|
my: '我的',
|
||||||
|
|||||||
@@ -7,22 +7,6 @@
|
|||||||
</n-input-number>
|
</n-input-number>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
</SettingItemBox>
|
</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>
|
|
||||||
<!-- Echarts 全局设置 -->
|
<!-- Echarts 全局设置 -->
|
||||||
<SettingItemBox name="进度条">
|
<SettingItemBox name="进度条">
|
||||||
<SettingItem name="颜色">
|
<SettingItem name="颜色">
|
||||||
@@ -47,8 +31,24 @@
|
|||||||
></n-color-picker>
|
></n-color-picker>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
</SettingItemBox>
|
</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="轨道">
|
<SettingItemBox name="轨道样式">
|
||||||
<SettingItem name="颜色">
|
<SettingItem name="颜色">
|
||||||
<n-color-picker size="small" :modes="['hex']" v-model:value="item.data[1].itemStyle.color"></n-color-picker>
|
<n-color-picker size="small" :modes="['hex']" v-model:value="item.data[1].itemStyle.color"></n-color-picker>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
@@ -69,18 +69,6 @@
|
|||||||
v-model:value="item.data[1].itemStyle.shadowColor"
|
v-model:value="item.data[1].itemStyle.shadowColor"
|
||||||
></n-color-picker>
|
></n-color-picker>
|
||||||
</SettingItem>
|
</SettingItem>
|
||||||
<SettingItem name="轨道宽度">
|
|
||||||
<n-select
|
|
||||||
v-model:value="item.radius[0]"
|
|
||||||
size="small"
|
|
||||||
:options="[
|
|
||||||
{ label: '窄', value: '75%' },
|
|
||||||
{ label: '中', value: '60%' },
|
|
||||||
{ label: '宽', value: '45%' },
|
|
||||||
{ label: '更宽', value: '30%' }
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
</SettingItem>
|
|
||||||
</SettingItemBox>
|
</SettingItemBox>
|
||||||
</CollapseItem>
|
</CollapseItem>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ const option = reactive({
|
|||||||
const dataHandle = (newData: any) => {
|
const dataHandle = (newData: any) => {
|
||||||
const d = parseFloat(`${newData}`) * 100
|
const d = parseFloat(`${newData}`) * 100
|
||||||
let config = props.chartConfig.option
|
let config = props.chartConfig.option
|
||||||
config.title.text = `${+d.toFixed(2)}%`
|
config.title.text = d.toFixed(2) + '%'
|
||||||
config.series[0].data[0].value[0] = d
|
config.series[0].data[0].value[0] = d
|
||||||
config.series[0].data[1].value[0] = 100 - d
|
config.series[0].data[1].value[0] = 100 - d
|
||||||
option.value = mergeTheme(props.chartConfig.option, props.themeSetting, includes)
|
option.value = mergeTheme(props.chartConfig.option, props.themeSetting, includes)
|
||||||
@@ -68,7 +68,7 @@ watch(
|
|||||||
useChartDataFetch(props.chartConfig, useChartEditStore, (resData: number) => {
|
useChartDataFetch(props.chartConfig, useChartEditStore, (resData: number) => {
|
||||||
let d = parseFloat(`${resData}`) * 100
|
let d = parseFloat(`${resData}`) * 100
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
option.value.title.text = `${+d.toFixed(2)}%`
|
option.value.title.text = d.toFixed(2) + '%'
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
option.value.series[0].data[0].value[0] = d
|
option.value.series[0].data[0].value[0] = d
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ watch(
|
|||||||
() => props.chartConfig.option,
|
() => props.chartConfig.option,
|
||||||
newVal => {
|
newVal => {
|
||||||
try {
|
try {
|
||||||
updateDatasetHandler((newVal as any as OptionType).dataset)
|
updateDatasetHandler((newVal as OptionType).dataset)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error)
|
console.log(error)
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/packages/components/Informations/Inputs/InputsDate/config.ts
Executable file → Normal file
@@ -4,7 +4,7 @@ import { PublicConfigClass } from '@/packages/public'
|
|||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { chartInitConfig } from '@/settings/designSetting'
|
import { chartInitConfig } from '@/settings/designSetting'
|
||||||
import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum'
|
import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum'
|
||||||
import { interactActions, ComponentInteractEventEnum, DefaultTypeEnum, DifferUnitEnum } from './interact'
|
import { interactActions, ComponentInteractEventEnum } from './interact'
|
||||||
import { InputsDateConfig } from './index'
|
import { InputsDateConfig } from './index'
|
||||||
|
|
||||||
export const option = {
|
export const option = {
|
||||||
@@ -12,14 +12,9 @@ export const option = {
|
|||||||
[COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATE,
|
[COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATE,
|
||||||
// 下拉展示
|
// 下拉展示
|
||||||
isPanel: 0,
|
isPanel: 0,
|
||||||
// 默认值
|
dataset: dayjs().valueOf(),
|
||||||
dataset: dayjs().valueOf() as number | number[] | null,
|
differValue: 0
|
||||||
// 默认值类型
|
|
||||||
defaultType: DefaultTypeEnum.STATIC,
|
|
||||||
// 动态默认值偏移单位
|
|
||||||
differUnit: [DifferUnitEnum.DAY, DifferUnitEnum.DAY],
|
|
||||||
// 动态默认值偏移值
|
|
||||||
differValue: [0, 0]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class Config extends PublicConfigClass implements CreateComponentType {
|
export default class Config extends PublicConfigClass implements CreateComponentType {
|
||||||
|
|||||||
135
src/packages/components/Informations/Inputs/InputsDate/config.vue
Executable file → Normal file
@@ -8,67 +8,39 @@
|
|||||||
<collapse-item name="时间配置" :expanded="true">
|
<collapse-item name="时间配置" :expanded="true">
|
||||||
<setting-item-box name="基础">
|
<setting-item-box name="基础">
|
||||||
<setting-item name="类型">
|
<setting-item name="类型">
|
||||||
<n-select v-model:value="optionData.componentInteractEventKey" size="small" :options="datePickerTypeOptions"
|
<n-select v-model:value="optionData.componentInteractEventKey" size="small" :options="datePickerTypeOptions" />
|
||||||
@update:value="datePickerTypeUpdate"/>
|
|
||||||
</setting-item>
|
</setting-item>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
<setting-item-box name="默认值">
|
<setting-item-box name="默认值" :alone="true">
|
||||||
<setting-item name="类型">
|
<n-date-picker size="small" v-model:value="optionData.dataset" :type="optionData.componentInteractEventKey" />
|
||||||
<n-select v-model:value="optionData.defaultType" size="small" :options="defaultTypeOptions"
|
</setting-item-box>
|
||||||
@update:value="defaultTypeUpdate" />
|
|
||||||
</setting-item>
|
|
||||||
|
|
||||||
</setting-item-box>
|
<setting-item-box :alone="true">
|
||||||
<setting-item-box v-if="optionData.defaultType === DefaultTypeEnum.STATIC" :alone="true">
|
|
||||||
<setting-item name="静态默认值">
|
|
||||||
<n-date-picker size="small" clearable v-model:value="optionData.dataset" :type="optionData.componentInteractEventKey" />
|
|
||||||
</setting-item>
|
|
||||||
</setting-item-box>
|
|
||||||
<setting-item-box v-if="optionData.defaultType === DefaultTypeEnum.DYNAMIC" >
|
|
||||||
<template #name>
|
<template #name>
|
||||||
<n-text></n-text>
|
<n-text>动态</n-text>
|
||||||
<n-tooltip trigger="hover">
|
<n-tooltip trigger="hover">
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<n-icon size="21" :depth="3">
|
<n-icon size="21" :depth="3">
|
||||||
<help-outline-icon></help-outline-icon>
|
<help-outline-icon></help-outline-icon>
|
||||||
</n-icon>
|
</n-icon>
|
||||||
</template>
|
</template>
|
||||||
<span>打开页面时浏览器操作系统的系统时间+偏移量(单位)</span>
|
<n-text>动态值不为0时,默认值:取当天时间相加当前值</n-text>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<setting-item :name="differValueName">
|
<n-input-number v-model:value="optionData.differValue" class="input-num-width" size="small" :min="-40" :max="40">
|
||||||
<n-input-number v-model:value="optionData.differValue[0]" class="input-num-width" size="small">
|
<template #suffix> 天 </template>
|
||||||
<template #suffix>
|
</n-input-number>
|
||||||
{{DifferUnitObject[optionData.differUnit[0]]}}
|
|
||||||
</template>
|
|
||||||
</n-input-number>
|
|
||||||
</setting-item>
|
|
||||||
<setting-item :name="differUnitName">
|
|
||||||
<n-select v-model:value="optionData.differUnit[0]" size="small" :options="differUnitOptions" />
|
|
||||||
</setting-item>
|
|
||||||
<setting-item v-if="isRange" name="结束值动态偏移量">
|
|
||||||
<n-input-number v-model:value="optionData.differValue[1]" class="input-num-width" size="small">
|
|
||||||
<template #suffix>
|
|
||||||
{{DifferUnitObject[optionData.differUnit[1]]}}
|
|
||||||
</template>
|
|
||||||
</n-input-number>
|
|
||||||
</setting-item>
|
|
||||||
<setting-item v-if="isRange" name="结束值偏移单位">
|
|
||||||
<n-select v-model:value="optionData.differUnit[1]" size="small" :options="differUnitOptions" />
|
|
||||||
</setting-item>
|
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
</collapse-item>
|
</collapse-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { PropType, computed } from 'vue'
|
import { PropType } from 'vue'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
|
||||||
import { option } from './config'
|
import { option } from './config'
|
||||||
import { ComponentInteractEventEnum, DefaultTypeEnum, DifferUnitEnum, DifferUnitObject } from './interact'
|
import { ComponentInteractEventEnum } from './interact'
|
||||||
import dayjs from "dayjs";
|
|
||||||
|
|
||||||
const { HelpOutlineIcon } = icon.ionicons5
|
const { HelpOutlineIcon } = icon.ionicons5
|
||||||
|
|
||||||
@@ -128,87 +100,4 @@ const datePickerTypeOptions = [
|
|||||||
value: ComponentInteractEventEnum.QUARTER_RANGE
|
value: ComponentInteractEventEnum.QUARTER_RANGE
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
const defaultTypeOptions = [
|
|
||||||
{
|
|
||||||
label: '静态',
|
|
||||||
value: DefaultTypeEnum.STATIC
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '动态',
|
|
||||||
value: DefaultTypeEnum.DYNAMIC
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: '无',
|
|
||||||
value: DefaultTypeEnum.NONE
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
const differUnitOptions = [
|
|
||||||
// ManipulateType
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.DAY,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.DAY]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.WEEK,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.WEEK]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.MONTH,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.MONTH]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.QUARTER,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.QUARTER]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.YEAR,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.YEAR]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.HOUR,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.HOUR]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.MINUTE,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.MINUTE]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.SECOND,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.SECOND]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: DifferUnitEnum.MILLISECOND,
|
|
||||||
label: DifferUnitObject[DifferUnitEnum.MILLISECOND]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
const isRange = computed(() => {
|
|
||||||
return props.optionData.componentInteractEventKey.endsWith('range')
|
|
||||||
})
|
|
||||||
|
|
||||||
const differValueName = computed(() => {
|
|
||||||
return isRange.value ? '开始值动态偏移量' : '动态偏移量'
|
|
||||||
})
|
|
||||||
|
|
||||||
const differUnitName = computed(() => {
|
|
||||||
return isRange.value ? '开始值偏移单位' : '偏移单位'
|
|
||||||
})
|
|
||||||
|
|
||||||
const datePickerTypeUpdate = () => {
|
|
||||||
props.optionData.dataset = isRange.value ? [dayjs().valueOf(), dayjs().valueOf()] : dayjs().valueOf()
|
|
||||||
}
|
|
||||||
|
|
||||||
const defaultTypeUpdate = (v: string) => {
|
|
||||||
if (v === DefaultTypeEnum.STATIC) {
|
|
||||||
datePickerTypeUpdate()
|
|
||||||
} else {
|
|
||||||
// DefaultTypeEnum.
|
|
||||||
props.optionData.dataset = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
137
src/packages/components/Informations/Inputs/InputsDate/index.vue
Executable file → Normal file
@@ -1,7 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<n-date-picker
|
<n-date-picker
|
||||||
v-model:value="option.dataset"
|
v-model:value="option.dataset"
|
||||||
clearable
|
|
||||||
:panel="!!chartConfig.option.isPanel"
|
:panel="!!chartConfig.option.isPanel"
|
||||||
:type="chartConfig.option.componentInteractEventKey"
|
:type="chartConfig.option.componentInteractEventKey"
|
||||||
:style="`width:${w}px;`"
|
:style="`width:${w}px;`"
|
||||||
@@ -10,15 +9,13 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, PropType, ref, shallowReactive, toRefs, watch } from 'vue'
|
import { PropType, toRefs, ref, shallowReactive, watch } from 'vue'
|
||||||
|
import dayjs from 'dayjs'
|
||||||
import { CreateComponentType } from '@/packages/index.d'
|
import { CreateComponentType } from '@/packages/index.d'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { useChartInteract } from '@/hooks'
|
import { useChartInteract } from '@/hooks'
|
||||||
import { InteractEventOn } from '@/enums/eventEnum'
|
import { InteractEventOn } from '@/enums/eventEnum'
|
||||||
import {ComponentInteractEventEnum, ComponentInteractParamsEnum, DefaultTypeEnum} from './interact'
|
import { ComponentInteractParamsEnum } from './interact'
|
||||||
import dayjs, {ManipulateType} from 'dayjs'
|
|
||||||
import quarterOfYear from 'dayjs/plugin/quarterOfYear';
|
|
||||||
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
chartConfig: {
|
chartConfig: {
|
||||||
@@ -34,107 +31,61 @@ const option = shallowReactive({
|
|||||||
dataset: props.chartConfig.option.dataset
|
dataset: props.chartConfig.option.dataset
|
||||||
})
|
})
|
||||||
|
|
||||||
const isRange = computed(() => {
|
|
||||||
return props.chartConfig.option.componentInteractEventKey.endsWith('range')
|
|
||||||
})
|
|
||||||
|
|
||||||
// 监听事件改变
|
// 监听事件改变
|
||||||
const onChange = (v: number | number[] | null) => {
|
const onChange = (v: number | number[]) => {
|
||||||
if (isRange.value) {
|
if (v instanceof Array) {
|
||||||
let dateStart = null
|
|
||||||
let dateEnd = null
|
|
||||||
let daterange = null
|
|
||||||
if(v instanceof Array){
|
|
||||||
dateStart = v[0]
|
|
||||||
dateEnd = v[1]
|
|
||||||
daterange = `${v[0]}-${v[1]}`
|
|
||||||
}
|
|
||||||
// 存储到联动数据
|
// 存储到联动数据
|
||||||
useChartInteract(
|
useChartInteract(
|
||||||
props.chartConfig,
|
props.chartConfig,
|
||||||
useChartEditStore,
|
useChartEditStore,
|
||||||
{
|
{
|
||||||
[ComponentInteractParamsEnum.DATE_START]: dateStart,
|
[ComponentInteractParamsEnum.DATE_START]: v[0] || dayjs().valueOf(),
|
||||||
[ComponentInteractParamsEnum.DATE_END]: dateEnd,
|
[ComponentInteractParamsEnum.DATE_END]: v[1] || dayjs().valueOf(),
|
||||||
[ComponentInteractParamsEnum.DATE_RANGE]: daterange
|
[ComponentInteractParamsEnum.DATE_RANGE]: `${v[0] || dayjs().valueOf()}-${v[1] || dayjs().valueOf()}`
|
||||||
},
|
},
|
||||||
InteractEventOn.CHANGE
|
InteractEventOn.CHANGE
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
// 存储到联动数据
|
// 存储到联动数据
|
||||||
useChartInteract(
|
useChartInteract(
|
||||||
props.chartConfig,
|
props.chartConfig,
|
||||||
useChartEditStore,
|
useChartEditStore,
|
||||||
{ [ComponentInteractParamsEnum.DATE]: v },
|
{ [ComponentInteractParamsEnum.DATE]: v || dayjs().valueOf() },
|
||||||
InteractEventOn.CHANGE
|
InteractEventOn.CHANGE
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const getDiffDate = (type: ComponentInteractEventEnum, date: dayjs.Dayjs) => {
|
|
||||||
// 注册 quarterOfYear 插件
|
|
||||||
dayjs.extend(quarterOfYear)
|
|
||||||
switch (type) {
|
|
||||||
case ComponentInteractEventEnum.DATE:
|
|
||||||
case ComponentInteractEventEnum.DATE_RANGE:
|
|
||||||
date = date.startOf('day')
|
|
||||||
break
|
|
||||||
case ComponentInteractEventEnum.MONTH:
|
|
||||||
case ComponentInteractEventEnum.MONTH_RANGE:
|
|
||||||
date = date.startOf('month')
|
|
||||||
break
|
|
||||||
case ComponentInteractEventEnum.YEAR:
|
|
||||||
case ComponentInteractEventEnum.YEAR_RANGE:
|
|
||||||
date = date.startOf('year')
|
|
||||||
break
|
|
||||||
case ComponentInteractEventEnum.QUARTER:
|
|
||||||
case ComponentInteractEventEnum.QUARTER_RANGE:
|
|
||||||
date = date.startOf('quarter')
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
return date
|
|
||||||
}
|
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => {
|
() => props.chartConfig.option.dataset,
|
||||||
return {
|
(newData: number | number[]) => {
|
||||||
type: props.chartConfig.option.componentInteractEventKey as ComponentInteractEventEnum,
|
option.dataset = newData
|
||||||
defaultType: props.chartConfig.option.defaultType as string,
|
// 关联目标组件首次请求带上默认内容
|
||||||
differValue: props.chartConfig.option.differValue as number[],
|
onChange(newData)
|
||||||
differUnit: props.chartConfig.option.differUnit as ManipulateType[],
|
},
|
||||||
dataset: props.chartConfig.option.dataset as number | number[] | null,
|
{
|
||||||
};
|
immediate: true
|
||||||
},
|
}
|
||||||
(newData, oldData) => {
|
)
|
||||||
const hasTypeChanged = newData.type !== oldData?.type;
|
|
||||||
const hasDefaultTypeChanged = newData.defaultType !== oldData?.defaultType;
|
|
||||||
const hasDifferValueChanged = newData.differValue !== oldData?.differValue;
|
|
||||||
const hasDifferUnitChanged = newData.differUnit !== oldData?.differUnit;
|
|
||||||
|
|
||||||
if (hasTypeChanged || hasDefaultTypeChanged || hasDifferValueChanged || hasDifferUnitChanged) {
|
// 手动更新
|
||||||
if (newData.defaultType === DefaultTypeEnum.NONE) {
|
watch(
|
||||||
props.chartConfig.option.dataset = null;
|
() => props.chartConfig.option.differValue,
|
||||||
} else if (newData.defaultType === DefaultTypeEnum.DYNAMIC) {
|
(newData: number) => {
|
||||||
let date = dayjs();
|
if (props.chartConfig.option.differValue === 0) return
|
||||||
if (isRange.value) {
|
if (typeof option.dataset === 'object') {
|
||||||
props.chartConfig.option.dataset = [
|
option.dataset[0] = dayjs().add(newData, 'day').valueOf()
|
||||||
getDiffDate(newData.type,date.add(newData.differValue[0], newData.differUnit[0])).valueOf(),
|
option.dataset[1] = dayjs().add(newData, 'day').valueOf()
|
||||||
getDiffDate(newData.type,date.add(newData.differValue[1], newData.differUnit[1])).valueOf(),
|
} else {
|
||||||
];
|
option.dataset = dayjs().add(newData, 'day').valueOf()
|
||||||
} else {
|
|
||||||
props.chartConfig.option.dataset = getDiffDate(newData.type,date.add(newData.differValue[0], newData.differUnit[0])).valueOf()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
option.dataset = props.chartConfig.option.dataset;
|
|
||||||
onChange(option.dataset);
|
|
||||||
},
|
|
||||||
{
|
|
||||||
immediate: true,
|
|
||||||
}
|
}
|
||||||
);
|
// 关联目标组件首次请求带上默认内容
|
||||||
|
onChange(newData)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
immediate: true
|
||||||
|
}
|
||||||
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
31
src/packages/components/Informations/Inputs/InputsDate/interact.ts
Executable file → Normal file
@@ -22,37 +22,6 @@ export enum ComponentInteractParamsEnum {
|
|||||||
DATE_RANGE = 'daterange'
|
DATE_RANGE = 'daterange'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DefaultTypeEnum {
|
|
||||||
NONE = "none",
|
|
||||||
STATIC = "static",
|
|
||||||
DYNAMIC = "dynamic"
|
|
||||||
}
|
|
||||||
|
|
||||||
export enum DifferUnitEnum {
|
|
||||||
DAY = 'd',
|
|
||||||
WEEK = 'w',
|
|
||||||
MONTH = 'M',
|
|
||||||
QUARTER = 'Q',
|
|
||||||
YEAR = 'y',
|
|
||||||
HOUR = 'h',
|
|
||||||
MINUTE = 'm',
|
|
||||||
SECOND = 's',
|
|
||||||
MILLISECOND = 'ms',
|
|
||||||
}
|
|
||||||
|
|
||||||
export const DifferUnitObject = {
|
|
||||||
// https://day.js.org/docs/en/manipulate/add
|
|
||||||
[DifferUnitEnum.DAY]: '天',
|
|
||||||
[DifferUnitEnum.WEEK]: '周',
|
|
||||||
[DifferUnitEnum.MONTH]: '月',
|
|
||||||
[DifferUnitEnum.QUARTER]: '季度',
|
|
||||||
[DifferUnitEnum.YEAR]: '年',
|
|
||||||
[DifferUnitEnum.HOUR]: '小时',
|
|
||||||
[DifferUnitEnum.MINUTE]: '分钟',
|
|
||||||
[DifferUnitEnum.SECOND]: '秒',
|
|
||||||
[DifferUnitEnum.MILLISECOND]: '毫秒',
|
|
||||||
}
|
|
||||||
|
|
||||||
const time = [
|
const time = [
|
||||||
{
|
{
|
||||||
value: ComponentInteractParamsEnum.DATE,
|
value: ComponentInteractParamsEnum.DATE,
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<collapse-item name="标签页配置" :expanded="true">
|
<collapse-item name="标签页配置" :expanded="true">
|
||||||
<setting-item-box name="标签类型" :alone="true">
|
|
||||||
<n-select size="small" v-model:value="optionData.tabType" :options="tabTypeOptions" />
|
|
||||||
</setting-item-box>
|
|
||||||
<setting-item-box name="默认值" :alone="true">
|
<setting-item-box name="默认值" :alone="true">
|
||||||
<n-select size="small" v-model:value="optionData.tabLabel" value-field="label" :options="optionData.dataset" />
|
<n-select size="small" v-model:value="optionData.tabType" :options="tabTypeOptions" />
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
</collapse-item>
|
</collapse-item>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<n-tabs :type="option.value.tabType" @update:value="onChange" :default-value="option.value.tabLabel">
|
<n-tabs :type="option.value.tabType" @update:value="onChange">
|
||||||
<n-tab v-for="(item, index) in option.value.dataset" :name="item.label" :key="index"> {{ item.label }} </n-tab>
|
<n-tab v-for="(item, index) in option.value.dataset" :name="item.label" :key="index"> {{ item.label }} </n-tab>
|
||||||
</n-tabs>
|
</n-tabs>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -8,7 +8,10 @@ import { SketchRule } from 'vue3-sketch-ruler'
|
|||||||
* @param app
|
* @param app
|
||||||
*/
|
*/
|
||||||
export function setupCustomComponents(app: App) {
|
export function setupCustomComponents(app: App) {
|
||||||
|
// 骨架屏
|
||||||
app.component('GoSkeleton', GoSkeleton)
|
app.component('GoSkeleton', GoSkeleton)
|
||||||
|
// 加载
|
||||||
app.component('GoLoading', GoLoading)
|
app.component('GoLoading', GoLoading)
|
||||||
|
// 标尺
|
||||||
app.component('SketchRule', SketchRule)
|
app.component('SketchRule', SketchRule)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ import {
|
|||||||
ArrowDown as ArrowDownIcon,
|
ArrowDown as ArrowDownIcon,
|
||||||
Planet as PawIcon,
|
Planet as PawIcon,
|
||||||
Search as SearchIcon,
|
Search as SearchIcon,
|
||||||
|
Reload as ReloadIcon,
|
||||||
ChevronUpOutline as ChevronUpOutlineIcon,
|
ChevronUpOutline as ChevronUpOutlineIcon,
|
||||||
ChevronDownOutline as ChevronDownOutlineIcon,
|
ChevronDownOutline as ChevronDownOutlineIcon,
|
||||||
Pulse as PulseIcon,
|
Pulse as PulseIcon,
|
||||||
@@ -97,6 +98,7 @@ import {
|
|||||||
FitToScreen as FitToScreenIcon,
|
FitToScreen as FitToScreenIcon,
|
||||||
FitToHeight as FitToHeightIcon,
|
FitToHeight as FitToHeightIcon,
|
||||||
FitToWidth as FitToWidthIcon,
|
FitToWidth as FitToWidthIcon,
|
||||||
|
Save as SaveIcon,
|
||||||
Carbon3DCursor as Carbon3DCursorIcon,
|
Carbon3DCursor as Carbon3DCursorIcon,
|
||||||
Carbon3DSoftware as Carbon3DSoftwareIcon,
|
Carbon3DSoftware as Carbon3DSoftwareIcon,
|
||||||
Filter as FilterIcon,
|
Filter as FilterIcon,
|
||||||
@@ -218,6 +220,8 @@ const ionicons5 = {
|
|||||||
PawIcon,
|
PawIcon,
|
||||||
// 搜索(放大镜)
|
// 搜索(放大镜)
|
||||||
SearchIcon,
|
SearchIcon,
|
||||||
|
// 加载
|
||||||
|
ReloadIcon,
|
||||||
// 过滤器
|
// 过滤器
|
||||||
FilterIcon,
|
FilterIcon,
|
||||||
// 向上
|
// 向上
|
||||||
@@ -289,6 +293,8 @@ const carbon = {
|
|||||||
FitToScreenIcon,
|
FitToScreenIcon,
|
||||||
FitToHeightIcon,
|
FitToHeightIcon,
|
||||||
FitToWidthIcon,
|
FitToWidthIcon,
|
||||||
|
// 保存
|
||||||
|
SaveIcon,
|
||||||
// 成组
|
// 成组
|
||||||
Carbon3DCursorIcon,
|
Carbon3DCursorIcon,
|
||||||
// 解组
|
// 解组
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { RouteRecordRaw } from 'vue-router'
|
import { RouteRecordRaw } from 'vue-router'
|
||||||
import type { AppRouteRecordRaw } from '@/router/types';
|
import type { AppRouteRecordRaw } from '@/router/types';
|
||||||
import { ErrorPage404, ErrorPage403, ErrorPage500, Layout } from '@/router/constant';
|
import { ErrorPage404, ErrorPage403, ErrorPage500, Layout, RedirectHome, RedirectUnPublish } from '@/router/constant';
|
||||||
import { PageEnum } from '@/enums/pageEnum'
|
import { PageEnum } from '@/enums/pageEnum'
|
||||||
import { GoReload } from '@/components/GoReload'
|
import { GoReload } from '@/components/GoReload'
|
||||||
|
|
||||||
|
|
||||||
export const LoginRoute: RouteRecordRaw = {
|
export const LoginRoute: RouteRecordRaw = {
|
||||||
path: '/login',
|
path: PageEnum.BASE_LOGIN,
|
||||||
name: 'Login',
|
name: PageEnum.BASE_LOGIN_NAME,
|
||||||
component: () => import('@/views/login/index.vue'),
|
component: () => import('@/views/login/index.vue'),
|
||||||
meta: {
|
meta: {
|
||||||
title: '登录',
|
title: '登录',
|
||||||
@@ -60,22 +60,21 @@ export const ReloadRoute: AppRouteRecordRaw = {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export const RedirectRoute: AppRouteRecordRaw = {
|
export const RedirectRoute: RouteRecordRaw[] = [
|
||||||
path: PageEnum.REDIRECT,
|
{
|
||||||
name: PageEnum.REDIRECT_NAME,
|
path: PageEnum.REDIRECT,
|
||||||
component: Layout,
|
name: PageEnum.REDIRECT_NAME,
|
||||||
meta: {
|
component: RedirectHome,
|
||||||
title: PageEnum.REDIRECT_NAME,
|
meta: {
|
||||||
},
|
title: PageEnum.REDIRECT_NAME,
|
||||||
children: [
|
|
||||||
{
|
|
||||||
path: '/redirect/:path(.*)',
|
|
||||||
name: PageEnum.REDIRECT_NAME,
|
|
||||||
component: () => import('@/views/redirect/index.vue'),
|
|
||||||
meta: {
|
|
||||||
title: PageEnum.REDIRECT_NAME,
|
|
||||||
hideBreadcrumb: true,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
],
|
},
|
||||||
};
|
{
|
||||||
|
path: PageEnum.REDIRECT_UN_PUBLISH,
|
||||||
|
name: PageEnum.REDIRECT_UN_PUBLISH_NAME,
|
||||||
|
component: RedirectUnPublish,
|
||||||
|
meta: {
|
||||||
|
title: PageEnum.REDIRECT_UN_PUBLISH_NAME,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ export const ErrorPage403 = () => import('@/views/exception/403.vue');
|
|||||||
|
|
||||||
export const ErrorPage500 = () => import('@/views/exception/500.vue');
|
export const ErrorPage500 = () => import('@/views/exception/500.vue');
|
||||||
|
|
||||||
|
export const RedirectHome = () => import('@/views/redirect/index.vue');
|
||||||
|
|
||||||
|
export const RedirectUnPublish = () => import('@/views/redirect/UnPublish.vue');
|
||||||
|
|
||||||
export const Layout = () => import('@/layout/index.vue');
|
export const Layout = () => import('@/layout/index.vue');
|
||||||
|
|
||||||
export const ParentLayout = () => import('@/layout/parentLayout.vue');
|
export const ParentLayout = () => import('@/layout/parentLayout.vue');
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
import type { App } from 'vue'
|
import type { App } from 'vue'
|
||||||
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
|
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
|
||||||
import { RedirectRoute } from '@/router/base'
|
|
||||||
import { createRouterGuards } from './router-guards'
|
import { createRouterGuards } from './router-guards'
|
||||||
import { PageEnum } from '@/enums/pageEnum'
|
import { PageEnum } from '@/enums/pageEnum'
|
||||||
import { HttpErrorPage, LoginRoute, ReloadRoute } from '@/router/base'
|
import { HttpErrorPage, LoginRoute, ReloadRoute, RedirectRoute } from '@/router/base'
|
||||||
import { Layout } from '@/router/constant'
|
import { Layout } from '@/router/constant'
|
||||||
|
|
||||||
import modules from '@/router/modules'
|
import modules from '@/router/modules'
|
||||||
@@ -19,6 +18,7 @@ const RootRoute: Array<RouteRecordRaw> = [
|
|||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
...HttpErrorPage,
|
...HttpErrorPage,
|
||||||
|
...RedirectRoute,
|
||||||
modules.projectRoutes,
|
modules.projectRoutes,
|
||||||
modules.chartRoutes,
|
modules.chartRoutes,
|
||||||
modules.previewRoutes,
|
modules.previewRoutes,
|
||||||
@@ -28,7 +28,7 @@ const RootRoute: Array<RouteRecordRaw> = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
export const constantRouter: any[] = [LoginRoute, ...RootRoute, RedirectRoute, ReloadRoute];
|
export const constantRouter: any[] = [LoginRoute, ...RootRoute, ReloadRoute];
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHashHistory(''),
|
history: createWebHashHistory(''),
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
import { Router } from 'vue-router';
|
import { Router } from 'vue-router';
|
||||||
import { PageEnum } from '@/enums/pageEnum'
|
import { PageEnum, PreviewEnum } from '@/enums/pageEnum'
|
||||||
import { loginCheck } from '@/utils'
|
import { loginCheck } from '@/utils'
|
||||||
|
|
||||||
|
// 路由白名单
|
||||||
|
const routerAllowList = [
|
||||||
|
// 登录
|
||||||
|
PageEnum.BASE_LOGIN_NAME,
|
||||||
|
// 预览
|
||||||
|
PreviewEnum.CHART_PREVIEW_NAME
|
||||||
|
]
|
||||||
|
|
||||||
export function createRouterGuards(router: Router) {
|
export function createRouterGuards(router: Router) {
|
||||||
// 前置
|
// 前置
|
||||||
router.beforeEach(async (to, from, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
@@ -19,10 +27,8 @@ export function createRouterGuards(router: Router) {
|
|||||||
next({ name: PageEnum.ERROR_PAGE_NAME_404 })
|
next({ name: PageEnum.ERROR_PAGE_NAME_404 })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!loginCheck()) {
|
// @ts-ignore
|
||||||
if (to.name === PageEnum.BASE_LOGIN_NAME) {
|
if (!routerAllowList.includes(to.name) && !loginCheck()) {
|
||||||
next()
|
|
||||||
}
|
|
||||||
next({ name: PageEnum.BASE_LOGIN_NAME })
|
next({ name: PageEnum.BASE_LOGIN_NAME })
|
||||||
}
|
}
|
||||||
next()
|
next()
|
||||||
|
|||||||
@@ -61,6 +61,9 @@ export const editToJsonInterval = 5000
|
|||||||
// 数据请求间隔
|
// 数据请求间隔
|
||||||
export const requestInterval = 30
|
export const requestInterval = 30
|
||||||
|
|
||||||
|
// 工作台自动保存间隔(s)
|
||||||
|
export const saveInterval = 30
|
||||||
|
|
||||||
// 数据请求间隔单位
|
// 数据请求间隔单位
|
||||||
export const requestIntervalUnit = RequestHttpIntervalEnum.SECOND
|
export const requestIntervalUnit = RequestHttpIntervalEnum.SECOND
|
||||||
|
|
||||||
|
|||||||
2
src/settings/httpSetting.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// 请求前缀
|
||||||
|
export const axiosPre = '/api/goview'
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { CreateComponentType, CreateComponentGroupType, FilterEnum } from '@/packages/index.d'
|
import { CreateComponentType, CreateComponentGroupType, FilterEnum } from '@/packages/index.d'
|
||||||
import { HistoryActionTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
|
import { HistoryActionTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
|
||||||
|
import { SyncEnum } from '@/enums/editPageEnum'
|
||||||
import {
|
import {
|
||||||
RequestHttpEnum,
|
RequestHttpEnum,
|
||||||
RequestContentTypeEnum,
|
RequestContentTypeEnum,
|
||||||
@@ -12,6 +13,29 @@ import {
|
|||||||
import { PreviewScaleEnum } from '@/enums/styleEnum'
|
import { PreviewScaleEnum } from '@/enums/styleEnum'
|
||||||
import type { ChartColorsNameType, CustomColorsType, GlobalThemeJsonType } from '@/settings/chartThemes/index'
|
import type { ChartColorsNameType, CustomColorsType, GlobalThemeJsonType } from '@/settings/chartThemes/index'
|
||||||
|
|
||||||
|
// 项目数据枚举
|
||||||
|
export enum ProjectInfoEnum {
|
||||||
|
// ID
|
||||||
|
PROJECT_ID = "projectId",
|
||||||
|
// 名称
|
||||||
|
PROJECT_NAME = 'projectName',
|
||||||
|
// 描述
|
||||||
|
REMARKS = 'remarks',
|
||||||
|
// 缩略图
|
||||||
|
THUMBNAIL= 'thumbnail',
|
||||||
|
// 是否公开发布
|
||||||
|
RELEASE = 'release'
|
||||||
|
}
|
||||||
|
|
||||||
|
// 项目数据
|
||||||
|
export type ProjectInfoType = {
|
||||||
|
[ProjectInfoEnum.PROJECT_ID]: string,
|
||||||
|
[ProjectInfoEnum.PROJECT_NAME]: string,
|
||||||
|
[ProjectInfoEnum.REMARKS]: string,
|
||||||
|
[ProjectInfoEnum.THUMBNAIL]: string,
|
||||||
|
[ProjectInfoEnum.RELEASE]: boolean
|
||||||
|
}
|
||||||
|
|
||||||
// 编辑画布属性
|
// 编辑画布属性
|
||||||
export enum EditCanvasTypeEnum {
|
export enum EditCanvasTypeEnum {
|
||||||
EDIT_LAYOUT_DOM = 'editLayoutDom',
|
EDIT_LAYOUT_DOM = 'editLayoutDom',
|
||||||
@@ -20,13 +44,14 @@ export enum EditCanvasTypeEnum {
|
|||||||
SCALE = 'scale',
|
SCALE = 'scale',
|
||||||
USER_SCALE = 'userScale',
|
USER_SCALE = 'userScale',
|
||||||
LOCK_SCALE = 'lockScale',
|
LOCK_SCALE = 'lockScale',
|
||||||
|
SAVE_STATUS = 'saveStatus',
|
||||||
IS_CREATE = 'isCreate',
|
IS_CREATE = 'isCreate',
|
||||||
IS_DRAG = 'isDrag',
|
IS_DRAG = 'isDrag',
|
||||||
IS_SELECT = 'isSelect',
|
IS_SELECT = 'isSelect',
|
||||||
IS_CODE_EDIT="isCodeEdit"
|
IS_CODE_EDIT="isCodeEdit"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 编辑区域
|
// 编辑区域(临时)
|
||||||
export type EditCanvasType = {
|
export type EditCanvasType = {
|
||||||
// 编辑区域 DOM
|
// 编辑区域 DOM
|
||||||
[EditCanvasTypeEnum.EDIT_LAYOUT_DOM]: HTMLElement | null
|
[EditCanvasTypeEnum.EDIT_LAYOUT_DOM]: HTMLElement | null
|
||||||
@@ -43,13 +68,15 @@ export type EditCanvasType = {
|
|||||||
[EditCanvasTypeEnum.IS_CREATE]: boolean
|
[EditCanvasTypeEnum.IS_CREATE]: boolean
|
||||||
// 拖拽中
|
// 拖拽中
|
||||||
[EditCanvasTypeEnum.IS_DRAG]: boolean
|
[EditCanvasTypeEnum.IS_DRAG]: boolean
|
||||||
|
// 保存状态
|
||||||
|
[EditCanvasTypeEnum.SAVE_STATUS]: SyncEnum
|
||||||
// 框选中
|
// 框选中
|
||||||
[EditCanvasTypeEnum.IS_SELECT]: boolean
|
[EditCanvasTypeEnum.IS_SELECT]: boolean
|
||||||
// 代码编辑中
|
// 代码编辑中
|
||||||
[EditCanvasTypeEnum.IS_CODE_EDIT]: boolean
|
[EditCanvasTypeEnum.IS_CODE_EDIT]: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
// 滤镜/背景色/宽高主题等
|
// 画布数据/滤镜/背景色/宽高主题等
|
||||||
export enum EditCanvasConfigEnum {
|
export enum EditCanvasConfigEnum {
|
||||||
PROJECT_NAME = 'projectName',
|
PROJECT_NAME = 'projectName',
|
||||||
WIDTH = 'width',
|
WIDTH = 'width',
|
||||||
@@ -63,7 +90,14 @@ export enum EditCanvasConfigEnum {
|
|||||||
PREVIEW_SCALE_TYPE = 'previewScaleType'
|
PREVIEW_SCALE_TYPE = 'previewScaleType'
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface EditCanvasConfigType {
|
// 画布属性(需保存)
|
||||||
|
export type EditCanvasConfigType = {
|
||||||
|
// ID
|
||||||
|
[EditCanvasConfigEnum.PROJECT_ID]: string,
|
||||||
|
// 项目名称
|
||||||
|
[EditCanvasConfigEnum.PROJECT_NAME]?: string,
|
||||||
|
// 项目描述
|
||||||
|
[EditCanvasConfigEnum.REMARKS]: string,
|
||||||
// 滤镜-启用
|
// 滤镜-启用
|
||||||
[FilterEnum.FILTERS_SHOW]: boolean
|
[FilterEnum.FILTERS_SHOW]: boolean
|
||||||
// 滤镜-色相
|
// 滤镜-色相
|
||||||
@@ -140,6 +174,7 @@ export type RecordChartType = {
|
|||||||
|
|
||||||
// Store 枚举
|
// Store 枚举
|
||||||
export enum ChartEditStoreEnum {
|
export enum ChartEditStoreEnum {
|
||||||
|
PROJECT_INFO = 'projectInfo',
|
||||||
EDIT_RANGE = 'editRange',
|
EDIT_RANGE = 'editRange',
|
||||||
EDIT_CANVAS = 'editCanvas',
|
EDIT_CANVAS = 'editCanvas',
|
||||||
RIGHT_MENU_SHOW = 'rightMenuShow',
|
RIGHT_MENU_SHOW = 'rightMenuShow',
|
||||||
@@ -201,6 +236,7 @@ export interface RequestConfigType extends RequestPublicConfigType {
|
|||||||
|
|
||||||
// Store 类型
|
// Store 类型
|
||||||
export interface ChartEditStoreType {
|
export interface ChartEditStoreType {
|
||||||
|
[ChartEditStoreEnum.PROJECT_INFO]: ProjectInfoType
|
||||||
[ChartEditStoreEnum.EDIT_CANVAS]: EditCanvasType
|
[ChartEditStoreEnum.EDIT_CANVAS]: EditCanvasType
|
||||||
[ChartEditStoreEnum.EDIT_CANVAS_CONFIG]: EditCanvasConfigType
|
[ChartEditStoreEnum.EDIT_CANVAS_CONFIG]: EditCanvasConfigType
|
||||||
[ChartEditStoreEnum.RIGHT_MENU_SHOW]: boolean
|
[ChartEditStoreEnum.RIGHT_MENU_SHOW]: boolean
|
||||||
|
|||||||
@@ -10,14 +10,22 @@ import { requestInterval, previewScaleType, requestIntervalUnit } from '@/settin
|
|||||||
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
|
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
|
||||||
// 全局设置
|
// 全局设置
|
||||||
import { useSettingStore } from '@/store/modules/settingStore/settingStore'
|
import { useSettingStore } from '@/store/modules/settingStore/settingStore'
|
||||||
|
// 历史类型
|
||||||
|
import { HistoryActionTypeEnum, HistoryItemType, HistoryTargetTypeEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
|
||||||
|
// 画布枚举
|
||||||
|
import { MenuEnum, SyncEnum } from '@/enums/editPageEnum'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
HistoryActionTypeEnum,
|
getUUID,
|
||||||
HistoryItemType,
|
loadingStart,
|
||||||
HistoryTargetTypeEnum
|
loadingFinish,
|
||||||
} from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
|
loadingError,
|
||||||
import { MenuEnum } from '@/enums/editPageEnum'
|
isString,
|
||||||
import { getUUID, loadingStart, loadingFinish, loadingError, isString, isArray } from '@/utils'
|
isArray
|
||||||
|
} from '@/utils'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
ProjectInfoType,
|
||||||
ChartEditStoreEnum,
|
ChartEditStoreEnum,
|
||||||
ChartEditStorage,
|
ChartEditStorage,
|
||||||
ChartEditStoreType,
|
ChartEditStoreType,
|
||||||
@@ -36,6 +44,14 @@ const settingStore = useSettingStore()
|
|||||||
export const useChartEditStore = defineStore({
|
export const useChartEditStore = defineStore({
|
||||||
id: 'useChartEditStore',
|
id: 'useChartEditStore',
|
||||||
state: (): ChartEditStoreType => ({
|
state: (): ChartEditStoreType => ({
|
||||||
|
// 项目数据
|
||||||
|
projectInfo: {
|
||||||
|
projectId: '',
|
||||||
|
projectName: '',
|
||||||
|
remarks: '',
|
||||||
|
thumbnail: '',
|
||||||
|
release: false
|
||||||
|
},
|
||||||
// 画布属性
|
// 画布属性
|
||||||
editCanvas: {
|
editCanvas: {
|
||||||
// 编辑区域 Dom
|
// 编辑区域 Dom
|
||||||
@@ -55,6 +71,8 @@ export const useChartEditStore = defineStore({
|
|||||||
isDrag: false,
|
isDrag: false,
|
||||||
// 框选中
|
// 框选中
|
||||||
isSelect: false,
|
isSelect: false,
|
||||||
|
// 同步中
|
||||||
|
saveStatus: SyncEnum.PENDING,
|
||||||
// 代码编辑中
|
// 代码编辑中
|
||||||
isCodeEdit: false
|
isCodeEdit: false
|
||||||
},
|
},
|
||||||
@@ -138,6 +156,9 @@ export const useChartEditStore = defineStore({
|
|||||||
componentList: []
|
componentList: []
|
||||||
}),
|
}),
|
||||||
getters: {
|
getters: {
|
||||||
|
getProjectInfo(): ProjectInfoType {
|
||||||
|
return this.projectInfo
|
||||||
|
},
|
||||||
getMousePosition(): MousePositionType {
|
getMousePosition(): MousePositionType {
|
||||||
return this.mousePosition
|
return this.mousePosition
|
||||||
},
|
},
|
||||||
@@ -172,6 +193,10 @@ export const useChartEditStore = defineStore({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
|
// * 设置 peojectInfo 数据项
|
||||||
|
setProjectInfo<T extends keyof ProjectInfoType, K extends ProjectInfoType[T]>(key: T, value: K) {
|
||||||
|
this.projectInfo[key] = value
|
||||||
|
},
|
||||||
// * 设置 editCanvas 数据项
|
// * 设置 editCanvas 数据项
|
||||||
setEditCanvas<T extends keyof EditCanvasType, K extends EditCanvasType[T]>(key: T, value: K) {
|
setEditCanvas<T extends keyof EditCanvasType, K extends EditCanvasType[T]>(key: T, value: K) {
|
||||||
this.editCanvas[key] = value
|
this.editCanvas[key] = value
|
||||||
|
|||||||
@@ -4,10 +4,10 @@ import { asideCollapsedWidth } from '@/settings/designSetting'
|
|||||||
import { SettingStoreType, ToolsStatusEnum } from './settingStore.d'
|
import { SettingStoreType, ToolsStatusEnum } from './settingStore.d'
|
||||||
import { setLocalStorage, getLocalStorage } from '@/utils'
|
import { setLocalStorage, getLocalStorage } from '@/utils'
|
||||||
import { StorageEnum } from '@/enums/storageEnum'
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
const { GO_SYSTEM_SETTING_STORE } = StorageEnum
|
const { GO_SETTING_STORE } = StorageEnum
|
||||||
|
|
||||||
const storageSetting: SettingStoreType = getLocalStorage(
|
const storageSetting: SettingStoreType = getLocalStorage(
|
||||||
GO_SYSTEM_SETTING_STORE
|
GO_SETTING_STORE
|
||||||
)
|
)
|
||||||
|
|
||||||
// 全局设置
|
// 全局设置
|
||||||
@@ -48,7 +48,7 @@ export const useSettingStore = defineStore({
|
|||||||
this.$patch(state => {
|
this.$patch(state => {
|
||||||
state[key] = value
|
state[key] = value
|
||||||
})
|
})
|
||||||
setLocalStorage(GO_SYSTEM_SETTING_STORE, this.$state)
|
setLocalStorage(GO_SETTING_STORE, this.$state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
31
src/store/modules/systemStore/systemStore.d.ts
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
export enum SystemStoreUserInfoEnum {
|
||||||
|
USER_TOKEN = 'userToken',
|
||||||
|
TOKEN_NAME = 'tokenName',
|
||||||
|
USER_ID = 'userId',
|
||||||
|
USER_NAME = 'userName',
|
||||||
|
NICK_NAME = 'nickName',
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UserInfoType {
|
||||||
|
[SystemStoreUserInfoEnum.USER_TOKEN]?: string,
|
||||||
|
[SystemStoreUserInfoEnum.TOKEN_NAME]?: string,
|
||||||
|
[SystemStoreUserInfoEnum.USER_ID]?: string,
|
||||||
|
[SystemStoreUserInfoEnum.USER_NAME]?: string,
|
||||||
|
[SystemStoreUserInfoEnum.NICK_NAME]?: string,
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FetchInfoType {
|
||||||
|
OSSUrl?: string,
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum SystemStoreEnum {
|
||||||
|
// 用户
|
||||||
|
USER_INFO = 'userInfo',
|
||||||
|
// 请求
|
||||||
|
FETCH_INFO = 'fetchInfo'
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SystemStoreType {
|
||||||
|
[SystemStoreEnum.USER_INFO]: UserInfoType
|
||||||
|
[SystemStoreEnum.FETCH_INFO]: FetchInfoType
|
||||||
|
}
|
||||||
40
src/store/modules/systemStore/systemStore.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import { defineStore } from 'pinia'
|
||||||
|
import { SystemStoreType, UserInfoType, FetchInfoType } from './systemStore.d'
|
||||||
|
import { setLocalStorage, getLocalStorage } from '@/utils'
|
||||||
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
|
|
||||||
|
const { GO_SYSTEM_STORE } = StorageEnum
|
||||||
|
|
||||||
|
const storageSystem: SystemStoreType = getLocalStorage(GO_SYSTEM_STORE)
|
||||||
|
|
||||||
|
// 系统数据记录
|
||||||
|
export const useSystemStore = defineStore({
|
||||||
|
id: 'useSystemStore',
|
||||||
|
state: (): SystemStoreType => storageSystem || {
|
||||||
|
userInfo: {
|
||||||
|
userId: undefined,
|
||||||
|
userName: undefined,
|
||||||
|
userToken: undefined,
|
||||||
|
nickName: undefined
|
||||||
|
},
|
||||||
|
fetchInfo: {
|
||||||
|
OSSUrl: undefined
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getters: {
|
||||||
|
getUserInfo(): UserInfoType {
|
||||||
|
return this.userInfo
|
||||||
|
},
|
||||||
|
getFetchInfo(): FetchInfoType {
|
||||||
|
return this.fetchInfo
|
||||||
|
},
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
setItem<T extends keyof SystemStoreType, K extends SystemStoreType[T]>(key: T, value: K): void {
|
||||||
|
this.$patch(state => {
|
||||||
|
state[key] = value
|
||||||
|
});
|
||||||
|
setLocalStorage(GO_SYSTEM_STORE, this.$state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -1,84 +1,78 @@
|
|||||||
@import './config.scss';
|
@import './config.scss';
|
||||||
@import './function.scss';
|
@import './function.scss';
|
||||||
@import '../theme.scss';
|
@import '../theme.scss';
|
||||||
|
|
||||||
@mixin go($block) {
|
@mixin go($block) {
|
||||||
$B: $namespace + '-' + $block;
|
$B: $namespace + '-' + $block;
|
||||||
.#{$B} {
|
.#{$B} {
|
||||||
@content;
|
@content;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin dark {
|
@mixin goId($block) {
|
||||||
[data-theme='dark'] {
|
$B: $namespace + '-' + $block;
|
||||||
@content;
|
##{$B} {
|
||||||
}
|
@content;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@mixin goId($block) {
|
|
||||||
$B: $namespace + '-' + $block;
|
@mixin deep() {
|
||||||
##{$B} {
|
:deep() {
|
||||||
@content;
|
@content;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin deep() {
|
@mixin when($state) {
|
||||||
:deep() {
|
@at-root {
|
||||||
@content;
|
&.#{$state-prefix + $state} {
|
||||||
}
|
@content;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@mixin when($state) {
|
}
|
||||||
@at-root {
|
|
||||||
&.#{$state-prefix + $state} {
|
@mixin themeify {
|
||||||
@content;
|
@each $theme-name, $theme-map in $themes {
|
||||||
}
|
$theme-map: $theme-map !global;
|
||||||
}
|
[data-theme='#{$theme-name}'] & {
|
||||||
}
|
@content;
|
||||||
|
}
|
||||||
@mixin themeify {
|
}
|
||||||
@each $theme-name, $theme-map in $themes {
|
}
|
||||||
$theme-map: $theme-map !global;
|
|
||||||
[data-theme='#{$theme-name}'] & {
|
@mixin fetch-theme($param) {
|
||||||
@content;
|
@include themeify {
|
||||||
}
|
#{$param}: themed($param);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin fetch-theme($param) {
|
@mixin fetch-theme-custom ($key, $value) {
|
||||||
@include themeify {
|
@include themeify {
|
||||||
#{$param}: themed($param);
|
#{$key}: themed($value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin fetch-theme-custom ($key, $value) {
|
//获取背景颜色
|
||||||
@include themeify {
|
@mixin fetch-bg-color($target) {
|
||||||
#{$key}: themed($value);
|
@include themeify {
|
||||||
}
|
background-color: themed($target);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//获取背景颜色
|
|
||||||
@mixin fetch-bg-color($target) {
|
//获取背景渐变颜色
|
||||||
@include themeify {
|
@mixin background-image($target) {
|
||||||
background-color: themed($target);
|
@include themeify {
|
||||||
}
|
background-image: themed($target);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//获取背景渐变颜色
|
|
||||||
@mixin background-image($target) {
|
//设置边框颜色
|
||||||
@include themeify {
|
@mixin fetch-border-color($target) {
|
||||||
background-image: themed($target);
|
@include themeify {
|
||||||
}
|
border-color: themed($target);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
//设置边框颜色
|
@mixin hover-border-color($target) {
|
||||||
@mixin fetch-border-color($target) {
|
@include themeify {
|
||||||
@include themeify {
|
border: 1px solid themed($target);
|
||||||
border-color: themed($target);
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
@mixin hover-border-color($target) {
|
|
||||||
@include themeify {
|
|
||||||
border: 1px solid themed($target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,15 +1,9 @@
|
|||||||
// 页面全局样式
|
// 页面全局样式
|
||||||
// 去除高德地图 logo
|
// 去除高德地图 logo
|
||||||
.amap-logo {
|
.amap-logo {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
opacity: 0 !important;
|
opacity: 0 !important;
|
||||||
}
|
}
|
||||||
.amap-copyright {
|
.amap-copyright {
|
||||||
opacity: 0 !important;
|
opacity: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme='dark'] {
|
|
||||||
body {
|
|
||||||
background-color: #18181c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,3 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* * base64转file
|
||||||
|
* @param dataurl
|
||||||
|
* @param fileName
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export const base64toFile = (dataurl: string, fileName: string) => {
|
||||||
|
let dataArr = dataurl.split(","),
|
||||||
|
mime = (dataArr as any[])[0].match(/:(.*?);/)[1],
|
||||||
|
bstr = atob(dataArr[1]),
|
||||||
|
n = bstr.length,
|
||||||
|
u8arr = new Uint8Array(n);
|
||||||
|
while (n--) {
|
||||||
|
u8arr[n] = bstr.charCodeAt(n);
|
||||||
|
}
|
||||||
|
return new File([u8arr], fileName, { type: mime });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * file转url
|
||||||
|
*/
|
||||||
|
export const fileToUrl = (file: File): string => {
|
||||||
|
const Url = URL || window.URL || window.webkitURL
|
||||||
|
const ImageUrl = Url.createObjectURL(file)
|
||||||
|
return ImageUrl
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * url转file
|
||||||
|
*/
|
||||||
|
export const urlToFile = (fileUrl: string, fileName = `${new Date().getTime()}`): File => {
|
||||||
|
const dataArr = fileUrl.split(',')
|
||||||
|
const mime = (dataArr as any[])[0].match(/:(.*);/)[1]
|
||||||
|
const originStr = atob(dataArr[1])
|
||||||
|
return new File([originStr], `${fileName}`, { type: mime })
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * file转base64
|
||||||
|
* @param file 文件数据
|
||||||
|
* @param callback 回调函数
|
||||||
|
*/
|
||||||
|
export const fileTobase64 = (file: File, callback: Function) => {
|
||||||
|
let reader = new FileReader()
|
||||||
|
reader.readAsDataURL(file)
|
||||||
|
reader.onload = function (e: ProgressEvent<FileReader>) {
|
||||||
|
if (e.target) {
|
||||||
|
let base64 = e.target.result
|
||||||
|
callback(base64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * canvas转file
|
||||||
|
* @param canvas
|
||||||
|
*/
|
||||||
|
export const canvastoFile = (canvas: HTMLCanvasElement, name?: string) => {
|
||||||
|
const dataurl = canvas.toDataURL('image/png')
|
||||||
|
return urlToFile(dataurl, name)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* *获取上传的文件数据
|
* *获取上传的文件数据
|
||||||
* @param { File } file 文件对象
|
* @param { File } file 文件对象
|
||||||
@@ -51,4 +113,4 @@ export const downloadTextFile = (
|
|||||||
// 字符内容转变成blob地址
|
// 字符内容转变成blob地址
|
||||||
const blob = new Blob([content])
|
const blob = new Blob([content])
|
||||||
downloadByA(URL.createObjectURL(blob), filename, fileSuffix)
|
downloadByA(URL.createObjectURL(blob), filename, fileSuffix)
|
||||||
}
|
}
|
||||||
6
src/utils/http.ts
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
/**
|
||||||
|
* * 请求失败统一处理
|
||||||
|
*/
|
||||||
|
export const httpErrorHandle = () => {
|
||||||
|
window['$message'].error(window['$t']('http.error_message'))
|
||||||
|
}
|
||||||
@@ -7,3 +7,4 @@ export * from '@/utils/plugin'
|
|||||||
export * from '@/utils/components'
|
export * from '@/utils/components'
|
||||||
export * from '@/utils/type'
|
export * from '@/utils/type'
|
||||||
export * from '@/utils/file'
|
export * from '@/utils/file'
|
||||||
|
export * from '@/utils/http'
|
||||||
@@ -35,7 +35,7 @@ export const loadingError = () => {
|
|||||||
* })
|
* })
|
||||||
* ```
|
* ```
|
||||||
*/
|
*/
|
||||||
export const goDialog = (
|
export const goDialog = (
|
||||||
params: {
|
params: {
|
||||||
// 基本
|
// 基本
|
||||||
type?: DialogEnum
|
type?: DialogEnum
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router'
|
||||||
import { ResultEnum } from '@/enums/httpEnum'
|
import { ResultEnum, RequestHttpHeaderEnum } from '@/enums/httpEnum'
|
||||||
import { ErrorPageNameMap, PageEnum } from '@/enums/pageEnum'
|
import { ErrorPageNameMap, PageEnum, PreviewEnum } from '@/enums/pageEnum'
|
||||||
import { docPath, giteeSourceCodePath } from '@/settings/pathConst'
|
import { docPath, giteeSourceCodePath } from '@/settings/pathConst'
|
||||||
import { cryptoDecode } from './crypto'
|
import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d'
|
||||||
import { StorageEnum } from '@/enums/storageEnum'
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
import { clearLocalStorage, getLocalStorage } from './storage'
|
import { clearLocalStorage, getLocalStorage, clearCookie } from './storage'
|
||||||
import router from '@/router'
|
import router from '@/router'
|
||||||
|
import { logoutApi } from '@/api/path'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * 根据名字跳转路由
|
* * 根据名字跳转路由
|
||||||
@@ -101,11 +102,20 @@ export const reloadRoutePage = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * 退出
|
* * 退出登录
|
||||||
*/
|
*/
|
||||||
export const logout = () => {
|
export const logout = async () => {
|
||||||
clearLocalStorage(StorageEnum.GO_LOGIN_INFO_STORE)
|
try {
|
||||||
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
|
const res = await logoutApi()
|
||||||
|
if(res && res.code === ResultEnum.SUCCESS) {
|
||||||
|
window['$message'].success(window['$t']('global.logout_success'))
|
||||||
|
clearCookie(RequestHttpHeaderEnum.COOKIE)
|
||||||
|
clearLocalStorage(StorageEnum.GO_SYSTEM_STORE)
|
||||||
|
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
window['$message'].success(window['$t']('global.logout_failure'))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -157,7 +167,7 @@ export const fetchRouteParams = () => {
|
|||||||
* * 通过硬解析获取当前路由下的参数
|
* * 通过硬解析获取当前路由下的参数
|
||||||
* @returns object
|
* @returns object
|
||||||
*/
|
*/
|
||||||
export const fetchRouteParamsLocation = () => {
|
export const fetchRouteParamsLocation = () => {
|
||||||
try {
|
try {
|
||||||
// 防止添加query参数的时候,解析ID异常
|
// 防止添加query参数的时候,解析ID异常
|
||||||
return document.location.hash.split('?')[0].split('/').pop() || ''
|
return document.location.hash.split('?')[0].split('/').pop() || ''
|
||||||
@@ -176,19 +186,29 @@ export const goHome = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * 判断是否登录(现阶段是有 login 数据即可)
|
* * 判断是否登录
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
export const loginCheck = () => {
|
export const loginCheck = () => {
|
||||||
try {
|
try {
|
||||||
const info = getLocalStorage(StorageEnum.GO_LOGIN_INFO_STORE)
|
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
|
||||||
if (!info) return false
|
if (!info) return false
|
||||||
const decodeInfo = cryptoDecode(info)
|
if (info[SystemStoreEnum.USER_INFO][SystemStoreUserInfoEnum.USER_TOKEN]) {
|
||||||
if (decodeInfo) {
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 预览地址
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export const previewPath = (id?: string | number) => {
|
||||||
|
const { origin, pathname } = document.location
|
||||||
|
const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href')
|
||||||
|
const previewPath = `${origin}${pathname}${path}/${id || fetchRouteParamsLocation()}`
|
||||||
|
return previewPath
|
||||||
}
|
}
|
||||||
@@ -70,3 +70,41 @@ export const getSessionStorage: (k: string) => any = (k: string) => {
|
|||||||
export const clearSessioStorage = (name: string) => {
|
export const clearSessioStorage = (name: string) => {
|
||||||
window.sessionStorage.removeItem(name)
|
window.sessionStorage.removeItem(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 设置 cookie
|
||||||
|
* @param name 键名
|
||||||
|
* @param cvalue 键值
|
||||||
|
* @param exdays 过期时间
|
||||||
|
*/
|
||||||
|
export const setCookie = (name: string, cvalue: string, exdays: number) => {
|
||||||
|
const d = new Date();
|
||||||
|
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
|
||||||
|
const expires = "expires=" + d.toUTCString();
|
||||||
|
document.cookie = name + "=" + cvalue + "; " + expires;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 获取 cookie
|
||||||
|
* @param cname 键名
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
export const getCookie = (cname: string) => {
|
||||||
|
const name = cname + "=";
|
||||||
|
const ca = document.cookie.split(';');
|
||||||
|
for (let i = 0; i < ca.length; i++) {
|
||||||
|
let c = ca[i];
|
||||||
|
while (c.charAt(0) == ' ') c = c.substring(1);
|
||||||
|
if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 清除 cookie
|
||||||
|
* @param name 键名
|
||||||
|
* @returns string
|
||||||
|
*/
|
||||||
|
export const clearCookie = (name: string) => {
|
||||||
|
setCookie(name, "", -1);
|
||||||
|
}
|
||||||
|
|||||||
@@ -114,29 +114,6 @@ export const isMac = () => {
|
|||||||
return /macintosh|mac os x/i.test(navigator.userAgent)
|
return /macintosh|mac os x/i.test(navigator.userAgent)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* * file转url
|
|
||||||
*/
|
|
||||||
export const fileToUrl = (file: File): string => {
|
|
||||||
const Url = URL || window.URL || window.webkitURL
|
|
||||||
const ImageUrl = Url.createObjectURL(file)
|
|
||||||
return ImageUrl
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* * file转base64
|
|
||||||
*/
|
|
||||||
export const fileTobase64 = (file: File, callback: Function) => {
|
|
||||||
let reader = new FileReader()
|
|
||||||
reader.readAsDataURL(file)
|
|
||||||
reader.onload = function (e: ProgressEvent<FileReader>) {
|
|
||||||
if (e.target) {
|
|
||||||
let base64 = e.target.result
|
|
||||||
callback(base64)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * 挂载监听
|
* * 挂载监听
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -132,16 +132,20 @@ import { swatchesColors } from '@/settings/chartThemes/index'
|
|||||||
import { FileTypeEnum } from '@/enums/fileTypeEnum'
|
import { FileTypeEnum } from '@/enums/fileTypeEnum'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { EditCanvasConfigEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
import { EditCanvasConfigEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
import { useSystemStore } from '@/store/modules/systemStore/systemStore'
|
||||||
import { StylesSetting } from '@/components/Pages/ChartItemSetting'
|
import { StylesSetting } from '@/components/Pages/ChartItemSetting'
|
||||||
import { UploadCustomRequestOptions } from 'naive-ui'
|
import { UploadCustomRequestOptions } from 'naive-ui'
|
||||||
import { fileToUrl, loadAsyncComponent } from '@/utils'
|
import { loadAsyncComponent, fetchRouteParamsLocation } from '@/utils'
|
||||||
import { PreviewScaleEnum } from '@/enums/styleEnum'
|
import { PreviewScaleEnum } from '@/enums/styleEnum'
|
||||||
|
import { ResultEnum } from '@/enums/httpEnum'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
|
import { uploadFile } from '@/api/path'
|
||||||
|
|
||||||
const { ColorPaletteIcon } = icon.ionicons5
|
const { ColorPaletteIcon } = icon.ionicons5
|
||||||
const { ScaleIcon, FitToScreenIcon, FitToHeightIcon, FitToWidthIcon } = icon.carbon
|
const { ScaleIcon, FitToScreenIcon, FitToHeightIcon, FitToWidthIcon } = icon.carbon
|
||||||
|
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
|
const systemStore = useSystemStore()
|
||||||
const canvasConfig = chartEditStore.getEditCanvasConfig
|
const canvasConfig = chartEditStore.getEditCanvasConfig
|
||||||
const editCanvas = chartEditStore.getEditCanvas
|
const editCanvas = chartEditStore.getEditCanvas
|
||||||
|
|
||||||
@@ -266,11 +270,32 @@ const clearColor = () => {
|
|||||||
// 自定义上传操作
|
// 自定义上传操作
|
||||||
const customRequest = (options: UploadCustomRequestOptions) => {
|
const customRequest = (options: UploadCustomRequestOptions) => {
|
||||||
const { file } = options
|
const { file } = options
|
||||||
nextTick(() => {
|
nextTick(async () => {
|
||||||
if (file.file) {
|
if (file.file) {
|
||||||
const ImageUrl = fileToUrl(file.file)
|
// 修改名称
|
||||||
chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, ImageUrl)
|
const newNameFile = new File([file.file], `${fetchRouteParamsLocation()}_index_background.png`, {
|
||||||
chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false)
|
type: file.file.type
|
||||||
|
})
|
||||||
|
let uploadParams = new FormData()
|
||||||
|
uploadParams.append('object', newNameFile)
|
||||||
|
const uploadRes = await uploadFile(uploadParams)
|
||||||
|
|
||||||
|
if (uploadRes && uploadRes.code === ResultEnum.SUCCESS) {
|
||||||
|
if (uploadRes.data.fileurl) {
|
||||||
|
chartEditStore.setEditCanvasConfig(
|
||||||
|
EditCanvasConfigEnum.BACKGROUND_IMAGE,
|
||||||
|
`${uploadRes.data.fileurl}?time=${new Date().getTime()}`
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
chartEditStore.setEditCanvasConfig(
|
||||||
|
EditCanvasConfigEnum.BACKGROUND_IMAGE,
|
||||||
|
`${systemStore.getFetchInfo.OSSUrl || ''}${uploadRes.data.fileName}?time=${new Date().getTime()}`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
window['$message'].error('添加图片失败,请稍后重试!')
|
||||||
} else {
|
} else {
|
||||||
window['$message'].error('添加图片失败,请稍后重试!')
|
window['$message'].error('添加图片失败,请稍后重试!')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,11 +131,7 @@ const sendHandle = async () => {
|
|||||||
loading.value = false
|
loading.value = false
|
||||||
if (res) {
|
if (res) {
|
||||||
const { data } = res
|
const { data } = res
|
||||||
if (!data && !targetData.value.filter) {
|
if (!data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
||||||
window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
|
||||||
showMatching.value = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
targetData.value.option.dataset = newFunctionHandle(data, res, targetData.value.filter)
|
targetData.value.option.dataset = newFunctionHandle(data, res, targetData.value.filter)
|
||||||
showMatching.value = true
|
showMatching.value = true
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -117,11 +117,7 @@ const sendHandle = async () => {
|
|||||||
const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig))
|
const res = await customizeHttp(toRaw(targetData.value.request), toRaw(chartEditStore.getRequestGlobalConfig))
|
||||||
loading.value = false
|
loading.value = false
|
||||||
if (res) {
|
if (res) {
|
||||||
if (!res?.data && !targetData.value.filter) {
|
if (!res?.data && !targetData.value.filter) window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
||||||
window['$message'].warning('您的数据不符合默认格式,请配置过滤器!')
|
|
||||||
showMatching.value = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
targetData.value.option.dataset = newFunctionHandle(res?.data, res, targetData.value.filter)
|
targetData.value.option.dataset = newFunctionHandle(res?.data, res, targetData.value.filter)
|
||||||
showMatching.value = true
|
showMatching.value = true
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import { RequestContentTypeEnum } from '@/enums/httpEnum'
|
|||||||
import { useTargetData } from '../../../hooks/useTargetData.hook'
|
import { useTargetData } from '../../../hooks/useTargetData.hook'
|
||||||
import { RequestGlobalConfig } from './components/RequestGlobalConfig'
|
import { RequestGlobalConfig } from './components/RequestGlobalConfig'
|
||||||
import { RequestTargetConfig } from './components/RequestTargetConfig'
|
import { RequestTargetConfig } from './components/RequestTargetConfig'
|
||||||
|
import { useSync } from '@/views/chart/hooks/useSync.hook'
|
||||||
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
|
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -43,6 +44,9 @@ const props = defineProps({
|
|||||||
})
|
})
|
||||||
const emit = defineEmits(['update:modelShow', 'sendHandle'])
|
const emit = defineEmits(['update:modelShow', 'sendHandle'])
|
||||||
|
|
||||||
|
const { targetData } = useTargetData()
|
||||||
|
const { dataSyncUpdate } = useSync()
|
||||||
|
|
||||||
// 解构基础配置
|
// 解构基础配置
|
||||||
const { chartConfig } = toRefs(props.targetData as CreateComponentType)
|
const { chartConfig } = toRefs(props.targetData as CreateComponentType)
|
||||||
const { requestContentType } = toRefs((props.targetData as CreateComponentType).request)
|
const { requestContentType } = toRefs((props.targetData as CreateComponentType).request)
|
||||||
@@ -69,6 +73,7 @@ const closeHandle = () => {
|
|||||||
const closeAndSendHandle = () => {
|
const closeAndSendHandle = () => {
|
||||||
emit('update:modelShow', false)
|
emit('update:modelShow', false)
|
||||||
emit('sendHandle')
|
emit('sendHandle')
|
||||||
|
dataSyncUpdate()
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import { useTargetData } from '../../../hooks/useTargetData.hook'
|
|||||||
import { RequestGlobalConfig } from './components/RequestGlobalConfig'
|
import { RequestGlobalConfig } from './components/RequestGlobalConfig'
|
||||||
import { RequestTargetConfig } from './components/RequestTargetConfig'
|
import { RequestTargetConfig } from './components/RequestTargetConfig'
|
||||||
import { RequestDataPondItemType } from '@/store/modules/chartEditStore/chartEditStore.d'
|
import { RequestDataPondItemType } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
import { useSync } from '@/views/chart/hooks/useSync.hook'
|
||||||
import { goDialog } from '@/utils'
|
import { goDialog } from '@/utils'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -56,6 +57,7 @@ const props = defineProps({
|
|||||||
})
|
})
|
||||||
const emit = defineEmits(['update:modelShow', 'editSaveHandle'])
|
const emit = defineEmits(['update:modelShow', 'editSaveHandle'])
|
||||||
|
|
||||||
|
const { dataSyncUpdate } = useSync()
|
||||||
const pondName = ref()
|
const pondName = ref()
|
||||||
const inputInstRef = ref()
|
const inputInstRef = ref()
|
||||||
const modelShowRef = ref(false)
|
const modelShowRef = ref(false)
|
||||||
@@ -82,6 +84,7 @@ const closeAndSendHandle = () => {
|
|||||||
onPositiveCallback: () => {
|
onPositiveCallback: () => {
|
||||||
emit('update:modelShow', false)
|
emit('update:modelShow', false)
|
||||||
emit('editSaveHandle', props.targetDataRequest)
|
emit('editSaveHandle', props.targetDataRequest)
|
||||||
|
dataSyncUpdate()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
<help-outline-icon></help-outline-icon>
|
<help-outline-icon></help-outline-icon>
|
||||||
</n-icon>
|
</n-icon>
|
||||||
</template>
|
</template>
|
||||||
<n-text>不支持「静态组件」支持「组件」「公共APi」</n-text>
|
<n-text>不支持「静态组件」</n-text>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
</template>
|
</template>
|
||||||
<n-select
|
<n-select
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
</n-table>
|
</n-table>
|
||||||
</setting-item-box>
|
</setting-item-box>
|
||||||
|
|
||||||
<n-tag :bordered="false" type="primary"> 关联目标请求参数 </n-tag>
|
<n-tag :bordered="false" type="primary"> 关联目标组件请求参数 </n-tag>
|
||||||
|
|
||||||
<setting-item-box
|
<setting-item-box
|
||||||
:name="requestParamsItem"
|
:name="requestParamsItem"
|
||||||
@@ -125,7 +125,7 @@ import { VNodeChild, computed } from 'vue'
|
|||||||
import { SelectOption, SelectGroupOption } from 'naive-ui'
|
import { SelectOption, SelectGroupOption } from 'naive-ui'
|
||||||
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
|
import { SettingItemBox, SettingItem, CollapseItem } from '@/components/Pages/ChartItemSetting'
|
||||||
import { CreateComponentType, CreateComponentGroupType, ChartFrameEnum } from '@/packages/index.d'
|
import { CreateComponentType, CreateComponentGroupType, ChartFrameEnum } from '@/packages/index.d'
|
||||||
import { RequestParamsTypeEnum, RequestDataTypeEnum } from '@/enums/httpEnum'
|
import { RequestParamsTypeEnum } from '@/enums/httpEnum'
|
||||||
import { InteractEventOn, COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum'
|
import { InteractEventOn, COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import noData from '@/assets/images/canvas/noData.png'
|
import noData from '@/assets/images/canvas/noData.png'
|
||||||
@@ -154,11 +154,6 @@ const option = computed(() => {
|
|||||||
// 绑定组件数据 request
|
// 绑定组件数据 request
|
||||||
const fnGetRequest = (id: string | undefined, key: RequestParamsTypeEnum) => {
|
const fnGetRequest = (id: string | undefined, key: RequestParamsTypeEnum) => {
|
||||||
if (!id) return {}
|
if (!id) return {}
|
||||||
const globalConfigPindApr = chartEditStore.requestGlobalConfig.requestDataPond.find(item => {
|
|
||||||
return item.dataPondId === id
|
|
||||||
})?.dataPondRequestConfig.requestParams
|
|
||||||
|
|
||||||
if (globalConfigPindApr) return globalConfigPindApr[key]
|
|
||||||
return chartEditStore.componentList[chartEditStore.fetchTargetIndex(id)]?.request.requestParams[key]
|
return chartEditStore.componentList[chartEditStore.fetchTargetIndex(id)]?.request.requestParams[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,10 +178,12 @@ const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => {
|
|||||||
iter: Array<CreateComponentType | CreateComponentGroupType>,
|
iter: Array<CreateComponentType | CreateComponentGroupType>,
|
||||||
val: CreateComponentType | CreateComponentGroupType
|
val: CreateComponentType | CreateComponentGroupType
|
||||||
) => {
|
) => {
|
||||||
if (!val.groupList && val.request.requestDataType === RequestDataTypeEnum.AJAX && val.request.requestUrl) {
|
if (val.groupList && val.groupList.length > 0) {
|
||||||
|
iter.push(val)
|
||||||
|
} else {
|
||||||
iter.push(val)
|
iter.push(val)
|
||||||
}
|
}
|
||||||
return val.groupList && val.groupList.length > 0 ? [...iter, ...fnFlattern(val.groupList)] : iter
|
return val.groupList ? [...iter, ...fnFlattern(val.groupList)] : iter
|
||||||
},
|
},
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
@@ -206,26 +203,18 @@ const fnEventsOptions = (): Array<SelectOption | SelectGroupOption> => {
|
|||||||
const mapOptionList = filterOptionList.map(item => ({
|
const mapOptionList = filterOptionList.map(item => ({
|
||||||
id: item.id,
|
id: item.id,
|
||||||
title: item.chartConfig.title,
|
title: item.chartConfig.title,
|
||||||
disabled: false,
|
disabled: false
|
||||||
type: 'componentList'
|
|
||||||
}))
|
}))
|
||||||
|
|
||||||
const requestDataPond = chartEditStore.requestGlobalConfig.requestDataPond.map(item => ({
|
|
||||||
id: item.dataPondId,
|
|
||||||
title: item.dataPondName,
|
|
||||||
disabled: false,
|
|
||||||
type: 'requestDataPond'
|
|
||||||
}))
|
|
||||||
const tarArr = requestDataPond.concat(mapOptionList)
|
|
||||||
targetData.value.events.interactEvents?.forEach(iaItem => {
|
targetData.value.events.interactEvents?.forEach(iaItem => {
|
||||||
tarArr.forEach(optionItem => {
|
mapOptionList.forEach(optionItem => {
|
||||||
if (optionItem.id === iaItem.interactComponentId) {
|
if (optionItem.id === iaItem.interactComponentId) {
|
||||||
optionItem.disabled = true
|
optionItem.disabled = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
return tarArr
|
return mapOptionList
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增模块
|
// 新增模块
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
<edit-history></edit-history>
|
<edit-history></edit-history>
|
||||||
<!-- CTRL按键触发展示 -->
|
<!-- CTRL按键触发展示 -->
|
||||||
<n-text id="keyboard-dress-show" depth="3"></n-text>
|
<n-text id="keyboard-dress-show" depth="3"></n-text>
|
||||||
|
<n-divider vertical />
|
||||||
|
<edit-data-sync></edit-data-sync>
|
||||||
</n-space>
|
</n-space>
|
||||||
|
|
||||||
<n-space class="bottom-ri">
|
<n-space class="bottom-ri">
|
||||||
@@ -57,7 +59,8 @@ import { SelectInst } from 'naive-ui'
|
|||||||
import { reactive, ref, toRefs, watchEffect } from 'vue'
|
import { reactive, ref, toRefs, watchEffect } from 'vue'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import { EditHistory } from '../EditHistory/index'
|
import { EditHistory } from '../EditHistory/index'
|
||||||
import EditShortcutKey from '../EditShortcutKey/index.vue'
|
import { EditShortcutKey } from '../EditShortcutKey/index'
|
||||||
|
import { EditDataSync } from '../EditDataSync/index'
|
||||||
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
@@ -151,6 +154,10 @@ $max-width: 670px;
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
padding: 0 10px;
|
||||||
|
width: 100%;
|
||||||
|
min-width: $min-width;
|
||||||
|
height: 40px;
|
||||||
.bottom-ri {
|
.bottom-ri {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 15px;
|
top: 15px;
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import EditDataSync from './index.vue'
|
||||||
|
|
||||||
|
export { EditDataSync }
|
||||||
@@ -0,0 +1,97 @@
|
|||||||
|
<template>
|
||||||
|
<div class="go-edit-data-sync go-flex-items-center">
|
||||||
|
<n-tooltip trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<n-text class="status-desc go-ml-2" :type="descType" depth="3">
|
||||||
|
{{ statusDesc }}
|
||||||
|
</n-text>
|
||||||
|
</template>
|
||||||
|
<span>{{saveInterval}}s 更新一次</span>
|
||||||
|
</n-tooltip>
|
||||||
|
<n-spin
|
||||||
|
v-show="statusDesc === statusDescObj[1]['text']"
|
||||||
|
class="go-ml-2"
|
||||||
|
size="small"
|
||||||
|
>
|
||||||
|
<template #icon>
|
||||||
|
<n-icon size="13">
|
||||||
|
<reload-icon />
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
</n-spin>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, toRefs, watch } from 'vue'
|
||||||
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
||||||
|
import { SyncEnum } from '@/enums/editPageEnum'
|
||||||
|
import { icon } from '@/plugins'
|
||||||
|
import { saveInterval } from '@/settings/designSetting'
|
||||||
|
|
||||||
|
const { ReloadIcon } = icon.ionicons5
|
||||||
|
|
||||||
|
const chartEditStore = useChartEditStore()
|
||||||
|
const designStore = useDesignStore()
|
||||||
|
|
||||||
|
const { saveStatus } = toRefs(chartEditStore.getEditCanvas)
|
||||||
|
const themeColor = ref(designStore.getAppTheme)
|
||||||
|
|
||||||
|
const statusDesc = ref('')
|
||||||
|
const descType = ref('')
|
||||||
|
let setTimeoutIns: NodeJS.Timeout = setTimeout(() => {})
|
||||||
|
|
||||||
|
const statusDescObj = {
|
||||||
|
[SyncEnum.PENDING]: {
|
||||||
|
text: '等待自动同步',
|
||||||
|
type: '',
|
||||||
|
},
|
||||||
|
[SyncEnum.START]: {
|
||||||
|
text: '正在同步中',
|
||||||
|
type: 'success',
|
||||||
|
},
|
||||||
|
[SyncEnum.SUCCESS]: {
|
||||||
|
text: '同步成功!',
|
||||||
|
type: 'success',
|
||||||
|
},
|
||||||
|
[SyncEnum.FAILURE]: {
|
||||||
|
text: '同步失败!',
|
||||||
|
type: 'error',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => saveStatus.value,
|
||||||
|
newData => {
|
||||||
|
clearTimeout(setTimeoutIns)
|
||||||
|
statusDesc.value = statusDescObj[newData]['text']
|
||||||
|
descType.value = statusDescObj[newData]['type']
|
||||||
|
// 3秒重置展示
|
||||||
|
setTimeoutIns = setTimeout(() => {
|
||||||
|
statusDesc.value = statusDescObj[SyncEnum.PENDING]['text']
|
||||||
|
descType.value = statusDescObj[SyncEnum.PENDING]['type']
|
||||||
|
}, 3000)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
immediate: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
@include go('edit-data-sync') {
|
||||||
|
@include deep() {
|
||||||
|
.n-spin {
|
||||||
|
width: 13px;
|
||||||
|
height: 13px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.status-desc {
|
||||||
|
cursor: default;
|
||||||
|
color: v-bind('themeColor');
|
||||||
|
font-size: 12px;
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -133,9 +133,6 @@ const options = computed(() => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.mr-10 {
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
.edit-history-popover {
|
.edit-history-popover {
|
||||||
.btn-text {
|
.btn-text {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
|||||||
@@ -159,11 +159,9 @@ const dragCanvas = (e: any) => {
|
|||||||
const canvasBox = () => {
|
const canvasBox = () => {
|
||||||
const layoutDom = document.getElementById('go-chart-edit-layout')
|
const layoutDom = document.getElementById('go-chart-edit-layout')
|
||||||
if (layoutDom) {
|
if (layoutDom) {
|
||||||
// 此处减去滚动条的宽度和高度
|
|
||||||
const scrollW = 20
|
|
||||||
return {
|
return {
|
||||||
height: layoutDom.clientHeight - scrollW,
|
height: layoutDom.clientHeight - 25,
|
||||||
width: layoutDom.clientWidth - scrollW
|
width: layoutDom.clientWidth
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -112,20 +112,25 @@ const shortcutKeyOptions = [
|
|||||||
win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + Z `,
|
win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + Z `,
|
||||||
mac: `${MacKeyboard.CTRL.toUpperCase()} + ${MacKeyboard.SHIFT.toUpperCase()} + Z `
|
mac: `${MacKeyboard.CTRL.toUpperCase()} + ${MacKeyboard.SHIFT.toUpperCase()} + Z `
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: '保存',
|
||||||
|
win: `${WinKeyboard.CTRL.toUpperCase()} + S `,
|
||||||
|
mac: `${MacKeyboard.CTRL.toUpperCase()} + S `,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: '多选',
|
label: '多选',
|
||||||
win: `${WinKeyboard.CTRL.toUpperCase()} + 🖱️ `,
|
win: `${WinKeyboard.CTRL.toUpperCase()} + 🖱️ `,
|
||||||
mac: `${MacKeyboard.CTRL_SOURCE_KEY.toUpperCase()} + 🖱️ `
|
mac: `${MacKeyboard.CTRL.toUpperCase()} + 🖱️ `
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '创建分组',
|
label: '创建分组',
|
||||||
win: `${WinKeyboard.CTRL.toUpperCase()} + G / 🖱️ `,
|
win: `${WinKeyboard.CTRL.toUpperCase()} + G / 🖱️ `,
|
||||||
mac: `${MacKeyboard.CTRL_SOURCE_KEY.toUpperCase()} + G / 🖱️`
|
mac: `${MacKeyboard.CTRL.toUpperCase()} + G / 🖱️`
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '解除分组',
|
label: '解除分组',
|
||||||
win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + G `,
|
win: `${WinKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + G `,
|
||||||
mac: `${MacKeyboard.CTRL_SOURCE_KEY.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + G `
|
mac: `${MacKeyboard.CTRL.toUpperCase()} + ${WinKeyboard.SHIFT.toUpperCase()} + G `
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
import EditShortcutKey from './index.vue'
|
import EditShortcutKey from './index.vue'
|
||||||
|
|
||||||
export { EditShortcutKey }
|
export { EditShortcutKey }
|
||||||
@@ -7,7 +7,6 @@ import { useSync } from '@/views/chart/hooks/useSync.hook'
|
|||||||
export const useFile = () => {
|
export const useFile = () => {
|
||||||
const importUploadFileListRef = ref()
|
const importUploadFileListRef = ref()
|
||||||
const { updateComponent } = useSync()
|
const { updateComponent } = useSync()
|
||||||
|
|
||||||
// 上传-前置
|
// 上传-前置
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
const importBeforeUpload = ({ file }) => {
|
const importBeforeUpload = ({ file }) => {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { SavePageEnum } from '@/enums/editPageEnum'
|
|||||||
import { editToJsonInterval } from '@/settings/designSetting'
|
import { editToJsonInterval } from '@/settings/designSetting'
|
||||||
import { goDialog } from '@/utils'
|
import { goDialog } from '@/utils'
|
||||||
|
|
||||||
const { updateComponent } = useSync()
|
const { updateComponent, dataSyncUpdate } = useSync()
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
|
|
||||||
export const syncData = () => {
|
export const syncData = () => {
|
||||||
@@ -17,8 +17,9 @@ export const syncData = () => {
|
|||||||
message: '是否覆盖源视图内容,此操作不可撤回?',
|
message: '是否覆盖源视图内容,此操作不可撤回?',
|
||||||
isMaskClosable: true,
|
isMaskClosable: true,
|
||||||
transformOrigin: 'center',
|
transformOrigin: 'center',
|
||||||
onPositiveCallback: () => {
|
onPositiveCallback: async () => {
|
||||||
window['$message'].success('正在同步编辑器...')
|
window['$message'].success('正在同步编辑器...')
|
||||||
|
dataSyncUpdate && (await dataSyncUpdate())
|
||||||
dispatchEvent(new CustomEvent(SavePageEnum.CHART, { detail: chartEditStore.getStorageInfo }))
|
dispatchEvent(new CustomEvent(SavePageEnum.CHART, { detail: chartEditStore.getStorageInfo }))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore
|
|||||||
import { SCALE_KEY } from '@/views/preview/hooks/useScale.hook'
|
import { SCALE_KEY } from '@/views/preview/hooks/useScale.hook'
|
||||||
import { useLayout } from './hooks/useLayout.hook'
|
import { useLayout } from './hooks/useLayout.hook'
|
||||||
import { useAddKeyboard } from '../hooks/useKeyboard.hook'
|
import { useAddKeyboard } from '../hooks/useKeyboard.hook'
|
||||||
|
import { useSync } from '../hooks/useSync.hook'
|
||||||
import { dragHandle, dragoverHandle, mousedownHandleUnStop, useMouseHandle } from './hooks/useDrag.hook'
|
import { dragHandle, dragoverHandle, mousedownHandleUnStop, useMouseHandle } from './hooks/useDrag.hook'
|
||||||
import { useComponentStyle, useSizeStyle } from './hooks/useStyle.hook'
|
import { useComponentStyle, useSizeStyle } from './hooks/useStyle.hook'
|
||||||
|
|
||||||
@@ -107,6 +108,7 @@ import { EditTools } from './components/EditTools'
|
|||||||
|
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
const { handleContextMenu } = useContextMenu()
|
const { handleContextMenu } = useContextMenu()
|
||||||
|
const { dataSyncFetch, intervalDataSyncUpdate } = useSync()
|
||||||
|
|
||||||
// 编辑时注入scale变量,消除警告
|
// 编辑时注入scale变量,消除警告
|
||||||
provide(SCALE_KEY, null)
|
provide(SCALE_KEY, null)
|
||||||
@@ -178,9 +180,13 @@ const rangeStyle = computed(() => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// 键盘事件
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
// 键盘事件
|
||||||
useAddKeyboard()
|
useAddKeyboard()
|
||||||
|
// 获取数据
|
||||||
|
dataSyncFetch()
|
||||||
|
// 定时更新数据
|
||||||
|
intervalDataSyncUpdate()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -29,26 +29,44 @@
|
|||||||
</template>
|
</template>
|
||||||
<span>{{ item.title }}</span>
|
<span>{{ item.title }}</span>
|
||||||
</n-tooltip>
|
</n-tooltip>
|
||||||
|
|
||||||
|
<n-divider vertical />
|
||||||
|
|
||||||
|
<!-- 保存 -->
|
||||||
|
<n-tooltip placement="bottom" trigger="hover">
|
||||||
|
<template #trigger>
|
||||||
|
<div class="save-btn" >
|
||||||
|
<n-button size="small" type="primary" ghost @click="dataSyncUpdate()">
|
||||||
|
<template #icon>
|
||||||
|
<n-icon>
|
||||||
|
<SaveIcon></SaveIcon>
|
||||||
|
</n-icon>
|
||||||
|
</template>
|
||||||
|
</n-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<span>保存</span>
|
||||||
|
</n-tooltip>
|
||||||
</n-space>
|
</n-space>
|
||||||
</n-space>
|
</n-space>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { toRefs, Ref, reactive, computed } from 'vue'
|
import { toRefs, ref, Ref, reactive, computed } from 'vue'
|
||||||
import { renderIcon, goDialog, goHome } from '@/utils'
|
import { renderIcon, goDialog, goHome } from '@/utils'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import { useRemoveKeyboard } from '../../hooks/useKeyboard.hook'
|
import { useRemoveKeyboard } from '../../hooks/useKeyboard.hook'
|
||||||
|
import { useSync } from '../../hooks/useSync.hook'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
|
||||||
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
|
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
|
||||||
import { HistoryStackEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
|
import { HistoryStackEnum } from '@/store/modules/chartHistoryStore/chartHistoryStore.d'
|
||||||
|
|
||||||
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
|
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
|
||||||
import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
|
import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
|
||||||
|
|
||||||
const { LayersIcon, BarChartIcon, PrismIcon, HomeIcon, ArrowBackIcon, ArrowForwardIcon } = icon.ionicons5
|
const { LayersIcon, BarChartIcon, PrismIcon, HomeIcon, ArrowBackIcon, ArrowForwardIcon } = icon.ionicons5
|
||||||
|
const { SaveIcon } = icon.carbon
|
||||||
const { setItem } = useChartLayoutStore()
|
const { setItem } = useChartLayoutStore()
|
||||||
|
const { dataSyncUpdate } = useSync()
|
||||||
const { getLayers, getCharts, getDetails } = toRefs(useChartLayoutStore())
|
const { getLayers, getCharts, getDetails } = toRefs(useChartLayoutStore())
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
const chartHistoryStore = useChartHistoryStore()
|
const chartHistoryStore = useChartHistoryStore()
|
||||||
@@ -130,7 +148,7 @@ const clickHistoryHandle = (item: ItemType<HistoryStackEnum>) => {
|
|||||||
// 返回首页
|
// 返回首页
|
||||||
const goHomeHandle = () => {
|
const goHomeHandle = () => {
|
||||||
goDialog({
|
goDialog({
|
||||||
message: '返回将不会保存任何操作',
|
message: '确定已保存了数据(Ctrl / ⌘ + S),并返回到首页吗?',
|
||||||
isMaskClosable: true,
|
isMaskClosable: true,
|
||||||
onPositiveCallback: () => {
|
onPositiveCallback: () => {
|
||||||
goHome()
|
goHome()
|
||||||
|
|||||||
@@ -1,30 +1,92 @@
|
|||||||
<template>
|
<template>
|
||||||
<n-space class="go-mt-0">
|
<n-space class="go-mt-0">
|
||||||
<n-button v-for="item in comBtnList" :key="item.title" :type="item.type" ghost @click="item.event">
|
<n-button v-for="item in comBtnList" :key="item.key" :type="item.type()" ghost @click="item.event">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<component :is="item.icon"></component>
|
<component :is="item.icon"></component>
|
||||||
</template>
|
</template>
|
||||||
<span>{{ item.title }}</span>
|
<span>{{ item.title() }}</span>
|
||||||
</n-button>
|
</n-button>
|
||||||
</n-space>
|
</n-space>
|
||||||
|
|
||||||
|
<!-- 发布管理弹窗 -->
|
||||||
|
<n-modal v-model:show="modelShow" @afterLeave="closeHandle">
|
||||||
|
<n-list bordered class="go-system-setting">
|
||||||
|
<template #header>
|
||||||
|
<n-space justify="space-between">
|
||||||
|
<n-h3 class="go-mb-0">发布管理</n-h3>
|
||||||
|
<n-icon size="20" class="go-cursor-pointer" @click="closeHandle">
|
||||||
|
<close-icon></close-icon>
|
||||||
|
</n-icon>
|
||||||
|
</n-space>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<n-list-item>
|
||||||
|
<n-space :size="10">
|
||||||
|
<n-alert :show-icon="false" title="预览地址:" type="success">
|
||||||
|
{{ previewPath() }}
|
||||||
|
</n-alert>
|
||||||
|
<n-space vertical>
|
||||||
|
<n-button tertiary type="primary" @click="copyPreviewPath()"> 复制地址 </n-button>
|
||||||
|
<n-button :type="release ? 'warning' : 'primary'" @click="sendHandle">
|
||||||
|
{{ release ? '取消发布' : '发布大屏' }}
|
||||||
|
</n-button>
|
||||||
|
</n-space>
|
||||||
|
</n-space>
|
||||||
|
</n-list-item>
|
||||||
|
|
||||||
|
<n-list-item>
|
||||||
|
<n-space :size="10">
|
||||||
|
<n-button @click="modelShowHandle">关闭弹窗</n-button>
|
||||||
|
</n-space>
|
||||||
|
</n-list-item>
|
||||||
|
</n-list>
|
||||||
|
</n-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed } from 'vue'
|
import { ref, computed, watchEffect } from 'vue'
|
||||||
import { renderIcon, goDialog, fetchPathByName, routerTurnByPath, setSessionStorage, getLocalStorage } from '@/utils'
|
import { useRoute } from 'vue-router'
|
||||||
|
import { useClipboard } from '@vueuse/core'
|
||||||
import { PreviewEnum } from '@/enums/pageEnum'
|
import { PreviewEnum } from '@/enums/pageEnum'
|
||||||
import { StorageEnum } from '@/enums/storageEnum'
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
import { useRoute } from 'vue-router'
|
import { ResultEnum } from '@/enums/httpEnum'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { syncData } from '../../ContentEdit/components/EditTools/hooks/useSyncUpdate.hook'
|
import { syncData } from '../../ContentEdit/components/EditTools/hooks/useSyncUpdate.hook'
|
||||||
|
import { ProjectInfoEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
import { changeProjectReleaseApi } from '@/api/path'
|
||||||
|
import {
|
||||||
|
previewPath,
|
||||||
|
renderIcon,
|
||||||
|
fetchPathByName,
|
||||||
|
routerTurnByPath,
|
||||||
|
setSessionStorage,
|
||||||
|
getLocalStorage,
|
||||||
|
httpErrorHandle,
|
||||||
|
fetchRouteParamsLocation
|
||||||
|
} from '@/utils'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
import { cloneDeep } from 'lodash'
|
import { cloneDeep } from 'lodash'
|
||||||
|
|
||||||
const { BrowsersOutlineIcon, SendIcon, AnalyticsIcon } = icon.ionicons5
|
const { BrowsersOutlineIcon, SendIcon, AnalyticsIcon, CloseIcon } = icon.ionicons5
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
|
|
||||||
|
const previewPathRef = ref(previewPath())
|
||||||
|
const { copy, isSupported } = useClipboard({ source: previewPathRef })
|
||||||
|
|
||||||
const routerParamsInfo = useRoute()
|
const routerParamsInfo = useRoute()
|
||||||
|
|
||||||
|
const modelShow = ref<boolean>(false)
|
||||||
|
const release = ref<boolean>(false)
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
release.value = chartEditStore.getProjectInfo.release || false
|
||||||
|
})
|
||||||
|
|
||||||
|
// 关闭弹窗
|
||||||
|
const closeHandle = () => {
|
||||||
|
modelShow.value = false
|
||||||
|
}
|
||||||
|
|
||||||
// 预览
|
// 预览
|
||||||
const previewHandle = () => {
|
const previewHandle = () => {
|
||||||
const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href')
|
const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href')
|
||||||
@@ -39,7 +101,10 @@ const previewHandle = () => {
|
|||||||
const repeateIndex = sessionStorageInfo.findIndex((e: { id: string }) => e.id === previewId)
|
const repeateIndex = sessionStorageInfo.findIndex((e: { id: string }) => e.id === previewId)
|
||||||
// 重复替换
|
// 重复替换
|
||||||
if (repeateIndex !== -1) {
|
if (repeateIndex !== -1) {
|
||||||
sessionStorageInfo.splice(repeateIndex, 1, { id: previewId, ...storageInfo })
|
sessionStorageInfo.splice(repeateIndex, 1, {
|
||||||
|
id: previewId,
|
||||||
|
...storageInfo
|
||||||
|
})
|
||||||
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, sessionStorageInfo)
|
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, sessionStorageInfo)
|
||||||
} else {
|
} else {
|
||||||
sessionStorageInfo.push({
|
sessionStorageInfo.push({
|
||||||
@@ -55,35 +120,63 @@ const previewHandle = () => {
|
|||||||
routerTurnByPath(path, [previewId], undefined, true)
|
routerTurnByPath(path, [previewId], undefined, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 模态弹窗
|
||||||
|
const modelShowHandle = () => {
|
||||||
|
modelShow.value = !modelShow.value
|
||||||
|
}
|
||||||
|
|
||||||
|
// 复制预览地址
|
||||||
|
const copyPreviewPath = (successText?: string, failureText?: string) => {
|
||||||
|
if (isSupported) {
|
||||||
|
copy()
|
||||||
|
window['$message'].success(successText || '复制成功!')
|
||||||
|
} else {
|
||||||
|
window['$message'].error(failureText || '复制失败!')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 发布
|
// 发布
|
||||||
const sendHandle = () => {
|
const sendHandle = async () => {
|
||||||
goDialog({
|
const res = await changeProjectReleaseApi({
|
||||||
message: '想体验发布功能,请前往查看: https://demo.mtruning.club/#/login。源码需切换到:master-fetch 分支。',
|
id: fetchRouteParamsLocation(),
|
||||||
positiveText: '了然',
|
// 反过来
|
||||||
closeNegativeText: true,
|
state: release.value ? -1 : 1
|
||||||
onPositiveCallback: () => {}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (res && res.code === ResultEnum.SUCCESS) {
|
||||||
|
modelShowHandle()
|
||||||
|
if (!release.value) {
|
||||||
|
copyPreviewPath('发布成功!已复制地址到剪贴板~', '发布成功!')
|
||||||
|
} else {
|
||||||
|
window['$message'].success(`已取消发布`)
|
||||||
|
}
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.RELEASE, !release.value)
|
||||||
|
} else {
|
||||||
|
httpErrorHandle()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const btnList = [
|
const btnList = [
|
||||||
{
|
{
|
||||||
select: true,
|
select: true,
|
||||||
title: '同步内容',
|
title: () => '同步内容',
|
||||||
type: 'primary',
|
type: () => 'primary',
|
||||||
icon: renderIcon(AnalyticsIcon),
|
icon: renderIcon(AnalyticsIcon),
|
||||||
event: syncData
|
event: syncData
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
select: true,
|
key: 'preview',
|
||||||
title: '预览',
|
title: () => '预览',
|
||||||
|
type: () => 'default',
|
||||||
icon: renderIcon(BrowsersOutlineIcon),
|
icon: renderIcon(BrowsersOutlineIcon),
|
||||||
event: previewHandle
|
event: previewHandle
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
select: true,
|
key: 'release',
|
||||||
title: '发布',
|
title: () => (release.value ? '已发布' : '发布'),
|
||||||
icon: renderIcon(SendIcon),
|
icon: renderIcon(SendIcon),
|
||||||
event: sendHandle
|
type: () => (release.value ? 'primary' : 'default'),
|
||||||
|
event: modelShowHandle
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -98,7 +191,15 @@ const comBtnList = computed(() => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.align-center {
|
@include go('system-setting') {
|
||||||
margin-top: -4px;
|
@extend .go-background-filter;
|
||||||
|
min-width: 100px;
|
||||||
|
max-width: 60vw;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
@include deep() {
|
||||||
|
.n-list-item:not(:last-child) {
|
||||||
|
border-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -28,28 +28,27 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, nextTick, computed } from 'vue'
|
import { ref, nextTick, computed, watchEffect } from 'vue'
|
||||||
import { fetchRouteParamsLocation, setTitle } from '@/utils'
|
import { ResultEnum } from '@/enums/httpEnum'
|
||||||
|
import { fetchRouteParamsLocation, httpErrorHandle, setTitle } from '@/utils'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { EditCanvasConfigEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
import { ProjectInfoEnum, EditCanvasConfigEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
|
import { updateProjectApi } from '@/api/path'
|
||||||
|
import { useSync } from '../../hooks/useSync.hook'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
|
|
||||||
const { FishIcon } = icon.ionicons5
|
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
|
const { dataSyncUpdate } = useSync()
|
||||||
|
const { FishIcon } = icon.ionicons5
|
||||||
|
|
||||||
const focus = ref<boolean>(false)
|
const focus = ref<boolean>(false)
|
||||||
const inputInstRef = ref(null)
|
const inputInstRef = ref(null)
|
||||||
|
|
||||||
// 根据路由 id 参数获取项目信息
|
const title = ref<string>(fetchRouteParamsLocation())
|
||||||
const fetchProhectInfoById = () => {
|
|
||||||
const id = fetchRouteParamsLocation()
|
|
||||||
if (id.length) {
|
|
||||||
return id[0]
|
|
||||||
}
|
|
||||||
return ''
|
|
||||||
}
|
|
||||||
|
|
||||||
const title = ref<string>(fetchProhectInfoById() || '')
|
watchEffect(() => {
|
||||||
|
title.value = chartEditStore.getProjectInfo.projectName || ''
|
||||||
|
})
|
||||||
|
|
||||||
const comTitle = computed(() => {
|
const comTitle = computed(() => {
|
||||||
// eslint-disable-next-line vue/no-side-effects-in-computed-properties
|
// eslint-disable-next-line vue/no-side-effects-in-computed-properties
|
||||||
@@ -67,8 +66,18 @@ const handleFocus = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleBlur = () => {
|
const handleBlur = async () => {
|
||||||
focus.value = false
|
focus.value = false
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_NAME, title.value || '')
|
||||||
|
const res = (await updateProjectApi({
|
||||||
|
id: fetchRouteParamsLocation(),
|
||||||
|
projectName: title.value
|
||||||
|
}))
|
||||||
|
if (res && res.code === ResultEnum.SUCCESS) {
|
||||||
|
dataSyncUpdate()
|
||||||
|
} else {
|
||||||
|
httpErrorHandle()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
import { useSync } from './useSync.hook'
|
||||||
import { WinKeyboard, MacKeyboard, MenuEnum } from '@/enums/editPageEnum'
|
import { WinKeyboard, MacKeyboard, MenuEnum } from '@/enums/editPageEnum'
|
||||||
import throttle from 'lodash/throttle'
|
import throttle from 'lodash/throttle'
|
||||||
import debounce from 'lodash/debounce'
|
import debounce from 'lodash/debounce'
|
||||||
@@ -7,7 +8,7 @@ import { setKeyboardDressShow } from '@/utils'
|
|||||||
|
|
||||||
// Keymaster可以支持识别以下组合键: ⇧,shift,option,⌥,alt,ctrl,control,command,和⌘
|
// Keymaster可以支持识别以下组合键: ⇧,shift,option,⌥,alt,ctrl,control,command,和⌘
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
|
const useSyncIns = useSync()
|
||||||
const winCtrlMerge = (e: string) => `${WinKeyboard.CTRL}+${e}`
|
const winCtrlMerge = (e: string) => `${WinKeyboard.CTRL}+${e}`
|
||||||
const winShiftMerge = (e: string) => `${WinKeyboard.SHIFT}+${e}`
|
const winShiftMerge = (e: string) => `${WinKeyboard.SHIFT}+${e}`
|
||||||
const winAltMerge = (e: string) => `${WinKeyboard.ALT}+${e}`
|
const winAltMerge = (e: string) => `${WinKeyboard.ALT}+${e}`
|
||||||
@@ -23,6 +24,7 @@ export const winKeyboardValue = {
|
|||||||
[MenuEnum.DELETE]: 'delete',
|
[MenuEnum.DELETE]: 'delete',
|
||||||
[MenuEnum.BACK]: winCtrlMerge('z'),
|
[MenuEnum.BACK]: winCtrlMerge('z'),
|
||||||
[MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')),
|
[MenuEnum.FORWORD]: winCtrlMerge(winShiftMerge('z')),
|
||||||
|
[MenuEnum.SAVE]: winCtrlMerge('s'),
|
||||||
[MenuEnum.GROUP]: winCtrlMerge('g'),
|
[MenuEnum.GROUP]: winCtrlMerge('g'),
|
||||||
[MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')),
|
[MenuEnum.UN_GROUP]: winCtrlMerge(winShiftMerge('g')),
|
||||||
[MenuEnum.LOCK]: winCtrlMerge('l'),
|
[MenuEnum.LOCK]: winCtrlMerge('l'),
|
||||||
@@ -48,6 +50,7 @@ export const macKeyboardValue = {
|
|||||||
[MenuEnum.DELETE]: macCtrlMerge('backspace'),
|
[MenuEnum.DELETE]: macCtrlMerge('backspace'),
|
||||||
[MenuEnum.BACK]: macCtrlMerge('z'),
|
[MenuEnum.BACK]: macCtrlMerge('z'),
|
||||||
[MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')),
|
[MenuEnum.FORWORD]: macCtrlMerge(macShiftMerge('z')),
|
||||||
|
[MenuEnum.SAVE]: macCtrlMerge('s'),
|
||||||
[MenuEnum.GROUP]: macCtrlMerge('g'),
|
[MenuEnum.GROUP]: macCtrlMerge('g'),
|
||||||
[MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')),
|
[MenuEnum.UN_GROUP]: macCtrlMerge(macShiftMerge('g')),
|
||||||
[MenuEnum.LOCK]: macCtrlMerge('l'),
|
[MenuEnum.LOCK]: macCtrlMerge('l'),
|
||||||
@@ -71,6 +74,7 @@ const winKeyList: Array<string> = [
|
|||||||
winKeyboardValue.back,
|
winKeyboardValue.back,
|
||||||
winKeyboardValue.forward,
|
winKeyboardValue.forward,
|
||||||
|
|
||||||
|
winKeyboardValue.save,
|
||||||
winKeyboardValue.group,
|
winKeyboardValue.group,
|
||||||
winKeyboardValue.unGroup,
|
winKeyboardValue.unGroup,
|
||||||
|
|
||||||
@@ -96,6 +100,7 @@ const macKeyList: Array<string> = [
|
|||||||
macKeyboardValue.back,
|
macKeyboardValue.back,
|
||||||
macKeyboardValue.forward,
|
macKeyboardValue.forward,
|
||||||
|
|
||||||
|
macKeyboardValue.save,
|
||||||
macKeyboardValue.group,
|
macKeyboardValue.group,
|
||||||
macKeyboardValue.unGroup,
|
macKeyboardValue.unGroup,
|
||||||
|
|
||||||
@@ -215,6 +220,11 @@ export const useAddKeyboard = () => {
|
|||||||
case keyboardValue.show:
|
case keyboardValue.show:
|
||||||
keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime))
|
keymaster(e, throttle(() => { chartEditStore.setShow(); return false }, throttleTime))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// 保存 ct+s
|
||||||
|
case keyboardValue.save:
|
||||||
|
keymaster(e, throttle(() => { useSyncIns.dataSyncUpdate(); return false }, 200))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
winKeyList.forEach((key: string) => {
|
winKeyList.forEach((key: string) => {
|
||||||
|
|||||||
@@ -1,11 +1,23 @@
|
|||||||
import { getUUID } from '@/utils'
|
import { onUnmounted } from 'vue';
|
||||||
|
import html2canvas from 'html2canvas'
|
||||||
|
import { getUUID, httpErrorHandle, fetchRouteParamsLocation, base64toFile, JSONStringify, JSONParse } from '@/utils'
|
||||||
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
import { ChartEditStoreEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
|
import { EditCanvasTypeEnum, ChartEditStoreEnum, ProjectInfoEnum, ChartEditStorage } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
|
import { useChartHistoryStore } from '@/store/modules/chartHistoryStore/chartHistoryStore'
|
||||||
|
import { StylesSetting } from '@/components/Pages/ChartItemSetting'
|
||||||
|
import { useSystemStore } from '@/store/modules/systemStore/systemStore'
|
||||||
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
|
import { useChartLayoutStore } from '@/store/modules/chartLayoutStore/chartLayoutStore'
|
||||||
import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
|
import { ChartLayoutStoreEnum } from '@/store/modules/chartLayoutStore/chartLayoutStore.d'
|
||||||
import { fetchChartComponent, fetchConfigComponent, createComponent } from '@/packages/index'
|
import { fetchChartComponent, fetchConfigComponent, createComponent } from '@/packages/index'
|
||||||
import { CreateComponentType, CreateComponentGroupType } from '@/packages/index.d'
|
import { saveInterval } from '@/settings/designSetting'
|
||||||
|
import throttle from 'lodash/throttle'
|
||||||
|
// 接口状态
|
||||||
|
import { ResultEnum } from '@/enums/httpEnum'
|
||||||
|
// 接口
|
||||||
|
import { saveProjectApi, fetchProjectApi, uploadFile, updateProjectApi } from '@/api/path'
|
||||||
|
// 画布枚举
|
||||||
|
import { SyncEnum } from '@/enums/editPageEnum'
|
||||||
|
import { CreateComponentType, CreateComponentGroupType, ConfigType } from '@/packages/index.d'
|
||||||
import { BaseEvent, EventLife } from '@/enums/eventEnum'
|
import { BaseEvent, EventLife } from '@/enums/eventEnum'
|
||||||
import { PublicGroupConfigClass } from '@/packages/public/publicConfig'
|
import { PublicGroupConfigClass } from '@/packages/public/publicConfig'
|
||||||
import merge from 'lodash/merge'
|
import merge from 'lodash/merge'
|
||||||
@@ -89,6 +101,7 @@ const componentMerge = (newObject: any, sources: any, notComponent = false) => {
|
|||||||
export const useSync = () => {
|
export const useSync = () => {
|
||||||
const chartEditStore = useChartEditStore()
|
const chartEditStore = useChartEditStore()
|
||||||
const chartHistoryStore = useChartHistoryStore()
|
const chartHistoryStore = useChartHistoryStore()
|
||||||
|
const systemStore = useSystemStore()
|
||||||
const chartLayoutStore = useChartLayoutStore()
|
const chartLayoutStore = useChartLayoutStore()
|
||||||
/**
|
/**
|
||||||
* * 组件动态注册
|
* * 组件动态注册
|
||||||
@@ -207,7 +220,142 @@ export const useSync = () => {
|
|||||||
chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, 0)
|
chartLayoutStore.setItemUnHandle(ChartLayoutStoreEnum.PERCENTAGE, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* * 赋值全局数据
|
||||||
|
* @param projectData 项目数据
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
const updateStoreInfo = (projectData: {
|
||||||
|
id: string,
|
||||||
|
projectName: string,
|
||||||
|
indexImage: string,
|
||||||
|
remarks: string,
|
||||||
|
state: number
|
||||||
|
}) => {
|
||||||
|
const { id, projectName, remarks, indexImage, state } = projectData
|
||||||
|
// ID
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_ID, id)
|
||||||
|
// 名称
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_NAME, projectName)
|
||||||
|
// 描述
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.REMARKS, remarks)
|
||||||
|
// 缩略图
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.THUMBNAIL, indexImage)
|
||||||
|
// 发布
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.RELEASE, state === 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// * 数据获取
|
||||||
|
const dataSyncFetch = async () => {
|
||||||
|
// FIX:重新执行dataSyncFetch需清空chartEditStore.componentList,否则会导致图层重复
|
||||||
|
// 切换语言等操作会导致重新执行 dataSyncFetch,此时pinia中并未清空chartEditStore.componentList,导致图层重复
|
||||||
|
chartEditStore.componentList = []
|
||||||
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
|
||||||
|
try {
|
||||||
|
const res = await fetchProjectApi({ projectId: fetchRouteParamsLocation() })
|
||||||
|
if (res && res.code === ResultEnum.SUCCESS) {
|
||||||
|
if (res.data) {
|
||||||
|
updateStoreInfo(res.data)
|
||||||
|
// 更新全局数据
|
||||||
|
await updateComponent(JSONParse(res.data.content))
|
||||||
|
return
|
||||||
|
}else {
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_ID, fetchRouteParamsLocation())
|
||||||
|
}
|
||||||
|
setTimeout(() => {
|
||||||
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
|
||||||
|
}, 1000)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
|
||||||
|
} catch (error) {
|
||||||
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
|
||||||
|
httpErrorHandle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// * 数据保存
|
||||||
|
const dataSyncUpdate = throttle(async (updateImg = true) => {
|
||||||
|
if(!fetchRouteParamsLocation()) return
|
||||||
|
|
||||||
|
let projectId = chartEditStore.getProjectInfo[ProjectInfoEnum.PROJECT_ID];
|
||||||
|
if(projectId === null || projectId === ''){
|
||||||
|
window['$message'].error('数据初未始化成功,请刷新页面!')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.START)
|
||||||
|
|
||||||
|
// 异常处理:缩略图上传失败不影响JSON的保存
|
||||||
|
try {
|
||||||
|
if (updateImg) {
|
||||||
|
// 获取缩略图片
|
||||||
|
const range = document.querySelector('.go-edit-range') as HTMLElement
|
||||||
|
// 生成图片
|
||||||
|
const canvasImage: HTMLCanvasElement = await html2canvas(range, {
|
||||||
|
backgroundColor: null,
|
||||||
|
allowTaint: true,
|
||||||
|
useCORS: true
|
||||||
|
})
|
||||||
|
|
||||||
|
// 上传预览图
|
||||||
|
let uploadParams = new FormData()
|
||||||
|
uploadParams.append('object', base64toFile(canvasImage.toDataURL(), `${fetchRouteParamsLocation()}_index_preview.png`))
|
||||||
|
const uploadRes = await uploadFile(uploadParams)
|
||||||
|
// 保存预览图
|
||||||
|
if(uploadRes && uploadRes.code === ResultEnum.SUCCESS) {
|
||||||
|
if (uploadRes.data.fileurl) {
|
||||||
|
await updateProjectApi({
|
||||||
|
id: fetchRouteParamsLocation(),
|
||||||
|
indexImage: `${uploadRes.data.fileurl}`
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
await updateProjectApi({
|
||||||
|
id: fetchRouteParamsLocation(),
|
||||||
|
indexImage: `${systemStore.getFetchInfo.OSSUrl}${uploadRes.data.fileName}`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存数据
|
||||||
|
let params = new FormData()
|
||||||
|
params.append('projectId', projectId)
|
||||||
|
params.append('content', JSONStringify(chartEditStore.getStorageInfo || {}))
|
||||||
|
const res= await saveProjectApi(params)
|
||||||
|
|
||||||
|
if (res && res.code === ResultEnum.SUCCESS) {
|
||||||
|
// 成功状态
|
||||||
|
setTimeout(() => {
|
||||||
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.SUCCESS)
|
||||||
|
}, 1000)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 失败状态
|
||||||
|
chartEditStore.setEditCanvas(EditCanvasTypeEnum.SAVE_STATUS, SyncEnum.FAILURE)
|
||||||
|
}, 3000)
|
||||||
|
|
||||||
|
// * 定时处理
|
||||||
|
const intervalDataSyncUpdate = () => {
|
||||||
|
// 定时获取数据
|
||||||
|
const syncTiming = setInterval(() => {
|
||||||
|
dataSyncUpdate()
|
||||||
|
}, saveInterval * 1000)
|
||||||
|
|
||||||
|
// 销毁
|
||||||
|
onUnmounted(() => {
|
||||||
|
clearInterval(syncTiming)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
updateComponent
|
updateComponent,
|
||||||
|
updateStoreInfo,
|
||||||
|
dataSyncFetch,
|
||||||
|
dataSyncUpdate,
|
||||||
|
intervalDataSyncUpdate
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
lineNumbers: 'on',
|
lineNumbers: 'on',
|
||||||
minimap: { enabled: true }
|
minimap: { enabled: true }
|
||||||
}"
|
}"
|
||||||
/>
|
/>
|
||||||
</n-layout-content>
|
</n-layout-content>
|
||||||
</n-layout>
|
</n-layout>
|
||||||
</div>
|
</div>
|
||||||
@@ -46,11 +46,17 @@ import { ref } from 'vue'
|
|||||||
import { MonacoEditor } from '@/components/Pages/MonacoEditor'
|
import { MonacoEditor } from '@/components/Pages/MonacoEditor'
|
||||||
import { SavePageEnum } from '@/enums/editPageEnum'
|
import { SavePageEnum } from '@/enums/editPageEnum'
|
||||||
import { getSessionStorageInfo } from '../preview/utils'
|
import { getSessionStorageInfo } from '../preview/utils'
|
||||||
import { setSessionStorage, JSONStringify, JSONParse, setTitle, goDialog } from '@/utils'
|
import { setSessionStorage, fetchRouteParamsLocation, JSONStringify, JSONParse, setTitle, goDialog } from '@/utils'
|
||||||
import { StorageEnum } from '@/enums/storageEnum'
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
import { icon } from '@/plugins'
|
import { icon } from '@/plugins'
|
||||||
|
import { useSync } from '@/views/chart/hooks/useSync.hook'
|
||||||
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
||||||
|
import { ProjectInfoEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
||||||
import type { ChartEditStorageType } from '../preview/index.d'
|
import type { ChartEditStorageType } from '../preview/index.d'
|
||||||
|
|
||||||
|
const chartEditStore = useChartEditStore()
|
||||||
|
const { dataSyncUpdate } = useSync()
|
||||||
|
|
||||||
const { ChevronBackOutlineIcon, DownloadIcon, AnalyticsIcon } = icon.ionicons5
|
const { ChevronBackOutlineIcon, DownloadIcon, AnalyticsIcon } = icon.ionicons5
|
||||||
const showOpenFilePicker: Function = (window as any).showOpenFilePicker
|
const showOpenFilePicker: Function = (window as any).showOpenFilePicker
|
||||||
const content = ref('')
|
const content = ref('')
|
||||||
@@ -122,11 +128,16 @@ async function updateSync() {
|
|||||||
message: '是否覆盖源视图内容? 此操作不可撤!',
|
message: '是否覆盖源视图内容? 此操作不可撤!',
|
||||||
isMaskClosable: true,
|
isMaskClosable: true,
|
||||||
transformOrigin: 'center',
|
transformOrigin: 'center',
|
||||||
onPositiveCallback: () => {
|
onPositiveCallback: async () => {
|
||||||
try {
|
try {
|
||||||
const detail = JSONParse(content.value)
|
const detail = JSONParse(content.value)
|
||||||
delete detail.id
|
delete detail.id
|
||||||
// 保持id不变
|
// 保持id不变
|
||||||
|
// 带后端版本额外处理请求
|
||||||
|
if (dataSyncUpdate) {
|
||||||
|
chartEditStore.setProjectInfo(ProjectInfoEnum.PROJECT_ID, fetchRouteParamsLocation())
|
||||||
|
await dataSyncUpdate(false) // JSON界面保存不上传缩略图
|
||||||
|
}
|
||||||
window.opener.dispatchEvent(new CustomEvent(SavePageEnum.JSON, { detail }))
|
window.opener.dispatchEvent(new CustomEvent(SavePageEnum.JSON, { detail }))
|
||||||
window['$message'].success('正在同步内容...')
|
window['$message'].success('正在同步内容...')
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<img src="~@/assets/images/exception/403.svg" alt="" />
|
<img src="~@/assets/images/exception/403.svg" alt="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h1 class="text-base text-gray-500">抱歉,你无权访问该页面</h1>
|
<h1>抱歉,你无权访问该页面</h1>
|
||||||
</div>
|
</div>
|
||||||
<n-button type="primary" @click="goHome">回到首页</n-button>
|
<n-button type="primary" @click="goHome">回到首页</n-button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<img src="~@/assets/images/exception/404.svg" alt="" />
|
<img src="~@/assets/images/exception/404.svg" alt="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h1 class="text-base text-gray-500">抱歉,你访问的页面不存在</h1>
|
<h1>抱歉,你访问的页面不存在</h1>
|
||||||
</div>
|
</div>
|
||||||
<n-button type="primary" @click="goHome">回到首页</n-button>
|
<n-button type="primary" @click="goHome">回到首页</n-button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
<img src="~@/assets/images/exception/500.svg" alt="" />
|
<img src="~@/assets/images/exception/500.svg" alt="" />
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h1 class="text-base text-gray-500">抱歉,服务器出错了</h1>
|
<h1 class="text-base text-gray-500">抱歉,服务器出错了,建议您重新登录呢</h1>
|
||||||
</div>
|
</div>
|
||||||
<n-button type="primary" secondary @click="goHome">回到首页</n-button>
|
<n-button type="primary" secondary @click="goLogin">重新登录</n-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -14,8 +14,8 @@
|
|||||||
import { PageEnum } from '@/enums/pageEnum'
|
import { PageEnum } from '@/enums/pageEnum'
|
||||||
import { routerTurnByName } from '@/utils'
|
import { routerTurnByName } from '@/utils'
|
||||||
|
|
||||||
function goHome() {
|
function goLogin() {
|
||||||
routerTurnByName(PageEnum.BASE_HOME_NAME)
|
routerTurnByName(PageEnum.BASE_LOGIN_NAME)
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -121,45 +121,38 @@
|
|||||||
import { reactive, ref, onMounted } from 'vue'
|
import { reactive, ref, onMounted } from 'vue'
|
||||||
import shuffle from 'lodash/shuffle'
|
import shuffle from 'lodash/shuffle'
|
||||||
import { carouselInterval } from '@/settings/designSetting'
|
import { carouselInterval } from '@/settings/designSetting'
|
||||||
import { useDesignStore } from '@/store/modules/designStore/designStore'
|
import { useSystemStore } from '@/store/modules/systemStore/systemStore'
|
||||||
|
import { SystemStoreUserInfoEnum, SystemStoreEnum } from '@/store/modules/systemStore/systemStore.d'
|
||||||
import { GoThemeSelect } from '@/components/GoThemeSelect'
|
import { GoThemeSelect } from '@/components/GoThemeSelect'
|
||||||
import { GoLangSelect } from '@/components/GoLangSelect'
|
import { GoLangSelect } from '@/components/GoLangSelect'
|
||||||
import { LayoutHeader } from '@/layout/components/LayoutHeader'
|
import { LayoutHeader } from '@/layout/components/LayoutHeader'
|
||||||
import { LayoutFooter } from '@/layout/components/LayoutFooter'
|
import { LayoutFooter } from '@/layout/components/LayoutFooter'
|
||||||
import { PageEnum } from '@/enums/pageEnum'
|
import { PageEnum } from '@/enums/pageEnum'
|
||||||
import { icon } from '@/plugins'
|
|
||||||
import { StorageEnum } from '@/enums/storageEnum'
|
import { StorageEnum } from '@/enums/storageEnum'
|
||||||
import { routerTurnByName, cryptoEncode, setLocalStorage } from '@/utils'
|
import { icon } from '@/plugins'
|
||||||
const { GO_LOGIN_INFO_STORE } = StorageEnum
|
import { routerTurnByName } from '@/utils'
|
||||||
|
import { loginApi } from '@/api/path'
|
||||||
const { PersonOutlineIcon, LockClosedOutlineIcon } = icon.ionicons5
|
|
||||||
|
|
||||||
interface FormState {
|
interface FormState {
|
||||||
username: string
|
username: string
|
||||||
password: string
|
password: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const { GO_SYSTEM_STORE } = StorageEnum
|
||||||
|
const { PersonOutlineIcon, LockClosedOutlineIcon } = icon.ionicons5
|
||||||
|
|
||||||
const formRef = ref()
|
const formRef = ref()
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const autoLogin = ref(true)
|
const autoLogin = ref(true)
|
||||||
const show = ref(false)
|
const show = ref(false)
|
||||||
const showBg = ref(false)
|
const showBg = ref(false)
|
||||||
const designStore = useDesignStore()
|
const systemStore = useSystemStore()
|
||||||
|
|
||||||
const t = window['$t']
|
const t = window['$t']
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
setTimeout(() => {
|
|
||||||
show.value = true
|
|
||||||
}, 300)
|
|
||||||
setTimeout(() => {
|
|
||||||
showBg.value = true
|
|
||||||
}, 100)
|
|
||||||
})
|
|
||||||
|
|
||||||
const formInline = reactive({
|
const formInline = reactive({
|
||||||
username: 'admin',
|
username: 'admin',
|
||||||
password: '123456',
|
password: 'admin',
|
||||||
})
|
})
|
||||||
|
|
||||||
const rules = {
|
const rules = {
|
||||||
@@ -199,38 +192,58 @@ const getImageUrl = (name: string, folder: string) => {
|
|||||||
return new URL(`../../assets/images/${folder}/${name}.png`, import.meta.url).href
|
return new URL(`../../assets/images/${folder}/${name}.png`, import.meta.url).href
|
||||||
}
|
}
|
||||||
|
|
||||||
// 打乱
|
// 打乱图片顺序
|
||||||
const shuffleHandle = () => {
|
const shuffleHandle = () => {
|
||||||
shuffleTimiing.value = setInterval(() => {
|
shuffleTimiing.value = setInterval(() => {
|
||||||
bgList.value = shuffle(bgList.value)
|
bgList.value = shuffle(bgList.value)
|
||||||
}, carouselInterval)
|
}, carouselInterval)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 点击事件
|
// 登录
|
||||||
const handleSubmit = (e: Event) => {
|
const handleSubmit = async (e: Event) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
formRef.value.validate(async (errors: any) => {
|
formRef.value.validate(async (errors: any) => {
|
||||||
if (!errors) {
|
if (!errors) {
|
||||||
const { username, password } = formInline
|
const { username, password } = formInline
|
||||||
loading.value = true
|
loading.value = true
|
||||||
setLocalStorage(
|
// 提交请求
|
||||||
GO_LOGIN_INFO_STORE,
|
const res = await loginApi({
|
||||||
cryptoEncode(
|
username,
|
||||||
JSON.stringify({
|
password
|
||||||
username,
|
})
|
||||||
password,
|
if(res && res.data) {
|
||||||
})
|
const { tokenValue, tokenName } = res.data.token
|
||||||
)
|
const { nickname, username, id } = res.data.userinfo
|
||||||
)
|
|
||||||
window['$message'].success(`${t('login.login_success')}!`)
|
// 存储到 pinia
|
||||||
routerTurnByName(PageEnum.BASE_HOME_NAME, true)
|
systemStore.setItem(SystemStoreEnum.USER_INFO, {
|
||||||
|
[SystemStoreUserInfoEnum.USER_TOKEN]: tokenValue,
|
||||||
|
[SystemStoreUserInfoEnum.TOKEN_NAME]: tokenName,
|
||||||
|
[SystemStoreUserInfoEnum.USER_ID]: id,
|
||||||
|
[SystemStoreUserInfoEnum.USER_NAME]: username,
|
||||||
|
[SystemStoreUserInfoEnum.NICK_NAME]: nickname,
|
||||||
|
t
|
||||||
|
})
|
||||||
|
|
||||||
|
window['$message'].success(t('login.login_success'))
|
||||||
|
routerTurnByName(PageEnum.BASE_HOME_NAME, true)
|
||||||
|
}
|
||||||
|
loading.value = false
|
||||||
} else {
|
} else {
|
||||||
window['$message'].error(`${t('login.login_message')}!`)
|
window['$message'].error(t('login.login_message'))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
show.value = true
|
||||||
|
}, 300)
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
showBg.value = true
|
||||||
|
}, 100)
|
||||||
|
|
||||||
shuffleHandle()
|
shuffleHandle()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|||||||