Commit 265f2a0b authored by 何小勇's avatar 何小勇

init

parents
platform:
runner: 10.11.92.34
kind: pipeline
name: dev
trigger:
branch:
- dev
clone:
disable: true
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
##-------------------------------流水线⬇-------------------------------##
steps: # 定义流水线执行步骤,这些步骤将顺序执行
- name: fetch
image: registry.cn-qingdao.aliyuncs.com/wod/devops-git:1.0
network_mode: host
- name: s3-cache
image: registry.cn-qingdao.aliyuncs.com/wod/devops-s3-cache:1.0
network_mode: host
settings:
restore: true
mount:
- ./node_modules
endpoint: http://cache.wodcloud.com
access_key:
from_secret: ACCESS_KEY_MINIO
secret_key:
from_secret: SECRET_KEY_MINIO
- name: build # 项目打包
image: registry.cn-qingdao.aliyuncs.com/wod/devops-node:16.16.0-slim
# 将宿主机中文件夹挂载到容器中,宿主机文件夹中的文件会被容器访问并修改,起到使用缓存的作用,避免每次运行都要重现下载依赖,提高运行速度
commands:
# - yarn
- export NODE_ENV=production
- yarn build
# - name: s3-cache-build
# image: registry.cn-qingdao.aliyuncs.com/wod/devops-s3-cache:1.0
# network_mode: host
# settings:
# rebuild: true
# hash: package.json
# mount:
# - node_modules
# endpoint: http://cache.wodcloud.com
# access_key:
# from_secret: ACCESS_KEY_MINIO
# secret_key:
# from_secret: SECRET_KEY_MINIO
- name: docker
image: registry.cn-qingdao.aliyuncs.com/wod/devops-docker:1.0
# 将宿主机的 docker和配置挂载到运行的 docker 容器中,那么在容器中运行 docker 命令时,等同于在宿主机中运行该docker命令
volumes:
- name: docker-sock
path: /var/run/docker.sock # 将下载依赖的目录挂载出来,防止重复下载
settings: # 当前设置
base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5 # 基础镜像,根据项目需求进行使用,如果第三方登录改成ui-base
dockerfile: .beagle/dockerfile
repo: wod/apaas-system-ui # 生成镜像的 分组/名称
version: "5.0.1" # 版本号
channel: alpha # 后缀 example: alpha test fix-alpha fix等
args: "TARGETOS=linux,TARGETARCH=amd64" # 不同架构的构建参数
registry: registry.cn-qingdao.aliyuncs.com # 私有仓库地址
registry_user: # 用户
from_secret: REGISTRY_USER_ALIYUN
registry_password: # 密码
from_secret: REGISTRY_PASSWORD_ALIYUN
- name: deploy-cloud
image: registry.cn-qingdao.aliyuncs.com/wod/devops-kubernetes:1.0
settings:
namespace: apaas-v5
deployment: apaas-system-ui
container: apaas-system-ui
image: registry.cn-qingdao.aliyuncs.com/wod/apaas-ui:5.0.1-alpha
environment:
KUBERNETES_SERVER:
from_secret: KUBERNETES_SERVER
KUBERNETES_TOKEN:
from_secret: KUBERNETES_TOKEN
- name: docker-arm64
image: registry.cn-qingdao.aliyuncs.com/wod/devops-docker:1.0
volumes:
- name: docker-sock
path: /var/run/docker.sock
settings:
base: registry.cn-qingdao.aliyuncs.com/wod/nginx:1.19.5-arm64
dockerfile: .beagle/dockerfile
repo: wod/apaas-system-ui
version: "5.0.1"
channel: alpha-arm64
args: "TARGETOS=linux,TARGETARCH=arm64"
registry: registry.cn-qingdao.aliyuncs.com
registry_user:
from_secret: REGISTRY_USER_ALIYUN
registry_password:
from_secret: REGISTRY_PASSWORD_ALIYUN
---
clone:
disable: true
trigger:
branch:
- master
volumes:
- name: docker-sock
host:
path: /var/run/docker.sock
kind: pipeline
name: master
steps:
- name: harbor
image: registry.cn-qingdao.aliyuncs.com/wod/devops-docker-tag:1.0
volumes:
- name: docker-sock
path: /var/run/docker.sock
pull: always
environment:
http_proxy: http://10.11.92.33:1282
https_proxy: http://10.11.92.33:1282
REGISTRY_USER:
from_secret: REGISTRY_USER_ALIYUN
REGISTRY_PASSWORD:
from_secret: REGISTRY_PASSWORD_ALIYUN
settings:
source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.1-alpha
target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.1
registry: registry.cn-qingdao.aliyuncs.com
- name: harbor-arm64
image: registry.cn-qingdao.aliyuncs.com/wod/devops-docker-tag:1.0
volumes:
- name: docker-sock
path: /var/run/docker.sock
pull: always
environment:
http_proxy: http://10.11.92.33:1282
https_proxy: http://10.11.92.33:1282
REGISTRY_USER:
from_secret: REGISTRY_USER_ALIYUN
REGISTRY_PASSWORD:
from_secret: REGISTRY_PASSWORD_ALIYUN
settings:
source: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.1-alpha-arm64
target: registry.cn-qingdao.aliyuncs.com/wod/apaas-system-ui:5.0.1-arm64
registry: registry.cn-qingdao.aliyuncs.com
##--------------对于需要保密的信息隐藏,减少账户信息的泄密⬇-----------------##
---
kind: secret
name: REGISTRY_USER
get:
name: REGISTRY_USER
path: devops-secrets
---
kind: secret
name: REGISTRY_PASSWORD
get:
name: REGISTRY_PASSWORD
path: devops-secrets
---
kind: secret
name: KUBERNETES_SERVER
get:
name: KUBERNETES_SERVER
path: devops-secrets
---
kind: secret
name: KUBERNETES_TOKEN
get:
name: KUBERNETES_TOKEN
path: devops-secrets
---
kind: secret
name: ACCESS_KEY_MINIO
get:
name: ACCESS_KEY
path: devops-secrets
---
kind: secret
name: SECRET_KEY_MINIO
get:
name: SECRET_KEY
path: devops-secrets
---
kind: secret
name: REGISTRY_USER_ALIYUN
get:
name: USERNAME
path: devops-registry-aliyun
---
kind: secret
name: REGISTRY_PASSWORD_ALIYUN
get:
name: PASSWORD
path: devops-registry-aliyun
\ No newline at end of file
ARG BASE
FROM $BASE
ARG AUTHOR
ARG VERSION
LABEL maintainer=${AUTHOR} version=${VERSION}
ADD ./dist /usr/share/nginx/html
ADD ./.beagle/nginx.conf /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 8080;
listen [::]:8080;
server_name localhost;
absolute_redirect off; #取消绝对路径的重定向
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location /apaas/ui {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /apaas/ui/index.html;
}
}
# 开启gzip
gzip off;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间,后面会有详细说明
gzip_comp_level 6;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
# 由于jpg,jpeg,png本来就是压缩格式,再行压缩只会消耗cpu资源,帮助并不大
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/gif;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
#压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_http_version 1.0;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
\ No newline at end of file
node_modules
.DS_Store
.vscode
dist
dist-ssr
*.local
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>apaas5</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
<style>
html, body{
width: 100%;
height: 100%;
background-color: #eef0f5;
margin: 0;
}
div,p,span{
box-sizing: border-box;
}
</style>
{
"name": "apaas-ui",
"version": "0.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"version": "0.0.0",
"dependencies": {
"@element-plus/icons-vue": "^2.0.6",
"axios": "^0.21.1",
"echarts": "^5.3.3",
"element-plus": "^2.2.9",
"sass": "^1.35.1",
"vue": "^3.2.31",
"vue-i18n": "^9.1.7",
"vue-router": "^4.0.10",
"vuex": "^4.0.2"
},
"devDependencies": {
"@vitejs/plugin-vue": "^3.0.0",
"@vue/compiler-sfc": "^3.2.31",
"vite": "^3.0.0"
}
},
"node_modules/@babel/parser": {
"version": "7.18.9",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.9.tgz",
"integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==",
"license": "MIT",
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@ctrl/tinycolor": {
"version": "3.4.1",
"resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz",
"integrity": "sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/@element-plus/icons-vue": {
"version": "2.0.6",
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.6.tgz",
"integrity": "sha512-lPpG8hYkjL/Z97DH5Ei6w6o22Z4YdNglWCNYOPcB33JCF2A4wye6HFgSI7hEt9zdLyxlSpiqtgf9XcYU+m5mew==",
"license": "MIT",
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/@floating-ui/core": {
"version": "0.7.3",
"resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-0.7.3.tgz",
"integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==",
"license": "MIT"
},
"node_modules/@floating-ui/dom": {
"version": "0.5.4",
"resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-0.5.4.tgz",
"integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^0.7.3"
}
},
"node_modules/@intlify/core-base": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.1.10.tgz",
"integrity": "sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==",
"license": "MIT",
"dependencies": {
"@intlify/devtools-if": "9.1.10",
"@intlify/message-compiler": "9.1.10",
"@intlify/message-resolver": "9.1.10",
"@intlify/runtime": "9.1.10",
"@intlify/shared": "9.1.10",
"@intlify/vue-devtools": "9.1.10"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/@intlify/devtools-if": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.1.10.tgz",
"integrity": "sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==",
"license": "MIT",
"dependencies": {
"@intlify/shared": "9.1.10"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/@intlify/message-compiler": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.1.10.tgz",
"integrity": "sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==",
"license": "MIT",
"dependencies": {
"@intlify/message-resolver": "9.1.10",
"@intlify/shared": "9.1.10",
"source-map": "0.6.1"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/@intlify/message-resolver": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/message-resolver/-/message-resolver-9.1.10.tgz",
"integrity": "sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==",
"license": "MIT",
"engines": {
"node": ">= 10"
}
},
"node_modules/@intlify/runtime": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/runtime/-/runtime-9.1.10.tgz",
"integrity": "sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==",
"license": "MIT",
"dependencies": {
"@intlify/message-compiler": "9.1.10",
"@intlify/message-resolver": "9.1.10",
"@intlify/shared": "9.1.10"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/@intlify/shared": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.1.10.tgz",
"integrity": "sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==",
"license": "MIT",
"engines": {
"node": ">= 10"
}
},
"node_modules/@intlify/vue-devtools": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.1.10.tgz",
"integrity": "sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==",
"license": "MIT",
"dependencies": {
"@intlify/message-resolver": "9.1.10",
"@intlify/runtime": "9.1.10",
"@intlify/shared": "9.1.10"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/@popperjs/core": {
"name": "@sxzz/popperjs-es",
"version": "2.11.7",
"resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@types/lodash": {
"version": "4.14.182",
"resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.182.tgz",
"integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==",
"license": "MIT"
},
"node_modules/@types/lodash-es": {
"version": "4.17.6",
"resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz",
"integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
"license": "MIT",
"dependencies": {
"@types/lodash": "*"
}
},
"node_modules/@types/web-bluetooth": {
"version": "0.0.14",
"resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz",
"integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==",
"license": "MIT"
},
"node_modules/@vitejs/plugin-vue": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.0.1.tgz",
"integrity": "sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"peerDependencies": {
"vite": "^3.0.0",
"vue": "^3.2.25"
}
},
"node_modules/@vue/compiler-core": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
"integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/shared": "3.2.37",
"estree-walker": "^2.0.2",
"source-map": "^0.6.1"
}
},
"node_modules/@vue/compiler-dom": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
"integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
"license": "MIT",
"dependencies": {
"@vue/compiler-core": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"node_modules/@vue/compiler-sfc": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
"integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.37",
"@vue/compiler-dom": "3.2.37",
"@vue/compiler-ssr": "3.2.37",
"@vue/reactivity-transform": "3.2.37",
"@vue/shared": "3.2.37",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7",
"postcss": "^8.1.10",
"source-map": "^0.6.1"
}
},
"node_modules/@vue/compiler-ssr": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
"integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"node_modules/@vue/devtools-api": {
"version": "6.2.1",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
"integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==",
"license": "MIT"
},
"node_modules/@vue/reactivity": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.37.tgz",
"integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
"license": "MIT",
"dependencies": {
"@vue/shared": "3.2.37"
}
},
"node_modules/@vue/reactivity-transform": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
"integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.37",
"@vue/shared": "3.2.37",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7"
}
},
"node_modules/@vue/runtime-core": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
"integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"node_modules/@vue/runtime-dom": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
"integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
"license": "MIT",
"dependencies": {
"@vue/runtime-core": "3.2.37",
"@vue/shared": "3.2.37",
"csstype": "^2.6.8"
}
},
"node_modules/@vue/server-renderer": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.37.tgz",
"integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==",
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.2.37",
"@vue/shared": "3.2.37"
},
"peerDependencies": {
"vue": "3.2.37"
}
},
"node_modules/@vue/shared": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.37.tgz",
"integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==",
"license": "MIT"
},
"node_modules/@vueuse/core": {
"version": "8.9.4",
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-8.9.4.tgz",
"integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==",
"license": "MIT",
"dependencies": {
"@types/web-bluetooth": "^0.0.14",
"@vueuse/metadata": "8.9.4",
"@vueuse/shared": "8.9.4",
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.1.0",
"vue": "^2.6.0 || ^3.2.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
},
"vue": {
"optional": true
}
}
},
"node_modules/@vueuse/metadata": {
"version": "8.9.4",
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-8.9.4.tgz",
"integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared": {
"version": "8.9.4",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-8.9.4.tgz",
"integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==",
"license": "MIT",
"dependencies": {
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.1.0",
"vue": "^2.6.0 || ^3.2.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
},
"vue": {
"optional": true
}
}
},
"node_modules/anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/async-validator": {
"version": "4.2.5",
"resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
"license": "MIT"
},
"node_modules/axios": {
"version": "0.21.4",
"resolved": "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz",
"integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.14.0"
}
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/braces": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"license": "MIT",
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/csstype": {
"version": "2.6.20",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz",
"integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==",
"license": "MIT"
},
"node_modules/dayjs": {
"version": "1.11.4",
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.4.tgz",
"integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==",
"license": "MIT"
},
"node_modules/echarts": {
"version": "5.3.3",
"resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.3.3.tgz",
"integrity": "sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "2.3.0",
"zrender": "5.3.2"
}
},
"node_modules/element-plus": {
"version": "2.2.9",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.9.tgz",
"integrity": "sha512-jYbL0JkCdv95rkT6trZJjCAizLPySa0qcd2cgq+57SKQnCZAcNDDq4GbTuFRnNavdoeCJnuM3HIficTIUpsMOQ==",
"license": "MIT",
"dependencies": {
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.0.6",
"@floating-ui/dom": "^0.5.4",
"@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
"@types/lodash": "^4.14.182",
"@types/lodash-es": "^4.17.6",
"@vueuse/core": "^8.7.5",
"async-validator": "^4.2.5",
"dayjs": "^1.11.3",
"escape-html": "^1.0.3",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"lodash-unified": "^1.0.2",
"memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.1.2"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/esbuild": {
"version": "0.14.49",
"resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.49.tgz",
"integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=12"
},
"optionalDependencies": {
"esbuild-android-64": "0.14.49",
"esbuild-android-arm64": "0.14.49",
"esbuild-darwin-64": "0.14.49",
"esbuild-darwin-arm64": "0.14.49",
"esbuild-freebsd-64": "0.14.49",
"esbuild-freebsd-arm64": "0.14.49",
"esbuild-linux-32": "0.14.49",
"esbuild-linux-64": "0.14.49",
"esbuild-linux-arm": "0.14.49",
"esbuild-linux-arm64": "0.14.49",
"esbuild-linux-mips64le": "0.14.49",
"esbuild-linux-ppc64le": "0.14.49",
"esbuild-linux-riscv64": "0.14.49",
"esbuild-linux-s390x": "0.14.49",
"esbuild-netbsd-64": "0.14.49",
"esbuild-openbsd-64": "0.14.49",
"esbuild-sunos-64": "0.14.49",
"esbuild-windows-32": "0.14.49",
"esbuild-windows-64": "0.14.49",
"esbuild-windows-arm64": "0.14.49"
}
},
"node_modules/esbuild-windows-64": {
"version": "0.14.49",
"resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz",
"integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"license": "MIT"
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
"node_modules/fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/follow-redirects": {
"version": "1.15.1",
"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true,
"license": "MIT"
},
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/immutable": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz",
"integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
"license": "MIT"
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-core-module": {
"version": "2.9.0",
"resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz",
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
"dev": true,
"license": "MIT",
"dependencies": {
"has": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
"license": "MIT"
},
"node_modules/lodash-unified": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.2.tgz",
"integrity": "sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==",
"license": "MIT",
"peerDependencies": {
"@types/lodash-es": "*",
"lodash": "*",
"lodash-es": "*"
}
},
"node_modules/magic-string": {
"version": "0.25.9",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
"license": "MIT",
"dependencies": {
"sourcemap-codec": "^1.4.8"
}
},
"node_modules/memoize-one": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
"license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
"license": "BSD-3-Clause"
},
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true,
"license": "MIT"
},
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
"license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/postcss": {
"version": "8.4.14",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.14.tgz",
"integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/rollup": {
"version": "2.77.0",
"resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.77.0.tgz",
"integrity": "sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==",
"dev": true,
"license": "MIT",
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=10.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/sass": {
"version": "1.53.0",
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.53.0.tgz",
"integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==",
"license": "MIT",
"dependencies": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
"source-map-js": ">=0.6.2 <2.0.0"
},
"bin": {
"sass": "sass.js"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"license": "MIT"
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
"license": "0BSD"
},
"node_modules/vite": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/vite/-/vite-3.0.2.tgz",
"integrity": "sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.14.47",
"postcss": "^8.4.14",
"resolve": "^1.22.1",
"rollup": "^2.75.6"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
"node": "^14.18.0 || >=16.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
},
"peerDependencies": {
"less": "*",
"sass": "*",
"stylus": "*",
"terser": "^5.4.0"
},
"peerDependenciesMeta": {
"less": {
"optional": true
},
"sass": {
"optional": true
},
"stylus": {
"optional": true
},
"terser": {
"optional": true
}
}
},
"node_modules/vue": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.37.tgz",
"integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==",
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.2.37",
"@vue/compiler-sfc": "3.2.37",
"@vue/runtime-dom": "3.2.37",
"@vue/server-renderer": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"node_modules/vue-demi": {
"version": "0.13.5",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.5.tgz",
"integrity": "sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/vue-i18n": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.1.10.tgz",
"integrity": "sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==",
"license": "MIT",
"dependencies": {
"@intlify/core-base": "9.1.10",
"@intlify/shared": "9.1.10",
"@intlify/vue-devtools": "9.1.10",
"@vue/devtools-api": "^6.0.0-beta.7"
},
"engines": {
"node": ">= 10"
},
"peerDependencies": {
"vue": "^3.0.0"
}
},
"node_modules/vue-router": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.2.tgz",
"integrity": "sha512-5BP1qXFncVRwgV/XnqzsKApdMjQPqWIpoUBdL1ynz8HyLxIX/UDAx7Ql2BjmA5CXT/p61JfZvkpiFWFpaqcfag==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.1.4"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/vuex": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.0.2.tgz",
"integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.0.0-beta.11"
},
"peerDependencies": {
"vue": "^3.0.2"
}
},
"node_modules/zrender": {
"version": "5.3.2",
"resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz",
"integrity": "sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==",
"license": "BSD-3-Clause",
"dependencies": {
"tslib": "2.3.0"
}
}
},
"dependencies": {
"@babel/parser": {
"version": "7.18.9",
"resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.9.tgz",
"integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg=="
},
"@ctrl/tinycolor": {
"version": "3.4.1",
"resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz",
"integrity": "sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw=="
},
"@element-plus/icons-vue": {
"version": "2.0.6",
"resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.6.tgz",
"integrity": "sha512-lPpG8hYkjL/Z97DH5Ei6w6o22Z4YdNglWCNYOPcB33JCF2A4wye6HFgSI7hEt9zdLyxlSpiqtgf9XcYU+m5mew==",
"requires": {}
},
"@floating-ui/core": {
"version": "0.7.3",
"resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-0.7.3.tgz",
"integrity": "sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg=="
},
"@floating-ui/dom": {
"version": "0.5.4",
"resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-0.5.4.tgz",
"integrity": "sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==",
"requires": {
"@floating-ui/core": "^0.7.3"
}
},
"@intlify/core-base": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.1.10.tgz",
"integrity": "sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==",
"requires": {
"@intlify/devtools-if": "9.1.10",
"@intlify/message-compiler": "9.1.10",
"@intlify/message-resolver": "9.1.10",
"@intlify/runtime": "9.1.10",
"@intlify/shared": "9.1.10",
"@intlify/vue-devtools": "9.1.10"
}
},
"@intlify/devtools-if": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.1.10.tgz",
"integrity": "sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==",
"requires": {
"@intlify/shared": "9.1.10"
}
},
"@intlify/message-compiler": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.1.10.tgz",
"integrity": "sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==",
"requires": {
"@intlify/message-resolver": "9.1.10",
"@intlify/shared": "9.1.10",
"source-map": "0.6.1"
}
},
"@intlify/message-resolver": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/message-resolver/-/message-resolver-9.1.10.tgz",
"integrity": "sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w=="
},
"@intlify/runtime": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/runtime/-/runtime-9.1.10.tgz",
"integrity": "sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==",
"requires": {
"@intlify/message-compiler": "9.1.10",
"@intlify/message-resolver": "9.1.10",
"@intlify/shared": "9.1.10"
}
},
"@intlify/shared": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.1.10.tgz",
"integrity": "sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA=="
},
"@intlify/vue-devtools": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.1.10.tgz",
"integrity": "sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==",
"requires": {
"@intlify/message-resolver": "9.1.10",
"@intlify/runtime": "9.1.10",
"@intlify/shared": "9.1.10"
}
},
"@popperjs/core": {
"version": "npm:@sxzz/popperjs-es@2.11.7",
"resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
},
"@types/lodash": {
"version": "4.14.182",
"resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.182.tgz",
"integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q=="
},
"@types/lodash-es": {
"version": "4.17.6",
"resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz",
"integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
"requires": {
"@types/lodash": "*"
}
},
"@types/web-bluetooth": {
"version": "0.0.14",
"resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz",
"integrity": "sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A=="
},
"@vitejs/plugin-vue": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.0.1.tgz",
"integrity": "sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==",
"dev": true,
"requires": {}
},
"@vue/compiler-core": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.37.tgz",
"integrity": "sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==",
"requires": {
"@babel/parser": "^7.16.4",
"@vue/shared": "3.2.37",
"estree-walker": "^2.0.2",
"source-map": "^0.6.1"
}
},
"@vue/compiler-dom": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz",
"integrity": "sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==",
"requires": {
"@vue/compiler-core": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"@vue/compiler-sfc": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz",
"integrity": "sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==",
"requires": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.37",
"@vue/compiler-dom": "3.2.37",
"@vue/compiler-ssr": "3.2.37",
"@vue/reactivity-transform": "3.2.37",
"@vue/shared": "3.2.37",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7",
"postcss": "^8.1.10",
"source-map": "^0.6.1"
}
},
"@vue/compiler-ssr": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz",
"integrity": "sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==",
"requires": {
"@vue/compiler-dom": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"@vue/devtools-api": {
"version": "6.2.1",
"resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz",
"integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ=="
},
"@vue/reactivity": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.37.tgz",
"integrity": "sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==",
"requires": {
"@vue/shared": "3.2.37"
}
},
"@vue/reactivity-transform": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz",
"integrity": "sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==",
"requires": {
"@babel/parser": "^7.16.4",
"@vue/compiler-core": "3.2.37",
"@vue/shared": "3.2.37",
"estree-walker": "^2.0.2",
"magic-string": "^0.25.7"
}
},
"@vue/runtime-core": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.37.tgz",
"integrity": "sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==",
"requires": {
"@vue/reactivity": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"@vue/runtime-dom": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz",
"integrity": "sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==",
"requires": {
"@vue/runtime-core": "3.2.37",
"@vue/shared": "3.2.37",
"csstype": "^2.6.8"
}
},
"@vue/server-renderer": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.37.tgz",
"integrity": "sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==",
"requires": {
"@vue/compiler-ssr": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"@vue/shared": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.37.tgz",
"integrity": "sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw=="
},
"@vueuse/core": {
"version": "8.9.4",
"resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-8.9.4.tgz",
"integrity": "sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==",
"requires": {
"@types/web-bluetooth": "^0.0.14",
"@vueuse/metadata": "8.9.4",
"@vueuse/shared": "8.9.4",
"vue-demi": "*"
}
},
"@vueuse/metadata": {
"version": "8.9.4",
"resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-8.9.4.tgz",
"integrity": "sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw=="
},
"@vueuse/shared": {
"version": "8.9.4",
"resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-8.9.4.tgz",
"integrity": "sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==",
"requires": {
"vue-demi": "*"
}
},
"anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"async-validator": {
"version": "4.2.5",
"resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
},
"axios": {
"version": "0.21.4",
"resolved": "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz",
"integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
"requires": {
"follow-redirects": "^1.14.0"
}
},
"binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
},
"braces": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"requires": {
"fill-range": "^7.0.1"
}
},
"chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz",
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
}
},
"csstype": {
"version": "2.6.20",
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz",
"integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA=="
},
"dayjs": {
"version": "1.11.4",
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.4.tgz",
"integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g=="
},
"echarts": {
"version": "5.3.3",
"resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.3.3.tgz",
"integrity": "sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==",
"requires": {
"tslib": "2.3.0",
"zrender": "5.3.2"
}
},
"element-plus": {
"version": "2.2.9",
"resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.9.tgz",
"integrity": "sha512-jYbL0JkCdv95rkT6trZJjCAizLPySa0qcd2cgq+57SKQnCZAcNDDq4GbTuFRnNavdoeCJnuM3HIficTIUpsMOQ==",
"requires": {
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.0.6",
"@floating-ui/dom": "^0.5.4",
"@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
"@types/lodash": "^4.14.182",
"@types/lodash-es": "^4.17.6",
"@vueuse/core": "^8.7.5",
"async-validator": "^4.2.5",
"dayjs": "^1.11.3",
"escape-html": "^1.0.3",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"lodash-unified": "^1.0.2",
"memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.1.2"
}
},
"esbuild": {
"version": "0.14.49",
"resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.49.tgz",
"integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==",
"dev": true,
"requires": {
"esbuild-android-64": "0.14.49",
"esbuild-android-arm64": "0.14.49",
"esbuild-darwin-64": "0.14.49",
"esbuild-darwin-arm64": "0.14.49",
"esbuild-freebsd-64": "0.14.49",
"esbuild-freebsd-arm64": "0.14.49",
"esbuild-linux-32": "0.14.49",
"esbuild-linux-64": "0.14.49",
"esbuild-linux-arm": "0.14.49",
"esbuild-linux-arm64": "0.14.49",
"esbuild-linux-mips64le": "0.14.49",
"esbuild-linux-ppc64le": "0.14.49",
"esbuild-linux-riscv64": "0.14.49",
"esbuild-linux-s390x": "0.14.49",
"esbuild-netbsd-64": "0.14.49",
"esbuild-openbsd-64": "0.14.49",
"esbuild-sunos-64": "0.14.49",
"esbuild-windows-32": "0.14.49",
"esbuild-windows-64": "0.14.49",
"esbuild-windows-arm64": "0.14.49"
}
},
"esbuild-windows-64": {
"version": "0.14.49",
"resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz",
"integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==",
"dev": true,
"optional": true
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
},
"fill-range": {
"version": "7.0.1",
"resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"requires": {
"to-regex-range": "^5.0.1"
}
},
"follow-redirects": {
"version": "1.15.1",
"resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"requires": {
"is-glob": "^4.0.1"
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
"immutable": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz",
"integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ=="
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-core-module": {
"version": "2.9.0",
"resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz",
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
"dev": true,
"requires": {
"has": "^1.0.3"
}
},
"is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
},
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"requires": {
"is-extglob": "^2.1.1"
}
},
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
},
"lodash-unified": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.2.tgz",
"integrity": "sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==",
"requires": {}
},
"magic-string": {
"version": "0.25.9",
"resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
"requires": {
"sourcemap-codec": "^1.4.8"
}
},
"memoize-one": {
"version": "6.0.0",
"resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
},
"nanoid": {
"version": "3.3.4",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
},
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
},
"normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
},
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
},
"picomatch": {
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
"postcss": {
"version": "8.4.14",
"resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.14.tgz",
"integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
"requires": {
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
}
},
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"requires": {
"picomatch": "^2.2.1"
}
},
"resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
"dev": true,
"requires": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
"rollup": {
"version": "2.77.0",
"resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.77.0.tgz",
"integrity": "sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==",
"dev": true,
"requires": {
"fsevents": "~2.3.2"
}
},
"sass": {
"version": "1.53.0",
"resolved": "https://registry.npmmirror.com/sass/-/sass-1.53.0.tgz",
"integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==",
"requires": {
"chokidar": ">=3.0.0 <4.0.0",
"immutable": "^4.0.0",
"source-map-js": ">=0.6.2 <2.0.0"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"source-map-js": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
},
"sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
},
"supports-preserve-symlinks-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
"dev": true
},
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"requires": {
"is-number": "^7.0.0"
}
},
"tslib": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
},
"vite": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/vite/-/vite-3.0.2.tgz",
"integrity": "sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==",
"dev": true,
"requires": {
"esbuild": "^0.14.47",
"fsevents": "~2.3.2",
"postcss": "^8.4.14",
"resolve": "^1.22.1",
"rollup": "^2.75.6"
}
},
"vue": {
"version": "3.2.37",
"resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.37.tgz",
"integrity": "sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==",
"requires": {
"@vue/compiler-dom": "3.2.37",
"@vue/compiler-sfc": "3.2.37",
"@vue/runtime-dom": "3.2.37",
"@vue/server-renderer": "3.2.37",
"@vue/shared": "3.2.37"
}
},
"vue-demi": {
"version": "0.13.5",
"resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.5.tgz",
"integrity": "sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==",
"requires": {}
},
"vue-i18n": {
"version": "9.1.10",
"resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.1.10.tgz",
"integrity": "sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==",
"requires": {
"@intlify/core-base": "9.1.10",
"@intlify/shared": "9.1.10",
"@intlify/vue-devtools": "9.1.10",
"@vue/devtools-api": "^6.0.0-beta.7"
}
},
"vue-router": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.2.tgz",
"integrity": "sha512-5BP1qXFncVRwgV/XnqzsKApdMjQPqWIpoUBdL1ynz8HyLxIX/UDAx7Ql2BjmA5CXT/p61JfZvkpiFWFpaqcfag==",
"requires": {
"@vue/devtools-api": "^6.1.4"
}
},
"vuex": {
"version": "4.0.2",
"resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.0.2.tgz",
"integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==",
"requires": {
"@vue/devtools-api": "^6.0.0-beta.11"
}
},
"zrender": {
"version": "5.3.2",
"resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz",
"integrity": "sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==",
"requires": {
"tslib": "2.3.0"
}
}
}
}
{
"version": "1.0.0",
"scripts": {
"dev": "vite",
"build": "vite build",
"serve": "vite preview"
},
"dependencies": {
"@element-plus/icons-vue": "^2.0.6",
"@wangeditor/editor": "^5.1.14",
"@wangeditor/editor-for-vue": "^5.1.12",
"ace-builds": "^1.9.6",
"axios": "^0.21.1",
"clipboard": "^2.0.11",
"echarts": "^5.3.3",
"element-plus": "^2.2.9",
"html2canvas": "^1.4.1",
"sass": "^1.35.1",
"uuid": "^8.3.2",
"vue": "^3.2.31",
"vue-i18n": "^9.1.7",
"vue-router": "^4.0.10",
"vue3-ace-editor": "^2.2.2",
"vuex": "^4.0.2"
},
"devDependencies": {
"@vitejs/plugin-vue": "^3.0.0",
"@vue/compiler-sfc": "^3.2.31",
"vite": "^3.0.0"
}
}
<template>
<div id="app">
<el-config-provider>
<bg-menu :path="nowParent.path" v-if="menuShow"></bg-menu>
<div class="container" :class="menuShow ? '' : 'full_screen'" v-if="pageShow">
<bg-nav :highlightParentRule="highlightParentRule" :title="nowParent.menuName" width="208px" :list="nowParent.children" v-show="navShow" class="con-nav" />
<div class="bg-main view">
<router-view />
</div>
</div>
<div class="container" v-else-if="$route.path=='/login'">
<div class="bg-main view">
<login></login>
</div>
</div>
<div class="container" v-else-if="$route.path=='/404'">
<div class="bg-main view">
<page404></page404>
</div>
</div>
</el-config-provider>
</div>
</template>
<script>
import bgMenu from '@/components/bg-menu.vue'
import login from '@/page/login/index.vue'
import page404 from '@/page/404.vue'
export default {
components:{
bgMenu,
login,
page404,
},
computed:{
msgBoxFlag(){
return this.$store.state.msgBoxFlag
},
userInfo() {
return this.$store.state.userInfo || {};
},
navMenu(){
return this.$store.state.menu
},
menuObj(){
return this.$store.state.menuObj
},
navShow(){
return false||!['/','/404','/login'].includes(this.$route.path)
},
pageShow(){
return false||!['/404','/login'].includes(this.$route.path)
},
rowPath(){
if(this.pageShow&&this.$store.state.userInfo){
return this.menuObj[this.$route.path].rowPath
}else{
return ''
}
},
nowParent(){
if(this.pageShow&&this.$store.state.userInfo){
// return this.navMenu[this.rowPath.slice(1,4)]
// return this.pathToData(this.navMenu,this.rowPath)
return this.navMenu[1]
}else{
return ''
}
},
menuShow() {
return false||!["/ui-example"].includes(this.$route.path)
}
},
watch:{
msgBoxFlag(n,o){
this.readFlag = !this.readFlag
}
},
data(){
return{
readFlag:false,
menuIndex:'',
}
},
created(){
},
methods:{
pathToData(data,path){
let arr = path.split('.')
let temp = null
let tempName = ''
let tempPath = ''
arr.forEach((e,idx) => {
if(idx==1){
temp = data[e]
tempName = data[e].menuName
tempPath = data[e].path
data = data[e]
}
if(idx==2){
if(data.children&&data.children.length){
temp = data.children[e]
data = data.children[e]
}
}
});
return {
menuName:tempName,
path:tempPath,
children:[temp]
}
},
highlightParentRule(pathArr){
return pathArr.includes(this.$route.path)
},
ada(){
console.log(12312);
}
}
}
</script>
<style>
#app{
height: 100%;
}
.container{
width: 100%;
height: calc(100% - 56px);
overflow: hidden;
}
.full_screen {
height: 100%;
}
.full_screen .bg-main {
overflow-x: hidden;
}
.con-nav{
float: left;
}
.view{
height: 100%;
overflow-y: auto;
background-color: #ebedf2;
}
</style>
:root {
--font-color: #404a62;
/* --el-color-primary-light-9: #f7f7f9; */
--el-color-white: #ffffff;
--el-color-black: #1a1a1a;
--el-color-primary: #2b4695;
--el-color-primary-light-3: #6b7eb5;
--el-color-primary-light-5: #95a3ca;
--el-color-primary-light-7: #c0c8df;
--el-color-primary-light-8: #d5daea;
--el-color-primary-light-9: #eaedf5;
--el-color-primary-dark-2: #223877;
--el-color-success: #429e8a;
--el-color-success-light-3: #7bbbad;
--el-color-success-light-5: #a1cfc5;
--el-color-success-light-7: #c7e2dc;
--el-color-success-light-8: #e1f3d8;
--el-color-success-light-9: #ecf5f4;
--el-color-success-dark-2: #357e6e;
--el-color-warning: #e56600;
--el-color-warning-light-3: #ed944d;
--el-color-warning-light-5: #f2b380;
--el-color-warning-light-7: #f7d1b3;
--el-color-warning-light-8: #fae0cc;
--el-color-warning-light-9: #fcf0e6;
--el-color-warning-dark-2: #b75200;
--el-color-danger: #d75138;
--el-color-danger-light-3: #e38674;
--el-color-danger-light-5: #eba89c;
--el-color-danger-light-7: #f3cbc4;
--el-color-danger-light-8: #f7dcd7;
--el-color-danger-light-9: #fbeeeb;
--el-color-danger-dark-2: #ac412d;
--el-color-error: #d75138;
--el-color-error-light-3: #e38674;
--el-color-error-light-5: #eba89c;
--el-color-error-light-7: #f3cbc4;
--el-color-error-light-8: #f7dcd7;
--el-color-error-light-9: #fbeeeb;
--el-color-error-dark-2: #ac412d;
--el-color-info: #404a62;
--el-color-info-light-3: #7a8191;
--el-color-info-light-5: #a0a5b1;
--el-color-info-light-7: #c6c9d0;
--el-color-info-light-8: #d9dbe0;
--el-color-info-light-9: #ecedf0;
--el-color-info-dark-2: #333b4e;
--el-bg-color: #ffffff;
--el-bg-color-page: #f2f3f5;
--el-bg-color-overlay: #ffffff;
--el-text-color-primary: #202531;
--el-text-color-regular: #404a62;
--el-text-color-secondary: #909bb6;
--el-text-color-placeholder: #a9b1c7;
--el-text-color-disabled: #a9b1c7;
--el-border-color: #dadee7;
--el-border-color-light: #e3e5eb;
--el-border-color-lighter: #e6e9ef;
--el-border-color-extra-light: #edf0f5;
--el-border-color-dark: #d1d5de;
--el-border-color-darker: #cbced7;
--el-fill-color: #f0f2f5;
--el-fill-color-light: #f5f7fa;
--el-fill-color-lighter: #fafafa;
--el-fill-color-extra-light: #fafcff;
--el-fill-color-dark: #ebedf0;
--el-fill-color-darker: #e6e8eb;
--el-fill-color-blank: #ffffff;
}
[v-cloak] {
display: none;
}
/* 新增按钮颜色 */
.form-group .el-button--primary {
background-color: #264dd9 !important;
border-color: #264dd9 !important;
}
/* 返回按钮颜色 */
.from_return>.el-button--primary {
background-color: #edf0ff !important;
border-color: #edf0ff !important;
color: #264dd9 !important;
}
/* 取消按钮颜色 */
.form_c {
background-color: #dde4ff !important;
border-color: #dde4ff !important;
color: #264dd9 !important;
}
/* 确定按钮颜色 */
.form_t {
background-color: #264dd9 !important;
border-color: #264dd9 !important;
color: #f4f7fc !important;
}
/* 搜索框颜色 */
.form-group .el-input__inner {
border-radius: 28px !important;
border: 1px solid #bcc1d0 !important;
background: #f4f7fc !important;
color: #8890a7 !important;
}
.drawer_return .el-input__inner {
border-radius: 28px !important;
border: 1px solid #bcc1d0 !important;
background: #f4f7fc !important;
color: #8890a7 !important;
}
/* 多行文本框样式 */
.jbxx_desc textarea {
height: 150px !important;
border-radius: 8px !important;
border-color: #bcc1d0 !important;
outline: none !important;
resize: none !important;
}
/* 面包屑文字大小 */
.el-breadcrumb {
font-size: 14px;
color: #898d9e;
}
/* 编辑颜色*/
.primary-edit {
color: #264dd9;
cursor: pointer;
}
/* 删除颜色 */
.primary-del {
color: #264dd9;
cursor: pointer;
}
.space_bet {}
/* reset */
html {}
html,body {
margin: 0;
font-family: Microsoft YaHei, sans-serif;
/* font-size: 17px; */
}
ul {
list-style: none;
padding: 0;
margin: 0;
}
p {
margin: 0;
}
h1,
h2,
h3,
h4,
h5 {
margin: 0;
font-weight: normal;
}
h1{
font-size: 32px;
}
h2{
font-size: 24px;
}
h3{
font-size: 18.7px;
}
h4{
font-size: 16px;
}
div {
box-sizing: border-box;
}
/* reset end */
/* common */
/* #app {
height: 100%;
overflow: hidden;
} */
.text_clip {
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
white-space: nowrap;
}
.text_clip_2 {
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
line-clamp: 2;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.map_container {
background-color: #eee;
}
.ss_card {
padding: 1.2rem;
display: flex;
justify-content: flex-start;
align-items: flex-start;
}
.ss_card>.sc_left_container {
width: 6rem;
height: 6rem;
flex-shrink: 0;
border-radius: 0.5rem;
overflow: hidden;
font-size: 0;
}
.ss_card>.sc_right_container {
width: calc(100% - 7rem);
flex-grow: 1;
margin-left: 1.2rem;
}
.ss_card>.sc_right_container>.sc_title {
font-size: 1.6rem;
font-weight: bold;
line-height: 2.6rem;
}
.ss_card>.sc_right_container>.sc_info {
display: flex;
justify-content: space-between;
}
.form-group {
padding: 20px 20px 15px;
box-sizing: border-box;
border-bottom: 1px solid #edf0ff;
}
.padding_table {
padding: 0 20px;
}
/* 设置抽屉的样式 */
.el-drawer__header {
display: none;
}
.from_return {
text-align: center;
padding: 18px 20px 10px;
border-bottom: 1px solid #edf0ff;
position: relative;
}
.from_return>.el-button--primary {
position: absolute;
top: 15px;
left: 20px;
}
.from_return>span {
color: #1a2236;
font-size: 16px;
}
.demo-drawer__content .el-form-item__label {
color: #242c43;
}
.demo-drawer__content .el-input__inner {
border: 1px solid #bcc1d0;
border-radius: 17px;
color: #58617a;
background: #fff;
}
.demo-drawer__footer {
text-align: right;
padding-right: 40px;
margin-top: 40px;
}
.el-form-item__error {
font-size: 11px;
}
/* 设置提示弹窗的样式 */
.el-dialog {
border-radius: 6px;
margin-top: 240px;
}
.el-dialog__header {
border-bottom: 1px solid #edf0ff;
padding: 16px;
}
.el-dialog__title {
font-size: 18px;
font-weight: 700;
color: #1d1e20;
padding-left: 12px;
position: relative;
}
.el-dialog__title::before {
content: "";
position: absolute;
width: 4px;
height: 16px;
border-radius: 2px;
background-color: #515fe7;
left: 0;
top: 5px;
}
.el-dialog__headerbtn .el-dialog__close {
color: #8890a7;
}
.el-dialog__headerbtn:focus .el-dialog__close,
.el-dialog__headerbtn:hover .el-dialog__close {
color: #515fe7;
}
.el-dialog__body {
font-size: 18px;
color: #242c43;
text-align: center;
padding: 0 16px;
}
.dialog_box .el-dialog__body {
padding: 24px;
}
.dialog_box .el-dialog__footer {
padding: 16px;
}
.result_box .el-dialog__body {
padding: 0px;
}
.sold_up_dialog .el-dialog__body {
padding: 24px 24px 4px;
}
/* 设置tab切换的样式 */
.el-tabs__item.is-disabled {
color: #8890a7 !important;
}
.el-tabs__item {
font-size: 14px;
color: #404a62;
line-height: 14px !important;
}
/* .el-tabs__nav-scroll {
height: 35px;
} */
.el-tabs__nav-scroll .el-tabs__nav {
height: 40px;
}
.el-tabs__nav-scroll .el-tabs__item {
line-height: 14px !important;
height: 40px !important;
}
.el-tabs__item:hover {
color: #404a62;
}
.el-tabs__item.is-active {
color: #3759be !important;
}
.el-tabs__active-bar {
height: 3px;
border-radius: 1px;
background-color: #2b4695 !important;
}
.el-tabs__nav-wrap::after {
height: 1px;
background-color: #edf0ff;
}
/* 设置tree的样式 */
.el-tree-node__content{
height: 36px;
}
/* .usrrole .el-tree-node:focus>.el-tree-node__content{
background: rgb(248, 249, 253) !important;
}
.usrrole .el-tree-node__content:hover{
background: rgb(248, 249, 253) !important;
}
.usrrole .el-tree-node__content{
position: relative;
}
.usrrole .el-tree-node__expand-icon{
position: absolute;
right: 10px;
}
.usrrole .cdqx_ztree .el-tree{
color: #242c43;
border-radius:8px;
}
.usrrole .cdqx_ztree .el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner{
background-color: #264dd9;
border-color: #264dd9;
}
.usrrole .demo-drawer .el-drawer__body{
overflow-y: auto;
scrollbar-width: none;
-ms-overflow-style: none;
}
.usrrole .demo-drawer .el-drawer__body::-webkit-scrollbar{
display: none;
}
.usrrole .el-tree-node__expand-icon{
color: #264dd9!important;
}
.usrrole .el-tree-node.is-focusable>.el-tree-node__content{
border-radius:8px;
}
.usrrole .el-tree-node.is-expanded.is-focusable>.el-tree-node__content{
border-top-left-radius:8px;
border-top-right-radius:8px;
border-bottom-left-radius:0;
border-bottom-right-radius:0;
} */
/* 左右布局 */
.flex {
height: 100%;
display: -webkit-box;
/* Chrome 4+, Safari 3.1, iOS Safari 3.2+ */
display: -moz-box;
/* Firefox 17- */
display: -webkit-flex;
/* Chrome 21+, Safari 6.1+, iOS Safari 7+, Opera 15/16 */
display: -moz-flex;
/* Firefox 18+ */
display: -ms-flexbox;
/* IE 10 */
display: flex;
/* Chrome 29+, Firefox 22+, IE 11+, Opera 12.1/17/18, Android 4.4+ */
}
.flex-left {
width: 178px;
background-color: #1a2236;
height: 100%;
}
.flex-right {
padding: 0 20px 20px;
box-sizing: border-box;
-webkit-box-flex: auto;
-ms-flex: auto;
-webkit-flex: auto;
flex: 1;
overflow-y: auto;
}
.flex-right-box {
width: 100%;
height: 100%;
position: relative;
}
.ces-main {
position: absolute;
width: 100%;
}
.v-modal {
background: #000a2b !important;
}
.drawer600 {
width: 600px !important;
}
.drawer620 {
width: 620px !important;
}
.drawer1202 {
width: 1202px !important;
}
/* .el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,
.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before {
content: "";
} */
/* 设置switch的样式 */
.switchStyle1 .el-switch__label {
position: absolute;
display: none;
color: #fff;
}
/*打开时文字位置设置*/
.switchStyle1 .el-switch__label--right {
z-index: 1;
right: -10px;
top: 1px;
}
/*关闭时文字位置设置*/
.switchStyle1 .el-switch__label--left {
z-index: 1;
left: 28px;
top: 1px;
}
.switchStyle1 .el-switch__label.is-active {
display: block;
}
.switchStyle1.el-switch .el-switch__core,
.switchStyle1.el-switch .el-switch__label {
width: 62px !important;
height: 28px !important;
border-radius: 28px !important;
}
.switchStyle1 .el-switch__core {
background: #f8f9fd !important;
border: 1px solid #8890a7 !important;
}
.switchStyle1 .el-switch__core:after {
background: #8890a7 !important;
width: 22px;
height: 22px;
left: 2px;
top: 2.1px;
}
.switchStyle1.el-switch.is-checked .el-switch__core {
background: #f8f9fd !important;
border: 1px solid #5c82ff !important;
}
.switchStyle1.el-switch.is-checked .el-switch__core:after {
background: #5c82ff !important;
width: 22px;
height: 22px;
right: 0;
top: 2.1px;
}
.switchStyle1.el-switch.is-checked .el-switch__core::after {
margin-left: -25px;
}
.switchStyle1 .el-switch__label * {
font-size: 14px !important;
font-weight: 800;
}
.switchStyle1.el-switch .el-switch__label {
color: #8890a7 !important;
}
.switchStyle1.el-switch.is-checked .el-switch__label {
color: #5c82ff !important;
}
.switchStyle1.el-switch:hover {
opacity: 0.8;
}
/* 自定义图表提示框小三角 */
/* .div-tip-warp {
position: relative;
line-height: 22px;
padding: 3px 10px;
font-size: 12px;
}
.triangle-down {
width: 0;
height: 0;
border-left: 10px solid transparent;
border-right: 10px solid transparent;
border-top: 10px solid #242c43;
position: absolute;
bottom: -12px;
left: 50%;
transform: translate(-50%,0);
}
.triangle-position {
margin-left: 35px;
} */
.el-input__inner {
border-radius: 6px;
}
.el-input-group__append,
.el-input-group__prepend {
border-radius: 8px;
}
.el-button {
border-radius: 4px;
height: 36px;
line-height: 36px;
}
.el-select-dropdown {
z-index: 20000 !important;
}
/*
下拉选样式
此处勿删,apaasV3下拉选择样式统一用这个
*/
.el-select-dropdown {
border-radius: 8px;
}
.el-select-dropdown__empty {
color: #f4f7fc;
border-radius: 8px;
}
.el-select-dropdown__list {
padding: 0;
top: 10px;
border-radius: 4px;
}
.el-select-dropdown__item {
font-size: 12px;
padding: 0 20px;
height: 34px;
line-height: 34px;
}
.el-select-dropdown.is-multiple .el-select-dropdown__item.selected {
background-color: transparent;
color: #2b4695;
}
.el-scrollbar {
border-radius: 8px;
}
.el-popper[x-placement^="bottom"] .popper__arrow::after {
border-bottom-color: transparent;
}
.el-popper[x-placement^="top"] .popper__arrow::after {
border-top-color: transparent;
}
/* 单选激活样式 */
.el-radio__input .el-radio__inner {
border-color: #dadee7;
background-color: #fff;
width: 16px;
height: 16px;
}
.el-radio__input.is-checked .el-radio__inner {
border-color: #dadee7;
background-color: #fff;
}
.el-radio__input.is-checked+.el-radio__label {
color: #1a2236;
font-weight: 700;
}
.el-radio__inner::after {
width: 8px;
height: 8px;
}
.el-radio__input.is-checked .el-radio__inner::after {
background-color: #2b4695;
}
.el-radio__inner:hover {
border-color: #2b4695;
}
/* 面包屑样式 */
.bread_crumb {
margin: 20px;
font-size: 14px;
}
.bread_crumb .el-breadcrumb__inner {
color: #b4c0f5 !important;
}
.bread_crumb .is-link {
color: #626de9 !important;
}
.bread_crumb1 {
margin: 20px;
font-size: 14px;
}
.bread_crumb1 .el-breadcrumb__inner {
color: #242c43 !important;
}
.bread_crumb1 .is-link {
color: #898d9e !important;
}
/* 应用超市详情页公共样式 */
.sevice_detail {
max-width: 1340px;
padding-top: 1px;
margin: 0 auto;
}
/* common */
.apass_breadcrumb>.el-breadcrumb {
padding: 10px 0;
}
.apass_breadcrumb>.el-breadcrumb .el-breadcrumb__inner {
font-size: 14px;
font-weight: 400;
color: #898d9e;
line-height: 23px;
}
.apass_breadcrumb>.el-breadcrumb .el-breadcrumb__item:last-child .el-breadcrumb__inner {
color: #242c43;
font-weight: normal;
}
.apaas_button .el-button {
/* min-width: 90px; */
color: #404a62;
}
.apaas_button .el-button--mini,
.apaas_button .el-button--mini.is-round {
padding: 10px 15px;
}
.apaas_button .el-button--primary {
color: #fff;
background-color: #2b4695;
border-color: #2b4695;
}
.apaas_button .el-button--primary.is-plain {
color: #2b4695;
background-color: #e1e4fb;
border-color: #e1e4fb;
}
.apaas_button .el-button--danger {
color: #fff;
background-color: #ad3a4a;
border-color: #ad3a4a;
}
.apaas_button .el-button.is-disabled,
.apaas_button .el-button.is-disabled:focus,
.apaas_button .el-button.is-disabled:hover {
cursor: not-allowed;
}
.apaas_button .el-button--warning.is-plain {
background-color: #fcefd6;
border-color: #fac266;
color: #e56600;
}
.apaas_button .el-button--warning {
background-color: #e56600;
border-color: #e56600;
color: #fcefd6;
}
.apaas_button .el-button--success {
background-color: #429e8a;
border-color: #429e8a;
color: #fff;
}
.apaas_button .gray-button {
color: #fff;
background-color: #404a62;
border-color: #404a62;
}
.apaas_button .el-button.is-disabled,
.apaas_button .el-button.is-disabled:focus,
.apaas_button .el-button.is-disabled:hover {
color: #c0c4cc;
cursor: not-allowed;
background-image: none;
background-color: #fff;
border-color: #ebeef5;
}
.apass_table .el-table th>.cell {
color: #1a2236;
}
.apass_table .el-table td,
.apass_table .el-table th.is-leaf {
border: none !important;
line-height: 23px;
}
.apass_table .el-table::before {
display: none;
}
.apass_table .el-table {
width: 100%;
}
.apass_table .el-table__row:nth-child(odd) td {
background-color: #f7f7f9;
}
.apass_table .table_html a {
font-size: 14px;
color: #2b4695;
cursor: pointer;
}
.apass_table .row_action {
user-select: none;
}
.apass_table .row_action .btn {
font-size: 14px;
color: #3759be;
cursor: pointer;
}
.apass_table .row_action .btn.warn {
color: #830f53;
}
.apass_table .row_action .btn.disabled {
color: #999;
cursor: not-allowed;
}
.apass_table .row_action .disabled.hide {
opacity: 0;
cursor: auto;
}
.apass_table .row_action .interval_line {
font-size: 14px;
color: #c1c7d7;
margin: 0 20px;
}
.apass_table .border-active td {
padding: 10px 0;
background-color: #e6ebfe;
border-top: 2px solid #515fe7 !important;
border-bottom: 2px solid #515fe7 !important;
}
.apass_table .border-active td:first-child {
border-left: 2px solid #515fe7 !important;
}
.apass_table .border-active td:last-child {
border-right: 2px solid #515fe7 !important;
}
.apass_checkbox .el-checkbox__input.is-checked .el-checkbox__inner,
.apass_checkbox .el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #3759be;
border-color: #515fe7;
}
.apass_checkbox .el-checkbox__input.is-checked+.el-checkbox__label {
color: #58617a;
}
.apaas_scroll::-webkit-scrollbar {
width: 16px;
height: 1px;
}
.apaas_scroll::-webkit-scrollbar-thumb {
border-radius: 8px;
/* background: #dde4ff; */
box-shadow: 8px 0 0 #a5adb7 inset;
border: 4px solid rgba(0, 0, 0, 0);
}
.apaas_scroll::-webkit-scrollbar-track {
border-radius: 8px;
/* background: #f4f4f4; */
box-shadow: 8px 0 0 #f4f4f4 inset;
border: 4px solid rgba(0, 0, 0, 0);
}
.apaas_scroll_nor::-webkit-scrollbar {
width: 0px;
height: 0px;
}
.apaas_scroll_min::-webkit-scrollbar {
width: 6px;
height: 1px;
}
.apaas_scroll_min::-webkit-scrollbar-thumb {
border-radius: 3px;
background: #e6e9ef;
box-shadow: 8px 0 0 #e6e9ef inset;
border: 4px solid rgba(0, 0, 0, 0);
}
.apaas_scroll_min::-webkit-scrollbar-track {
border-radius: 3px;
background: #fff;
box-shadow: 8px 0 0 #fff inset;
border: 4px solid rgba(0, 0, 0, 0);
}
/* 详情页公共样式 by xuyiming */
.apaas_detail_container {
padding: 0 20px;
}
.apaas_detail_container .main_contaner {
min-height: calc(100vh - 32px - 83px);
flex-grow: 1;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
padding: 30px;
background-color: #fff;
border-radius: 10px;
margin-bottom: 14px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.apaas_detail_container .main_contaner.locked_height {
height: calc(100vh - 58px - 83px);
min-height: 400px;
}
.apaas_detail_container .main_contaner.locked_height_900 {
height: calc(100vh - 58px - 83px);
min-height: 900px;
}
.apaas_detail_container .detail_action {
text-align: right;
margin-top: 50px;
}
.apaas_detail_container .detail_action .el-button+.el-button {
margin-left: 30px;
}
.apaas_detail_form {
max-width: 970px;
}
.apaas_detail_form .el-input__inner,
.apaas_detail_form .el-textarea__inner {
width: 100%;
background-color: #f7f8f9;
}
.apaas_detail_form .el-select {
width: 100%;
}
.apaas_detail_form.el-form--label-top .el-form-item__label {
padding: 0 0 15px;
font-size: 14px;
line-height: 1;
color: #58617a;
}
.apaas_detail_form .el-form-item {
margin-bottom: 30px;
}
.apaas_detail_form .textarea_count {
font-size: 14px;
line-height: 1;
color: #a9aec0;
text-align: right;
margin-top: 10px;
}
.apaas_steps {
height: 100%;
}
.apaas_steps .apaas_step {
height: 100%;
position: relative;
}
.apaas_steps .apaas_step .apaas_step_content {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: calc(100% - 64px);
border-bottom: 1px solid #f4f7fc;
/* overflow: hidden; */
}
.apaas_steps .apaas_step .apaas_step_action {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.apaas_steps .apaas_step .apaas_step_action .el-button {
height: 44px;
width: 124px;
}
.apaas_steps .apaas_step .apaas_step_action .el-button+.el-button {
margin-left: 20px;
}
.top_fliter {
display: flex;
}
.top_fliter .filter_list {
flex-grow: 1;
min-width: 550px;
font-size: 0;
padding-left: 16px;
}
.filter_list>.filter_item {
display: inline-block;
vertical-align: middle;
margin-top: 16px;
}
.filter_list>.filter_item {
margin-right:34px;
}
.filter_list>.filter_item>* {
display: inline-block;
vertical-align: middle;
}
.filter_list>.filter_item>.filter_title {
min-width: 56px;
text-align: right;
font-size: 14px;
font-weight: 700;
color: #242c43;
margin-right: 10px;
white-space: nowrap;
}
.filter_list>.filter_item>.filter_title+* {
width: 300px;
}
.filter_list>.filter_item>.date-time-range {
width: 460px !important;
}
.filter_list>.filter_item .el-date-editor .el-range__close-icon {
position: absolute;
right: 5px;
top: 1px;
}
.top_fliter .filter_action {
flex-shrink: 0;
margin-left: 25px;
text-align: right;
}
.filter_action>.el-button {
/* min-width: 90px; */
height: 36px;
margin-top: 16px;
padding: 12px 17px;
}
.filter_action>.el-button+.el-button {
margin-left: 10px;
}
.meassage_detail_dialog {
display: flex;
flex-wrap: wrap;
text-align: left;
}
.meassage_detail_dialog .detail_item {
flex: 1 1 auto;
width: 50%;
margin-top: 20px;
}
.meassage_detail_dialog .detail_item.full_line {
width: 100%;
}
.meassage_detail_dialog .detail_item p {
padding: 0 15px;
font-size: 14px;
line-height: 22px;
color: #8890a7;
}
.meassage_detail_dialog .detail_item .item_content {
color: #000;
margin-top: 10px;
}
.meassage_detail_dialog .detail_item .full_content {
padding: 10px 0;
border-radius: 8px;
background-color: #f8f9fd;
margin-top: 5px;
}
.meassage_detail_dialog .detail_item .full_content>.apaas_scroll {
height: 176px;
overflow: auto;
}
.meassage_detail_dialog .detail_item .full_content .item_content {
margin: 0;
}
.no_wrap .apass_table td .cell {
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
white-space: nowrap;
}
/* 详情页公共样式 by xuyiming ~~~end */
/*
form_content
*/
.from_content1 {
width: calc(100% - 40px);
background-color: rgba(255, 255, 255, 1);
overflow: hidden;
margin: 0 20px 20px;
position: relative;
box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05);
border-radius: 12px;
padding-top: 20px;
}
.from_content {
width: calc(100% - 40px);
background-color: rgba(255, 255, 255, 1);
/* flex: 1 0 auto; */
position: relative;
box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05);
border-radius: 12px;
margin: 0 20px;
padding: 20px 20px 30px;
}
.from_content_table {
height: calc(100% - 90px);
}
.from_content_table_app {
height: calc(100% - 170px);
}
.from_content_table_auth {
height: calc(100% - 100px);
}
.from_content_btn {
height: 40px;
margin-bottom: 20px;
}
/* 时间控件样式 */
.el-picker-panel {
background-color: #fff !important;
border-radius: 8px !important;
font-size: 12px !important;
color: #202531 !important;
box-shadow: 0 !important;
border: none !important;
}
.el-date-editor.el-input__wrapper {
background-color: #fff;
}
.el-picker-panel__footer {
border-top: 1px solid #3f4864 !important;
background-color: #242c43 !important;
}
.el-picker-panel__icon-btn {
color: #202531;
}
.el-date-table th {
border-bottom: 1px solid #e6e9ef !important;
color: #202531 !important;
}
.el-date-table td.current:not(.disabled) span {
color: #e3e5ef !important;
background-color: #315efc !important;
}
.el-date-table td.next-month,
.el-date-table td.prev-month {
color: #a9b1c7 !important;
}
.el-date-picker__time-header {
border-bottom: 1px solid #3f4864 !important;
}
.el-picker-panel__body .el-input__inner {
height: 24px !important;
line-height: 24px !important;
background-color: #1a2236 !important;
border-radius: 12px !important;
border: solid 1px #3f4864 !important;
color: #e3e5ef !important;
font-size: 12px;
}
.el-picker-panel__footer .el-button {
background-color: #264dd9;
border-radius: 12px;
padding: 5px 12px;
color: #f4f7fc;
font-size: 12px;
border: none !important;
}
.el-picker-panel__footer .el-button--text {
background-color: #dde4ff;
border-radius: 12px;
padding: 5px 12px;
color: #264dd9;
font-size: 12px;
}
.el-button.is-plain:focus,
.el-button.is-plain:hover {
background-color: #264dd9;
color: #f4f7fc;
}
.el-button--text:focus,
.el-button--text:hover {
color: #264dd9;
}
.el-time-panel {
border-radius: 8px !important;
border: 1px solid #3f4864 !important;
background-color: #242c43 !important;
}
.el-time-panel__footer {
border: 1px solid #3f4864 !important;
}
.el-time-panel__btn.confirm {
background-color: #264dd9;
border-radius: 12px !important;
padding: 0px 12px;
color: #f4f7fc !important;
font-size: 12px !important;
}
.el-time-panel__btn {
line-height: 22px !important;
height: 22px !important;
}
.el-time-spinner__item:hover:not(.disabled):not(.active) {
background-color: #264dd9 !important;
border-radius: 12px !important;
color: #f4f7fc;
}
.el-time-spinner__item {
color: #58617a !important;
}
.el-date-table td.in-range div,
.el-date-table td.in-range div:hover,
.el-date-table.is-week-mode .el-date-table__row.current div,
.el-date-table.is-week-mode .el-date-table__row:hover div {
background-color: #eff2fa!important;
}
.el-date-table td.end-date .el-date-table-cell__text,
.el-date-table td.start-date .el-date-table-cell__text {
background-color: #3759be!important;
}
.el-date-table td.end-date span,
.el-date-table td.start-date span {
background-color: #264dd9;
}
.el-date-table td.today span {
color: #0c3ff7;
}
.el-date-editor .el-range-separator {
width: 15%;
line-height: 28px;
color: #202531;
}
/* table select window */
.el-checkbox__input.is-checked .el-checkbox__inner,
.el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #3759be;
border-color: #2b4695;
}
.el-checkbox__input.is-focus .el-checkbox__inner {
border-color: #2b4695;
}
.el-checkbox__input:hover .el-checkbox__inner {
border-color: #2b4695;
}
.el-date-editor .el-range-input {
width: 36%;
}
.el-input__inner:focus {
border-color: #515fe7;
}
.el-textarea__inner:focus {
border-color: #515fe7;
}
.el-select .el-input .el-select__caret {
color: #515fe7;
}
.el-input-number__decrease,
.el-input-number__increase {
color: #515fe7;
}
.el-input__inner::-webkit-input-placeholder,
.el-textarea__inner::-webkit-input-placeholder {
color: #a9aec0;
}
.el-input__inner:-moz-placeholder,
.el-textarea__inner:-moz-placeholder {
/* Firefox 18- */
color: #a9aec0;
}
.el-input__inner::-moz-placeholder,
.el-textarea__inner::-moz-placeholder {
/* Firefox 19+ */
color: #a9aec0;
}
.el-input__inner:-ms-input-placeholder,
.el-textarea__inner:-ms-input-placeholder {
color: #a9aec0;
}
[class*=" el-icon-"],
[class^="el-icon-"] {
font-weight: 700;
}
.el-rate__item .el-rate__icon {
font-size: 18px;
margin-right: 0;
}
.detai_form .el-input__inner,
.detai_form .el-textarea__inner {
background-color: #f7f7f9;
border-radius: 4px;
border: solid 1px #dadee7;
}
.detai_form .el-input.is-disabled .el-input__inner {
background-color: #e6e9ef;
}
.tip-box-popper {
background: #242c43 !important;
}
.p-1 {
padding: 5px;
}
.source_table .el-table thead tr {
background-color: #dfe5f6 !important;
}
.source_table .el-table th {
background-color: transparent;
}
.source_table .el-table td {
border-bottom: 1px solid #dadee7 !important;
}
.source_table .el-table__header {
border: 1px solid #b0bee8;
}
.source_table .el-table__body-wrapper {
border-left: 1px solid #dadee7 !important;
border-right: 1px solid #dadee7 !important;
}
.source_table .el-table__empty-block {
border-bottom: 1px solid #dadee7 !important;
}
.source_footer {
margin-top: 15px;
text-align: center;
}
.source_title {
font-size: 14px;
padding: 10px 0;
text-align: left;
}
.headerBox {
font-size: 18px;
line-height: 18px;
font-weight: 700;
font-stretch: normal;
letter-spacing: 0px;
color: #1a1a1a;
}
.headerBox span:first-child {
display: inline-block;
width: 4px;
height: 16px;
background-color: #3759be;
border-radius: 2px;
margin-right: 10px;
vertical-align: bottom;
}
.row_text {
-webkit-line-clamp: 2;
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
}
.close_reason {
padding: 2px 5px;
background-color: #dedede;
display: inline-block;
margin-top: 10px;
}
.pointer {
cursor: pointer;
}
.pr-1 {
padding-right: 10px;
}
/* test */
@font-face {
font-family: 'Digital-7Mono';
src: url('Digital-7Mono.ttf');
font-weight: normal;
font-style: normal;
}
\ No newline at end of file
.page_container {
width: 100%;
padding: 0 24px;
/* min-height: 100%; */
height: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
}
.page_content {
background-color: #fff;
height: calc(100% - 46px - 20px);
box-shadow: 0px 1px 4px 0px
rgba(0, 7, 101, 0.15);
border-radius: 6px;
}
\ No newline at end of file
export const lang = {
}
\ No newline at end of file
:root {
--font-color: #404a62;
/* --el-color-primary-light-9: #f7f7f9; */
--el-color-white: #ffffff;
--el-color-black: #1a1a1a;
--el-color-primary: #2b4695;
--el-color-primary-light-3: #6b7eb5;
--el-color-primary-light-5: #95a3ca;
--el-color-primary-light-7: #c0c8df;
--el-color-primary-light-8: #d5daea;
--el-color-primary-light-9: #eaedf5;
--el-color-primary-dark-2: #223877;
--el-color-success: #429e8a;
--el-color-success-light-3: #7bbbad;
--el-color-success-light-5: #a1cfc5;
--el-color-success-light-7: #c7e2dc;
--el-color-success-light-8: #d9ece8;
--el-color-success-light-9: #ecf5f4;
--el-color-success-dark-2: #357e6e;
--el-color-warning: #e56600;
--el-color-warning-light-3: #ed944d;
--el-color-warning-light-5: #f2b380;
--el-color-warning-light-7: #f7d1b3;
--el-color-warning-light-8: #fae0cc;
--el-color-warning-light-9: #fcf0e6;
--el-color-warning-dark-2: #b75200;
--el-color-danger: #d75138;
--el-color-danger-light-3: #e38674;
--el-color-danger-light-5: #eba89c;
--el-color-danger-light-7: #f3cbc4;
--el-color-danger-light-8: #f7dcd7;
--el-color-danger-light-9: #fbeeeb;
--el-color-danger-dark-2: #ac412d;
--el-color-error: #d75138;
--el-color-error-light-3: #e38674;
--el-color-error-light-5: #eba89c;
--el-color-error-light-7: #f3cbc4;
--el-color-error-light-8: #f7dcd7;
--el-color-error-light-9: #fbeeeb;
--el-color-error-dark-2: #ac412d;
--el-color-info: #404a62;
--el-color-info-light-3: #7a8191;
--el-color-info-light-5: #a0a5b1;
--el-color-info-light-7: #c6c9d0;
--el-color-info-light-8: #d9dbe0;
--el-color-info-light-9: #ecedf0;
--el-color-info-dark-2: #333b4e;
--el-bg-color: #ffffff;
--el-bg-color-page: #f2f3f5;
--el-bg-color-overlay: #ffffff;
--el-text-color-primary: #202531;
--el-text-color-regular: #404a62;
--el-text-color-secondary: #909bb6;
--el-text-color-placeholder: #a9b1c7;
--el-text-color-disabled: #a9b1c7;
--el-border-color: #dadee7;
--el-border-color-light: #e3e5eb;
--el-border-color-lighter: #e6e9ef;
--el-border-color-extra-light: #edf0f5;
--el-border-color-dark: #d1d5de;
--el-border-color-darker: #cbced7;
--el-fill-color: #f0f2f5;
--el-fill-color-light: #f2f3f7;
--el-fill-color-lighter: #f7f7f9;
--el-fill-color-extra-light: #fafcff;
--el-fill-color-dark: #ebedf0;
--el-fill-color-darker: #e6e8eb;
--el-fill-color-blank: #ffffff;
}
.text-hide1{
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
}
.log_content_nor::-webkit-scrollbar {
width: 0px; /*对垂直流动条有效*/
height: 0px; /*对水平流动条有效*/
}
\ No newline at end of file
<template>
<div class="bg-btns">
<ul>
<li
v-for="btn in options"
:class="{
'is-active': modelValue === btn.value,
}"
:key="btn.value"
@click="selectBtn(btn)"
>
{{ btn.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: "BgBtns",
props: {
modelValue: {
type: [String, Number],
default: "",
},
options: {
type: Array,
default: () => [],
},
},
emits: ["update:modelValue"],
methods: {
selectBtn({ value }) {
this.$emit("update:modelValue", value);
},
},
};
</script>
<template>
<div class="bg-card">
<h3 class="card-title text-clip">
<span class="title-icon" v-if="icon">
<bg-icon :icon="icon" />
</span>
<span class="text-text">{{ title }}</span>
</h3>
<div class="card-content" ref="content">
<slot />
</div>
</div>
</template>
<script>
export default {
name: "BgCard",
props: {
title: {
type: String,
default: "",
},
icon: {
type: String,
default: "",
},
},
};
</script>
<template>
<VAceEditor
v-model:value="states.content"
class="vue-ace-editor"
:class="{'vue-ace-editor-disable':props.disabled}"
@input="codeChange"
:lang="props.lang"
:theme="props.theme"
:options="{
useWorker: true,
readOnly: props.disabled,
wrap: true
}"
/>
</template>
<script setup>
import { reactive, toRefs, watch,onMounted } from "vue";
import { VAceEditor } from "vue3-ace-editor";
import ace from 'ace-builds';
import modeJsonUrl from 'ace-builds/src-noconflict/mode-json?url';
import modeJavascriptUrl from 'ace-builds/src-noconflict/mode-javascript?url';
import modeHtmlUrl from 'ace-builds/src-noconflict/mode-html?url';
import themeGithubUrl from 'ace-builds/src-noconflict/theme-github?url';
import themeChromeUrl from 'ace-builds/src-noconflict/theme-chrome?url';
import themeMonokaiUrl from 'ace-builds/src-noconflict/theme-monokai?url';
import workerBaseUrl from 'ace-builds/src-noconflict/worker-base?url';
import workerJsonUrl from 'ace-builds/src-noconflict/worker-json?url';
import workerJavascriptUrl from 'ace-builds/src-noconflict/worker-javascript?url';
import workerHtmlUrl from 'ace-builds/src-noconflict/worker-html?url';
ace.config.setModuleUrl('ace/mode/json', modeJsonUrl);
ace.config.setModuleUrl('ace/mode/javascript', modeJavascriptUrl);
ace.config.setModuleUrl('ace/mode/html', modeHtmlUrl);
ace.config.setModuleUrl('ace/theme/github', themeGithubUrl);
ace.config.setModuleUrl('ace/theme/chrome', themeChromeUrl);
ace.config.setModuleUrl('ace/theme/monokai', themeMonokaiUrl);
ace.config.setModuleUrl('ace/mode/base', workerBaseUrl);
ace.config.setModuleUrl('ace/mode/json_worker', workerJsonUrl);
ace.config.setModuleUrl('ace/mode/javascript_worker', workerJavascriptUrl);
ace.config.setModuleUrl('ace/mode/html_worker', workerHtmlUrl);
const props = defineProps(
{
modelValue: {
type:String,
default:"",
},
disabled:{
type:Boolean,
default:false
},
// lang:{
// type:String,
// default:"json"
// },
// theme:{
// type:String,
// default:"themeChromeUrl"
// },
width:{
type:String,
default:"100%"
},
}
)
const emit = defineEmits(['update:modelValue'])
watch(
props.modelValue,
(n,o) => {
states.content = n
}
)
const states = reactive({
lang: "json",
theme: "github",
content: "",
});
watch(
states.content,
(n,o) => {
emit("update:modelValue", n);
}
)
const codeChange = (val,val1,val2)=>{
emit("update:modelValue", val1.renderer.content.innerText);
}
onMounted(() => {
let obj = "";
// console.log(typeof JSON.parse(this.datas));
try {
if (typeof JSON.parse(props.modelValue) == "object") {
obj = JSON.stringify(JSON.parse(props.modelValue), null, "\t");
}
} catch (e) {
obj = props.modelValue;
}
states.content = obj
})
const {content} = toRefs(states)
</script>
<style scoped>
.vue-ace-editor {
flex: 1;
margin-top: 15px;
font-size: 16px;
border: 1px solid #dadee7;
width: 100%;
height: 100%;
border-radius: 4px;
overflow: hidden;
}
.vue-ace-editor :deep() .ace_scrollbar-v{
width: 0px!important;
}
.vue-ace-editor :deep() .ace_gutter{
font-size: 14px;
color: #ffffff;
background-color: #262626;
}
.vue-ace-editor :deep() .ace_gutter-cell{
line-height: 22px;
background-color: #262626;
}
.vue-ace-editor :deep() .ace_print-margin{
width: 0;
}
.vue-ace-editor :deep() .ace_scroller{
background-color: #1a1a1a;
color: #fff;
caret-color:#fff;
}
/* 光标颜色 */
.vue-ace-editor :deep() .ace_cursor{
color: #fff;
}
.vue-ace-editor-disable :deep() .ace_scrollbar-v{
width: 6px!important;
}
.vue-ace-editor-disable :deep() .ace_gutter{
background-color: #202531;
}
.vue-ace-editor-disable :deep() .ace_gutter-cell{
background-color: #202531;
}
.vue-ace-editor-disable :deep() .ace_scroller{
background-color: #fff;
color: #202531;
}
/* 光标颜色 */
.vue-ace-editor-disable :deep() .ace_cursor{
color: #000;
}
</style>
<template>
<div class="detail_box">
<div class="detail_text text_clip" :style="index==data.length-1?last_width:unit_width" v-for="(item,index) in data" :key="'data'+index">
<span>{{item.title}}</span>
<!-- 拓展功能 -->
<template v-if="item.slot">
<span>
<slot v-bind:item="item" :name="item.slot"></slot>
</span>
</template>
<!-- 原有下载功能 -->
<template v-else>
<span v-if="!item.urls" :title="item.info" @click="down_file(item.url)" :style="item.url?{color:'#515fe7',cursor:'pointer'}:''">{{item.info}}</span>
<span v-else :title="item.info">
<span v-for="(it,idx) in item.urls" @click="down_file(it)" style="color:#515fe7;cursor:pointer;" :key="'urls'+idx">{{helper.downloadFileFormatNew(it)}}</span>
</span>
</template>
</div>
<div class="bg" :style="{top:(2*index+1)*42+'px'}" v-for="(item,index) in bg_num" :key="'bg'+index"></div>
</div>
</template>
<script>
import helper from './utils/index.js'
console.log(helper);
export default {
props: {
data:{
type: Array,
default: () => [],
},
layout:{
line_num:4
}
},
components: {
},
data() {
return {
helper,
unit_width:0,
last_width:0,
bg_num:0,
};
},
watch: {
data:{
handler: function(n, o) {
if(this.layout.line_num){
this.unit_width = {width:100/this.layout.line_num +'%'}
}
if(this.layout.line_num&&n.length%this.layout.line_num!==0){//计算最后一个格子的宽度
this.last_width = {width:(this.layout.line_num-(n.length%this.layout.line_num)+1)/this.layout.line_num*100+'%'}
}else{
this.last_width = {width:100/this.layout.line_num +'%'}
}
if(n.length<this.layout.line_num){
return
}else{
this.bg_num = Math.floor((Math.ceil(n.length/this.layout.line_num))/2)
}
},
immediate: true
}
},
computed: {
},
created() {
},
mounted() {
},
methods: {
down_file(url){
if(url){
console.log(url);
const a = document.createElement("a"); // 创建a标签
a.setAttribute("download", ""); // download属性
a.setAttribute("href", url); // href链接
a.click(); // 自执行点击事件
}
}
},
};
</script>
<style scoped>
.detail_box{
width: 100%;
border-bottom: 1px solid #e3e5ef;
border-right: 1px solid #e3e5ef;
overflow: hidden;
position: relative;
}
.detail_box .detail_text{
width: 25%;
height: 42px;
line-height: 42px;
padding: 0 15px;
border-left: 1px solid #e3e5ef;
border-top: 1px solid #e3e5ef;
float: left;
position: relative;
z-index: 1;
}
.detail_box .detail_text span:nth-of-type(1){
color: #616f94;
}
.detail_box .detail_text span:nth-of-type(2){
color: #404a62;
}
.bg{
background-color:#f7f8f9;
width: 100%;
height: 42px;
position: absolute;
}
</style>
<template>
<div class="out-detail">
<div class="row-box" v-for="(item,index) in list" :style="{width:item.width}" :key="'row-box'+index">
<p class="detail-module" v-if="!item.slot">
<span :style="{width:itemWidth}">{{item.label}}</span>
<span class="text_clip" :title="item.value" v-if="!item.childSlot">{{item.value}}</span>
<span v-else>
<slot :name="item.childSlot" :data="item"></slot>
</span>
</p>
<template v-else>
<slot :name="item.slot" :data="item"></slot>
</template>
</div>
</div>
</template>
<script>
export default {
props: {
list:{
type:Array,
default:()=>[]
},
itemWidth:{
type:String,
default:''
}
},
components: {
},
data() {
return {
};
},
watch: {
},
computed: {
},
created() {
},
mounted() {
},
methods: {
},
};
</script>
<style scoped>
.out-detail{
width: 100%;
overflow: hidden;
display: flex;
flex-wrap: wrap;
border-right: solid 1px #dadee7;
border-bottom: solid 1px #dadee7;
}
.row-box{
width: 50%;
flex-grow:1;
text-align: left;
line-height: 48px;
min-height: 48px;
border-left: solid 1px #dadee7;
border-top: solid 1px #dadee7;
font-size: 14px;
color: #404a62;
}
.row-box .detail-module{
height: 100%;
display: flex;
}
.row-box .detail-module span{
height: 100%;
display: inline-block;
padding-left: 15px;
box-sizing: border-box;
}
.row-box .detail-module span:nth-of-type(1){
background-color: #f7f7f9;
min-width: 114px;
border-right: solid 1px #dadee7;
}
.row-box .detail-module span:nth-of-type(2){
flex-grow:1;
}
</style>
<template>
<div class="bg-detail bg-form">
<!-- 固定导航 -->
<div class="bg-tabs-nav--fixed" v-show="showFixedBars">
<ul v-if="calcTabs().length">
<li
v-for="(item, index) in calcTabs()"
:key="'tab_' + index"
:class="{
current: activeName === item.name,
}"
@click="changeActiveName(item, index)"
>
{{ item.label }}
</li>
<li>
<!-- empty -->
</li>
</ul>
</div>
<!-- 面包屑 -->
<div class="bg-breadcrumb">
<slot name="breadcrumb" />
</div>
<!-- 基本信息 -->
<div class="bg-detail-info" v-if="$slots.info">
<slot name="info" />
</div>
<!-- 兼容意外模块 -->
<div v-if="$slots.other">
<slot name="other" />
</div>
<!-- 详情 -->
<div class="bg-tabs bg-detail-tabs">
<div class="bg-tabs-nav" v-if="calcTabs().length">
<ul>
<li
v-for="(item, index) in calcTabs()"
:key="'tab_' + index"
:class="{
current: activeName === item.name,
}"
@click="changeActiveName(item, index)"
>
{{ item.label }}
</li>
<li>
<!-- empty -->
</li>
</ul>
</div>
<div class="bg-tabs-content">
<slot />
</div>
</div>
</div>
</template>
<script>
export default {
name: "BgDetail",
provide() {
return {
getActiveName: () => {
return this.activeName;
},
getIsTabs: () => {
return false;
},
};
},
data() {
return {
activeName: "",
showFixedBars: false,
scrollCallback: null,
};
},
methods: {
calcTabs() {
let tabSlots = [];
if (this.$slots.default) {
tabSlots = this.$slots.default
.filter(
(vnode) =>
vnode.tag &&
vnode.componentOptions &&
vnode.componentOptions.Ctor.options.name === "BgTab"
)
.map((vnode) => vnode.componentOptions.propsData);
}
return tabSlots;
},
changeActiveName({ name }, index) {
let targetEl = this.$el.querySelectorAll(`.bg-tab`)[index];
let targetCtx = document.querySelector(`.bg-main`);
targetCtx.scrollTop = targetEl && targetEl.offsetTop - 165;
this.activeName = name;
this.scrollCallback = () => {
this.activeName = name;
};
},
scrollAction() {
let targetCtx = document.querySelector(`.bg-main`);
let ctxScrollTop = targetCtx.scrollTop || 0;
let targetEls = this.$el.querySelectorAll(`.bg-tab`);
let tabs = this.calcTabs();
for (let i = 0; i < targetEls.length; i++) {
let targetEl = targetEls[i];
if (ctxScrollTop >= targetEl.offsetTop) {
this.activeName = tabs[i].name;
}
}
this.showFixedBars = ctxScrollTop > 222;
this.scrollCallback && this.scrollCallback();
this.scrollCallback = null;
},
},
mounted() {
this.$nextTick(() => {
let tabs = this.calcTabs();
this.activeName = tabs[0] && tabs[0].name;
this.scrollAction();
window.addEventListener("scroll", this.scrollAction, true);
});
},
destroyed() {
window.removeEventListener("scroll", this.scrollAction, true);
},
};
</script>
<template>
<div class="bg-filtrate">
<span class="bg-filtrate-text">{{ name }}</span>
<div class="bg-filtrate-list">
<el-date-picker
v-model="value"
type="daterange"
value-format="yyyy-MM-dd"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="change">
</el-date-picker>
</div>
</div>
</template>
<script>
export default {
name: "BgFilterDate",
model: {
prop: "time",
event: "change",
},
props: {
name: {
type: String,
default: "",
},
},
data() {
return {
value: ""
}
},
computed: {
},
methods: {
change(event) {
this.$emit("change", event);
},
},
};
</script>
\ No newline at end of file
<template>
<div class="bg-filter" v-if="options.length > 0">
<span>{{ name }}</span>
<ul>
<li
v-for="(item, index) in fullOptions"
:class="{ current: selection.indexOf(item.value) > -1 }"
:key="'li_' + index"
@click="selectAction(item)"
>
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: "BgFilter",
model: {
prop: "value",
event: "change",
},
props: {
isCalc:{
type:Boolean,
default:false,
},
value: {
type: [Number, String],
default: "",
},
name: {
type: String,
default: "",
},
options: {
type: Array,
default: () => [],
},
optionName: {
type: String,
default: "name",
},
optionValue: {
type: String,
default: "value",
},
multiple: {
type: Boolean,
default: false,
},
},
computed: {
fullOptions() {
return [
{
name: "全部",
value: "",
},
...this.options.map((item) => {
return {
name: item[this.optionName],
value: item[this.optionValue] + "",
sub_cate: item.sub_cate ? item.sub_cate : "",
};
}),
];
},
selection() {
let value = this.value + "";
return value.split(",");
},
},
methods: {
selectAction({ value, name, sub_cate }) {
if (value && this.multiple) {
let selection = [...this.selection].filter((v) => v !== "");
let index = selection.findIndex((v) => v === value);
if (index > -1) {
selection.splice(index, 1);
} else {
selection.push(value);
}
this.$emit("change", selection.join(","));
} else {
this.$emit("change", value, name, sub_cate ? sub_cate : "");
}
},
},
};
</script>
<template>
<div class="bg-filtrate">
<span class="bg-filtrate-text">{{ name }}</span>
<ul class="bg-filtrate-list">
<li
v-for="(item, index) in fullOptions"
:class="{ current: selection.indexOf(item.value) > -1 }"
:key="'li_' + index"
@click="selectAction(item)"
>
{{ item.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: "BgFiltrate",
model: {
prop: "value",
event: "change",
},
props: {
value: {
type: [Number, String],
default: "",
},
name: {
type: String,
default: "",
},
options: {
type: Array,
default: () => [],
},
optionName: {
type: String,
default: "name",
},
optionValue: {
type: String,
default: "value",
},
multiple: {
type: Boolean,
default: false,
},
},
computed: {
fullOptions() {
return [
{
name: "全部",
value: "",
},
...this.options.map((item) => {
return {
name: item[this.optionName],
value: item[this.optionValue] + "",
};
}),
];
},
selection() {
let value = this.value + "";
return value.split(",");
},
},
methods: {
selectAction({ value, name }) {
if (value && this.multiple) {
let selection = [...this.selection].filter((v) => v !== "");
let index = selection.findIndex((v) => v === value);
if (index > -1) {
selection.splice(index, 1);
} else {
selection.push(value);
}
this.$emit("change", selection.join(","));
} else {
this.$emit("change", value, name);
}
},
},
};
</script>
\ No newline at end of file
<template>
<svg class="bg-icon" aria-hidden="true">
<use :xlink:href="icon"></use>
</svg>
</template>
<script>
import "https://at.alicdn.com/t/c/font_3622053_guave5wj5s.js";
export default {
props: {
icon: {
type: String,
default: "",
},
},
};
</script>
\ No newline at end of file
<template>
<div class="bg-info">
<ul>
<li
v-for="(item, index) in data"
:key="'li_' + index"
:style="{
width: item.full ? `100%` : `calc(100% / ${col})`,
}"
>
<span :style="{ width: item.nameWidth ? item.nameWidth + 'px' : '50%'}">
{{ item.name }}
</span>
<span :style="{ width: item.nameWidth ? `calc( 100% - ${item.nameWidth + 'px'})` : '50%'}">
<span
style="display: inline-block;width: 100%;white-space: normal;word-break: break-all"
:style="{
width: item.copy ? 'calc(100% - 36px)' : item.download || item.password ? 'calc(100% - 22px)': '100%',
color: item.download ? '#3759be' : '#404a62'
}"
>{{ item.value }}</span>
<a
class="copy-btn"
@click="copyText(item.value, $event)"
v-if="item.copy"
>
复制
</a>
<bg-icon
class="copy-btn"
style="font-size: 14px; color: #a9b1c7;cursor: pointer;"
icon="#bg-ic-download"
v-if="item.download"
@click="download(item.url)"
></bg-icon>
<bg-icon
class="copy-btn"
style="font-size: 14px; color: #a9b1c7;cursor: pointer;"
:icon="show ? '#bg-ic-eye-close' : '#bg-ic-eye'"
v-if="item.password"
@click="changeView(item)"
></bg-icon>
</span>
</li>
</ul>
</div>
</template>
<script>
import Clipboard from "clipboard";
export default {
name: "BgInfo",
props: {
data: {
type: Array,
default: () => [],
},
col: {
type: Number,
default: 2,
},
},
data() {
return {
show: false
}
},
methods: {
clipboardSuccess() {
this.$message({
type: "success",
message: "复制成功",
duration: 1500,
});
},
clipboardError() {
this.$message({
message: "浏览器不支持自动复制",
type: "warning",
});
},
copyText(text, e) {
const clipboard = new Clipboard(e.target, {
text: () => text,
});
clipboard.on("success", () => {
this.clipboardSuccess();
// 释放内存
clipboard.destroy();
});
clipboard.on("error", () => {
// 不支持复制
this.clipboardError();
// 释放内存
clipboard.destroy();
});
// 解决第一次点击不生效的问题,如果没有,第一次点击会不生效
clipboard.onClick(e);
},
download(url) {
const a = document.createElement("a"); // 创建a标签
a.setAttribute("download", ""); // download属性
a.setAttribute("href", url); // href链接
a.click(); // 自执行点击事件
},
changeView(item) {
if (!this.show) {
item.value = item.realValue
}else {
item.value = "***************"
}
this.show = !this.show
}
},
};
</script>
<template>
<div class="inner-container" :style="{height:height[0]+'px',fontSize:height[2]+'px'}">
<div :style="{height:height[1]+'px',lineHeight:height[1]-2+'px'}" :class="{'now-inner':nowIndex==index}" @click="changeInner(index)" v-for="(item,index) in data" :key="'inner'+index">{{item}}</div>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs } from 'vue'
const props = defineProps({
modelValue:{
type: [String,Number],
default: 0,
},
data: {
type: Array,
default: [],
},
default:{
type: [String,Number],
default: 0
},
height:{
type:Array,
default:[36,32,16]
}
})
const emit = defineEmits(['update:modelValue','change'])
const nowIndex = ref('')
const changeInner = (val)=>{
nowIndex.value = val
emit('update:modelValue',val)
emit('change',val)
}
onBeforeMount(()=>{
nowIndex.value = props.default
})
</script>
<style scoped>
.inner-container{
height: 36px;
background-color: #edeef0;
border-radius: 4px;
padding: 2px;
display: inline-block;
overflow: hidden;
}
.inner-container div{
height: 32px;
line-height: 30px;
border-radius: 4px;
padding:0 15px;
float: left;
color: #404a62;
cursor: pointer;
}
.inner-container .now-inner{
background-color: #2b4695;
color: #ffffff;
}
</style>
<template>
<div class="bg-layout-card" :style="style">
<div class="card-title">
<h3 class="title-text text-clip">{{ title }}</h3>
<ul class="filter-list" v-if="btns.length > 0">
<li
v-for="(item, index) in btns"
:key="item"
:class="{ current: index === btn }"
@click="$emit('update:btn', index)"
>
{{ item }}
</li>
</ul>
<div
class="download-btn"
@click="downloadAction"
v-loading="downloading"
element-loading-spinner="el-icon-loading"
v-if="download"
>
<img src="./imgs/btn_daochu.png" />
</div>
</div>
<div class="card-content" ref="content">
<slot />
</div>
</div>
</template>
<script>
import html2canvas from "html2canvas";
export default {
name: "BgLayoutCard",
props: {
title: {
type: String,
default: "",
},
width: {
type: String,
default: "25%",
},
height: {
type: String,
default: "278px",
},
btn: {
type: Number,
default: 0,
},
btns: {
type: Array,
default: () => [],
},
download: {
type: Boolean,
default: false,
},
},
computed: {
style() {
return {
width: `calc(${this.width} - 20px)`,
height: this.height,
};
},
},
data() {
return {
downloading: false,
};
},
methods: {
getScrollTop() {
let scrollTop = 0;
if (document.documentElement && document.documentElement.scrollTop) {
scrollTop = document.documentElement.scrollTop;
} else if (document.body) {
scrollTop = document.body.scrollTop;
}
return scrollTop;
},
downloadAction() {
if (this.downloading) {
return;
}
let content = this.$refs.content;
let { top, left } = content.getBoundingClientRect();
let scrollTop = this.getScrollTop();
this.downloading = true;
html2canvas(content, { x: left, y: top + scrollTop }).then((canvas) => {
let imgUrl = canvas.toDataURL("image/png");
let a = document.createElement("a"); // 生成一个a元素
let event = new MouseEvent("click"); // 创建一个单击事件
this.$nextTick(() => {
a.download = this.title; // 设置图片名称
a.href = imgUrl; // 将生成的URL设置为a.href属性
a.dispatchEvent(event); // 触发a的单击事件
this.downloading = false;
});
});
},
},
};
</script>
<template>
<div class="bg-list bg-form">
<!-- 面包屑 -->
<div class="bg-breadcrumb">
<slot name="breadcrumb" />
</div>
<!-- 头部 -->
<div class="bg-list-header" v-if="$slots.header">
<slot name="header" />
</div>
<!-- 筛选条件 -->
<div class="bg-list-filter" v-if="$slots.filters">
<div class="fiter-header" v-if="!inlineFilters">
<span v-if="noMoreFilters">
<!-- -->
</span>
<template v-else>
<el-button @click="$emit('update:visible', !visible)" v-if="visible">
<span>收起</span>
<i class="el-icon-caret-top el-icon--right"></i>
</el-button>
<el-button @click="$emit('update:visible', !visible)" v-else>
<span>更多选项</span>
<i class="el-icon-caret-bottom el-icon--right"></i>
</el-button>
</template>
<div class="filter-header-right">
<slot name="filter" />
</div>
</div>
<div
class="filter-content"
:class="{ 'inline-filters': inlineFilters, 'show-more': visible }"
>
<div class="filter-list">
<slot name="filters" />
</div>
<div class="filter-action" v-if="inlineFilters">
<div class="filters-right" v-if="$slots['filters-right']">
<slot name="filters-right" />
</div>
<el-button type="primary2" @click="$emit('search-action')">
查询
</el-button>
<el-button type="default2" @click="$emit('search-reset')">
重置
</el-button>
</div>
</div>
</div>
<!-- 其他信息 -->
<div class="bg-list-top" v-if="$slots.top">
<slot name="top" />
</div>
<!-- 列表 -->
<div class="bg-list-main" :class="{ 'has-action': !!$slots.action }">
<div class="main-action" v-if="$slots.action">
<slot name="action" />
</div>
<div class="main-table">
<slot name="table" />
</div>
<div class="main-pagination">
<slot name="pagination" />
</div>
</div>
<slot />
</div>
</template>
<script>
export default {
name: "BgList",
props: {
visible: {
type: Boolean,
default: false,
},
noMoreFilters: {
type: Boolean,
default: false,
},
inlineFilters: {
type: Boolean,
default: false,
},
},
};
</script>
<template>
<ul class="nav-list" v-if="list&&list.length">
<li v-for="(item, index) in list" v-show="item.show" :key="'nav_' + index">
<template v-if="item.children && item.children.length">
<div
class="nav-item nav-more text-clip"
:class="{ current: isCurrent([item.path]) }"
@click="showMoreAction(index)"
>
<span :style="{ paddingLeft: `${deep*2}em` }">
<!-- <img v-if="item.icon" :src="item.icon" alt=""> -->
<bg-icon v-if="item.icon" :icon="item.icon"></bg-icon>
{{ item.menuName }}
</span>
&ensp;
</div>
<transition name="slideOutUp">
<NavList
:list="item.children"
:deep="deep + 1"
:highlight-parent-rule="highlightParentRule"
v-if="showMore[index] !== false"
/>
</transition>
</template>
<template v-else>
<div
class="nav-item text-clip"
:class="{current:isCurrent(item.linkPath&&item.linkPath.length?[...item.linkPath,item.path]:[item.path])}"
@click="$router.push(item.path)"
>
<span :style="{ paddingLeft: `${deep*2}em` }">{{ item.menuName }}</span>
</div>
</template>
</li>
</ul>
</template>
<script>
export default {
name: "NavList",
props: {
list: {
type: Array,
required: true,
}, // 导航列表 [ { name: "xxx", path: "xxx" } ]
deep: {
type: Number,
default: 0,
},
highlightParentRule: {
type: Function,
},
},
data() {
return {
showMore: {},
};
},
methods: {
showMoreAction(index) {
let flag = this.showMore[index];
if (flag === undefined) {
flag = true;
}
this.showMore[index] = !flag
},
isCurrent(path) {
return (
(this.highlightParentRule && this.highlightParentRule(path)) || false
);
},
},
};
</script>
<template>
<div class="bg-nav" :style="{ width: width }">
<div class="bg-nav-title" v-if="title">
<h3 class="text-clip">{{ title }}</h3>
</div>
<div class="bg-nav-list bg-scroll">
<NavList :list="list" :highlight-parent-rule="highlightParentRule" />
</div>
</div>
</template>
<script>
import NavList from "./bg-nav-list.vue";
export default {
name: "BgNav",
components: {
NavList,
},
props: {
title: {
type: String,
default: "功能列表",
},
width: {
type: String,
default: "184px",
}, // 宽度
list: {
type: Array,
required: true,
}, // 导航列表 [ { name: "xxx", path: "xxx" } ]
highlightParentRule: {
type: Function,
},
},
};
</script>
<template>
<div class="bg-pagination">
<el-pagination
v-model:currentPage="page"
v-model:page-size="size"
:page-sizes="pageSizes"
:layout="layout"
:total="total"
@size-change="changeSize"
@current-change="changePage"
:background="background"
:disabled="disabled"
/>
</div>
</template>
<script>
export default {
name: "pagination",
props: {
page: {
type: Number,
default: 1
},
size: {
type: Number,
default: 10,
},
pageSizes: {
type: Array,
default: [10,50,100]
},
total: {
type: Number,
default: 0
},
layout: {
type: String,
default: "total, sizes, prev, pager, next, jumper"
},
background: {
type: Boolean,
default: false
},
disabled: {
type: Boolean,
default: false
}
},
setup(props, context) {
const changePage = (val) => {
context.emit("change-page",val)
}
const changeSize = (val) => {
context.emit("change-size",val)
}
return {
changePage,
changeSize
}
},
}
</script>
\ No newline at end of file
<template>
<div style="border: 1px solid #ccc;z-index: 100;">
<Toolbar
style="border-bottom: 1px solid #ccc"
:editor="editorRef"
:defaultConfig="toolbarConfig"
:mode="mode"
/>
<Editor
style="height: 500px; overflow-y: hidden;"
v-model="valueHtml"
@onChange="handleChange"
@onBlur="handleBlur"
:defaultConfig="editorConfig"
:mode="mode"
@onCreated="handleCreated"
/>
</div>
</template>
<script>
import '@wangeditor/editor/dist/css/style.css' // 引入 css
import { onBeforeUnmount, ref, shallowRef, onMounted } from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import {
useFormItem,
} from 'element-plus'
export default {
components: { Editor, Toolbar },
props: {
modelValue: {
type: String,
default: '',
},
disabled:{
type:Boolean,
default:false
}
},
emits: ['update:modelValue','change','blur'],
watch:{
modelValue(n,o){
this.valueHtml = n
}
},
setup(props,{ emit }) {
//引入form-item
const { formItem } = useFormItem()
// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef()
// 内容 HTML
const valueHtml = ref('')
// 模拟 ajax 异步获取内容
onMounted(() => {
setTimeout(()=>{
valueHtml.value = props.modelValue
// console.log(valueHtml.value);
})
})
const toolbarConfig = {}
const editorConfig = { placeholder: '请输入内容...' }
// watch(
// props,modelValue,
// (n,o) => {
// }
// )
// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {
const editor = editorRef.value
if (editor == null) return
editor.destroy()
})
const handleCreated = (editor) => {
editorRef.value = editor // 记录 editor 实例,重要!
if(props.disabled){
editor.disable()
}
}
const handleChange = ()=>{
emit("update:modelValue", valueHtml.value);
// formItem?.validate?.('change').catch((err) => debugWarn(err))
}
const handleBlur = ()=>{
formItem?.validate?.('blur').catch((err) => console.warn(err))
}
return {
editorRef,
valueHtml,
mode: 'default', // 或 'simple'
toolbarConfig,
editorConfig,
handleCreated,
handleChange,
handleBlur,
};
}
}
</script>
\ No newline at end of file
<template>
<div class="bg-sort">
<a
v-for="(item, index) in types"
:key="'name_' + index"
:class="{ current: item.value === value }"
@click="selectAction(item)"
>
{{ item.name }}
</a>
</div>
</template>
<script>
export default {
name: "BgSort",
model: {
prop: "value",
event: "change",
},
props: {
value: {
type: [Number, String],
default: "",
},
types: {
type: Array,
default: () => [
{
name: "综合排序",
value: 0,
},
{
name: "最近更新",
value: 1,
},
{
name: "最高人气",
value: 2,
},
{
name: "最好评价",
value: 3,
},
],
},
},
methods: {
selectAction({ value }) {
this.$emit("change", value);
},
},
};
</script>
\ No newline at end of file
<template>
<div class="bg-step" v-show="active === step">
<div class="step-content">
<slot />
</div>
<div class="step-action bg-form">
<slot name="action" />
</div>
</div>
</template>
<script>
export default {
name: "BgStep",
inject: {
getActive: {
type: Function,
default: () => {
return this.$parent.getActive;
},
},
},
props: {
title: {
type: String,
default: "",
},
step: {
type: Number,
required: true,
},
icon: {
required: true,
},
},
computed: {
active() {
return this.getActive();
},
},
};
</script>
<template>
<div class="bg-steps">
<div class="bg-steps-container">
<div class="steps-nav">
<ul>
<template v-for="(item, index) in calcSteps()" :key="'tab_' + index">
<li
class="step-line"
:class="{
done: active > index,
current: active === index,
}"
v-if="index > 0"
></li>
<li
class="step-item"
:class="{
done: active > index,
current: active === index,
}"
>
<div class="step-icon">
<!-- -->
</div>
<div class="step-hightlight-icon">
<img :src="item.icon" />
</div>
<div class="step-title">
<p>
{{ item.title || "完成" }}
</p>
<p v-if="item.title">
<template v-if="active > index">
已完成
</template>
<template v-else-if="active === index">
进行中
</template>
<template v-else>
未进行
</template>
</p>
</div>
</li>
<li
class="step-line"
:class="{
done: active > index,
current: active === index,
}"
v-if="index < calcSteps().length - 1"
></li>
</template>
</ul>
</div>
<div class="steps-content">
<slot />
</div>
</div>
</div>
</template>
<script>
export default {
name: "BgDetail",
provide() {
return {
getActive: () => {
return this.active;
},
};
},
props: {
active: {
type: Number,
default: 0,
},
},
data() {
return {
showFixedBars: false,
scrollCallback: null,
};
},
methods: {
calcSteps() {
let stepSlots = [];
if (this.$slots.default) {
stepSlots = this.$slots.default
.filter(
(vnode) =>
vnode.tag &&
vnode.componentOptions &&
vnode.componentOptions.Ctor.options.name === "BgStep"
)
.map((vnode) => {
return vnode.componentOptions.propsData;
});
}
return stepSlots;
},
},
};
</script>
<template>
<div
ref="bg_switch"
class="bg-switch"
:class="{ disabled: disabled }"
:style="now_style"
@click="switch_data"
>
<span class="label" :style="now_label_style">
{{ labels[now_index] }}
</span>
<span class="circle" :style="now_circle_style" ref="circle">
<!-- circle -->
</span>
</div>
</template>
<script>
export default {
name: "BgSwitch",
props: {
modelValue: {
type: [Boolean, Number, String],
default: 0,
},
labels: {
type: Array,
default: () => ["停用", "启用"],
},
values: {
type: Array,
default: () => [0, 1],
},
colors: {
type: Array,
default: () => ["#c1c7d7", "#275a9d"],
},
disabled: {
type: Boolean,
default: false,
},
},
emits: ['update:modelValue'],
data() {
return {
gap: 0,
box_height: 0,
circle_height: 0,
};
},
computed: {
now_index() {
if (this.values[0] == this.modelValue) {
return 0;
} else {
return 1;
}
},
now_style() {
return {
color: this.colors[this.now_index],
borderColor: this.colors[this.now_index],
};
},
now_label_style() {
return this.now_index == 0
? { left: this.circle_height + this.gap + 5 + "px" }
: { left: "10px" };
},
now_circle_style() {
return this.now_index == 0
? {
left: this.gap + "px",
backgroundColor: this.colors[this.now_index],
}
: {
right: this.gap + "px",
backgroundColor: this.colors[this.now_index],
};
},
},
methods: {
switch_data() {
if (this.disabled) {
return;
}
if (this.values[0] == this.modelValue) {
this.$emit("update:modelValue", this.values[1]);
} else {
this.$emit("update:modelValue", this.values[0]);
}
},
},
mounted() {
this.box_height = this.$refs.bg_switch.offsetHeight;
this.circle_height = this.$refs.circle.offsetHeight;
this.gap = (this.box_height - this.circle_height - 4) / 2;
},
};
</script>
<template>
<div class="bg-tab" v-show="showTab">
<div class="tab-title" v-if="!isTabs">
<h3>{{ label }}</h3>
</div>
<div class="tab-content">
<slot />
</div>
</div>
</template>
<script>
export default {
name: "BgTab",
inject: {
getActiveName: {
type: Function,
default: () => {
return this.$parent.activeName;
},
},
getIsTabs: {
type: Function,
default: () => {
return false;
},
},
},
props: {
label: {
type: String,
required: true,
},
name: {
type: String,
required: true,
},
},
computed: {
activeName() {
return this.getActiveName();
},
isTabs() {
return this.getIsTabs();
},
showTab() {
if (this.isTabs) {
if (this.activeName === this.name) {
return true;
} else {
return false;
}
} else {
return true;
}
},
},
};
</script>
<template>
<a class="bg-table-btn" :class="{ disabled: disabled }" @click="clickAction">
<slot />
</a>
</template>
<script>
export default {
name: "BgTableBtn",
props: {
disabled: {
type: Boolean,
default: false,
},
click: {
type: Function,
default: () => null,
},
},
emits: ["click"],
methods: {
clickAction() {
if (this.disabled) {
return;
}
this.$emit("click");
this.click && this.click();
},
},
};
</script>
<template>
<el-table
ref="table"
class="bg-table bg-table-pro"
:class="{ 'bg-table-tree': !!rowKey }"
v-bind="$attrs"
:data="data"
:row-key="rowKey"
:tree-props="treeProps"
@selection-change="selectionChange"
:default-expand-all="defaultExpandAll"
>
<el-table-column width="60" v-if="showIndex">
<template v-slot:header>
<p style="width: 100%; text-align: center">序号</p>
</template>
<template v-slot:default="{ $index }">
<p style="width: 100%; text-align: center">{{ $index + 1 }}</p>
</template>
</el-table-column>
<el-table-column
type="selection"
:selectable="selectable"
width="60"
align="center"
v-if="showSelctColumn"
/>
<el-table-column
v-for="(header, index) in headers"
:key="`col_${index}`"
:width="header.width"
:label="header.label"
:align="header.align"
:show-overflow-tooltip="!$slots[header.prop]"
:fixed="header.fixed"
>
<template v-slot:header>
<template v-if="$slots[`header-${header.prop}`]">
<slot :name="`header-${header.prop}`" />
</template>
<template v-else>
<p class="text-clip">
<span v-if="header.required" style="color: #d75138">*</span>
{{ header.label }}
</p>
</template>
</template>
<template v-slot:default="{ row, $index }">
<template v-if="$slots[header.prop]">
<slot :name="header.prop" :row="row" :index="$index" />
</template>
<template v-else-if="$slots[`text-${header.prop}`]">
<p class="text-clip">
<slot :name="`text-${header.prop}`" :row="row" :index="$index" />
</p>
</template>
<template v-else>
<p class="text-clip">{{ row[header.prop] }}</p>
</template>
</template>
</el-table-column>
</el-table>
</template>
<script>
export default {
name: "BgTablePro",
props: {
headers: {
type: Array,
require: true,
},
data: {
type: Array,
},
rowKey: {
type: String,
},
treeProps: {
type: Object,
},
showIndex: {
type: Boolean,
default: false,
},
selectable: {
type: Function,
},
defaultExpandAll: {
type: Boolean,
default: false,
},
},
data() {
return {
allSelection: [], // 所有页面上的选中的数据
};
},
computed: {
showSelctColumn() {
return (
this.$attrs &&
(this.$attrs["selection-change"] || this.$attrs["select"])
);
}, // 是否显示选中列
addSelectEvent() {
return this.$attrs && this.$attrs["select"];
}, // 是否监听select事件 select事件会记录所有页面上的选中的数据
},
watch: {
data: {
handler() {
this.recoverSelection();
},
deep: true,
},
},
methods: {
recoverSelection() {
let selectionIds = this.allSelection.map((v) => v[this.rowKey]);
this.data.forEach((v) => {
if (selectionIds.indexOf(v[this.rowKey]) > -1) {
this.$nextTick(() => {
console.log({ ...v });
this.$refs.table.toggleRowSelection(v, true);
});
}
});
}, // 恢复选中
selectionChange(selection) {
if (!this.addSelectEvent) return; // 如果用户未监听select事件,则不执行
if (!this.rowKey) throw Error("监听select事件时,row-key必须传入!");
this.upAllSelection(selection);
this.$emit("select", this.allSelection);
}, // select事件
upAllSelection(selection) {
let rowIds = this.data.map((v) => v[this.rowKey]);
let allSelection = [...this.allSelection];
let selectionIds = allSelection.map((v) => v[this.rowKey]);
// 首先把当前页的选中全部移除
selectionIds = selectionIds.filter((v) => rowIds.indexOf(v) === -1);
// allSelection仅保留selectionIds存在的
allSelection = allSelection.filter(
(v) => selectionIds.indexOf(v[this.rowKey]) > -1
);
// 然后再加入当前页的选中
allSelection.push(...selection);
this.allSelection = allSelection;
}, // 更新当前全部被选中的数据
clearSelection() {
this.$refs.table.clearSelection();
this.allSelectio = [];
}, // 清空选中
getRowInfo(row, key) {
let currentIndex = -1;
let parentRows = null;
let propPath = "";
let childrenKey = this.treeProps.children;
let recursionItems = (items, prop) => {
for (let i = 0; i < items.length; i++) {
let item = items[i];
propPath += `${i}.`;
if (item[prop] === row[prop]) {
currentIndex = i;
parentRows = items;
break;
} else if (item[childrenKey] && item[childrenKey].length > 0) {
propPath += `${childrenKey}.`;
recursionItems(item[childrenKey], prop);
}
}
};
recursionItems(this.data, key, "");
return {
index: currentIndex,
rows: parentRows,
$_prop_path: propPath,
};
},
},
};
</script>
\ No newline at end of file
<template>
<el-table
ref="table"
class="bg-table"
:data="rows"
@selection-change="selectAction"
@select="selectActionRow"
@select-all="selectActionAll"
:stripe="stripe"
>
<template v-slot:empty>
<div class="empty_container">
<img src="../assets/imgs/img-no-data.png" alt="">
<div class="text">
暂无数据
</div>
</div>
</template>
<el-table-column
type="selection"
:selectable="selectable"
width="80"
align="center"
v-if="select"
>
<!-- checkbox -->
</el-table-column>
<el-table-column
v-if="isIndex"
type="index"
:label="indexLabel"
width="80"
align="center"
>
<!-- 序号 -->
</el-table-column>
<el-table-column
v-for="(header, index) in headers"
:width="header.width"
:min-width="header.minWidth"
:align="header.align"
:key="'col_' + index"
:fixed="header.fixed"
show-overflow-tooltip
>
<template v-slot:header>
<template v-if="$slots[`header-${header.prop}`]">
<slot :name="`header-${header.prop}`" />
</template>
<p class="text-clip" v-else>{{ header.label }}</p>
</template>
<template v-slot:default="{ row }">
<slot v-if="$slots[header.prop]" :name="header.prop" :row="row" />
<template v-else>
<!-- {{ row[header.prop] | ellipsis(header.max) }} -->
{{ row[header.prop] }}
</template>
</template>
</el-table-column>
</el-table>
</template>
<script>
import { selectTableMixin } from './hook/mixin-select-table'
export default {
name: "BgTable",
setup() {
const {
nowSelectData,
allSelectData,
selectData,
initSelectTableData,
runPage,
dealSelectData
} = selectTableMixin()
return {
nowSelectData,
allSelectData,
selectData,
initSelectTableData,
runPage,
dealSelectData
}
},
props: {
headers: {
type: Array,
require: true,
},
rows: {
type: Array,
default: () => [],
},
select: {
type: Boolean,
default: false,
},
selectable: {
type: Function,
},
isIndex: {
type: Boolean,
default: false
},
indexLabel: {
type: String,
default: "序号"
},
stripe: {
type: Boolean,
default: false
}
},
/* filters: {
ellipsis(value, max) {
if (!value) {
return "";
} else if (max && value.length > max) {
return value.slice(0, max - 1) + "...";
} else {
return value;
}
},
}, */
watch:{
rows(n,o){
if(n.length&&this.select){
this.runPage()
this.initSelectTableData(n).then((selectData)=>{
if(selectData.length){
setTimeout(()=>{
this.toggleRowArrSelection(selectData)
})
}
})
}
}
},
created(){
console.log(this.$attrs)
},
methods: {
toggleRowSelection(row, flag = true) {
this.$refs.table.toggleRowSelection(row, flag);
},
selectAction(selection) {
this.$emit("selectAc", {allLength:Object.keys(this.allSelectData).length+this.nowSelectData.length,selection});
},
clearSelection() {
this.$refs.table.clearSelection();
this.$emit("select", {allLength:Object.keys(this.allSelectData).length+this.nowSelectData.length,selection:[]});
},
setSelectedRow(row) {
this.$refs.table.toggleRowSelection(row);
},
toggleRowArrSelection(arr, flag = true){
arr.forEach(e => {
this.$refs.table.toggleRowSelection(e, flag);
});
},
selectActionRow(selection,row){
this.selectData(selection)
this.$emit("select", {allLength:Object.keys(this.allSelectData).length+this.nowSelectData.length,selection});
},
selectActionAll(selection){
this.selectData(selection)
this.$emit("select", {allLength:Object.keys(this.allSelectData).length+this.nowSelectData.length,selection});
},
clearTable(){//清除选中数据,在页面状态更新时使用
this.allSelectData={}
this.nowSelectData=[]
this.clearSelection();
}
},
};
</script>
<template>
<div class="bg-tabs nice-tabs">
<div class="bg-tabs-nav">
<ul>
<li
v-for="(item, index) in calcTabs()"
:key="'tab_' + index"
:class="{
current: modelValue === item.name,
}"
@click="changeActiveName(item, index)"
>
{{ item.label }}
</li>
<li>
<!-- empty -->
</li>
</ul>
</div>
<div class="bg-tabs-content">
<slot />
</div>
<div class="bg-tabs-action" v-if="$slots.action">
<slot name="action" />
</div>
</div>
</template>
<script>
export default {
name: "BgTabs",
provide() {
return {
getActiveName: () => {
return this.modelValue;
},
getIsTabs: () => {
return true;
},
};
},
props: {
modelValue: {
type: String,
default: '',
},
},
emits: ['update:modelValue'],
data() {
return {
isTabs: true,
};
},
methods: {
calcTabs() {
let tabSlots = [];
if (this.$slots.default) {
tabSlots = this.$slots.default
.filter(
(vnode) =>
vnode.tag &&
vnode.componentOptions &&
vnode.componentOptions.Ctor.options.name === "BgTab"
)
.map((vnode) => vnode.componentOptions.propsData);
}
return tabSlots;
},
changeActiveName({ name }) {
this.$emit("update:modelValue", name);
},
},
};
</script>
<template>
<div class="bg-tags">
<ul>
<li v-for="(tag, index) in tags" :key="'tag_' + index" class="tag-item">
<span>
{{ tag }}
</span>
<a @click="deleteTag(index)" v-if="!disabled">
<i class="el-icon-close"></i>
</a>
</li>
<li v-if="!disabled">
<el-button
type="primary2"
size="mini"
@click="showInput = true"
v-if="!showInput"
>
新增
</el-button>
<el-input v-model="newTag" @blur="addTag" v-else />
</li>
</ul>
</div>
</template>
<script>
export default {
name: "BgTags",
model: {
prop: "value",
event: "change",
},
props: {
value: {
type: String,
default: "",
},
disabled: {
type: Boolean,
default: false,
},
},
data() {
return {
newTag: "",
showInput: false,
};
},
computed: {
tags() {
return (this.value && this.value.split(",")) || [];
},
},
methods: {
deleteTag(index) {
let tags = [...this.tags];
tags.splice(index, 1);
this.$emit("change", tags.join(","));
},
addTag() {
let tags = [...this.tags];
if (this.newTag) {
tags.push(this.newTag);
}
this.$emit("change", tags.join(","));
this.newTag = "";
this.showInput = false;
},
},
};
</script>
<template>
<el-upload
ref="upload"
class="bg-upload"
v-bind="$attrs"
:file-list="fileList"
:action="action"
:data="{
directory: 'image',
uniqueCode: false
}"
:auto-upload="autoUpload"
:list-type="listType"
:limit="limit"
:accept="acceptTypes"
:before-upload="handleBeforeUpload"
:on-success="handleSuccess"
:on-remove="handleRemove"
:on-preview="handlePreview"
:multiple="multiple"
>
<template v-slot:trigger>
<el-icon v-if="listType === 'picture-card'"><Plus /></el-icon>
<!-- <i class="el-icon-plus" v-if="listType === 'picture-card'"></i> -->
<el-button type="primary" :icon="UploadFilled" v-else>
{{ triggerText }}
</el-button>
</template>
<template v-if="!autoUpload">
<el-button
type="success"
icon="el-icon-position"
@click="submitUpload"
style="margin-left: 16px"
>
上传到服务器
</el-button>
</template>
<template v-slot:tip v-if="showTips && tips">
<div class="el-upload__tip" style="color:#909bb6;">
{{ customTips||tips }}
</div>
</template>
</el-upload>
</template>
<script>
import {
UploadFilled
} from '@element-plus/icons-vue'
export default {
name: "BgUploadImage",
props: {
modelValue:{
type: Array,
default: () => [],
},
action: {
type: String,
default: "/apaas/static/image/upload",
},
autoUpload: {
type: Boolean,
default: true,
},
listType: {
type: String,
default: "text",
},
limit: {
type: Number,
},
multiple: {
type: Boolean,
default: true,
},
accept: {
type: [Array, String],
}, // 接受类型
fileSize: {
type: Number,
}, // 文件大小
fileSizeUnit: {
type: String,
default: "MB",
}, // 文件单位 KB/MB/GB
triggerText: {
type: String,
default: "点击上传",
}, // 按钮文字
showTips: {
type: Boolean,
default: false,
}, // 显示提示
customTips:{
type: String,
default: "",
},// 自定义提示内容
},
emits: ['update:modelValue'],
computed: {
acceptTypes() {
if (Array.isArray(this.accept)) {
return this.accept.join(",");
} else {
return this.accept;
}
},
types() {
return this.acceptTypes.split(",").filter((v) => v !== "");
},
tips() {
let str = "";
if (this.types.length > 0) {
str += `后缀为 ${this.types.join("")} `;
}
if (this.fileSize) {
if (str) str += "";
str += `大小不超过 ${this.fileSize}${this.fileSizeUnit}`;
}
if (str) str += "的文件";
if (this.limit) {
str += `,最多上传 ${this.limit} 个文件`;
}
if (str) {
str = "支持" + str;
}
return str;
},
},
data() {
return {
fileList: [],
UploadFilled,
};
},
watch: {
modelValue() {
let newStr = this.modelValue.map((v) => v.url).join(",");
let oldStr = this.fileList
.map((v) => (v.response && v.response.data) || v.url)
.join(",");
if (newStr !== oldStr) {
this.fileList = [...this.modelValue];
}
},
},
methods: {
handleBeforeUpload(file) {
let units = {
KB: 1024,
MB: 1024 * 1024,
GB: 1024 * 1024 * 1024,
};
let temp = file.name.split(".");
let type = "." + temp[temp.length - 1].toLocaleLowerCase();
let fileTypeIsOk =
this.types.length === 0 || this.types.indexOf(type) > -1;
let fileSizeIsOk =
this.fileSize === 0 ||
this.fileSize === undefined ||
file.size / units[this.fileSizeUnit] <= this.fileSize;
let checked = fileTypeIsOk && fileSizeIsOk;
if (!checked) {
this.$message.error(this.tips);
}
return checked;
},
handleSuccess(response, file, fileList) {
this.updateFileList(fileList);
},
handleRemove(file, fileList) {
this.updateFileList(fileList);
},
handlePreview({ name, url }) {
let a = document.createElement("a"); // 生成一个a元素
let event = new MouseEvent("click"); // 创建一个单击事件
a.download = name; // 设置图片名称
a.href = url; // 将生成的URL设置为a.href属性
a.dispatchEvent(event); // 触发a的单击事件
},
updateFileList(fileList) {
let values = fileList.map((v) => {
return {
name: v.name,
url: (v.response && v.response.data) || v.url,
};
});
this.fileList = fileList;
console.log(values);
this.$emit("update:modelValue", values);
},
submitUpload() {
this.$refs.upload.submit();
},
},
mounted() {
this.fileList = [...this.modelValue];
},
};
</script>
<template>
<div
class="bg-upload"
:class="{ 'is-disabled': actionDisabled, 'is-easy': isEasy }"
>
<el-upload
action="/apaas/static/file/upload"
:data="{
directory: 'file',
uniqueCode: false,
}"
:before-upload="handleBeforeUpload"
:on-exceed="handleExceed"
:on-success="handleSuccess"
:on-preview="handlePreview"
:on-remove="handleRemove"
:file-list="fileList"
:limit="limit"
:disabled="actionDisabled"
style="max-width: 600px"
multiple
>
<!-- <el-button type="primary">
上传附件
</el-button>
<div class="el-upload__tip" slot="tip">
支持上传{{ fileTypes.join("") }},最大{{ fileMaxSize }}M
</div> -->
<template v-if="isEasy">
<el-button type="primary" size="mini">
<bg-icon
:icon="`#${triggerIcon}`"
v-if="triggerIcon"
style="margin-right: 8px"
/>
{{ triggerText }}
</el-button>
</template>
<div class="trigger-content" v-else>
<div class="trigger-icon">
<img src="./imgs/ic_updata_cloud.png" />
</div>
<p class="trigger-tip" style="text-align: center" v-if="customTips">
<slot></slot>
</p>
<p class="trigger-tip" v-else>
1.最多允许上传{{ limit }}个附件 <br />
2.单个附件最大{{ fileMaxSize }}M; <br />
3.允许上传后缀为传{{ fileTypes.join("、") }} <br />
</p>
</div>
<template v-slot:tip v-if="otherInfo != ''">
<div class="el-upload__tip" style="color: #909bb6">
{{ otherInfo }}
</div>
</template>
</el-upload>
</div>
</template>
<script>
export default {
name: "BgUpload",
// model: {
// prop: "value",
// event: "change",
// },
props: {
modelValue: {
type: Array,
default: () => [],
},
limit: {
type: Number,
},
fileTypes: {
type: Array,
default: () => [
"doc",
"docx",
"xls",
"xlsx",
"pdf",
"jpg",
"jpeg",
"png",
],
},
fileMaxSize: {
type: Number,
default: 20, // 单位:M
},
disabled: {
type: Boolean,
default: false,
},
refresh: {
type: Boolean,
default: false,
}, // 是否重新初始化附件(手动刷新组件的附件列表)
customTips: {
type: Boolean,
default: false,
}, // 是否自定义提示
isEasy: {
type: Boolean,
default: false,
},
triggerText: {
type: String,
default: "请上传",
},
triggerIcon: {
type: String,
default: "bg-ic-file",
},
otherInfo: {
type: String,
default: "",
},
},
emits: ["update:modelValue"],
data() {
return {
fileList: [],
};
},
computed: {
actionDisabled() {
return this.disabled || this.fileList.length === this.limit;
},
},
watch: {
modelValue() {
let newStr = this.modelValue.map((v) => v.url).join(",");
let oldStr = this.fileList
.map((v) => (v.response && v.response.data) || v.url)
.join(",");
if (newStr !== oldStr) {
this.fileList = [...this.modelValue];
}
},
},
methods: {
initFileList() {
let urls = (this.value && this.value.split(",")) || [];
this.fileList = urls.map((url, index) => {
let temp = url.split("/");
let name = temp[temp.length - 1] || `附件_${index + 1}`;
return { name, url };
});
this.$emit("update:refresh", false);
},
handleBeforeUpload(file) {
let temp = file.name.split(".");
let type = temp[temp.length - 1].toLocaleLowerCase();
let fileTypesOk = this.fileTypes.indexOf(type) > -1;
let fileMaxSizeOk = file.size / 1024 / 1024 <= this.fileMaxSize;
if (!fileTypesOk) {
this.$message.error(
`上传文件只能是${this.fileTypes.join("")}这些格式!`
);
}
if (!fileMaxSizeOk) {
this.$message.error(`上传文件大小不能超过${this.fileMaxSize}M!`);
}
return fileTypesOk && fileMaxSizeOk;
},
handleExceed(file, fileList) {
console.log(file, fileList);
},
handlePreview(val) {
let a = document.createElement("a"); // 生成一个a元素
let event = new MouseEvent("click"); // 创建一个单击事件
a.download = val.name; // 设置图片名称
a.href = val.url || val.response.data; // 将生成的URL设置为a.href属性
a.dispatchEvent(event); // 触发a的单击事件
},
handleRemove(file, fileList) {
this.updateFileList(fileList);
},
handleSuccess(response, file, fileList) {
this.updateFileList(fileList);
},
updateFileList(fileList) {
let values = fileList.map((v) => {
return {
name: v.name,
url: (v.response && v.response.data) || v.url,
};
});
this.fileList = fileList;
this.$emit("update:modelValue", values);
this.$emit("change");
},
},
mounted() {
this.fileList = [...this.modelValue];
},
};
</script>
<template>
<div class="bg-upload-image user-upload-image">
<el-upload
action="#"
ref="upload"
:auto-upload="false"
:on-change="onChangeFile"
:file-list="fileList"
:disabled="disabled"
>
<template v-slot:trigger>
<div class="trigger-content">
<div class="image-trigger" v-if="modelValue">
<img :src="modelValue" />
<div class="refresh-image">
<i class="el-icon-refresh-right"></i>
</div>
</div>
<div class="upload-trigger" v-else>
<span class="upload-icon"></span>
</div>
</div>
</template>
</el-upload>
</div>
</template>
<script>
export default {
name: "BgUploadImage",
props: {
modelValue: {
type: String,
default: "",
},
disabled:{
type:Boolean,
default:false
}
},
emits: ['update:modelValue'],
data(){
return{
fileList:[]
}
},
created(){
},
methods: {
handleAvatarSuccess({ data }) {
this.$emit("update:modelValue", data.visitURL);
},
beforeAvatarUpload(file) {
const isJPG = file.type === "image/jpeg" || file.type === "image/png";
const isLt1M = file.size / 1024 / 1024 < 1;
if (!isJPG) {
this.$message.error("上传的图片只能是 JPG、PNG 格式!");
}
if (!isLt1M) {
this.$message.error("上传的图片大小不能超过 1MB!");
}
return isJPG && isLt1M;
},
onChangeFile(file, fileList){
console.log(file, fileList);
if(!this.beforeAvatarUpload(file.raw)){
return
}
var reader = new FileReader();
reader.readAsDataURL(file.raw); // 一定要传入file格式
reader.onload = () => {
this.$emit("update:modelValue", reader.result);
};
}
},
};
</script>
<style scoped>
.user-upload-image :deep() .el-upload-list{
display: none;
}
</style>
// debounce.js
/**
* 防抖与节流
* @param {function} func 执行函数
* @param {number} time 防抖节流时间
* @param {string} type debounce为防抖,throttle为节流,否则为立即执行
* @param {this} ctx this 的指向
*/
const debounce = (func, time, type, ctx) => {
var timer, lastCall, rtn
// 防抖函数
if (type === 'debounce') {
rtn = (...params) => {
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
func.apply(ctx, params)
}, time)
}
} else if (type === 'throttle') {
// 节流函数
rtn = (...params) => {
const now = new Date().getTime()
if (now - lastCall < time && lastCall) return
lastCall = now
func.apply(ctx, params)
}
} else {
// 立即执行的防抖函数
rtn = (...params) => {
if (timer) clearTimeout(timer)
let callNow = !timer
timer = setTimeout(() => {
timer = null
}, time)
if (callNow) func.apply(ctx, params)
}
}
return rtn
}
export default {
name: 'Debounce',
abstract: true,
props: {
time: {
type: Number,
default: 1000,
},
events: {
type: String,
default: 'click', // 默认点击事件
},
type: {
type: String,
default: 'throttle', // 默认节流
},
},
created() {
this.eventKeys = this.events.split(',') // 分隔事件
this.originMap = {} // 储存事件,用于重新render时与子事件的对比
this.debouncedMap = {} // 储存防抖节流事件
},
render() {
try {
const vnode = this.$slots.default[0]
this.eventKeys.forEach(key => {
const target = vnode.data.on[key]
if (target === this.originMap[key] && this.debouncedMap[key]) {
vnode.data.on[key] = this.debouncedMap[key]
} else if (target) {
this.originMap[key] = target
this.debouncedMap[key] = debounce(target, this.time, this.type, vnode)
vnode.data.on[key] = this.debouncedMap[key] // 重写子组件的事件
}
})
return vnode
} catch (error) {}
},
}
\ No newline at end of file
import { reactive, toRefs,useAttrs } from 'vue'
export function selectTableMixin(){
const state = reactive({
nowSelectData:[],
allSelectData:{}
})
const attrs = useAttrs()
// const nowSelectData = reactive([])
// const allSelectData = reactive({})
const selectData = (val)=>{
console.log(val);
state.nowSelectData = val
console.log('allSelectData');
console.log(state.allSelectData);
console.log(Object.keys(state.allSelectData).length);
}
const initSelectTableData = (data)=>{
return new Promise((reslove,reject)=>{
data.forEach(e => {
if(state.allSelectData[e[attrs.rowKey||'id']]){
delete state.allSelectData[e[attrs.rowKey||'id']]
state.nowSelectData.push(e)
}
});
console.log(state.nowSelectData);
reslove(state.nowSelectData)
})
}
const runPage=()=>{//翻页数据推进
state.nowSelectData.forEach(e => {
state.allSelectData[e[attrs.rowKey||'id']] = e
});
state.nowSelectData = []
}
const clearTable=()=>{//清除选中数据,在页面状态更新时使用
state.allSelectData={}
state.nowSelectData=[]
clearSelection();
}
const dealSelectData=()=>{//最后提交处理数据
state.nowSelectData.forEach(e => {
state.allSelectData[e[attrs.rowKey||'id']] = e
});
return state.allSelectData
}
const { nowSelectData, allSelectData } = toRefs(state)
return{
nowSelectData,
allSelectData,
selectData,
initSelectTableData,
runPage,
clearTable,
dealSelectData
}
}
// export const selectTableMixin = {
// data(){
// return{
// nowSelectData:[],//声明现在选中数组
// allSelectData:{},//全部选中数据obj
// }
// },
// methods: {
// selectData(val){//选中赋值
// console.log(val);
// this.nowSelectData = val
// console.log('allSelectData');
// console.log(this.allSelectData);
// console.log(Object.keys(this.allSelectData).length);
// },
// initSelectTableData(data){//初始化选中table数据
// data.forEach(e => {
// if(this.allSelectData[e.id]){
// delete this.allSelectData[e.id]
// this.nowSelectData.push(e)
// }
// });
// console.log(this.nowSelectData);
// if(this.nowSelectData.length){
// setTimeout(()=>{
// this.toggleRowArrSelection(this.nowSelectData)
// })
// }
// },
// runPage(){//翻页数据推进
// this.nowSelectData.forEach(e => {
// this.allSelectData[e.id] = e
// });
// this.nowSelectData = []
// },
// clearTable(){//清除选中数据,在页面状态更新时使用
// this.allSelectData={}
// this.nowSelectData=[]
// this.clearSelection();
// },
// dealSelectData(){//最后提交处理数据
// this.nowSelectData.forEach(e => {
// this.allSelectData[e.id] = e
// });
// return this.allSelectData
// }
// },
// }
\ No newline at end of file
!function(a){var t,h,l,o,i,e='<svg><symbol id="bg-ic-layers" viewBox="0 0 1024 1024"><path d="M512 526.08a45.653333 45.653333 0 0 1-18.346667-3.84l-426.666666-201.813333a42.666667 42.666667 0 0 1 0-77.226667l426.666666-196.693333a42.666667 42.666667 0 0 1 35.84 0l426.666667 196.693333a42.666667 42.666667 0 0 1 0 77.226667l-426.666667 201.813333a45.653333 45.653333 0 0 1-17.493333 3.84zM186.026667 282.453333L512 436.48l325.973333-154.026667L512 132.266667z" ></path><path d="M512 753.92a38.4 38.4 0 0 1-17.92-4.266667l-426.666667-198.826666a42.666667 42.666667 0 0 1 35.84-77.653334L512 663.893333l408.746667-190.72a42.666667 42.666667 0 0 1 35.84 77.653334l-426.666667 198.826666a38.4 38.4 0 0 1-17.92 4.266667z" ></path><path d="M512 981.333333a42.666667 42.666667 0 0 1-17.92-3.84l-426.666667-199.253333a42.666667 42.666667 0 1 1 35.84-77.226667L512 891.733333l408.746667-190.72a42.666667 42.666667 0 1 1 35.84 77.226667l-426.666667 199.253333A42.666667 42.666667 0 0 1 512 981.333333z" ></path></symbol><symbol id="bg-ic-arrow-down" viewBox="0 0 1026 1024"><path d="M518.60608 768a145.066667 145.066667 0 0 1-89.6-31.573333L38.60608 426.666667a96 96 0 1 1 119.466667-150.186667l360.106666 285.866667 351.573334-285.013334a96 96 0 0 1 121.173333 149.333334l-381.013333 308.906666a143.36 143.36 0 0 1-91.306667 32.426667z" ></path></symbol><symbol id="bg-ic-caret-bottom" viewBox="0 0 1024 1024"><path d="M443.7568 819.2L13.6768 270.08A61.013333 61.013333 0 0 1 57.623467 170.666667h909.653333a61.013333 61.013333 0 0 1 42.666667 99.413333L581.143467 819.2a85.333333 85.333333 0 0 1-137.386667 0z" ></path></symbol><symbol id="bg-ic-caret-top" viewBox="0 0 1024 1024"><path d="M443.821653 204.8L13.741653 753.92a61.013333 61.013333 0 0 0 42.666667 99.413333h910.933333a61.013333 61.013333 0 0 0 42.666667-99.413333L581.20832 204.8a85.333333 85.333333 0 0 0-137.386667 0z" ></path></symbol><symbol id="bg-ic-eye" viewBox="0 0 1024 1024"><path d="M1015.466667 486.826667c-8.96-11.946667-226.133333-294.826667-503.466667-294.826667S17.493333 474.88 8.533333 486.826667a42.666667 42.666667 0 0 0 0 50.346666c8.96 11.946667 226.133333 294.826667 503.466667 294.826667s494.506667-282.88 503.466667-294.826667a42.666667 42.666667 0 0 0 0-50.346666zM512 747.946667c-190.293333 0-357.12-170.666667-414.293333-235.946667C154.88 446.72 321.706667 276.053333 512 276.053333s357.12 170.666667 414.293333 235.946667c-57.173333 65.28-224 235.946667-414.293333 235.946667z" ></path><path d="M512 354.133333a157.866667 157.866667 0 1 0 160 157.866667A159.146667 159.146667 0 0 0 512 354.133333z m0 231.68A73.813333 73.813333 0 1 1 586.666667 512 74.666667 74.666667 0 0 1 512 585.813333z" ></path></symbol><symbol id="bg-ic-caret-right" viewBox="0 0 1024 1024"><path d="M819.045454 580.401198L270.201705 1010.264833a60.982639 60.982639 0 0 1-99.36332-42.645202V57.144571a60.982639 60.982639 0 0 1 99.36332-42.645202L819.045454 443.083648a85.290404 85.290404 0 0 1 0 137.31755z" ></path></symbol><symbol id="bg-ic-caret-left" viewBox="0 0 1024 1024"><path d="M204.954546 580.401198l548.843749 429.863635a60.982639 60.982639 0 0 0 99.36332-42.645202V57.144571a60.982639 60.982639 0 0 0-99.36332-42.645202L204.954546 443.083648a85.290404 85.290404 0 0 0 0 137.31755z" ></path></symbol><symbol id="bg-ic-arrow-up" viewBox="0 0 1024 1024"><path d="M96 768a96 96 0 0 1-59.733333-170.666667L426.666667 287.573333a146.346667 146.346667 0 0 1 182.186666 0l379.733334 309.76a96 96 0 1 1-121.173334 149.333334l-351.573333-285.44-360.106667 285.866666a95.146667 95.146667 0 0 1-59.733333 20.906667z" ></path></symbol><symbol id="bg-ic-folder" viewBox="0 0 1024 1024"><path d="M853.333333 938.666667H170.666667a128 128 0 0 1-128-128V213.333333a128 128 0 0 1 128-128h215.893333a128 128 0 0 1 98.56 46.08l55.466667 66.56a42.666667 42.666667 0 0 0 32.853333 15.36H853.333333a128 128 0 0 1 128 128v469.333334a128 128 0 0 1-128 128zM170.666667 170.666667a42.666667 42.666667 0 0 0-42.666667 42.666666v597.333334a42.666667 42.666667 0 0 0 42.666667 42.666666h682.666666a42.666667 42.666667 0 0 0 42.666667-42.666666V341.333333a42.666667 42.666667 0 0 0-42.666667-42.666666h-279.893333a128 128 0 0 1-98.56-46.08l-55.466667-66.56A42.666667 42.666667 0 0 0 386.56 170.666667z" ></path></symbol><symbol id="bg-ic-s-folder" viewBox="0 0 1024 1024"><path d="M874.666667 938.666667h-725.333334A106.666667 106.666667 0 0 1 42.666667 832v-640A106.666667 106.666667 0 0 1 149.333333 85.333333h237.226667a128 128 0 0 1 98.56 46.08l29.866667 35.84A128 128 0 0 0 613.12 213.333333h261.546667A106.666667 106.666667 0 0 1 981.333333 320v512a106.666667 106.666667 0 0 1-106.666666 106.666667z" ></path></symbol><symbol id="bg-ic-s-folder-opened" viewBox="0 0 1024 1024"><path d="M984.746667 438.186667a85.333333 85.333333 0 0 0-66.986667-32.853334h-11.093333V341.333333a106.666667 106.666667 0 0 0-106.666667-106.666666h-226.56a42.666667 42.666667 0 0 1-32.853333-15.36l-55.466667-66.56A128 128 0 0 0 386.56 106.666667H149.333333a128 128 0 0 0-128 128v645.12a42.666667 42.666667 0 0 0 0 7.253333 36.693333 36.693333 0 0 0 7.253334 8.96v3.84a47.786667 47.786667 0 0 0 10.24 8.106667 14.08 14.08 0 0 0 4.266666 2.56 39.253333 39.253333 0 0 0 17.493334 4.266666h768A85.333333 85.333333 0 0 0 913.493333 853.333333l85.333334-341.333333a85.333333 85.333333 0 0 0-14.08-73.813333zM118.613333 469.333333l-11.946666 50.346667V234.666667a42.666667 42.666667 0 0 1 42.666666-42.666667h237.226667a42.666667 42.666667 0 0 1 32.853333 15.36l55.466667 66.56a128 128 0 0 0 98.56 46.08h226.56a21.333333 21.333333 0 0 1 21.333333 21.333333v64H201.386667A85.333333 85.333333 0 0 0 118.613333 469.333333z" ></path></symbol><symbol id="bg-ic-folder-opened" viewBox="0 0 1024 1024"><path d="M984.746667 438.186667a85.333333 85.333333 0 0 0-66.986667-32.853334h-11.093333V341.333333a106.666667 106.666667 0 0 0-106.666667-106.666666h-226.56a42.666667 42.666667 0 0 1-32.853333-15.36l-55.466667-66.56A128 128 0 0 0 386.56 106.666667H149.333333a128 128 0 0 0-128 128v645.12a42.666667 42.666667 0 0 0 0 7.253333 29.866667 29.866667 0 0 0 7.253334 8.96v4.266667h2.133333a42.666667 42.666667 0 0 0 9.386667 8.106666 25.6 25.6 0 0 0 4.693333 2.56 39.253333 39.253333 0 0 0 17.493333 4.266667h768A85.333333 85.333333 0 0 0 913.493333 853.333333l85.333334-341.333333a85.333333 85.333333 0 0 0-14.08-73.813333zM149.333333 192h237.226667a42.666667 42.666667 0 0 1 32.853333 15.36l55.466667 66.56a128 128 0 0 0 98.56 46.08h226.56a21.333333 21.333333 0 0 1 21.333333 21.333333v64H201.386667A85.333333 85.333333 0 0 0 118.613333 469.333333l-11.946666 50.346667V234.666667a42.666667 42.666667 0 0 1 42.666666-42.666667z m682.666667 640H118.186667l83.2-341.333333H917.333333z" ></path></symbol><symbol id="bg-ic-s-circle-warning" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m0 805.546667a64 64 0 1 1 64-64 64 64 0 0 1-64 64z m64-270.933334a64 64 0 1 1-128 0V239.786667a64 64 0 0 1 128 0z" ></path></symbol><symbol id="bg-ic-s-circle-check" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m243.626667 456.96l-256 256a42.666667 42.666667 0 0 1-60.586667 0l-170.666667-170.666667a42.666667 42.666667 0 0 1 60.586667-60.586666l140.373333 140.8 225.706667-226.133334a42.666667 42.666667 0 0 1 60.586667 60.586667z" ></path></symbol><symbol id="bg-ic-circle-warning" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m0 938.666667a426.666667 426.666667 0 1 1 426.666667-426.666667 426.666667 426.666667 0 0 1-426.666667 426.666667z" ></path><path d="M512 736m-53.333333 0a53.333333 53.333333 0 1 0 106.666666 0 53.333333 53.333333 0 1 0-106.666666 0Z" ></path><path d="M512 640a42.666667 42.666667 0 0 0 42.666667-42.666667V256a42.666667 42.666667 0 0 0-85.333334 0v341.333333a42.666667 42.666667 0 0 0 42.666667 42.666667z" ></path></symbol><symbol id="bg-ic-s-circle-question" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m0 802.56a53.333333 53.333333 0 1 1 53.333333-53.333333A53.333333 53.333333 0 0 1 512 802.56z m53.333333-245.333333V597.333333a53.333333 53.333333 0 0 1-106.666666 0v-85.333333A53.333333 53.333333 0 0 1 512 458.666667 74.666667 74.666667 0 1 0 437.333333 384a53.333333 53.333333 0 0 1-106.666666 0 181.333333 181.333333 0 1 1 234.666666 173.226667z" ></path></symbol><symbol id="bg-ic-circle-question" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m0 938.666667a426.666667 426.666667 0 1 1 426.666667-426.666667 426.666667 426.666667 0 0 1-426.666667 426.666667z" ></path><path d="M512 226.56a170.666667 170.666667 0 0 0-170.666667 170.666667 42.666667 42.666667 0 1 0 85.333334 0 85.333333 85.333333 0 1 1 85.333333 85.333333 42.666667 42.666667 0 0 0-42.666667 42.666667v85.333333a42.666667 42.666667 0 1 0 85.333334 0v-47.786667a170.666667 170.666667 0 0 0-42.666667-336.213333z" ></path><path d="M512 749.226667m-53.333333 0a53.333333 53.333333 0 1 0 106.666666 0 53.333333 53.333333 0 1 0-106.666666 0Z" ></path></symbol><symbol id="bg-ic-s-circle-close" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m200.96 652.373333a42.666667 42.666667 0 0 1 0 60.586667 42.666667 42.666667 0 0 1-60.586667 0L512 572.16l-140.373333 140.8a42.666667 42.666667 0 0 1-60.586667 0 42.666667 42.666667 0 0 1 0-60.586667l140.8-140.373333-140.8-140.373333a42.666667 42.666667 0 1 1 60.586667-60.586667l140.373333 140.8 140.373333-140.8a42.666667 42.666667 0 1 1 60.586667 60.586667L572.16 512z" ></path></symbol><symbol id="bg-ic-minus" viewBox="0 0 1024 1024"><path d="M917.333333 576h-810.666666a64 64 0 0 1 0-128h810.666666a64 64 0 0 1 0 128z" ></path></symbol><symbol id="bg-ic-history" viewBox="0 0 1024 1024"><path d="M255.983574 320.04517H85.327858a42.663929 42.663929 0 0 1-42.663929-42.663929v-170.655716a42.663929 42.663929 0 0 1 85.327858 0v127.991787h127.991787a42.663929 42.663929 0 0 1 0 85.327858z" ></path><path d="M511.967149 1024A511.967149 511.967149 0 0 1 0 512.032851a42.663929 42.663929 0 0 1 85.327858 0 426.639291 426.639291 0 1 0 57.169665-213.319645A42.663929 42.663929 0 0 1 85.327858 314.07222 42.663929 42.663929 0 0 1 68.688926 256.049277 511.967149 511.967149 0 1 1 511.967149 1024z" ></path><path d="M711.207698 753.937329a42.663929 42.663929 0 0 1-30.29139-12.372539l-199.240549-199.240549A42.663929 42.663929 0 0 1 469.30322 512.032851V230.450919a42.663929 42.663929 0 0 1 42.663929-42.663929 42.663929 42.663929 0 0 1 42.663929 42.663929v264.089721L741.072448 682.688567a42.663929 42.663929 0 0 1-29.86475 72.955319z" ></path></symbol><symbol id="bg-ic-time" viewBox="0 0 1024 1024"><path d="M512 1024a512 512 0 1 1 512-512 512 512 0 0 1-512 512z m0-938.666667a426.666667 426.666667 0 1 0 426.666667 426.666667A426.666667 426.666667 0 0 0 512 85.333333z" ></path><path d="M716.8 753.92a42.666667 42.666667 0 0 1-29.44-11.946667l-204.8-199.253333A42.666667 42.666667 0 0 1 469.333333 512V230.4a42.666667 42.666667 0 0 1 42.666667-42.666667 42.666667 42.666667 0 0 1 42.666667 42.666667v263.68L746.666667 682.666667a42.666667 42.666667 0 0 1 0 60.586666 42.666667 42.666667 0 0 1-29.866667 10.666667z" ></path></symbol><symbol id="bg-ic-phone-call" viewBox="0 0 1024 1024"><path d="M1012.555093 298.666667a365.653333 365.653333 0 0 0-99.413333-170.666667A378.88 378.88 0 0 0 738.208427 32.426667a389.973333 389.973333 0 0 0-147.626667-7.253334 42.666667 42.666667 0 0 0 12.373333 85.333334 307.626667 307.626667 0 0 1 115.2 5.546666A292.266667 292.266667 0 0 1 853.408427 189.866667a275.626667 275.626667 0 0 1 76.373333 130.56 267.946667 267.946667 0 0 1 5.546667 110.506666 42.666667 42.666667 0 0 0 35.84 48.64h6.4a42.666667 42.666667 0 0 0 42.666666-36.266666A352.426667 352.426667 0 0 0 1012.555093 298.666667z" ></path><path d="M775.755093 459.52h6.4a42.666667 42.666667 0 0 0 42.666667-36.266667A190.293333 190.293333 0 0 0 768.075093 258.56a201.386667 201.386667 0 0 0-168.106666-54.186667 42.666667 42.666667 0 1 0 12.373333 85.333334 113.92 113.92 0 0 1 96 30.72 103.68 103.68 0 0 1 31.146667 91.306666 42.666667 42.666667 0 0 0 36.266666 47.786667zM878.58176 656.213333l-113.493333-61.44a96.426667 96.426667 0 0 0-85.333334 0l-107.52 52.48a317.44 317.44 0 0 1-128-73.813333 304.64 304.64 0 0 1-75.52-123.733333l50.346667-105.386667A92.16 92.16 0 0 0 416.928427 256L353.78176 146.346667a93.866667 93.866667 0 0 0-81.92-46.933334H141.30176A142.08 142.08 0 0 0 24.395093 158.293333 128 128 0 0 0 7.755093 277.333333c48.64 140.373333 133.973333 334.506667 264.533334 461.226667s330.24 209.493333 474.453333 256a143.786667 143.786667 0 0 0 42.666667 7.253333 135.253333 135.253333 0 0 0 79.786666-26.026666 138.666667 138.666667 0 0 0 57.173334-112.213334v-128a92.16 92.16 0 0 0-47.786667-79.36z m-36.266667 208.213334a52.053333 52.053333 0 0 1-69.12 49.92c-110.933333-36.266667-316.586667-115.626667-441.173333-236.8s-206.506667-320.426667-244.053333-426.666667a42.666667 42.666667 0 0 1 5.973333-42.666667 57.173333 57.173333 0 0 1 47.36-23.04h130.56a9.813333 9.813333 0 0 1 8.106667 4.266667L341.408427 298.666667a5.973333 5.973333 0 0 1 0 5.973333L282.10176 422.826667a46.08 46.08 0 0 0-3.84 28.16 384 384 0 0 0 103.253333 181.333333 398.933333 398.933333 0 0 0 186.026667 99.84 42.666667 42.666667 0 0 0 26.453333-3.413333l121.173334-59.306667a10.24 10.24 0 0 1 9.386666 0l113.493334 61.44a7.253333 7.253333 0 0 1 4.266666 5.973333z" ></path></symbol><symbol id="bg-ic-layout-4" viewBox="0 0 1024 1024"><path d="M867.413333 42.666667H156.586667A114.346667 114.346667 0 0 0 42.666667 156.586667v710.826666A114.346667 114.346667 0 0 0 156.586667 981.333333h710.826666A114.346667 114.346667 0 0 0 981.333333 867.413333V156.586667A114.346667 114.346667 0 0 0 867.413333 42.666667zM896 156.586667V341.333333h-341.333333V128h312.746666a28.586667 28.586667 0 0 1 28.586667 28.586667zM156.586667 128H469.333333v469.333333H128V156.586667A28.586667 28.586667 0 0 1 156.586667 128zM128 867.413333V682.666667h341.333333v213.333333H156.586667a28.586667 28.586667 0 0 1-28.586667-28.586667z m739.413333 28.586667H554.666667V426.666667h341.333333v440.746666a28.586667 28.586667 0 0 1-28.586667 28.586667z" ></path></symbol><symbol id="bg-ic-user" viewBox="0 0 1024 1024"><path d="M512 469.333333a213.333333 213.333333 0 1 0-213.333333-213.333333 213.333333 213.333333 0 0 0 213.333333 213.333333z m0-341.333333a128 128 0 1 1-128 128 128 128 0 0 1 128-128zM725.333333 554.666667H298.666667a256 256 0 0 0-256 256v128a42.666667 42.666667 0 0 0 42.666666 42.666666h853.333334a42.666667 42.666667 0 0 0 42.666666-42.666666v-128a256 256 0 0 0-256-256z m170.666667 341.333333H128v-85.333333a170.666667 170.666667 0 0 1 170.666667-170.666667h426.666666a170.666667 170.666667 0 0 1 170.666667 170.666667z" ></path></symbol><symbol id="bg-ic-delete" viewBox="0 0 1024 1024"><path d="M938.666667 170.666667h-140.373334l-99.413333-113.493334a42.666667 42.666667 0 0 0-32-14.506666H357.546667a42.666667 42.666667 0 0 0-32.426667 14.506666L226.133333 170.666667H85.333333a42.666667 42.666667 0 0 0 0 85.333333h42.666667v597.333333a128 128 0 0 0 128 128h512a128 128 0 0 0 128-128V256h42.666667a42.666667 42.666667 0 0 0 0-85.333333zM376.746667 128h270.506666l37.546667 42.666667H341.333333zM810.666667 853.333333a42.666667 42.666667 0 0 1-42.666667 42.666667H256a42.666667 42.666667 0 0 1-42.666667-42.666667V256h597.333334z" ></path><path d="M384 768a42.666667 42.666667 0 0 0 42.666667-42.666667v-298.666666a42.666667 42.666667 0 0 0-85.333334 0v298.666666a42.666667 42.666667 0 0 0 42.666667 42.666667zM640 768a42.666667 42.666667 0 0 0 42.666667-42.666667v-298.666666a42.666667 42.666667 0 0 0-85.333334 0v298.666666a42.666667 42.666667 0 0 0 42.666667 42.666667z" ></path></symbol><symbol id="bg-ic-plus" viewBox="0 0 1024 1024"><path d="M917.333333 448h-341.333333v-341.333333a64 64 0 0 0-128 0v341.333333h-341.333333a64 64 0 0 0 0 128h341.333333v341.333333a64 64 0 0 0 128 0v-341.333333h341.333333a64 64 0 0 0 0-128z" ></path></symbol><symbol id="bg-ic-ability" viewBox="0 0 1024 1024"><path d="M256 981.333333a213.333333 213.333333 0 0 1 0-426.666666h128a85.333333 85.333333 0 0 1 85.333333 85.333333v128a213.333333 213.333333 0 0 1-213.333333 213.333333z m0-341.333333a128 128 0 1 0 128 128v-128zM768 981.333333a213.333333 213.333333 0 0 1-213.333333-213.333333v-128a85.333333 85.333333 0 0 1 85.333333-85.333333h128a213.333333 213.333333 0 0 1 0 426.666666z m-128-341.333333v128a128 128 0 1 0 128-128zM384 469.333333H256a213.333333 213.333333 0 1 1 213.333333-213.333333v128a85.333333 85.333333 0 0 1-85.333333 85.333333zM256 128a128 128 0 0 0 0 256h128V256a128 128 0 0 0-128-128zM768 469.333333h-128a85.333333 85.333333 0 0 1-85.333333-85.333333V256a213.333333 213.333333 0 1 1 213.333333 213.333333z m0-341.333333a128 128 0 0 0-128 128v128h128a128 128 0 0 0 0-256z" ></path></symbol><symbol id="bg-ic-circle-check" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m0 938.666667a426.666667 426.666667 0 1 1 426.666667-426.666667 426.666667 426.666667 0 0 1-426.666667 426.666667z" ></path><path d="M695.04 396.373333L469.333333 622.506667l-140.373333-140.8a42.666667 42.666667 0 0 0-60.586667 60.586666l170.666667 170.666667a42.666667 42.666667 0 0 0 60.586667 0l256-256a42.666667 42.666667 0 0 0-60.586667-60.586667z" ></path></symbol><symbol id="bg-ic-file" viewBox="0 0 1024 1024"><path d="M725.333333 682.666667H298.666667a42.666667 42.666667 0 0 0 0 85.333333h426.666666a42.666667 42.666667 0 0 0 0-85.333333zM725.333333 469.333333H298.666667a42.666667 42.666667 0 0 0 0 85.333334h426.666666a42.666667 42.666667 0 0 0 0-85.333334z" ></path><path d="M931.413333 196.693333l-146.773333-146.773333A170.666667 170.666667 0 0 0 663.893333 0H174.08A131.413333 131.413333 0 0 0 42.666667 131.413333v761.173334A131.413333 131.413333 0 0 0 174.08 1024h675.84A131.413333 131.413333 0 0 0 981.333333 892.586667V317.44a170.666667 170.666667 0 0 0-49.92-120.746667zM869.973333 256h-110.08a45.226667 45.226667 0 0 1-46.933333-42.666667V101.12a113.066667 113.066667 0 0 1 11.093333 8.96z m-20.053333 682.666667H174.08A46.08 46.08 0 0 1 128 892.586667V131.413333A46.08 46.08 0 0 1 174.08 85.333333h453.546667v128a130.56 130.56 0 0 0 132.266666 128H896v551.253334A46.08 46.08 0 0 1 849.92 938.666667z" ></path></symbol><symbol id="bg-ic-circle-close" viewBox="0 0 1024 1024"><path d="M512 0a512 512 0 1 0 512 512A512 512 0 0 0 512 0z m0 938.666667a426.666667 426.666667 0 1 1 426.666667-426.666667 426.666667 426.666667 0 0 1-426.666667 426.666667z" ></path><path d="M712.96 311.04a42.666667 42.666667 0 0 0-60.586667 0L512 451.84l-140.373333-140.8a42.666667 42.666667 0 1 0-60.586667 60.586667l140.8 140.373333-140.8 140.373333a42.666667 42.666667 0 0 0 0 60.586667 42.666667 42.666667 0 0 0 60.586667 0l140.373333-140.8 140.373333 140.8a42.666667 42.666667 0 0 0 60.586667 0 42.666667 42.666667 0 0 0 0-60.586667L572.16 512l140.8-140.373333a42.666667 42.666667 0 0 0 0-60.586667z" ></path></symbol><symbol id="bg-ic-search" viewBox="0 0 1024 1024"><path d="M968.96 908.373333l-170.666667-170.666666a426.666667 426.666667 0 1 0-60.586666 60.586666l170.666666 170.666667a42.666667 42.666667 0 0 0 60.586667 0 42.666667 42.666667 0 0 0 0-60.586667zM469.333333 810.666667a341.333333 341.333333 0 1 1 341.333334-341.333334 341.333333 341.333333 0 0 1-341.333334 341.333334z" ></path></symbol><symbol id="bg-ic-save" viewBox="0 0 1024 1024"><path d="M931.413333 239.36l-146.773333-146.773333A170.666667 170.666667 0 0 0 663.893333 42.666667H170.666667a128 128 0 0 0-128 128v679.253333A131.413333 131.413333 0 0 0 174.08 981.333333h675.84A131.413333 131.413333 0 0 0 981.333333 849.92V360.106667a170.666667 170.666667 0 0 0-49.92-120.746667zM341.333333 896v-213.333333a42.666667 42.666667 0 0 1 42.666667-42.666667h256a42.666667 42.666667 0 0 1 42.666667 42.666667v213.333333z m554.666667-46.08A46.08 46.08 0 0 1 849.92 896H768v-213.333333a128 128 0 0 0-128-128H384a128 128 0 0 0-128 128v213.333333H174.08A46.08 46.08 0 0 1 128 849.92V170.666667a42.666667 42.666667 0 0 1 42.666667-42.666667h493.226666a85.333333 85.333333 0 0 1 61.44 24.746667L870.826667 298.666667A85.333333 85.333333 0 0 1 896 360.106667z" ></path></symbol><symbol id="bg-ic-mail" viewBox="0 0 1024 1024"><path d="M896 85.333333H128a128 128 0 0 0-128 128v597.333334a128 128 0 0 0 128 128h768a128 128 0 0 0 128-128V213.333333a128 128 0 0 0-128-128z m-39.68 85.333334L512 456.533333 167.68 170.666667zM938.666667 810.666667a42.666667 42.666667 0 0 1-42.666667 42.666666H128a42.666667 42.666667 0 0 1-42.666667-42.666666V213.333333l399.36 331.52a42.666667 42.666667 0 0 0 54.613334 0L938.666667 213.333333z" ></path></symbol><symbol id="bg-ic-zoom-out" viewBox="0 0 1024 1024"><path d="M968.96 908.373333l-170.666667-170.666666a426.666667 426.666667 0 1 0-60.586666 60.586666l170.666666 170.666667a42.666667 42.666667 0 0 0 60.586667 0 42.666667 42.666667 0 0 0 0-60.586667zM469.333333 810.666667a341.333333 341.333333 0 1 1 341.333334-341.333334 341.333333 341.333333 0 0 1-341.333334 341.333334z" ></path><path d="M597.333333 426.666667H341.333333a42.666667 42.666667 0 0 0 0 85.333333h256a42.666667 42.666667 0 0 0 0-85.333333z" ></path></symbol><symbol id="bg-ic-zoom-in" viewBox="0 0 1024 1024"><path d="M968.96 908.373333l-170.666667-170.666666a426.666667 426.666667 0 1 0-60.586666 60.586666l170.666666 170.666667a42.666667 42.666667 0 0 0 60.586667 0 42.666667 42.666667 0 0 0 0-60.586667zM469.333333 810.666667a341.333333 341.333333 0 1 1 341.333334-341.333334 341.333333 341.333333 0 0 1-341.333334 341.333334z" ></path><path d="M597.333333 426.666667h-85.333333V341.333333a42.666667 42.666667 0 0 0-85.333333 0v85.333334H341.333333a42.666667 42.666667 0 0 0 0 85.333333h85.333334v85.333333a42.666667 42.666667 0 0 0 85.333333 0v-85.333333h85.333333a42.666667 42.666667 0 0 0 0-85.333333z" ></path></symbol><symbol id="bg-ic-shopping-cart" viewBox="0 0 1024 1024"><path d="M276.906667 789.333333h581.973333a42.666667 42.666667 0 0 0 42.666667-33.28l110.933333-492.373333a42.666667 42.666667 0 0 0-8.533333-35.84 42.666667 42.666667 0 0 0-33.28-14.506667H199.253333l-26.026666-116.053333a42.666667 42.666667 0 0 0-42.666667-33.28H53.333333a42.666667 42.666667 0 0 0 0 85.333333h42.666667l27.733333 114.346667 111.786667 492.373333a42.666667 42.666667 0 0 0 41.386667 33.28zM917.333333 298.666667l-92.586666 405.333333h-512L218.453333 298.666667z" ></path><path d="M298.666667 917.333333m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z" ></path><path d="M853.333333 917.333333m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z" ></path></symbol></svg>',d=(d=document.getElementsByTagName("script"))[d.length-1].getAttribute("data-injectcss"),s=function(a,t){t.parentNode.insertBefore(a,t)};if(d&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(a){console&&console.log(a)}}function m(){i||(i=!0,l())}function p(){try{o.documentElement.doScroll("left")}catch(a){return void setTimeout(p,50)}m()}t=function(){var a,t=document.createElement("div");t.innerHTML=e,e=null,(t=t.getElementsByTagName("svg")[0])&&(t.setAttribute("aria-hidden","true"),t.style.position="absolute",t.style.width=0,t.style.height=0,t.style.overflow="hidden",t=t,(a=document.body).firstChild?s(t,a.firstChild):a.appendChild(t))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(t,0):(h=function(){document.removeEventListener("DOMContentLoaded",h,!1),t()},document.addEventListener("DOMContentLoaded",h,!1)):document.attachEvent&&(l=t,o=a.document,i=!1,p(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,m())})}(window);
\ No newline at end of file
/**
* 全局组件
*/
import BgIcon from './bg-icon.vue'
import BgNav from './bg-nav.vue'
import BgList from './bg-list.vue'
import BgDetail from './bg-detail.vue'
import BgFiltrate from './bg-filtrate.vue'
import BgTable from './bg-table.vue'
import BgTablePro from './bg-table-pro.vue'
import BgTableBtn from './bg-table-btn.vue'
import BgTabs from './bg-tabs.vue'
import BgTab from './bg-tab.vue'
import BgLayoutCard from './bg-layout-card.vue'
import BgCard from './bg-card.vue'
import BgInfo from './bg-info.vue'
import BgSteps from './bg-steps.vue'
import BgStep from './bg-step.vue'
import BgBtns from './bg-btns.vue'
import BgUpload from './bg-upload.vue'
import BgUploadImage from './bg-upload-image.vue'
import BgTags from './bg-tags.vue'
import BgSwitch from './bg-switch.vue'
import BgRichText from './bg-rich-text.vue'
import BgCodeEditor from './bg-code-editor.vue'
import BgFilter from './bg-filter.vue'
import BgSort from './bg-sort.vue'
import BgFilterDate from './bg-filter-date.vue'
import bgUserUploadImage from './bg-user-upload-image.vue'
import bgDetailTable from './bg-detail-table.vue'
import bgDetailTable2 from './bg-detail-table2.vue'
import debounce from './debounce'
import BgPagination from './bg-pagination.vue'
import BgInnerTabs from './bg-inner-tabs.vue'
const components = {
BgIcon,//字体图标
BgNav, // 左侧导航
BgList, // 列表页布局
BgDetail, // 详情页布局
BgFiltrate, // 筛选条件
BgTable, // 表格
BgTablePro,
BgTableBtn, // 表格按钮
BgTabs, // 信息块
BgTab, // 信息块(子)
BgLayoutCard, // 带标题的卡片
BgCard, // 详情卡片
BgInfo, // 表格信息
BgSteps, // 步骤条
BgStep, // 步骤条
BgBtns, // 按钮组
BgUpload, // 上传附件
BgUploadImage, // 上传单张图片
BgTags, // 标签
BgSwitch, // 开关
BgRichText, // 富文本
BgCodeEditor,//代码输入
BgFilter, // 首页筛选
BgSort, // 首页排序
BgFilterDate,
bgUserUploadImage,
bgDetailTable,//详情展示组件1
bgDetailTable2,//详情展示组件2
debounce,//防抖组件
BgPagination,// 分页组件
BgInnerTabs,//内部tab
};
const install = (Vue) => {
for (let name in components) {
Vue.component(name, components[name]);
}
};
if (typeof window !== "undefined" && window.Vue) {
install(window.Vue);
}
export default {
install,
...components,
};
ul {
list-style: none;
padding: 0;
margin: 0;
}
h1,
h2,
h3,
h4,
h5,
p {
margin: 0;
}
a {
text-decoration: none;
}
.clearfix {
zoom: 1;
&::after {
content: "";
display: block;
height: 0;
clear: both;
}
}
.fl {
float: left;
}
.fr {
float: right;
}
.text-clip {
overflow: hidden;
text-overflow: ellipsis;
word-break: break-all;
white-space: nowrap;
}
.el-tooltip__popper {
max-width: 240px;
font-size: 12px;
line-height: 24px;
color: #ffffff;
}
.hide-required-icon {
.el-form-item {
&.is-required:not(.is-no-asterisk) {
> .el-form-item__label:before {
display: none;
}
}
}
}
.bg-form {
.center-form {
max-width: 750px;
margin: 0 auto;
}
.el-form-item {
.el-form-item__label {
float: unset;
display: block;
text-align: left;
font-size: 14px;
color: #202531;
line-height: 36px;
}
.el-form-item__content {
line-height: 36px;
// margin-top: 40px;
.el-select,
.img_crop,
.el-cascader,
.wangeditor_class,
.el-date-editor {
width: 100%;
}
.wangeditor_class {
min-height: 553px;
border: 1px solid #dadee7;
border-radius: 4px;
overflow: hidden;
.toolbar {
.w-e-toolbar {
.w-e-menu {
height: 50px;
}
}
}
}
}
&.inline {
display: flex;
justify-content: flex-start;
align-items: flex-start;
.el-form-item__label {
width: 6em;
padding: 0;
flex-shrink: 0;
color: #616f94;
text-align: right;
margin-right: 1em;
&:before {
display: inline;
margin-left: -1em;
}
}
.el-form-item__content {
width: calc(100% - 7em);
flex-grow: 1;
}
}
&:last-child {
margin-bottom: 0;
}
}
.el-button {
min-width: 64px;
height: 36px;
padding: 0 10px;
line-height: 36px;
&.el-button--default {
background-color: #fff;
color: #404a62;
}
&.el-button--primary {
background-color: #2b4695;
border-color: #2b4695;
color: #fff;
}
&.el-button--default2 {
background-color: #fff;
border-color: #2d96c9;
color: #2d96c9;
}
&.el-button--default3 {
background-color: #fff;
border-color: #ff6a00;
color: #ff6a00;
}
&.el-button--primary2 {
background-color: #2d96c9;
border-color: #2d96c9;
color: #fff;
}
&.el-button--billing {
background-color: #ff6a00;
border-color: #ff6a00;
color: #fff;
}
&.el-button--save {
background-color: #404a62;
border-color: #404a62;
color: #fff;
}
&.is-disabled,
&.is-disabled:focus,
&.is-disabled:hover {
/* background-image: none;
background-color: #fff;
border-color: #e6e9ef;
color: #a9b1c7; */
cursor: not-allowed;
opacity: 0.5;
}
+ .el-button {
margin-left: 16px;
}
}
.el-input .el-input__inner,
.el-textarea .el-textarea__inner {
background-color: #f7f7f9;
border: solid 1px #dadee7;
border-radius: 4px;
}
.el-input {
.el-input__inner {
height: 36px;
}
&.el-input-group {
> .el-input__inner {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
> .el-input-group__append {
background-color: transparent;
padding: 0;
border: none;
.input-append {
display: block;
min-width: 120px;
height: 36px;
padding: 0 10px;
box-sizing: border-box;
background-color: #2b4695;
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
font-size: 14px;
line-height: 36px;
color: #f4f7fc;
text-align: center;
cursor: pointer;
&.disabled {
background-color: #a9b1c7;
cursor: not-allowed;
}
}
}
}
&.is-disabled {
.el-input__inner {
background-color: #e6e9ef;
color: #202531;
}
}
}
.el-textarea {
.el-input__count {
background: #fff;
font-size: 12px;
line-height: 20px;
color: #c1c7d7;
position: absolute;
bottom: 5px;
right: 10px;
}
}
.el-range-editor.el-input__inner {
height: 36px;
}
.el-pagination {
padding: 0 10px;
> * {
height: 36px !important;
background-color: transparent !important;
font-size: 14px;
line-height: 36px !important;
color: #404a62;
}
> .el-pager > li {
height: 36px !important;
background-color: transparent !important;
line-height: 36px !important;
color: #404a62 !important;
&.active {
color: #3759be !important;
}
}
.el-input__inner {
background-color: #f7f7f9;
}
}
.el-checkbox {
.el-checkbox__input.is-checked .el-checkbox__inner,
.el-checkbox__input.is-indeterminate .el-checkbox__inner {
background-color: #2d96c9;
border-color: #0c74a7;
}
}
.el-select {
.el-input {
.el-input__icon {
line-height: 36px;
}
.el-select__caret {
color: #2b4695;
}
}
}
.el-tree {
.el-tree-node__content {
height: 32px;
display: flex;
justify-content: flex-start;
align-items: center;
.el-tree-node__expand-icon {
color: #2b4695;
&.el-icon-caret-right {
width: 16px;
height: 16px;
border: solid 1px #dadee7;
border-radius: 3px;
padding: 0;
box-sizing: border-box;
margin-right: 8px;
text-align: center;
&:before {
content: "\e6d9";
font-size: 12px;
font-weight: bolder;
line-height: 14px;
color: #3759be;
}
&.expanded {
transform: rotate(0deg);
&:before {
content: "\e6d8";
}
}
&.is-leaf {
opacity: 0;
}
}
}
.el-tree-node__label {
font-size: 14px;
color: #404a62;
line-height: 32px;
}
}
&.el-tree--highlight-current {
.el-tree-node {
&.is-current {
> .el-tree-node__content {
background-color: #dfe5f6;
.el-tree-node__label {
color: #3759be;
}
}
}
}
}
}
&.float-label {
.el-form-item {
.el-form-item__label {
float: left;
}
}
}
&.width-1340 {
.el-input,
.el-textarea,
.bg-tags {
max-width: 1340px !important;
}
}
}
.bg-breadcrumb {
display: flex;
justify-content: space-between;
align-items: center;
> .el-breadcrumb {
flex-shrink: 0;
white-space: nowrap;
height: 46px;
padding: 16px 0;
box-sizing: border-box;
.el-breadcrumb__item {
> span {
font-size: 14px;
font-weight: normal;
// line-height: 24px;
color: #909bb6;
&:hover{
color: #5170cd;
cursor: pointer;
}
}
&:last-child {
> span {
color: #202531;
}
}
}
& + * {
width: 429px;
flex-grow: 0;
flex-shrink: 1;
margin-left: 14px;
margin: 7px 0 7px 14px;
}
}
&.deep-bg {
> .el-breadcrumb {
.el-breadcrumb__item {
&:last-child {
> span {
color: #b4c0f5;
}
}
}
}
}
}
.bg-dialog {
.el-dialog {
border-radius: 4px;
.el-dialog__header {
padding: 10px 16px;
.el-dialog__title {
padding-left: 1em;
position: relative;
font-size: 18px;
font-weight: bolder;
color: #1d1e20;
line-height: 30px;
&::before {
content: "";
position: absolute;
width: 4px;
height: 16px;
border-radius: 2px;
background-color: #2b4695;
left: 0;
top: 4px;
}
}
}
.el-dialog__body {
padding: 24px 16px;
}
.el-dialog__footer {
padding: 8px 16px 16px;
}
.dialog-msg {
text-align: left;
> p {
font-size: 14px;
line-height: 1.5;
&:nth-child(1) {
font-size: 18px;
}
& + p {
margin-top: 14px;
}
}
}
.dialog-rich-text-content {
min-height: 650px;
font-size: 14px;
text-align: left;
}
}
}
.bg-nav {
background-color: #282e3d;
user-select: none;
height: 100%;
padding-top: 25px;
.bg-nav-title {
padding: 0 0 12px 24px;
> h3 {
font-size: 18px;
font-weight: bolder;
color: #fff;
line-height: 30px;
}
}
> .bg-nav-list {
height: calc(100% - 135px);
box-sizing: border-box;
ul.nav-list {
height: 100%;
overflow: auto;
> li {
position: relative;
> .nav-item {
position: relative;
display: block;
padding: 10px 10px 10px 24px;
z-index: 9;
font-size: 14px;
line-height: 28px;
text-decoration: none;
color: #fff;
cursor: pointer;
&:hover:not(.nav-more),
&.current {
color: #fff;
&::before {
content: "";
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-color: #2a4aa7;
z-index: -1;
}
&::after {
content: "";
width: 3px;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-color: #5a7adc;
z-index: -1;
}
}
}
> ul.nav-list {
background-color: #202531;
}
}
}
}
}
.bg-filtrate {
display: flex;
justify-content: flex-start;
align-items: flex-start;
> .bg-filtrate-text {
width: 7em;
flex-shrink: 0;
height: 24px;
font-size: 12px;
line-height: 24px;
color: #8890a7;
margin: 8px 0;
text-align: right;
}
> .bg-filtrate-list {
padding: 0;
margin: 0 0 0 10px;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: center;
> li {
height: 24px;
padding: 0 5px;
font-size: 12px;
line-height: 24px;
color: #202531;
cursor: pointer;
margin: 8px 0;
&:not(:last-child) {
margin-right: 20px;
}
&.current {
border-radius: 3px;
background-color: #2b4695;
color: #fff;
}
}
}
> .bg-filtrate-title {
width: 7em;
height: 36px;
font-size: 12px;
line-height: 36px;
color: #8890a7;
margin: 8px 0;
text-align: right;
}
> .bg-filtrate-content {
flex-shrink: 0;
margin: 8px 0 8px 10px;
}
}
.bg-table {
&::before {
display: none;
}
.empty_container {
height: 500px;
padding-top: 247px;
img {
width: 257px;
height: 145px;
}
.text {
font-size: 16px;
color: #616f94;
line-height: 1;
}
}
th,
td {
padding: 12px 0!important;
> .cell {
padding: 0 10px !important;
color: #404a62;
line-height: 18px;
}
}
&.el-table--border {
border-top-color: #b0bee8;
border-bottom: 1px solid #ebeef5;
.el-table__header-wrapper {
position: relative;
&::before {
content: "";
width: 1px;
height: 100%;
background-color: #b0bee8;
position: absolute;
top: 0;
left: 0;
z-index: 1;
}
&::after {
content: "";
width: 1px;
height: 100%;
background-color: #b0bee8;
position: absolute;
right: 0;
bottom: 0;
z-index: 2;
}
table {
th {
border-color: #b0bee8;
background-color: #dfe5f6;
}
}
}
}
.el-table--striped .el-table__body tr.el-table__row--striped td {
background-color: #f7f7f9;
}
.el-table__inner-wrapper::before {
height: 0px;
}
&.tree-table {
th {
background-color: #e6e9ef;
}
tr {
&.has-children {
background-color: #f7f7f9;
}
}
}
.el-form-item {
margin: 0 !important;
.el-form-item__error {
top: unset;
bottom: -12px;
transform: scale(0.8);
transform-origin: 0 0;
}
.el-form-item__content {
margin: 0 !important;
}
}
}
.bg-table-pro{
th,
td {
> .cell {
padding: 0 10px !important;
overflow: unset;
display: flex;
justify-content: flex-start;
align-items: center;
}
}
&.el-table--border {
.el-table__header-wrapper {
table {
th {
border-color: #dadee7;
background-color: #f5f6f9;
}
}
}
}
}
.bg-table-tree {
.th,
.td {
>.cell {
display: flex;
justify-content: flex-start;
align-items: center;
>.el-input {
flex: 1 1 auto;
}
}
}
}
.bg-table-btn {
display: inline;
color: #3759be;
cursor: pointer;
&.disabled {
cursor: not-allowed;
color: #a9b1c7;
}
& + .bg-table-btn {
position: relative;
margin-left: 33px;
&::before {
content: "";
position: absolute;
top: 4px;
left: -17px;
width: 1px;
height: 14px;
background-color: #c1c7d7;
}
}
}
.bg-tabs {
background-color: #ffffff;
box-shadow: 0px 6px 12px 0px rgba(0, 20, 53, 0.3);
border-radius: 12px;
overflow: hidden;
> .bg-tabs-nav {
background-color: #fff;
> ul {
height: 64px;
padding: 0;
margin: 0;
list-style: none;
display: flex;
justify-content: space-between;
align-items: stretch;
> li {
flex-grow: 0;
width: 320px;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
padding: 8px;
border-bottom: 1px solid #e6e9ef;
font-size: 16px;
line-height: 25px;
color: #404a62;
cursor: pointer;
&.current {
position: relative;
border-top-right-radius: 6px;
border-top-left-radius: 6px;
border-right: 1px solid #e6e9ef;
border-bottom: 1px solid #fff;
border-left: 1px solid #e6e9ef;
color: #275a9d;
overflow: hidden;
&::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 4px;
background-color: #275a9d;
}
}
&:first-child {
border-left: none;
}
&:last-child {
flex-grow: 1;
flex-shrink: 1;
border-right: none;
}
}
}
}
> .bg-tabs-content {
padding: 30px 16px;
}
&.nice-tabs {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
> .bg-tabs-nav {
flex-shrink: 0;
flex-grow: 0;
}
> .bg-tabs-content {
padding: 30px 0;
flex-shrink: 1;
flex-grow: 1;
> .bg-tab {
padding: 0;
margin: 0;
.el-input,
.el-textarea,
.bg-tags {
max-width: 640px;
}
}
}
> .bg-tabs-action {
flex-shrink: 0;
flex-grow: 0;
padding: 16px;
border-top: 1px solid #e6e9ef;
text-align: right;
}
}
}
.bg-tab {
> .tab-title {
margin-bottom: 16px;
> h3 {
position: relative;
padding-left: 16px;
height: 32px;
font-size: 18px;
font-weight: bolder;
line-height: 32px;
color: #202531;
&::before {
content: "";
width: 4px;
height: 16px;
background-color: #275a9d;
position: absolute;
top: 8px;
left: 0;
}
}
}
> .tab-content {
padding: 0 16px;
}
& + .bg-tab {
margin-top: 30px;
}
}
.bg-tabs-nav--fixed {
position: fixed;
top: 58px;
right: 16px;
left: 184px;
z-index: 1998;
background-color: #eef0f5;
padding: 16px 16px 0;
> ul {
background-color: #fff;
height: 64px;
padding: 0;
margin: 0;
list-style: none;
display: flex;
justify-content: space-between;
align-items: stretch;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
> li {
flex-grow: 0;
width: 320px;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
padding: 8px;
border-bottom: 1px solid #e6e9ef;
font-size: 16px;
line-height: 25px;
color: #404a62;
cursor: pointer;
&.current {
position: relative;
&::before {
content: "";
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 4px;
background-color: #275a9d;
}
}
&:last-child {
flex-grow: 1;
flex-shrink: 1;
}
}
}
}
.bg-list {
height: 100%;
padding: 0 16px;
display: flex;
flex-direction: column;
align-content: stretch;
> .bg-list-header {
margin-bottom: 16px;
> .bg {
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
padding: 10px 16px;
}
> .header-content {
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
> .header-action {
padding: 16px;
border-bottom: solid 1px #e6e9ef;
}
> .header-main {
padding: 16px;
}
}
}
> .bg-list-filter {
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
margin-bottom: 16px;
}
> .bg-list-top {
margin-bottom: 16px;
> .bg {
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
padding: 10px 16px;
}
}
> .bg-list-main {
flex-grow: 1;
height: 205px;
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
padding: 10px 16px 0;
box-sizing: border-box;
margin-bottom: 16px;
> .main-action {
padding-bottom: 16px;
margin: 4px 0 10px;
zoom: 1;
position: relative;
&::before {
content: "";
position: absolute;
right: -16px;
bottom: 0;
left: -16px;
border-bottom: 1px solid #e6e9ef;
}
&::after {
content: "";
display: block;
height: 0;
clear: both;
}
}
> .main-table {
height: calc(100% - 36px - 16px * 2);
}
> .main-pagination {
height: 36px;
margin-top: 16px;
text-align: center;
}
&.has-action {
> .main-table {
height: calc(100% - 36px - 16px * 2 - 67px);
}
}
}
}
.bg-list-filter {
overflow: hidden;
> .fiter-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 14px;
border-bottom: 1px solid #e6e9ef;
> .el-button {
width: 103px;
+ .el-button {
margin-left: 18px;
}
}
> .filter-header-right {
width: 320px;
text-align: right;
}
}
> .filter-content {
// height: 136px;
padding: 8px 14px;
box-sizing: border-box;
display: flex;
justify-content: space-between;
align-items: flex-start;
> .filter-action {
flex-shrink: 0;
display: flex;
justify-content: flex-start;
align-items: center;
.filters-right {
width: 240px;
margin-right: 10px;
}
> .el-button {
margin-top: 8px;
margin-bottom: 8px;
}
}
&.inline-filters {
min-height: unset !important;
height: unset !important;
> .filter-list {
margin-left: 1em;
> .bg-btns {
margin-right: 30px;
}
> .bg-filtrate {
display: inline-flex;
margin-right: 30px;
> .bg-filtrate-text,
> .bg-filtrate-title {
width: unset;
flex-shrink: 0;
}
> .bg-filtrate-content {
flex-grow: 1;
flex-shrink: 1;
> .el-input {
width: 160px;
}
> .el-select {
width: 160px;
}
> .el-date-editor {
width: 260px;
&.el-date-editor--datetimerange {
width: 400px;
}
}
> .el-radio-group {
height: 36px;
> label {
line-height: 36px;
}
}
}
}
}
}
&.show-more {
// min-height: 136px;
height: unset;
}
}
}
.bg-detail {
padding: 0 16px;
> .bg-detail-info {
margin-bottom: 16px;
}
> .bg-detail-tabs {
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
margin-bottom: 16px;
}
}
.bg-edit {
padding: 0 16px;
.bg-edit-main {
min-height: calc(100vh - 58px - 44px - 16px);
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
padding: 16px;
margin-bottom: 16px;
> .main-action {
padding-bottom: 17px;
margin-bottom: 16px;
position: relative;
zoom: 1;
&::before {
content: "";
position: absolute;
right: -16px;
bottom: 0;
left: -16px;
border-bottom: 1px solid #e6e9ef;
}
&::after {
content: "";
display: block;
height: 0;
clear: both;
}
}
}
}
.bg-input-number {
display: inline-flex;
justify-content: space-between;
align-items: stretch;
border: 1px solid #e3e5ef;
border-radius: 6px;
overflow: hidden;
> .el-input-number {
height: 36px;
flex-grow: 1;
line-height: 36px;
.el-input__inner {
border: none;
border-radius: 0;
background-color: #f7f8f9;
text-align: left;
}
.el-input-number__decrease,
.el-input-number__increase {
border: none;
color: #515fe7;
}
}
> .bg-input-number__text {
min-width: 50px;
padding: 0 15px;
box-sizing: border-box;
background-color: #edeef4;
color: #8890a7;
line-height: 36px;
text-align: center;
}
}
.bg-layout-card {
background-color: #ffffff;
box-shadow: 0px 3px 6px 0px #f4f7fc;
border-radius: 4px;
margin: 10px;
overflow: hidden;
> .card-title {
height: 48px;
padding: 0 15px;
background-image: linear-gradient(
270deg,
#ffffff 0%,
#fef6f2 58%,
#fcede4 100%
),
linear-gradient(#fcede4, #fcede4);
background-blend-mode: normal, normal;
display: flex;
justify-content: space-between;
align-items: center;
.title-text {
flex-grow: 1;
font-size: 18px;
line-height: 48px;
font-weight: bolder;
color: #202531;
position: relative;
padding-left: 15px;
&::before {
content: "";
width: 4px;
height: 16px;
background-color: #ff6a00;
position: absolute;
top: 16px;
left: 0;
}
}
.filter-list {
flex-shrink: 0;
display: flex;
justify-content: flex-start;
align-items: center;
background-color: #e6e9ef;
padding: 2px;
border-radius: 5px;
margin-left: 10px;
> li {
min-width: 50px;
height: 20px;
border-radius: 4px;
padding: 0 5px;
box-sizing: border-box;
font-size: 12px;
line-height: 20px;
color: #909bb6;
text-align: center;
cursor: pointer;
&.current {
background-color: #ff6a00;
color: #f8f9fd;
}
}
}
.download-btn {
flex-shrink: 0;
margin-left: 10px;
cursor: pointer;
> img {
display: block;
}
> .el-loading-mask {
cursor: not-allowed;
.el-loading-spinner {
margin-top: -10px;
}
}
}
}
> .card-content {
height: calc(100% - 48px);
padding: 10px 15px;
box-sizing: border-box;
> * {
width: 100% !important;
height: 100% !important;
}
}
}
.bg-pinboard-container {
padding: 0 14px 10px;
> .bg-pinboard-content {
zoom: 1;
margin: -10px -10px 0;
> .bg-layout-card {
float: left;
&.fr {
float: right;
}
}
&:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
}
}
.bg-info {
> ul {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: stretch;
border-top: 1px solid #e3e5ef;
border-left: 1px solid #e3e5ef;
box-sizing: border-box;
> li {
border-right: 1px solid #e3e5ef;
border-bottom: 1px solid #e3e5ef;
box-sizing: border-box;
flex: 0 0 auto;
display: flex;
justify-content: flex-start;
align-items: stretch;
> span {
flex: 0 0 auto;
padding: 10px 16px;
box-sizing: border-box;
font-size: 14px;
line-height: 24px;
color: #404a62;
&:nth-child(1) {
flex-shrink: 0;
width: 240px;
background-color: #f7f8f9;
color: #616f94;
}
&:nth-child(2) {
flex-grow: 1;
width: calc(100% - 240px);
border-left: 1px solid #e3e5ef;
color: #404a62;
position: relative;
> .copy-btn {
position: absolute;
top: 50%;
transform: translateY(-50%);
right: 16px;
user-select: none;
color: #3759be;
cursor: pointer;
margin-left: 8px;
}
}
}
&:last-child {
flex-grow: 1;
}
}
}
}
.bg-steps {
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.1);
border-radius: 6px;
padding: 14px;
> .bg-steps-container {
.steps-nav {
padding: 18px 16px 31px;
border-bottom: 1px solid #f4f7fc;
> ul {
display: flex;
justify-content: space-between;
align-items: center;
> .step-item {
display: flex;
justify-content: flex-start;
align-items: center;
margin: 0 16px;
> .step-icon {
position: relative;
width: 30px;
height: 30px;
border-radius: 50%;
background-color: #e3e5ef;
&::before {
content: "";
width: 16px;
height: 16px;
border-radius: 50%;
background-color: #bcc1d0;
position: absolute;
top: 7px;
left: 7px;
}
}
> .step-hightlight-icon {
position: relative;
width: 70px;
height: 70px;
border-radius: 50%;
background-color: #2d96c9;
display: flex;
justify-content: center;
align-items: center;
display: none;
&::before {
content: "";
width: 60px;
height: 60px;
border: solid 3px #84bfdc;
box-sizing: border-box;
border-radius: 50%;
position: absolute;
top: 5px;
left: 5px;
}
}
> .step-title {
margin-left: 15px;
> p {
line-height: 1;
color: #bcc1d0;
&:nth-child(1) {
font-weight: bolder;
font-size: 18px;
}
&:nth-child(2) {
font-size: 14px;
margin-top: 12px;
}
}
}
&.done,
&.current {
> .step-icon {
display: none;
}
> .step-hightlight-icon {
display: flex;
}
}
> .step-title {
margin-left: 15px;
> p {
&:nth-child(1) {
color: #242c43;
}
&:nth-child(2) {
color: #8890a7;
}
}
}
}
> .step-line {
width: 100px;
flex: 1 1 auto;
height: 4px;
background-color: #e3e5ef;
border-radius: 2px 0px 0px 2px;
&.done,
&.current {
background-color: #2d96c9;
}
}
}
}
.steps-content {
margin-top: 20px;
}
}
}
.bg-step {
.step-done {
display: flex;
justify-self: center;
align-items: center;
> .done-icon {
margin-right: 15px;
}
> .done-info {
> p {
line-height: 1.5;
&:nth-child(1) {
font-weight: bolder;
font-size: 18px;
color: #242c43;
}
&:nth-child(2) {
font-size: 14px;
color: #8890a7;
margin-top: 5px;
}
}
}
}
> .step-action {
overflow: hidden;
margin-top: 20px;
> .fr {
float: right;
}
}
}
.bg-btns {
display: inline-block;
> ul {
padding: 2px;
background-color: #edeef0;
border-radius: 4px;
display: flex;
justify-content: flex-start;
align-items: center;
> li {
height: 24px;
padding: 0 16px;
font-size: 14px;
line-height: 24px;
color: #8890a7;
cursor: pointer;
&.is-active {
background-color: #2b4695;
border-radius: 4px;
color: #fff;
}
}
}
}
.bg-title-text {
height: 36px;
font-weight: bolder;
font-size: 18px;
line-height: 36px;
padding-left: 16px;
position: relative;
display: flex;
justify-content: flex-start;
align-items: center;
&::before {
content: "";
width: 4px;
height: 16px;
position: absolute;
top: 10px;
left: 0;
background-color: #275a9d;
}
> span {
+ img {
margin-left: 10px;
}
}
}
.bg-title-info {
height: 20px;
font-size: 16px;
line-height: 20px;
color: #404a62;
padding-left: 16px;
position: relative;
&::before {
content: "";
width: 4px;
height: 16px;
position: absolute;
top: 2px;
left: 0;
background-color: #275a9d;
}
> span {
color: #e56600;
}
}
.bg-upload {
text-align: left;
.trigger-content {
width: 360px;
height: 180px;
border-radius: 4px;
padding: 0 45px 15px;
box-sizing: border-box;
border: dashed 1px #dadee7;
display: flex;
flex-direction: column;
justify-content: center;
align-items: stretch;
> .trigger-icon {
font-size: 0;
line-height: 1;
text-align: center;
margin-bottom: 16px;
}
> .trigger-tip {
font-size: 14px;
line-height: 21px;
color: #909bb6;
text-align: left;
margin: 0;
}
}
&.is-disabled {
.el-upload,
.el-upload__tip {
// display: none;
cursor: not-allowed;
}
}
&.is-easy {
> div {
max-width: unset !important;
display: flex;
justify-content: flex-start;
align-items: center;
> .el-upload-list {
margin: 0 0 0 16px;
> .el-upload-list__item {
margin: 0;
& + .el-upload-list__item {
margin-top: 5px;
}
}
}
}
}
}
.bg-upload-image {
.trigger-content {
> .image-trigger {
width: 144px;
border-radius: 4px;
border: 1px solid #dadee7;
box-sizing: border-box;
position: relative;
> img {
display: block;
width: 100%;
}
> .refresh-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba($color: #000, $alpha: 0.3);
display: none;
justify-content: center;
align-items: center;
font-size: 20px;
color: #fff;
}
&:hover {
> .refresh-image {
display: flex;
}
}
}
> .upload-trigger {
width: 144px;
height: 144px;
background-color: #fff;
border-radius: 4px;
border: 1px dashed #dadee7;
box-sizing: border-box;
overflow: hidden;
display: flex;
justify-content: center;
align-items: center;
> .upload-icon {
width: 40px;
height: 40px;
position: relative;
&::before {
content: "";
width: 100%;
height: 1px;
background-color: #dadee7;
position: absolute;
top: 19.5px;
left: 0;
}
&::after {
content: "";
width: 1px;
height: 100%;
background-color: #dadee7;
position: absolute;
top: 0;
left: 19.5px;
}
}
}
}
}
.bg-form-reset {
> .el-form-item {
width: 100%;
margin-right: 0;
> label {
color: #202531;
}
> .el-form-item__content {
.el-input__inner,
.el-textarea__inner {
background-color: #f7f7f9;
}
}
&.inline {
display: flex;
justify-content: flex-start;
align-items: flex-start;
> label {
width: 10em;
flex-shrink: 0;
color: #616f94;
text-align: right;
}
> .el-form-item__content {
width: calc(100% - 7em);
flex-grow: 1;
}
}
}
}
.auto-height {
.el-select-dropdown__item {
height: unset;
.bg-option-title {
font-size: 14px;
color: #fff;
}
.bg-option-sub-title {
font-size: 12px;
color: #9ea2aa;
line-height: 20px;
margin-bottom: 10px;
}
}
}
.bg-empty-text {
width: 100%;
font-size: 14px;
line-height: 100px;
color: #121e3f;
text-align: center;
}
.bg-tags {
> ul {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: flex-start;
padding: 5px;
border: 1px solid #dadee7;
border-radius: 4px;
> li {
margin: 5px;
> a {
cursor: pointer;
margin-left: 5px;
}
&.tag-item {
height: 36px;
padding: 5px 10px;
background-color: #e8f6fd;
border: 1px solid #d1ecfa;
border-radius: 4px;
box-sizing: border-box;
font-size: 14px;
line-height: 24px;
color: #2b4695;
}
}
}
}
.bg-scroll {
overflow: hidden auto;
&::-webkit-scrollbar {
width: 16px;
}
/* &::-webkit-scrollbar-track {
border-radius: 8px;
box-shadow: 8px 0 0 #f4f4f4 inset;
border: 4px solid rgba(0, 0, 0, 0);
} */
&::-webkit-scrollbar-thumb {
border-radius: 8px;
box-shadow: 8px 0 0 #c1c7d7 inset;
border: 4px solid rgba(0, 0, 0, 0);
}
}
.bg-no-scroll {
overflow: hidden auto;
&::-webkit-scrollbar {
width: 0px;
}
/* &::-webkit-scrollbar-track {
border-radius: 8px;
box-shadow: 8px 0 0 #f4f4f4 inset;
border: 4px solid rgba(0, 0, 0, 0);
} */
&::-webkit-scrollbar-thumb {
border-radius: 0px;
border: 0px solid rgba(0, 0, 0, 0);
}
}
.bg-switch {
display: inline-block;
vertical-align: middle;
width: 64px;
height: 28px;
border-radius: 14px;
border: solid 2px #275a9d;
position: relative;
color: #275a9d;
cursor: pointer;
user-select: none;
> .label {
font-size: 12px;
font-weight: 600;
line-height: 24px;
position: absolute;
}
> .circle {
width: 18px;
height: 18px;
border-radius: 50%;
position: absolute;
top: 3px;
background-color: #275a9d;
}
&.disabled {
cursor: not-allowed;
}
}
.bg-action-filter {
display: flex;
justify-content: flex-start;
align-items: center;
> .bg-filtrate {
> * {
margin-top: 0;
margin-bottom: 0;
}
+ .bg-filtrate {
margin-left: 30px;
}
}
}
.bg-rich-text {
text-align: left;
.w-e-toolbar,
.w-e-text-container {
border: 1px solid #dadee7 !important;
width: 100%;
z-index: 1!important;
}
.w-e-toolbar {
border-radius: 4px 4px 0 0;
z-index: 2!important;
}
.w-e-text-container {
border-radius: 0 0 4px 4px;
border-top: none !important;
}
.w-e-text {
overflow-y: auto;
}
.onlyread {
height: 300px;
padding: 10px;
border: 1px solid lightgray;
box-sizing: border-box;
border-radius: 5px;
overflow-x: hidden;
overflow-y: auto;
}
}
.bg-filter {
display: flex;
justify-content: flex-start;
align-items: flex-start;
> span {
// width: 4em;
height: 24px;
flex-shrink: 0;
font-size: 14px;
line-height: 20px;
color: #616f94;
// padding: 4px 0;
margin: 8px 0;
// min-width: 115px;
}
> ul {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: center;
> li {
background-color: #fff;
// border: solid 1px #fff;
padding: 5px 6px;
font-size: 14px;
line-height: 14px;
color: #202531;
cursor: pointer;
margin: 6px 4px;
&.current {
background-color: #2b4695;
// border: solid 1px #718ad6;
border-radius: 3px;
color: #fff;
}
}
}
}
.bg-sort {
display: inline-flex;
justify-content: flex-start;
align-items: center;
> a {
height: 20px;
font-size: 15px;
line-height: 20px;
color: #8890a7;
cursor: pointer;
&.current {
color: #515fe7;
}
& + a {
position: relative;
margin-left: 30px;
&::before {
content: "";
width: 1px;
height: 16px;
background-color: #e3e5ef;
position: absolute;
top: 2px;
left: -15px;
}
}
}
}
.bg-timeline {
.el-timeline-item__node--normal {
width: 12px;
height: 12px;
background-color: #ffffff;
border: solid 4px #2b4695;
border-radius: 50%;
}
}
.bg-carousel {
.el-carousel__indicators--horizontal {
bottom: 40px;
}
.el-carousel__indicator--horizontal {
padding: 0;
width: 48px;
height: 8px;
background-color: #ffffff;
opacity: 0.3;
margin: 0 16px;
> button {
display: block;
width: 100%;
height: 100%;
background-color: transparent;
}
&.is-active {
opacity: 0.8;
}
}
&.hide-indicators {
.el-carousel__indicators {
display: none;
}
}
&.hide-bar {
.el-carousel__indicators--horizontal {
bottom: 20px;
}
.el-carousel__indicator--horizontal {
padding: 0;
width: 24px;
height: 4px;
background-color: #d0d8f1;
margin: 0 8px;
&.is-active {
background-color: #2b4695;
}
}
}
.el-carousel__indicators--vertical {
right: 20px;
.el-carousel__indicator--vertical {
padding: 0;
height: 24px;
width: 4px;
background-color: #d0d8f1;
margin: 8px 0;
> button {
display: block;
width: 100%;
height: 100%;
background-color: transparent;
}
&.is-active {
background-color: #2b4695;
}
}
}
}
.home-item {
max-width: 1340px;
margin: 0 auto;
display: flex;
justify-content: space-between;
align-items: stretch;
}
.home-item-title {
padding: 32px 0 0;
font-weight: bolder;
font-size: 32px;
line-height: 48px;
color: #202531;
text-align: center;
> span {
display: inline-block;
height: 48px;
padding: 0 64px;
position: relative;
&::before,
&::after {
content: "";
position: absolute;
top: 24px;
width: 32px;
height: 1px;
background-color: #b0bee8;
}
&::before {
left: 0;
}
&::after {
right: 0;
}
}
&.light-text {
color: #fff;
}
}
.bg-pagination {
height: 32px;
position: absolute;
right: 24px;
bottom: 16px;
.el-pagination {
text-align: center;
margin: 0 auto;
color: #404a62;
padding: 0 5px;
.el-pagination__total,
.el-pagination__jump {
color: #404a62;
}
.el-pager {
li {
font-family: Roboto-Regular;
}
li.is-active {
color: #3759be;
}
li:hover {
color: #3759be;
}
}
.el-input__wrapper {
background-color: #fff;
}
}
}
.bg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.bg-card {
background-color: #ffffff;
box-shadow: 0px 1px 4px 0px
rgba(0, 7, 101, 0.15);
border-radius: 6px;
margin-bottom: 16px;
.card-title {
padding: 8px 16px;
border-bottom: 1px solid #ebedf2;
font-weight: bold;
display: flex;
justify-content: flex-start;
align-items: center;
.title-icon {
width: 20px;
height: 20px;
background-color: #2a4aa7;
border-radius: 4px;
display: flex;
justify-content: center;
align-items: center;
margin-right: 12px;
.bg-icon {
font-size: 14px;
color: #fff;
}
}
.title-text{
font-size: 18px;
line-height: 36px;
color: #202531;
}
}
.card-content {
padding: 24px;
}
}
\ No newline at end of file
var downloadFileFormatNew = function (fileUrl) {
/*
input: /apaas/static/docs/image/images/1234_qq234ewr123.png
output: 1234.png
*/
if (fileUrl != "") {
var temp = fileUrl.split('/')[fileUrl.split('/').length-1]
var name = temp.split('_')[0]
var type = temp.split('_')[temp.split('_').length-1].split('.')[1]
if(temp.indexOf('_')==-1){
return name
}else{
return name+'.'+type
}
} else {
return "";
}
}
export default {
downloadFileFormatNew
}
\ No newline at end of file
<template>
<div class="base-info" v-if="data">
<div class="info-icon" v-if="data.ability_logo">
<img :src="data.ability_logo" />
</div>
<div class="info-detail">
<h3>
<span>{{ data.ability_name }}</span>
<span class="openness" v-if="data.openness_name != ''">{{ data.openness_name }}</span>
</h3>
<p>{{ data.synopsis }}</p>
<ul>
<li class="text-clip">
<bg-icon icon="#bg-ic-layers" />
<span>业务类型:</span>
<span>{{ data.business_type_name }}</span>
</li>
<li class="text-clip">
<bg-icon icon="#bg-ic-user" />
<span>联系人:&emsp;</span>
<span>{{ data.contact_person }}</span>
</li>
<li class="text-clip">
<bg-icon icon="#bg-ic-time" />
<span>发布时间:&emsp;&emsp;</span>
<span>{{ data.created_time }}</span>
</li>
<li class="text-clip">
<bg-icon icon="#bg-ic-layout-4" />
<span>业务领域:</span>
<span>{{ data.sectors_name }}</span>
</li>
<li class="text-clip">
<bg-icon icon="#bg-ic-phone-call" />
<span>联系电话:</span>
<span>{{ data.contact_phone }}</span>
</li>
<li class="text-clip">
<bg-icon icon="#bg-ic-time" />
<span>最后更新时间:</span>
<span>{{ data.updated_time }}</span>
</li>
</ul>
</div>
</div>
</template>
<script>
export default {
name: "BaseInfo",
props: {
data: {
type: Object,
default: () => null,
},
},
};
</script>
<style lang="scss" scoped>
.base-info {
padding: 24px;
background-color: #fff;
box-shadow: 0px 1px 4px 0px rgba(0, 7, 101, 0.15);
border-radius: 6px;
margin-bottom: 16px;
display: flex;
justify-content: flex-start;
align-items: flex-start;
> .info-icon {
flex: 0 0 144px;
height: 144px;
background-color: #f5f6fa;
border-radius: 4px;
overflow: hidden;
margin-right: 24px;
> img {
width: 100%;
height: 100%;
}
}
> .info-detail {
flex: 1;
> h3 {
font-weight: bold;
font-size: 16px;
line-height: 32px;
color: #202531;
.openness {
margin-left: 10px;
display: inline-block;
border: 1px solid #9ad5c8;
background-color: #f1f9f7;
border-radius: 3px;
font-size: 12px;
line-height: 1;
padding: 3px 6px;
color: #429e8a;
font-weight: normal;
}
}
> p {
font-size: 14px;
line-height: 20px;
color: #202531;
}
> ul {
padding: 16px;
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
align-items: center;
background-color: #f5f6fa;
border-radius: 4px;
overflow: hidden;
margin-top: 16px;
> li {
width: 30%;
margin-right: 16px;
> .bg-icon {
margin-right: 8px;
}
> span {
font-size: 14px;
line-height: 34px;
color: #616f94;
> :nth-child(2) {
color: #202531;
}
}
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="folder-info">
<div class="left-part" :class="include_mock_service? '' : 'padding-reset'">
<bg-btns v-model="type" :options="types" v-if="!mockDetail && include_mock_service" />
<el-tree
:data="data"
node-key="code"
default-expand-all
@node-click="handleNodeClick"
>
<template #default="{ data }">
<div class="custom-tree-node" pointer-events="none">
<template v-if="data.node_type === 0">
<bg-icon
icon="#bg-ic-s-folder-opened"
v-if="fileOpenState[data.code] !== false"
/>
<bg-icon icon="#bg-ic-s-folder" v-else />
</template>
<template v-else>
<el-tooltip
effect="dark"
:content="testStateTexts[data.test_state]"
placement="top"
>
<bg-icon
v-if="data.service_type != 'cda56bb2-d00d-436d-9fc2-0508737fe503'"
:class="`state-${data.test_state}`"
:icon="testStateIcons[data.test_state]"
/>
</el-tooltip>
</template>
<span :style="data.service_type != 'cda56bb2-d00d-436d-9fc2-0508737fe503' ? {} : { marginLeft: '20px' }">{{ data.node_name }}</span>
</div>
</template>
</el-tree>
</div>
<div class="right-part" v-if="nodeDetail">
<folder
class="folder-detail"
:data="nodeDetail"
:disabled="true"
v-if="nodeDetail.node_type == 0"
:showTip="false"
/>
<file :data="nodeDetail" :disabled="true" :detailMock="type == 'configMock' && !mockDetail" v-else />
</div>
</div>
</template>
<script>
import { reactive, toRefs, watch, onBeforeMount } from "vue";
import Folder from "@/page/main/ability-register/step2/folder.vue";
import File from "@/page/main/ability-register/step2/file/index.vue";
import axios from "@/request/http.js";
export default {
name: "BaseInfo",
components: { Folder, File },
props: {
id: {
type: String,
required: true,
},
// 是否为mock服务详情
mockDetail: {
type: Boolean,
default: false
}
},
setup(props) {
const state = reactive({
type: "",
data: [],
types: [
{
name: "真实能力",
value: "",
},
{
name: "mock能力",
value: "configMock",
},
],
fileOpenState: {},
nodeDetail: null,
testStateTexts: [
"未测试",
"测试成功",
"测试失败",
"其中有服务未测试",
"其中有服务测试未通过",
],
testStateIcons: [
"#bg-ic-s-circle-warning",
"#bg-ic-s-circle-check",
"#bg-ic-s-circle-close",
"#bg-ic-s-circle-question",
"#bg-ic-s-circle-question",
],
include_mock_service: false, // 真实能力中是否配置mock服务
});
const getTreeData = () => {
state.data = [];
state.nodeDetail = null;
axios
.get(`/apaas/service/v5/ability/info`, {
params: {
id: props.id,
queryType: props.mockDetail ? "" : state.type,
},
})
.then(({ data }) => {
if (data.code == 200) {
state.data = data.data.folder;
state.include_mock_service = data.data.ability_info.include_mock_service || false
console.log(state.include_mock_service)
}
});
};
const handleNodeClick = (data) => {
state.nodeDetail = null;
if (data.children) {
let flag = state.fileOpenState[data.code] !== false;
state.fileOpenState[data.code] = !flag;
}
if (data.node_type === 0) {
setTimeout(() => {
state.nodeDetail = { ...data, children: undefined };
}, 50);
} else {
axios
.get(`/apaas/service/v5/service/detail?treeCode=${data.code}`)
.then(({ data }) => {
if (data.code == 200) {
state.nodeDetail = data.data;
}
});
}
};
watch(
() => state.type,
() => {
getTreeData();
}
);
onBeforeMount(() => {
// 如果是mock能力详情,给type赋值后会触发watch然后去获取树形 所以不需要初始化时请求该接口
if (props.mockDetail) {
state.type = "configMock"
}else {
getTreeData();
}
});
return {
...toRefs(state),
handleNodeClick,
};
},
};
</script>
<style lang="scss" scoped>
.folder-info {
display: flex;
justify-content: flex-start;
align-items: stretch;
overflow: hidden;
> .left-part {
flex: 0 0 281px;
padding: 24px 0;
border-right: 1px solid #ebedf2;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
> .bg-btns {
margin: 0 auto;
}
> .el-tree {
width: 100%;
margin-top: 16px;
:deep() {
.el-icon.el-tree-node__expand-icon {
display: none;
}
}
}
}
> .padding-reset {
padding: 8px 0 24px;
}
> .right-part {
// flex: 1 1 calc(100% - 281px);
flex: 1;
// padding: 16px;
box-sizing: border-box;
.folder-detail {
width: 100%;
margin: 0;
display: flex;
:deep() {
.left-span {
width: 80px;
padding-top: 68px !important;
}
.right-container {
padding: 12px 0;
// float: none;
// width: 100%;
// .tips {
// display: none;
// }
}
}
}
}
}
.custom-tree-node {
padding: 0 16px;
> .bg-icon {
font-size: 12px;
margin-right: 8px;
&.state-0 {
color: #dd6955;
}
&.state-1 {
color: #48ad97;
}
&.state-2 {
color: #dd6955;
}
&.state-3 {
color: #dd6955;
}
&.state-4 {
color: #dd6955;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="source_table">
<edit-table @change="changeRow" :header="headerData" :tableData="tableData"></edit-table>
</div>
</template>
<script>
import editTable from './edit-table.vue'
export default {
props: {
afterData:{
type:Array,
default:()=>[]
}
},
components: {
editTable
},
data() {
return {
headerData:[],
priceType:[],
priceTypeArr:[3,4]
};
},
watch: {
},
computed: {
tableData(){
if(this.afterData.length==0){
let temp = []
if(this.priceTypeArr.includes(3)){//1预付费时长2预付费次数3后付费次数4后付费时长5一次性
temp.push(
{
id:0,
money:'',
spcs_type:1,
isSave:false,
descript:'先用后付,用多少付多少',
}
)
}
if(this.priceTypeArr.includes(4)){
temp.push(
{
id:0,
money:'',
spcs_type:2,
isSave:false,
descript:'先用后付,用多少付多少',
}
)
}
return temp
}else{
let temp = JSON.parse(JSON.stringify(this.afterData))
let deleteTemp = []
if(temp.length!==2){
if(temp[temp.length-1].spcs_type==1&&this.priceTypeArr.includes(4)){
temp.push(
{
id:0,
money:'',
spcs_type:2,
isSave:false,
descript:'先用后付,用多少付多少',
}
)
}else if(temp[temp.length-1].spcs_type==2&&this.priceTypeArr.includes(3)){
temp.push(
{
id:0,
money:'',
spcs_type:1,
isSave:false,
descript:'先用后付,用多少付多少',
}
)
}
}
temp.forEach((e,index) => {
if(e.spcs_type==1&&this.priceTypeArr.includes(3)){
deleteTemp.push(e)
}
if(e.spcs_type==2&&this.priceTypeArr.includes(4)){
deleteTemp.push(e)
}
});
return deleteTemp
}
},
disableTimes(){
return !this.priceTypeArr.includes(3)
},
disableTime(){
return !this.priceTypeArr.includes(4)
},
},
created() {
this.headerData=[
{
name:'计费方式',
value:[
// {
// type:'text',
// value:'后付费-计次'
// }
{
type:'select',
arr:[
{
label:'后付费-计次',
value:1,
disabled:this.disableTimes
},
{
label:'后付费-计时',
value:2,
disabled:this.disableTime
},
],
disabled:true,
placeholder:'选择计费方式',
value:'spcs_type',
check:this.checkType,
}
]
},
{
name:'单价',
width:'280px',
value:[
{
type:'input',
value:'money',
disabled:false,
check:this.checkValue,
show:this.timeTextShow,
placeholder:'输入单价',
},
{
type:'text',
value:'元/次',
show:this.timeTextShow,
},
{
type:'input',
default:10,
value:'money',
disabled:false,
width:'100px',
show:this.timeInputShow,
check:this.checkValue,
placeholder:'输入单价',
},
{
type:'text',
value:'元/',
show:this.timeInputShow,
},
{
type:'select',
width:'100px',
show:this.timeInputShow,
check:this.checkTimeType,
arr:[
{
label:'',
value:1,
},
{
label:'',
value:2,
},
{
label:'',
value:3,
},
],
disabled:false,
value:'duration_unit'
},
]
},
{
name:'规格说明',
value:[
{
type:'value',
value:'descript'
}
]
},
{
name:'操作',
value:[
{
type:'button',
value:'保存',
show:this.saveShow,
callback:this.save
}
]
}
]
},
mounted() {
},
methods: {
saveShow(scope){
if(scope.row.isSave){
return false
}else{
return true
}
},
timeInputShow(scope){
if(this.tableData[scope.$index].spcs_type==2){
return true
}else{
return false
}
},
timeTextShow(scope){
if(this.tableData[scope.$index].spcs_type==1){
return true
}else{
return false
}
},
checkTime(value){
let reg = /^\+?[1-9]\d*$/
if(value){
if(reg.test(value)){
return true
}else{
this.$message.error('请输入正确时长')
return false
}
}else{
this.$message.error('请输入时长')
return false
}
},
checkTimeType(value){
if(value){
return true
}else{
this.$message.error('请选择时长类型')
return false
}
},
checkValue(value){
let reg = /(?:^[1-9]([0-9]{0,7})?(?:\.[0-9]{1,2})?$)|(?:^(?:0)$)|(?:^[0-9]\.[0-9](?:[0-9])?$)/
if(value){
if(reg.test(value)){
return true
}else{
this.$message.error('请输入正确价格')
return false
}
}else{
this.$message.error('请输入单价')
return false
}
},
checkType(value){
if(value){
return true
}else{
this.$message.error('请选择类型')
return false
}
},
save(scope){
if(this.tableData[scope.$index].spcs_type==1){
if(!this.checkValue(scope.row.money)){
return
}
}else{
if(!this.checkValue(scope.row.money)){
return
}
if(!this.checkTimeType(scope.row.duration_unit)){
return
}
}
this.tableData[scope.$index].isSave = true
this.$message.success('此数据校验成功')
},
changeRow(val){
console.log(val);
this.tableData[val.$index].isSave = false
if(val.check){
if(val.check(this.tableData[val.$index][val.type])){
this.tableData[val.$index].descript = '先用后付,用多少付多少'
}else{
return false
}
}
console.log(this.tableData[val.$index]);
},
},
};
</script>
<style scoped>
</style>
<!-- grpc -->
<template>
<!-- 去掉操作 -->
<div>
<div class="baseInfo_box">
<div class="baseInfo">
<bg-info :data="apiBaseInfo" />
</div>
<div class="apaas_button test_btn">
<el-button type="primary" @click="serviceTest">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-checklist"></bg-icon>
服务测试
</el-button>
</div>
</div>
<div class="req_box">
<p class="input-title">
<span class="before_title"></span>
接口文档介绍
<span class="after_icon" @click="res_body_open=!res_body_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="res_body_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="res_body_open">
<div v-html="detail_data.doc_desc" class="doc_desc"></div>
</div>
</div>
<!-- 测试结果弹窗 -->
<el-dialog
custom-class="dialog_box result_box"
title="提示"
v-model="showDialog"
width="400px"
:before-close="
() => {
dialogClose()
}"
>
<div class="dialog_info">
<bg-icon v-if="dialogInfo.state" style="font-size: 26px; color: #429e8a; margin-right: 10px" icon="#bg-ic-circle-check"></bg-icon>
<bg-icon v-else style="font-size: 26px; color: #d75138; margin-right: 10px" icon="#bg-ic-circle-close"></bg-icon>
<span>{{dialogInfo.msg}}</span>
</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button @click="dialogClose">取 消</el-button>
<el-button type="primary" @click="dialogClose">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs,getCurrentInstance } from 'vue'
import { useRouter,useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const { proxy } = getCurrentInstance()
const { $axios,$message } = proxy
const props = defineProps({
data: {
type: Object,
default: null
}
})
const emit = defineEmits(["dialogClose"])
const router = useRouter()
const route = useRoute()
const state = reactive({data1:1})
const {data1} = toRefs(state)
const detailData = reactive({
apiBaseInfo: [
{
name: "能力名称",
value: "",
nameWidth: 112
},
{
name: "调用地址",
value: "",
nameWidth: 112
},
{
name: "是否TLS协议",
value: "",
full: true,
nameWidth: 112
},
], // 基本信息
detail_data: {},
res_body_open: true,
showDialog: false,
dialogInfo: {
msg: "该服务地址正常",
state: true
},
})
const detail = props.data
detailData.detail_data = props.data
if (detail) {
detailData.apiBaseInfo[0].value = detail.service_name
detailData.apiBaseInfo[1].value = detail.req_url
detailData.apiBaseInfo[2].value = ['',''][detail.tls_protocol]
}
const serviceTest = () => {
let params = {
interface_type: 2,
url: detail.req_url,
id: detail.id.toString()
}
$axios
.post(`/apaas/service/v5/service/test`,params)
.then((res) => {
if (res.data.code !== 200) {
$message.error(res.data.data)
} else {
detailData.showDialog = true
if (res.data.data.response_code == 200) {
detailData.dialogInfo = {
msg: "该服务地址正常",
state: true
}
}else {
detailData.dialogInfo = {
msg: "该服务地址异常",
state: false
}
}
}
})
}
const dialogClose = () => {
detailData.showDialog = false
emit("refresh",detail.ability_tree_code)
}
const {
apiBaseInfo,
detail_data,
res_body_open,
showDialog,
dialogInfo,
} = toRefs(detailData)
</script>
<style lang="scss" scoped>
.baseInfo_box {
width: 100%;
display: flex;
justify-content: space-between;
.baseInfo {
width: 872px;
}
}
.req_box {
width: 872px;
margin-top: 30px;
.input-title {
font-size: 16px;
color: #202531;
margin-top: 9px;
margin-bottom: 15px;
font-weight: 700;
line-height: 1;
.before_title {
display: inline-block;
width: 4px;
height: 14px;
background-color: #2b4695;
margin-right: 8px;
border-radius: 2px;
}
.after_icon {
float: right;
cursor: pointer;
}
}
.doc_desc {
width: 100%;
height: 406px;
padding: 16px 24px;
background-color: #fafafa;
border-radius: 4px;
color: #202531;
font-size: 14px;
}
}
.dialog_info {
padding: 27px 0 11px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
\ No newline at end of file
<!-- mobileSDK -->
<template>
<div>
<div class="baseInfo_box">
<div class="baseInfo">
<bg-info :data="apiBaseInfo" />
</div>
</div>
<div class="req_box">
<p class="input-title">
<span class="before_title"></span>
接口文档介绍
<span class="after_icon" @click="res_body_open=!res_body_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="res_body_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="res_body_open">
<div v-html="detail_data.doc_desc" class="doc_desc"></div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs,getCurrentInstance } from 'vue'
import { useRouter,useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const { proxy } = getCurrentInstance()
const { $axios,$message } = proxy
const props = defineProps({
data: {
type: Object,
default: null
}
})
const router = useRouter()
const route = useRoute()
const detailData = reactive({
apiBaseInfo: [
{
name: "能力名称",
value: "",
full: true,
nameWidth: 104
},
{
name: "支持类型",
value: "",
nameWidth: 104,
},
{
name: "支持系统",
value: "",
nameWidth: 104,
},
{
name: "SDK包",
value: "",
nameWidth: 104,
download: true,
url: ""
},
{
name: "SDK版本号",
value: "",
nameWidth: 104,
},
{
name: "承诺书",
value: "",
full: true,
nameWidth: 104,
download: true,
url: ""
},
], // 基本信息
detail_data: {},
res_body_open: true,
})
const detail = props.data
detailData.detail_data = props.data
if (detail) {
let sdkFile = detail.msdk_file ? JSON.parse(detail.msdk_file) : []
let commitment = detail.commitment ? JSON.parse(detail.commitment) : []
detailData.apiBaseInfo[0].value = detail.service_name
detailData.apiBaseInfo[1].value = ['','Android','IOS','其它'][detail.msdk_type]
detailData.apiBaseInfo[2].value = detail.msdk_system
detailData.apiBaseInfo[3].value = sdkFile[0].name
detailData.apiBaseInfo[3].url = sdkFile[0].url
detailData.apiBaseInfo[4].value = detail.sdk_version
detailData.apiBaseInfo[5].value = commitment[0].name
detailData.apiBaseInfo[5].url = commitment[0].url
}
const {
apiBaseInfo,
detail_data,
res_body_open,
} = toRefs(detailData)
</script>
<style lang="scss" scoped>
.baseInfo_box {
width: 100%;
display: flex;
justify-content: space-between;
.baseInfo {
width: 872px;
}
}
.req_box {
width: 872px;
margin-top: 30px;
.input-title {
font-size: 16px;
color: #202531;
margin-top: 9px;
margin-bottom: 15px;
font-weight: 700;
line-height: 1;
.before_title {
display: inline-block;
width: 4px;
height: 14px;
background-color: #2b4695;
margin-right: 8px;
border-radius: 2px;
}
.after_icon {
float: right;
cursor: pointer;
}
}
.doc_desc {
width: 100%;
height: 406px;
padding: 16px 24px;
background-color: #fafafa;
border-radius: 4px;
color: #202531;
font-size: 14px;
}
}
.dialog_info {
padding: 27px 0 17px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
\ No newline at end of file
<!-- MQ -->
<template>
<div>
<div class="baseInfo_box">
<div class="baseInfo">
<bg-info :data="apiBaseInfo" />
</div>
<div class="apaas_button test_btn">
<el-button type="primary" @click="serviceTest">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-checklist"></bg-icon>
服务测试
</el-button>
</div>
</div>
<div class="req_box">
<p class="input-title">
<span class="before_title"></span>
Topic
<span class="after_icon" @click="topic_open=!topic_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="topic_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="topic_open">
<div class="topic_box" v-if="topicInfo && topicInfo.length > 0">
<div class="left">
<div class="items">
<div
v-for="(item,idx) in topicInfo"
:key="idx"
class="topic_item"
:class="currentTopic.id == item.id ? 'current' : ''"
@click="changeCurrentTopic(item)"
>
<el-tooltip
effect="dark"
:content="iconTipInfo[item.test_state]"
placement="top"
>
<bg-icon
class="tree-icon"
:class="classArr[item.test_state]"
:icon="iconArr[item.test_state]"
></bg-icon>
</el-tooltip>
{{item.name}}
</div>
</div>
</div>
<div class="right">
{{currentTopic.desc}}
</div>
</div>
<div class="no_data" v-else>
<img src="../../assets/imgs/img-no-data.png" alt="">
<div class="text">无参数</div>
</div>
</div>
<p class="input-title mt">
<span class="before_title"></span>
接口文档介绍
<span class="after_icon" @click="res_body_open=!res_body_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="res_body_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="res_body_open">
<div v-html="detail_data.doc_desc" class="doc_desc"></div>
</div>
</div>
<!-- 测试结果弹窗 -->
<el-dialog
custom-class="dialog_box result_box"
title="提示"
v-model="showDialog"
width="400px"
:before-close="
() => {
dialogClose()
}
"
>
<div class="dialog_info">
<bg-icon v-if="dialogInfo.state" style="font-size: 26px; color: #429e8a; margin-right: 10px" icon="#bg-ic-circle-check"></bg-icon>
<bg-icon v-else style="font-size: 26px; color: #d75138; margin-right: 10px" icon="#bg-ic-circle-close"></bg-icon>
<span>{{dialogInfo.msg}}</span>
</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button @click="dialogClose">取 消</el-button>
<el-button type="primary" @click="dialogClose">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs,getCurrentInstance } from 'vue'
import { useRouter,useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const { proxy } = getCurrentInstance()
const { $axios,$message } = proxy
const props = defineProps({
data: {
type: Object,
default: null
}
})
const emit = defineEmits(["dialogClose"])
const router = useRouter()
const route = useRoute()
const detailData = reactive({
apiBaseInfo: [
{
name: "能力名称",
value: "",
nameWidth: 104
},
{
name: "调用地址",
value: "",
nameWidth: 104
},
{
name: "平台协议",
value: "",
nameWidth: 104
},
{
name: "平台版本号",
value: "",
nameWidth: 104,
},
{
name: "用户名",
value: "",
nameWidth: 104
},
{
name: "密码",
value: "",
nameWidth: 104,
password: true,
realValue: "",
},
], // 基本信息
topicInfo: [],
detail_data: {},
res_body_open: true,
showDialog: false,
dialogInfo: {
msg: "该服务地址正常",
state: true
},
topic_open: true,
currentTopic: {},
classArr: [
"question",
"success",
"close",
],
iconArr: [
"#bg-ic-s-circle-question",
"#bg-ic-s-circle-check",
"#bg-ic-s-circle-close"
],
iconTipInfo: [
"该主题还未进行测试",
"该主题测试通过",
"该主题测试不通过"
],
})
const detail = props.data
detailData.detail_data = props.data
if (detail) {
detailData.apiBaseInfo[0].value = detail.service_name
detailData.apiBaseInfo[1].value = detail.req_url
detailData.apiBaseInfo[2].value = ["","kafka","rocketMQ","rabbitMQ"][detail.mq_protocol]
detailData.apiBaseInfo[3].value = detail.mq_version
detailData.apiBaseInfo[4].value = detail.mq_user_name
detailData.apiBaseInfo[5].value = "***************"
detailData.apiBaseInfo[5].realValue = detail.mq_password
detailData.topicInfo = detail.mq_topic || []
detailData.currentTopic = detailData.topicInfo[0] || {}
}
const changeCurrentTopic = (item) => {
detailData.currentTopic = item
}
const serviceTest = () => {
let params = {
interface_type: 4,
url: detail.req_url,
mq_protocol: detail.mq_protocol,
mq_exchange: detailData.currentTopic.name,
mq_password: detail.mq_password,
mq_user: detail.mq_user,
mq_id: detailData.currentTopic.id,
id: detail.id.toString()
}
$axios
.post(`/apaas/service/v5/service/test`,params)
.then((res) => {
if (res.data.code !== 200) {
$message.error(res.data.data)
} else {
detailData.showDialog = true
if (res.data.data.response_code == 200) {
detailData.dialogInfo = {
msg: "该服务地址正常",
state: true
}
}else {
detailData.dialogInfo = {
msg: "该服务地址异常",
state: false
}
}
}
})
}
const dialogClose = () => {
detailData.showDialog = false
emit("refresh",detail.ability_tree_code)
}
const {
apiBaseInfo,
detail_data,
res_body_open,
showDialog,
dialogInfo,
topicInfo,
topic_open,
currentTopic,
classArr,
iconArr,
iconTipInfo,
} = toRefs(detailData)
</script>
<style lang="scss" scoped>
.baseInfo_box {
width: 100%;
display: flex;
justify-content: space-between;
.baseInfo {
width: 872px;
}
}
.req_box {
width: 872px;
margin-top: 30px;
.input-title {
font-size: 16px;
color: #202531;
margin-top: 9px;
margin-bottom: 15px;
font-weight: 700;
line-height: 1;
.before_title {
display: inline-block;
width: 4px;
height: 14px;
background-color: #2b4695;
margin-right: 8px;
border-radius: 2px;
}
.after_icon {
float: right;
cursor: pointer;
}
}
.mt {
margin-top: 24px;
}
.no_data {
text-align: center;
.text {
font-size: 16px;
color: #616f94;
line-height: 1;
}
}
.doc_desc {
width: 100%;
height: 406px;
padding: 16px 24px;
background-color: #fafafa;
border-radius: 4px;
color: #202531;
font-size: 14px;
}
.topic_box {
display: flex;
.left {
width: 200px;
margin-right: 16px;
font-size: 14px;
color: #202531;
.items {
border: 1px solid #dadee7;
padding: 4px 0;
.topic_item {
height: 34px;
line-height: 34px;
padding: 0 8px;
cursor: pointer;
display: flex;
align-items: center;
.tree-icon {
font-size: 12px;
color: #909bb6;
margin-right: 6px;
}
.success {
color: #48ad97;
}
.close {
color: #dd6955;
}
}
.current {
background-color: #eff2fa;
color: #3759be;
}
}
}
.right {
flex: 1;
height: 332px;
background-color: #fafafa;
border-radius: 4px;
padding: 15px 24px;
}
}
}
.dialog_info {
padding: 27px 0 11px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
\ No newline at end of file
<template>
<!-- 去掉操作 -->
<div>
<div class="baseInfo_box">
<div class="baseInfo">
<bg-info :data="apiBaseInfo" />
</div>
<div class="apaas_button test_btn">
<el-button type="primary" @click="serviceTest">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-checklist"></bg-icon>
服务测试
</el-button>
</div>
</div>
<div class="req_box">
<el-tabs v-model="activeName">
<el-tab-pane label="URL参数" name="first">
<p class="input-title">
<span class="before_title"></span>
参数查询
<span class="after_icon" @click="cs_open=!cs_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="cs_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="cs_open">
<bg-table-pro
class="input_table"
:headers="headers"
:data="norData"
ref="cs-table"
:border="true"
:stripe="false"
v-if="norData && norData.length > 0"
>
<template v-slot:value="{ row }">
<el-input
v-model="row.value"
/>
</template>
</bg-table-pro>
<div class="no_data" v-else>
<img src="../../assets/imgs/img-no-data.png" alt="">
<div class="text">无参数</div>
</div>
</div>
<p class="input-title mt">
<span class="before_title"></span>
动态参数
<span class="after_icon" @click="dt_open=!dt_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="dt_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="dt_open">
<bg-table-pro
class="input_table"
:headers="headers"
:data="actData"
ref="dt-table"
:border="true"
:stripe="false"
v-if="actData && actData.length > 0"
>
<template v-slot:value="{ row }">
<el-input
v-model="row.value"
/>
</template>
</bg-table-pro>
<div class="no_data" v-else>
<img src="../../assets/imgs/img-no-data.png" alt="">
<div class="text">无参数</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="Header" name="second">
<p class="input-title">
<span class="before_title"></span>
Header
<span class="after_icon" @click="header_open=!header_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="header_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="header_open">
<bg-table-pro
:headers="headers"
:data="headerData"
ref="header-table"
:border="true"
:stripe="false"
v-if="headerData && headerData.length > 0"
>
<template v-slot:value="{ row }">
<el-input
v-model="row.value"
/>
</template>
</bg-table-pro>
<div class="no_data" v-else>
<img src="../../assets/imgs/img-no-data.png" alt="">
<div class="text">无参数</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="body" name="third">
<p class="input-title">
<span class="before_title"></span>
Body
<span class="after_icon" @click="body_open=!body_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="body_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="body_open">
<!-- raw -->
<div v-if="bodyData && bodyData.show_type === 0 && bodyData.data && bodyData.data.length > 0" class="body_code" :style="{'height':bodyData.data_type === 1 || bodyData.data_type === 2 ? '406px' : '240px'}">
<!-- json或xml展示代码块 -->
<bg-code-editor
class="bg-ace-editor"
v-model="bodyData.data"
v-if="bodyData.data_type === 1 || bodyData.data_type === 2"
></bg-code-editor>
<!-- text或html或JavaScript展示多行文本框 -->
<el-input
v-model="bodyData.data"
:rows="10"
type="textarea"
v-else
/>
</div>
<!-- formdata和x-www-form-urlencoded 表格 -->
<bg-table-pro
:headers="headers"
:data="bodyData.data"
ref="body-table"
:border="true"
:stripe="false"
v-else-if="bodyData && (bodyData.show_type === 1 || bodyData.show_type === 2) && bodyData.data && bodyData.data.length > 0"
>
<template v-slot:value="{ row }">
<el-input
v-model="row.value"
/>
</template>
</bg-table-pro>
<div class="no_data" v-else>
<img src="../../assets/imgs/img-no-data.png" alt="">
<div class="text">无参数</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="授权" name="fourth">
<folder :data="detail_data" useType="service" :disabled="true"></folder>
</el-tab-pane>
</el-tabs>
</div>
<div class="req_box res_box" v-if="test_state">
<el-tabs v-model="activeName1">
<el-tab-pane label="body" name="first">
<div class="body_code">
<bg-code-editor
class="bg-ace-editor bg-ace-editor-disabled"
v-model="backJSONdata"
disabled
></bg-code-editor>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs,getCurrentInstance } from 'vue'
import { useRouter,useRoute } from 'vue-router'
import folder from "@/page/main/ability-register/step2/folder.vue"
const { proxy } = getCurrentInstance()
const { $axios,$message } = proxy
const props = defineProps({
data: {
type: Object,
default: null
}
})
const emit = defineEmits(["serviceTest"])
const router = useRouter()
const route = useRoute()
const detailData = reactive({
cs_open: true,
dt_open: true,
header_open: true,
body_open: true,
res_body_open: true,
activeName: "first",
apiBaseInfo: [
{
name: "接口名称",
value: "",
nameWidth: 104
},
{
name: "调用地址",
value: "",
nameWidth: 104
},
{
name: "请求方式",
value: "",
nameWidth: 104
},
{
name: "返回格式",
value: "",
nameWidth: 104
},
], // 基本信息
headers: [
{
label: "",
prop: "name",
},
{
label: "",
prop: "value",
},
{
label: "描述",
prop: "desc",
},
], // 表头
rawHeaders: [
{
label: "参数名称",
prop: "paramName",
},
{
label: "参数类型",
prop: "paramType",
},
{
label: "示例",
prop: "paramValue",
},
{
label: "说明",
prop: "desc",
},
],
bodyData: {
show_type: "",
data_type: "",
data: []
},
norData: [],
actData: [],
headerData: [],
backJSONdata: "hahahaah",
treeProps: { hasChildren: 'hasChildren', children: 'children' },
rowKey: "id",
detail_data: {},
test_state: false,
activeName1: "first"
})
const detail = props.data
detailData.detail_data = props.data
let serviceInfo = detail.service_info
//json对象转xml字符串
var json2xml=(o, tab)=> {
var toXml = function(v, name, ind) {
var xml = "";
if (v instanceof Array) {
for (var i=0, n=v.length; i<n; i++)
xml += ind + toXml(v[i], name, ind+"\t") + "\n";
}
else if (typeof(v) == "object") {
var hasChild = false;
xml += ind + "<" + name;
for (var m in v) {
if (m.charAt(0) == "@")
xml += " " + m.substr(1) + "=\"" + v[m].toString() + "\"";
else
hasChild = true;
}
xml += hasChild ? ">" : "/>";
if (hasChild) {
for (var m in v) {
if (m == "#text")
xml += v[m];
else if (m == "#cdata")
xml += "<![CDATA[" + v[m] + "]]>";
else if (m.charAt(0) != "@")
xml += toXml(v[m], m, ind+"\t");
}
xml += (xml.charAt(xml.length-1)=="\n"?ind:"") + "</" + name + ">";
}
}
else {
xml += ind + "<" + name + ">" + v.toString() + "</" + name + ">";
}
return xml;
}, xml="";
for (var m in o)
xml += toXml(o[m], m, "");
return tab ? xml.replace(/\t/g, tab) : xml.replace(/\t|\n/g, "");
}
if (detail) {
detailData.apiBaseInfo[0].value = detail.service_name
detailData.apiBaseInfo[1].value = detail.req_url
detailData.apiBaseInfo[2].value = ['','GET','POST','PUT','DELETE'][detail.req_type]
detailData.apiBaseInfo[3].value = ['','JSON','XML','Text','HTML','图片','文件','自动'][detail.res_fields.res_type]
detailData.norData = detail.req_query.query_data || []
detailData.actData = detail.req_query.param_data || []
detailData.headerData = detail.req_headers
detailData.bodyData = detail.req_body
let tableRows = detailData.bodyData && detailData.bodyData.data ? detailData.bodyData.data : []
let tableStr = JSON.stringify(tableRows)
if (detailData.bodyData && detailData.bodyData.show_type == 0 && detailData.bodyData.data_type == 1) {
detailData.bodyData.data = tableStr
}else if (detailData.bodyData && detailData.bodyData.show_type == 0 && detailData.bodyData.data_type == 2) {
detailData.bodyData.data = json2xml(JSON.parse(tableStr))
}
}
const serviceTest = () => {
let header = null
if (detail.headers && detail.headers.length > 0) {
detail.req_headers.forEach((e,i) => {
header[e.name] = [e.value]
})
}
let body = ""
if (detailData.bodyData.show_type == 0 && detailData.bodyData.data_type == 1 || detailData.bodyData.show_type == 1 || detailData.bodyData.show_type == 2) {
body = detailData.bodyData.data && detailData.bodyData.data.length > 0 ? JSON.stringify(detailData.bodyData.data) : ""
}else {
body = detailData.bodyData.data && detailData.bodyData.data.length > 0? detailData.bodyData.data : ""
}
let show_type = detailData.bodyData.show_type
let data_type = detailData.bodyData.data_type
let content_type = ""
if (show_type == 0) {
switch (data_type) {
case 1:
content_type = "application/json";
break;
case 2:
content_type = "application/xml";
break;
case 3:
content_type = "application/javascript";
break;
case 4:
content_type = "text/plain";
break;
case 5:
content_type = "text/html";
break;
}
}
let authData = {
req_auth_method: null,
req_auth_token: "",
req_auth_token_name: "",
}
let code = detail.ability_tree_code
if (detail.req_auth_method != 0) {
authData.req_auth_method = detail.req_auth_method
authData.req_auth_token= detail.req_auth_token
authData.req_auth_token_name= detail.req_auth_key
}else {
for (let index = 0; index > -1; index++) {
if(serviceInfo[code].req_auth_method==0){
code = serviceInfo[code].p_code
}else{
authData.req_auth_method = serviceInfo[code].req_auth_method
authData.req_auth_token= serviceInfo[code].req_auth_token
authData.req_auth_token_name= serviceInfo[code].req_auth_key
break
}
}
}
let params = {
interface_type: 1,
method: detail.req_type,
url: detail.req_url,
req_auth_method: authData.req_auth_method,
req_auth_token: authData.req_auth_token,
req_auth_token_name: authData.req_auth_token_name,
headers: header,
body: body,
content_type: content_type,
id: detail.id.toString(),
params: {
query_data: detailData.norData,
param_data: detailData.actData,
}
}
$axios
.post(`/apaas/service/v5/service/test`,params)
.then((res) => {
if (res.data.code !== 200) {
$message.error(res.data.msg)
} else {
detailData.test_state = true
detailData.backJSONdata = res.data.data.response_str
emit("refresh",detail.ability_tree_code)
}
})
}
const {
cs_open,
dt_open,
header_open,
body_open,
res_body_open,
headers,
apiBaseInfo,
activeName,
activeName1,
norData,
actData,
headerData,
JSONdata,
XMLdata,
JSdata,
Textdata,
HTMLdata,
backJSONdata,
rawHeaders,
bodyData,
treeProps,
rowKey,
detail_data,
test_state,
} = toRefs(detailData)
</script>
<style lang="scss" scoped>
.baseInfo_box {
width: 100%;
display: flex;
justify-content: space-between;
.baseInfo {
width: 872px;
}
}
.req_box {
width: 872px;
margin-top: 30px;
.input-title {
font-size: 16px;
color: #202531;
margin-top: 9px;
margin-bottom: 15px;
font-weight: 700;
line-height: 1;
.before_title {
display: inline-block;
width: 4px;
height: 14px;
background-color: #2b4695;
margin-right: 8px;
border-radius: 2px;
}
.after_icon {
float: right;
cursor: pointer;
}
}
.mt {
margin-top: 24px;
}
.input_table {
:deep().el-table__cell {
padding: 14px 0!important;
.el-input__inner {
height: 33px;
}
}
}
.text_box {
padding: 16px 24px;
background-color: #fafafa;
border-radius: 4px;
height: 406px;
}
.body_code {
width: 100%;
height: 406px;
.bg-ace-editor {
background-color: #1a1a1a;
}
.bg-ace-editor-disabled {
background-color: #fff;
:deep().ace_marker-layer .ace_active-line {
background-color: #fff;
}
}
}
.no_data {
text-align: center;
.text {
font-size: 16px;
color: #616f94;
line-height: 1;
}
}
.folder-container {
width: 100%;
margin-left: 0;
margin-top: 9px;
:deep().left-span {
padding: 0;
}
:deep().right-container {
width: calc(100% - 100px);
}
}
}
</style>
<style scoped>
</style>
<!-- socket -->
<template>
<div>
<div class="baseInfo_box">
<div class="baseInfo">
<bg-info :data="apiBaseInfo" />
</div>
<div class="apaas_button test_btn">
<el-button type="primary" @click="serviceTest">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-checklist"></bg-icon>
服务测试
</el-button>
</div>
</div>
<div class="req_box">
<p class="input-title">
<span class="before_title"></span>
接口文档介绍
<span class="after_icon" @click="res_body_open=!res_body_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="res_body_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="res_body_open">
<div v-html="detail_data.doc_desc" class="doc_desc"></div>
</div>
</div>
<!-- 测试结果弹窗 -->
<el-dialog
custom-class="dialog_box result_box"
title="提示"
v-model="showDialog"
width="400px"
:before-close="
() => {
dialogClose()
}"
>
<div class="dialog_info">
<bg-icon v-if="dialogInfo.state" style="font-size: 26px; color: #429e8a; margin-right: 10px" icon="#bg-ic-circle-check"></bg-icon>
<bg-icon v-else style="font-size: 26px; color: #d75138; margin-right: 10px" icon="#bg-ic-circle-close"></bg-icon>
<span>{{dialogInfo.msg}}</span>
</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button @click="dialogClose">取 消</el-button>
<el-button type="primary" @click="dialogClose">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs,getCurrentInstance } from 'vue'
import { useRouter,useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const { proxy } = getCurrentInstance()
const { $axios,$message } = proxy
const props = defineProps({
data: {
type: Object,
default: null
}
})
const emit = defineEmits(["dialogClose"])
const router = useRouter()
const route = useRoute()
const state = reactive({data1:1})
const {data1} = toRefs(state)
const detailData = reactive({
apiBaseInfo: [
{
name: "能力名称",
value: "",
nameWidth: 104
},
{
name: "调用地址",
value: "",
nameWidth: 104
},
], // 基本信息
detail_data: {},
res_body_open: true,
showDialog: false,
dialogInfo: {
msg: "该服务地址正常",
state: true
},
})
const detail = props.data
detailData.detail_data = props.data
if (detail) {
detailData.apiBaseInfo[0].value = detail.service_name
detailData.apiBaseInfo[1].value = detail.req_url
}
const serviceTest = () => {
let params = {
interface_type: 2,
url: detail.req_url,
id: detail.id.toString()
}
$axios
.post(`/apaas/service/v5/service/test`,params)
.then((res) => {
if (res.data.code !== 200) {
$message.error(res.data.data)
} else {
detailData.showDialog = true
if (res.data.data.response_code == 200) {
detailData.dialogInfo = {
msg: "该服务地址正常",
state: true
}
}else {
detailData.dialogInfo = {
msg: "该服务地址异常",
state: false
}
}
}
})
}
const dialogClose = () => {
detailData.showDialog = false
emit("refresh",detail.ability_tree_code)
}
const {
apiBaseInfo,
detail_data,
res_body_open,
showDialog,
dialogInfo,
} = toRefs(detailData)
</script>
<style lang="scss" scoped>
.baseInfo_box {
width: 100%;
display: flex;
justify-content: space-between;
.baseInfo {
width: 872px;
}
}
.req_box {
width: 872px;
margin-top: 30px;
.input-title {
font-size: 16px;
color: #202531;
margin-top: 9px;
margin-bottom: 15px;
font-weight: 700;
line-height: 1;
.before_title {
display: inline-block;
width: 4px;
height: 14px;
background-color: #2b4695;
margin-right: 8px;
border-radius: 2px;
}
.after_icon {
float: right;
cursor: pointer;
}
}
.doc_desc {
width: 100%;
height: 406px;
padding: 16px 24px;
background-color: #fafafa;
border-radius: 4px;
color: #202531;
font-size: 14px;
}
}
.dialog_info {
padding: 27px 0 11px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
\ No newline at end of file
<!-- MQ -->
<template>
<div>
<div class="baseInfo_box">
<div class="baseInfo">
<bg-info :data="apiBaseInfo" />
</div>
<div class="apaas_button test_btn">
<el-button type="primary" class="refresh_btn" @click="refresh" v-if="showRefreshBtn">
<bg-icon style="font-size: 10px; color: #fff; margin-right: 10px" icon="#bg-ic-refresh"></bg-icon>
刷新
</el-button>
<el-button type="primary" @click="serviceTest">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-checklist"></bg-icon>
服务测试
</el-button>
</div>
</div>
<div class="req_box">
<p class="input-title">
<span class="before_title"></span>
主题
<span class="after_icon" @click="topic_open=!topic_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="topic_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="topic_open">
<div class="topic_box" v-if="uiInfo && uiInfo.length > 0">
<div class="left">
<div class="items">
<div
v-for="(item,idx) in uiInfo"
:key="idx"
class="topic_item"
:class="currentUi.id == item.id ? 'current' : ''"
@click="changeCurrentTopic(item)"
>
<el-tooltip
effect="dark"
:content="iconTipInfo[item.test_state]"
placement="top"
>
<bg-icon
class="tree-icon"
:class="classArr[item.test_state]"
:icon="iconArr[item.test_state]"
></bg-icon>
</el-tooltip>
{{item.theme}}
</div>
</div>
</div>
<div class="right">
<img :src="currentUi.image[0].url" alt="">
</div>
</div>
<div class="no_data" v-else>
<img src="../../assets/imgs/img-no-data.png" alt="">
<div class="text">无参数</div>
</div>
</div>
<p class="input-title mt">
<span class="before_title"></span>
接口文档介绍
<span class="after_icon" @click="res_body_open=!res_body_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="res_body_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="res_body_open">
<div v-html="detail_data.doc_desc" class="doc_desc"></div>
</div>
</div>
<!-- 测试结果弹窗 -->
<el-dialog
custom-class="dialog_box result_box"
title="提示"
v-model="showDialog"
width="400px"
:before-close="
() => {
showDialog = false;
}
"
>
<div class="dialog_info">
<bg-icon v-if="dialogInfo.state" style="font-size: 26px; color: #429e8a; margin-right: 10px" icon="#bg-ic-circle-check"></bg-icon>
<bg-icon v-else style="font-size: 26px; color: #d75138; margin-right: 10px" icon="#bg-ic-circle-close"></bg-icon>
<span>{{dialogInfo.msg}}</span>
</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button @click="showDialog = false">取 消</el-button>
<el-button type="primary" @click="showDialog = false">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs,getCurrentInstance } from 'vue'
import { useRouter,useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const { proxy } = getCurrentInstance()
const { $axios,$message } = proxy
const props = defineProps({
data: {
type: Object,
default: null
}
})
const router = useRouter()
const route = useRoute()
const detailData = reactive({
apiBaseInfo: [
{
name: "能力名称",
value: "",
nameWidth: 104
},
{
name: "调用地址",
value: "",
nameWidth: 104
},
], // 基本信息
uiInfo: [],
detail_data: {},
res_body_open: true,
showDialog: false,
dialogInfo: {
msg: "该服务地址正常",
state: true
},
topic_open: true,
currentUi: {},
classArr: [
"question",
"success",
"close",
],
iconArr: [
"#bg-ic-s-circle-question",
"#bg-ic-s-circle-check",
"#bg-ic-s-circle-close"
],
iconTipInfo: [
"该主题还未进行测试",
"该主题测试通过",
"该主题测试不通过"
],
showRefreshBtn: false
})
const emit = defineEmits(['refresh'])
const detail = props.data
detailData.detail_data = props.data
if (detail) {
detailData.apiBaseInfo[0].value = detail.service_name
detailData.apiBaseInfo[1].value = detail.req_url
detailData.uiInfo = detail.ui_theme || []
if (detailData.uiInfo.length > 0) {
detailData.uiInfo.forEach(e => {
e.image = JSON.parse(e.image)
})
}
detailData.currentUi = detailData.uiInfo[0] || {}
}
const changeCurrentTopic = (item) => {
detailData.currentUi = item
}
const serviceTest = () => {
let params = {
ui_id: detailData.currentUi.id,
id: detail.id.toString(),
url: detail.req_url,
parameters: detailData.currentUi.parameters
}
localStorage.setItem('params',JSON.stringify(params))
let routeData = router.resolve({
path: "/ui-example",
});
window.open(routeData.href, "_blank");
detailData.showRefreshBtn = true
}
const refresh = () => {
emit('refresh',detail.ability_tree_code)
}
const {
apiBaseInfo,
detail_data,
res_body_open,
showDialog,
dialogInfo,
uiInfo,
topic_open,
currentUi,
classArr,
iconArr,
iconTipInfo,
showRefreshBtn,
} = toRefs(detailData)
</script>
<style lang="scss" scoped>
.baseInfo_box {
width: 100%;
display: flex;
justify-content: space-between;
.baseInfo {
width: 872px;
}
.refresh_btn {
background-color: #404a62;
}
}
.req_box {
width: 872px;
margin-top: 30px;
.input-title {
font-size: 16px;
color: #202531;
margin-top: 9px;
margin-bottom: 15px;
font-weight: 700;
line-height: 1;
.before_title {
display: inline-block;
width: 4px;
height: 14px;
background-color: #2b4695;
margin-right: 8px;
border-radius: 2px;
}
.after_icon {
float: right;
cursor: pointer;
}
}
.mt {
margin-top: 24px;
}
.no_data {
text-align: center;
.text {
font-size: 16px;
color: #616f94;
line-height: 1;
}
}
.doc_desc {
width: 100%;
height: 406px;
padding: 16px 24px;
background-color: #fafafa;
border-radius: 4px;
color: #202531;
font-size: 14px;
}
.topic_box {
display: flex;
.left {
width: 200px;
margin-right: 16px;
font-size: 14px;
color: #202531;
.items {
border: 1px solid #dadee7;
padding: 4px 0;
.topic_item {
height: 34px;
line-height: 34px;
padding: 0 8px;
cursor: pointer;
display: flex;
align-items: center;
.tree-icon {
font-size: 12px;
color: #909bb6;
margin-right: 6px;
}
.success {
color: #48ad97;
}
.close {
color: #dd6955;
}
}
.current {
background-color: #eff2fa;
color: #3759be;
}
}
}
.right {
flex: 1;
height: 332px;
img {
width: 100%;
height: 100%;
}
}
}
}
.dialog_info {
padding: 27px 0 11px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
\ No newline at end of file
<!-- webSDK -->
<template>
<div>
<div class="baseInfo_box">
<div class="baseInfo">
<bg-info :data="apiBaseInfo" />
</div>
<div class="apaas_button test_btn">
<el-button type="primary" @click="serviceTest">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-checklist"></bg-icon>
服务测试
</el-button>
</div>
</div>
<div class="req_box">
<p class="input-title">
<span class="before_title"></span>
使用示例
<span class="after_icon" @click="example_open=!example_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="example_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="example_open">
<video id="video" style="width: 100%" controls autoplay>
<source :src="wsdk_use_doc" />
</video>
</div>
<p class="input-title">
<span class="before_title"></span>
接口文档介绍
<span class="after_icon" @click="res_body_open=!res_body_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="res_body_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="res_body_open">
<div v-html="detail_data.doc_desc" class="doc_desc"></div>
</div>
</div>
<!-- 测试结果弹窗 -->
<el-dialog
custom-class="dialog_box result_box"
title="提示"
v-model="showDialog"
width="400px"
:before-close="
() => {
dialogClose()
}
"
>
<div class="dialog_info">
<bg-icon v-if="dialogInfo.state" style="font-size: 26px; color: #429e8a; margin-right: 10px" icon="#bg-ic-circle-check"></bg-icon>
<bg-icon v-else style="font-size: 26px; color: #d75138; margin-right: 10px" icon="#bg-ic-circle-close"></bg-icon>
<span>{{dialogInfo.msg}}</span>
</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button @click="dialogClose">取 消</el-button>
<el-button type="primary" @click="dialogClose">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs,getCurrentInstance } from 'vue'
import { useRouter,useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const { proxy } = getCurrentInstance()
const { $axios,$message } = proxy
const props = defineProps({
data: {
type: Object,
default: null
}
})
const emit = defineEmits(["dialogClose"])
const router = useRouter()
const route = useRoute()
const detailData = reactive({
apiBaseInfo: [
{
name: "能力名称",
value: "",
nameWidth: 104
},
{
name: "版本号",
value: "",
nameWidth: 104
},
{
name: "调用地址",
value: "",
full: true,
nameWidth: 104
},
{
name: "安全密钥",
value: "",
nameWidth: 104,
full: true,
password: true,
realValue: "",
},
], // 基本信息
detail_data: {},
res_body_open: true,
showDialog: false,
dialogInfo: {
msg: "该服务地址正常",
state: true
},
example_open: true,
wsdk_use_doc: ""
})
const detail = props.data
detailData.detail_data = props.data
if (detail) {
detailData.apiBaseInfo[0].value = detail.service_name
detailData.apiBaseInfo[1].value = detail.sdk_version
detailData.apiBaseInfo[2].value = detail.req_url
detailData.apiBaseInfo[3].value = "***************"
detailData.apiBaseInfo[3].realValue = detail.wsdk_secret_key
detailData.wsdk_use_doc = detail.wsdk_use_doc
}
const serviceTest = () => {
let params = {
interface_type: 1,
method: 1,
url: detail.req_url,
id: detail.id.toString()
}
$axios
.post(`/apaas/service/v5/service/test`,params)
.then((res) => {
if (res.data.code !== 200) {
$message.error(res.data.data)
} else {
detailData.showDialog = true
if (res.data.data.response_code == 200) {
detailData.dialogInfo = {
msg: "该服务地址正常",
state: true
}
}else {
detailData.dialogInfo = {
msg: "该服务地址异常",
state: false
}
}
}
})
}
const dialogClose = () => {
detailData.showDialog = false
emit("refresh",detail.ability_tree_code)
}
const {
apiBaseInfo,
detail_data,
res_body_open,
showDialog,
dialogInfo,
example_open,
wsdk_use_doc,
} = toRefs(detailData)
</script>
<style lang="scss" scoped>
.baseInfo_box {
width: 100%;
display: flex;
justify-content: space-between;
.baseInfo {
width: 872px;
}
}
.req_box {
width: 872px;
margin-top: 30px;
.input-title {
font-size: 16px;
color: #202531;
margin-top: 9px;
margin-bottom: 15px;
font-weight: 700;
line-height: 1;
.before_title {
display: inline-block;
width: 4px;
height: 14px;
background-color: #2b4695;
margin-right: 8px;
border-radius: 2px;
}
.after_icon {
float: right;
cursor: pointer;
}
}
.doc_desc {
width: 100%;
height: 406px;
padding: 16px 24px;
background-color: #fafafa;
border-radius: 4px;
color: #202531;
font-size: 14px;
}
}
.dialog_info {
padding: 27px 0 11px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
\ No newline at end of file
<!-- websocket -->
<template>
<div>
<div class="baseInfo_box">
<div class="baseInfo">
<bg-info :data="apiBaseInfo" />
</div>
<div class="apaas_button test_btn">
<el-button type="primary" @click="serviceTest">
<bg-icon style="font-size: 12px; color: #fff; margin-right: 8px" icon="#bg-ic-checklist"></bg-icon>
服务测试
</el-button>
</div>
</div>
<div class="req_box">
<p class="input-title">
<span class="before_title"></span>
接口文档介绍
<span class="after_icon" @click="res_body_open=!res_body_open">
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-up" v-if="res_body_open"></bg-icon>
<bg-icon style="font-size: 8px; color: #000;" icon="#bg-ic-arrow-down" v-else></bg-icon>
</span>
</p>
<div v-if="res_body_open">
<div v-html="detail_data.doc_desc" class="doc_desc"></div>
</div>
</div>
<!-- 测试结果弹窗 -->
<el-dialog
custom-class="dialog_box result_box"
title="提示"
v-model="showDialog"
width="400px"
:before-close="
() => {
dialogClose()
}
"
>
<div class="dialog_info">
<bg-icon v-if="dialogInfo.state" style="font-size: 26px; color: #429e8a; margin-right: 10px" icon="#bg-ic-circle-check"></bg-icon>
<bg-icon v-else style="font-size: 26px; color: #d75138; margin-right: 10px" icon="#bg-ic-circle-close"></bg-icon>
<span>{{dialogInfo.msg}}</span>
</div>
<template v-slot:footer>
<div class="apaas_button">
<el-button @click="dialogClose">取 消</el-button>
<el-button type="primary" @click="dialogClose">确 定</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref,onBeforeMount,toRefs,getCurrentInstance } from 'vue'
import { useRouter,useRoute } from 'vue-router'
import { ElMessage } from 'element-plus'
const { proxy } = getCurrentInstance()
const { $axios,$message } = proxy
const props = defineProps({
data: {
type: Object,
default: null
}
})
const emit = defineEmits(["dialogClose"])
const router = useRouter()
const route = useRoute()
const state = reactive({data1:1})
const {data1} = toRefs(state)
const detailData = reactive({
apiBaseInfo: [
{
name: "能力名称",
value: "",
nameWidth: 104
},
{
name: "调用地址",
value: "",
nameWidth: 104
},
{
name: "通信协议",
value: "",
full: true,
nameWidth: 104
},
], // 基本信息
detail_data: {},
res_body_open: true,
showDialog: false,
dialogInfo: {
msg: "该服务地址正常",
state: true
},
})
const detail = props.data
detailData.detail_data = props.data
if (detail) {
detailData.apiBaseInfo[0].value = detail.service_name
detailData.apiBaseInfo[1].value = detail.req_url
detailData.apiBaseInfo[2].value = ['','ws','wss'][detail.ws_protocol]
}
const serviceTest = () => {
let params = {
interface_type: 3,
url: detail.req_url,
id: detail.id.toString()
}
$axios
.post(`/apaas/service/v5/service/test`,params)
.then((res) => {
if (res.data.code !== 200) {
$message.error(res.data.data)
} else {
detailData.showDialog = true
if (res.data.data.response_code == 200) {
detailData.dialogInfo = {
msg: "该服务地址正常",
state: true
}
}else {
detailData.dialogInfo = {
msg: "该服务地址异常",
state: false
}
}
}
})
}
const dialogClose = () => {
detailData.showDialog = false
emit("refresh",detail.ability_tree_code)
}
const {
apiBaseInfo,
detail_data,
res_body_open,
showDialog,
dialogInfo,
} = toRefs(detailData)
</script>
<style lang="scss" scoped>
.baseInfo_box {
width: 100%;
display: flex;
justify-content: space-between;
.baseInfo {
width: 872px;
}
}
.req_box {
width: 872px;
margin-top: 30px;
.input-title {
font-size: 16px;
color: #202531;
margin-top: 9px;
margin-bottom: 15px;
font-weight: 700;
line-height: 1;
.before_title {
display: inline-block;
width: 4px;
height: 14px;
background-color: #2b4695;
margin-right: 8px;
border-radius: 2px;
}
.after_icon {
float: right;
cursor: pointer;
}
}
.doc_desc {
width: 100%;
height: 406px;
padding: 16px 24px;
background-color: #fafafa;
border-radius: 4px;
color: #202531;
font-size: 14px;
}
}
.dialog_info {
padding: 27px 0 11px;
display: flex;
align-items: center;
justify-content: center;
}
</style>
\ No newline at end of file
<template>
<div class="box">
<div class="title-box">
<span class="title_text">{{title}}</span>
<div class="toggle_box">
<slot name="toggleBox"></slot>
</div>
</div>
<slot></slot>
</div>
</template>
<script setup>
const props = defineProps({
title: {
type: String,
required: true
}
})
</script>
<script>
export default {
}
</script>
<style scoped>
.box {
width: 100%;
height: 100%;
}
.title-box{
width: 100%;
height: 42px;
background-image: url('../assets/imgs/title_bg.png');
background-repeat: no-repeat;
background-position: center left;
background-size: contain;
position: relative;
}
.title_text {
display: inline-block;
padding-left: 18px;
padding-top: 6px;
font-size: 22px;
font-weight: 600;
color: #b2f1ff;
}
.toggle_box {
position: absolute;
right: 0;
height: 42px;
top: 0;
}
</style>
\ No newline at end of file
<template>
<div
class="bg-menu"
:class="{
transparent: transparentBg,
'is-front': isFront,
}"
>
<!-- LOGO -->
<router-link to="/" class="bg-logo">
<img style="width:140px;height:22px;" src="../assets/imgs/img_logo.png"/>
<!-- <img style="width:40px;height:40px;" :src="logo"/> -->
<!-- <span>{{name}}</span> -->
</router-link>
<!-- 菜单 -->
<div class="main-menu" v-if="userInfo&& userInfo.user">
<!-- 前台菜单 -->
<div class="font-menu" v-if="fontMenu&&fontMenu.length">
<div class="nav-item" :style="path==item.path?{backgroundColor:'#2b4695'}:''" v-show="item.show" v-for="(item,index) in fontMenu" :key="'font'+index">
<span @click="menuAction(item.path,item)">
{{item.menuName}}
<bg-icon v-if="item.children&&item.children.length" icon="#bg-ic-arrow-down" style="font-size:8px;margin-left: 3px;"></bg-icon>
</span>
<div class="menu-virtual"></div>
<div class="menu-list" v-if="item.children&&item.children.length">
<div class="menu-item text_clip" @click="childMenuAction(it,item)" v-show="it.show" v-for="(it,idx) in item.children" :key="'font-children'+idx">{{it.menuName}}</div>
</div>
</div>
</div>
<!-- 后管菜单 -->
<div class="manager-menu" v-if="managerMenu&&managerMenu.length">
<div class="nav-item" :style="path==item.path?{backgroundColor:'#2b4695'}:''" v-show="item.show" v-for="(item,index) in managerMenu" :key="'manager'+index">
<span @click="menuAction(item.path,item)">
{{item.menuName}}
<bg-icon v-if="item.children&&item.children.length" icon="#bg-ic-arrow-down" style="font-size:8px;margin-left: 3px;"></bg-icon>
</span>
<div class="menu-virtual"></div>
<div class="menu-list" v-if="item.children&&item.children.length">
<div class="menu-item text_clip" @click="childMenuAction(it,item)" v-show="it.show" v-for="(it,idx) in item.children" :key="'manager-children'+idx">{{it.menuName}}</div>
</div>
</div>
</div>
</div>
<div class="person-menu" v-if="userInfo&& userInfo.user">
<!-- 信息 -->
<!-- 购物车 -->
<!-- 用户中心 -->
<div class="user-center nav-item">
<span class="user-icon">
<img style="width:24px;height:24px;border-radius:50%;vertical-align:middle;" :src="userInfo&&userInfo.headPortrait?userInfo.headPortrait:'/src/assets/imgs/home_ic_user.png'" />
</span>
<span class="user-name" v-if="userInfo && userInfo.user">
{{ userInfo.name || userInfo.user }}
<bg-icon icon="#bg-ic-arrow-down" style="font-size:8px;margin-left: 3px;"></bg-icon>
</span>
<span class="user-name" v-else>
请登录
</span>
<div class="menu-virtual"></div>
<div v-if="userInfo && userInfo.user" class="menu-list">
<div
v-for="(item, index) in user_arr"
class="menu-item text_clip"
:key="index + 700"
@click="menuAction(item.path,item)"
>
{{ item.menuName }}
</div>
<div class="menu-item text_clip" @click="menuAction('logout')">
退出登录
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { mapState, mapMutations } from "vuex";
import { clearCookie } from "../services/cookie.js";
import {resetRouter} from '../router/index'
import { normalizeProps } from 'vue-demi';
export default {
name: "BgMenu",
components: { },
props:{
path:{
type:String,
default:''
}
},
data() {
return {
documentScrollTop: 0,
user_arr: [],
cartList: [],
showCart: true,
showShopMenu: false,
logo:'../assets/imgs/img_logo.png',
name:''
};
},
computed: {
nameFlag(){
return this.$store.state.nameFlag
},
userInfo() {
return this.$store.state.userInfo || {};
},
unreadMsgCount() {
return this.$store.state.unreadMessageCount;
},
transparentBg() {
return (
this.documentScrollTop < 180 &&
(this.$route.name === "shopRecommend" ||
this.$route.name === "shopSearch")
);
},
isFront() {
let path = this.$route.path;
return false
},
...mapState({
fontMenu (state) {
let temp = []
state.menu.forEach(e => {
if(e.menuType=='font'){
temp.push(e)
}
});
return temp
},
managerMenu(state){
let temp = []
state.menu.forEach(e => {
if(e.menuType=='system'){
temp.push(e)
}
});
return temp
}
})
},
watch: {
nameFlag(n,o){
this.getLogo()
}
// cartState() {
// this.getCartList();
// },
// routePath(val) {
// return "/"; // FIXME: 当前选中的路由
// },
},
methods: {
...mapMutations(["setCartNum"]),
navAction(path) {
this.$router.push(path);
},
changezz(item){
this.$trace.setOptionValue('appID',item.value)
},
getLogo(){
// this.$axios.get(`/apaas/backmgt/getPicAndSystemName`).then(res=>{
// if(res.data.code==200){
// let data = res.data.data
// this.name=data.systemName
// this.logo = data.picture
// document.title = this.name
// var link = document.querySelector("link[rel*='icon']")||document.createElement('link');
// link.type = 'image/x-icon';
// link.rel = 'shortcut icon';
// link.href = data.picture;
// document.getElementsByTagName('head')[0].appendChild(link);
// }
// })
},
menuAction(n,parent) {
if (n == "logout") {
this.$axios.get(`/apaas/backmgt/logout`).then(res=>{
if(res.data.code=='200'){
this.$router.push('/login')
this.$store.commit('setUserInfo',null)
clearCookie('bgToken')
this.$message.success('退出成功')
resetRouter()
}else{
this.$message.error('退出失败')
}
})
} else if (n == "login") {
let path = this.$route.path;
window.location.href = `/login?redirect=${path}`;
} else {
//true 同区域跳转
//false 跨系统跳转
if(parent.menuType==this.$store.state.menuObj[this.path].menuType){
this.$router.push(n);
}else{
let temp = ''
if(this.$store.state.menuObj[n].menuType=='font'||this.$store.state.menuObj[n].menuType=='system'){
temp = '/apaas/ui/#'
}else if(this.$store.state.menuObj[n].menuType=='manager'){
temp = '/apaas/manager/#'
}
window.location.href = temp+n
}
}
},
childMenuAction(v,parent) {
if(v.children&&v.children.length){
if(v.children[0].children){
this.pathToUrl(v.children[0].children[0].path,parent)
}else{
for (let index = 0; index < v.children.length; index++) {
const e = v.children[index];
if(e.show){
this.pathToUrl(e.path,parent)
break
}
}
}
}else{
this.pathToUrl(v.path,parent)
}
},
pathToUrl(path,parent){
//判断是否是外链,是则新开窗口跳转
if(path.includes('http')){
window.open(path,'_blank')
}else{
debugger
//判断是否是同区域内跳转
//非同区域跳转需要改前缀,如apaas/ui跳转到apaas/manager
if(parent.menuType==this.$store.state.menuObj[this.path].menuType){
this.$router.push(path);
}else{
let temp = ''
if(this.$store.state.menuObj[path].menuType=='font'||this.$store.state.menuObj[path].menuType=='system'){
temp = '/apaas/ui/#'
}else if(this.$store.state.menuObj[path].menuType=='manager'){
temp = '/apaas/manager/#'
}
window.location.href = temp+path
}
}
},
intoCartDetail() {
this.$router.push({ name: "shopCart" });
},
deleteItem(id) {
this.$api.serviceShop.delShoppingCart([id]).then((response) => {
if (response.data.success == 1) {
this.$store.commit("setCartState");
}
});
},
shopMenuAction() {
this.showShopMenu = false;
},
shopMenEventListener() {
this.showShopMenu = false;
},
scrollAction() {
this.documentScrollTop = document.documentElement.scrollTop || 0;
},
getFirstPath(item){
if(item.path){
if(item.children){
if(item.children[0].children){
if(item.children[0].children[0].children){
return item.children[0].children[0].children[0].path
}else{
return item.children[0].children[0].path
}
}else{
return item.children[0].path
}
}else{
return item.path
}
}else{
return ''
}
},
},
created() {
console.log(this.userInfo);
this.getLogo()
if (this.userInfo) {
// this.getUserDetail(this.userInfo.user_id)
}else {
// this.getUserInfo()
}
},
mounted() {
console.log(this.currentMenuIndex);
this.$nextTick(this.scrollAction);
window.addEventListener("scroll", this.scrollAction, true);
window.addEventListener("click", this.shopMenEventListener);
},
destroyed() {
window.removeEventListener("scroll", this.scrollAction, true);
window.removeEventListener("click", this.shopMenEventListener);
},
};
</script>
<style lang="scss" scoped>
.bg-menu {
width: 100%;
height: 56px;
background-color: #253b7e;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
// 二级菜单公有样式
.nav-item {
font-size: 14px;
color: #fff;
cursor: pointer;
position: relative;
> p {
> i {
font-size: 12px;
line-height: 56px;
color: #8899aa;
margin-left: 5px;
}
}
> .menu-virtual{
width: 128px;
height: 10px;
position: absolute;
top: 49px;
right: 0;
z-index: 9;
background-color: rgba(0,0,0,0);
}
> .menu-list {
box-shadow: 0px 4px 12px 0px
rgba(18, 30, 63, 0.1);
background-color: #ffffff;
border-radius: 4px;
overflow: hidden;
padding: 4px 0;
position: absolute;
top: 59px;
right: 0;
z-index: 9;
text-align: center;
display: none;
> .menu-item {
width: 144px;
height: 34px;
font-size: 14px;
line-height: 34px;
padding: 0 16px;
background-color: #fff;
color: #202531;
text-align: left;
white-space: nowrap;
> .width-num {
display: inline-block;
vertical-align: middle;
min-width: 30px;
background-color: #ff6a00;
font-size: 10px;
line-height: 16px;
color: #fff;
padding: 0 8px;
margin-left: 5px;
box-sizing: border-box;
border-radius: 8px;
text-align: center;
overflow: hidden;
}
&:hover {
background-color: #eff2fa;
/* > .width-num {
background-color: #fcefd6;
color: #ff6a00;
} */
}
}
}
&:hover {
> .menu-list {
display: block;
}
}
}
// 超市菜单
> .bg-shop-menu {
height: 100%;
> .shop-menu-btn {
width: 105px;
height: 100%;
background-color: #062a44;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
> span {
font-size: 16px;
line-height: 20px;
color: #ffffff;
margin-left: 10px;
}
}
> .shop-menu {
position: fixed;
top: 56px;
left: 0;
width: 900px;
height: calc(100vh - 56px);
}
}
// LOGO
> .bg-logo {
display: flex;
justify-content: center;
align-items: center;
line-height: 1;
margin: 0 50px 0 20px;
text-decoration: none;
> span {
font-size: 24px;
font-weight: bolder;
margin-left: 10px;
background: linear-gradient(to bottom, #d6e0fc,#9cb0e5);
-webkit-background-clip:text;
color:transparent;
line-height: 40px;
}
}
// 主菜单
> .main-menu {
height: 100%;
flex-grow: 1;
display: flex;
justify-content: space-between;
align-items: center;
margin-right: 8px;
.font-menu{
height: 100%;
}
.manager-menu{
height: 100%;
}
.nav-item {
font-size: 14px;
height: 56px;
padding: 0 24px;
line-height: 56px;
text-align: center;
position: relative;
> .menu-virtual{
left: 0;
right: auto;
}
> .menu-list {
left: 0;
right: auto;
> .menu-item {
cursor: pointer;
}
}
&:hover{
background-color: #2b4695;
}
}
}
// 分割线
> .shop-line {
width: 1px;
height: 24px;
background-color: #536883;
margin-right: 50px;
}
// 购物车
> .shop-cart {
height: 100%;
position: relative;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
margin-right: 50px;
&:hover {
.cart-detail {
display: block;
}
}
> .cart-info {
display: flex;
justify-content: space-between;
align-items: center;
> span {
min-width: 36px;
height: 18px;
background-color: #ff6a00;
border-radius: 9px;
padding: 0 9px;
box-sizing: border-box;
font-size: 12px;
line-height: 18px;
color: #ffffff;
text-align: center;
margin-left: 5px;
}
}
> .cart-detail {
width: 280px;
background-color: #ffffff;
box-shadow: 0px 3px 6px 0px rgba(15, 19, 65, 0.05);
border-radius: 8px;
position: absolute;
top: 56px;
left: -20px;
display: none;
z-index: 3;
padding: 10px 20px;
> .cart-title {
color: #8890a7;
font-size: 14px;
height: 30px;
line-height: 30px;
}
> .cart-list {
height: 80px;
padding: 10px 0;
display: flex;
line-height: 26px;
border-bottom: #f4f7fc 2px solid;
&:nth-last-child(2) {
border-bottom: 0;
}
> .shop_img {
width: 60px;
height: 60px;
border-radius: 8px;
}
> .shop_cell_msgs {
width: calc(100% - 80px);
margin-left: 10px;
> .shop_cell_name {
color: #2d3867;
font-size: 14px;
line-height: 24px;
&:hover {
color: #0d0807;
}
}
> .shop_cell_msg {
color: #8890a7;
font-size: 12px;
line-height: 18px;
}
> .over_one {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
> .cart-action {
width: 100%;
height: 50px;
text-align: right;
padding: 15px 0;
line-height: 30px;
> .el-button {
background-color: #ff6a00;
color: #fcefd6;
}
}
&::before {
content: "";
width: 16px;
height: 16px;
background-color: #fff;
position: absolute;
top: -7px;
left: 38px;
transform: rotate(45deg);
}
}
}
//个人菜单
.person-menu{
height: 100%;
padding-left: 32px;
position: inherit;
&::before{
content:'';
width: 1px;
height: 24px;
background-color: #5c6da4;
position: absolute;
left: 0;
top: 16px;
}
}
// 用户中心
.user-center {
height: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
line-height: 1;
margin-right: 35px;
position: relative;
> .user-icon {
position: relative;
margin-right: 10px;
> .has_msg {
width: 8px;
height: 8px;
border-radius: 50%;
background-color: #ff6a00;
position: absolute;
top: -5px;
right: -5px;
}
}
> .user-name {
min-width: 4em;
max-width: 8em;
word-break: break-all;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: 14px;
}
}
&.transparent {
background-color: transparent;
> .bg-shop-menu {
> .shop-menu-btn {
background-color: transparent;
}
}
&::after {
background-color: #2f607f;
}
}
&.is-front {
height: 40px;
.bg-logo {
display: none;
}
.nav-item {
height: 40px;
line-height: 40px;
> p {
> i {
line-height: 40px;
}
}
> .menu-list {
top: 35px;
}
&.user-center {
line-height: 1;
.user-icon {
> .has_msg {
top: 0;
}
}
}
}
}
}
</style>
<template>
<div class="comments_pagination">
<div class="total_info">
<span>{{ `共${total}个条目` }}</span>
</div>
<div class="page_size_action" v-if="pageSizes.length">
<span>每页行数:</span>
<el-select v-model="pageSize" @change="sizeChange">
<el-option
v-for="item in pageSizes"
:label="item"
:value="item"
:key="item"
></el-option>
</el-select>
</div>
<div class="page_action">
<a :class="{ disabled: preDisabled }" @click.prevent="prePage">
<el-icon><ArrowLeft /></el-icon>
</a>
<span>{{ `第${currentPage}页 / 共${totalPages}页` }}</span>
<a :class="{ disabled: nextDisabled }" @click.prevent="nextPage">
<el-icon><ArrowRight /></el-icon>
</a>
</div>
</div>
</template>
<script>
export default {
props: {
total: {
type: Number,
required: true,
},
pageSizes: {
type: Array,
required: true,
},
pageSize: {
type: Number,
required: true,
},
currentPage: {
type: Number,
required: true,
},
},
data: () => ({}),
computed: {
totalPages() {
return Math.ceil(this.total / this.pageSize) || 1;
},
preDisabled() {
return this.currentPage === 1;
},
nextDisabled() {
return this.currentPage === this.totalPages;
},
},
methods: {
sizeChange(value) {
this.$emit("size-change", value);
},
prePage() {
if (this.preDisabled) {
return;
}
this.$emit("current-change", this.currentPage - 1);
},
nextPage() {
if (this.nextDisabled) {
return;
}
this.$emit("current-change", this.currentPage + 1);
},
},
};
</script>
<style scoped>
.comments_pagination {
display: flex;
justify-content: flex-start;
align-items: center;
font-size: 14px;
line-height: 25px;
color: #333;
}
.total_info {
flex-grow: 1;
}
.page_size_action {
margin-left: 50px;
}
.page_size_action > .el-select {
width: 70px;
}
.page_action {
user-select: none;
margin-left: 50px;
}
.page_action > a {
cursor: pointer;
}
.page_action > a > i {
font-weight: bold;
color: #5588ff;
vertical-align: -2px;
}
.page_action > a.disabled {
cursor: not-allowed;
}
.page_action > a.disabled > i {
color: #d6d8dc;
}
</style>
<style>
.page_size_action > .el-select .el-input__inner,
.page_size_action > .el-select .el-input.is-focus .el-input__inner {
border: 1px solid #fff;
}
</style>
<template>
<div class="img_crop">
<div v-for="(item, index) in fileArr" :key="'img' + index" class="list_img">
<div class="list_img_back">
<i class="el-icon-refresh-right img_replace"></i>
<input
type="file"
id="upItem1"
class="up_input"
accept="image/png, image/jpeg, image/gif, image/jpg"
@change="uploadImg($event,1)"
/>
</div>
<el-image class="list_img_item" :src="item.url" :fit="fit">
<template v-slot:error>
<div class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</template>
</el-image>
</div>
<div class="add_img" v-if="fileArr.length <= max - 1">
<div class="add_pic">
<i class="el-icon-plus add_icon"></i>
<input
type="file"
id="upItem2"
class="up_input"
accept="image/png, image/jpeg, image/gif, image/jpg"
@change="uploadImg($event,1)"
/>
</div>
</div>
<!-- 弹出层-裁剪 -->
<el-dialog
title="编辑图片"
:visible="dialogVisible"
:before-close="handleClose"
:close-on-click-modal="false"
class="cropper_dia"
>
<div style="width: 100%">
<div class="cropper_container">
<!-- 裁剪 -->
<div class="croppers">
<vueCropper
style="width:100%;height:300px"
ref="cropper"
:img="attach.customaryUrl"
:autoCrop="options.autoCrop"
:fixedBox="options.fixedBox"
:canMoveBox="options.canMoveBox"
:autoCropWidth="options.autoCropWidth"
:autoCropHeight="options.autoCropHeight"
:centerBox="options.centerBox"
:mode="options.mode"
@realTime="realTime"
></vueCropper>
</div>
<!-- 实时裁剪结果 -->
<div :style="previews.div" class="preview">
<img :src="previews.url" :style="previews.img" />
</div>
</div>
<el-row class="footerBtn" align="center">
<el-button type="primary" class="form_c" size="small" @click="handleClose">&nbsp;&nbsp;</el-button>
<el-button type="primary" class="form_t" size="small" @click="cut('blob')">&nbsp;&nbsp;</el-button>
</el-row>
</div>
</el-dialog>
</div>
</template>
<script>
import { VueCropper } from "vue-cropper";
export default {
components: {
VueCropper,
},
props: {
fileArray: {
type: Array,
default: () => {
[];
},
},
fit: {
type: String,
default: "",
},
max: {
type: Number,
default: 1,
},
},
watch: {
fileArray: {
handler(val) {
this.fileArr = val;
},
},
},
data() {
return {
dialogVisible: false,
options: {
autoCrop: true, //默认生成截图框
fixedBox: true, //固定截图框大小
canMoveBox: true, //截图框不能拖动
autoCropWidth: 200, //截图框宽度
autoCropHeight: 200, //截图框高度
centerBox: true, //截图框被限制在图片里面
mode: "cover",
},
previews: {}, //实时预览图数据
attach: {
id: "",
userId: "",
customaryUrl: "", //原图片路径
laterUrl: "", //裁剪后图片路径
attachType: "photo", //附件类型
},
fileName: "", //本机文件地址
uploadImgRelaPath: "", //上传后图片地址
fileArr: [],
};
},
methods: {
//控制弹出层关闭
handleClose() {
let abc1 = document.getElementById("upItem1");
let abc2 = document.getElementById("upItem2");
if (abc1) {
abc1.value = "";
}
if (abc2) {
abc2.value = "";
}
this.dialogVisible = false;
},
//实时预览
realTime(data) {
this.previews = data;
},
//加载图片信息
find() {
this.userId = sessionStorage.getItem("userId");
},
//选择本地图片
uploadImg(e, num) {
var file = e.target.files[0];
if (!/\.(gif|jpg|jpeg|png|bmp|GIF|JPG|PNG)$/.test(e.target.value)) {
this.$message.error("图片类型必须是.gif,jpeg,jpg,png,bmp中的一种");
return false;
}
// console.log(e.target);
//fileReader 接口,用于异步读取文件数据
var reader = new FileReader();
reader.readAsDataURL(file); //重要 以dataURL形式读取文件
reader.onload = (e) => {
// data = window.URL.createObjectURL(new Blob([e.target.result])) 转化为blob格式
let data = e.target.result;
this.attach.customaryUrl = data;
// 转化为base64
// reader.readAsDataURL(file)
// 转化为blob
};
this.dialogVisible = true;
},
//确认截图,上传
cut(type) {
var formData = new FormData();
this.$refs.cropper.getCropBlob((res) => {
//res是裁剪后图片的bolb对象
formData.append("file", res, this.userId);
formData.append("directory", "image");
let url = "/apaas/static/image/upload";
this.$http
.post(url, formData, {
headers: { "Content-Type": "multipart/form-data" },
})
.then((res) => {
this.fileArr = [{ name: res.data.data, url: res.data.data }];
// 上传图片后服务器返回访问路径
this.$emit("getNewUrl", res.data.data);
this.handleClose();
});
});
},
},
};
</script>
<style scoped>
.add_img {
display: inline-block;
margin-left: 10px;
}
.add_pic {
width: 140px;
height: 140px;
border: 3px #f6f7fb solid;
border-radius: 5px;
position: relative;
}
.add_icon {
position: absolute;
top: calc((100% - 70px) / 2);
left: calc((100% - 70px) / 2);
color: #e3e6f0;
font-size: 70px;
}
.up_input {
display: inline-block;
width: 100%;
height: 100%;
opacity: 0;
}
.cropper_container {
width: 100%;
}
.croppers {
display: inline-block;
width: 400px;
}
.preview {
display: inline-block;
overflow: hidden;
border: 1px solid #cccccc;
background: #cccccc;
margin-left: 20px;
}
.footerBtn {
display: flex;
justify-content: center;
margin-top: 15px;
}
.list_img {
width: 140px;
height: 140px;
border-radius: 5px;
overflow: hidden;
margin-left: 10px;
position: relative;
cursor: pointer;
}
.list_img_back {
position: absolute;
width: 100%;
height: 100%;
background-color: #000;
z-index: 1;
opacity: 0;
}
.list_img:hover .list_img_back {
opacity: 0.5;
}
.list_img_item {
width: 100%;
height: 100%;
background-color: #efefef;
}
.img_replace {
position: absolute;
top: calc((100% - 34px) / 2);
left: calc((100% - 34px) / 2);
color: #fff;
font-size: 34px;
}
.img_crop {
display: flex;
align-items: center;
}
</style>
<style>
.cropper_dia .el-dialog {
width: 860px;
}
.list_img_item .image-slot {
height: 100%;
font-size: 40px;
color: #ccc;
display: flex;
align-items: center;
justify-content: center;
}
</style>
<template>
<div>
<el-table
:data="tableData"
style="width: 100%">
<el-table-column
v-for="(item,index) in header"
:key="'header'+index"
prop="date"
:label="item.name"
:width="item.width">
<template v-slot:default="scope">
<span class="table-span" v-for="(it,idx) in item.value" :key="'it'+idx">
<el-input
v-if="it.type == 'input'"
v-show="it.show==undefined?true:typeof(it.show)=='function'?it.show(scope):it.show"
@change="changeData({...scope,type:it.value,check:it.check||null})"
v-model="scope.row[it.value]"
:style="{width:it.width}"
:placeholder="it.placeholder"
:disabled="it.disabled"
></el-input>
<el-select
v-if="it.type == 'select'"
v-show="it.show==undefined?true:typeof(it.show)=='function'?it.show(scope):it.show"
@change="changeData({...scope,type:it.value,check:it.check||null})"
:multiple="it.multiple || false"
v-model="scope.row[it.value]"
:style="{width:it.width}"
:disabled="it.disabled"
:placeholder="it.placeholder"
>
<el-option
v-for="(itx, idxm) in it.arr"
:key="idxm + 600"
:label="itx.label"
:value="itx.value"
:disabled="itx.disabled"
></el-option>
</el-select>
<span v-if="it.type == 'text'" v-show="it.show==undefined?true:typeof(it.show)=='function'?it.show(scope):it.show">{{it.value}}</span>
<span v-if="it.type == 'value'" v-show="it.show==undefined?true:typeof(it.show)=='function'?it.show(scope):it.show">{{scope.row[it.value]}}</span>
<span class="button" v-if="it.type == 'button'" v-show="it.show==undefined?true:typeof(it.show)=='function'?it.show(scope):it.show" @click="it.callback(scope)">{{it.value}}</span>
</span>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
export default {
props: {
header:{
type:Array,
default:()=>[]
},
tableData:{
type:Array,
default:()=>[]
}
},
components: {
},
data() {
return {
};
},
watch: {
},
computed: {
},
created() {
},
mounted() {
},
methods: {
changeData(val){
this.$emit('change',val)
}
},
};
</script>
<style scoped>
.table-span{
float: left;
margin-right: 10px;
line-height: 40px;
}
.button{
cursor: pointer;
color: #2b4695;
}
</style>
<template>
<el-form
ref="ruleFormRef"
class="ruleForm"
:model="tableRows"
:size="formSize"
:rules="formRules"
>
<bg-table-pro
:headers="headers"
:data="tableRows"
ref="input-table"
:border="true"
:stripe="false"
>
<template v-slot:order="{ row,index }">
{{index+1}}
</template>
<template v-slot:err_code="{ row,index }">
<el-form-item
:prop="`[${index}].err_code`"
:rules="formRules.err_code"
>
<el-input @change="changeName" :disabled="disabled||acDisable" v-model="row.err_code" />
</el-form-item>
</template>
<template v-slot:err_msg="{ row,index }">
<el-form-item
:prop="`[${index}].err_msg`"
:rules="formRules.err_msg"
>
<el-input :disabled="disabled" v-model="row.err_msg" />
</el-form-item>
</template>
<template v-slot:action="{ row,index }">
<bg-table-btn :disabled="disabled||acDisable" :click="()=>{addParam(index)}">增加</bg-table-btn>
<bg-table-btn :disabled="disabled||acDisable" :click="()=>{removeParam(row, index)}">
删除
</bg-table-btn>
</template>
</bg-table-pro>
</el-form>
</template>
<script setup>
import {
reactive,
toRefs,
onBeforeMount,
onMounted,
ref,
getCurrentInstance,
} from "vue";
import { v4 as uuidv4 } from "uuid";
const props = defineProps({
data: {
type: Array,
default:()=>[]
},
disabled:{
type:Boolean,
default:false
},
acDisable:{
type:Boolean,
default:false
}
})
const emit = defineEmits(['change'])
const formSize = ref("default");
const ruleFormRef = ref(null);
const formRules = reactive({
err_code:[
{
required: true,
message: '请输入键',
trigger: 'blur'
},
{
max: 30,
message: '最多30个字符',
trigger: 'blur'
}
],
err_msg:[
{
max: 50,
message: '最多50个字符',
trigger: 'blur'
}
]
});
const headers = reactive([
{
label: "序号",
prop: "order",
},
{
label: "错误码",
prop: "err_code",
},
{
label: "错误信息描述",
prop: "err_msg",
},
{
label: "操作",
prop: "action",
width: 120,
},
]);
const state = reactive({
tableRows:[]
});
onBeforeMount(()=>{
initTable()
})
var initTable = ()=>{
if(props.data&&props.data.length>=1){
state.tableRows = props.data
}else{
addParam(0)
}
}
var createRow = ()=>{
return{
id:uuidv4(),
err_code:'',
err_msg:''
}
}
var addParam = (index)=>{
state.tableRows.splice(index + 1, 0, createRow());
}
var removeParam = (row, index)=>{
state.tableRows.splice(index, 1);
if (state.tableRows.length === 0) {
addParam(0);
}
}
const changeName = ()=>{
emit('change',{
type:'name',
data:state.tableRows
})
}
var getInputData = ()=>{
let lastData = []
let tempObj = {}
state.tableRows.forEach(e => {
tempObj[e.err_code] = e
});
for (const key in tempObj) {
if(key&&tempObj[key].err_code){
lastData.push(tempObj[key])
}
}
return lastData
}
const {tableRows} = toRefs(state)
//暴露获取数据方法
defineExpose({
getInputData,
initTable
})
</script>
<style scoped></style>
\ No newline at end of file
<template>
<div class="block_radius">
<div class="right_cont">
<div v-if="show_header" class="block_header">
<div class="icon_box">
<bg-icon style="font-size: 14px; color: #fff;" :icon="bgIcon"></bg-icon>
</div>
<div class="top_title">{{ title }}</div>
<div v-if="selectArr.length > 0">
<el-select
@change="selectChange"
v-model="currentSelectValue"
placeholder="请选择"
>
<el-option
v-for="item in selectArr"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</div>
<div v-if="buttons_arr" class="block_header_button_group">
<div
v-for="(item, index) in buttons_arr"
:key="index"
class="block_header_button"
:class="active_button == index ? 'active' : ''"
@click="changeButton(index)"
>
{{ item }}
</div>
</div>
</div>
<div class="block_main" :class="noPadding ? 'no_padding' : ''">
<slot name="main" />
</div>
</div>
</div>
</template>
<script>
import { reactive, toRefs, onBeforeMount } from 'vue'
export default {
props: {
show_header: {
type: Boolean,
default: false,
},
selectValue: {
type: [String,Number],
default: ""
},
selectArr: {
type: Array,
default: () => {
return [];
},
},
buttons_arr: {
type: Array,
default: () => {
return [];
},
},
bgIcon: {
type: String,
default: ""
},
title: {
type: String,
default: "",
},
background_color: {
type: String,
default: "#fff"
}, // header条背景色
showLeft: {
type: Boolean,
default: true
},
noPadding: {
type: Boolean,
default: false
},
},
setup(props,{ emit }) {
const state = reactive({
currentSelectValue: null,
active_button: 0
})
const selectChange = (val) => {
state.currentSelectValue = val;
emit('selectChange', val);
}
const changeButton = (index) => {
if (state.active_button != index) {
state.active_button = index;
emit("changeButton", index);
}
}
onBeforeMount(() => {
state.currentSelectValue = props.selectValue
})
return {
...toRefs(state),
selectChange,
changeButton,
}
},
}
</script>
<style scoped>
.block_header {
display: flex;
justify-content: space-between;
padding: 16px;
height: 52px;
border-bottom: 1px solid #000;
}
.block_header_button_group {
background-color: #f4f7fc;
border-radius: 4px;
}
.block_header_button {
display: inline-block;
font-size: 12px;
padding: 2px 6px;
color: #8890a7;
cursor: pointer;
}
.block_header_button.active {
color: #f8f9fd;
background-color: #3f4f9c;
border-radius: 4px;
}
</style>
<style lang="scss" scoped>
.block_radius {
width: 100%;
margin-bottom: 20px;
display: flex;
border-radius: 6px;
.right_cont {
flex: 1;
border-radius: 6px;
background-color: #fff;
.icon_box {
width: 20px;
height: 20px;
border-radius: 4px;
background-color: #2a4aa7;
display: flex;
align-items: center;
justify-content: space-around;
}
.top_title {
// width: 100%;
flex: 1;
// height: 36px;
// line-height: 36px;
font-weight: 700;
padding: 0 8px;
box-sizing: border-box;
}
.block_main {
padding: 16px;
}
.no_padding {
padding: 0;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="outlist">
<div v-for="(item, index) in list_arr" :key="index + 1100" class="list">
<span :class="item.prop && item.prop == 'title' ? 'service_title' : ''">
<span class="line" v-if="item.prop && item.prop == 'title'"></span>
{{ item.title }}
</span>
<span v-if="!(item.prop && item.prop == 'title')">
<span v-if="item.type == 'url'" style="white-space: pre-wrap">
访问地址:
<a :href="item.info" target="_blank">{{ item.info }}</a>
</span>
<span v-else-if="item.type == 'time'">{{
dateStringTransform(item.info)
}}</span>
<span
v-else-if="item.type == 'explain'"
v-html="item.info"
style="white-space: pre-wrap"
></span>
<span v-else-if="item.type == 'downArr' && item.info && item.info.length > 0">
<div v-for="(e,i) in item.info" :key="'file' + i" class="file_box">
<span>{{downloadFileFormat(e)}}</span>
<span
class="filebtn"
@click="download(item.url[i])"
>
<span>下载文件</span>
</span>
</div>
</span>
<span v-else v-html="item.info" style="white-space: pre-wrap"></span>
<span
v-if="item.type && item.type == 'down' && item.url != ''"
class="filebtn"
@click="download(item.url)"
>下载文件</span
>
</span>
<slot
v-if="item.type && item.type == 'solt'"
:name="item.solt_name"
></slot>
</div>
</div>
</template>
<script>
import { downloadFileFormat,dateStringTransform } from "@/services/helper.js";
export default {
data() {
return {
// helper: helper,
dateStringTransform,
downloadFileFormat
};
},
props: ["list_arr"],
mounted() {},
methods: {
download(val) {
const a = document.createElement("a"); // 创建a标签
a.setAttribute("download", ""); // download属性
a.setAttribute("href", val); // href链接
a.click(); // 自执行点击事件
},
},
};
</script>
<style scoped>
a {
text-decoration: none;
}
.list span {
line-height: 28px;
color: #242c43;
word-wrap: break-word;
}
.list span:nth-of-type(2) {
color: #242c43;
}
.outlist .list:nth-last-of-type(1) {
margin: 0;
}
.list .service_title {
font-size: 16px;
font-weight: bold;
color: #58617a;
text-align: left;
height: 40px;
line-height: 34px;
margin-top: -10px;
margin-bottom: 20px;
margin-left: -10px;
}
.service_title span {
display: inline-block;
width: 4px;
height: 16px;
background-color: #515fe7;
border-radius: 2px;
float: left;
margin-top: 9px;
margin-right: 15px;
}
.filebtn {
width: 76px;
height: 32px;
line-height: 32px;
text-align: center;
color: #e6ebfe;
background-color: #515fe7;
border-radius: 6px;
display: inline-block;
font-size: 14px;
margin-left: 8px;
cursor: pointer;
}
.file_box {
height: 40px;
line-height: 40px;
padding: 4px 0;
}
</style>
<template>
<div class="input-obj-table-box">
<el-form
ref="ruleFormRef"
class="ruleForm"
:model="tableRows"
:size="formSize"
:rules="formRules"
status-icon
>
<bg-table-pro
:headers="headers"
:data="tableRows"
ref="inputTable"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
row-key="id"
default-expand-all
:border="true"
:stripe="false"
>
<template v-slot:paramName="{ row }">
<el-form-item
:prop="`${row.$row_path}.paramName`"
:rules="row.$parent_type === 'array'?formRules.paramName1:formRules.paramName"
>
<el-input
v-model="row.paramName"
:placeholder="row.$parent_type === 'array' ? `` : `请输入`"
:disabled="disabled||row.$parent_type === 'array'"
/>
</el-form-item>
</template>
<template v-slot:paramType="{ row }">
<el-form-item
:prop="`${row.$row_path}.paramType`"
:rules="formRules.paramType"
>
<el-select
v-model="row.paramType"
:disabled="disabled"
@change="changeInputRowType(row)"
placeholder="请选择"
>
<el-option label="string" value="string" />
<el-option label="int" value="int" />
<el-option label="array" value="array" />
<el-option label="boolean" value="boolean" />
<el-option label="object" value="object" />
</el-select>
</el-form-item>
</template>
<template v-slot:paramValue="{ row }">
<el-form-item
:prop="`${row.$row_path}.paramValue`"
:rules="
row.paramType === 'object' || row.paramType === 'array'
? formRules.paramValue1
: formRules.paramValue
"
>
<el-select
v-model="row.paramValue"
:disabled="disabled"
v-if="row.paramType === 'boolean'"
:placeholder="
row.paramType === 'object' || row.paramType === 'array'
? ``
: `请选择`
"
>
<el-option label="true" :value="true" />
<el-option label="false" :value="false" />
</el-select>
<el-input
v-model="row.paramValue"
:disabled="
disabled ||
row.paramType === 'object' ||
row.paramType === 'array'
"
:placeholder="
row.paramType === 'object' || row.paramType === 'array'
? ``
: `请输入`
"
v-else
/>
</el-form-item>
</template>
<template v-slot:desc="{ row }">
<el-form-item :prop="`${row.$row_path}.desc`" :rules="formRules.desc">
<el-input v-model="row.desc" :disabled="disabled" />
</el-form-item>
</template>
<template v-slot:action="{ row }">
<bg-table-btn :disabled="disabled" :click="()=>{addInputConf(row)}"> 增加 </bg-table-btn>
<bg-table-btn :disabled="disabled" :click="()=>{removeInputConf(row)}"> 删除 </bg-table-btn>
</template>
</bg-table-pro>
</el-form>
<el-dialog
title="编辑结构体"
v-model="jsonEditorVisible"
width="920px"
>
<div style="width: 100%; height: 400px">
<bg-code-editor
v-if="jsonEditorVisible"
:disabled="disabled"
class="bg-ace-editor"
v-model="state.jsonStr"
></bg-code-editor>
</div>
<template v-slot:footer>
<el-button @click="jsonEditorVisible = false"> 取消 </el-button>
<el-button
v-if="!disabled"
type="primary"
@click="confirmJson"
:loading="confirmLoading"
>
确定
</el-button>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
reactive,
toRefs,
onBeforeMount,
onMounted,
ref,
getCurrentInstance,
} from "vue";
import { v4 as uuidv4 } from "uuid";
import { ElMessage } from "element-plus";
const props = defineProps({
data: {
type: Array,
default: () => [],
},
disabled: {
type: Boolean,
default: false,
},
type: {
type: String,
default: "json",
},
});
const formSize = ref("default");
const ruleFormRef = ref(null);
const inputTable = ref(null);
const checkParamName = (rule, value, callback) => {
if (value === "") {
callback(new Error("变量名不能为空"));
} else {
if (value.length > 30) {
callback(new Error("最多30个字符"));
} else {
callback();
}
}
};
const formRules = reactive({
paramName: [{ validator: checkParamName, trigger: "blur" }],
paramName1:[],
paramType: [
{
required: true,
message: "参数类型不能为空",
trigger: ["change"],
},
],
paramValue: [
{
required: true,
message: "值不能为空",
trigger: ["blur", "change"],
},
{
max: 30,
message: "最多30个字符",
trigger: ["blur", "change"],
},
],
paramValue1: [
{
max: 30,
message: "最多30个字符",
trigger: ["blur", "change"],
},
],
desc: [
{
max: 50,
message: "最多50个字符",
trigger: "blur",
},
],
});
const headers = reactive([
{
label: "参数名称",
prop: "paramName",
},
{
label: "参数类型",
prop: "paramType",
},
{
label: "示例",
prop: "paramValue",
},
{
label: "说明",
prop: "desc",
},
{
label: "操作",
prop: "action",
width: 120,
},
]);
const state = reactive({
ruleFormRef,
inputTable,
jsonEditorVisible: false,
confirmLoading: false,
tableRows: [],
jsonStr: "{}",
});
onBeforeMount(() => {
initTable();
});
var initTable = () => {
if (props.data && props.data.length >= 1) {
state.tableRows = props.data;
} else {
addInputConf();
}
};
var createRow = () => {
return {
id: uuidv4(),
paramName: "",
paramType: "string",
paramValue: "",
desc: "",
};
};
var editInputParamsAsJson = () => {
//table转成json字符串
var tableStr = translateToJsonStr(state.tableRows);
if(props.type=='xml'){
state.jsonStr = json2xml(JSON.parse(tableStr))
}else if(props.type=='json'){
state.jsonStr = tableStr
}
state.jsonEditorVisible = true;
}; // 编辑JSON
//json对象转xml字符串
var json2xml=(o, tab)=> {
var toXml = function(v, name, ind) {
var xml = "";
if (v instanceof Array) {
for (var i=0, n=v.length; i<n; i++)
xml += ind + toXml(v[i], name, ind+"\t") + "\n";
}
else if (typeof(v) == "object") {
var hasChild = false;
xml += ind + "<" + name;
for (var m in v) {
if (m.charAt(0) == "@")
xml += " " + m.substr(1) + "=\"" + v[m].toString() + "\"";
else
hasChild = true;
}
xml += hasChild ? ">" : "/>";
if (hasChild) {
for (var m in v) {
if (m == "#text")
xml += v[m];
else if (m == "#cdata")
xml += "<![CDATA[" + v[m] + "]]>";
else if (m.charAt(0) != "@")
xml += toXml(v[m], m, ind+"\t");
}
xml += (xml.charAt(xml.length-1)=="\n"?ind:"") + "</" + name + ">";
}
}
else {
xml += ind + "<" + name + ">" + v.toString() + "</" + name + ">";
}
return xml;
}, xml="";
for (var m in o)
xml += toXml(o[m], m, "");
return tab ? xml.replace(/\t/g, tab) : xml.replace(/\t|\n/g, "");
}
//数组转json字符串
var translateToJsonStr = (arr) => {
let recursionItems = (items, isArr = false) => {
let result = isArr ? [] : {};
items.forEach((item) => {
let _prop = item["paramName"];
let _type = item["paramType"];
let _value = item["paramValue"];
if (_prop || isArr) {
switch (_type) {
case "int":
_value = parseInt(_value) || 0;
break;
case "array":
_value = recursionItems(item.children, true);
break;
case "boolean":
_value = _value || false;
break;
case "object":
_value = recursionItems(item.children);
break;
default:
_value = _value + "";
break;
}
if (isArr) {
result.push(_value);
} else {
result[_prop] = _value;
}
}
});
return result;
};
return JSON.stringify(recursionItems(arr), null, "\t");
}; // 对象数组转换为json字符串
// 判断是否是xml
var isXml = (str) => {
var xmlDoc= null;
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(str);
}
catch(e)
{
try //Firefox, Mozilla, Opera, etc.
{
xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async=false;
xmlDoc.load(str);
}
catch(e) {}
}
return(xmlDoc.xml != "");
};
//字符串转为xmldom
var loadXml = (xmlString) => {
var xmlDoc = null;
if (window.DOMParser) {
var parser = new DOMParser();
xmlDoc = parser.parseFromString(xmlString, "text/xml");
} else {
//IE
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async = "false";
xmlDoc.loadXML(xmlString);
}
return xmlDoc;
};
//xmldom转json字符串
var xmlTojson = (xmlDoc) => {
//准备JSON字符串和缓存(提升性能)
var jsonStr = "";
var buffer = new Array();
buffer.push("{");
//获取xml文档的所有子节点
var nodeList = xmlDoc.childNodes;
generate(nodeList);
/**
* 中间函数,用于递归解析xml文档对象,并附加到json字符串中
* @param node_list xml文档的的nodeList
*/
function generate(node_list) {
for (var i = 0; i < node_list.length; i++) {
var curr_node = node_list[i];
//忽略子节点中的换行和空格
if (curr_node.nodeType == 3) {
continue;
}
//如果子节点还包括子节点,则继续进行遍历
if (curr_node.childNodes.length > 1) {
buffer.push('"' + curr_node.nodeName + '": {');
generate(curr_node.childNodes);
} else {
var firstChild = curr_node.childNodes[0];
if (firstChild != null) {
//nodeValue不为null
buffer.push(
'"' + curr_node.nodeName + '":"' + firstChild.nodeValue + '"'
);
} else {
//nodeValue为null
buffer.push('"' + curr_node.nodeName + '":""');
}
}
if (i < node_list.length - 2) {
buffer.push(",");
} else {
break;
}
}
//添加末尾的"}"
buffer.push("}");
}
jsonStr = buffer.join("");
return jsonStr;
};
var changeInputRowType = (row) => {
delete row["children"];
if (row.paramType === "object" || row.paramType === "array") {
row.paramValue = "";
addInputConfChild(row);
} else if (row.paramType === "int") {
row.paramValue = 0;
} else if (row.paramType === "boolean") {
row.paramValue = true;
} else {
row.paramValue = "";
}
}; //修改参数类型
var addInputConfChild = (row) => {
if (!row.children) {
row.children = [];
}
row.children.push({
...createRow(),
// paramName: row.paramType === "array" ? 0 : "",
});
updataInputConfRows();
}; // 增加子项
var updataInputConfRows = () => {
let recursionItems = (items, parentType, parentPath) => {
for (let i = 0; i < items.length; i++) {
let item = items[i];
item.$parent_type = parentType;
item.$row_path = `${parentPath}[${i}]`;
if (item.children && item.children.length) {
let basePath = `${item.$row_path}.children.`;
recursionItems(item.children, item.paramType, basePath);
}
}
};
recursionItems(state.tableRows, "", "");
state.ruleFormRef && state.ruleFormRef.clearValidate();
}; // 更新 $parent_type 和 $row_path 字段
var addInputConf = (row) => {
let tempRow = createRow();
if (row) {
let { index, rows } = getInputRowInfo(row);
rows.splice(index + 1, 0, tempRow);
} else {
state.tableRows = [tempRow];
}
updataInputConfRows();
}; //增加
var getInputRowInfo = (row) => {
return state.inputTable && state.inputTable.getRowInfo(row, `id`);
}; //获取当前行的数据信息
var removeInputConf = (row) => {
let { index, rows } = getInputRowInfo(row);
rows.splice(index, 1);
if (rows.length === 0) {
rows.push(createRow());
}
updataInputConfRows();
}; // 删除
var isJSON = (str) => {
if (typeof str == "string") {
try {
var obj = JSON.parse(str);
if (typeof obj == "object" && obj) {
return true;
} else {
return false;
}
} catch (e) {
console.log("error:" + str + "!!!" + e);
return false;
}
}
console.log("It is not a string!");
}; //判断是否是json
var confirmJson = () => {
console.log(state.jsonStr);
ElMessage.warning("数据处理中,请稍后!");
state.confirmLoading = true;
setTimeout(() => {
var transStr = ''
if (props.type == "xml") {
if (isXml(state.jsonStr)) {
var xmlDOM = loadXml(state.jsonStr);
var xmlJSON = xmlTojson(xmlDOM);
transStr = xmlJSON
} else {
ElMessage.closeAll();
state.confirmLoading = false;
ElMessage.error("请输入正确xml字符串");
return
}
}else if(props.type == "json"){
if (isJSON(state.jsonStr)) {
transStr = state.jsonStr
} else {
ElMessage.closeAll();
state.confirmLoading = false;
ElMessage.error("请输入正确的数据格式");
return
}
}
let rows = translateToArray(transStr);
state.tableRows = rows;
if (state.tableRows.length === 0) {
addInputConf();
}
ElMessage.closeAll();
state.confirmLoading = false;
state.jsonEditorVisible = false;
}, 100);
}; //点击确认,转化json
var translateToArray = (jsonStr) => {
let recursionItems = (items, parentType, parentPath) => {
let result = [];
let index = 0;
for (let prop in items) {
let temp = {};
let type = getDataType(items[prop]);
temp = createRow();
temp.$parent_type = parentType;
temp.$row_path = `${parentPath}[${index}]`;
temp.paramName = parentType === "array" ? "" : prop;
temp.paramType = type;
if (type === "object") {
let path = `${temp.$row_path}.children.`;
temp.paramType = type;
temp.children = recursionItems(items[prop], type, path);
} else if (type === "array") {
let path = `${temp.$row_path}.children.`;
temp.paramType = type;
temp.children = recursionItems([items[prop][0]], type, path); // 数 组只保留第一条数据,用作示例
} else {
temp.paramValue = items[prop];
}
result.push(temp);
index++;
}
return result;
};
return recursionItems(JSON.parse(jsonStr), "", "");
}; //json字符串转换为对象数组
var getDataType = (value) => {
let type = Object.prototype.toString
.call(value)
.replace("[", "")
.replace("]", "")
.split(" ")[1];
// debugger;
switch (type) {
case "Number":
type = "int";
break;
case "Array":
type = "array";
break;
case "Boolean":
type = "boolean";
break;
case "Object":
type = "object";
break;
default:
type = "string";
break;
}
return type;
}; // 获取数据类型
//对数据做去重和填写校验筛选,只有筛选过的数据才会提交到后端
var getInputData = () => {
//table转成字符串
let tempStr = translateToJsonStr(state.tableRows);
let tempArr = translateToArray(tempStr);
//table转成字符串
let tableStr = translateToJsonStr(tempArr);
let jsonStr = ''
if(props.type=='xml'){
jsonStr = json2xml(JSON.parse(tableStr))
}else if(props.type=='json'){
jsonStr = tableStr
}
return {
table:tempArr,
json:jsonStr
}
};
const { tableRows, jsonEditorVisible, confirmLoading } = toRefs(state);
//暴露获取数据方法
defineExpose({
getInputData,
editInputParamsAsJson,
});
</script>
<style scoped>
.input-obj-table-box {
width: 100%;
height: 100%;
}
.input-obj .el-dialog__body{
padding: 0;
}
</style>
<template>
<el-form
ref="ruleFormRef"
class="ruleForm"
:model="tableRows"
:size="formSize"
:rules="formRules"
>
<bg-table-pro
:headers="headers"
:data="tableRows"
ref="input-table"
:border="true"
:stripe="false"
>
<template v-slot:name="{ row,index }">
<el-form-item
:prop="`[${index}].name`"
:rules="formRules.name"
>
<el-input @change="changeName" :disabled="disabled||acDisable" v-model="row.name" />
</el-form-item>
</template>
<template v-slot:value="{ row,index }">
<el-form-item
:prop="`[${index}].value`"
:rules="formRules.value"
>
<el-input @change="changeValue" :disabled="disabled" v-model="row.value" />
</el-form-item>
</template>
<template v-slot:desc="{ row,index }">
<el-form-item
:prop="`[${index}].desc`"
:rules="formRules.desc"
>
<el-input :disabled="disabled" v-model="row.desc" />
</el-form-item>
</template>
<template v-slot:action="{ row,index }">
<bg-table-btn :disabled="disabled||acDisable" :click="()=>{addParam(index)}">增加</bg-table-btn>
<bg-table-btn :disabled="disabled||acDisable" :click="()=>{removeParam(row, index)}">
删除
</bg-table-btn>
</template>
</bg-table-pro>
</el-form>
</template>
<script setup>
import {
reactive,
toRefs,
onBeforeMount,
onMounted,
ref,
getCurrentInstance,
} from "vue";
import { v4 as uuidv4 } from "uuid";
const props = defineProps({
data: {
type: Array,
default:()=>[]
},
disabled:{
type:Boolean,
default:false
},
acDisable:{
type:Boolean,
default:false
}
})
const emit = defineEmits(['change'])
const formSize = ref("default");
const ruleFormRef = ref(null);
const formRules = reactive({
name:[
{
required: true,
message: '请输入键',
trigger: 'blur'
},
{
max: 30,
message: '最多30个字符',
trigger: 'blur'
}
],
value:[
{
required: true,
message: '请输入值',
trigger: 'blur'
},
{
min: 0,
max: 50,
message: '最多50个字符',
trigger: 'blur'
}
],
desc:[
{
max: 50,
message: '最多50个字符',
trigger: 'blur'
}
]
});
const headers = reactive([
{
label: "",
prop: "name",
},
{
label: "",
prop: "value",
},
{
label: "描述",
prop: "desc",
},
{
label: "操作",
prop: "action",
width: 120,
},
]);
const state = reactive({
tableRows:[]
});
onBeforeMount(()=>{
initTable()
})
var initTable = ()=>{
if(props.data&&props.data.length>=1){
state.tableRows = props.data
}else{
addParam(0)
}
}
var createRow = ()=>{
return{
id:uuidv4(),
name:'',
value:'',
desc:''
}
}
var addParam = (index)=>{changeName
state.tableRows.splice(index + 1, 0, createRow());
}
var removeParam = (row, index)=>{
state.tableRows.splice(index, 1);
if (state.tableRows.length === 0) {
addParam(0);
}
}
const changeName = ()=>{
emit('change',{
type:'name',
data:state.tableRows
})
}
const changeValue= ()=>{
emit('change',{
type:'value',
data:state.tableRows
})
}
var getInputData = ()=>{
let lastData = []
let tempObj = {}
state.tableRows.forEach(e => {
tempObj[e.name] = e
});
for (const key in tempObj) {
if(key&&tempObj[key].value){
lastData.push(tempObj[key])
}
}
return lastData
}
const {tableRows} = toRefs(state)
//暴露获取数据方法
defineExpose({
getInputData,
initTable
})
</script>
<style scoped></style>
<template>
<div class="charts-box" id="line-charts-02121"></div>
</template>
<script setup>
import * as echarts from 'echarts';
import {onMounted,watch} from 'vue'
const props = defineProps({
xarr: {
type: Array,
default:()=>[]
},
yarr1:{
type: Array,
default:()=>[]
},
yarr2:{
type: Array,
default:()=>[]
},
})
watch(
props,
() => {
initLineCharts()
}
)
onMounted(()=>{
initLineCharts()
})
let initLineCharts = ()=>{
let myChart = echarts.init(document.getElementById("line-charts-02121"));
let option = {
tooltip: {
trigger: 'axis'
},
legend: {
data: ['数据交易额', '数据交易量'],
itemWidth:18,
itemHeight:8,
textStyle:{
color:'#fff'
}
},
color:['#ebf18f','#0ea8fc'],
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
axisLine:{
show:false
},
axisLabel:{
color:'#fff'
},
axisTick:{
show:false
},
data: props.xarr
},
yAxis: [
{
name: '万元',
type: 'value',
splitLine:{
lineStyle:{
type:'dashed',
color:'rgba(255,255,255,0.2)'
}
},
axisLabel:{
color:'#fff'
},
nameTextStyle:{
color:'#fff',
align:'right'
}
},
{
name: '',
alignTicks: true,
type: 'value',
splitLine:{
lineStyle:{
type:'dashed',
color:'rgba(255,255,255,0.2)'
}
},
axisLabel:{
color:'#fff'
},
nameTextStyle:{
color:'#fff',
align:'left'
}
}
],
series: [
{
name: '数据交易额',
type: 'line',
data: props.yarr1
},
{
name: '数据交易量',
type: 'line',
yAxisIndex: 1,
data: props.yarr2
}
]
};
// 绘制图表
myChart.setOption(option);
window.onresize = function () {//自适应大小
myChart.resize();
};
}
</script>
<script>
export default {
}
</script>
<style scoped>
.charts-box{
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
</style>
\ No newline at end of file
var img =
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAB0CAYAAABUmhYnAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDcuMS1jMDAwIDc5LjljY2M0ZGU5MywgMjAyMi8wMy8xNC0xNDowNzoyMiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjMgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTBFRjdGNTgwMDZEMTFFREJBNTRDQUU0MEE0NjhGRjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTBFRjdGNTkwMDZEMTFFREJBNTRDQUU0MEE0NjhGRjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxMEVGN0Y1NjAwNkQxMUVEQkE1NENBRTQwQTQ2OEZGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxMEVGN0Y1NzAwNkQxMUVEQkE1NENBRTQwQTQ2OEZGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrN6nIYAABKqSURBVHja7J37kxRXFcdPz2ufsCxvWB5CeOQdyAvyUjFYMQilZYyWVVaZKqv8Rf3Bv8QfjD9alfiDWomx1CSQaCJWzAMQIokmJLAJCWFhebPLsrsz0zPt93Tf3rlz596e3tmZ2ZnlNnXpmd7p1/n099xzb9+H43ketety9Bx14vLXJBxa5Ti0GJsWOUR9+NyNzz2OR2ly8I+oQ+ySJY88z6E8Pl/HvuNYj8ICF/H5YtGj09j31JZlNNmuNnHaCeh/ztFa0NkMgOth+DUJon5sBh/imwhuxKHi1M2F25TF8/809SUxZYtgu4MDXIFZTgHwp9j28dZl9LkFWg+Aw5QGuC1Id8Hqm7DuhcUZmJ/w3SsU6bLr0WixSGNuka4hTeD7RL5A2YJHLm6vmC/6iqR0wj9eIulQKp2kjpRDXamEn+YlEtSL7/OTCVqIfRgsg054nDwawwmPY/0e0tGty4PjWaDxQd4JFT4AI2+CZTMhRPw3AlAXckjjebo47tIILr8g1FmkklJLip0SZShakgRclhigA+DJ7hT1dadpcSZJSwB+Cf7QNwWXKIcL+RjqPQCw71ughuXIWeoFxK9CIdtg3fkwbIFBQl3nAHB4LEdD1/N0FT8tUEml1WCabs6JgoqUDBXKn3vStKA3QwMAvBwqXyZUm8R6FB7iIOD+854VNGaBYnl32FfAY1Aju1YwpQKMdJ5VOJqjk1DiqABXkGDKIHUwawXqSCBlsMkwQbnz52doHasXD99SnCDJbh2qPYoLefXu5XThhgR6ZJgWwlK7YJQtfmADRboFOgMVnrwySUPY5gpwrgJShmiCGfemnAioMlwZbCpc93fSANS7LpWklaxY3qcQgN17z3K6fEMAPTxMHbDM4whE7hdGKsCtnhrN0iDc6iUB0FVUKYPUqbKoUaUXA6a6ThjUmlCVKsFNwR0vmt9BG+CO14jtRQRnh+CKX713BU3MWaBQ5b2IMB/nciKs5SLAGRrJ0sdQ5RX8OW+AKSszys1ShDp1QZGqUqrifhM6FxxC5SAaau3v66DNCKQGcMIUl3MRae+DWg/PKaCHz1I/MscnkNYxSDy956DGQeSR5yWQ+Wm62KIGoi6yraZQXZ5KilrjuOB0CBZ57FKodmMqyGNTUOpJpBeg1ittD/TfZ+huqHK3k8BNozw34dLJSxP0Kf6U08CM62JNwU+tN+PECJbiuOApqJwWddH6rhStx569XhHBnkcv37eSjrQl0INnKAOQ34Yqb4Ml8sgnz1yeoGNYXxcwXYOb1YEsatxqpBr3bIyG++IJo/vVBUxkUKoKNiUB5XUG+WrPwi66BeuVuKA0lPoBwP5520rfBu0B9OAQLUb0+gPA7GOY4y4dB8zPBEgVpupmVZBUrThSDV7cRQPZMcDVgS2LgGWonAD1S90p2iSgjiAa/v22AbrY8kAPnKH1uKMnUa50UDa7fCVLx7IujUguNq/ALMQojpRBrBfAaQLWwdXlrUkFapgyHSnq6++gW2CbhbCNh5t+fvtKP/tpTaAHhug2BAK72PhcwwNVfoSncUKCmTO42EIrgZwB2KTBBWdCqPBaXVDrzVzjxPsgQNy7fYA+aDmggHkPLvZrSJxfnr04TscFwKyizCgX21IgawSbMETAYeJXeZnF3bQJUFfggWcX/A9APdIyQN8Zoi8D5P24i2wOMKHMQQEyp0SzbhUX25IgpwHW5ILlYCkjUgeUuiHDUPEZUA89MEBvzDrQd07TVxyHtgJoLl8AzEk/T5gOzIqotVVBxgCrU2s01E5an076Ss0gvfvgqplBnRHQt07TdhRN7sfV567l6DjKmJcEzGwVmFpVtgvICLAmtZqgsvvtQFl10byMHwFnUKQ59NAqOlDrtSRqhvmFX768Dx8nxvI0aICpRrTGPLNdYSrXrtYvy6/5XMUmYXyRZduxDdmWbFO2bVMV+q8vaC1c7C5WJqK0CyNZv4lGVnG1UcqkuQAyplqjlJqRldrXQWtRSljCSoX73fvI6uk3fZm2Qt84RQtwdTuBIYs88zxgnoqAqVPmnIWpUSsZlBqmnKxUtiXblG3LNmZbNxQoTpDGiR7ji8t7dGk0R6cjAiBX42LnNMwIqKoLlm2Ul8GyTdm2/Du2Ndu8YUDhnR/GlXUh477KTUKkC8kp+aU7V/PLOuarrpKvTtmSbcs2ZlsjPdKQPHT/53QT8s1H8NRMXs/T59zCDpsnNUGQqWhyQ4CMka/qijRpJfLt5JaIPWlaw1CRn765Y60fNNVHoYDZg7LmdoaXhY93S29MTHWzFma0WuU8VRsBs41ha26flIXttzGDugGFiB/AZXCziquTrv+SNlcFpIUZH6oJbI5tzTZn2/sM6gH09c9oHVZLcdZxlJcuUnlFu67ioC1rfZoMVQZbUKJf2bY5tjnbnhkIFrUDfe0kpXDGrZxXIpzm7gFqDZCpXta/YAvTCFUu0kS54JwXFA/ZK04yC2ZSM1Ac4Hb+DSKusVzBD4JMLQ2KFK89rF3KFaq6YFWpflmVbc8MKGi5f3tNQP9+0u/BtcGvQCj6jZ3zVNnSwOabjc9P/bXPIPCQNwk20wOKUJnrE90CN0Us+sWTONGshVmfcmpFkMQMCkH3x4JgEx/oq5+imEK0Gv6bw+cxivcKzAZB9QmSdFB9sMyCmTAbMOqNDRQ7bcaRXTwJ14uBzN3pQLVLTflpJEwKeGSRxpkNGG2KBXTfJ35tBbf8zrpematVG3R51tU2zPV6CthCyIH7vnpB7dyAYFVVoet9kQKmV1JnISIIsq62/q5XFyT5imUmgosnWEUDxa+4/jAvuVrda7BaenrZJb7r1bngKRZFzy+T5pHWRgLdO0hLcZgMfjiJnXJWna2pUmbDjPCrtM8sQqGr2U9D0m6MsqZVZ3NVWlRcbxgsrdYCffGEXwuxTES3OYruPGTV2RoqdZkZs6sAmnBoufiYJ3PzkWr9MO1SX5WSoTgjVzrI7Mpc7lLhbvNWnS2r0jKoglVesPOXlLTnYgokHCfftCCbn5dWuGCvpNTFZQp96QTN44iJvLJ+J7pG0bYSYfYqG4qaCgfXZwZ2YDhfdrkL/R841d+i2GVW1VrpekvMFslAF3mBT9b1oK5wuVadTVOpyd1OJWYmXG//FFAvGPosqibIqrS18tKKmiTBkBIow3Azwk7FN+tcrYU5u1B1rlfm1cksWaHzSD8WkI1qWzcf1QVJvJ4nAzWNBWTzz9bJR72IyHcKaI9VZlvnqTK7HgbaRdWHKLVwWwdiFNQuBtpB0SN1WZDtE/HywJh+JxkLcm6ATYVAyQDxhunT2eKBEUUUH2VuGQaaItI2J7RLe6hU/u4rtJqbtXBbr4LBGDCFCrXL3FiSCWuDubUwUNeaYc4sBXXQ/GqDAttldpeoMfMdWaG6Mevs0vpwVW4uA81HgCwbFcswrLddGrgYxhE0gc2FQE2D5tultdWpJl+hWaqcgMaCbS+Q4dhHWf5vgvSzCpkG0LfL7IIkMk/tNcEfrlP5iJFWne2lUpnddf7vGlVOCeWYANvAqOkBUTU3Kw81dy0E6kRAtUptLWUmDDD58zV/8EY8CTvEBna/4yJfVQdm1I4UZpemQJQHeZwa4FGkHpG4vdf+sGKeJ8pZRJVTQMmjRqqTyNmlOUATVbiEa3++0hAof1lGpXlG1FmCimKb7U44Oy5WN3GeOuT5VRkoj6Ccwt5przR2qyv9WNfo2gJtHlAZXNkYuzzpvBds9+dR81+fwfdyYMSDMMhTJoY7q5OMRwVONtUnmSbLc0iZLkQwy4PhiKxQ/iUT5i75eWmHFJVaZYf5aHhSq9LmutuEwiUlvCoHSefCHeXWCmeRVjuBUsPINk3lXSRIfCeyfV4aCZOU6FY3N2naKU0TcrYCKKicFUfqEEWWEGaazJOWW5U2tiYoYYJJpYnxfHYVQOGDiy8N0jD+uhxH6vT0PblllRatShuqTjUYKoPpBDCT+OXwng2loqTaQOwk0hr8KM8DUIlIN1RqSoHqWJU2XJ0JJUAtzRrsIHk+1JPyAcqA7t5Aw1BpVkhZHhtXbV1fECe1Km2cOk3udmpqLfwyy8yMQCWV3uY4/hA3OdKPvkmaaNcCbZw65Xld0mDTIaBWzAysA/oR0p1I3UKlut7cDlX29LYqbYw6ZZicOgWbpGAVDRQSzsLt8qSuN+FJ6BJjykWNhuKQ7bpfL5iOrvJABspMxOdPmFUchfLyPo56M9Y9okyqRrXyBdhOwvVztY7kapMkTcYu1p1O8GaFa4je1x1MCxTkr7FKsfMGPBHzxHA3Kqy85Ho963rr4mrVV2Vl0zuDBY8zz0XKQWYUG6g4w2GsNjuBv8560YFRwbreurla7Xzd+GOXYJESbPQHjZqd8OVBegirLUjjxWBOS65BCicw1U354VmoNcPUVSRMvcyGOhcKd3v0mxvoLdOBq/U8O4R0BwVPxzxPr05HiXrtK7b4+SZVgelX77HthToLggnVpFCh0luw2iWpdIIq5wwNI+EC2fem04Upv55Uo1pWZ1fC8Ufb5Oh2L9R5bEZABdTvE0/MQ3QNP78suV55zssClQ+CRNb1RrpaospmJGkFaOhqeSyp04D5h2oniNvZ9xWkn+DAPISn6+kBOUqVoIVaHWZUJQK72vnC5rzsi3WSuFM2Q6Vce/QtdrdwvfxCdVxyvabpQCzU+DDDFLrabrjaZeLzX6HO9+oKVED9Hlacp/IUWucl16uD6hmg3khgHc3nhFLmVGH6rhYwedhxjmqPAeZzcU843fEV/oK0EmkBfDs/C+cjajsKYi1DvZHUquv+l9BUIMgw06ICYQnWXIlwVdg8/kmno1ChUj7ZT/lisOdV7H7BECDphjm/UaCaYKpFlIpAiGHiRwuE7X4NdV5oKFCpKPOUCJBGvCBPzVP5DMAFJfI1VTp4cxymoymeyDCn1AmYy5xgIGPe9ky1IkrdgAqoPGv7dymY5WfYC1rf5xSV6uZMM9X5enMEJJG+jlYNgsrqaxmkE8y/wn/7I2C+U9NF1ApUQH0cq29QMN/LEI40qrhe06QERJVvb9oZqq6bfMIQ0apFlLRfPHFoQHx/BTD31XwhMwEqoD6B1Q4Kmn9eYbUaot7pzKHmtTFIXcuDhCYISok8kxvl9QuY+wHzhRld0EyBCqjfwerrIk9lqGcVlcpVg7pAqUjtNSydaXiZREQAVNGkBDBXCJi87e+A+acZX1g9gAqoO7HicirPUHAZhz1D5VM9FxSw05m1yWtxkCZlyiDLmmMC5konmC+Htz8HmK/V5QLrBVRA3YbVjwWBqwJqtor79doAbFyQcdxsh4C5QBznN4B5sG4XWk+gvLx0gu7ABf9cPIljRY9Oi2pCV6NUdTYKtQ/qbIONAim7VvWdZkKjzJSozlslKg04kPzV7o3037pecL2B+lAHaQB39wsK+pxyvnpWVEC4VdyvCWwU3HoCdiK26yoJTKqsqKMVFQbLxYN+Dhf8y90baKjuT2AjgAqonaJG6V4BjYOlIckFm6azjDNDRZz3rF6N8EwQ43T5U2uBQhfLRZJ+se0I0tOAOdkQl9IooBLYR2HaH1GpE9R5nPG8UvEwXaieoVLCm6EyTWMeThem72qdYF5PTp3+g+zQswD5ekPziEYDFfnqMjylP8OpbhXwRoTbGdW4XrVYEzVjRTOAmoIeR+Ni/XxTvMPk7KbPB+vQh7j3p5Ffnmt4pt8MoJJad+Jmn8Ipu3GTBVFm5Zsc0wDVqZUout1SLU1enCrK1JUtTXlmr6iP7cd9MchxXMxvocq/NS0cbyZQodYemIVd8E4qDchxSQPWNOWl2oJ/pi/RdS+fifSDb5lGIvFBUmkkGb6H13Alz0KV15tavmo2UAnscpjoKXx8kErNVlix3BDtiiH61amVqHrTUa9KMURXHFFVqYtm+wFykQh4wlFi3sb/zwDk8KwUmGcLqAR2FUz1QwE27IvKSuXXchdFIFWkeHOCm/LWqAg3KvjRqZIbbi0W+WOvAJsXIH8HkKdmtSprtoGGy4sn/FYQT+Ljo+KJD8Fx4MS1TldFBUWU+60XUNXNcp7PNTuc5kvb2ZO8jmt7fs/GYJygWa+bbBWgElgHxnuYgtdyd1Hw8jcExUC5KSkrOBzGLo5SqwVDqiq5UXOP6EsyT3wP/8ZvkrjB1iu4jjdbbbaplgOqwOWmjDuEO75DqEMFOCbcMve/UdsLqw3V5CKH/HK5k0rj5/VqALOX4Cq6t3HA/YCYbVWbtTRQTX57q6h5uh1pPQVvK6qVRb0qNUS6Mig3Juc+sv9DOox88cN2sVFbAdUomJs5cj/WjUgrKKgrXSiU3C0UGDb1ICo1jckLdz0q4HFEyu9wB5GO7WlyUaOey/8FGADnDhMTr1oPTQAAAABJRU5ErkJggg=="
export default img
<template>
<div class="charts-box" id="pie-charts-02121"></div>
</template>
<script setup>
import * as echarts from 'echarts';
import {onMounted,watch} from 'vue'
import img from './pie-base64.js'
const props = defineProps({
data:{
type:Object,
default:()=>{}
},
imgStyle:{
type:Object,
default:()=>{}
},
color1:{
type:Array,
default:()=>null
},
color2:{
type:Array,
default:()=>null
},
})
watch(
props,
() => {
initPieCharts()
}
)
onMounted(()=>{
initPieCharts()
})
let get_color = (length,arr)=>{
var temp = []
for (let index = 0; index < length; index++) {
temp.push(arr[index])
}
return temp
}
let empty_name = (data)=>{
var temp = []
data.forEach(e => {
temp.push({
value:e.value,
name:''
})
});
return temp
}
let initPieCharts = ()=>{
let myChart = echarts.init(document.getElementById("pie-charts-02121"));
let imgSrc1 = img
let color1 = props.color1||[
"rgba(2, 255, 222, 1)",
"rgba(43, 196, 255, 1)",
"rgba(247, 253, 149, 1)",
]
let color2 = props.color2||[
"rgba(2, 255, 222, 0.3)",
"rgba(43, 196, 255, 0.3)",
"rgba(247, 253, 149, 0.3)",
]
let option = {
backgroundColor: "rgba(0,0,0,0)",
graphic: {
elements: [
{
type: "image",
z: 6,
style: {
image: imgSrc1,
width: props.imgStyle&&props.imgStyle.width?props.imgStyle.width:90,
left: "22.5%",
top:"38%",
},
left: "22.5%",
top: props.imgStyle&&props.imgStyle.top?props.imgStyle.top:45,
},
],
},
title: [
{
text: props.data.value,
subtext: props.data.name,
textAlign: "center",
x: "34%",
y: "30%",
subtextStyle: {
color: "#b2daff",
fontSize: 16,
},
textStyle: {
color: "#b2daff",
fontSize: 40,
fontWeight: "normal",
fontFamily: "Digital-7Mono",
},
},
],
legend: {
right: 0,
top:'center',
textStyle: {
color: "#b2daff",
fontSize:16,
},
itemWidth: 8,
itemHeight: 8,
itemGap:20,
icon:'circle',
itemStyle:{
borderWidth:0,
},
selectedMode:false,
orient: 'vertical',
},
series: [
{
name: "",
type: "pie",
hoverAnimation: false,
legendHoverLink: false,
z:2,
radius: ["58%", "70%"],
center: ["35%", "50%"],
color: get_color(props.data.data.length,color2),
label: {
normal: {
position: "inner",
},
},
labelLine: {
normal: {
show: false,
},
},
// itemStyle: {
// normal: {
// borderColor: "#172837",
// borderWidth: "2",
// },
// },
tooltip: {
show: false,
},
data: empty_name(props.data.data),
},
{
name: props.data.name,
type: "pie",
hoverAnimation: false,
legendHoverLink: false,
radius: ["70%", "75%"],
center: ["35%", "50%"],
color: get_color(props.data.data.length,color1),
label: {
normal: {
show: true,
position: "outside",
formatter: "{d}%",
textStyle: {
align: "center",
baseline: "middle",
fontSize: 14,
color: '#b2daff',
fontWeight: "100",
},
},
},
labelLine: {
normal: {
smooth: true,
length: 10,
lineStyle: {
width: 1.5,
color:'#b2daff'
},
},
},
// itemStyle: {
// normal: {
// borderColor: "#172837",
// borderWidth: "2",
// },
// },
data: props.data.data,
},
],
};
// 绘制图表
myChart.setOption(option);
window.onresize = function () {//自适应大小
myChart.resize();
};
}
</script>
<script>
export default {
}
</script>
<style scoped>
.charts-box{
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
</style>
\ No newline at end of file
<template>
<div class="out">
<div
class="box"
v-for="(item,index) in data"
:key="index+3000"
:style="
!(item.arr&&item.arr.length!==0)||item.result==='审批未通过'||item.result==='审批不通过'
?{border:'none'}
:(index==data.length-1)
?{marginBottom:'0px',}:
{}
"
:class="
data[index+1]&&data[index+1].result==='审批中'
?'dashedbd'
:''
"
>
<div
class="circle"
:style="
item.result == '审核通过'
?{backgroundColor:'#3759be',borderColor: '#3759be'}
:{}
"
>
</div>
<div
class="line"
v-if="index == 0"
:style="
item.result == '审核通过'
?{backgroundColor:'#3759be'}
:item.result==='审核未通过'||item.result==='审核不通过'
?{backgroundColor:'#de3b4b'}
:{}
"
>
</div>
<div
class="line line_bottom"
v-if="index == 1"
:style="
item.result == '审核通过'
?{backgroundColor:'#3759be'}
:{}
"
>
</div>
<div
class="card"
:style="
item.result==='审批未通过'||item.result==='审批不通过'
?{backgroundColor:'#fcfafa'}
:{}
"
>
<p
class="card_title"
:style="
!(item.arr&&item.arr.length!==0)
?{backgroundColor:'#fcefd6'}
:{}
"
>
<span
:style="
!(item.arr&&item.arr.length!==0)
?{color:'#ef9433'}
:item.result==='审批未通过'||item.result==='审批不通过'
?{color:'#e15260'}
:{}
"
>
{{item.result}}
</span>
<span>
{{item.appro_time}}
</span>
</p>
<div
class="card_contain"
v-if="item.arr&&item.arr.length!==0"
>
<info-list :list_arr="item.arr"></info-list>
</div>
</div>
</div>
</div>
</template>
<script>
import infoList from './infoList.vue'
export default {
props: ['data','type'],
components: {
infoList
},
data() {
return {};
},
watch: {},
computed: {},
created() {},
mounted() {},
methods: {},
};
</script>
<style scoped>
.out{
/* width: 820px; */
margin-top: 15px;
}
.box{
position: relative;
/* border-left: 2px solid #e3e5ef; */
/* padding-left: 28px; */
margin-left: 28px;
/* padding-bottom: 16px; */
border: 1px solid #e3e4ef;
margin-bottom: 16px;
}
.circle{
width: 12px;
height: 12px;
background-color: #bcc1d0;
border: solid 4px #bcc1d0;
border-radius: 50%;
position: absolute;
top: 12px;
left: -28px;
}
.line {
position: absolute;
top: 24px;
left: -23px;
height: 78px;
background-color: #c1c7d7;
width: 2px;
}
.line_bottom {
top: -66px;
background-color: #c1c7d7;
}
.card{
/* width: 780px; */
background-color: #fff;
border-radius: 4px;
overflow: hidden;
margin: 0;
}
.card .card_title{
height: 38px;
line-height: 38px;
background-color: #f9fafc;
overflow: hidden;
text-align: left;
padding: 0 16px;
}
.card .card_title span{
font-size: 14px;
font-weight: 700;
color: #242c43;
text-align: left;
}
.card .card_title span:nth-of-type(1){
float: left;
}
.card .card_title span:nth-of-type(2){
float: right;
color: #58617a;
font-weight: normal;
}
.card_contain{
padding: 9px 16px;
text-align: left;
font-size: 14px;
color: #242c43;
}
.dashedbd{
border-left-style:dashed;
}
</style>
<template>
<div ref="container" class="show_more_filter" :style="showMore?{height:'auto'}:{}">
<slot></slot>
<a
v-if="showBtn"
class="show_more_btn"
:style="{
left: btnLeft,
}"
@click="toggle"
>
{{showMore ? '收起' : '展开'}}
<el-icon class="e-icon" v-if="showMore"><CaretTop /></el-icon>
<el-icon class="e-icon" v-else><CaretBottom /></el-icon>
</a>
</div>
</template>
<script>
export default {
data() {
return {
showBtn: false,
showMore: false,
btnLeft: 0,
};
},
mounted() {
setTimeout(() => {
this.resize();
}, 500);
window.addEventListener("resize", this.resize);
},
destroyed() {
window.removeEventListener("resize", this.resize);
},
methods: {
resize() {
this.$nextTick(() => {
let container = this.$refs.container;
if (!container) return;
let containerWidth = container.getBoundingClientRect().width - 80;
let filters = container.querySelectorAll(".filter_item");
let totalWidth = 0;
let wrapFlag = false;
this.showBtn = false;
filters.forEach((filter, index) => {
filter.style.display = "inline-block";
let filterWidth =
Math.ceil(filter.getBoundingClientRect().width) + 15;
totalWidth += filterWidth;
if (totalWidth > containerWidth) {
this.showBtn = true;
if (!wrapFlag) {
this.btnLeft = totalWidth - filterWidth + 5 + 34 * index + "px";
wrapFlag = true;
}
// filter.style.display = this.showMore ? "inline-block" : "none";
} else {
// filter.style.display = "inline-block";
}
});
});
},
toggle() {
this.showMore = !this.showMore;
this.resize();
},
},
};
</script>
<style scoped>
.show_more_filter {
position: relative;
padding-right: 80px;
overflow: hidden;
height: 52px;
}
.show_more_btn {
position: absolute;
top: 24px;
font-size: 14px;
line-height: 20px;
color: #3759be;
cursor: pointer;
user-select: none;
}
.e-icon{
vertical-align: -1px;
}
</style>
<template>
<el-table
:data="tableData"
style="width: 100%;"
class="cj_table"
:stripe="stripe"
:max-height="tableHeight"
:header-cell-style="headerCellStyle"
>
<el-table-column
v-if="isIndex"
type="index"
:label="indexLabel"
width="65"
align="left"
>
<!-- 序号 -->
</el-table-column>
<template v-for="(item,index) in tableHeader.value" :key="'header-' + index">
<!-- 嵌套表头 -->
<MyTableColumn
v-if="item.children && item.children.length"
:coloumnHeader="item"
></MyTableColumn>
<el-table-column
v-else
:label="item.label"
:prop="item.prop"
header-align="center"
:align="item.align"
:width="item.width"
></el-table-column>
</template>
</el-table>
</template>
<script setup>
import MyTableColumn from "./MyTableColumn.vue";
const props = defineProps({
tableHeight: {
type: Number,
default: 384
}, // 表格最大高度,超出显示滚动条
tableHeader: {
type: Object,
default: () => {}
}, // 表头
tableData: {
type: Array,
default: () => []
}, // 表格数据
isIndex: {
type: Boolean,
default: false
}, // 显示序号
indexLabel: {
type: String,
default: "序号"
}, // 序号label
stripe: {
type: Boolean,
default: false
}, // 斑马纹
});
const headerCellStyle = (row) => {
return {
'border-top': '2px solid #b0bee8',
'border-bottom': '1px solid #b0bee8'
}
}
</script>
<style>
.cj_table .el-table__cell {
padding: 12px 0;
color: #202531;
}
.cj_table thead.is-group {
/* border: 1px solid #b0bee8; */
color: #202531;
font-weight: 700;
}
.cj_table thead.is-group tr:last-child th{
border-top: none!important;
}
.cj_table thead.is-group tr th:last-child{
border-right: 1px solid #b0bee8!important;
}
.cj_table .el-table__header-wrapper .el-table__header {
border-left: 1px solid #b0bee8;
}
.cj_table thead.is-group th.el-table__cell {
background-color: #dfe5f6!important;
border-color: #b0bee8!important;
}
.cj_table .el-table__body tr.el-table__row--striped td.el-table__cell {
background-color: #f7f7f9;
}
</style>
\ No newline at end of file
<template>
<el-table-column :label="coloumnHeader.label" header-align="center">
<template v-for="(item,index) in coloumnHeader.children" :key="'header' + index">
<MyTableColumn
v-if="item.children && item.children.length"
:coloumnHeader="item"
></MyTableColumn>
<el-table-column
v-else
:label="item.label"
:prop="item.prop"
header-align="center"
:align="item.align"
:width="item.width"
></el-table-column>
</template>
</el-table-column>
</template>
<script>
export default {
name: "MyTableColumn",
props: {
coloumnHeader: {
type: Object,
default: {}
}
}
}
</script>
\ No newline at end of file
<template>
<div class="virtual-box">
<div class="virtual-content" @scroll="load_data($event)">
<div class="virtual-long-content" :style="{height:data.length*minHeight+'px'}">
<div class="virtual-min-box" :ref="'virtual'+index" :style="{top:get_top(index),height:minHeight+'px'}" :data-set="index" v-for="(item,index) in now_arr" :key="index">
<slot :item="item"></slot>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
minHeight:{
type:Number,
default:50
},
data:{
type:Array,
default:()=>[]
}
},
components: {
},
data() {
return {
now_arr:[],
now_data:0,
};
},
watch: {
},
computed: {
},
created() {
for(let i=0;i<=20;i++){
this.now_arr.push(this.data[i])
}
},
mounted() {
},
methods: {
load_data(e){
console.log(e.target.scrollTop);//滚动距离
this.now_arr = []
this.now_data = Math.ceil(e.target.scrollTop/this.minHeight)//滚动的数据数量
console.log(this.now_data);
let start = 0 //起始数据index
let end = this.now_data+20 //终止数据index
if(this.now_data-10>0){
start = this.now_data-10
}
if(end>=this.data.length){
end = this.data.length
}
for(let i=start;i<end;i++){
this.now_arr.push(this.data[i])
}
},
get_top(index){
let start = 0
if(this.now_data-10>0){
start = this.now_data-10
}
return this.minHeight*(index+start)+'px'
}
},
};
</script>
<style scoped>
.virtual-content{
width: 100%;
height: 100%;
overflow-x: hidden;
overflow-y: scroll;
}
.virtual-long-content{
width: 100%;
position: relative;
}
.virtual-min-box{
width: 100%;
/* height: 50px; */
position: absolute;
left: 0;
/* line-height: 50px; */
color: #000;
text-align: center;
}
</style>
import {createI18n} from 'vue-i18n'
import lang from './index'
const i18n = createI18n({
locale:localStorage.lang||'zh',
messages:lang
})
export default i18n
\ No newline at end of file
import en from './language-en'
import zh from './language-zh'
export default {
en,
zh,
}
\ No newline at end of file
const en = {
}
export default en
\ No newline at end of file
const zh = {
serviceshop:"服务超市",
compute:"算力产品服务",
safety:"安全产品服务",
data:"数据产品服务",
cloud:"网络产品服务",
solution:"解决方案服务",
servicemanagge:"服务管理",
}
export default zh
\ No newline at end of file
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import locale from 'element-plus/lib/locale/lang/zh-cn'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import bgui from "@/bg-ui";
import "@/bg-ui/index.scss";
import App from './App.vue'
import router from './router'
import {generateRoutes} from './router/index.js'
import '../src/assets/css/base.css'
import '../src/assets/css/font.css'
import '../src/assets/css/index.css'
import store from '@/store';
import i18n from './i18n/i18n.js'
import axios from './request/http.js'
const createVue = createApp(App)
createVue.use(ElementPlus, { locale });
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
createVue.component(key, component)
}
createVue.config.globalProperties.$axios = axios
import menu from './router/function.js'
//获取用户信息
function getUser() {
return axios.get(`/msg/system/getUserInfo`)
}
//处理菜单成为对象
function getMenuObj(menu,parentRowPath,menuObj){
menu.forEach((e,idx) => {
e.rowPath = parentRowPath + '.' + idx
menuObj[e.path] = e
if(e.children&&e.children.length){
getMenuObj(e.children,e.rowPath,menuObj)
}
});
}
Promise.all([getUser()]).then(res => {
console.log(res);
if (res[0].data.code == 200) {
//已登录则记录菜单和用户信息
store.commit('setUserInfo', res[0].data.data)
if (res[0].data.data.userType == 1) {//超管
store.commit('setMenu', menu.adminMenu)
menu.menuToRouter(menu.adminMenu)
console.log(menu);
store.commit('setRoute',menu.adminMenu)
//存储菜单对象信息
let menuObj = {}
getMenuObj(menu.adminMenu,'',menuObj)
store.commit('setMenuObj',menuObj)
console.log(menuObj);
}
}
generateRoutes()
createVue.use(ElementPlus).use(store).use(router).use(i18n).use(bgui)
createVue.mount('#app')
}).catch(() => {
createVue.use(ElementPlus).use(store).use(router).use(i18n).use(bgui)
createVue.mount('#app')
})
//后期加入权限处理,参考msg/ui
<template>
<div>
<h1>404,你的页面走丢了</h1>
</div>
</template>
<script>
export default {
props: {
},
components: {
},
data() {
return {
};
},
watch: {
},
computed: {
},
created() {
},
mounted() {
},
methods: {
},
};
</script>
<style scoped>
h1{
margin-top: 100px;
text-align: center;
}
</style>
<template>
<div>
<span @click="getTableData1">login</span>
<span @click="getSelect">select</span>
<bg-table ref="bgTable" :headers="headers" :rows="tableRows" :select="true" height="100%"></bg-table>
</div>
</template>
<script>
import { reactive, toRefs,onBeforeMount,onMounted,ref } from 'vue'
export default {
setup(){
const bgTable = ref(null)
const state = reactive({
bgTable,
headers:[
{
label: "类型",
prop: "certificateTypeDesc",
},
{
label: "业务ID",
prop: "businessId",
},
{
label: "申请主体",
prop: "businessId1",
}
],
dataTable:[
{
certificateTypeDesc:111,
businessId:111,
businessId1:111,
id:1,
},
{
certificateTypeDesc:111,
businessId:111,
businessId1:111,
id:2,
},
{
certificateTypeDesc:111,
businessId:111,
businessId1:111,
id:3,
},
{
certificateTypeDesc:111,
businessId:111,
businessId1:111,
id:4,
},
{
certificateTypeDesc:111,
businessId:111,
businessId1:111,
id:5,
},
{
certificateTypeDesc:222,
businessId:22,
businessId1:222,
id:6,
},
{
certificateTypeDesc:2222,
businessId:2222,
businessId1:2222,
id:7,
},
{
certificateTypeDesc:2222,
businessId:2222,
businessId1:2222,
id:8,
},
{
certificateTypeDesc:2222,
businessId:2222,
businessId1:2222,
id:9,
},
{
certificateTypeDesc:2222,
businessId:2222,
businessId1:2222,
id:10,
},
],
tableRows:[],
nowPage:1
})
onBeforeMount(() => {
getTableData()
})
onMounted(() => {
console.log(state.bgTable);
})
const getTableData=()=>{
state.tableRows=[]
state.dataTable.forEach((e,idx) => {
if(idx>=(state.nowPage-1)*5&&idx<state.nowPage*5){
state.tableRows.push(e)
}
});
}
const getTableData1=()=>{
console.log(1111);
if(state.nowPage==1){
state.nowPage = 2
}else{
state.nowPage = 1
}
getTableData()
}
const getSelect=()=>{
let select = state.bgTable.dealSelectData()
console.log(select);
}
return {
...toRefs(state),
getTableData,
getTableData1,
getSelect,
}
}
};
</script>
<style scoped>
</style>
<template>
<div style="height:100%;">
<router-view></router-view>
</div>
</template>
<script>
export default {
props: {
},
components: {
},
data() {
return {
};
},
watch: {
},
computed: {
},
created() {
},
mounted() {
},
methods: {
},
};
</script>
<style scoped>
</style>
<template>
<div class="login-bg">
<div class="login-box">
<p class="login-title">登录</p>
<el-form :model="form" ref="form" class="login_forms">
<el-form-item>
<el-input v-model.trim="form.userid" autofocus="autofocus" placeholder="请输入账号" @keyup.enter="login_remember_info()"></el-input>
</el-form-item>
<el-form-item>
<el-input type="password" v-model.trim="form.password" placeholder="请输入密码" @keyup.enter="login_remember_info()">
<!-- <span
slot="suffix"
:title="visible ? '显示密码' : '隐藏密码'"
@click="changePass()"
style="cursor: pointer"
:class="visible ? 'eye_dis' : 'eye'"
></span> -->
</el-input>
</el-form-item>
<el-form-item prop="yzm" class="yzm">
<div class="yzm_ctx">
<el-input class="yzm_ipt" v-model.trim="form.yzm" placeholder="请输入验证码" :validate-event="false" @keyup.enter="login_remember_info()"></el-input>
<img class="yzm_img" title="看不清?换一张" :src="imgSrc" @click="getImg()" />
</div>
</el-form-item>
<div class="apaas_button">
<el-button class="btn_sub" type="primary" @click.prevent="login_remember_info()">登 录</el-button>
</div>
</el-form>
</div>
</div>
</template>
<script>
import { setCookie, clearCookie } from "../../services/cookie.js";
import menu from '../../router/function'
import {generateRoutes} from '../../router/index'
import inputTable from '../../components/input-table.vue';
import inputObjectTable from '../../components/input-object-table.vue';
export default {
props: {},
components: {
inputTable,
inputObjectTable
},
data() {
return {
form: {
userid: "",
password: "",
yzm: "",
},
imgSrc: "",
};
},
watch: {},
computed: {},
created() {
console.log(111);
this.getImg();
},
mounted() {},
methods: {
getMenuObj(menu,parentRowPath,menuObj){
menu.forEach((e,idx) => {
e.rowPath = parentRowPath + '.' + idx
menuObj[e.path] = e
if(e.children&&e.children.length){
this.getMenuObj(e.children,e.rowPath,menuObj)
}
});
},
getUser() {
this.$axios.get(`/msg/system/getUserInfo`).then((res) => {
if (res.data.code == 200) {
this.$store.commit("setUserInfo", res.data.data);
if (res.data.data.userType == 1) {
//超管
this.$store.commit("setMenu", menu.adminMenu);
menu.menuToRouter(menu.adminMenu)
this.$store.commit('setRoute',menu.adminMenu)
//存储菜单对象信息
let menuObj = {}
this.getMenuObj(menu.adminMenu,'',menuObj)
this.$store.commit('setMenuObj',menuObj)
}
generateRoutes()
this.$router.push("/");
}
});
},
login_remember_info() {
if (!this.form.userid) {
return this.$message.error("请输入账号");
}
if (!this.form.password) {
return this.$message.error("请输入密码");
}
if (!this.form.yzm) {
return this.$message.error("请输入验证码");
}
this.$axios
.get(`/msg/system/checkCaptcha/${this.imgId}/${this.form.yzm}`)
.then((res) => {
if (res.data.code == 200) {
this.login();
} else {
this.$message.error(res.data.desc);
}
});
},
login() {
this.$axios
.post(`/msg/system/login`, {
userId: this.form.userid,
userPassword: this.form.password,
})
.then((res) => {
if (res.data.code == "200") {
let data = res.data.data;
console.log(data);
setCookie("bgToken", data.name);
this.getUser();
} else {
this.$message.error(res.data.desc);
}
});
},
getImg() {
this.$axios.get(`/msg/system/getCaptcha`).then((res) => {
if (res.data.code == 200) {
this.imgId = res.data.data.key;
this.imgSrc = res.data.data.image;
}
});
},
},
};
</script>
<style scoped>
.login-bg {
width: 100%;
height: 100%;
background-image: url("../../assets/imgs/bg.png");
background-size: cover;
background-repeat: no-repeat;
display: flex;
align-items: center;
flex-direction: row;
justify-content: center;
}
.login-box {
width: 480px;
height: 401px;
background-color: #ffffff;
box-shadow: 0px 6px 12px 0px rgba(0, 20, 53, 0.3);
border-radius: 6px;
padding: 40px;
}
.login-title {
font-size: 24px;
font-weight: 600;
color: #202531;
text-align: center;
margin-bottom: 40px;
}
.yzm_ipt {
width: 240px;
}
.yzm_img {
vertical-align: middle;
}
.btn_sub {
width: 400px;
height: 40px;
/* line-height: 20px; */
background-color: #2b4695;
border-radius: 4px;
font-size: 18px;
font-weight: 600;
padding: 0;
color: #ffffff;
margin-top: 20px;
}
</style>
<template>
<div class="detail_container">
字典管理
</div>
</template>
<script >
import { reactive, toRefs, ref, } from '@vue/reactivity'
import { getCurrentInstance } from 'vue'
import { computed, onBeforeMount } from '@vue/runtime-core'
import { useRouter } from 'vue-router';
export default {
components: {
},
setup() {
onBeforeMount(() => {
})
return {
...toRefs(),
}
},
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="contactForm"
:rules="contactFormRules"
ref="contactRef"
style="max-width: 66%"
>
<el-form-item label="联系人姓名" prop="contact_user">
<el-input v-model="contactForm.contact_user" />
</el-form-item>
<el-form-item label="联系人手机号" prop="phone">
<el-input v-model="contactForm.phone" />
</el-form-item>
<el-form-item label="联系人邮箱">
<el-input v-model="contactForm.email"/>
</el-form-item>
<el-form-item label="备注">
<el-input type="textarea" :rows="3" v-model="contactForm.remark" />
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted } from 'vue'
const contactForm = reactive({
contact_user: '',
phone: '',
email: '',
remark: '',
})
const contactFormRules = reactive({
contact_user: [
{ required: true, message: '请输入联系人姓名', trigger: 'blur' },
],
phone: [
{ required: true, message: '请输入联系人手机号', trigger: 'blur' },
],
})
const contactRef = ref(null)
const emit = defineEmits(['action'])
const submitForm = async () => {
if (!contactRef) return
await contactRef.value.validate((valid, fields) => {
if (valid) {
emit('action', contactForm)
} else {
emit('action',null)
}
})
}
const clearForm = () => {
if (!contactRef) return
contactRef.value.resetFields()
}
const setForm = (data) => {
contactForm.value = Object.assign(contactForm, data);
}
onMounted(() => {
})
defineExpose({ submitForm, clearForm, setForm })
</script>
\ No newline at end of file
<template>
<div class="page_container">
<div class="bg-breadcrumb">
<el-breadcrumb separator="/">
<el-breadcrumb-item> 开发管理 </el-breadcrumb-item>
<el-breadcrumb-item :to="{ path: '/develop/account' }"> 系统账号管理 </el-breadcrumb-item>
<el-breadcrumb-item> {{ route.query.type === "0" ? '新建' : '编辑'}} </el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="page_content flex_cloumn">
<div class="content_top">
<div class="content_process">
<div>
<el-steps :active="step">
<el-step title="">
<template #icon>
<span class="process_desc"><img src="/src/assets/imgs/home_ic_user.png" alt=""> 业务系统信息</span>
</template>
</el-step>
<el-step title="">
<template #icon>
<span class="process_desc"><img src="/src/assets/imgs/home_ic_user.png" alt=""> 联系人信息</span>
</template>
</el-step>
<el-step title="">
<template #icon>
<span class="process_desc"><img src="/src/assets/imgs/home_ic_user.png" alt=""> 完成</span>
</template>
</el-step>
</el-steps>
</div>
</div>
<div class="content_main">
<systemForm v-show="step === 1" ref="systemFormRef" :data="tempFormData" @action="getSystemFormData"></systemForm>
<contactForm v-show="step === 2" ref="contactFormRef" :data="tempFormData" @action="getContactFormData"></contactForm>
<div class="process_end" v-show="step === 3">
<el-button @click="cancel">返回列表</el-button>
<el-button type="primary" @click="continueCreate">继续创建</el-button>
</div>
</div>
</div>
<div class="content_bottom" v-if="step !== 3">
<div v-show="step === 1">
<el-button @click="cancel">取消</el-button>
<el-button type="primary" @click="nextStep">下一步</el-button>
</div>
<div v-show="step === 2">
<el-button>取消</el-button>
<el-button type="primary" @click="previousStep">上一步</el-button>
<el-button type="primary" @click="submit">提交</el-button>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { useRoute, useRouter } from 'vue-router';
import systemForm from './system-form.vue';
import contactForm from './contact-form.vue';
import { reactive, ref,onBeforeMount,toRefs,computed, onBeforeUnmount, onMounted } from 'vue';
const route = useRoute();
const router = useRouter();
const step = ref(1);
const systemFormRef = ref(null);
const contactFormRef = ref(null);
const tempFormData = ref(null)
const formData = ref({
org: '',
code: '',
name: '',
desc: '',
logo: '',
role: '',
account: '',
password: '',
url: '',
firm_name: '',
is_use: '',
contact_user: '',
phone: '',
email: '',
remark: '',
}); //业务系统表单+联系人表单
onBeforeUnmount(()=>{
})
onMounted(() => {
if(route.query.type === "1") {
setTimeout(()=> {
systemFormRef.value.setForm({
org: 'a',
code: 'b',
name: 'b',
desc: 'b',
logo: ['b'],
role: 'b',
account: 'b',
password: 'b',
confirm_password: 'b',
url: 'b',
firm_name: 'b',
is_use: 'b',
})
contactFormRef.value.setForm({
contact_user: 'c',
phone: 'c',
email: 'c',
remark: 'c',
})
},500)
}
})
// 下一步
const nextStep = () => {
systemFormRef.value.submitForm();
}
//业务系统表单检验触发事件 data为null 校验失败
const getSystemFormData = (data) => {
if(data) {
formData.value = Object.assign(formData,data);
step.value = 2;
}else {
}
}
//联系人表单检验触发事件 data为null 校验失败
const getContactFormData = (data) => {
if(data) {
formData.value = Object.assign(formData,data);
console.log(formData);
step.value = 3;
}
}
//上一步
const previousStep = () => {
step.value--;
}
//提交表单
const submit = () => {
contactFormRef.value.submitForm();
}
//继续创建 清空表单
const continueCreate = () => {
systemFormRef.value.clearForm();
contactFormRef.value.clearForm();
step.value = 1;
}
//取消
const cancel = () => {
router.go(-1);
}
</script>
<style scoped>
.flex_cloumn {
display: flex;
flex-direction: column;
}
.content_top {
flex: 1;
display: flex;
flex-direction: column;
overflow: auto;
}
.content_top::-webkit-scrollbar {
width: 5px;
height: 0px;
}
.content_top::-webkit-scrollbar-thumb {
background: #dedede;
border-radius: 10px;
height: 0px;
}
.content_top::-webkit-scrollbar-track {
background: transparent;
border-radius: 2px;
}
.content_bottom {
height: 84px;
line-height: 84px;
text-align: right;
padding: 0 20px;
border-top: 1px solid #e6e9ef;
}
.content_process {
border-bottom: 1px solid #e6e9ef;
padding: 38px 16%;
}
.content_main {
flex: 1;
padding: 30px;
box-sizing: border-box;
}
.process_desc {
background-color: #fff;
display: inline-block;
position: absolute;
padding: 0 5px;
font-size: 18px;
color: #202531;
font-weight: bold;
}
.process_desc img {
height: 25px;
width: 25px;
vertical-align: middle;
}
.process_end {
text-align: center;
padding: 50px 0;
}
</style>
<template>
<el-form
:label-position="'right'"
label-width="120px"
:model="systemForm"
:rules="formRules"
ref="systemRef"
style="max-width: 66%"
>
<el-form-item label="所属组织机构" prop="org">
<el-input v-model="systemForm.org" />
</el-form-item>
<el-form-item label="业务系统编码" prop="code">
<el-input v-model="systemForm.code" />
</el-form-item>
<el-form-item label="业务系统名称" prop="name">
<el-input v-model="systemForm.name" />
</el-form-item>
<el-form-item label="业务系统概述" prop="desc">
<el-input type="textarea" :rows="3" v-model="systemForm.desc" />
</el-form-item>
<el-form-item label="系统LOGO" prop="logo">
<bg-upload-image v-model="systemForm.logo" :showTips="true" :limit="1" :fileSize="500" :fileSizeUnit="'KB'" listType="picture-card" :accept="['.jpg','.jpeg','.png']" customTips="请选择图片上传:大小120 * 120像素支持jpg、png等格式,图片需小于500KB"></bg-upload-image>
</el-form-item>
<el-form-item label="角色" prop="role">
<el-input v-model="systemForm.role" />
</el-form-item>
<el-form-item label="账号" prop="account">
<el-input v-model="systemForm.account" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model="systemForm.password" />
</el-form-item>
<el-form-item label="确认密码" prop="confirm_password">
<el-input type="password" v-model="systemForm.confirm_password" />
</el-form-item>
<el-form-item label="访问地址" prop="url">
<el-input v-model="systemForm.url" />
</el-form-item>
<el-form-item label="开发厂商名称" prop="firm_name">
<el-input v-model="systemForm.firm_name" />
</el-form-item>
<el-form-item label="是否启用" prop="is_use">
<bg-switch :labels="['否','是']" :values="[0,1]" v-model="systemForm.is_use"></bg-switch>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, onMounted } from 'vue'
const systemForm = reactive({
org: '',
code: '',
name: '',
desc: '',
logo: '',
role: '',
account: '',
password: '',
confirm_password: '',
url: '',
firm_name: '',
is_use: 1,
})
const validatePass = (rule, value, callback) => {
if (value !== systemForm.password) {
callback(new Error("密码输入不一致"))
} else {
callback()
}
}
const formRules = reactive({
org: [
{ required: true, message: '请选择组织机构', trigger: 'blur' },
],
name: [
{ required: true, message: '请输入业务系统名称', trigger: 'blur' },
],
role: [
{ required: true, message: '请选择角色', trigger: 'blur' },
],
account: [
{ required: true, message: '请输入账号', trigger: 'blur' },
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' },
],
confirm_password: [
{ required: true, message: '请确认密码', trigger: 'blur' },
{ validator: validatePass, trigger: 'blur' }
],
})
const systemRef = ref(null)
const emit = defineEmits(['action'])
const submitForm = async () => {
if (!systemRef) return
await systemRef.value.validate((valid, fields) => {
if (valid) {
emit('action', systemForm)
} else {
emit('action',null)
}
})
}
const clearForm = () => {
if (!systemRef) return
systemRef.value.resetFields()
}
const setForm = (data) => {
systemForm.value = Object.assign(systemForm, data);
}
onMounted(() => {
})
defineExpose({ submitForm, clearForm, setForm })
</script>
\ No newline at end of file
<template>
<div class="detail_container">
账号管理 <el-button @click="addAccount(0)">新建</el-button><el-button @click="addAccount(1)">编辑</el-button>
</div>
</template>
<script >
import { reactive, toRefs, ref, } from '@vue/reactivity'
import { getCurrentInstance } from 'vue'
import { computed, onBeforeMount } from '@vue/runtime-core'
import { useRouter } from 'vue-router';
export default {
components: {
},
setup() {
const router = useRouter();
onBeforeMount(() => {
})
const addAccount = (params) => {
router.push({
path: "/develop/account/add",
query: {
type: params
}
})
}
return {
...toRefs(),
addAccount
}
},
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<div class="detail_container">
菜单管理
</div>
</template>
<script >
import { reactive, toRefs, ref, } from '@vue/reactivity'
import { getCurrentInstance } from 'vue'
import { computed, onBeforeMount } from '@vue/runtime-core'
import { useRouter } from 'vue-router';
export default {
components: {
},
setup() {
onBeforeMount(() => {
})
return {
...toRefs(),
}
},
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<div>
首页
</div>
</template>
<script>
export default {
props: {
},
components: {
},
data() {
return {
};
},
watch: {
},
computed: {
},
created() {
},
mounted() {
},
methods: {
},
};
</script>
<style scoped>
</style>
<template>
<div class="detail_container">
组织管理
</div>
</template>
<script >
import { reactive, toRefs, ref, } from '@vue/reactivity'
import { getCurrentInstance } from 'vue'
import { computed, onBeforeMount } from '@vue/runtime-core'
import { useRouter } from 'vue-router';
export default {
components: {
},
setup() {
onBeforeMount(() => {
})
return {
...toRefs(),
}
},
}
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<div class="detail_container">
角色管理
</div>
</template>
<script >
import { reactive, toRefs, ref, } from '@vue/reactivity'
import { getCurrentInstance } from 'vue'
import { computed, onBeforeMount } from '@vue/runtime-core'
import { useRouter } from 'vue-router';
export default {
components: {
},
setup() {
onBeforeMount(() => {
})
return {
...toRefs(),
}
},
}
</script>s
<style lang="scss" scoped>
</style>
\ No newline at end of file
<template>
<router-view></router-view>
</template>
\ No newline at end of file
<template>
<div style="width:100%;height:calc(100% - 10px);background-color:#fff;text-align:center;">
<img src="../assets/imgs/welcom.png" alt="" style="margin-top:150px;">
<p style="font-size:18px;">欢迎进入BD-Apaas5系统~</p>
</div>
</template>
<script>
export default {
created(){
setTimeout(()=>{
this.$router.push('/ability-register/step1')
},1000)
}
}
</script>
<style scoped>
</style>
\ No newline at end of file
/**
* axios封装
* 请求拦截、响应拦截、错误统一处理
*/
import axios from 'axios';
import router from '../router/index';
import store from '../store/index';
function getCookie(name) {
var strCookie = document.cookie;
var arrCookie = strCookie.split("; ");
for (var i = 0; i < arrCookie.length; i++) {
var arr = arrCookie[i].split("=");
if (arr[0] == name) return arr[1];
}
return "";
}
const tip = msg => {
console.log(msg)
}
/**
* 跳转登录页
* 携带当前页面路由,以期在登录页面完成登录后返回当前页面
*/
const toLogin = () => {
router.replace({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
});
}
/**
* 请求失败后的错误统一处理
* @param {Number} status 请求失败的状态码
*/
const errorHandle = (status, other) => {
// 状态码判断
switch (status) {
case 400: tip('请求错误(400)'); break;
// 401: 未登录状态,跳转登录页
case 401:
toLogin();
break;
// 403 token过期
// 清除token并跳转登录页
case 403:
tip('登录过期,请重新登录');
localStorage.removeItem('token');
store.commit('loginSuccess', null);
setTimeout(() => {
// toLogin();
}, 1000);
break;
case 404: tip('请求的资源不存在'); break;
case 408: tip('请求超时(408)');
case 500: tip('服务器错误(500)');
case 501: tip('服务未实现(501)');
case 502: tip('网络错误(502)');
case 503: tip('服务不可用(503)');
case 504: tip('网络超时(504)');
case 505: tip('HTTP版本不受支持(505)');
default: tip(`连接出错,${other}`);
}
}
// 创建axios实例
var instance = axios.create({ timeout: 1000 * 12 });
// 设置post请求头
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
/**
* 请求拦截器
* 每次请求前,如果存在token则在请求头中携带token
*/
instance.interceptors.request.use(
config => {
// const token = store.state.token;
// var token = 'Basic cm9vdA%3D%3D'
// token && (config.headers.Authorization = token);
// const token = store.state.token;
// var token = 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZXh0IjoibGltaW5nZSIsInR5cGUiOiJ1c2VyIn0.YUPQ-3nttgfRGOUV4T06JZ6osH46nZ0UUolYdEBhvSQ'
// token && (config.headers.Authorization = token);
// if(config.headers.Authorization!="headers"){
// const token = process.env.DRONE_TOKEN ? process.env.DRONE_TOKEN : Conf.token;
// var Authorization = `Bearer ${token}`
// token && (config.headers.Authorization = Authorization);
// }else{
// config.headers.Authorization = '';
// }
return config;
},
error => Promise.error(error))
// 响应拦截器
instance.interceptors.response.use(
// 请求成功
res => res.status === 200|| res.status === 201? Promise.resolve(res) : Promise.reject(res),
// 请求失败
error => {
const { response } = error;
if (response) {
// 请求已发出,但是不在2xx的范围
errorHandle(response.status, response.data.errmessage);
return Promise.reject(response);
}
});
export default instance;
var adminMenu = [
{
menuName: "工作台",
path: "/workspace",
parentPath:null,
name:"workspace",
menuType:'system', //system:apaas后管,能力注册页等 font:apaas前台页 manager:apaas管理中心
show:true,
level:1,
children:[{
menuName: "能力管理",
path: "/ability-manage",
show:true,
menuType:'system',
icon: "#bg-ic-ability",
parentPath:'/workspace',
children:[
{
name: "ui-service-test",
menuName: "ui服务测试",
path: "/ui-example",
menuType:'system',
parentPath:null,
},
{
name: "register-valid",
menuName: "注册认证",
path: "/register-valid",
menuType:'system',
parentPath:null,
},
{
name: "ability-register-step",
menuName:'能力注册',
path: "/ability-register/step",
parentPath:'/ability-manage',
menuType:'system',
},
{
name: "ability-register-desc",
menuName:'服务注册说明',
path: "/ability-register/desc",
linkPath:["/ability-register/desc"],
parentPath:'/ability-manage',
menuType:'system',
},
{
name: "ability-register-preview",
menuName:'服务注册说明',
path: "/ability-register/preview",
linkPath:["/ability-register/preview"],
parentPath:'/ability-manage',
menuType:'system',
},
{
name: "ability-register-set-mock",
menuName:'配置mock服务',
path: "/ability-register/set-mock",
parentPath:'/ability-manage',
menuType:'system',
},
{
name: "real-list",
menuName:'能力注册',
path: "/ability-manage/real-list",
parentPath:'/ability-manage',
linkPath:["/ability-register/step","/ability-register/set-mock"],
menuType:'system',
show:true,
},
{
name: "real-detail",
menuName:'能力注册详情',
path: "/ability-manage/real-list/detail",
parentPath:'/ability-manage',
menuType:'system',
},
{
name: "mock-list",
menuName:'mock能力',
path: "/ability-manage/mock-list",
parentPath:'/ability-manage',
linkPath:["/mock-register/step"],
show:true,
menuType:'system',
},
{
path:"/mock-register/step",
parentPath:'/ability-manage',
name:"mock-register-step",
menuName:"mock注册",
menuType:'system',
},
{
name: "mock-detail",
menuName:'mock能力详情',
path: "/ability-manage/mock-list/detail",
parentPath:'/ability-manage',
menuType:'system',
},
{
name: "sold-list",
menuName:'能力上下架管理',
path: "/ability-manage/sold-list",
parentPath:'/ability-manage',
linkPath:["/ability-manage/sold-list/service-test"],
show: true,
menuType:'system',
},
{
name: "service-test",
menuName:'服务测试',
path: "/ability-manage/sold-list/service-test",
parentPath:'/ability-manage',
menuType:'system',
},
]
},
{
name: "dict-config",
menuName:'字典配置',
path: "/dict-config",
parentPath:'/workspace',
menuType:'system',
icon: "#bg-ic-log",
show:true,
children: [
{
name: "business-list",
menuName:'业务分类',
path: "/dict-config/business-list",
parentPath:'/dict-config',
menuType:'system',
show:true,
},
{
name: "sectors-list",
menuName:'业务领域',
path: "/dict-config/sectors-list",
parentPath:'/dict-config',
menuType:'system',
show:true,
},
{
name: "openness-list",
menuName:'开放程度',
path: "/dict-config/openness-list",
parentPath:'/dict-config',
menuType:'system',
show:true,
}
]
}
]
},
{
menuName: "管理中心",
path: "/system",
name:"system",
parentPath:null,
menuType:'manager',
show: true,
level:1,
children:[{
menuName: "开发管理",
path: "/develop",
parentPath:null,
menuType:'manager',
show:true,
icon: "#bg-ic-ability",
children:[
{
name: "account-manage",
menuName:'系统账号管理',
parentPath:null,
menuType:'manager',
show:true,
path: "/develop/account",
linkPath: ["/develop/account/add"]
},
{
name: "account-add-manage",
menuName:'新建账号',
parentPath:null,
menuType:'manager',
path: "/develop/account/add",
},
{
name: "menu-manage",
menuName:'菜单管理',
parentPath:null,
menuType:'manager',
show:true,
path: "/develop/menu",
},
]
},
{
menuName: "系统管理",
path: "/system",
parentPath:null,
menuType:'manager',
show:true,
icon: "#bg-ic-ability",
children:[
{
name: "system-manage",
menuName:'组织管理',
parentPath:null,
menuType:'manager',
show:true,
path: "/system/organization",
},
{
name: "role-manage",
menuName:'角色管理',
parentPath:null,
menuType:'manager',
show:true,
path: "/system/role",
},
]
},
{
menuName: "配置管理",
path: "/config",
parentPath:null,
menuType:'manager',
show:true,
icon: "#bg-ic-ability",
children:[
{
name: "dict-manage",
menuName:'字典管理',
parentPath:null,
menuType:'manager',
show:true,
path: "/config/dict",
},
]
},
]
},
{
name:"index",
menuName:"首页",
path: "/",
parentPath:null,
menuType:'font',
level:1,
show:true,
},
]
function getViews(path) {
// 首先把你需要动态路由的组件地址全部获取,示例项目主项目放入了main,如果直接放入page,需要去掉/main
let pathArr = path.split('/')
let modules = {}
switch (pathArr.length) {
case 2:
modules = import.meta.glob('../page/main/**/*.vue')
break;
case 3:
modules = import.meta.glob('../page/main/**/*/*.vue')
break;
case 4:
modules = import.meta.glob('../page/main/**/**/*/*.vue')
break;
case 5:
modules = import.meta.glob('../page/main/**/**/**/*/*.vue')
break;
default:
break;
}
// 然后动态路由的时候这样来取
console.log(modules['../page/main' + path + '/index.vue']);
return modules['../page/main' + path + '/index.vue']
}
//处理路由方法
var menuToRouter = (menu)=>{
menu.forEach(e => {
//第一层级是最上层菜单,有相应的菜单可以点击查看
if(e.children&&e.level==1){
console.log(`@/page/main${e.path}/index.vue`);
e.component= getViews(e.path)
menuToRouter(e.children)
}else if(e.children){
// 其他层级作为文件夹,只提供父级
e.component = () => import('../page/parent/parent.vue')
menuToRouter(e.children)
}else{
console.log(`@/page/main${e.path}/index.vue`);
//叶子层级需要加载到对应文件
//对首页做兼容
if(e.path=='/'){
e.component = () => import('../page/main/index/index.vue')
}else{
e.component= getViews(e.path)
}
}
});
}
export default {
adminMenu,
menuToRouter
}
\ No newline at end of file
//路由前端原则可以不写,但是需要在recorder中记录,防止以后忘记
//不用新建父路由的文件,父路由全部由parent/parent.vue来支撑
import {createRouter, createWebHashHistory} from "vue-router";
import store from '../store'
//写入初始必须有的路由
//或者隐藏式路由,不会表现在菜单上,但是需要存在的路由
const routes = [
{
path: '/login',
name: 'login',
show:true,
component: () => import('../page/login/index.vue')
},
{
path: '/',
name: 'index',
component: () => import('../page/welcom.vue'),
},
{
path: '/404',
show:true,
component: () => import('../page/404.vue')
},
]
//重新创建router
function newRouterFunc(){
return createRouter({
history: createWebHashHistory(),
routes
});
}
const router = newRouterFunc()
function inWhiteList(toPath) {
//配置白名单
const whiteList = ['/login']
const path = whiteList.find((value) => {
// 使用正则匹配
const reg = new RegExp('^' + value)
return reg.test(toPath)
})
return !!path
}
router.beforeEach((to, from, next) => {
const userInfo = store.state.userInfo
//已登录不可跳转登陆页
if(userInfo&&to.path=='/login'){
next({path:from.path})
}
// 检查to.path是否存在于免登陆白名单
if (inWhiteList(to.path)) {
next()
} else {
// 判断是否已经登录,未登录则重定向到首页或其他页面(通过query传参记录原来的路径)
// 根据配置判断是否跳转第三方登录,跳转第三方登录则不跳login
// axios封装中也需要对是否登录过期进行判断,如果登录过期,则跳转登录页,具体跳转地址根据配置来·
if (!userInfo) {
next({
path: '/login',
})
} else {
}
}
//判读是否匹配,否则跳转404
if (to.matched.length !== 0) {
next()
} else {
return next({ path: '/404' })
}
})
// 在路由完成初始导航时调用,如果有异步操作放置到这里
// 请求相应的角色和菜单
// router.onReady(() => {
// generateRoutes()
// })
function addRoute(router,routers){
routers.forEach(e => {
router.addRoute(e)
if(e.children&&e.children.length){
addRoute(router,e.children)
}
});
}
export function generateRoutes() {
const _asyncRoutes = store.state.route
if (_asyncRoutes) {
//动态添加路由
addRoute(router,_asyncRoutes)
}
router.addRoute(
{
path: '/:pathMatch(.*)',
redirect: '/404'
}
)
console.log(router.getRoutes());
}
//新创建一个router替代之前的router,并把matcher方法替换成新的router的matcher
export function resetRouter() {
const newRouter = newRouterFunc()
router.matcher = newRouter.matcher
}
export default router
//作为路由的记录,避免无法找到相应的路由
var router = [
];
// 取得cookie
function getCookie(name) {
var nameEQ = name + '='
var ca = document.cookie.split(';') // 把cookie分割成组
for (var i = 0; i < ca.length; i++) {
var c = ca[i] // 取得字符串
while (c.charAt(0) == ' ') { // 判断一下字符串有没有前导空格
c = c.substring(1, c.length) // 有的话,从第二位开始取
}
if (c.indexOf(nameEQ) == 0) { // 如果含有我们要的name
return unescape(c.substring(nameEQ.length, c.length)) // 解码并截取我们要值
}
}
return false
}
// 清除cookie
function clearCookie(name) {
setCookie(name, "", -1);
}
// 设置cookie
function setCookie(name, value, seconds) {
seconds = seconds || 0; //seconds有值就直接赋值,没有为0,这个根php不一样。
var expires = "";
if (seconds != 0 ) { //设置cookie生存时间
var date = new Date();
date.setTime(date.getTime()+(seconds*1000));
expires = "; expires="+date.toGMTString();
}
document.cookie = name+"="+escape(value)+expires+"; path=/"; //转码并赋值
}
export {
getCookie,
clearCookie,
setCookie,
}
import router from '@/router'
var GetProperty = function (obj, prop) {
if (!obj) return null;
let res = obj;
if (prop) {
let props = prop.split('.');
for (let i = 0; i < props.length; i++) {
res = res[props[i]];
if (typeof res == "undefined" || res == null) {
return null;
}
}
}
return res;
}
var dateFormat = function (fmt, timestamp) {
let date = new Date(timestamp);
let ret;
const opt = {
"Y+": date.getFullYear().toString(), // 年
"m+": (date.getMonth() + 1).toString(), // 月
"d+": date.getDate().toString(), // 日
"H+": date.getHours().toString(), // 时
"M+": date.getMinutes().toString(), // 分
"S+": date.getSeconds().toString() // 秒
// 有其他格式化字符需求可以继续添加,必须转化成字符串
};
for (let k in opt) {
ret = new RegExp("(" + k + ")").exec(fmt);
if (ret) {
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
};
};
return fmt;
}
var dateStringTransform = function (date) {
/*
input: 2020-06-12T16:38:11+08:00
output: 2020-06-12 16:38:11
*/
if (String(date).indexOf("T") != -1) {
let arr = date.split("T");
let t = arr[1];
let tarr = t.split('.000');
let marr = tarr[0].split(':');
let h = parseInt(marr[0]) >= 10 ? parseInt(marr[0]) : "0" + parseInt(marr[0]);
let m = parseInt(marr[1]) >= 10 ? parseInt(marr[1]) : "0" + parseInt(marr[1]);
let s = parseInt(marr[2]) >= 10 ? parseInt(marr[2]) : "0" + parseInt(marr[2]);
let dd = arr[0] + " " + h + ":" + m + ":" + s;
return dd;
} else {
return date;
}
}
var dateStringTransformChat = function (date) {
/*
input: 2020-06-12T16:38:11+08:00
output: 2020-06-12 16:38:11
*/
if (String(date).indexOf("T") != -1) {
let arr = date.split("T");
let t = arr[1];
let arr1 = arr[0].split("-")
let tarr = t.split('.000');
let marr = tarr[0].split(':');
let h = parseInt(marr[0]) >= 10 ? parseInt(marr[0]) : "0" + parseInt(marr[0]);
let m = parseInt(marr[1]) >= 10 ? parseInt(marr[1]) : "0" + parseInt(marr[1]);
let s = parseInt(marr[2]) >= 10 ? parseInt(marr[2]) : "0" + parseInt(marr[2]);
let dd = arr1[1]+"-"+arr1[2] + " " + h + ":" + m;
return dd;
} else if(date){
let arr = date.split(" ");
let t = arr[1];
let arr1 = arr[0].split("-")
let tarr = t.split('.000');
let marr = tarr[0].split(':');
let h = parseInt(marr[0]) >= 10 ? parseInt(marr[0]) : "0" + parseInt(marr[0]);
let m = parseInt(marr[1]) >= 10 ? parseInt(marr[1]) : "0" + parseInt(marr[1]);
let s = parseInt(marr[2]) >= 10 ? parseInt(marr[2]) : "0" + parseInt(marr[2]);
let dd = arr1[1]+"-"+arr1[2] + " " + h + ":" + m;
return dd;
}
}
var downloadFileFormat = function (fileUrl) {
/*
input: /apaas/static/docs/image/images/1234.png
output: 1234.png
*/
if (fileUrl != "") {
return fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
} else {
return "";
}
}
var downloadFileFormatNew = function (fileUrl) {
/*
input: /apaas/static/docs/image/images/1234_qq234ewr123.png
output: 1234.png
*/
if (fileUrl != "") {
var temp = fileUrl.split('/')[fileUrl.split('/').length-1]
var name = temp.split('_')[0]
var type = temp.split('_')[temp.split('_').length-1].split('.')[1]
if(temp.indexOf('_')==-1){
return name
}else{
return name+'.'+type
}
} else {
return "";
}
}
var numberFormat = function (num, decimals) {
/*
input: 10000 1000
output: 10 1000
*/
if (num > 10000) {
let mathNum = num / 10000;
let arr = mathNum.toString().split(".");
let str = "";
if (arr.length == 2) {
str += arr[0] + ".";
if (arr[1].length == 1) {
arr[1] = arr[1].toString() + "0";
str += arr[1];
} else {
str += arr[1].substr(0, 2)
}
} else {
return mathNum;
}
return str;
} else {
return num;
}
}
var CreationDateDesc = function (timestamp) {
let date = new Date(timestamp);
return date.toLocaleDateString("zh-CN", {
timeZone: "Asia/Shanghai"
});
}
var join_str = function (arr,str,sp) {
let temp = ''
if(arr){
if(arr.length){
arr.forEach((e,idx) => {
if(idx==arr.length-1){
temp = temp + e[str]
}else{
temp = temp + e[str] + sp
}
});
return temp
}else{
return ''
}
}else{
return arr
}
}
var getQueryString = function (name, url) {
let search = url.substr(url.indexOf("?"));
let theRequest = new Object();
if (search.indexOf("?") != -1) {
let str = search.substr(1);
strs = str.split("&");
for (let i = 0; i < strs.length; i++) {
theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
}
}
return theRequest[name];
}
var timeForMatReduce = function(count) {
// 拼接时间
let time1 = new Date()
time1.setTime(time1.getTime() - (24 * 60 * 60 * 1000))
let Y1 = time1.getFullYear()
let M1 = ((time1.getMonth() + 1) >= 10 ? (time1.getMonth() + 1) : '0' + (time1.getMonth() + 1))
let D1 = (time1.getDate() >= 10 ? time1.getDate() : '0' + time1.getDate())
let timer1 = Y1 + '-' + M1 + '-' + D1 // 当前时间
let time2 = new Date()
time2.setTime(time2.getTime() - (24 * 60 * 60 * 1000 * count))
let Y2 = time2.getFullYear()
let M2 = ((time2.getMonth() + 1) >= 10 ? (time2.getMonth() + 1) : '0' + (time2.getMonth() + 1))
let D2 = (time2.getDate() >= 10 ? time2.getDate() : '0' + time2.getDate())
let timer2 = Y2 + '-' + M2 + '-' + D2 // 之前的7天或者30天
return {
t1: timer1,
t2: timer2
}
}
var timeForMatAdd = function(count) {
// 拼接时间
let time1 = new Date()
time1.setTime(time1.getTime() - (24 * 60 * 60 * 1000))
let Y1 = time1.getFullYear()
let M1 = ((time1.getMonth() + 1) >= 10 ? (time1.getMonth() + 1) : '0' + (time1.getMonth() + 1))
let D1 = (time1.getDate() >= 10 ? time1.getDate() : '0' + time1.getDate())
let timer1 = Y1 + '-' + M1 + '-' + D1 // 当前时间
let time2 = new Date()
time2.setTime(time2.getTime() + (24 * 60 * 60 * 1000 * count))
let Y2 = time2.getFullYear()
let M2 = ((time2.getMonth() + 1) >= 10 ? (time2.getMonth() + 1) : '0' + (time2.getMonth() + 1))
let D2 = (time2.getDate() >= 10 ? time2.getDate() : '0' + time2.getDate())
let timer2 = Y2 + '-' + M2 + '-' + D2 // 之前的7天或者30天
return {
t1: timer1,
t2: timer2
}
}
var useConsole = function(){
//改写console.log,防止打印数据泄露
window.isDebug = false; // 控制是否屏蔽全局console.log 日志;isDebug设为false即可屏蔽
//前面做一道筛选,满足则正常打印
//不满足则改写console.log,可以通过window.isDebug改变打印状态
//方便线上环境进行查看
if (window.isDebug||process.env.NODE_ENV === 'development') {
return
}
console.log = (function (oldLogFunc) {
return function () {
if (window.isDebug||process.env.NODE_ENV === 'development') {
oldLogFunc.apply(this, arguments);
}
}
})(console.log);
}
var getFirstChild = function(menuObj,path){
let parentPath = menuObj[path].parentPath
if(parentPath){
let temp = menuObj[parentPath].children||[]
for (let index = 0; index < temp.length; index++) {
const e = temp[index];
if(e.show){
pathToUrl(e.path)
break
}
}
}
}
var pathToUrl = (path)=>{
if(path.includes('http')){
window.open(path,'_blank')
}else{
router.push(path);
}
}
export {
GetProperty,
dateFormat,
dateStringTransform,
dateStringTransformChat,
downloadFileFormat,
downloadFileFormatNew,
numberFormat,
CreationDateDesc,
join_str,
getQueryString,
timeForMatReduce,
timeForMatAdd,
useConsole,
getFirstChild,
}
module.exports = {
"event": "/sjgl/api/events",
};
\ No newline at end of file
// 取得cookie
function getCookie(name) {
var nameEQ = name + '='
var ca = document.cookie.split(';') // 把cookie分割成组
for (var i = 0; i < ca.length; i++) {
var c = ca[i] // 取得字符串
while (c.charAt(0) == ' ') { // 判断一下字符串有没有前导空格
c = c.substring(1, c.length) // 有的话,从第二位开始取
}
if (c.indexOf(nameEQ) == 0) { // 如果含有我们要的name
return unescape(c.substring(nameEQ.length, c.length)) // 解码并截取我们要值
}
}
return false
}
// 清除cookie
function clearCookie(name) {
setCookie(name, "", -1);
}
// 设置cookie
function setCookie(name, value, seconds) {
seconds = seconds || 0; //seconds有值就直接赋值,没有为0,这个根php不一样。
var expires = "";
if (seconds != 0 ) { //设置cookie生存时间
var date = new Date();
date.setTime(date.getTime()+(seconds*1000));
expires = "; expires="+date.toGMTString();
}
document.cookie = name+"="+escape(value)+expires+"; path=/"; //转码并赋值
}
export {
getCookie,
clearCookie,
setCookie,
}
// 密码
export function validatePassword(rule, value, callback) {
const reg = new RegExp(/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]{8,20}$/);
setTimeout(() => {
if (value == "") {
callback(new Error("请输入密码"));
} else if (!reg.test(value)) {
callback(new Error("8--20位字符,必须由字母、数字、特殊符号组成"));
} else {
callback();
}
}, 100);
}
// 手机号
export function validatePhone(rule, value, callback) {
const reg = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/;
setTimeout(() => {
if (value == "") {
callback(new Error("请输入手机号码"));
} else if (!reg.test(value)) {
callback(new Error("请输入正确的手机号码"));
} else {
callback();
}
});
}
// 邮箱
export function validateEmail(rule, value, callback) {
const reg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[-|_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
setTimeout(() => {
if (value == "") {
callback(new Error("请输入邮箱"));
} else if (!reg.test(value)) {
callback(new Error("请输入正确的邮箱"));
} else {
callback();
}
});
}
// 邮箱
export function validateIdNumber(rule, value, callback) {
const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
setTimeout(() => {
if (reg.test(value)) {
callback();
} else {
callback(new Error("请输入正确身份证号码"));
}
}, 100);
} // 验证身份证号码
const CryptoJS = require('crypto-js');
const key = "swuE9cmCZQwrkYRV";
function Decrypt(word) {
let decrypt = CryptoJS.AES.decrypt(word, key);
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
function Encrypt(word) {
let encrypted = CryptoJS.AES.encrypt(word, key);
return encrypted.toString();
}
export {Decrypt , Encrypt}
\ No newline at end of file
import {createStore} from 'vuex'
const store = createStore({
state: {
userInfo:null,
menu:null,
route:null,
nameFlag:false,
msgBoxFlag:false,
nowzz:null,
menuObj:{},
treeFlag:false,
registerValid:false,
},
getters: {
count(state) {
return state.userInfo
}
},
mutations: {
setUserInfo(state, info) {
state.userInfo = info
},
setMenu(state,menu){
state.menu = menu
},
setMenuObj(state,menuObj){
state.menuObj = menuObj
},
setRoute(state,route){
state.route = route
},
setNameFlag(state,nameFlag){
state.nameFlag = nameFlag
},
setMsgBoxFlag(state,msgBoxFlag){
state.msgBoxFlag = msgBoxFlag
},
setNowzz(state,nowzz){
state.nowzz = nowzz
},
setTreeFlag(state,treeFlag){
state.treeFlag = treeFlag
},
setRegisterValid(state,registerValid){
state.registerValid = registerValid
}
},
actions: {}
});
export default store;
# git submodule update --init --recursive && cd apaas-style && git pull origin master && cd ../ && cp -r ./apaas-style/base.css ./src/assets/css/ && rm -fr apaas-style
git clone https://cloud.wodcloud.com/git/apaas/apaas-portal-ui.git && cp -r ./apaas-portal-ui/src/assets/item.css ./src/assets/ && rm -fr apaas-portal-ui
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
const path = require('path')
console.log(__dirname);
function resolve_path (dir) {
return path.join(__dirname, './', dir)
}
export default {
plugins: [
vue()
],
//本地运行基础路径,如:http://localhost:5173/apaas/ui/
base: "/apaas/system/ui/",
clearScreen:false,
resolve:{
//别名,代码引入时方便引入
alias:{
'@':resolve_path('src'),
}
},
css:{
devSourcemap:true,//代码编排,调试时是否能看到源码
},
server:{
host:'0.0.0.0',//host配置,0.0.0.0会添加本地ip,开启局域网访问路径
hmr:true,//热更新
proxy: {
// 选项写法
'/msg/system':{
target: 'https://apaas5.wodcloud.com/msg/system', // 所要代理的目标地址
rewrite: path => path.replace(/^\/msg\/system/, ''), // 重写传过来的path路径,比如 `/api/index/1?id=10&name=zs`(注意:path路径最前面有斜杠(/),因此,正则匹配的时候不要忘了是斜杠(/)开头的;选项的 key 也是斜杠(/)开头的)
changeOrigin: true, // true/false, Default: false - changes the origin of the host header to the target URL
secure: false,//解决证书缺失问题
}
}
},
build:{
outDir:'dist/apaas/system/ui',//打包输出文件夹
assetsDir:'static',//打包输出静态文件
},
}
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/parser@^7.16.4":
version "7.18.9"
resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.9.tgz"
integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==
"@babel/runtime@^7.12.0":
version "7.18.9"
resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a"
integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==
dependencies:
regenerator-runtime "^0.13.4"
"@ctrl/tinycolor@^3.4.1":
version "3.4.1"
resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz"
integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==
"@element-plus/icons-vue@^2.0.6":
version "2.0.6"
resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.0.6.tgz"
integrity sha512-lPpG8hYkjL/Z97DH5Ei6w6o22Z4YdNglWCNYOPcB33JCF2A4wye6HFgSI7hEt9zdLyxlSpiqtgf9XcYU+m5mew==
"@floating-ui/core@^0.7.3":
version "0.7.3"
resolved "https://registry.npmmirror.com/@floating-ui/core/-/core-0.7.3.tgz"
integrity sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==
"@floating-ui/dom@^0.5.4":
version "0.5.4"
resolved "https://registry.npmmirror.com/@floating-ui/dom/-/dom-0.5.4.tgz"
integrity sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg==
dependencies:
"@floating-ui/core" "^0.7.3"
"@intlify/core-base@9.1.10":
version "9.1.10"
resolved "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.1.10.tgz"
integrity sha512-So9CNUavB/IsZ+zBmk2Cv6McQp6vc2wbGi1S0XQmJ8Vz+UFcNn9MFXAe9gY67PreIHrbLsLxDD0cwo1qsxM1Nw==
dependencies:
"@intlify/devtools-if" "9.1.10"
"@intlify/message-compiler" "9.1.10"
"@intlify/message-resolver" "9.1.10"
"@intlify/runtime" "9.1.10"
"@intlify/shared" "9.1.10"
"@intlify/vue-devtools" "9.1.10"
"@intlify/devtools-if@9.1.10":
version "9.1.10"
resolved "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.1.10.tgz"
integrity sha512-SHaKoYu6sog3+Q8js1y3oXLywuogbH1sKuc7NSYkN3GElvXSBaMoCzW+we0ZSFqj/6c7vTNLg9nQ6rxhKqYwnQ==
dependencies:
"@intlify/shared" "9.1.10"
"@intlify/message-compiler@9.1.10":
version "9.1.10"
resolved "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.1.10.tgz"
integrity sha512-+JiJpXff/XTb0EadYwdxOyRTB0hXNd4n1HaJ/a4yuV960uRmPXaklJsedW0LNdcptd/hYUZtCkI7Lc9J5C1gxg==
dependencies:
"@intlify/message-resolver" "9.1.10"
"@intlify/shared" "9.1.10"
source-map "0.6.1"
"@intlify/message-resolver@9.1.10":
version "9.1.10"
resolved "https://registry.npmmirror.com/@intlify/message-resolver/-/message-resolver-9.1.10.tgz"
integrity sha512-5YixMG/M05m0cn9+gOzd4EZQTFRUu8RGhzxJbR1DWN21x/Z3bJ8QpDYj6hC4FwBj5uKsRfKpJQ3Xqg98KWoA+w==
"@intlify/runtime@9.1.10":
version "9.1.10"
resolved "https://registry.npmmirror.com/@intlify/runtime/-/runtime-9.1.10.tgz"
integrity sha512-7QsuByNzpe3Gfmhwq6hzgXcMPpxz8Zxb/XFI6s9lQdPLPe5Lgw4U1ovRPZTOs6Y2hwitR3j/HD8BJNGWpJnOFA==
dependencies:
"@intlify/message-compiler" "9.1.10"
"@intlify/message-resolver" "9.1.10"
"@intlify/shared" "9.1.10"
"@intlify/shared@9.1.10":
version "9.1.10"
resolved "https://registry.npmmirror.com/@intlify/shared/-/shared-9.1.10.tgz"
integrity sha512-Om54xJeo1Vw+K1+wHYyXngE8cAbrxZHpWjYzMR9wCkqbhGtRV5VLhVc214Ze2YatPrWlS2WSMOWXR8JktX/IgA==
"@intlify/vue-devtools@9.1.10":
version "9.1.10"
resolved "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.1.10.tgz"
integrity sha512-5l3qYARVbkWAkagLu1XbDUWRJSL8br1Dj60wgMaKB0+HswVsrR6LloYZTg7ozyvM621V6+zsmwzbQxbVQyrytQ==
dependencies:
"@intlify/message-resolver" "9.1.10"
"@intlify/runtime" "9.1.10"
"@intlify/shared" "9.1.10"
"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7":
version "2.11.7"
resolved "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz"
integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==
"@transloadit/prettier-bytes@0.0.7":
version "0.0.7"
resolved "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz#cdb5399f445fdd606ed833872fa0cabdbc51686b"
integrity sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==
"@types/event-emitter@^0.3.3":
version "0.3.3"
resolved "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.3.tgz#727032a9fc67565f96bbd78b2e2809275c97d7e7"
integrity sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==
"@types/lodash-es@^4.17.6":
version "4.17.6"
resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz"
integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==
dependencies:
"@types/lodash" "*"
"@types/lodash@*", "@types/lodash@^4.14.182":
version "4.14.182"
resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.182.tgz"
integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==
"@types/web-bluetooth@^0.0.14":
version "0.0.14"
resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz"
integrity sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==
"@uppy/companion-client@^2.2.2":
version "2.2.2"
resolved "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz#c70b42fdcca728ef88b3eebf7ee3e2fa04b4923b"
integrity sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==
dependencies:
"@uppy/utils" "^4.1.2"
namespace-emitter "^2.0.1"
"@uppy/core@^2.1.1":
version "2.3.3"
resolved "https://registry.npmmirror.com/@uppy/core/-/core-2.3.3.tgz#c2dc50a9a3dce6d565490780b2fc35b32367e047"
integrity sha512-oTFYZT02dIoUGm8Ar6+Tg/xbL8MliwiPQdiuoCimPBmY19ZhuJm/K4wEYZ6nOFeYsgBWYi1yWfsmdx8LvFVx4g==
dependencies:
"@transloadit/prettier-bytes" "0.0.7"
"@uppy/store-default" "^2.1.1"
"@uppy/utils" "^4.1.2"
lodash.throttle "^4.1.1"
mime-match "^1.0.2"
namespace-emitter "^2.0.1"
nanoid "^3.1.25"
preact "^10.5.13"
"@uppy/store-default@^2.1.1":
version "2.1.1"
resolved "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz#62a656a099bdaa012306e054d093754cb2d36e3e"
integrity sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==
"@uppy/utils@^4.1.2":
version "4.1.2"
resolved "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.2.tgz#7b7bec41625764b563e9635f09e81e6907bb640f"
integrity sha512-rl9aKRE4o2mRKVAhYHHf8uV7BoUOQkvDH6yOaJ4tuHJ6HgPkvxVxqUY8L+yKV1hx4mw6OF9hLIzpW/+TLSfyfQ==
dependencies:
lodash.throttle "^4.1.1"
"@uppy/xhr-upload@^2.0.3":
version "2.1.3"
resolved "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz#0d4e355332fe0c6eb372d7731315e04d02aeeb18"
integrity sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==
dependencies:
"@uppy/companion-client" "^2.2.2"
"@uppy/utils" "^4.1.2"
nanoid "^3.1.25"
"@vitejs/plugin-vue@^3.0.0":
version "3.0.1"
resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.0.1.tgz"
integrity sha512-Ll9JgxG7ONIz/XZv3dssfoMUDu9qAnlJ+km+pBA0teYSXzwPCIzS/e1bmwNYl5dcQGs677D21amgfYAnzMl17A==
"@vue/compiler-core@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.37.tgz"
integrity sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/shared" "3.2.37"
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-core@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.38.tgz#0a2a7bffd2280ac19a96baf5301838a2cf1964d7"
integrity sha512-/FsvnSu7Z+lkd/8KXMa4yYNUiqQrI22135gfsQYVGuh5tqEgOB0XqrUdb/KnCLa5+TmQLPwvyUnKMyCpu+SX3Q==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/shared" "3.2.38"
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-dom@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz"
integrity sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==
dependencies:
"@vue/compiler-core" "3.2.37"
"@vue/shared" "3.2.37"
"@vue/compiler-dom@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.38.tgz#53d04ed0c0c62d1ef259bf82f9b28100a880b6fd"
integrity sha512-zqX4FgUbw56kzHlgYuEEJR8mefFiiyR3u96498+zWPsLeh1WKvgIReoNE+U7gG8bCUdvsrJ0JRmev0Ky6n2O0g==
dependencies:
"@vue/compiler-core" "3.2.38"
"@vue/shared" "3.2.38"
"@vue/compiler-sfc@3.2.37", "@vue/compiler-sfc@^3.2.31":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz"
integrity sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.37"
"@vue/compiler-dom" "3.2.37"
"@vue/compiler-ssr" "3.2.37"
"@vue/reactivity-transform" "3.2.37"
"@vue/shared" "3.2.37"
estree-walker "^2.0.2"
magic-string "^0.25.7"
postcss "^8.1.10"
source-map "^0.6.1"
"@vue/compiler-sfc@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.38.tgz#9e763019471a535eb1fceeaac9d4d18a83f0940f"
integrity sha512-KZjrW32KloMYtTcHAFuw3CqsyWc5X6seb8KbkANSWt3Cz9p2qA8c1GJpSkksFP9ABb6an0FLCFl46ZFXx3kKpg==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.38"
"@vue/compiler-dom" "3.2.38"
"@vue/compiler-ssr" "3.2.38"
"@vue/reactivity-transform" "3.2.38"
"@vue/shared" "3.2.38"
estree-walker "^2.0.2"
magic-string "^0.25.7"
postcss "^8.1.10"
source-map "^0.6.1"
"@vue/compiler-ssr@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz"
integrity sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==
dependencies:
"@vue/compiler-dom" "3.2.37"
"@vue/shared" "3.2.37"
"@vue/compiler-ssr@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.38.tgz#933b23bf99e667e5078eefc6ba94cb95fd765dfe"
integrity sha512-bm9jOeyv1H3UskNm4S6IfueKjUNFmi2kRweFIGnqaGkkRePjwEcfCVqyS3roe7HvF4ugsEkhf4+kIvDhip6XzQ==
dependencies:
"@vue/compiler-dom" "3.2.38"
"@vue/shared" "3.2.38"
"@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.0.0-beta.7", "@vue/devtools-api@^6.1.4":
version "6.2.1"
resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz"
integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
"@vue/reactivity-transform@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz"
integrity sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.37"
"@vue/shared" "3.2.37"
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@vue/reactivity-transform@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.38.tgz#a856c217b2ead99eefb6fddb1d61119b2cb67984"
integrity sha512-3SD3Jmi1yXrDwiNJqQ6fs1x61WsDLqVk4NyKVz78mkaIRh6d3IqtRnptgRfXn+Fzf+m6B1KxBYWq1APj6h4qeA==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/compiler-core" "3.2.38"
"@vue/shared" "3.2.38"
estree-walker "^2.0.2"
magic-string "^0.25.7"
"@vue/reactivity@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.37.tgz"
integrity sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==
dependencies:
"@vue/shared" "3.2.37"
"@vue/reactivity@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.38.tgz#d576fdcea98eefb96a1f1ad456e289263e87292e"
integrity sha512-6L4myYcH9HG2M25co7/BSo0skKFHpAN8PhkNPM4xRVkyGl1K5M3Jx4rp5bsYhvYze2K4+l+pioN4e6ZwFLUVtw==
dependencies:
"@vue/shared" "3.2.38"
"@vue/runtime-core@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.37.tgz"
integrity sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==
dependencies:
"@vue/reactivity" "3.2.37"
"@vue/shared" "3.2.37"
"@vue/runtime-core@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.38.tgz#d19cf591c210713f80e6a94ffbfef307c27aea06"
integrity sha512-kk0qiSiXUU/IKxZw31824rxmFzrLr3TL6ZcbrxWTKivadoKupdlzbQM4SlGo4MU6Zzrqv4fzyUasTU1jDoEnzg==
dependencies:
"@vue/reactivity" "3.2.38"
"@vue/shared" "3.2.38"
"@vue/runtime-dom@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz"
integrity sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==
dependencies:
"@vue/runtime-core" "3.2.37"
"@vue/shared" "3.2.37"
csstype "^2.6.8"
"@vue/runtime-dom@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.38.tgz#fec711f65c2485991289fd4798780aa506469b48"
integrity sha512-4PKAb/ck2TjxdMSzMsnHViOrrwpudk4/A56uZjhzvusoEU9xqa5dygksbzYepdZeB5NqtRw5fRhWIiQlRVK45A==
dependencies:
"@vue/runtime-core" "3.2.38"
"@vue/shared" "3.2.38"
csstype "^2.6.8"
"@vue/server-renderer@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.37.tgz"
integrity sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==
dependencies:
"@vue/compiler-ssr" "3.2.37"
"@vue/shared" "3.2.37"
"@vue/server-renderer@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.38.tgz#01a4c0f218e90b8ad1815074208a1974ded109aa"
integrity sha512-pg+JanpbOZ5kEfOZzO2bt02YHd+ELhYP8zPeLU1H0e7lg079NtuuSB8fjLdn58c4Ou8UQ6C1/P+528nXnLPAhA==
dependencies:
"@vue/compiler-ssr" "3.2.38"
"@vue/shared" "3.2.38"
"@vue/shared@3.2.37":
version "3.2.37"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.37.tgz"
integrity sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==
"@vue/shared@3.2.38":
version "3.2.38"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.38.tgz#e823f0cb2e85b6bf43430c0d6811b1441c300f3c"
integrity sha512-dTyhTIRmGXBjxJE+skC8tTWCGLCVc4wQgRRLt8+O9p5ewBAjoBwtCAkLPrtToSr1xltoe3st21Pv953aOZ7alg==
"@vueuse/core@^8.7.5":
version "8.9.4"
resolved "https://registry.npmmirror.com/@vueuse/core/-/core-8.9.4.tgz"
integrity sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==
dependencies:
"@types/web-bluetooth" "^0.0.14"
"@vueuse/metadata" "8.9.4"
"@vueuse/shared" "8.9.4"
vue-demi "*"
"@vueuse/metadata@8.9.4":
version "8.9.4"
resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-8.9.4.tgz"
integrity sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==
"@vueuse/shared@8.9.4":
version "8.9.4"
resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-8.9.4.tgz"
integrity sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==
dependencies:
vue-demi "*"
"@wangeditor/basic-modules@^1.1.3":
version "1.1.3"
resolved "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.3.tgz#57884ae60947613324e94acde5abae7f00d59e2a"
integrity sha512-TGJix4UelO46yAgwI946ctx4lSIJbYBwNvjSJ9Tf8mKr0WMCeLVBV+MV85rXPsfcmWtR4wBNwSg648Z+RbqRUg==
dependencies:
is-url "^1.2.4"
"@wangeditor/code-highlight@^1.0.2":
version "1.0.2"
resolved "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.2.tgz#df6bf7ac8d232c6afb0cb8189baa9f8d52feeded"
integrity sha512-SCtOcUxjKqIso/LSxGSOaYr3G6MC2En0gNTyHIMCG928T0fo0ufaqp/vIXKQzVL2Y+X/CSAOB2EbrFlgGvr0AQ==
dependencies:
prismjs "^1.23.0"
"@wangeditor/core@^1.1.11":
version "1.1.11"
resolved "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.11.tgz#1525a7cddd2c41ceee7a4f9ef6a794b6bacf779b"
integrity sha512-BwHVRJzESnkjKikTc2U2zsbd06l1pSo7qKy5+SpZLudYWrFxmd85VN+5GxM57FodogkNw/k04DFHcFSUfXcaKA==
dependencies:
"@types/event-emitter" "^0.3.3"
event-emitter "^0.3.5"
html-void-elements "^2.0.0"
i18next "^20.4.0"
scroll-into-view-if-needed "^2.2.28"
slate-history "^0.66.0"
"@wangeditor/editor-for-vue@^5.1.12":
version "5.1.12"
resolved "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz#f7d5f239b39cdfc01d31151488de8443fe6edc64"
integrity sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==
"@wangeditor/editor@^5.1.14":
version "5.1.14"
resolved "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.14.tgz#863cef775ead194503d5636232e96b04ecc34040"
integrity sha512-erILPAkpKldyGi4cEwrOW65v12GhZy2qj2A8kPlypU46lE72Y3XowZxWogN1TI/mqMDR84AHr0QWOvygOV1xwQ==
dependencies:
"@uppy/core" "^2.1.1"
"@uppy/xhr-upload" "^2.0.3"
"@wangeditor/basic-modules" "^1.1.3"
"@wangeditor/code-highlight" "^1.0.2"
"@wangeditor/core" "^1.1.11"
"@wangeditor/list-module" "^1.0.2"
"@wangeditor/table-module" "^1.1.1"
"@wangeditor/upload-image-module" "^1.0.1"
"@wangeditor/video-module" "^1.1.1"
dom7 "^3.0.0"
is-hotkey "^0.2.0"
lodash.camelcase "^4.3.0"
lodash.clonedeep "^4.5.0"
lodash.debounce "^4.0.8"
lodash.foreach "^4.5.0"
lodash.isequal "^4.5.0"
lodash.throttle "^4.1.1"
lodash.toarray "^4.4.0"
nanoid "^3.2.0"
slate "^0.72.0"
snabbdom "^3.1.0"
"@wangeditor/list-module@^1.0.2":
version "1.0.2"
resolved "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.2.tgz#c9e57c4c34bbcc32df3a9030df2fda0bb4f77a39"
integrity sha512-VfENZEFvsLTiLxN/cj8cibFGy9NVV+/cfATTiLiH9ef+8lgKv8apttXYVlqIAfnlJLLuCk0cIm8c/zH+hbtrZg==
"@wangeditor/table-module@^1.1.1":
version "1.1.1"
resolved "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.1.tgz#cc88f2d566a3f314801cda4ab7ffceeb3c21c251"
integrity sha512-VPjEWQtncS2DsXYXiHUxPSxn2Xhc8GdhG3la7N5YhvxQde1+4N0SZLXeWsYvbGzOq4um5XToq5pktLLbE8G+EA==
"@wangeditor/upload-image-module@^1.0.1":
version "1.0.1"
resolved "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.1.tgz#a074518d73ce9c5cfd3e8ee56d1adf831996f142"
integrity sha512-vgUV4ENttTITblqtVuzleIq732OmzmzzgrIvX6b3GRGPSw5u8glJ/87tOEhvHjHECc4oFo18B7xzJ1GpBj79/w==
"@wangeditor/video-module@^1.1.1":
version "1.1.1"
resolved "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.1.tgz#67f24a8a64bd94baf2116d26da042faf5e8a5eb8"
integrity sha512-6gzpS5cnJihW2T0HFjqmbv6v8ouyaeMUjdM2X8BPohwD74p1ov00dCmRt5QekNTyYSmRHK0ASkUMOvRGqaDxMg==
ace-builds@^1.4.13, ace-builds@^1.9.6:
version "1.10.0"
resolved "https://registry.npmmirror.com/ace-builds/-/ace-builds-1.10.0.tgz#241e036411e99ee771f0bb7b16fdc63a866c2381"
integrity sha512-7BChLsIOOeWiAX6rzddLbOz6pBMLe9uPK0FNPhklZ8XGzbv0ydvP2yE7tZ/1irma/82KDZ6EVH16AYbDxwNA/Q==
anymatch@~3.1.2:
version "3.1.2"
resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz"
integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
async-validator@^4.2.5:
version "4.2.5"
resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz"
integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
axios@^0.21.1:
version "0.21.4"
resolved "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz"
integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
dependencies:
follow-redirects "^1.14.0"
base64-arraybuffer@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc"
integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
braces@~3.0.2:
version "3.0.2"
resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
"chokidar@>=3.0.0 <4.0.0":
version "3.5.3"
resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
glob-parent "~5.1.2"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.6.0"
optionalDependencies:
fsevents "~2.3.2"
clipboard@^2.0.11:
version "2.0.11"
resolved "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5"
integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==
dependencies:
good-listener "^1.2.2"
select "^1.1.2"
tiny-emitter "^2.0.0"
compute-scroll-into-view@^1.0.17:
version "1.0.17"
resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab"
integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==
css-line-break@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0"
integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==
dependencies:
utrie "^1.0.2"
csstype@^2.6.8:
version "2.6.20"
resolved "https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz"
integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
dependencies:
es5-ext "^0.10.50"
type "^1.0.1"
dayjs@^1.11.3:
version "1.11.4"
resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.4.tgz"
integrity sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==
delegate@^3.1.2:
version "3.2.0"
resolved "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166"
integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==
dom7@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz#b861ce5d67a6becd7aaa3ad02942ff14b1240331"
integrity sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==
dependencies:
ssr-window "^3.0.0-alpha.1"
echarts@^5.3.3:
version "5.3.3"
resolved "https://registry.npmmirror.com/echarts/-/echarts-5.3.3.tgz"
integrity sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==
dependencies:
tslib "2.3.0"
zrender "5.3.2"
element-plus@^2.2.9:
version "2.2.9"
resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.2.9.tgz"
integrity sha512-jYbL0JkCdv95rkT6trZJjCAizLPySa0qcd2cgq+57SKQnCZAcNDDq4GbTuFRnNavdoeCJnuM3HIficTIUpsMOQ==
dependencies:
"@ctrl/tinycolor" "^3.4.1"
"@element-plus/icons-vue" "^2.0.6"
"@floating-ui/dom" "^0.5.4"
"@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7"
"@types/lodash" "^4.14.182"
"@types/lodash-es" "^4.17.6"
"@vueuse/core" "^8.7.5"
async-validator "^4.2.5"
dayjs "^1.11.3"
escape-html "^1.0.3"
lodash "^4.17.21"
lodash-es "^4.17.21"
lodash-unified "^1.0.2"
memoize-one "^6.0.0"
normalize-wheel-es "^1.1.2"
es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14:
version "0.10.62"
resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
dependencies:
es6-iterator "^2.0.3"
es6-symbol "^3.1.3"
next-tick "^1.1.0"
es6-iterator@^2.0.3:
version "2.0.3"
resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
dependencies:
d "1"
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-symbol@^3.1.1, es6-symbol@^3.1.3:
version "3.1.3"
resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
dependencies:
d "^1.0.1"
ext "^1.1.2"
esbuild-android-64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz#9e4682c36dcf6e7b71b73d2a3723a96e0fdc5054"
integrity sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==
esbuild-android-arm64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz#9861b1f7e57d1dd1f23eeef6198561c5f34b51f6"
integrity sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==
esbuild-darwin-64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz#fd30a5ebe28704a3a117126c60f98096c067c8d1"
integrity sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==
esbuild-darwin-arm64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz#c04a3a57dad94a972c66a697a68a25aa25947f41"
integrity sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==
esbuild-freebsd-64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz#c404dbd66c98451395b1eef0fa38b73030a7be82"
integrity sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==
esbuild-freebsd-arm64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz#b62cec96138ebc5937240ce3e1b97902963ea74a"
integrity sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==
esbuild-linux-32@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz#495b1cc011b8c64d8bbaf65509c1e7135eb9ddbf"
integrity sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==
esbuild-linux-64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz#3f28dd8f986e6ff42f38888ee435a9b1fb916a56"
integrity sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==
esbuild-linux-arm64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz#a52e99ae30246566dc5f33e835aa6ca98ef70e33"
integrity sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==
esbuild-linux-arm@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz#7c33d05a64ec540cf7474834adaa57b3167bbe97"
integrity sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==
esbuild-linux-mips64le@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz#ed062bd844b587be649443831eb84ba304685f25"
integrity sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==
esbuild-linux-ppc64le@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz#c0786fb5bddffd90c10a2078181513cbaf077958"
integrity sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==
esbuild-linux-riscv64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz#579b0e7cc6fce4bfc698e991a52503bb616bec49"
integrity sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==
esbuild-linux-s390x@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz#09eb15c753e249a500b4e28d07c5eef7524a9740"
integrity sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==
esbuild-netbsd-64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz#f7337cd2bddb7cc9d100d19156f36c9ca117b58d"
integrity sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==
esbuild-openbsd-64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz#1f8bdc49f8a44396e73950a3fb6b39828563631d"
integrity sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==
esbuild-sunos-64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz#47d042739365b61aa8ca642adb69534a8eef9f7a"
integrity sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==
esbuild-windows-32@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz#79198c88ec9bde163c18a6b430c34eab098ec21a"
integrity sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==
esbuild-windows-64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz"
integrity sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==
esbuild-windows-arm64@0.14.49:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz#d83c03ff6436caf3262347cfa7e16b0a8049fae7"
integrity sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==
esbuild@^0.14.47:
version "0.14.49"
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.49.tgz"
integrity sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==
optionalDependencies:
esbuild-android-64 "0.14.49"
esbuild-android-arm64 "0.14.49"
esbuild-darwin-64 "0.14.49"
esbuild-darwin-arm64 "0.14.49"
esbuild-freebsd-64 "0.14.49"
esbuild-freebsd-arm64 "0.14.49"
esbuild-linux-32 "0.14.49"
esbuild-linux-64 "0.14.49"
esbuild-linux-arm "0.14.49"
esbuild-linux-arm64 "0.14.49"
esbuild-linux-mips64le "0.14.49"
esbuild-linux-ppc64le "0.14.49"
esbuild-linux-riscv64 "0.14.49"
esbuild-linux-s390x "0.14.49"
esbuild-netbsd-64 "0.14.49"
esbuild-openbsd-64 "0.14.49"
esbuild-sunos-64 "0.14.49"
esbuild-windows-32 "0.14.49"
esbuild-windows-64 "0.14.49"
esbuild-windows-arm64 "0.14.49"
escape-html@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz"
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
event-emitter@^0.3.5:
version "0.3.5"
resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
dependencies:
d "1"
es5-ext "~0.10.14"
ext@^1.1.2:
version "1.6.0"
resolved "https://registry.npmmirror.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52"
integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
dependencies:
type "^2.5.0"
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
dependencies:
to-regex-range "^5.0.1"
follow-redirects@^1.14.0:
version "1.15.1"
resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz"
integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
fsevents@~2.3.2:
version "2.3.2"
resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
good-listener@^1.2.2:
version "1.2.2"
resolved "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50"
integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==
dependencies:
delegate "^3.1.2"
has@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
function-bind "^1.1.1"
html-void-elements@^2.0.0:
version "2.0.1"
resolved "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f"
integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
html2canvas@^1.4.1:
version "1.4.1"
resolved "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543"
integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==
dependencies:
css-line-break "^2.1.0"
text-segmentation "^1.0.3"
i18next@^20.4.0:
version "20.6.1"
resolved "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz#535e5f6e5baeb685c7d25df70db63bf3cc0aa345"
integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==
dependencies:
"@babel/runtime" "^7.12.0"
immer@^9.0.6:
version "9.0.15"
resolved "https://registry.npmmirror.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc"
integrity sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==
immutable@^4.0.0:
version "4.1.0"
resolved "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz"
integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz"
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
dependencies:
binary-extensions "^2.0.0"
is-core-module@^2.9.0:
version "2.9.0"
resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.9.0.tgz"
integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
dependencies:
has "^1.0.3"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.3"
resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-hotkey@^0.2.0:
version "0.2.0"
resolved "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz#1835a68171a91e5c9460869d96336947c8340cef"
integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz"
integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
is-plain-object@^5.0.0:
version "5.0.0"
resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
is-url@^1.2.4:
version "1.2.4"
resolved "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash-unified@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.2.tgz"
integrity sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g==
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
lodash.clonedeep@^4.5.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
lodash.foreach@^4.5.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==
lodash.isequal@^4.5.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
lodash.throttle@^4.1.1:
version "4.1.1"
resolved "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
lodash.toarray@^4.4.0:
version "4.4.0"
resolved "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
integrity sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==
lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
magic-string@^0.25.7:
version "0.25.9"
resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz"
integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
dependencies:
sourcemap-codec "^1.4.8"
memoize-one@^6.0.0:
version "6.0.0"
resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz"
integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
mime-match@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8"
integrity sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==
dependencies:
wildcard "^1.1.0"
namespace-emitter@^2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz#978d51361c61313b4e6b8cf6f3853d08dfa2b17c"
integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==
nanoid@^3.1.25, nanoid@^3.2.0, nanoid@^3.3.4:
version "3.3.4"
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
next-tick@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
normalize-wheel-es@^1.1.2:
version "1.2.0"
resolved "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz"
integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==
path-parse@^1.0.7:
version "1.0.7"
resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
picomatch@^2.0.4, picomatch@^2.2.1:
version "2.3.1"
resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
postcss@^8.1.10, postcss@^8.4.14:
version "8.4.14"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.14.tgz"
integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==
dependencies:
nanoid "^3.3.4"
picocolors "^1.0.0"
source-map-js "^1.0.2"
preact@^10.5.13:
version "10.10.6"
resolved "https://registry.npmmirror.com/preact/-/preact-10.10.6.tgz#1fe62aecf93974b64e6a42e09ba1f00f93207d14"
integrity sha512-w0mCL5vICUAZrh1DuHEdOWBjxdO62lvcO++jbzr8UhhYcTbFkpegLH9XX+7MadjTl/y0feoqwQ/zAnzkc/EGog==
prismjs@^1.23.0:
version "1.28.0"
resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6"
integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz"
integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
dependencies:
picomatch "^2.2.1"
regenerator-runtime@^0.13.4:
version "0.13.9"
resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
resize-observer-polyfill@^1.5.1:
version "1.5.1"
resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
resolve@^1.22.1:
version "1.22.1"
resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
dependencies:
is-core-module "^2.9.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
rollup@^2.75.6:
version "2.77.0"
resolved "https://registry.npmmirror.com/rollup/-/rollup-2.77.0.tgz"
integrity sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==
optionalDependencies:
fsevents "~2.3.2"
sass@^1.35.1:
version "1.53.0"
resolved "https://registry.npmmirror.com/sass/-/sass-1.53.0.tgz"
integrity sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
scroll-into-view-if-needed@^2.2.28:
version "2.2.29"
resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz#551791a84b7e2287706511f8c68161e4990ab885"
integrity sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==
dependencies:
compute-scroll-into-view "^1.0.17"
select@^1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==
slate-history@^0.66.0:
version "0.66.0"
resolved "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz#ac63fddb903098ceb4c944433e3f75fe63acf940"
integrity sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==
dependencies:
is-plain-object "^5.0.0"
slate@^0.72.0:
version "0.72.8"
resolved "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz#5a018edf24e45448655293a68bfbcf563aa5ba81"
integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==
dependencies:
immer "^9.0.6"
is-plain-object "^5.0.0"
tiny-warning "^1.0.3"
snabbdom@^3.1.0:
version "3.5.1"
resolved "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.5.1.tgz#25f80ef15b194baea703d9d5441892e369de18e1"
integrity sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==
"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
source-map@0.6.1, source-map@^0.6.1:
version "0.6.1"
resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
sourcemap-codec@^1.4.8:
version "1.4.8"
resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
ssr-window@^3.0.0-alpha.1:
version "3.0.0"
resolved "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz#fd5b82801638943e0cc704c4691801435af7ac37"
integrity sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==
supports-preserve-symlinks-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
text-segmentation@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943"
integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==
dependencies:
utrie "^1.0.2"
tiny-emitter@^2.0.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
tiny-warning@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz"
integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
dependencies:
is-number "^7.0.0"
tslib@2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz"
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
type@^1.0.1:
version "1.2.0"
resolved "https://registry.npmmirror.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
type@^2.5.0:
version "2.7.2"
resolved "https://registry.npmmirror.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
utrie@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645"
integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==
dependencies:
base64-arraybuffer "^1.0.2"
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
vite@^3.0.0:
version "3.0.2"
resolved "https://registry.npmmirror.com/vite/-/vite-3.0.2.tgz"
integrity sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==
dependencies:
esbuild "^0.14.47"
postcss "^8.4.14"
resolve "^1.22.1"
rollup "^2.75.6"
optionalDependencies:
fsevents "~2.3.2"
vue-demi@*:
version "0.13.5"
resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.5.tgz"
integrity sha512-tO3K2bML3AwiHmVHeKCq6HLef2st4zBXIV5aEkoJl6HZ+gJWxWv2O8wLH8qrA3SX3lDoTDHNghLX1xZg83MXvw==
vue-i18n@^9.1.7:
version "9.1.10"
resolved "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.1.10.tgz"
integrity sha512-jpr7gV5KPk4n+sSPdpZT8Qx3XzTcNDWffRlHV/cT2NUyEf+sEgTTmLvnBAibjOFJ0zsUyZlVTAWH5DDnYep+1g==
dependencies:
"@intlify/core-base" "9.1.10"
"@intlify/shared" "9.1.10"
"@intlify/vue-devtools" "9.1.10"
"@vue/devtools-api" "^6.0.0-beta.7"
vue-router@^4.0.10:
version "4.1.2"
resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.2.tgz"
integrity sha512-5BP1qXFncVRwgV/XnqzsKApdMjQPqWIpoUBdL1ynz8HyLxIX/UDAx7Ql2BjmA5CXT/p61JfZvkpiFWFpaqcfag==
dependencies:
"@vue/devtools-api" "^6.1.4"
vue3-ace-editor@^2.2.2:
version "2.2.2"
resolved "https://registry.npmmirror.com/vue3-ace-editor/-/vue3-ace-editor-2.2.2.tgz#7fd694df2f556e8859edd2322703e039461c9ecc"
integrity sha512-fZ6OWosbU+odLrtrcGC/536QjCigujYJB0Hf6/tBp+ef/ohTadwQAqyBlVzOmvrmzZyubphpV9zkaZcx5Fuivw==
dependencies:
ace-builds "^1.4.13"
resize-observer-polyfill "^1.5.1"
vue "^3.2.26"
vue@^3.2.26:
version "3.2.38"
resolved "https://registry.npmmirror.com/vue/-/vue-3.2.38.tgz#cda3a414631745b194971219318a792dbbccdec0"
integrity sha512-hHrScEFSmDAWL0cwO4B6WO7D3sALZPbfuThDsGBebthrNlDxdJZpGR3WB87VbjpPh96mep1+KzukYEhpHDFa8Q==
dependencies:
"@vue/compiler-dom" "3.2.38"
"@vue/compiler-sfc" "3.2.38"
"@vue/runtime-dom" "3.2.38"
"@vue/server-renderer" "3.2.38"
"@vue/shared" "3.2.38"
vue@^3.2.31:
version "3.2.37"
resolved "https://registry.npmmirror.com/vue/-/vue-3.2.37.tgz"
integrity sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==
dependencies:
"@vue/compiler-dom" "3.2.37"
"@vue/compiler-sfc" "3.2.37"
"@vue/runtime-dom" "3.2.37"
"@vue/server-renderer" "3.2.37"
"@vue/shared" "3.2.37"
vuex@^4.0.2:
version "4.0.2"
resolved "https://registry.npmmirror.com/vuex/-/vuex-4.0.2.tgz"
integrity sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==
dependencies:
"@vue/devtools-api" "^6.0.0-beta.11"
wildcard@^1.1.0:
version "1.1.2"
resolved "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5"
integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==
zrender@5.3.2:
version "5.3.2"
resolved "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz"
integrity sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==
dependencies:
tslib "2.3.0"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment