@ -0,0 +1,3 @@ |
|||||
|
module.exports = { |
||||
|
extends: ["@commitlint/config-conventional"] |
||||
|
}; |
@ -0,0 +1,15 @@ |
|||||
|
# port |
||||
|
VITE_DEV_PORT = '8080' |
||||
|
|
||||
|
# development path |
||||
|
# VITE_DEV_PATH = 'https://demo.mtruning.club' |
||||
|
VITE_DEV_PATH = 'http://locahost:12080' |
||||
|
|
||||
|
# production path |
||||
|
VITE_PRO_PATH = 'https://demo.mtruning.club' |
||||
|
|
||||
|
# 租户开关 |
||||
|
VITE_APP_TENANT_ENABLE=true |
||||
|
|
||||
|
# 验证码的开关 |
||||
|
VITE_APP_CAPTCHA_ENABLE=true |
@ -0,0 +1,11 @@ |
|||||
|
node_modules/ |
||||
|
public/ |
||||
|
es/ |
||||
|
lib/ |
||||
|
dist/ |
||||
|
package.json |
||||
|
src/assets/ |
||||
|
plop-templates/ |
||||
|
handlebars/ |
||||
|
website/ |
||||
|
build/ |
@ -0,0 +1,30 @@ |
|||||
|
module.exports = { |
||||
|
root: true, |
||||
|
parser: 'vue-eslint-parser', |
||||
|
globals: { |
||||
|
postMessage: true |
||||
|
}, |
||||
|
parserOptions: { |
||||
|
parser: '@typescript-eslint/parser', |
||||
|
sourceType: 'module', |
||||
|
ecmaFeatures: { |
||||
|
jsx: true, |
||||
|
tsx: true |
||||
|
} |
||||
|
}, |
||||
|
env: { |
||||
|
node: true, |
||||
|
// The Follow config only works with eslint-plugin-vue v8.0.0+
|
||||
|
'vue/setup-compiler-macros': true |
||||
|
}, |
||||
|
extends: ['plugin:vue/vue3-essential', 'eslint:recommended'], |
||||
|
rules: { |
||||
|
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', |
||||
|
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', |
||||
|
'no-unused-vars': 'off', |
||||
|
'vue/no-unused-vars': 'off', |
||||
|
'vue/multi-word-component-names': 'off', |
||||
|
'vue/valid-template-root': 'off', |
||||
|
'vue/no-mutating-props': 'off' |
||||
|
} |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
node_modules |
||||
|
.DS_Store |
||||
|
dist |
||||
|
dist-ssr |
||||
|
*.local |
||||
|
.vscode |
@ -0,0 +1,4 @@ |
|||||
|
#!/usr/bin/env sh |
||||
|
. "$(dirname -- "$0")/_/husky.sh" |
||||
|
|
||||
|
npx --no-install commitlint -e |
@ -0,0 +1,51 @@ |
|||||
|
version: '1.0' |
||||
|
name: branch-pipeline |
||||
|
displayName: BranchPipeline |
||||
|
stages: |
||||
|
- stage: |
||||
|
name: compile |
||||
|
displayName: 编译 |
||||
|
steps: |
||||
|
- step: build@nodejs |
||||
|
name: build_nodejs |
||||
|
displayName: Nodejs 构建 |
||||
|
# 支持8.16.2、10.17.0、12.16.1、14.16.0、15.12.0五个版本 |
||||
|
nodeVersion: 14.16.0 |
||||
|
# 构建命令:安装依赖 -> 清除上次打包产物残留 -> 执行构建 【请根据项目实际产出进行填写】 |
||||
|
commands: |
||||
|
- npm install && rm -rf ./dist && npm run build |
||||
|
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除 |
||||
|
artifacts: |
||||
|
# 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址 |
||||
|
- name: BUILD_ARTIFACT |
||||
|
# 构建产物获取路径,是指代码编译完毕之后构建物的所在路径 |
||||
|
path: |
||||
|
- ./dist |
||||
|
- step: publish@general_artifacts |
||||
|
name: publish_general_artifacts |
||||
|
displayName: 上传制品 |
||||
|
# 上游构建任务定义的产物名,默认BUILD_ARTIFACT |
||||
|
dependArtifact: BUILD_ARTIFACT |
||||
|
# 上传到制品库时的制品命名,默认output |
||||
|
artifactName: output |
||||
|
dependsOn: build_nodejs |
||||
|
- stage: |
||||
|
name: release |
||||
|
displayName: 发布 |
||||
|
steps: |
||||
|
- step: publish@release_artifacts |
||||
|
name: publish_release_artifacts |
||||
|
displayName: '发布' |
||||
|
# 上游上传制品任务的产出 |
||||
|
dependArtifact: output |
||||
|
# 发布制品版本号 |
||||
|
version: '1.0.0.0' |
||||
|
# 是否开启版本号自增,默认开启 |
||||
|
autoIncrement: true |
||||
|
triggers: |
||||
|
push: |
||||
|
branches: |
||||
|
exclude: |
||||
|
- master |
||||
|
include: |
||||
|
- .* |
@ -0,0 +1,49 @@ |
|||||
|
version: '1.0' |
||||
|
name: master-pipeline |
||||
|
displayName: MasterPipeline |
||||
|
stages: |
||||
|
- stage: |
||||
|
name: compile |
||||
|
displayName: 编译 |
||||
|
steps: |
||||
|
- step: build@nodejs |
||||
|
name: build_nodejs |
||||
|
displayName: Nodejs 构建 |
||||
|
# 支持8.16.2、10.17.0、12.16.1、14.16.0、15.12.0五个版本 |
||||
|
nodeVersion: 14.16.0 |
||||
|
# 构建命令:安装依赖 -> 清除上次打包产物残留 -> 执行构建 【请根据项目实际产出进行填写】 |
||||
|
commands: |
||||
|
- npm install && rm -rf ./dist && npm run build |
||||
|
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除 |
||||
|
artifacts: |
||||
|
# 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址 |
||||
|
- name: BUILD_ARTIFACT |
||||
|
# 构建产物获取路径,是指代码编译完毕之后构建物的所在路径 |
||||
|
path: |
||||
|
- ./dist |
||||
|
- step: publish@general_artifacts |
||||
|
name: publish_general_artifacts |
||||
|
displayName: 上传制品 |
||||
|
# 上游构建任务定义的产物名,默认BUILD_ARTIFACT |
||||
|
dependArtifact: BUILD_ARTIFACT |
||||
|
# 上传到制品库时的制品命名,默认output |
||||
|
artifactName: output |
||||
|
dependsOn: build_nodejs |
||||
|
- stage: |
||||
|
name: release |
||||
|
displayName: 发布 |
||||
|
steps: |
||||
|
- step: publish@release_artifacts |
||||
|
name: publish_release_artifacts |
||||
|
displayName: '发布' |
||||
|
# 上游上传制品任务的产出 |
||||
|
dependArtifact: output |
||||
|
# 发布制品版本号 |
||||
|
version: '1.0.0.0' |
||||
|
# 是否开启版本号自增,默认开启 |
||||
|
autoIncrement: true |
||||
|
triggers: |
||||
|
push: |
||||
|
branches: |
||||
|
include: |
||||
|
- master |
@ -0,0 +1,36 @@ |
|||||
|
version: '1.0' |
||||
|
name: pr-pipeline |
||||
|
displayName: PRPipeline |
||||
|
stages: |
||||
|
- stage: |
||||
|
name: compile |
||||
|
displayName: 编译 |
||||
|
steps: |
||||
|
- step: build@nodejs |
||||
|
name: build_nodejs |
||||
|
displayName: Nodejs 构建 |
||||
|
# 支持8.16.2、10.17.0、12.16.1、14.16.0、15.12.0五个版本 |
||||
|
nodeVersion: 14.16.0 |
||||
|
# 构建命令:安装依赖 -> 清除上次打包产物残留 -> 执行构建 【请根据项目实际产出进行填写】 |
||||
|
commands: |
||||
|
- npm install && rm -rf ./dist && npm run build |
||||
|
# 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除 |
||||
|
artifacts: |
||||
|
# 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址 |
||||
|
- name: BUILD_ARTIFACT |
||||
|
# 构建产物获取路径,是指代码编译完毕之后构建物的所在路径 |
||||
|
path: |
||||
|
- ./dist |
||||
|
- step: publish@general_artifacts |
||||
|
name: publish_general_artifacts |
||||
|
displayName: 上传制品 |
||||
|
# 上游构建任务定义的产物名,默认BUILD_ARTIFACT |
||||
|
dependArtifact: BUILD_ARTIFACT |
||||
|
# 上传到制品库时的制品命名,默认output |
||||
|
artifactName: output |
||||
|
dependsOn: build_nodejs |
||||
|
triggers: |
||||
|
pr: |
||||
|
branches: |
||||
|
include: |
||||
|
- master |
@ -0,0 +1,21 @@ |
|||||
|
MIT License |
||||
|
|
||||
|
Copyright (c) 2021-present GoView |
||||
|
|
||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
|
of this software and associated documentation files (the "Software"), to deal |
||||
|
in the Software without restriction, including without limitation the rights |
||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
|
copies of the Software, and to permit persons to whom the Software is |
||||
|
furnished to do so, subject to the following conditions: |
||||
|
|
||||
|
The above copyright notice and this permission notice shall be included in all |
||||
|
copies or substantial portions of the Software. |
||||
|
|
||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
|
SOFTWARE. |
@ -0,0 +1,25 @@ |
|||||
|
.PHONY: dist test |
||||
|
default: help |
||||
|
dev: |
||||
|
npm run dev |
||||
|
|
||||
|
dist: |
||||
|
npm run build |
||||
|
|
||||
|
view: |
||||
|
npm run preview |
||||
|
|
||||
|
lint: |
||||
|
npm run lint |
||||
|
|
||||
|
new: |
||||
|
npm run new |
||||
|
|
||||
|
|
||||
|
|
||||
|
help: |
||||
|
@echo " make dev [npm run dev] 开发模式" |
||||
|
@echo " make dist [npm run build] 编译模式" |
||||
|
@echo " make view [npm run preview] 预览打包文件" |
||||
|
@echo " make new [npm run lint] 通过自动化流程创建代码" |
||||
|
@echo " make lint [npm run new] 格式校验" |
@ -0,0 +1,92 @@ |
|||||
|
## 总览 |
||||
|
|
||||
|
<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) |
@ -0,0 +1,41 @@ |
|||||
|
import path from 'path' |
||||
|
export const OUTPUT_DIR = 'dist' |
||||
|
|
||||
|
// monaco-editor 路径
|
||||
|
export const prefix = `monaco-editor/esm/vs` |
||||
|
|
||||
|
// chunk 警告大小
|
||||
|
export const chunkSizeWarningLimit = 2000 |
||||
|
|
||||
|
// 禁用 brotliSize 压缩大小报告
|
||||
|
export const brotliSize = false |
||||
|
|
||||
|
// 分包
|
||||
|
export const rollupOptions = { |
||||
|
output: { |
||||
|
chunkFileNames: 'static/js/[name]-[hash].js', |
||||
|
entryFileNames: 'static/js/[name]-[hash].js', |
||||
|
assetFileNames: (chunkInfo) => { |
||||
|
if(['.png', '.jpg', '.jpeg'].includes(path.extname(chunkInfo.name))) { |
||||
|
return `static/[ext]/[name].[ext]` |
||||
|
} |
||||
|
return `static/[ext]/[name]-[hash].[ext]` |
||||
|
}, |
||||
|
manualChunks: { |
||||
|
jsonWorker: [`${prefix}/language/json/json.worker`], |
||||
|
cssWorker: [`${prefix}/language/css/css.worker`], |
||||
|
htmlWorker: [`${prefix}/language/html/html.worker`], |
||||
|
tsWorker: [`${prefix}/language/typescript/ts.worker`], |
||||
|
editorWorker: [`${prefix}/editor/editor.worker`] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 去除开发代码
|
||||
|
export const terserOptions = { |
||||
|
compress: { |
||||
|
keep_infinity: true, |
||||
|
drop_console: true, |
||||
|
drop_debugger: true |
||||
|
} |
||||
|
} |
@ -0,0 +1,85 @@ |
|||||
|
* { |
||||
|
margin: 0; |
||||
|
} |
||||
|
.first-loading-wrp { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
height: 100vh; |
||||
|
background-color: #17171a; |
||||
|
} |
||||
|
.first-loading-wrp > h1 { |
||||
|
font-size: 128px; |
||||
|
} |
||||
|
.first-loading-wrp .loading-wrp { |
||||
|
padding: 98px; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
align-items: center; |
||||
|
} |
||||
|
.dot { |
||||
|
animation: antRotate 1.2s infinite linear; |
||||
|
transform: rotate(45deg); |
||||
|
position: relative; |
||||
|
display: inline-block; |
||||
|
font-size: 32px; |
||||
|
width: 32px; |
||||
|
height: 32px; |
||||
|
box-sizing: border-box; |
||||
|
} |
||||
|
.dot i { |
||||
|
width: 14px; |
||||
|
height: 14px; |
||||
|
position: absolute; |
||||
|
display: block; |
||||
|
background-color: #1890ff; |
||||
|
border-radius: 100%; |
||||
|
transform: scale(0.75); |
||||
|
transform-origin: 50% 50%; |
||||
|
opacity: 0.3; |
||||
|
animation: antSpinMove 1s infinite linear alternate; |
||||
|
} |
||||
|
.dot i:nth-child(1) { |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
} |
||||
|
.dot i:nth-child(2) { |
||||
|
top: 0; |
||||
|
right: 0; |
||||
|
-webkit-animation-delay: 0.4s; |
||||
|
animation-delay: 0.4s; |
||||
|
} |
||||
|
.dot i:nth-child(3) { |
||||
|
right: 0; |
||||
|
bottom: 0; |
||||
|
-webkit-animation-delay: 0.8s; |
||||
|
animation-delay: 0.8s; |
||||
|
} |
||||
|
.dot i:nth-child(4) { |
||||
|
bottom: 0; |
||||
|
left: 0; |
||||
|
-webkit-animation-delay: 1.2s; |
||||
|
animation-delay: 1.2s; |
||||
|
} |
||||
|
@keyframes antRotate { |
||||
|
to { |
||||
|
-webkit-transform: rotate(405deg); |
||||
|
transform: rotate(405deg); |
||||
|
} |
||||
|
} |
||||
|
@-webkit-keyframes antRotate { |
||||
|
to { |
||||
|
-webkit-transform: rotate(405deg); |
||||
|
transform: rotate(405deg); |
||||
|
} |
||||
|
} |
||||
|
@keyframes antSpinMove { |
||||
|
to { |
||||
|
opacity: 1; |
||||
|
} |
||||
|
} |
||||
|
@-webkit-keyframes antSpinMove { |
||||
|
to { |
||||
|
opacity: 1; |
||||
|
} |
||||
|
} |
@ -0,0 +1,29 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="zh-cmn-Hans"> |
||||
|
<head> |
||||
|
<meta charset="UTF-8" /> |
||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> |
||||
|
<meta name="renderer" content="webkit" /> |
||||
|
<meta name="description" content="GoView 是高效、高性能的拖拽式低代码数据可视化开发平台,将页面元素封装为基础组件,无需编写代码即可完成业务需求。"> |
||||
|
<meta name="keywords" content="GoView,goview,低代码,可视化"> |
||||
|
<meta name="author" content="奔跑的面条,面条"> |
||||
|
<meta |
||||
|
name="viewport" |
||||
|
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" |
||||
|
/> |
||||
|
<link rel="icon" href="./favicon.ico" /> |
||||
|
<title>GoView</title> |
||||
|
<link rel="stylesheet" href="./index.css" /> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div id="appProvider" style="display: none;"></div> |
||||
|
<div id="app"> |
||||
|
<div class="first-loading-wrp"> |
||||
|
<div class="loading-wrp"> |
||||
|
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<script type="module" src="/src/main.ts"></script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,85 @@ |
|||||
|
{ |
||||
|
"name": "go-view", |
||||
|
"version": "2.1.6", |
||||
|
"engines": { |
||||
|
"node": ">=16.14 <18.0.0" |
||||
|
}, |
||||
|
"scripts": { |
||||
|
"dev": "vite --host", |
||||
|
"build": "vue-tsc --noEmit && vite build", |
||||
|
"preview": "vite preview", |
||||
|
"new": "plop --plopfile ./plop/plopfile.js", |
||||
|
"postinstall": "husky install", |
||||
|
"lint": "eslint --ext .js,.jsx,.ts,.tsx,.vue src", |
||||
|
"lint:fix": "eslint --ext .js,.jsx,.ts,.tsx,.vue src --fix" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"@amap/amap-jsapi-loader": "^1.0.1", |
||||
|
"@amap/amap-jsapi-types": "^0.0.8", |
||||
|
"@types/color": "^3.0.3", |
||||
|
"@types/crypto-js": "^4.1.1", |
||||
|
"@types/keymaster": "^1.6.30", |
||||
|
"@types/lodash": "^4.14.184", |
||||
|
"animate.css": "^4.1.1", |
||||
|
"axios": "^0.27.2", |
||||
|
"color": "^4.2.3", |
||||
|
"crypto-js": "^4.1.1", |
||||
|
"dom-helpers": "^5.2.1", |
||||
|
"echarts-liquidfill": "^3.1.0", |
||||
|
"echarts-stat": "^1.2.0", |
||||
|
"echarts-wordcloud": "^2.0.0", |
||||
|
"gsap": "^3.11.3", |
||||
|
"highlight.js": "^11.5.0", |
||||
|
"html2canvas": "^1.4.1", |
||||
|
"keymaster": "^1.6.2", |
||||
|
"monaco-editor": "^0.33.0", |
||||
|
"naive-ui": "2.34.3", |
||||
|
"pinia": "^2.0.13", |
||||
|
"screenfull": "^6.0.1", |
||||
|
"three": "^0.145.0", |
||||
|
"vue": "^3.2.31", |
||||
|
"vue-demi": "^0.13.1", |
||||
|
"vue-i18n": "^9.2.2", |
||||
|
"vue-router": "4.0.12", |
||||
|
"vue3-lazyload": "^0.2.5-beta", |
||||
|
"vue3-sketch-ruler": "^1.3.3", |
||||
|
"vuedraggable": "^4.1.0" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"@commitlint/cli": "^17.0.2", |
||||
|
"@commitlint/config-conventional": "^17.0.2", |
||||
|
"@types/node": "^16.11.26", |
||||
|
"@types/three": "^0.144.0", |
||||
|
"@typescript-eslint/eslint-plugin": "^5.18.0", |
||||
|
"@typescript-eslint/parser": "^5.18.0", |
||||
|
"@vicons/carbon": "^0.12.0", |
||||
|
"@vicons/ionicons5": "~0.11.0", |
||||
|
"@vitejs/plugin-vue": "^1.10.2", |
||||
|
"@vitejs/plugin-vue-jsx": "^1.3.9", |
||||
|
"@vue/compiler-sfc": "^3.2.31", |
||||
|
"@vueuse/core": "^7.7.1", |
||||
|
"commitlint": "^17.0.2", |
||||
|
"default-passive-events": "^2.0.0", |
||||
|
"echarts": "^5.3.2", |
||||
|
"eslint": "^8.12.0", |
||||
|
"eslint-config-prettier": "^8.5.0", |
||||
|
"eslint-plugin-import": "^2.26.0", |
||||
|
"eslint-plugin-prettier": "^4.0.0", |
||||
|
"eslint-plugin-vue": "^8.5.0", |
||||
|
"husky": "^8.0.1", |
||||
|
"lodash": "~4.17.21", |
||||
|
"mockjs": "^1.1.0", |
||||
|
"plop": "^3.0.5", |
||||
|
"prettier": "^2.6.2", |
||||
|
"sass": "^1.49.11", |
||||
|
"sass-loader": "^12.6.0", |
||||
|
"typescript": "4.6.3", |
||||
|
"vite": "2.9.9", |
||||
|
"vite-plugin-compression": "^0.5.1", |
||||
|
"vite-plugin-importer": "^0.2.5", |
||||
|
"vite-plugin-mock": "^2.9.6", |
||||
|
"vite-plugin-monaco-editor": "^1.1.0", |
||||
|
"vue-echarts": "^6.0.2", |
||||
|
"vue-tsc": "^0.28.10" |
||||
|
} |
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
const storeGenerator = require('./store-template/prompt') |
||||
|
|
||||
|
module.exports = (plop) => { |
||||
|
plop.setGenerator('store', storeGenerator) |
||||
|
} |
@ -0,0 +1,3 @@ |
|||||
|
export interface {{upperDataName}}StoreType { |
||||
|
|
||||
|
} |
@ -0,0 +1,11 @@ |
|||||
|
import { defineStore } from 'pinia' |
||||
|
import { {{upperDataName}}StoreType } from './{{name}}Store.d' |
||||
|
import { setLocalStorage, getLocalStorage } from '@/utils' |
||||
|
import { StorageEnum } from '@/enums/storageEnum' |
||||
|
|
||||
|
export const use{{upperDataName}}Store = defineStore({ |
||||
|
id: 'use{{upperDataName}}Store', |
||||
|
state: (): {{upperDataName}}StoreType => ({}), |
||||
|
getters: {}, |
||||
|
actions: {} |
||||
|
}) |
@ -0,0 +1,45 @@ |
|||||
|
module.exports = { |
||||
|
description: 'create a store', |
||||
|
prompts: [ |
||||
|
{ |
||||
|
type: 'input', |
||||
|
name: 'name', |
||||
|
message: 'Please enter store name,such as "newStoreName" :', |
||||
|
validate (value) { |
||||
|
if (!value || value.trim === '') { |
||||
|
return 'name is required'; |
||||
|
} |
||||
|
return true; |
||||
|
}, |
||||
|
} |
||||
|
], |
||||
|
actions: (data) => { |
||||
|
const dataName = data.name |
||||
|
|
||||
|
// 首字母大写
|
||||
|
const upperDataName = dataName.slice(0, 1).toUpperCase() + dataName.slice(1) |
||||
|
|
||||
|
const actions = [ |
||||
|
{ |
||||
|
type: 'add', |
||||
|
path: `${process.cwd()}/src/store/modules/${dataName}Store/${dataName}Store.ts`, // 这里的name就是上面定义的键
|
||||
|
templateFile: './store-template/index.hbs', |
||||
|
data: { |
||||
|
name: data.name, |
||||
|
upperDataName, |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
type: 'add', |
||||
|
path: `${process.cwd()}/src/store/modules/${dataName}Store/${dataName}Store.d.ts`, // 这里的name就是上面定义的键
|
||||
|
templateFile: './store-template/index.d.hbs', |
||||
|
data: { |
||||
|
name: data.name, |
||||
|
upperDataName, |
||||
|
} |
||||
|
}, |
||||
|
] |
||||
|
|
||||
|
return actions |
||||
|
} |
||||
|
} |
@ -0,0 +1,12 @@ |
|||||
|
module.exports = { |
||||
|
printWidth: 120, |
||||
|
tabWidth: 2, |
||||
|
useTabs: false, |
||||
|
singleQuote: true, |
||||
|
semi: false, |
||||
|
trailingComma: "none", |
||||
|
bracketSpacing: true, |
||||
|
jsxSingleQuote: true, |
||||
|
jsxBracketSameLine: false, |
||||
|
arrowParens: "avoid" |
||||
|
} |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 344 KiB |
After Width: | Height: | Size: 218 KiB |
After Width: | Height: | Size: 140 KiB |
After Width: | Height: | Size: 156 KiB |
After Width: | Height: | Size: 153 KiB |
After Width: | Height: | Size: 257 KiB |
After Width: | Height: | Size: 167 KiB |
After Width: | Height: | Size: 9.6 KiB |
After Width: | Height: | Size: 140 KiB |
After Width: | Height: | Size: 56 KiB |
After Width: | Height: | Size: 4.7 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 49 KiB |
@ -0,0 +1,37 @@ |
|||||
|
<template> |
||||
|
<n-config-provider |
||||
|
:theme="darkTheme" |
||||
|
:hljs="hljsTheme" |
||||
|
:locale="locale" |
||||
|
:date-locale="dateLocale" |
||||
|
:theme-overrides="overridesTheme" |
||||
|
> |
||||
|
<go-app-provider> |
||||
|
<I18n></I18n> |
||||
|
<router-view></router-view> |
||||
|
</go-app-provider> |
||||
|
</n-config-provider> |
||||
|
</template> |
||||
|
|
||||
|
<script lang="ts" setup> |
||||
|
import { NConfigProvider } from 'naive-ui' |
||||
|
import { GoAppProvider } from '@/components/GoAppProvider' |
||||
|
import { I18n } from '@/components/I18n' |
||||
|
import { useSystemInit, useDarkThemeHook, useThemeOverridesHook, useCode, useLang } from '@/hooks' |
||||
|
|
||||
|
// 暗黑主题 |
||||
|
const darkTheme = useDarkThemeHook() |
||||
|
|
||||
|
// 主题配置 |
||||
|
const overridesTheme = useThemeOverridesHook() |
||||
|
|
||||
|
// 代码主题 |
||||
|
const hljsTheme = useCode() |
||||
|
|
||||
|
// 系统全局数据初始化 |
||||
|
useSystemInit() |
||||
|
|
||||
|
// 全局语言 |
||||
|
const { locale, dateLocale } = useLang() |
||||
|
|
||||
|
</script> |
@ -0,0 +1,12 @@ |
|||||
|
import { ModuleTypeEnum } from '@/enums/httpEnum' |
||||
|
|
||||
|
// 接口白名单(免登录)
|
||||
|
export const fetchAllowList = [ |
||||
|
// 登录
|
||||
|
`${ModuleTypeEnum.SYSTEM}/auth-login`, |
||||
|
// 预览获取数据
|
||||
|
`${ModuleTypeEnum.PROJECT}/getData`, |
||||
|
] |
||||
|
|
||||
|
// 接口黑名单
|
||||
|
export const fetchBlockList = [] |
@ -0,0 +1,97 @@ |
|||||
|
import axios, { AxiosResponse, AxiosRequestConfig, Axios } from 'axios' |
||||
|
import { ResultEnum, ModuleTypeEnum } from "@/enums/httpEnum" |
||||
|
import { PageEnum, ErrorPageNameMap } from "@/enums/pageEnum" |
||||
|
import { StorageEnum } from '@/enums/storageEnum' |
||||
|
import { axiosPre } from '@/settings/httpSetting' |
||||
|
import { SystemStoreEnum, SystemStoreUserInfoEnum } from '@/store/modules/systemStore/systemStore.d' |
||||
|
import { redirectErrorPage, getLocalStorage, routerTurnByName, 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({ |
||||
|
baseURL: `${import.meta.env.PROD ? import.meta.env.VITE_PRO_PATH : ''}${axiosPre}`, |
||||
|
timeout: ResultEnum.TIMEOUT, |
||||
|
}) as unknown as MyRequestInstance |
||||
|
|
||||
|
axiosInstance.interceptors.request.use( |
||||
|
(config: AxiosRequestConfig) => { |
||||
|
// 获取 tenantId
|
||||
|
const info = getLocalStorage(StorageEnum.GO_SYSTEM_STORE) |
||||
|
const tenantId = info ? info[SystemStoreEnum.TENANT_INFO]['tenantId'] : undefined |
||||
|
if (tenantId) { |
||||
|
config.headers = { |
||||
|
...config.headers, |
||||
|
'tenant-id': tenantId |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 白名单校验
|
||||
|
if (includes(fetchAllowList, config.url)) return config |
||||
|
// 获取 token
|
||||
|
// 重新登录
|
||||
|
if (!info) { |
||||
|
routerTurnByName(PageEnum.BASE_LOGIN_NAME) |
||||
|
return config |
||||
|
} |
||||
|
const userInfo = info[SystemStoreEnum.USER_INFO] |
||||
|
config.headers = { |
||||
|
...config.headers, |
||||
|
[userInfo[SystemStoreUserInfoEnum.TOKEN_NAME] || 'token']: 'Bearer ' + userInfo[SystemStoreUserInfoEnum.USER_TOKEN] || '' |
||||
|
} |
||||
|
return config |
||||
|
}, |
||||
|
(err: AxiosRequestConfig) => { |
||||
|
Promise.reject(err) |
||||
|
} |
||||
|
) |
||||
|
|
||||
|
// 响应拦截器
|
||||
|
axiosInstance.interceptors.response.use( |
||||
|
(res: AxiosResponse) => { |
||||
|
// 预览页面错误不进行处理
|
||||
|
if (isPreview()) { |
||||
|
return Promise.resolve(res.data) |
||||
|
} |
||||
|
// 如果是验证码的返回,直接返回数据
|
||||
|
const { code } = res.data as { code: number } |
||||
|
|
||||
|
if (code === undefined || code === null) return Promise.resolve(res) |
||||
|
|
||||
|
// 成功
|
||||
|
if (code === ResultEnum.SUCCESS) { |
||||
|
return Promise.resolve(res.data) |
||||
|
} |
||||
|
|
||||
|
// 登录过期
|
||||
|
if (code === ResultEnum.TOKEN_OVERDUE) { |
||||
|
window['$message'].error(window['$t']('http.token_overdue_message')) |
||||
|
routerTurnByName(PageEnum.BASE_LOGIN_NAME) |
||||
|
return Promise.resolve(res.data) |
||||
|
} |
||||
|
|
||||
|
// 固定错误码重定向
|
||||
|
if (ErrorPageNameMap.get(code)) { |
||||
|
redirectErrorPage(code) |
||||
|
return Promise.resolve(res.data) |
||||
|
} |
||||
|
|
||||
|
// 提示错误
|
||||
|
window['$message'].error(window['$t']((res.data as any).msg)) |
||||
|
return Promise.resolve(res.data) |
||||
|
}, |
||||
|
(err: AxiosResponse) => { |
||||
|
Promise.reject(err) |
||||
|
} |
||||
|
) |
||||
|
|
||||
|
export default axiosInstance |
@ -0,0 +1,254 @@ |
|||||
|
import axiosInstance from './axios' |
||||
|
import { |
||||
|
RequestHttpEnum, |
||||
|
ContentTypeEnum, |
||||
|
RequestBodyEnum, |
||||
|
RequestDataTypeEnum, |
||||
|
RequestContentTypeEnum, |
||||
|
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>({ |
||||
|
url: url, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
params: params, |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
export const post = <T = any>(url: string, data?: object, headersType?: string) => { |
||||
|
return axiosInstance<T>({ |
||||
|
url: url, |
||||
|
method: RequestHttpEnum.POST, |
||||
|
data: data, |
||||
|
headers: { |
||||
|
'Content-Type': headersType || ContentTypeEnum.JSON |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
export const patch = <T = any>(url: string, data?: object, headersType?: string) => { |
||||
|
return axiosInstance<T>({ |
||||
|
url: url, |
||||
|
method: RequestHttpEnum.PATCH, |
||||
|
data: data, |
||||
|
headers: { |
||||
|
'Content-Type': headersType || ContentTypeEnum.JSON |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
export const put = <T = any>(url: string, data?: object, headersType?: ContentTypeEnum) => { |
||||
|
return axiosInstance<T>({ |
||||
|
url: url, |
||||
|
method: RequestHttpEnum.PUT, |
||||
|
data: data, |
||||
|
headers: { |
||||
|
'Content-Type': headersType || ContentTypeEnum.JSON |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
export const del = <T = any>(url: string, params?: object) => { |
||||
|
return axiosInstance<T>({ |
||||
|
url: url, |
||||
|
method: RequestHttpEnum.DELETE, |
||||
|
params |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// 获取请求函数,默认get
|
||||
|
export const http = (type?: RequestHttpEnum) => { |
||||
|
switch (type) { |
||||
|
case RequestHttpEnum.GET: |
||||
|
return get |
||||
|
|
||||
|
case RequestHttpEnum.POST: |
||||
|
return post |
||||
|
|
||||
|
case RequestHttpEnum.PATCH: |
||||
|
return patch |
||||
|
|
||||
|
case RequestHttpEnum.PUT: |
||||
|
return put |
||||
|
|
||||
|
case RequestHttpEnum.DELETE: |
||||
|
return del |
||||
|
|
||||
|
default: |
||||
|
return get |
||||
|
} |
||||
|
} |
||||
|
const prefix = 'javascript:' |
||||
|
// 对输入字符进行转义处理
|
||||
|
export const translateStr = (target: string | Record<any, any>) => { |
||||
|
if (typeof target === 'string') { |
||||
|
if (target.startsWith(prefix)) { |
||||
|
const funcStr = target.split(prefix)[1] |
||||
|
let result |
||||
|
try { |
||||
|
result = new Function(`${funcStr}`)() |
||||
|
} catch (error) { |
||||
|
console.log(error) |
||||
|
window['$message'].error('js内容解析有误!') |
||||
|
} |
||||
|
return result |
||||
|
} else { |
||||
|
return target |
||||
|
} |
||||
|
} |
||||
|
for (const key in target) { |
||||
|
if (Object.prototype.hasOwnProperty.call(target, key)) { |
||||
|
const subTarget = target[key] |
||||
|
target[key] = translateStr(subTarget) |
||||
|
} |
||||
|
} |
||||
|
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 当前组件参数 |
||||
|
* @param globalParams 全局参数 |
||||
|
*/ |
||||
|
export const customizeHttp = (targetParams: RequestConfigType, globalParams: RequestGlobalConfigType) => { |
||||
|
if (!targetParams || !globalParams) { |
||||
|
return |
||||
|
} |
||||
|
// 全局
|
||||
|
const { |
||||
|
// 全局请求源地址
|
||||
|
requestOriginUrl, |
||||
|
// 全局请求内容
|
||||
|
requestParams: globalRequestParams |
||||
|
} = globalParams |
||||
|
|
||||
|
// 目标组件(优先级 > 全局组件)
|
||||
|
const { |
||||
|
// 请求地址
|
||||
|
requestUrl, |
||||
|
// 普通 / sql
|
||||
|
requestContentType, |
||||
|
// 获取数据的方式
|
||||
|
requestDataType, |
||||
|
// 请求方式 get/post/del/put/patch
|
||||
|
requestHttpType, |
||||
|
// 请求体类型 none / form-data / x-www-form-urlencoded / json /xml
|
||||
|
requestParamsBodyType, |
||||
|
// SQL 请求对象
|
||||
|
requestSQLContent, |
||||
|
// 请求内容 params / cookie / header / body: 同 requestParamsBodyType
|
||||
|
requestParams: targetRequestParams |
||||
|
} = targetParams |
||||
|
|
||||
|
// 静态排除
|
||||
|
if (requestDataType === RequestDataTypeEnum.STATIC) return |
||||
|
|
||||
|
if (!requestUrl) { |
||||
|
return |
||||
|
} |
||||
|
|
||||
|
// 处理头部
|
||||
|
let headers: RequestParamsObjType = { |
||||
|
...globalRequestParams.Header, |
||||
|
...targetRequestParams.Header |
||||
|
} |
||||
|
headers = translateStr(headers) |
||||
|
// 处理 token 和多租户的头
|
||||
|
headers = appendTokenAndTenant(headers, requestUrl) |
||||
|
|
||||
|
// data 参数
|
||||
|
let data: RequestParamsObjType | FormData | string = {} |
||||
|
// params 参数
|
||||
|
let params: RequestParamsObjType = { ...targetRequestParams.Params } |
||||
|
params = translateStr(params) |
||||
|
// form 类型处理
|
||||
|
let formData: FormData = new FormData() |
||||
|
formData.set('default', 'defaultData') |
||||
|
// 类型处理
|
||||
|
|
||||
|
switch (requestParamsBodyType) { |
||||
|
case RequestBodyEnum.NONE: |
||||
|
break |
||||
|
|
||||
|
case RequestBodyEnum.JSON: |
||||
|
headers['Content-Type'] = ContentTypeEnum.JSON |
||||
|
data = translateStr(JSON.parse(targetRequestParams.Body['json'])) |
||||
|
// json 赋值给 data
|
||||
|
break |
||||
|
|
||||
|
case RequestBodyEnum.XML: |
||||
|
headers['Content-Type'] = ContentTypeEnum.XML |
||||
|
// xml 字符串赋值给 data
|
||||
|
data = translateStr(targetRequestParams.Body['xml']) |
||||
|
break |
||||
|
|
||||
|
case RequestBodyEnum.X_WWW_FORM_URLENCODED: { |
||||
|
headers['Content-Type'] = ContentTypeEnum.FORM_URLENCODED |
||||
|
const bodyFormData = targetRequestParams.Body['x-www-form-urlencoded'] |
||||
|
for (const i in bodyFormData) formData.set(i, translateStr(bodyFormData[i])) |
||||
|
// FormData 赋值给 data
|
||||
|
data = formData |
||||
|
break |
||||
|
} |
||||
|
|
||||
|
case RequestBodyEnum.FORM_DATA: { |
||||
|
headers['Content-Type'] = ContentTypeEnum.FORM_DATA |
||||
|
const bodyFormUrlencoded = targetRequestParams.Body['form-data'] |
||||
|
for (const i in bodyFormUrlencoded) { |
||||
|
formData.set(i, translateStr(bodyFormUrlencoded[i])) |
||||
|
} |
||||
|
// FormData 赋值给 data
|
||||
|
data = formData |
||||
|
break |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// sql 处理
|
||||
|
if (requestContentType === RequestContentTypeEnum.SQL) { |
||||
|
headers['Content-Type'] = ContentTypeEnum.JSON |
||||
|
data = requestSQLContent |
||||
|
} |
||||
|
|
||||
|
try { |
||||
|
const url = (new Function("return `" + `${requestOriginUrl}${requestUrl}`.trim() + "`"))(); |
||||
|
return axiosInstance({ |
||||
|
url, |
||||
|
method: requestHttpType, |
||||
|
data, |
||||
|
params, |
||||
|
headers |
||||
|
}) |
||||
|
} catch (error) { |
||||
|
console.log(error) |
||||
|
window['$message'].error('URL地址格式有误!') |
||||
|
} |
||||
|
} |
@ -0,0 +1,199 @@ |
|||||
|
{ |
||||
|
"xAxis": [ |
||||
|
"12a", |
||||
|
"1a", |
||||
|
"2a", |
||||
|
"3a", |
||||
|
"4a", |
||||
|
"5a", |
||||
|
"6a", |
||||
|
"7a", |
||||
|
"8a", |
||||
|
"9a", |
||||
|
"10a", |
||||
|
"11a", |
||||
|
"12p", |
||||
|
"1p", |
||||
|
"2p", |
||||
|
"3p", |
||||
|
"4p", |
||||
|
"5p", |
||||
|
"6p", |
||||
|
"7p", |
||||
|
"8p", |
||||
|
"9p", |
||||
|
"10p", |
||||
|
"11p" |
||||
|
], |
||||
|
"yAxis": ["Saturday", "Friday", "Thursday", "Wednesday", "Tuesday", "Monday", "Sunday"], |
||||
|
"seriesData": [ |
||||
|
[0, 0, "@integer(0, 10)"], |
||||
|
[1, 0, "@integer(0, 10)"], |
||||
|
[2, 0, "-"], |
||||
|
[3, 0, "-"], |
||||
|
[4, 0, "-"], |
||||
|
[5, 0, "-"], |
||||
|
[6, 0, "-"], |
||||
|
[7, 0, "-"], |
||||
|
[8, 0, "-"], |
||||
|
[9, 0, "-"], |
||||
|
[10, 0, "-"], |
||||
|
[11, 0, "@integer(0, 10)"], |
||||
|
[12, 0, "@integer(0, 10)"], |
||||
|
[13, 0, "@integer(0, 10)"], |
||||
|
[14, 0, "@integer(0, 10)"], |
||||
|
[15, 0, "@integer(0, 10)"], |
||||
|
[16, 0, "@integer(0, 10)"], |
||||
|
[17, 0, "@integer(0, 10)"], |
||||
|
[18, 0, "@integer(0, 10)"], |
||||
|
[19, 0, "@integer(0, 10)"], |
||||
|
[20, 0, "@integer(0, 10)"], |
||||
|
[21, 0, "@integer(0, 10)"], |
||||
|
[22, 0, "@integer(0, 10)"], |
||||
|
[23, 0, "@integer(0, 10)"], |
||||
|
[0, 1, 7], |
||||
|
[1, 1, "-"], |
||||
|
[2, 1, "-"], |
||||
|
[3, 1, "-"], |
||||
|
[4, 1, "-"], |
||||
|
[5, 1, "-"], |
||||
|
[6, 1, "-"], |
||||
|
[7, 1, "-"], |
||||
|
[8, 1, "-"], |
||||
|
[9, 1, "-"], |
||||
|
[10, 1, "@integer(0, 10)"], |
||||
|
[11, 1, "@integer(0, 10)"], |
||||
|
[12, 1, "@integer(0, 10)"], |
||||
|
[13, 1, "@integer(0, 10)"], |
||||
|
[14, 1, "@integer(0, 10)"], |
||||
|
[15, 1, "@integer(0, 10)"], |
||||
|
[16, 1, "@integer(0, 10)"], |
||||
|
[17, 1, "@integer(0, 10)"], |
||||
|
[18, 1, "@integer(0, 10)"], |
||||
|
[19, 1, "@integer(0, 10)"], |
||||
|
[20, 1, "@integer(0, 10)"], |
||||
|
[21, 1, "@integer(0, 10)"], |
||||
|
[22, 1, "@integer(0, 10)"], |
||||
|
[23, 1, "@integer(0, 10)"], |
||||
|
[0, 2, 1], |
||||
|
[1, 2, 1], |
||||
|
[2, 2, "-"], |
||||
|
[3, 2, "-"], |
||||
|
[4, 2, "-"], |
||||
|
[5, 2, "-"], |
||||
|
[6, 2, "-"], |
||||
|
[7, 2, "-"], |
||||
|
[8, 2, "-"], |
||||
|
[9, 2, "-"], |
||||
|
[10, 2, "@integer(0, 10)"], |
||||
|
[11, 2, "@integer(0, 10)"], |
||||
|
[12, 2, "@integer(0, 10)"], |
||||
|
[13, 2, "@integer(0, 10)"], |
||||
|
[14, 2, "@integer(0, 10)"], |
||||
|
[15, 2, "@integer(0, 10)"], |
||||
|
[16, 2, "@integer(0, 10)"], |
||||
|
[17, 2, "@integer(0, 10)"], |
||||
|
[18, 2, "@integer(0, 10)"], |
||||
|
[19, 2, "@integer(0, 10)"], |
||||
|
[20, 2, "@integer(0, 10)"], |
||||
|
[21, 2, "@integer(0, 10)"], |
||||
|
[22, 2, "@integer(0, 10)"], |
||||
|
[23, 2, "@integer(0, 10)"], |
||||
|
[0, 3, 7], |
||||
|
[1, 3, 3], |
||||
|
[2, 3, "-"], |
||||
|
[3, 3, "-"], |
||||
|
[4, 3, "-"], |
||||
|
[5, 3, "-"], |
||||
|
[6, 3, "-"], |
||||
|
[7, 3, "-"], |
||||
|
[8, 3, 1], |
||||
|
[9, 3, "-"], |
||||
|
[10, 3, "@integer(0, 10)"], |
||||
|
[11, 3, "@integer(0, 10)"], |
||||
|
[12, 3, "@integer(0, 10)"], |
||||
|
[13, 3, "@integer(0, 10)"], |
||||
|
[14, 3, "@integer(0, 10)"], |
||||
|
[15, 3, "@integer(0, 10)"], |
||||
|
[16, 3, "@integer(0, 10)"], |
||||
|
[17, 3, "@integer(0, 10)"], |
||||
|
[18, 3, "@integer(0, 10)"], |
||||
|
[19, 3, "@integer(0, 10)"], |
||||
|
[20, 3, "@integer(0, 10)"], |
||||
|
[21, 3, "@integer(0, 10)"], |
||||
|
[22, 3, "@integer(0, 10)"], |
||||
|
[23, 3, "@integer(0, 10)"], |
||||
|
[0, 4, "@integer(0, 10)"], |
||||
|
[1, 4, "@integer(0, 10)"], |
||||
|
[2, 4, "-"], |
||||
|
[3, 4, "-"], |
||||
|
[4, 4, "-"], |
||||
|
[5, 4, "@integer(0, 10)"], |
||||
|
[6, 4, "-"], |
||||
|
[7, 4, "-"], |
||||
|
[8, 4, "-"], |
||||
|
[9, 4, "@integer(0, 10)"], |
||||
|
[10, 4, "@integer(0, 10)"], |
||||
|
[11, 4, "@integer(0, 10)"], |
||||
|
[12, 4, "@integer(0, 10)"], |
||||
|
[13, 4, "@integer(0, 10)"], |
||||
|
[14, 4, "@integer(0, 10)"], |
||||
|
[15, 4, "@integer(0, 10)"], |
||||
|
[16, 4, "@integer(0, 10)"], |
||||
|
[17, 4, "@integer(0, 10)"], |
||||
|
[18, 4, "@integer(0, 10)"], |
||||
|
[19, 4, "@integer(0, 10)"], |
||||
|
[20, 4, "@integer(0, 10)"], |
||||
|
[21, 4, "@integer(0, 10)"], |
||||
|
[22, 4, "@integer(0, 10)"], |
||||
|
[23, 4, "-"], |
||||
|
[0, 5, "@integer(0, 10)"], |
||||
|
[1, 5, "@integer(0, 10)"], |
||||
|
[2, 5, "-"], |
||||
|
[3, 5, "@integer(0, 10)"], |
||||
|
[4, 5, "-"], |
||||
|
[5, 5, "-"], |
||||
|
[6, 5, "-"], |
||||
|
[7, 5, "-"], |
||||
|
[8, 5, "@integer(0, 10)"], |
||||
|
[9, 5, "-"], |
||||
|
[10, 5, "@integer(0, 10)"], |
||||
|
[11, 5, "@integer(0, 10)"], |
||||
|
[12, 5, "@integer(0, 10)"], |
||||
|
[13, 5, "@integer(0, 10)"], |
||||
|
[14, 5, "@integer(0, 10)"], |
||||
|
[15, 5, "@integer(0, 10)"], |
||||
|
[16, 5, "@integer(0, 10)"], |
||||
|
[17, 5, "@integer(0, 10)"], |
||||
|
[18, 5, "-"], |
||||
|
[19, 5, "@integer(0, 10)"], |
||||
|
[20, 5, "@integer(0, 10)"], |
||||
|
[21, 5, "@integer(0, 10)"], |
||||
|
[22, 5, "@integer(0, 10)"], |
||||
|
[23, 5, "-"], |
||||
|
[0, 6, "@integer(0, 10)"], |
||||
|
[1, 6, "-"], |
||||
|
[2, 6, "-"], |
||||
|
[3, 6, "-"], |
||||
|
[4, 6, "-"], |
||||
|
[5, 6, "-"], |
||||
|
[6, 6, "-"], |
||||
|
[7, 6, "-"], |
||||
|
[8, 6, "-"], |
||||
|
[9, 6, "-"], |
||||
|
[10, 6, "@integer(0, 10)"], |
||||
|
[11, 6, "-"], |
||||
|
[12, 6, "@integer(0, 10)"], |
||||
|
[13, 6, "@integer(0, 10)"], |
||||
|
[14, 6, "@integer(0, 10)"], |
||||
|
[15, 6, "@integer(0, 10)"], |
||||
|
[16, 6, "-"], |
||||
|
[17, 6, "-"], |
||||
|
[18, 6, "-"], |
||||
|
[19, 6, "-"], |
||||
|
[20, 6, "@integer(0, 10)"], |
||||
|
[21, 6, "@integer(0, 10)"], |
||||
|
[22, 6, "@integer(0, 10)"], |
||||
|
[23, 6, "@integer(0, 10)"] |
||||
|
] |
||||
|
} |
@ -0,0 +1,108 @@ |
|||||
|
import test from './test.mock' |
||||
|
import { MockMethod } from 'vite-plugin-mock' |
||||
|
import { RequestHttpEnum } from '@/enums/httpEnum' |
||||
|
|
||||
|
// 单个X数据
|
||||
|
export const chartDataUrl = '/mock/chartData' |
||||
|
export const chartSingleDataUrl = '/mock/chartSingleData' |
||||
|
export const numberFloatUrl = '/mock/number/float' |
||||
|
export const numberIntUrl = '/mock/number/int' |
||||
|
export const textUrl = '/mock/text' |
||||
|
export const imageUrl = '/mock/image' |
||||
|
export const rankListUrl = '/mock/rankList' |
||||
|
export const scrollBoardUrl = '/mock/scrollBoard' |
||||
|
export const radarUrl = '/mock/radarData' |
||||
|
export const heatMapUrl = '/mock/heatMapData' |
||||
|
export const scatterBasicUrl = '/mock/scatterBasic' |
||||
|
export const mapUrl = '/mock/map' |
||||
|
export const capsuleUrl = '/mock/capsule' |
||||
|
export const wordCloudUrl = '/mock/wordCloud' |
||||
|
export const treemapUrl = '/mock/treemap' |
||||
|
export const threeEarth01Url = '/mock/threeEarth01Data' |
||||
|
|
||||
|
const mockObject: MockMethod[] = [ |
||||
|
{ |
||||
|
// 正则
|
||||
|
// url: /\/mock\/mockData(|\?\S*)$/,
|
||||
|
url: chartDataUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchMockData |
||||
|
}, |
||||
|
{ |
||||
|
url: chartSingleDataUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchMockSingleData |
||||
|
}, |
||||
|
{ |
||||
|
url: numberFloatUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchNumberFloat |
||||
|
}, |
||||
|
{ |
||||
|
url: numberIntUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchNumberInt |
||||
|
}, |
||||
|
{ |
||||
|
url: textUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchText |
||||
|
}, |
||||
|
{ |
||||
|
url: imageUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchImage(Math.round(Math.random() * 10)) |
||||
|
}, |
||||
|
{ |
||||
|
url: rankListUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchRankList |
||||
|
}, |
||||
|
{ |
||||
|
url: scrollBoardUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchScrollBoard |
||||
|
}, |
||||
|
{ |
||||
|
url: radarUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchRadar |
||||
|
}, |
||||
|
{ |
||||
|
url: heatMapUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchHeatmap |
||||
|
}, |
||||
|
{ |
||||
|
url: scatterBasicUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchScatterBasic |
||||
|
}, |
||||
|
{ |
||||
|
url: mapUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchMap |
||||
|
}, |
||||
|
{ |
||||
|
url: capsuleUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchCapsule |
||||
|
}, |
||||
|
{ |
||||
|
url: wordCloudUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchWordCloud |
||||
|
}, |
||||
|
{ |
||||
|
url: treemapUrl, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.fetchTreemap |
||||
|
}, |
||||
|
{ |
||||
|
url: threeEarth01Url, |
||||
|
method: RequestHttpEnum.GET, |
||||
|
response: () => test.threeEarth01Data |
||||
|
}, |
||||
|
] |
||||
|
|
||||
|
export default mockObject |
@ -0,0 +1,9 @@ |
|||||
|
{ |
||||
|
"markers|50": [ |
||||
|
{ |
||||
|
"name": "某某地市", |
||||
|
"value": "@integer(2, 20)", |
||||
|
"position": ["@float(115, 117, 1, 6)", "@float(38, 40, 1, 6)"] |
||||
|
} |
||||
|
] |
||||
|
} |
@ -0,0 +1,56 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"dimensions": ["data1"], |
||||
|
"source": [ |
||||
|
[10.0, "@integer(0, 100)"], |
||||
|
[8.07, "@integer(0, 100)"], |
||||
|
[13.0, "@integer(0, 100)"], |
||||
|
[9.05, "@integer(0, 100)"], |
||||
|
[11.0, "@integer(0, 100)"], |
||||
|
[14.0, "@integer(0, 100)"], |
||||
|
[13.4, "@integer(0, 100)"], |
||||
|
[10.0, "@integer(0, 100)"], |
||||
|
[14.0, "@integer(0, 100)"], |
||||
|
[12.5, "@integer(0, 100)"], |
||||
|
[9.15, "@integer(0, 100)"], |
||||
|
[11.5, "@integer(0, 100)"], |
||||
|
[3.03, "@integer(0, 100)"], |
||||
|
[12.2, "@integer(0, 100)"], |
||||
|
[2.02, "@integer(0, 100)"], |
||||
|
[1.05, "@integer(0, 100)"], |
||||
|
[4.05, "@integer(0, 100)"], |
||||
|
[6.03, "@integer(0, 100)"], |
||||
|
[12.0, "@integer(0, 100)"], |
||||
|
[12.0, "@integer(0, 100)"], |
||||
|
[7.08, "@integer(0, 100)"], |
||||
|
[5.02, "@integer(0, 100)"] |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"dimensions": ["data2"], |
||||
|
"source": [ |
||||
|
[10.0, "@integer(0, 70)"], |
||||
|
[8.07, "@integer(0, 70)"], |
||||
|
[13.0, "@integer(0, 70)"], |
||||
|
[9.05, "@integer(0, 70)"], |
||||
|
[11.0, "@integer(0, 70)"], |
||||
|
[14.0, "@integer(0, 70)"], |
||||
|
[13.4, "@integer(0, 70)"], |
||||
|
[10.0, "@integer(0, 70)"], |
||||
|
[14.0, "@integer(0, 70)"], |
||||
|
[12.5, "@integer(0, 70)"], |
||||
|
[9.15, "@integer(0, 70)"], |
||||
|
[11.5, "@integer(0, 70)"], |
||||
|
[3.03, "@integer(0, 70)"], |
||||
|
[12.2, "@integer(0, 70)"], |
||||
|
[2.02, "@integer(0, 70)"], |
||||
|
[1.05, "@integer(0, 70)"], |
||||
|
[4.05, "@integer(0, 70)"], |
||||
|
[6.03, "@integer(0, 70)"], |
||||
|
[12.0, "@integer(0, 70)"], |
||||
|
[12.0, "@integer(0, 70)"], |
||||
|
[7.08, "@integer(0, 70)"], |
||||
|
[5.02, "@integer(0, 70)"] |
||||
|
] |
||||
|
} |
||||
|
] |
@ -0,0 +1,223 @@ |
|||||
|
import heatmapJson from './heatMapData.json' |
||||
|
import scatterJson from './scatter.json' |
||||
|
import mapJson from './map.json' |
||||
|
import tTreemapJson from './treemap.json' |
||||
|
|
||||
|
export default { |
||||
|
// 单图表
|
||||
|
fetchMockSingleData: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: { |
||||
|
dimensions: ['product', 'dataOne'], |
||||
|
'source|20': [ |
||||
|
{ |
||||
|
product: '@name', |
||||
|
'dataOne|0-900': 3 |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
// 胶囊图
|
||||
|
fetchCapsule: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: { |
||||
|
dimensions: ['name', 'value'], |
||||
|
"source|2-5": [ |
||||
|
{ 'name|+1': ["厦门","福州","北京","上海","新疆","郑州","湖南","内蒙古"], 'value|0-40': 20 }, |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
// 图表
|
||||
|
fetchMockData: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: { |
||||
|
dimensions: ['product', 'dataOne', 'dataTwo', 'dataThree'], |
||||
|
'source|20': [ |
||||
|
{ |
||||
|
product: '@name', |
||||
|
'dataOne|100-900': 3, |
||||
|
'dataTwo|100-900': 3, |
||||
|
'dataThree|100-900': 3 |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
// 排名列表
|
||||
|
fetchRankList: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
'data|50': [{ name: '@name', 'value|100-900': 5 }] |
||||
|
}, |
||||
|
// 轮播表格
|
||||
|
fetchScrollBoard: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: [ |
||||
|
['行1列1', '行1列2', '1'], |
||||
|
['行2列1', '行2列2', '2'], |
||||
|
['行3列1', '行3列2', '3'], |
||||
|
['行4列1', '行4列2', '4'], |
||||
|
['行5列1', '行5列2', '5'], |
||||
|
['行6列1', '行6列2', '6'], |
||||
|
['行7列1', '行7列2', '行7列3'], |
||||
|
['行8列1', '行8列2', '行8列3'], |
||||
|
['行9列1', '行9列2', '行9列3'], |
||||
|
['行10列1', '行10列2', '行10列3'] |
||||
|
] |
||||
|
}, |
||||
|
// 获取数字-浮点型
|
||||
|
fetchNumberFloat: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: '@float(0, 0.99, 1, 4)' |
||||
|
}, |
||||
|
// 获取数字-整型
|
||||
|
fetchNumberInt: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: '@integer(0, 100)' |
||||
|
}, |
||||
|
// 文字
|
||||
|
fetchText: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: '@paragraph(1, 10)' |
||||
|
}, |
||||
|
// 图片
|
||||
|
fetchImage: (num: number) => ({ |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: `https://robohash.org/${num}` |
||||
|
}), |
||||
|
// 雷达
|
||||
|
fetchRadar: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: { |
||||
|
radarIndicator: [ |
||||
|
{ name: '@name', max: 10000 }, |
||||
|
{ name: '@name', max: 10000 }, |
||||
|
{ name: '@name', max: 10000 }, |
||||
|
{ name: '@name', max: 10000 }, |
||||
|
{ name: '@name', max: 10000 }, |
||||
|
{ name: '@name', max: 10000 } |
||||
|
], |
||||
|
seriesData: [ |
||||
|
{ |
||||
|
value: [ |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)' |
||||
|
], |
||||
|
name: 'data1' |
||||
|
}, |
||||
|
{ |
||||
|
value: [ |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)', |
||||
|
'@integer(0, 10000)' |
||||
|
], |
||||
|
name: 'data2' |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
}, |
||||
|
// 热力图
|
||||
|
fetchHeatmap: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: heatmapJson |
||||
|
}, |
||||
|
// 散点图
|
||||
|
fetchScatterBasic: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: scatterJson |
||||
|
}, |
||||
|
// 中国地图
|
||||
|
fetchMap: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: mapJson |
||||
|
}, |
||||
|
// 词云
|
||||
|
fetchWordCloud: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: [ |
||||
|
{ |
||||
|
name: '@name', |
||||
|
value: 8000, |
||||
|
textStyle: { |
||||
|
color: '#78fbb2' |
||||
|
}, |
||||
|
emphasis: { |
||||
|
textStyle: { |
||||
|
color: 'red' |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' }, |
||||
|
{ name: '@name', value: '@integer(10, 8000)' } |
||||
|
] |
||||
|
}, |
||||
|
// 树图
|
||||
|
fetchTreemap: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: tTreemapJson |
||||
|
}, |
||||
|
// 三维地球
|
||||
|
threeEarth01Data: { |
||||
|
code: 0, |
||||
|
status: 200, |
||||
|
msg: '请求成功', |
||||
|
data: [ |
||||
|
{ |
||||
|
startArray: { name: '@name', N: '@integer(10, 100)', E: '@integer(10, 100)' }, |
||||
|
'endArray|10': [{ name: '@name', N: '@integer(10, 100)', E: '@integer(10, 100)' }] |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
} |
@ -0,0 +1,50 @@ |
|||||
|
[ |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 1000)", |
||||
|
"children": [ |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 500)" |
||||
|
}, |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 500)" |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 1000)", |
||||
|
"children": [ |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 00)" |
||||
|
}, |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 500)" |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 1000)", |
||||
|
"children": [ |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 1000)" |
||||
|
} |
||||
|
] |
||||
|
}, |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 1000)", |
||||
|
"children": [ |
||||
|
{ |
||||
|
"name": "@name", |
||||
|
"value": "@integer(0, 1000)" |
||||
|
} |
||||
|
] |
||||
|
} |
||||
|
] |
@ -0,0 +1,3 @@ |
|||||
|
export * from '@/api/path/project.api' |
||||
|
export * from '@/api/path/system.api' |
||||
|
export * from '@/api/path/infra.api' |
@ -0,0 +1,13 @@ |
|||||
|
import { http } from '@/api/http' |
||||
|
import { httpErrorHandle } from '@/utils' |
||||
|
import { RequestHttpEnum, ModuleTypeEnum, ContentTypeEnum } from '@/enums/httpEnum' |
||||
|
|
||||
|
// * 上传文件
|
||||
|
export const uploadFile = async (data: object) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.POST)<string>(`${ModuleTypeEnum.INFRA}/file/upload`, data, ContentTypeEnum.FORM_DATA) |
||||
|
return res |
||||
|
} catch { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
@ -0,0 +1,77 @@ |
|||||
|
import { http } from '@/api/http' |
||||
|
import { httpErrorHandle } from '@/utils' |
||||
|
import { ContentTypeEnum, RequestHttpEnum, ModuleTypeEnum } from '@/enums/httpEnum' |
||||
|
import { ProjectItem, ProjectDetail } from './project' // TODO 分页返回,优化使用 ProjectItem
|
||||
|
|
||||
|
// * 项目列表
|
||||
|
export const projectListApi = async (data: object) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.GET)<{ |
||||
|
list: ProjectItem[], |
||||
|
count: number |
||||
|
}>(`${ModuleTypeEnum.PROJECT}/my-page`, data) |
||||
|
return res |
||||
|
} catch { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// * 新增项目
|
||||
|
export const createProjectApi = async (data: object) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.POST)<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}/get`, data) |
||||
|
return res |
||||
|
} catch { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// * 保存项目
|
||||
|
export const saveProjectApi = async (data: object) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, data) |
||||
|
return res |
||||
|
} catch { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// * 修改项目基础信息
|
||||
|
export const updateProjectApi = async (data: object) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, 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() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// * 修改发布状态 [0 已发布, 1 未发布]
|
||||
|
export const changeProjectReleaseApi = async (data: object) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.PUT)(`${ModuleTypeEnum.PROJECT}/update`, data) |
||||
|
return res |
||||
|
} catch { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
@ -0,0 +1,40 @@ |
|||||
|
export type ProjectItem = { |
||||
|
/** |
||||
|
* 项目 id |
||||
|
*/ |
||||
|
id: string |
||||
|
/** |
||||
|
* 项目名称 |
||||
|
*/ |
||||
|
name: string |
||||
|
/** |
||||
|
* 项目状态: |
||||
|
* |
||||
|
* 0 - 已发布 |
||||
|
* 1 - 未发布 |
||||
|
*/ |
||||
|
status: number |
||||
|
/** |
||||
|
* 创建时间 |
||||
|
*/ |
||||
|
createTime: number |
||||
|
/** |
||||
|
* 预览图片 URL |
||||
|
*/ |
||||
|
picUrl: string |
||||
|
/** |
||||
|
* 创建者 |
||||
|
*/ |
||||
|
creator: string |
||||
|
/** |
||||
|
* 项目备注 |
||||
|
*/ |
||||
|
remark: string |
||||
|
} |
||||
|
|
||||
|
export interface ProjectDetail extends ProjectItem { |
||||
|
/** |
||||
|
* 项目参数 |
||||
|
*/ |
||||
|
content: string |
||||
|
} |
@ -0,0 +1,66 @@ |
|||||
|
import { http } from '@/api/http' |
||||
|
import { httpErrorHandle } from '@/utils' |
||||
|
import { RequestHttpEnum, ModuleTypeEnum } from '@/enums/httpEnum' |
||||
|
import {AuthLoginRespVO, ProfileVO} from './system' |
||||
|
|
||||
|
// * 登录
|
||||
|
export const loginApi = async (data: object) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.POST)<AuthLoginRespVO>(`${ModuleTypeEnum.SYSTEM}/auth/login`, data) |
||||
|
console.log(res) |
||||
|
return res |
||||
|
} catch (err) { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// * 登出
|
||||
|
export const logoutApi = async () => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.POST)(`${ModuleTypeEnum.SYSTEM}/auth/logout`) |
||||
|
return res |
||||
|
} catch (err) { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 查询用户个人信息
|
||||
|
export const getUserProfileApi = async () => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.GET)<ProfileVO>(`${ModuleTypeEnum.SYSTEM}/user/profile/get`) |
||||
|
return res |
||||
|
} catch (err) { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// 获取验证图片 以及token
|
||||
|
export const getCodeApi = async (data: any) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.POST)(`${ModuleTypeEnum.SYSTEM}/captcha/get`, data) |
||||
|
return res.data |
||||
|
} catch (err) { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 滑动或者点选验证
|
||||
|
export const reqCheckApi = async (data: any) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.POST)(`${ModuleTypeEnum.SYSTEM}/captcha/check`, data) |
||||
|
return res.data |
||||
|
} catch (err) { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 使用租户名,获得租户编号
|
||||
|
export const getTenantIdByNameApi = async (name: string) => { |
||||
|
try { |
||||
|
const res = await http(RequestHttpEnum.GET)(`${ModuleTypeEnum.SYSTEM}/tenant/get-id-by-name?name=` + name) |
||||
|
return res |
||||
|
} catch (err) { |
||||
|
httpErrorHandle() |
||||
|
} |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
export interface AuthLoginRespVO { |
||||
|
/** |
||||
|
* 用户编号 |
||||
|
*/ |
||||
|
userId: number |
||||
|
/** |
||||
|
* 访问令牌 |
||||
|
*/ |
||||
|
accessToken: string |
||||
|
/** |
||||
|
* 刷新令牌 |
||||
|
*/ |
||||
|
refreshToken: string |
||||
|
/** |
||||
|
* 过期时间 |
||||
|
*/ |
||||
|
expiresTime: number |
||||
|
} |
||||
|
|
||||
|
export interface ProfileVO { |
||||
|
id: number |
||||
|
nickname: string |
||||
|
} |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 9.9 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 28 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 34 KiB |
After Width: | Height: | Size: 103 KiB |
After Width: | Height: | Size: 66 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 37 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 62 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 18 KiB |