fixed
15
package.json
@ -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
@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
plugins: {
|
||||
tailwindcss: {},
|
||||
autoprefixer: {},
|
||||
},
|
||||
}
|
@ -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>
|
31
src/App.vue
@ -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
@ -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
After Width: | Height: | Size: 9.1 MiB |
BIN
src/assets/close.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
src/assets/group4671@3x.png
Normal file
After Width: | Height: | Size: 202 KiB |
BIN
src/assets/group@3x.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
src/assets/location-fill@3x.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 6.7 KiB |
BIN
src/assets/map.png
Normal file
After Width: | Height: | Size: 1.3 MiB |
BIN
src/assets/menu@3x.png
Normal file
After Width: | Height: | Size: 92 KiB |
BIN
src/assets/monitor.png
Normal file
After Width: | Height: | Size: 914 KiB |
BIN
src/assets/next.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
src/assets/people-count@3x.png
Normal file
After Width: | Height: | Size: 166 KiB |
BIN
src/assets/pin.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
src/assets/play.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
src/assets/polygon40@3x.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
src/assets/polygon40blue@3x.png
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
src/assets/polygon48@3x.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
src/assets/prev.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
src/assets/screen.png
Normal file
After Width: | Height: | Size: 315 KiB |
BIN
src/assets/title@2x.png
Normal file
After Width: | Height: | Size: 134 KiB |
1
src/assets/vue.svg
Normal 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 |
38
src/components/ChartContainer.vue
Normal 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>
|
@ -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>
|
55
src/components/ScaleBox.vue
Normal 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>
|
56
src/components/ScreenHeader.vue
Normal 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>
|
@ -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
@ -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
@ -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
@ -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
@ -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>
|
131
src/views/Monitor/camera.vue
Normal 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
@ -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>
|
6
src/views/Monitor/monitor-detail.vue
Normal file
@ -0,0 +1,6 @@
|
||||
<template>
|
||||
<Camera width="1900" height="960"></Camera>
|
||||
</template>
|
||||
<script setup name="CameraDetail">
|
||||
import Camera from "./camera.vue";
|
||||
</script>
|
127
src/views/Overview/Attendance.vue
Normal 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>
|
96
src/views/Overview/Cost.vue
Normal 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>
|
125
src/views/Overview/Gantt.vue
Normal 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>
|
93
src/views/Overview/Map.vue
Normal 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>
|
130
src/views/Overview/ProjectDetail.vue
Normal 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>
|
76
src/views/Overview/ProjectPersonCount.vue
Normal 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>
|
290
src/views/Overview/ProjectSituation.vue
Normal 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>
|
65
src/views/Overview/ProjectTotal.vue
Normal 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>
|
86
src/views/Overview/QualitySituation.vue
Normal 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>
|
145
src/views/Overview/Security.vue
Normal 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>
|
102
src/views/Overview/SecuritySituation.vue
Normal 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>
|
76
src/views/Overview/index.vue
Normal 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
@ -0,0 +1,11 @@
|
||||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: [
|
||||
"./index.html",
|
||||
"./src/**/*.{vue,js,ts,jsx,tsx}",
|
||||
],
|
||||
theme: {
|
||||
extend: {},
|
||||
},
|
||||
plugins: [],
|
||||
}
|
@ -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
@ -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"
|
||||
|