This commit is contained in:
cxc
2022-10-20 13:43:55 +08:00
parent 8d39a3dc91
commit 41c1bce422
53 changed files with 2465 additions and 119 deletions

1
.env Normal file
View File

@ -0,0 +1 @@
VITE_APP_BASE_API = 'http://127.0.0.1:9090'

View File

@ -8,8 +8,14 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"@kjgl77/datav-vue3": "^1.3.3",
"axios": "^1.1.3",
"core-js": "^3.8.3",
"vue": "^3.2.13"
"dhtmlx-gantt": "^7.1.12",
"echarts": "^5.3.3",
"flv.js": "^1.6.2",
"vue": "^3.2.13",
"vue-router": "^4.1.5"
},
"devDependencies": {
"@babel/core": "^7.12.16",
@ -17,8 +23,13 @@
"@vue/cli-plugin-babel": "~5.0.0",
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"autoprefixer": "^10.4.12",
"eslint": "^7.32.0",
"eslint-plugin-vue": "^8.0.3"
"eslint-plugin-vue": "^8.0.3",
"postcss": "^8.4.16",
"sass": "^1.55.0",
"sass-loader": "^13.0.2",
"tailwindcss": "^3.1.8"
},
"eslintConfig": {
"root": true,

6
postcss.config.js Normal file
View File

@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View File

@ -1,17 +1,25 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<script type="text/javascript"
src="https://webapi.amap.com/maps?v=1.4.15&key=35a871e5905ecfd749bd998448b9cd03"></script>
<title>
<%= htmlWebpackPlugin.options.title %>
</title>
</head>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

View File

@ -1,26 +1,9 @@
<template>
<img alt="Vue logo" src="./assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue'
export default {
name: 'App',
components: {
HelloWorld
}
}
<script setup>
import Layout from "./views/Layout.vue";
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
</style>
<template>
<Layout></Layout>
</template>
<style scoped></style>

6
src/api/index.js Normal file
View File

@ -0,0 +1,6 @@
import request from '../utils/request'
// 获取安全情况数据
export const getSecuritySituation = () => request('http://127.0.0.1:9090/proxies', {
method: 'GET'
})

BIN
src/assets/bg@3x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 MiB

BIN
src/assets/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
src/assets/group4671@3x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

BIN
src/assets/group@3x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

BIN
src/assets/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
src/assets/menu@3x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
src/assets/monitor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 914 KiB

BIN
src/assets/next.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

BIN
src/assets/pin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/assets/play.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/assets/polygon40@3x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
src/assets/polygon48@3x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
src/assets/prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
src/assets/screen.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

BIN
src/assets/title@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

1
src/assets/vue.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

After

Width:  |  Height:  |  Size: 496 B

View File

@ -0,0 +1,38 @@
<template>
<div class="chart-container">
<div class="title flex items-center">{{ title }}</div>
<slot></slot>
</div>
</template>
<script setup name="ChartContainer">
import { toRefs } from "vue";
const props = defineProps({
title: {
required: true,
type: String,
},
});
const { title } = toRefs(props);
</script>
<style lang="scss" scoped>
.title {
width: 430px;
height: 50px;
font-family: PingFangSC-Regular;
font-size: 20px;
color: #ffffff;
letter-spacing: 0;
line-height: 30px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
padding-left: 38px;
background-image: linear-gradient(
90deg,
#05294b 0%,
#021f3a 0%,
rgba(5, 41, 75, 0) 100%
);
}
</style>

View File

@ -1,58 +0,0 @@
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<p>
For a guide and recipes on how to configure / customize this project,<br>
check out the
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
</p>
<h3>Installed CLI Plugins</h3>
<ul>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
</ul>
<h3>Essential Links</h3>
<ul>
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
</ul>
<h3>Ecosystem</h3>
<ul>
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
</ul>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
msg: String
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
margin: 40px 0 0;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>

View File

@ -0,0 +1,55 @@
<template>
<div style="background-color: #000; height: 100%; width: 100%">
<div
class="ScaleBox"
ref="scaleBoxRef"
:style="{
width: width + 'px',
height: height + 'px',
}"
>
<slot></slot>
</div>
</div>
</template>
<script setup name="ScaleBox">
import { onMounted, ref } from "vue";
import { debounce } from "lodash";
const scale = ref(0);
const width = ref(1920);
const height = ref(1080);
const scaleBoxRef = ref();
const getScale = () => {
const wh = window.innerHeight / height.value;
const ww = window.innerWidth / width.value;
return ww < wh ? ww : wh;
};
const setScale = () => {
scale.value = getScale();
if (scaleBoxRef.value) {
scaleBoxRef.value.style.setProperty("--scale", scale.value);
}
};
onMounted(() => {
setScale();
window.addEventListener("resize", debounce(setScale, 200));
});
</script>
<style lang="scss">
#ScaleBox {
--scale: 1;
}
.ScaleBox {
position: absolute;
transform: scale(var(--scale)) translate(-50%, -50%);
display: flex;
flex-direction: column;
transform-origin: 0 0;
left: 50%;
top: 50%;
transition: 0.3s;
z-index: 999;
}
</style>

View File

@ -0,0 +1,56 @@
<template>
<div class="screen-header">
<div class="nav-bar">
<div class="nav-links h-full flex items-center">
<router-link
class="nav-link flex justify-center items-center mr-8"
to="/"
>
项目概览
</router-link>
<router-link
class="nav-link flex justify-center items-center"
to="/monitor"
>
视频监控
</router-link>
</div>
</div>
<div class="title absolute left-0 top-0 flex justify-center items-center">
航天科工六院智慧工地
</div>
</div>
</template>
<script setup name="ScreenHeader"></script>
<style lang="scss" scoped>
:deep(.router-link-active) {
// background-color: rgb(107, 98, 239);
background-color: #0d4579;
}
.screen-header {
height: 84px;
.nav-bar {
padding-left: 32%;
height: 64px;
background-image: linear-gradient(0deg, #0e4b84 0%, #000407 100%);
.nav-link {
width: 160px;
height: 36px;
background-image: linear-gradient(0deg, #0e4b84 0%, rgba(0, 4, 7, 0) 99%);
border-radius: 0px 0px 20px 20px;
font-size: 24px;
color: #b1e1ff;
font-weight: 400;
}
}
.title {
width: 30%;
height: 84px;
background-image: linear-gradient(0deg, #0e4b84 0%, #000407 100%);
border-radius: 0px 0px 84px 0px;
font-size: 36px;
color: #b1e1ff;
font-weight: 400;
}
}
</style>

View File

@ -1,4 +1,6 @@
import { createApp } from 'vue'
import App from './App.vue'
import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
import router from "./router";
createApp(App).mount('#app')
createApp(App).use(router).mount("#app");

21
src/router/index.js Normal file
View File

@ -0,0 +1,21 @@
import { createWebHashHistory, createRouter } from "vue-router";
// const Home = { template: "<div>Home</div>" };
// const About = { template: "<div>About</div>" };
const routes = [
{ path: "/", component: () => import("../views/Overview/index.vue") },
{ path: "/monitor", component: () => import("../views/Monitor/index.vue") },
{ path: "/monitor/detail", component: () => import("../views/Monitor/monitor-detail.vue") },
];
// 3. 创建路由实例并传递 `routes` 配置
// 你可以在这里输入更多的配置,但我们在这里
// 暂时保持简单
const router = createRouter({
// 4. 内部提供了 history 模式的实现。为了简单起见,我们在这里使用 hash 模式。
history: createWebHashHistory(),
routes, // `routes: routes` 的缩写
});
export default router;

97
src/style.css Normal file
View File

@ -0,0 +1,97 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
body {
background-color: #020d17;
}
/* :root {
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 24px;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
} */

6
src/utils/request.js Normal file
View File

@ -0,0 +1,6 @@
const service = async (url, config) => {
const response = await fetch(url, config)
return response.json()
}
export default service

17
src/views/Layout.vue Normal file
View File

@ -0,0 +1,17 @@
<template>
<ScaleBox>
<div class="screen-layout h-full w-full bg-slate-200">
<ScreenHeader />
<router-view />
</div>
</ScaleBox>
</template>
<script setup name="Layout">
import ScaleBox from "../components/ScaleBox.vue";
import ScreenHeader from "../components/ScreenHeader.vue";
</script>
<style lang="scss" scoped>
.screen-layout{
background-image: url(../assets/bg@3x.png);
}
</style>

View File

@ -0,0 +1,131 @@
<template>
<div
:class="`monitor-item flex items-center flex-col`"
:style="`width: ${width}px;height: ${height}px;`"
>
<!-- <img src="../../assets/screen.png" class="monitor-screen" /> -->
<div class="video-wrap">
<video class="monitor-screen" ref="videoElementRef"></video>
<div class="overlay" @click="router.push('/monitor/detail')"></div>
</div>
<div class="flex w-full justify-between pt-2 pl-4 pr-4">
<div class="controls flex justify-between">
<!-- <img src="../../assets/prev.png" alt="" /> -->
<img
ref="playBtnRef"
@click="switchPlayStatus"
src="../../assets/play.png"
alt=""
/>
<!-- <img src="../../assets/next.png" alt="" /> -->
</div>
<div class="desc">摄像头1</div>
</div>
</div>
</template>
<script setup name="camera">
import flvjs from "flv.js";
import { onMounted, onUnmounted, ref, toRefs } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
const props = defineProps({
width: {
type: [String, Number],
// default: 800,
},
height: {
type: [String, Number],
default: 420,
},
});
const { width, height } = toRefs(props);
const videoElementRef = ref();
// const playBtnRef = ref();
let flvPlayer = flvjs.createPlayer({
type: "flv",
url: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv",
// url: "http://localhost:8000/lycoris_recoil.flv",
});
// 切换播放状态
const switchPlayStatus = () => {
if (!videoElementRef.value) return;
if (videoElementRef.value.paused) {
console.log(flvPlayer);
flvPlayer.play();
} else {
flvPlayer.pause();
}
};
const flvPlayerEventHandler = (e) => {
console.log(e);
};
onMounted(() => {
if (flvjs.isSupported()) {
flvPlayer.attachMediaElement(videoElementRef.value);
flvPlayer.load();
flvPlayer.on("ERROR", flvPlayerEventHandler);
// flvPlayer.play();
}
});
onUnmounted(() => {
console.log("destroy player here");
function flvDestroy() {
flvPlayer.off("ERROR", flvPlayerEventHandler);
flvPlayer.pause();
flvPlayer.unload();
flvPlayer.detachMediaElement();
flvPlayer.destroy();
flvPlayer = null;
}
flvDestroy();
});
</script>
<style lang="scss" scoped>
.monitor-item {
overflow: hidden;
// width: 400px;
// height: 280px;
// background-color: #158eff;
background-image: url(../../assets/monitor.png);
background-size: 100% 100%;
.video-wrap {
background-color: #333;
position: relative;
margin-top: 10%;
width: 98%;
height: 65%;
.monitor-screen {
width: 100%;
height: 100%;
}
.overlay {
z-index: 99;
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
}
}
.controls {
width: 100px;
img {
width: 28px;
height: 28px;
}
}
.desc {
font-family: PingFangSC-Medium;
font-size: 16px;
color: #ffffff;
letter-spacing: 0;
line-height: 24px;
text-shadow: 0 0 7px #158eff;
font-weight: 500;
}
}
</style>

197
src/views/Monitor/index.vue Normal file
View File

@ -0,0 +1,197 @@
<template>
<div class="wrap flex justify-between">
<div class="monitor-switcher">
<div class="title">摄像头列表</div>
<input type="text" class="search" placeholder="搜索摄像头" />
<ul class="localtion-list">
<li
v-for="(item, index) in localtionList"
:key="index"
@click="activeIndex = index"
:class="`localtion-item flex items-center ${
index == activeIndex ? 'active' : ''
}`"
>
<img
src="../../assets/location-fill@3x.png"
alt=""
style="
width: 18px;
height: 18px;
margin-right: 10px;
margin-left: 26px;
"
/>
<div>{{ item.name }}</div>
</li>
</ul>
</div>
<div class="monitor-list grid grid-cols-2">
<Camera
v-for="(item, index) in localtionList.slice(0, 4)"
:key="index"
></Camera>
<!-- <div
v-for="(item, index) in localtionList.slice(0, 9)"
:key="index"
:class="`monitor-item flex items-center flex-col`"
>
<img src="../../assets/screen.png" class="monitor-screen" />
<div class="flex w-full justify-between pt-2 pl-4 pr-4">
<div class="controls flex justify-between">
<img src="../../assets/prev.png" alt="" />
<img src="../../assets/play.png" alt="" />
<img src="../../assets/next.png" alt="" />
</div>
<div class="desc">{{ item.name }}</div>
</div>
</div> -->
</div>
<div class="controls flex flex-col justify-end pb-8">
<div class="pages flex">
<div class="page active flex justify-center items-center">1</div>
<div class="page flex justify-center items-center">2</div>
<div class="page flex justify-center items-center">3</div>
<div class="page flex justify-center items-center">4</div>
<div class="page flex justify-center items-center">5</div>
</div>
</div>
</div>
</template>
<script setup name="Monitor">
import { ref } from "vue";
import Camera from "./camera.vue";
const localtionList = ref([
{ name: "工地大门一" },
{ name: "工地大门二" },
{ name: "工地大门三" },
{ name: "工地大门四" },
{ name: "工地大门五" },
{ name: "工地大门六" },
{ name: "工地大门七" },
{ name: "工地大门八" },
{ name: "工地大门九" },
{ name: "工地大门十" },
]);
const activeIndex = ref(0);
</script>
<style lang="scss" scoped>
.wrap {
margin-top: 38px;
margin-left: 28px;
margin-right: 28px;
.monitor-switcher {
background-image: linear-gradient(
180deg,
rgba(4, 53, 99, 0.4) 0%,
rgba(4, 53, 99, 0.4) 100%
);
display: flex;
flex-direction: column;
align-items: center;
width: 350px;
height: 935px;
.title {
width: 100%;
// width: 430px;
// height: 50px;
// margin: 10px 10px 10px 0;
padding-top: 6px;
padding-bottom: 6px;
font-family: PingFangSC-Regular;
font-size: 20px;
color: #ffffff;
letter-spacing: 0;
line-height: 30px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
padding-left: 38px;
background-image: linear-gradient(
90deg,
#05294b 0%,
#021f3a 0%,
rgba(5, 41, 75, 0) 100%
);
}
.search {
margin-top: 32px;
width: 300px;
height: 32px;
border-radius: 16px;
background: rgba(12, 99, 181, 0.56);
}
.localtion-list {
.localtion-item {
width: 336px;
height: 42px;
user-select: none;
cursor: pointer;
font-family: PingFangSC-Regular;
font-size: 16px;
color: #ffffff;
letter-spacing: 0;
line-height: 30px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
}
.localtion-item.active {
background-image: linear-gradient(
90deg,
#0057a6 0%,
rgba(35, 53, 168, 0) 100%
);
}
}
}
.monitor-list {
// row-gap: 45px;
column-gap: 45px;
// .monitor-item {
// width: 400px;
// height: 280px;
// // background-color: #158eff;
// background-image: url(../../assets/monitor.png);
// background-size: 100% 100%;
// .monitor-screen {
// margin-top: 10%;
// width: 98%;
// height: 65%;
// }
// .controls {
// width: 100px;
// img {
// width: 28px;
// height: 28px;
// }
// }
// .desc {
// font-family: PingFangSC-Medium;
// font-size: 16px;
// color: #ffffff;
// letter-spacing: 0;
// line-height: 24px;
// text-shadow: 0 0 7px #158eff;
// font-weight: 500;
// }
// }
}
.controls {
width: 160px;
.page {
width: 24px;
height: 24px;
color: white;
}
.page.active {
border-width: 1px;
border-style: solid;
border-color: #b1e1ff;
background-image: linear-gradient(90deg, #0e4b84 1%, #000407 100%);
border-radius: 2.18px;
}
}
}
</style>

View File

@ -0,0 +1,6 @@
<template>
<Camera width="1900" height="960"></Camera>
</template>
<script setup name="CameraDetail">
import Camera from "./camera.vue";
</script>

View File

@ -0,0 +1,127 @@
<template>
<ChartContainer class="attendance" title="考勤人员统计">
<div class="people-count flex justify-between">
<div class="expected">
<div>
<span class="num">500</span>
<span class="unit"></span>
</div>
<div class="desc">今日应到人数</div>
</div>
<div class="actual">
<div>
<span class="num">503</span>
<span class="unit"></span>
</div>
<div class="desc">今日实到人数</div>
</div>
</div>
<div class="chart-title">月度出勤指数</div>
<div class="attendance-chart" ref="attendanceChartRef"></div>
</ChartContainer>
</template>
<script setup name="Attendance">
import ChartContainer from "../../components/ChartContainer.vue";
import * as echarts from "echarts";
import { onMounted, reactive, ref } from "vue";
const attendanceChartRef = ref([
{
name: "实际",
data: [200, 150, 100, 200, 300],
type: "line",
areaStyle: {},
},
{
name: "应到",
data: [150, 200, 200, 300, 120],
type: "line",
areaStyle: {},
},
]);
const attendanceData = ref([]);
const attendanceOption = reactive({
// grid: {
// left: "3%",
// right: "4%",
// bottom: "3%",
// containLabel: true,
// },
legend: {
data: ["实际", "应到"],
},
xAxis: {
type: "category",
boundaryGap: false,
data: ["四月", "五月", "六月", "七月", "八月"],
},
yAxis: {
type: "value",
},
series: attendanceChartRef.value,
});
onMounted(() => {
const attendanceChart = echarts.init(attendanceChartRef.value);
attendanceChart.setOption(attendanceOption);
});
</script>
<style lang="scss" scoped>
.attendance {
width: 442px;
.people-count {
margin-top: 60px;
margin-bottom: 60px;
> div {
width: 205px;
height: 96px;
background-image: url(../../assets/people-count@3x.png);
background-size: cover;
padding-left: 64px;
.num {
font-family: Helvetica;
font-size: 30px;
color: #ffd15c;
letter-spacing: 0;
line-height: 45px;
font-weight: 400;
}
.unit {
font-family: PingFangSC-Regular;
font-size: 18px;
color: #7cbfff;
letter-spacing: 0;
line-height: 27px;
font-weight: 400;
}
.desc {
font-family: PingFangSC-Semibold;
font-size: 18px;
color: #f2f6fa;
letter-spacing: 0;
line-height: 28px;
font-weight: 600;
}
}
}
.chart-title {
margin-bottom: 10px;
font-family: PingFangSC-Regular;
font-size: 20px;
color: #ffffff;
letter-spacing: 0;
line-height: 30px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
}
.attendance-chart {
width: 442px;
height: 270px;
}
}
.attendance-chart {
width: 430px;
height: 360px;
}
</style>

View File

@ -0,0 +1,96 @@
<template>
<ChartContainer title="费用管理">
<div class="cost-chart" ref="costChartRef"></div>
</ChartContainer>
</template>
<script setup name="Cost">
import ChartContainer from "../../components/ChartContainer.vue";
import * as echarts from "echarts";
import { onMounted, reactive, ref } from "vue";
const costChartRef = ref();
const costData = ref([
{
name: "建设单支出",
type: "bar",
stack: "建设单位",
emphasis: {
focus: "series",
},
data: [120, 132, 101, 134, 90],
},
{
type: "bar",
stack: "建设单位",
emphasis: {
focus: "series",
},
data: [220, 182, 191, 234, 290],
},
{
name: "劳务支出",
type: "bar",
stack: "劳务",
emphasis: {
focus: "series",
},
data: [150, 232, 201, 154, 190],
},
{
type: "bar",
stack: "劳务",
emphasis: {
focus: "series",
},
data: [150, 232, 201, 154, 190],
},
]);
const costOption = reactive({
tooltip: {
// textStyle: {
// color: "#fff",
// },
trigger: "axis",
axisPointer: {
type: "shadow",
},
},
legend: {
right: "5%",
top: "5%",
// align: "right",
textStyle: {
color: "#fff",
},
},
grid: {
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true,
},
xAxis: [
{
type: "category",
data: ["项目1", "项目2", "项目3", "项目4", "项目5"],
},
],
yAxis: [
{
type: "value",
},
],
series: costData.value,
});
onMounted(() => {
const costChart = echarts.init(costChartRef.value);
costChart.setOption(costOption);
});
</script>
<style lang="scss" scoped>
.cost-chart {
width: 430px;
height: 360px;
}
</style>

View File

@ -0,0 +1,125 @@
<template>
<ChartContainer title="项目概览图">
<div class="gantt-chart" ref="ganttChartRef"></div>
</ChartContainer>
</template>
<script setup name="Gantt">
import ChartContainer from "../../components/ChartContainer.vue";
// import { gantt } from "dhtmlx-gantt";
import * as echarts from "echarts";
import { onMounted, reactive, ref } from "vue";
const ganttChartRef = ref();
const ganttData = ref([
{
name: "项目1",
type: "line",
stack: "Total",
areaStyle: {},
emphasis: {
focus: "series",
},
data: [120, 132, 101, 134, 90, 230, 210],
},
{
name: "项目2",
type: "line",
stack: "Total",
areaStyle: {},
emphasis: {
focus: "series",
},
data: [220, 182, 191, 234, 290, 330, 310],
},
{
name: "项目3",
type: "line",
stack: "Total",
areaStyle: {},
emphasis: {
focus: "series",
},
data: [150, 232, 201, 154, 190, 330, 410],
},
{
name: "项目4",
type: "line",
stack: "Total",
areaStyle: {},
emphasis: {
focus: "series",
},
data: [320, 332, 301, 334, 390, 330, 320],
},
{
name: "项目5",
type: "line",
stack: "Total",
label: {
show: true,
position: "top",
},
areaStyle: {},
emphasis: {
focus: "series",
},
data: [820, 932, 901, 934, 1290, 1330, 1320],
},
]);
const ganttOption = reactive({
title: {
// text: "Stacked Area Chart",
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
},
legend: {
data: ["项目1", "项目2", "项目3", "项目4", "项目5"],
textStyle: {
color: "#fff",
},
},
toolbox: {
feature: {
saveAsImage: {},
},
},
grid: {
left: "3%",
right: "4%",
bottom: "3%",
containLabel: true,
},
xAxis: [
{
type: "category",
boundaryGap: false,
data: ["四月", "五月", "六月", "七月", "八月", "九月", "十月"],
},
],
yAxis: [
{
type: "value",
},
],
series: ganttData.value,
});
onMounted(() => {
const ganttChart = echarts.init(ganttChartRef.value);
ganttChart.setOption(ganttOption);
});
</script>
<style lang="scss" scoped>
.gantt-chart {
width: 916px;
height: 300px;
}
</style>

View File

@ -0,0 +1,93 @@
<template>
<div class="map-wrap">
<div class="pin pin-1" @click="showTip"></div>
<div class="pin pin-2" @click="showTip"></div>
<div class="pin pin-3" @click="showTip"></div>
<div class="tooltip" ref="toolTipRef" v-show="isShowTip">
<div class="close-button absolute top-1 right-1" @click="hideTip"></div>
<div class="title">六院信息化工程</div>
<div>设计单位碧海蓝天创意设计有限公司</div>
<div>负责人江海洋汪东城简易宏</div>
<div>施工单位航天六院</div>
<div>工程单位负责人江海洋汪东城</div>
<div>监理单位维创监理有限公司</div>
<div>负责人裴勇程保国李珊</div>
</div>
</div>
</template>
<script setup name="Map">
import { nextTick, ref } from "vue";
const toolTipRef = ref();
const isShowTip = ref(false);
const showTip = (event) => {
// console.log("in");
const parentLeft = event.target.parentNode.getBoundingClientRect().left;
const parentTop = event.target.parentNode.getBoundingClientRect().top;
const x = event.pageX - parentLeft;
const y = event.pageY - parentTop;
isShowTip.value = true;
// nextTick(() => {
if (toolTipRef.value) {
toolTipRef.value.style.left = `${x}px`;
toolTipRef.value.style.top = `${y}px`;
toolTipRef.value.style.zIndex = 9999;
}
// });
// console.log(x, y);
};
const hideTip = () => {
isShowTip.value = false;
if (toolTipRef.value) {
toolTipRef.value.style.zIndex = -1000;
}
};
</script>
<style lang="scss" scoped>
.map-wrap {
width: 916px;
height: 580px;
background-image: url(../../assets/map.png);
background-size: cover;
position: relative;
.pin {
user-select: none;
background-image: url(../../assets/pin.png);
background-size: cover;
width: 40px;
height: 40px;
position: absolute;
z-index: 99;
cursor: pointer;
}
.pin-1 {
left: 80px;
top: 360px;
}
.pin-2 {
left: 400px;
top: 400px;
}
.pin-3 {
left: 600px;
top: 370px;
}
.tooltip {
text-align: center;
color: white;
position: absolute;
background-image: url(../../assets/group4671@3x.png);
background-size: 100% 100%;
z-index: 99;
width: 266px;
.close-button {
cursor: pointer;
width: 20px;
height: 20px;
background-size: cover;
background-image: url(../../assets/close.png);
}
// height: 210px;
}
}
</style>

View File

@ -0,0 +1,130 @@
<template>
<ChartContainer class="project-detail" title="项目详情">
<div class="body grid grid-cols-2 px-5">
<div
v-for="(item, index) in dataList"
:style="`visibility: ${item.hidden ? 'hidden' : 'visible'};`"
class="detail-item flex flex-col justify-between py-4"
>
<div class="title-row flex items-center">
<div class="icon"></div>
<div class="title ml-2">{{ item.title }}</div>
</div>
<div class="content">{{ item.content }}</div>
</div>
</div>
</ChartContainer>
</template>
<script setup>
import ChartContainer from "@/components/ChartContainer.vue";
import { ref } from "vue";
const dataList = ref([
{
title: "项目名称",
content: "六院信息化工程",
},
{
hidden: true,
},
{
title: "项目编号",
content: "11293425960",
},
{
title: "项目负责人",
content: "辛弃疾",
},
{
title: "建设单位",
content: "碧海蓝天建筑施工",
},
{
title: "合同开竣工日期",
content: "2022.03.01-2023.03.01",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
{
title: "项目名称",
content: "六院信息化工程",
},
]);
</script>
<style lang="scss" scoped>
.project-detail {
width: 465px;
.body {
margin-top: 24px;
height: 744px;
background-image: linear-gradient(
180deg,
rgba(4, 53, 99, 0.4) 0%,
rgba(4, 53, 99, 0.13) 100%
);
.detail-item {
.title-row {
.icon {
width: 4px;
height: 14px;
background-image: linear-gradient(180deg, #abd6ff 0%, #379eff 100%);
border-radius: 2px;
}
.title {
font-family: PingFangSC-Regular;
font-size: 16px;
color: #b1e1ff;
letter-spacing: 0;
line-height: 24px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
}
}
.content {
// margin-top: 16px;
font-family: PingFangSC-Regular;
font-size: 18px;
color: #ffffff;
letter-spacing: 0;
line-height: 26px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
}
}
}
}
</style>

View File

@ -0,0 +1,76 @@
<template>
<ChartContainer class="project-person-count" title="项目人员统计">
<div class="people-count grid grid-cols-2 gap-y-4">
<div class="expected">
<div>
<span class="num">4936</span>
<span class="unit"></span>
</div>
<div class="desc">人员总数</div>
</div>
<div class="actual">
<div>
<span class="num">3405</span>
<span class="unit"></span>
</div>
<div class="desc">实时人数</div>
</div>
<div class="expected">
<div>
<span class="num">4800</span>
<span class="unit"></span>
</div>
<div class="desc">今日出勤人数</div>
</div>
<div class="actual">
<div>
<span class="num">88%</span>
</div>
<div class="desc">今日出勤率</div>
</div>
</div>
</ChartContainer>
</template>
<script setup>
import ChartContainer from "@/components/ChartContainer.vue";
</script>
<style lang="scss" scoped>
.project-person-count {
width: 442px;
.people-count {
margin-top: 24px;
// margin-bottom: 60px;
> div {
width: 205px;
height: 96px;
background-image: url(../../assets/people-count@3x.png);
background-size: cover;
padding-left: 64px;
.num {
font-family: Helvetica;
font-size: 30px;
color: #ffd15c;
letter-spacing: 0;
line-height: 45px;
font-weight: 400;
}
.unit {
font-family: PingFangSC-Regular;
font-size: 18px;
color: #7cbfff;
letter-spacing: 0;
line-height: 27px;
font-weight: 400;
}
.desc {
font-family: PingFangSC-Semibold;
font-size: 18px;
color: #f2f6fa;
letter-spacing: 0;
line-height: 28px;
font-weight: 600;
}
}
}
}
</style>

View File

@ -0,0 +1,290 @@
<template>
<ChartContainer class="project-situation-overview" title="项目情况">
<div class="title">总项目情况</div>
<div class="rate-wrap flex justify-between">
<div id="complete-rate" ref="completeRateRef"></div>
<div class="data-num flex flex-col justify-between">
<div class="data-item flex">
<img src="../../assets/group@3x.png" class="logo" alt="" />
<div>
<div>
<span class="num">{{ count.data.total }}</span
><span class="unit"></span>
</div>
<div class="desc">项目总数</div>
</div>
</div>
<div class="data-item flex">
<img src="../../assets/group@3x.png" class="logo" alt="" />
<div>
<div><span class="num">40</span><span class="unit"></span></div>
<div class="desc">进行中</div>
</div>
</div>
</div>
</div>
<div class="title">项目进度排行榜</div>
<ul class="rank">
<li>
<div class="flex">
<div class="icon"></div>
<div class="name">JDG改造项目</div>
<div class="comp">80%</div>
</div>
<div class="progess">
<div class="rate" style="width: 80%"></div>
<div class="indicator"></div>
</div>
</li>
<li>
<div class="flex">
<div class="icon"></div>
<div class="name">六院改造项目</div>
<div class="comp">75%</div>
</div>
<div class="progess">
<div class="rate" style="width: 75%"></div>
<div class="indicator"></div>
</div>
</li>
<li>
<div class="flex">
<div class="icon"></div>
<div class="name">工棚改造项目</div>
<div class="comp">60%</div>
</div>
<div class="progess">
<div class="rate" style="width: 60%"></div>
<div class="indicator"></div>
</div>
</li>
<li>
<div class="flex">
<div class="icon"></div>
<div class="name">钻水井改造项目</div>
<div class="comp">40%</div>
</div>
<div class="progess">
<div class="rate" style="width: 40%"></div>
<div class="indicator"></div>
</div>
</li>
</ul>
</ChartContainer>
</template>
<script setup name="ProjectSituation">
import ChartContainer from "../../components/ChartContainer.vue";
import * as echarts from "echarts";
import { onMounted, reactive, ref } from "vue";
const completeRateRef = ref();
const completeRateData = reactive([
{
value: 70,
name: "完成率",
detail: {
valueAnimation: true,
offsetCenter: ["0%", "0%"],
},
},
]);
const count = reactive({
data: { total: 80 },
});
setInterval(() => {
count.data.total = count.data.total + 1;
}, 1000);
const completeRateOptions = reactive({
series: [
{
// name: "131",
type: "gauge",
startAngle: 90,
endAngle: -270,
pointer: {
show: false,
},
progress: {
show: true,
overlap: false,
roundCap: true,
clip: false,
itemStyle: {
color: "#5CE4FF",
borderWidth: 1,
// borderColor: "#464646",
},
},
axisLine: {
lineStyle: {
width: 10,
},
},
splitLine: {
show: false,
distance: 0,
length: 10,
},
axisTick: {
show: false,
},
axisLabel: {
show: false,
distance: 50,
},
data: completeRateData,
// name: {
// show: false,
// },
detail: {
width: 50,
height: 16,
fontSize: 36,
color: "white",
borderWidth: 0,
formatter: "{value}%",
},
},
],
});
onMounted(() => {
const completeRateChart = echarts.init(completeRateRef.value);
completeRateChart.setOption(completeRateOptions);
});
</script>
<style lang="scss" scoped>
.project-situation-overview {
width: 430px;
padding-bottom: 38px;
.title {
margin-left: 5px;
margin-top: 20px;
padding-left: 3px;
font-size: 20px;
color: #ffffff;
letter-spacing: 0;
line-height: 30px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
}
.rate-wrap {
padding-right: 23px;
padding-left: 23px;
}
#complete-rate {
width: 173px;
height: 173px;
}
.data-item {
.num {
// font-family: PingFangSC-Regular;
font-size: 30px;
color: #f2f6fa;
letter-spacing: 0;
line-height: 30px;
font-weight: 600;
}
.unit {
// font-family: PingFangSC-Regular;
font-size: 12px;
color: #c6d1db;
letter-spacing: 0;
text-align: center;
line-height: 16px;
font-weight: 400;
}
.desc {
font-family: PingFangSC-Medium;
font-size: 16px;
color: #ffffff;
letter-spacing: 0;
line-height: 22px;
font-weight: 500;
}
.logo {
width: 84px;
// height: 12px;
}
}
.rank {
li:not(:last-child) {
margin-bottom: 14px;
}
li {
.icon {
width: 20px;
height: 24px;
background-image: url(../../assets/polygon48@3x.png);
background-size: cover;
// background-image: linear-gradient(180deg, #ad8317 0%, #7e6b09 100%);
}
.name {
margin-left: 10px;
font-family: PingFangSC-Regular;
font-size: 16px;
color: #ffd15c;
letter-spacing: 0;
line-height: 24px;
font-weight: 400;
}
.comp {
flex: 1;
font-family: PingFangSC-Regular;
font-size: 16px;
color: #ffd15c;
letter-spacing: 0;
text-align: right;
line-height: 24px;
font-weight: 400;
}
.progess {
margin-top: 14px;
width: 100%;
height: 4px;
display: flex;
align-items: center;
.rate {
width: 50%;
height: 100%;
background-image: linear-gradient(
270deg,
#ffd15c 2%,
rgba(200, 172, 36, 0.4) 100%
);
}
.indicator {
width: 8px;
height: 8px;
border-radius: 50%;
background: #ffffff;
box-shadow: 0px 0px 4px 0px rgba(239, 212, 142, 1);
}
}
}
li:last-child {
.name {
font-family: PingFangSC-Regular;
font-size: 16px;
color: #07d1fa;
letter-spacing: 0;
line-height: 24px;
font-weight: 400;
}
.icon {
background-image: url(../../assets/polygon40blue@3x.png);
}
.rate {
background-image: linear-gradient(
270deg,
#5ce4ff 2%,
rgba(36, 145, 200, 0.4) 100%
);
}
}
}
}
</style>

View File

@ -0,0 +1,65 @@
<template>
<div class="container flex items-center justify-start">
<img class="icon" src="@/assets/polygon40@3x.png" alt="" />
<div class="title text-white">项目总数</div>
<div class="counting-board flex justify-between">
<div class="num">1</div>
<div class="num">0</div>
<div class="num">0</div>
<div class="num">0</div>
</div>
</div>
</template>
<script setup></script>
<style lang="scss" scoped>
.container {
width: 465px;
height: 90px;
background-image: linear-gradient(
180deg,
rgba(4, 53, 99, 0.6) 0%,
rgba(4, 53, 99, 0.19) 100%
);
.icon {
margin-left: 16px;
width: 18px;
height: 18px;
}
.title {
margin-left: 10px;
font-family: PingFangSC-Regular;
font-size: 20px;
color: #ffffff;
letter-spacing: 0;
line-height: 30px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
}
.counting-board {
margin-left: 30px;
.num {
display: flex;
justify-content: center;
align-items: center;
width: 48px;
height: 56px;
opacity: 0.72;
background-image: linear-gradient(
180deg,
rgba(26, 101, 171, 0.88) 0%,
rgba(26, 101, 171, 0.48) 47%,
#1a65ab 100%
);
font-family: Impact;
font-size: 38px;
color: #f2f6fa;
letter-spacing: 0;
line-height: 30px;
font-weight: 900;
&:not(:last-child) {
margin-right: 24px;
}
}
}
}
</style>

View File

@ -0,0 +1,86 @@
<template>
<ChartContainer class="security-situation" title="质量情况">
<ScrollBoard :config="config" class="scroll-board" />
</ChartContainer>
</template>
<script setup name="SecuritySituation">
import axios from "axios";
import ChartContainer from "@/components/ChartContainer.vue";
import { ScrollBoard } from "@kjgl77/datav-vue3";
import { onMounted, reactive } from "vue";
const dataMap = reactive({
1: {
color: "#FE3E33",
text: "一级",
},
2: {
color: "#FFCF33",
text: "二级",
},
3: {
color: "#29CCC4",
text: "三级",
},
});
const corrStatusMap = {
0: "无需整改",
1: "待整改",
2: "整改中",
3: "整改完成",
};
const isPassMap = {
0: "不合格",
1: "合格",
};
// const levelTag = (level) => `
// <div
// class="level-tag"
// style="border: 1px solid ${dataMap[level]["color"]};color:${dataMap[level]["color"]}">
// ${dataMap[level]["text"]}
// </div>
// `;
const config = reactive({
header: ["整改编号", "项目名称", "是否通过", "整改状态"],
data: [],
headerHeight: 50,
headerBGC: "#0435633d",
evenRowBGC: "#0435633d",
oddRowBGC: "#0435633d",
hoverPause: true,
align: ["center"],
});
const loadData = async () => {
const resp = await axios.get("");
for (const item of resp.data) {
config.data.push([
item.QCID,
item.PRONAME,
isPassMap[item.ISPASS],
corrStatusMap[item.CORRSTATUS],
]);
}
};
onMounted(() => {
loadData();
});
</script>
<style lang="scss" scoped>
.security-situation {
width: 442px;
.scroll-board {
margin-top: 17px;
height: 239px;
:deep(.level-tag) {
display: flex;
justify-content: center;
align-items: center;
// background: rgba(254, 62, 51, 0.1);
border-radius: 2px;
width: 48px;
height: 24px;
}
}
}
</style>

View File

@ -0,0 +1,145 @@
<template>
<ChartContainer title="费用管理">
<div class="security-chart" ref="securityChartRef">
<div class="table-header flex justify-between">
<div class="name">名称</div>
<div class="count">数量</div>
<div class="level">安全隐患级别</div>
<div class="status">篡改状态</div>
</div>
<div class="table-body overflow-y-scroll">
<div
class="table-rows flex"
v-for="(item, index) in securityData"
:key="index"
>
<div class="name">{{ item.name }}</div>
<div class="count">{{ item.count }}</div>
<div class="level">
<div
class="level-tag"
:style="`border: 1px solid ${
dataMap[item.level]['color']
};color:${dataMap[item.level]['color']}`"
>
{{ dataMap[item.level]["text"] }}
</div>
</div>
<div class="status">{{ item.status }}</div>
</div>
</div>
</div>
</ChartContainer>
</template>
<script setup name="Security">
import ChartContainer from "../../components/ChartContainer.vue";
import { onMounted, reactive, ref } from "vue";
const securityChartRef = ref();
const dataMap = reactive({
1: {
color: "#FE3E33",
text: "一级",
},
2: {
color: "#FFCF33",
text: "二级",
},
3: {
color: "#29CCC4",
text: "三级",
},
});
const securityData = ref([
{ name: "六院信息化项目", count: 50, level: 3, status: "进行中" },
{ name: "六院信息化项目", count: 50, level: 3, status: "进行中" },
{ name: "六院信息化项目", count: 50, level: 3, status: "进行中" },
{ name: "六院信息化项目", count: 50, level: 1, status: "未开始" },
{ name: "六院信息化项目", count: 50, level: 3, status: "进行中" },
{ name: "六院信息化项目", count: 50, level: 3, status: "未开始" },
{ name: "六院信息化项目", count: 50, level: 2, status: "进行中" },
{ name: "六院信息化项目", count: 50, level: 3, status: "未开始" },
{ name: "六院信息化项目", count: 50, level: 3, status: "进行中" },
{ name: "六院信息化项目", count: 50, level: 3, status: "进行中" },
]);
const securityOption = reactive();
onMounted(() => {});
</script>
<style lang="scss" scoped>
.security-chart {
margin-top: 24px;
width: 442px;
height: 275px;
padding-left: 10px;
padding-right: 10px;
// transform: scaleY(-1) rotate(-180deg);
background-image: linear-gradient(
180deg,
rgba(4, 53, 99, 0.4) 0%,
rgba(4, 53, 99, 0.13) 100%
);
.table-header {
font-family: PingFangSC-Regular;
font-size: 14px;
color: #ffffff;
letter-spacing: 0;
line-height: 30px;
text-shadow: 0 0 9px #158eff;
font-weight: 400;
.name {
flex: 4;
}
.count {
flex: 1;
}
.level {
flex: 3;
text-align: center;
}
.status {
flex: 2;
text-align: center;
}
}
.table-body {
height: 245px;
.table-rows {
margin-top: 20px;
margin-bottom: 20px;
font-family: PingFangSC-Regular;
font-size: 16px;
color: #f2f6fa;
letter-spacing: 0;
line-height: 28px;
font-weight: 400;
.name {
flex: 4;
}
.count {
flex: 1;
}
.level {
flex: 3;
text-align: center;
display: flex;
justify-content: center;
align-items: center;
.level-tag {
display: flex;
justify-content: center;
align-items: center;
background: rgba(254, 62, 51, 0.1);
border-radius: 2px;
width: 48px;
height: 24px;
}
}
.status {
flex: 2;
text-align: center;
}
}
}
}
</style>

View File

@ -0,0 +1,102 @@
<template>
<ChartContainer class="security-situation" title="安全情况">
<ScrollBoard :config="config" class="scroll-board" />
</ChartContainer>
</template>
<script setup name="SecuritySituation">
import ChartContainer from "@/components/ChartContainer.vue";
import { ScrollBoard } from "@kjgl77/datav-vue3";
import { reactive } from "vue";
import { getSecuritySituation } from "@/api/index";
const dataMap = reactive({
1: {
color: "#FE3E33",
text: "一级",
},
2: {
color: "#FFCF33",
text: "二级",
},
3: {
color: "#29CCC4",
text: "三级",
},
});
const corrStatusMap = {
0: "无需整改",
1: "待整改",
2: "整改中",
3: "整改完成",
};
const isPassMap = {
0: "不合格",
1: "合格",
};
const levelTag = (level) => `
<div
class="level-tag"
style="border: 1px solid ${dataMap[level]["color"]};color:${dataMap[level]["color"]}">
${dataMap[level]["text"]}
</div>
`;
// const isPassTag = (status) => `
// <div
// class="level-tag"
// style="border: 1px solid ${dataMap[level]["color"]};color:${dataMap[level]["color"]}">
// ${dataMap[level]["text"]}
// </div>
// `;
const config = reactive({
header: ["整改编号", "项目名称", "是否通过", "整改状态"],
data: [
// ["六院信息化项目", 50, levelTag(1), "进行中"],
// ["三五五", 58, levelTag(2), "进行中"],
// ["七六八项目", 23, levelTag(2), "进行中"],
// ["三五五项目", 58, levelTag(3), "未开始"],
// ["三五五项目", 58, levelTag(1), "进行中"],
// ["三五五项目", 58, levelTag(3), "未开始"],
// ["三五五项目", 58, levelTag(2), "进行中"],
// ["三五五项目", 58, levelTag(1), "未开始"],
],
headerHeight: 50,
headerBGC: "#0435633d",
evenRowBGC: "#0435633d",
oddRowBGC: "#0435633d",
hoverPause: true,
// index: true,
// columnWidth: [50],
align: ["center"],
});
const loadData = async () => {
const data = await getSecuritySituation();
for (const item of data) {
config.data.push([
item.SRID,
item.PRONAME,
isPassMap[item.ISPASS],
corrStatusMap[item.CORRSTATUS],
]);
}
};
loadData();
</script>
<style lang="scss" scoped>
.security-situation {
width: 442px;
.scroll-board {
margin-top: 17px;
height: 239px;
:deep(.level-tag) {
display: flex;
justify-content: center;
align-items: center;
// background: rgba(254, 62, 51, 0.1);
border-radius: 2px;
width: 48px;
height: 24px;
}
}
}
</style>

View File

@ -0,0 +1,76 @@
<template>
<div class="wrap flex justify-between">
<div class="col-1 flex flex-col">
<ProjectPersonCount />
<SecuritySituation class="security-situation" />
<QualitySituation class="quality-situation" />
</div>
<div class="col-2 flex flex-col">
<Map />
<Gantt />
</div>
<div class="col-3">
<ProjectTotal class="project-total" />
<ProjectDetail class="project-detail" />
</div>
<!-- <div class="row-1 flex justify-between">
<ProjectSituation />
<Map />
<Attendance />
</div> -->
<!-- <div class="row-2 w-full flex justify-between"> -->
<!-- <DvDigitalFlop :config="config1" /> -->
<!-- <Cost /> -->
<!-- <Gantt /> -->
<!-- <Security /> -->
<!-- </div> -->
</div>
</template>
<script setup name="Overview">
import { reactive } from "vue";
import Map from "./Map.vue";
import SecuritySituation from "./SecuritySituation.vue";
import QualitySituation from "./QualitySituation.vue";
import ProjectTotal from "./ProjectTotal.vue";
import ProjectDetail from "./ProjectDetail.vue";
import ProjectPersonCount from "./ProjectPersonCount.vue";
import Gantt from "./Gantt.vue";
const config1 = reactive({
number: [100],
content: "{nt}个",
});
</script>
<style lang="scss" scoped>
.wrap {
margin-left: 28px;
margin-right: 25px;
.col-1 {
padding-top: 40px;
width: 442px;
.security-situation {
margin-top: 24px;
}
.quality-situation {
margin-top: 22px;
}
}
.col-2 {
padding-top: 40px;
width: 916px;
}
.col-3 {
width: 465px;
padding-top: 40px;
// .project-total {
// margin-top: 40px;
// }
.project-detail {
margin-top: 24px;
}
}
}
</style>

11
tailwind.config.js Normal file
View File

@ -0,0 +1,11 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}

View File

@ -1,4 +1,7 @@
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true
transpileDependencies: true,
lintOnSave: false,
// publicPath: './',
// assetsDir: "../app/",
})

369
yarn.lock
View File

@ -924,7 +924,7 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
"@babel/runtime@^7.12.13", "@babel/runtime@^7.8.4":
"@babel/runtime@^7.12.13", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
version "7.19.0"
resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259"
integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==
@ -1006,6 +1006,45 @@
resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
"@jiaminghi/bezier-curve@*":
version "0.0.9"
resolved "https://registry.npmmirror.com/@jiaminghi/bezier-curve/-/bezier-curve-0.0.9.tgz#5196aca93c8b061a612b4c3eabcedf9490cef6ee"
integrity sha512-u9xJPOEl6Dri2E9FfmJoGxYQY7vYJkURNX04Vj64tdi535tPrpkuf9Sm0lNr3QTKdHQh0DdNRsaa62FLQNQEEw==
dependencies:
"@babel/runtime" "^7.5.5"
"@jiaminghi/c-render@^0.4.3":
version "0.4.3"
resolved "https://registry.npmmirror.com/@jiaminghi/c-render/-/c-render-0.4.3.tgz#982ebd8f71b443bb9507834227834973ebd9b6d8"
integrity sha512-FJfzj5hGj7MLqqqI2D7vEzHKbQ1Ynnn7PJKgzsjXaZpJzTqs2Yw5OSeZnm6l7Qj7jyPAP53lFvEQNH4o4j6s+Q==
dependencies:
"@babel/runtime" "^7.5.5"
"@jiaminghi/bezier-curve" "*"
"@jiaminghi/color" "*"
"@jiaminghi/transition" "*"
"@jiaminghi/charts@^0.2.18":
version "0.2.18"
resolved "https://registry.npmmirror.com/@jiaminghi/charts/-/charts-0.2.18.tgz#63ded95200789fc1a1fd04b7fd9e56f58d22d90f"
integrity sha512-K+HXaOOeWG9OOY1VG6M4mBreeeIAPhb9X+khG651AbnwEwL6G2UtcAQ8GWCq6GzhczcLwwhIhuaHqRygwHC0sA==
dependencies:
"@babel/runtime" "^7.5.5"
"@jiaminghi/c-render" "^0.4.3"
"@jiaminghi/color@*":
version "0.1.1"
resolved "https://registry.npmmirror.com/@jiaminghi/color/-/color-0.1.1.tgz#bddf9012dfce6982d3829a983ffeb91ee9dda7b6"
integrity sha512-M09+Sb5HGqVim0zo+nG5gU1v+6gXT8ptr0BZR6dMGt83XmCJgnZtO8s7llTW4hLFFFM5co6geZvTekqLpSPAAQ==
dependencies:
"@babel/runtime" "^7.5.5"
"@jiaminghi/transition@*":
version "1.1.11"
resolved "https://registry.npmmirror.com/@jiaminghi/transition/-/transition-1.1.11.tgz#576d8af092434b34201eba5eaecc79dd33c8ad8c"
integrity sha512-owBggipoHMikDHHDW5Gc7RZYlVuvxHADiU4bxfjBVkHDAmmck+fCkm46n2JzC3j33hWvP9nSCAeh37t6stgWeg==
dependencies:
"@babel/runtime" "^7.5.5"
"@jridgewell/gen-mapping@^0.1.0":
version "0.1.1"
resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
@ -1054,6 +1093,16 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@kjgl77/datav-vue3@^1.3.3":
version "1.3.3"
resolved "https://registry.npmmirror.com/@kjgl77/datav-vue3/-/datav-vue3-1.3.3.tgz#9cc9d9aa44674c512cdffb047dc85dffec138074"
integrity sha512-G/ypeuT2pTquSssLOFXZyQNpt3J+0I3AioqxU1G1s+Har+QWqOm6tin2nR542I63dhpmSDhgIvcuG3xfHL6B6A==
dependencies:
"@jiaminghi/c-render" "^0.4.3"
"@jiaminghi/charts" "^0.2.18"
"@vueuse/core" "^9.1.0"
lodash-es "^4.17.21"
"@leichtgewicht/ip-codec@^2.0.1":
version "2.0.4"
resolved "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b"
@ -1290,6 +1339,11 @@
dependencies:
"@types/node" "*"
"@types/web-bluetooth@^0.0.15":
version "0.0.15"
resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.15.tgz#d60330046a6ed8a13b4a53df3813c44942ebdf72"
integrity sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==
"@types/ws@^8.5.1":
version "8.5.3"
resolved "https://registry.npmmirror.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d"
@ -1596,6 +1650,11 @@
optionalDependencies:
prettier "^1.18.2 || ^2.0.0"
"@vue/devtools-api@^6.1.4":
version "6.2.1"
resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz#6f2948ff002ec46df01420dfeff91de16c5b4092"
integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
"@vue/reactivity-transform@3.2.39":
version "3.2.39"
resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.39.tgz#da6ae6c8fd77791b9ae21976720d116591e1c4aa"
@ -1660,6 +1719,28 @@
resolved "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a"
integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==
"@vueuse/core@^9.1.0":
version "9.2.0"
resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.2.0.tgz#58e3588b9bc5a69010aa9104b00056ee9ebff738"
integrity sha512-/MZ6qpz6uSyaXrtoeBWQzAKRG3N7CvfVWvQxiM3ei3Xe5ydOjjtVbo7lGl9p8dECV93j7W8s63A8H0kFLpLyxg==
dependencies:
"@types/web-bluetooth" "^0.0.15"
"@vueuse/metadata" "9.2.0"
"@vueuse/shared" "9.2.0"
vue-demi "*"
"@vueuse/metadata@9.2.0":
version "9.2.0"
resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.2.0.tgz#6bf7c9c44b9f5ece405837226a0e04a997994458"
integrity sha512-exN4KE6iquxDCdt72BgEhb3tlOpECtD61AUdXnUqBTIUCl70x1Ar/QXo3bYcvxmdMS2/peQyfeTzBjRTpvL5xw==
"@vueuse/shared@9.2.0":
version "9.2.0"
resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.2.0.tgz#7831051b2c1d01c3413c749468ee53a86024510e"
integrity sha512-NnRp/noSWuXW0dKhZK5D0YLrDi0nmZ18UeEgwXQq7Ul5TTP93lcNnKjrHtd68j2xFB/l59yPGFlCryL692bnrA==
dependencies:
vue-demi "*"
"@webassemblyjs/ast@1.11.1":
version "1.11.1"
resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
@ -1809,12 +1890,26 @@ acorn-jsx@^5.3.1, acorn-jsx@^5.3.2:
resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn-node@^1.8.2:
version "1.8.2"
resolved "https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8"
integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==
dependencies:
acorn "^7.0.0"
acorn-walk "^7.0.0"
xtend "^4.0.2"
acorn-walk@^7.0.0:
version "7.2.0"
resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
acorn-walk@^8.0.0, acorn-walk@^8.0.2:
version "8.2.0"
resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
acorn@^7.4.0:
acorn@^7.0.0, acorn@^7.4.0:
version "7.4.1"
resolved "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
@ -1925,6 +2020,11 @@ arch@^2.1.1:
resolved "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
arg@^5.0.2:
version "5.0.2"
resolved "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@ -1959,12 +2059,17 @@ async@^2.6.4:
dependencies:
lodash "^4.17.14"
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
at-least-node@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
autoprefixer@^10.2.4:
autoprefixer@^10.2.4, autoprefixer@^10.4.12:
version "10.4.12"
resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.12.tgz#183f30bf0b0722af54ee5ef257f7d4320bb33129"
integrity sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==
@ -1976,6 +2081,15 @@ autoprefixer@^10.2.4:
picocolors "^1.0.0"
postcss-value-parser "^4.2.0"
axios@^1.1.3:
version "1.1.3"
resolved "https://registry.npmmirror.com/axios/-/axios-1.1.3.tgz#8274250dada2edf53814ed7db644b9c2866c1e35"
integrity sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
babel-loader@^8.2.2:
version "8.2.5"
resolved "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e"
@ -2158,6 +2272,11 @@ camel-case@^4.1.2:
pascal-case "^3.1.2"
tslib "^2.0.3"
camelcase-css@^2.0.1:
version "2.0.1"
resolved "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
camelcase@^5.0.0:
version "5.3.1"
resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
@ -2213,7 +2332,7 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chokidar@^3.5.3:
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3:
version "3.5.3"
resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
@ -2327,7 +2446,7 @@ color-name@1.1.3:
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
color-name@^1.1.4, color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
@ -2342,6 +2461,13 @@ colorette@^2.0.10:
resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
commander@^2.20.0:
version "2.20.3"
resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@ -2676,6 +2802,16 @@ define-properties@^1.1.4:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
defined@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
integrity sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
depd@2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
@ -2696,6 +2832,25 @@ detect-node@^2.0.4:
resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
detective@^5.2.1:
version "5.2.1"
resolved "https://registry.npmmirror.com/detective/-/detective-5.2.1.tgz#6af01eeda11015acb0e73f933242b70f24f91034"
integrity sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==
dependencies:
acorn-node "^1.8.2"
defined "^1.0.0"
minimist "^1.2.6"
dhtmlx-gantt@^7.1.12:
version "7.1.12"
resolved "https://registry.npmmirror.com/dhtmlx-gantt/-/dhtmlx-gantt-7.1.12.tgz#f91a2b6af0c41b14155f513f1c6469056df41dfb"
integrity sha512-8xC/DbBR/jqy6bnTT+qc6uKZPdQwYqpw6U8LJRb2A9Uz0BdYvKCptVfXIQOERFOLEqjymSzbCu4z/OwmabuCrg==
didyoumean@^1.2.2:
version "1.2.2"
resolved "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
dir-glob@^3.0.1:
version "3.0.1"
resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@ -2703,6 +2858,11 @@ dir-glob@^3.0.1:
dependencies:
path-type "^4.0.0"
dlv@^1.1.3:
version "1.1.3"
resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
dns-equal@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
@ -2787,6 +2947,14 @@ easy-stack@1.0.1:
resolved "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz#8afe4264626988cabb11f3c704ccd0c835411066"
integrity sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==
echarts@^5.3.3:
version "5.3.3"
resolved "https://registry.npmmirror.com/echarts/-/echarts-5.3.3.tgz#df97b09c4c0e2ffcdfb44acf518d50c50e0b838e"
integrity sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==
dependencies:
tslib "2.3.0"
zrender "5.3.2"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -2858,6 +3026,11 @@ es-module-lexer@^0.9.0:
resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
es6-promise@^4.2.8:
version "4.2.8"
resolved "https://registry.npmmirror.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@ -3152,7 +3325,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-glob@^3.2.7, fast-glob@^3.2.9:
fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9:
version "3.2.12"
resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
@ -3251,11 +3424,28 @@ flatted@^3.1.0:
resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
follow-redirects@^1.0.0:
flv.js@^1.6.2:
version "1.6.2"
resolved "https://registry.npmmirror.com/flv.js/-/flv.js-1.6.2.tgz#fa3340fe3f7ee01d3977f7876aee66b8436e5922"
integrity sha512-xre4gUbX1MPtgQRKj2pxJENp/RnaHaxYvy3YToVVCrSmAWUu85b9mug6pTXF6zakUjNP2lFWZ1rkSX7gxhB/2A==
dependencies:
es6-promise "^4.2.8"
webworkify-webpack "^2.1.5"
follow-redirects@^1.0.0, follow-redirects@^1.15.0:
version "1.15.2"
resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@ -3349,7 +3539,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
glob-parent@^6.0.1:
glob-parent@^6.0.1, glob-parent@^6.0.2:
version "6.0.2"
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
@ -3610,6 +3800,11 @@ ignore@^5.2.0:
resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
immutable@^4.0.0:
version "4.1.0"
resolved "https://registry.npmmirror.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@ -3883,7 +4078,7 @@ kind-of@^6.0.2:
resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
klona@^2.0.5:
klona@^2.0.4, klona@^2.0.5:
version "2.0.5"
resolved "https://registry.npmmirror.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
@ -3911,7 +4106,7 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
lilconfig@^2.0.3:
lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.0.6:
version "2.0.6"
resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4"
integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==
@ -3951,6 +4146,11 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@ -4106,7 +4306,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
@ -4314,6 +4514,11 @@ object-assign@^4.0.1:
resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-hash@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
object-inspect@^1.9.0:
version "1.12.2"
resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
@ -4550,6 +4755,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
pify@^2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
pkg-dir@^4.1.0:
version "4.2.0"
resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
@ -4612,6 +4822,30 @@ postcss-discard-overridden@^5.1.0:
resolved "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e"
integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==
postcss-import@^14.1.0:
version "14.1.0"
resolved "https://registry.npmmirror.com/postcss-import/-/postcss-import-14.1.0.tgz#a7333ffe32f0b8795303ee9e40215dac922781f0"
integrity sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==
dependencies:
postcss-value-parser "^4.0.0"
read-cache "^1.0.0"
resolve "^1.1.7"
postcss-js@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00"
integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==
dependencies:
camelcase-css "^2.0.1"
postcss-load-config@^3.1.4:
version "3.1.4"
resolved "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855"
integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==
dependencies:
lilconfig "^2.0.5"
yaml "^1.10.2"
postcss-loader@^6.1.1:
version "6.2.1"
resolved "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef"
@ -4699,6 +4933,13 @@ postcss-modules-values@^4.0.0:
dependencies:
icss-utils "^5.0.0"
postcss-nested@5.0.6:
version "5.0.6"
resolved "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc"
integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==
dependencies:
postcss-selector-parser "^6.0.6"
postcss-normalize-charset@^5.1.0:
version "5.1.0"
resolved "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed"
@ -4785,7 +5026,7 @@ postcss-reduce-transforms@^5.1.0:
dependencies:
postcss-value-parser "^4.2.0"
postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9:
postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9:
version "6.0.10"
resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
@ -4808,7 +5049,7 @@ postcss-unique-selectors@^5.1.1:
dependencies:
postcss-selector-parser "^6.0.5"
postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
version "4.2.0"
resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
@ -4821,7 +5062,7 @@ postcss@^7.0.36:
picocolors "^0.2.1"
source-map "^0.6.1"
postcss@^8.1.10, postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.7:
postcss@^8.1.10, postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.16, postcss@^8.4.7:
version "8.4.16"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c"
integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==
@ -4875,6 +5116,11 @@ proxy-addr@~2.0.7:
forwarded "0.2.0"
ipaddr.js "1.9.1"
proxy-from-env@^1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
pseudomap@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@ -4905,6 +5151,11 @@ queue-microtask@^1.2.2:
resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
quick-lru@^5.1.1:
version "5.1.1"
resolved "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
randombytes@^2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@ -4927,6 +5178,13 @@ raw-body@2.5.1:
iconv-lite "0.4.24"
unpipe "1.0.0"
read-cache@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==
dependencies:
pify "^2.3.0"
read-pkg-up@^7.0.1:
version "7.0.1"
resolved "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
@ -5064,7 +5322,7 @@ resolve-from@^4.0.0:
resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve@^1.10.0, resolve@^1.14.2:
resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.1:
version "1.22.1"
resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
@ -5128,6 +5386,23 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
sass-loader@^13.0.2:
version "13.0.2"
resolved "https://registry.npmmirror.com/sass-loader/-/sass-loader-13.0.2.tgz#e81a909048e06520e9f2ff25113a801065adb3fe"
integrity sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==
dependencies:
klona "^2.0.4"
neo-async "^2.6.2"
sass@^1.55.0:
version "1.55.0"
resolved "https://registry.npmmirror.com/sass/-/sass-1.55.0.tgz#0c4d3c293cfe8f8a2e8d3b666e1cf1bff8065d1c"
integrity sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
schema-utils@^2.6.5:
version "2.7.1"
resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
@ -5326,7 +5601,7 @@ sockjs@^0.3.24:
uuid "^8.3.2"
websocket-driver "^0.7.4"
source-map-js@^1.0.2:
"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#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
@ -5558,6 +5833,34 @@ table@^6.0.9:
string-width "^4.2.3"
strip-ansi "^6.0.1"
tailwindcss@^3.1.8:
version "3.1.8"
resolved "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.1.8.tgz#4f8520550d67a835d32f2f4021580f9fddb7b741"
integrity sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==
dependencies:
arg "^5.0.2"
chokidar "^3.5.3"
color-name "^1.1.4"
detective "^5.2.1"
didyoumean "^1.2.2"
dlv "^1.1.3"
fast-glob "^3.2.11"
glob-parent "^6.0.2"
is-glob "^4.0.3"
lilconfig "^2.0.6"
normalize-path "^3.0.0"
object-hash "^3.0.0"
picocolors "^1.0.0"
postcss "^8.4.14"
postcss-import "^14.1.0"
postcss-js "^4.0.0"
postcss-load-config "^3.1.4"
postcss-nested "5.0.6"
postcss-selector-parser "^6.0.10"
postcss-value-parser "^4.2.0"
quick-lru "^5.1.1"
resolve "^1.22.1"
tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0:
version "2.2.1"
resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
@ -5646,6 +5949,11 @@ tr46@~0.0.3:
resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
tslib@2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
tslib@^2.0.3:
version "2.4.0"
resolved "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
@ -5767,6 +6075,11 @@ vary@~1.1.2:
resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
vue-demi@*:
version "0.13.11"
resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99"
integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==
vue-eslint-parser@^8.0.1:
version "8.3.0"
resolved "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d"
@ -5794,6 +6107,13 @@ vue-loader@^17.0.0:
hash-sum "^2.0.0"
loader-utils "^2.0.0"
vue-router@^4.1.5:
version "4.1.5"
resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.5.tgz#256f597e3f5a281a23352a6193aa6e342c8d9f9a"
integrity sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==
dependencies:
"@vue/devtools-api" "^6.1.4"
vue-style-loader@^4.1.0, vue-style-loader@^4.1.3:
version "4.1.3"
resolved "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35"
@ -5976,6 +6296,11 @@ websocket-extensions@>=0.1.1:
resolved "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
webworkify-webpack@^2.1.5:
version "2.1.5"
resolved "https://registry.npmmirror.com/webworkify-webpack/-/webworkify-webpack-2.1.5.tgz#bf4336624c0626cbe85cf1ffde157f7aa90b1d1c"
integrity sha512-2akF8FIyUvbiBBdD+RoHpoTbHMQF2HwjcxfDvgztAX5YwbZNyrtfUMgvfgFVsgDhDPVTlkbb5vyasqDHfIDPQw==
whatwg-fetch@^3.6.2:
version "3.6.2"
resolved "https://registry.npmmirror.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c"
@ -6045,6 +6370,11 @@ ws@^8.4.2:
resolved "https://registry.npmmirror.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e"
integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==
xtend@^4.0.2:
version "4.0.2"
resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
@ -6092,3 +6422,10 @@ yorkie@^2.0.0:
is-ci "^1.0.10"
normalize-path "^1.0.0"
strip-indent "^2.0.0"
zrender@5.3.2:
version "5.3.2"
resolved "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz#f67b11d36d3d020d62411d3bb123eb1c93cccd69"
integrity sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==
dependencies:
tslib "2.3.0"