Compare commits

...

5 Commits

  1. 207
      README.md
  2. BIN
      readme/go-view-canvas.png
  3. BIN
      readme/go-view-color.png
  4. BIN
      readme/go-view-doc.png
  5. BIN
      readme/go-view-event.png
  6. 0
      readme/go-view-fetch.png
  7. BIN
      readme/go-view-filter.png
  8. BIN
      readme/go-view-indexpage.png
  9. BIN
      readme/go-view-qq.png
  10. BIN
      readme/go-view-theme.png
  11. BIN
      readme/logo-poster.png
  12. BIN
      readme/logo-t-y.png
  13. BIN
      readme/logo.png
  14. BIN
      readme/preview.png
  15. 9
      src/api/axios.ts
  16. 29
      src/api/http.ts
  17. 12
      src/api/path/project.api.ts
  18. 8
      src/views/chart/ContentConfigurations/components/ChartData/components/ChartDataRequest/components/RequestHeader/index.vue
  19. 3
      src/views/project/items/components/ProjectItemsList/hooks/useData.hook.ts

@ -1,119 +1,92 @@
## 总览
**`master-fetch` 分支是带有后端接口请求的分支**
**后端项目地址:[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)**
## 使用
所有的接口地址位置:`src\api\path\*`
接口地址修改:`.env`
```shell
# port
VITE_DEV_PORT = '8080'
# development path
VITE_DEV_PATH = 'http://127.0.0.1:8080'
# production path
VITE_PRO_PATH = 'http://127.0.0.1:8080'
```
公共前缀修改:`src\settings\httpSetting.ts`
```shell
// 请求前缀
export const axiosPre = '/api/goview'
```
接口封装:`src\api\http.ts`
```ts
import axiosInstance from './axios'
import { RequestHttpEnum, ContentTypeEnum } from '@/enums/httpEnum'
export const get = (url: string, params?: object) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.GET,
params: params,
})
}
export const post = (url: string, data?: object, headersType?: string) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.POST,
data: data,
headers: {
'Content-Type': headersType || ContentTypeEnum.JSON
}
})
}
export const put = (url: string, data?: object, headersType?: string) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.PUT,
data: data,
headers: {
'Content-Type': headersType || ContentTypeEnum.JSON
}
})
}
export const del = (url: string, params?: object) => {
return axiosInstance({
url: url,
method: RequestHttpEnum.DELETE,
params
})
}
// 获取请求函数,默认get
export const http = (type?: RequestHttpEnum) => {
switch (type) {
case RequestHttpEnum.GET:
return get
case RequestHttpEnum.POST:
return post
case RequestHttpEnum.PUT:
return put
case RequestHttpEnum.DELETE:
return del
default:
return get
}
}
```
## 代码提交
* feat: 新功能
* fix: 修复 Bug
* docs: 文档修改
* perf: 性能优化
* revert: 版本回退
* ci: CICD集成相关
* test: 添加测试代码
* refactor: 代码重构
* build: 影响项目构建或依赖修改
* style: 不影响程序逻辑的代码修改
* chore: 不属于以上类型的其他类型(日常事务)
## 交流
QQ 群:1030129384
![QQ群](readme/go-view-qq.png)
![渲染海报](readme/logo-poster.png)
<p align="center">
<img src="readme/logo-t-y.png" alt="go-view" />
</p>
<h4 align="center">开源、精美、便捷的「数据可视化」低代码开发平台</h4>
由 [芋道](https://doc.iocoder.cn/) 与 GoView 共同建设,基于 Vue3 搭建的低代码数据可视化开发平台,将图表或页面元素封装为基础组件,无需编写代码即可完成业务需求。
* 框架:基于 Vue3 框架编写,使用 hooks 写法抽离部分逻辑,使代码结构更加清晰
* 类型:使用 TypeScript 进行类型约束,减少未知错误发生概率,可以大胆修改逻辑内容
* 性能:多处性能优化,使用页面懒加载、组件动态注册、数据滚动加载等方式,提升页面渲染速度
* 存储:拥有本地记忆,部分配置项采用 storage 存储本地,提升使用体验
* 封装:项目进行了详细的工具类封装如:路由、存储、加/解密、文件处理、主题、NaiveUI 全局方法、组件等
* 入选 NaiveUI 社区精选资源推荐:[查看 NaiveUI 推荐列表](https://www.naiveui.com/zh-CN/light/docs/community)
## 项目地址
![preview](readme/preview.png)
* 前端:<https://gitee.com/zhijiantianya/yudao-ui-go-view>
* Boot 后端:<https://gitee.com/zhijiantianya/ruoyi-vue-pro>
* Cloud 后端:<https://gitee.com/zhijiantianya/yudao-cloud>
## 文档地址
* 演示环境:<http://dashboard.yudao.iocoder.cn/login> 「报表管理 - 大屏设计器」
* 文档地址:<https://doc.iocoder.cn/report/>
## 技术栈
主要技术栈为:
| 名称 | 版本 | 名称 | 版本 |
|-------------------|-------|-------------|--------|
| Vue | 3.2.x | TypeScript4 | 4.6.x |
| Vite | 2.9.x | NaiveUI | 2.27.x |
| ECharts | 5.3.x | Pinia | 2.0.x |
| 详见 `package.json` | 😁 | 🥰 | 🤗 |
开发环境:
| 名称 | 版本 | 名称 | 版本 |
|------|---------|---------|-------|
| node | 16.14.x | npm | 8.5.x |
| pnpm | 7.1.x | windows | 11 |
已完成图表:
| 分类 | 名称 | 名称 | 名称 | 名称 |
|-----|--------------|----------|---------|----------------|
| 图表 | 柱状图 | 横向柱状图 | 折线图 | 单/多 折线面积图(渐变色) |
| \* | 饼图 | 环形图 | 水球图 | 雷达图 |
| \* | NaiveUI 多种进度 | 散点图 | 对数回归散点图 | 热力图 |
| \* | 漏斗图 | 中国地图 | 高德地图 | 🦊 |
| 信息 | 文字 | 渐变文字 | 词云 | 嵌套网页 |
| \* | 图片 | 视频 | 😺 | 🐯 |
| 列表 | 滚动排名列表 | 滚动表格 | 🐮 | 🐐 |
| 小组件 | 边框-01~13 | 装饰-01~05 | 数字翻牌 | 通用时间 |
| \* | 数字计数 | 倒计时 | 时钟 | 🦁 |
## 项目截图
#### 工作台
![工作台](readme/go-view-canvas.png)
#### 请求配置
![请求配置](readme/go-view-fetch.png)
#### 数据过滤
![数据过滤](readme/go-view-filter.png)
#### 高级事件编辑
![高级事件编辑](readme/go-view-event.png)
#### 快捷主页
![快捷主页](readme/go-view-indexpage.png)
#### 主题色
![主题色](readme/go-view-color.png)
#### 亮白主题
![亮白主题](readme/go-view-theme.png)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 398 KiB

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 KiB

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

@ -27,9 +27,12 @@ axiosInstance.interceptors.request.use(
(config: AxiosRequestConfig) => {
// 获取 tenantId
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
config.headers = {
...config.headers,
'tenant-id': info ? info[SystemStoreEnum.TENANT_INFO]['tenantId'] : ''
const tenantId = info ? info[SystemStoreEnum.TENANT_INFO]['tenantId'] : undefined
if (tenantId) {
config.headers = {
...config.headers,
'tenant-id': tenantId
}
}
// 白名单校验

@ -8,6 +8,9 @@ import {
RequestParamsObjType
} from '@/enums/httpEnum'
import type { RequestGlobalConfigType, RequestConfigType } from '@/store/modules/chartEditStore/chartEditStore.d'
import { getLocalStorage } from "@/utils";
import { StorageEnum } from "@/enums/storageEnum";
import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d'
export const get = <T = any>(url: string, params?: object) => {
return axiosInstance<T>({
@ -107,6 +110,30 @@ export const translateStr = (target: string | Record<any, any>) => {
return target
}
// 处理 token 和多租户的头;注意:只拼接属于 VITE_DEV_PATH 或 VITE_PROD_PATH 开头的 URL 地址,就是自己的后端
export const appendTokenAndTenant = (headers: RequestParamsObjType, requestUrl: string) => {
if (requestUrl.indexOf(import.meta.env.VITE_DEV_PATH) === -1
|| requestUrl.indexOf(import.meta.env.VITE_PROD_PATH) === -1) {
return headers
}
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE)
if (!info) {
return headers;
}
// ① 获取 tenantId
const tenantId = info ? info[SystemStoreEnum.TENANT_INFO]['tenantId'] : undefined
if (tenantId) {
headers['tenant-id'] = tenantId
}
// ② 获取 token
const userInfo = info[SystemStoreEnum.USER_INFO]
if (!userInfo) {
return headers
}
headers[userInfo[SystemStoreUserInfoEnum.TOKEN_NAME] || 'token'] = 'Bearer ' + userInfo[SystemStoreUserInfoEnum.USER_TOKEN]
return headers
}
/**
* *
* @param targetParams
@ -155,6 +182,8 @@ export const customizeHttp = (targetParams: RequestConfigType, globalParams: Req
...targetRequestParams.Header
}
headers = translateStr(headers)
// 处理 token 和多租户的头
headers = appendTokenAndTenant(headers, requestUrl)
// data 参数
let data: RequestParamsObjType | FormData | string = {}

@ -6,7 +6,10 @@ import { ProjectItem, ProjectDetail } from './project' // TODO 分页返回,
// * 项目列表
export const projectListApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.GET)<any>(`${ModuleTypeEnum.PROJECT}/my-page`, data)
const res = await http(RequestHttpEnum.GET)<{
list: ProjectItem[],
count: number
}>(`${ModuleTypeEnum.PROJECT}/my-page`, data)
return res
} catch {
httpErrorHandle()
@ -16,12 +19,7 @@ export const projectListApi = async (data: object) => {
// * 新增项目
export const createProjectApi = async (data: object) => {
try {
const res = await http(RequestHttpEnum.POST)<{
/**
* id
*/
id: number
}>(`${ModuleTypeEnum.PROJECT}/create`, data)
const res = await http(RequestHttpEnum.POST)<number>(`${ModuleTypeEnum.PROJECT}/create`, data)
return res
} catch {
httpErrorHandle()

@ -7,10 +7,11 @@
</n-tabs>
</div>
<div v-show="requestContentType === RequestContentTypeEnum.DEFAULT">
<n-tag type="warning">需要后台提供对应的 http 的接口</n-tag> <br />
例如说http://127.0.0.1:48080/admin-api/report/go-view/data/get-by-http
<n-tabs type="line" animated v-model:value="tabValue">
<n-tab v-for="item in RequestParamsTypeEnum" :key="item" :name="item" :tab="item"> {{ item }} </n-tab>
</n-tabs>
<!-- 各个页面 -->
<div class="go-mt-3">
<div v-if="tabValue !== RequestParamsTypeEnum.BODY">
@ -73,12 +74,13 @@
<n-text>SQL 类型不支持 Get 请求请使用其它方式</n-text>
</template>
<template v-else>
<n-tag type="warning">需要后台提供专门处理 sql 的接口</n-tag>
<n-tag type="warning">需要后台提供专门处理 sql 的接口</n-tag> <br />
例如说http://127.0.0.1:48080/admin-api/report/go-view/data/get-by-sql
<setting-item-box name="键名">
<n-tag type="primary" :bordered="false" style="width: 40px; font-size: 16px"> sql </n-tag>
</setting-item-box>
<setting-item-box name="键值">
<monaco-editor v-model:modelValue="requestSQLContent['sql']" width="600px" height="200px" language="sql" />
<monaco-editor v-model:modelValue="requestSQLContent['sql']" width="600px" height="190px" language="sql" />
</setting-item-box>
</template>
</div>

@ -4,7 +4,6 @@ import { DialogEnum } from '@/enums/pluginEnum'
import { projectListApi, deleteProjectApi, changeProjectReleaseApi } from '@/api/path'
import { Chartype, ChartList } from '../../../index.d'
import { ResultEnum } from '@/enums/httpEnum'
import { ProjectItem } from "@/api/path/project";
// 数据初始化
export const useDataListInit = () => {
@ -30,7 +29,7 @@ export const useDataListInit = () => {
})
if (res && res.data) {
paginat.count = res.data.count
const projects = res.data.list as ProjectItem[]
const projects = res.data.list
list.value = projects.map(e => {
const { id, name, status, createTime, picUrl, creator } = e
return {

Loading…
Cancel
Save