Initial commit

This commit is contained in:
2025-08-18 16:50:57 +08:00
commit 4fc95516d6
350 changed files with 175555 additions and 0 deletions

View File

@ -0,0 +1,108 @@
<template>
<div class="jnrcBox">
<div class="top flex">
<div class="imgItem">
<img src="@/assets/images/46.png" alt="" />
</div>
<div class="imgItem">
<img src="@/assets/images/47.png" alt="" />
</div>
<div class="imgItem">
<img src="@/assets/images/48.png" alt="" />
</div>
</div>
<div class="flex mb30 mt30">
<div class="imgItem btText"><span>第一产业</span></div>
<div class="imgItem btText"><span>第二产业</span></div>
<div class="imgItem btText"><span>第三产业</span></div>
</div>
<div class="flex mb30 mt20">
<div class="imgItem">
<div class="line"></div>
</div>
<div class="imgItem">
<div class="line"></div>
</div>
<div class="imgItem">
<div class="line"></div>
</div>
</div>
<div class="flex mb40 mt40">
<div class="imgItem btText"><span>技能认证数量</span></div>
<div class="imgItem btText"><span>技能认证数量</span></div>
<div class="imgItem btText"><span>技能认证数量</span></div>
</div>
<div class="flex mt20">
<div class="imgItem">
<div class="kkk">7 <span></span></div>
</div>
<div class="imgItem">
<div class="kkk">659 <span></span></div>
</div>
<div class="imgItem">
<div class="kkk">207 <span></span></div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.jnrcBox {
width: 100%;
height: 100%;
padding: 0 2vw;
box-sizing: border-box;
.top {
flex: 1 0 0;
}
.imgItem {
width: 33.33%;
text-align: center;
img {
width: 170px;
}
span {
margin-top: 25px;
font-size: 1.5vw;
font-family: "YSBTH";
@include textColor(#026ed3, #ffffff);
}
.line {
margin: 0 auto;
width: 214px;
height: 11px;
background: url('~@/assets/images/icon_40.png') no-repeat left bottom;
background-size: 100%;
}
.kkk {
margin-top: 10px;
line-height: 40px;
font-size: 2.5vw;
}
.btText {
span {
font-size: 3vw;
}
}
}
}
</style>

View File

@ -0,0 +1,126 @@
<template>
<div class="jnrcBox">
<div class="top flex mt40">
<div class="imgItem">
<img width="200" src="@/assets/images/icon_37.png" alt="" />
</div>
<div class="imgItem">
<img width="200" src="@/assets/images/icon_38.png" alt="" />
</div>
<div class="imgItem">
<img width="200" src="@/assets/images/icon_39.png" alt="" />
</div>
</div>
<div class="flex mb40 mt70">
<div class="imgItem"><span>第一产业</span></div>
<div class="imgItem"><span>第二产业</span></div>
<div class="imgItem"><span>第三产业</span></div>
</div>
<div class="flex">
<div class="imgItem"><div class="line"></div></div>
<div class="imgItem"><div class="line"></div></div>
<div class="imgItem"><div class="line"></div></div>
</div>
<ul class="meaasgeBox">
<li class="meaasgeItem" v-for="(it,idx) in list" :key="idx">
<div class="messageTile"><span>{{it.label}}</span></div>
<ul class="flex">
<li v-for="(iv,idx) in it.list" :key="idx" class="childid">
<div class="kkk" v-for="(ig,idxx) in iv" :key="idxx">{{idxx+1}}{{ig}}</div>
</li>
</ul>
</li>
</ul>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
const list = reactive([
{
label: "各产业新兴行业分析",
list:[
['精准农业','农业科技服务','智慧养殖'],
['智能制造装备','新能源汽车制造'],
['数字创意产业','养老服务产业','共享经济'],
]
},
{
label: "各产业新兴行岗位分析",
list:[
['农业数据分析师','农业无人机操作员','智慧养殖工程师'],
['工业互联网工程师','3D打印工程师'],
['数字媒体设计师','养老规划师','共享经济运营专员'],
]
},
]);
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.jnrcBox {
width: 100%;
height: 100%;
padding: 0 2vw;
box-sizing: border-box;
.top {
flex: 1 0 0;
height: 105px;
}
.imgItem {
width: 33.33%;
text-align: center;
span{
margin-top: 25px;
font-size: 60px;
font-family: "YSBTH";
@include textColor(#026ed3,#ffffff);
}
.line{
margin: 0 auto;
width: 220px;
height: 6px;
background: url('~@/assets/images/icon_40.png') no-repeat left bottom;
background-size: 100%;
}
}
.meaasgeBox{
margin-top: 30px;
height: calc(100% - 410px);
overflow: hidden;
.meaasgeItem{
height: 48%;
margin-top: 2%;
background: rgba(0,0,0,0.12);
border-radius: 4%;
overflow: hidden;
box-sizing: border-box;
.messageTile{
height: 60px;
line-height: 60px;
font-family: "YSBTH";
font-size: 50px;
margin-bottom: 25px;
span{
@include textColor(#026ed3,#ffffff);
}
}
.childid{
flex: 1 0 0;
padding-left: 60px;
box-sizing: border-box;
font-family: "YSBTH";
.kkk{
line-height: 70px;
font-size: 1.2vw;
@include textColor(#f68e06,#ffffff);
}
}
}
}
}
</style>

View File

@ -0,0 +1,116 @@
<template>
<ul class="jnrcBox">
<li class="jnrcItem" v-for="it in list" :key="it">
<img :src="it.img" width="200" alt="" />
<div class="line"></div>
<div class="message flex just-around ">
<div class="top">
<div class="label">{{ it.label }}</div>
<div class="cz">产值<span class="num mr10">{{ it.cz }}</span>亿</div>
<div class="cz">同比<span class="num">{{ it.tb }}</span></div>
<!-- <div class="cz">环比<span class="num">{{ it.hb }}</span></div> -->
</div>
<div class="top">
<div class="label">{{ it.label2 }}</div>
<div class="cz">需求岗位数<span class="num mr10">{{ it.gws }}</span></div>
<div class="cz">需求人数<span class="num">{{ it.xqrs }}</span></div>
</div>
</div>
</li>
</ul>
</template>
<script setup>
import { reactive, ref } from "vue";
const list = reactive([
{
label: "第一产业产值及趋势",
label2: '第一产业技能人才需求',
cz: 36.75,
czdw: '亿',
hb: "-1.6%",
tb: "+2%",
gws: 3000,
xqrs: 2565,
img: require("@/assets/images/icon_32.png")
},
{
label: "第二产业产值及趋势",
label2: '第二产业技能人才需求',
cz: 240.9,
hb: "-1.6%",
tb: "-1%",
gws: 3000,
xqrs: 2565,
img: require("@/assets/images/icon_34.png")
},
{
label: "第三产业产值及趋势",
label2: '第三产业技能人才需求',
cz: 232.79,
hb: "-1.6%",
tb: "+2%",
gws: 3000,
xqrs: 2565,
img: require("@/assets/images/icon_35.png")
}
]);
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.jnrcBox {
width: 100%;
height: 100%;
.jnrcItem {
height: 33.33%;
display: flex;
align-items: center;
padding: 0 1vw;
box-sizing: border-box;
.line {
width: 12px;
height: 188px;
background: url("~@/assets/images/icon_33.png") no-repeat center center;
background-size: 100% 100%;
margin: 0 30px;
}
.message {
flex: 1 0 0;
height: 100%;
display: flex;
padding-top: 100px;
.top {
.label {
font-family: "YSBTH";
font-size: 55px;
letter-spacing: 2px;
@include textColor(#499ff2, #ffffff);
}
.cz {
font-size: 1.5vw;
font-family: "YSBTH";
@include textColor(#06f682,#ffffff);
display: flex;
font-weight: 600;
align-items: center;
letter-spacing: 2px;
.num {
font-size: 1.3vw;
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,138 @@
<template>
<div class="training-products-container">
<div class="products-section">
<div class="products-grid">
<div class="product-card" v-for="(item, index) in products" :key="index">
<div class="icon">
<img :src="item.icon" :alt="item.name" />
</div>
<div class="info flex">
<div class="label">{{ item.name }}</div>
<div class="value">{{ animatedValues.products[index] }}<span class="ge ml10"></span> </div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const products = ref([
{
name: '培训机构:',
count: 5,
icon: require('@/assets/images/2.png')
},
{
name: '企业:',
count: 23,
icon: require('@/assets/images/1.png')
},
{
name: '高校:',
count: 7,
icon: require('@/assets/images/3.png')
},
]);
const animatedValues = ref({
products: [0, 0, 0, 0]
});
const animateNumber = (startValue, endValue, duration, updateCallback) => {
const startTime = Date.now();
const endTime = startTime + duration;
const animate = () => {
const currentTime = Date.now();
const progress = Math.min((currentTime - startTime) / duration, 1);
const currentValue = Math.floor(startValue + (endValue - startValue) * progress);
updateCallback(currentValue);
if (progress < 1) {
requestAnimationFrame(animate);
}
};
requestAnimationFrame(animate);
};
onMounted(() => {
products.value.forEach((item, index) => {
animateNumber(0, item.count, 2000, (value) => animatedValues.value.products[index] = value);
});
});
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.training-products-container {
padding: 0 24px;
min-height: 100vh;
color: #fff;
font-family: "YSBTH";
.products-section {
border-radius: 12px;
.products-grid {
.product-card {
border-radius: 8px;
display: flex;
align-items: center;
margin-bottom: 10px;
margin-left: 30px;
height: 180px;
&:hover {
transform: translateY(-4px);
border-color: rgba(24, 144, 255, 0.6);
box-shadow: 0 0 30px rgba(24, 144, 255, 0.25);
}
.icon {
width: 188px;
margin-right: 16px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.info {
display: flex;
align-items: center;
.label {
font-size: 3vw;
color: #8cc8ff;
letter-spacing: 4px;
@include textColor(#003D63,#ffffff);
margin-right: 30px;
margin-left: 30px;
}
.value {
letter-spacing: 4px;
font-size: 2.5vw;
font-weight: bold;
@include textColor(#8cc8ff,#ffffff);
}
.ge{
font-size: 2.2vw;
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,148 @@
<template>
<div class="training-products-container">
<div class="products-section">
<div class="products-grid">
<div class="product-card" v-for="(item, index) in products" :key="index">
<div class="icon">
<img :src="item.icon" :alt="item.name" />
</div>
<div class="info">
<div class="label">{{ item.name }}</div>
<div class="value">{{ animatedValues.products[index] }}<span></span></div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const products = ref([
{
name: '报名人数',
count: 925,
icon: require('@/assets/images/ic1.png')
},
{
name: '签到人数',
count: 886,
icon: require('@/assets/images/ic2.png')
},
{
name: '结业人数',
count: 879,
icon: require('@/assets/images/ic3.png')
},
{
name: '领证人数',
count: 870,
icon: require('@/assets/images/ic4.png')
}
]);
const animatedValues = ref({
products: [0, 0, 0, 0]
});
const animateNumber = (startValue, endValue, duration, updateCallback) => {
const startTime = Date.now();
const endTime = startTime + duration;
const animate = () => {
const currentTime = Date.now();
const progress = Math.min((currentTime - startTime) / duration, 1);
const currentValue = Math.floor(startValue + (endValue - startValue) * progress);
updateCallback(currentValue);
if (progress < 1) {
requestAnimationFrame(animate);
}
};
requestAnimationFrame(animate);
};
onMounted(() => {
products.value.forEach((item, index) => {
animateNumber(0, item.count, 2000, (value) => animatedValues.value.products[index] = value);
});
});
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.training-products-container {
padding: 24px 40px;
min-height: 100vh;
color: #fff;
.products-section {
border-radius: 12px;
padding: 10px;
.products-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 60px;
.product-card {
border-radius: 8px;
display: flex;
align-items: center;
height: 280px;
&:hover {
transform: translateY(-4px);
border-color: rgba(24, 144, 255, 0.6);
box-shadow: 0 0 30px rgba(24, 144, 255, 0.25);
}
.icon {
width: 201px;
margin-right: 16px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(24, 144, 255, 0.2);
border-radius: 12px;
padding: 10px;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.info {
.label {
font-size: 1.5vw;
color: #8cc8ff;
margin-bottom: 8px;
font-family: "YSBTH";
@include textColor(#003D63,#ffffff);
}
.value {
font-size: 2vw;
font-weight: bold;
color: #fff;
@include textColor(#FFD11B,#ffffff);
span {
font-size: 1.5vw;
margin-left: 4px;
opacity: 0.8;
@include textColor(#FFD11B,#ffffff);
}
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,101 @@
<template>
<div class="jnrcBox">
<div class="top flex">
<div class="imgItem">
<img src="@/assets/images/icon_37.png" alt="" />
</div>
<div class="imgItem">
<img src="@/assets/images/icon_38.png" alt="" />
</div>
<div class="imgItem">
<img src="@/assets/images/icon_39.png" alt="" />
</div>
</div>
<div class="flex mb20 mt20">
<div class="imgItem btText"><span>第一产业</span></div>
<div class="imgItem btText"><span>第二产业</span></div>
<div class="imgItem btText"><span>第三产业</span></div>
</div>
<div class="flex mb20 mt20">
<div class="imgItem">
<div class="line"></div>
</div>
<div class="imgItem">
<div class="line"></div>
</div>
<div class="imgItem">
<div class="line"></div>
</div>
</div>
<div class="flex">
<div class="imgItem">
<div class="kkk">2</div>
<div class="dw mt20">()</div>
</div>
<div class="imgItem">
<div class="kkk">22</div>
<div class="dw mt20">()</div>
</div>
<div class="imgItem">
<div class="kkk">15</div>
<div class="dw mt20"></div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.jnrcBox {
width: 100%;
height: 100%;
padding: 0 2vw;
box-sizing: border-box;
.top {
flex: 1 0 0;
}
.imgItem {
width: 33.33%;
text-align: center;
span {
margin-top: 25px;
font-size: 2.2vw;
font-family: "YSBTH";
@include textColor(#026ed3, #ffffff);
}
img {
width: 170px;
}
.line {
margin: 0 auto;
width: 214px;
height: 11px;
background: url('~@/assets/images/icon_40.png') no-repeat left bottom;
background-size: 100%;
}
.kkk {
margin-top: 20px;
font-size: 2.4vw;
}
.dw {
font-size: 2.2vw;
}
}
}
</style>

View File

@ -0,0 +1,66 @@
<template>
<div class="jnrcBox ">
<div class="flex align-center mb20 mt10">
<div class="left"><img src="@/assets/images/ic41.png" alt=""></div>
<div class="right ml30">
<div class="label">开班期数</div>
<div class="num">17 <span></span> </div>
</div>
</div>
<div class="flex align-center">
<div class="left mb20"><img src="@/assets/images/ic422.png" alt=""></div>
<div class="right ml30">
<div class="label">培养人数</div>
<div class="num">2620 <span></span> </div>
</div>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.jnrcBox {
width: 100%;
height: 100%;
padding: 0 2vw;
box-sizing: border-box;
padding-top: 30px;
>div {
height: 300px;
justify-content: center;
}
.left {
img {
width: 179px;
}
}
.label {
font-size: 2.5vw;
font-family: "YSBTH";
@include textColor(#003D63, #ffffff);
}
.num {
font-size: 2.5vw;
font-family: "YSBTH";
@include textColor(#499FE2, #ffffff);
span {
font-size: 2.2vw;
@include textColor(#ffffff, #ffffff);
}
}
}
</style>

View File

@ -0,0 +1,154 @@
<template>
<div class="training-products-container">
<div class="products-section">
<div class="products-grid">
<div class="product-card" v-for="(item, index) in products" :key="index">
<div class="icon">
<img :src="item.icon" :alt="item.name" />
</div>
<div class="info">
<div class="label">{{ item.name }}</div>
<div class="value">{{ animatedValues.products[index] }}<span></span></div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const products = ref([
{
name: '管理类',
count: 2,
icon: require('@/assets/images/52.png')
},
{
name: '技能认证类',
count: 42,
icon: require('@/assets/images/53.png')
},
{
name: '安全类',
count: 4,
icon: require('@/assets/images/49.png')
},
{
name: '文化类',
count: 3,
icon: require('@/assets/images/50.png')
},
{
name: '创新创业类',
count: 7,
icon: require('@/assets/images/51.png')
}
]);
const animatedValues = ref({
products: [0, 0, 0, 0]
});
const animateNumber = (startValue, endValue, duration, updateCallback) => {
const startTime = Date.now();
const endTime = startTime + duration;
const animate = () => {
const currentTime = Date.now();
const progress = Math.min((currentTime - startTime) / duration, 1);
const currentValue = Math.floor(startValue + (endValue - startValue) * progress);
updateCallback(currentValue);
if (progress < 1) {
requestAnimationFrame(animate);
}
};
requestAnimationFrame(animate);
};
onMounted(() => {
products.value.forEach((item, index) => {
animateNumber(0, item.count, 2000, (value) => animatedValues.value.products[index] = value);
});
});
</script>
<style lang="scss" scoped>
.training-products-container {
padding: 24px;
// background: linear-gradient(to bottom, #001529, #002140);
min-height: 100vh;
color: #fff;
.products-section {
// background: rgba(0, 21, 41, 0.7);
border-radius: 12px;
padding: 2px 32px;
// border: 1px solid rgba(24, 144, 255, 0.5);
// box-shadow: 0 0 15px rgba(24, 144, 255, 0.3);
.products-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 24px;
.product-card {
// background: rgba(0, 21, 41, 0.7);
border-radius: 8px;
padding: 2px 0;
display: flex;
align-items: center;
// border: 1px solid rgba(24, 144, 255, 0.3);
// transition: all 0.3s ease;
&:hover {
transform: translateY(-4px);
border-color: rgba(24, 144, 255, 0.6);
box-shadow: 0 0 30px rgba(24, 144, 255, 0.25);
}
.icon {
width: 201px;
margin-right: 16px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.info {
.label {
margin-bottom: 8px;
font-size: 1.4vw;
font-family: "YSBTH";
background: linear-gradient(25deg, #8cc8ff, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.value {
font-size: 2.2vw;
font-weight: bold;
color: #fff;;
span {
font-size: 2.2vw;
margin-left: 4px;
opacity: 0.8;
}
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,166 @@
<template>
<div class="overview-section">
<div class="total-institutions">
<div class="number-display">
<span>{{ animatedValues.totalInstitutions }}</span>
<span class="f16 ml10"></span>
</div>
<div class="label">入驻培训机构</div>
</div>
<div class="institution-types">
<div class="type-card">
<div class="icon">
<img :src="require('@/assets/images/ic344.png')"/>
</div>
<div class="info">
<div class="label">本地机构</div>
<div class="value">{{ animatedValues.localInstitutions }}<span></span></div>
</div>
</div>
<div class="type-card">
<div class="icon">
<img :src="require('@/assets/images/icon_42.png')" />
</div>
<div class="info">
<div class="label">线上机构</div>
<div class="value">{{ animatedValues.onlineInstitutions }}<span></span></div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const animatedValues = ref({
totalInstitutions: 0,
localInstitutions: 0,
onlineInstitutions: 0
});
const animateNumber = (startValue, endValue, duration, updateCallback) => {
const startTime = Date.now();
const endTime = startTime + duration;
const animate = () => {
const currentTime = Date.now();
const progress = Math.min((currentTime - startTime) / duration, 1);
const currentValue = Math.floor(startValue + (endValue - startValue) * progress);
updateCallback(currentValue);
if (progress < 1) {
requestAnimationFrame(animate);
}
};
requestAnimationFrame(animate);
};
onMounted(() => {
// 初始化数据动画
animateNumber(0, 12, 2000, (value) => animatedValues.value.totalInstitutions = value);
animateNumber(0, 5, 2000, (value) => animatedValues.value.localInstitutions = value);
animateNumber(0, 7, 2000, (value) => animatedValues.value.onlineInstitutions = value);
});
</script>
<style lang="scss" scoped>
.overview-section {
padding: 24px;
height: 100%;
border-radius: 12px;
padding: 0px 32px;
.total-institutions {
margin-top: 20px;
text-align: center;
margin-bottom: 2.5vw;
background: url("~@/assets/images/bg1111.png") no-repeat center bottom;
background-size: 100% 100%;
padding-bottom: 34px;
.number-display {
font-size: 130px;
font-weight: bold;
span {
background: linear-gradient(25deg, #05ee8d, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
.label {
font-size: 2.2vw;
font-family: "YSBTH";
background: linear-gradient(25deg, #8cc8ff, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
.institution-types {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 24px;
.type-card {
border-radius: 8px;
display: flex;
align-items: center;
transition: all 0.3s ease;
&:hover {
transform: translateY(-4px);
border-color: rgba(24, 144, 255, 0.6);
box-shadow: 0 0 30px rgba(24, 144, 255, 0.25);
}
.icon {
width: 169px;
margin-right: 16px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.info {
.label {
font-size: 2.2vw;
margin-bottom: 8px;
font-family: "YSBTH";
background: linear-gradient(25deg, #8cc8ff, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.value {
font-size: 2.2vw;
font-weight: bold;
color: #fff;
font-family: "YSBTH";
background: linear-gradient(25deg, #8cc8ff, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
span {
font-size: 1.8vw;
margin-left: 4px;
opacity: 0.8;
font-family: "YSBTH";
background: linear-gradient(25deg, #8cc8ff, #ffffff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,152 @@
<template>
<div class="training-products-container">
<div class="products-section">
<div class="products-grid">
<div class="product-card" v-for="(item, index) in products" :key="index">
<div class="icon">
<img :src="item.icon" :alt="item.name" />
</div>
<div class="info">
<div class="label">{{ item.name }}</div>
<div class="value">{{ animatedValues.products[index] }}<span></span></div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
const products = ref([
{
name: '退役军人',
count: 54,
icon: require('@/assets/images/42.png')
},
{
name: '困难毕业生',
count: 570,
icon: require('@/assets/images/43.png')
},
{
name: '领金人员',
count: 11,
icon: require('@/assets/images/44.png')
},
{
name: '长期失业人员',
count: 7,
icon: require('@/assets/images/45.png')
}
]);
const animatedValues = ref({
products: [0, 0, 0, 0]
});
const animateNumber = (startValue, endValue, duration, updateCallback) => {
const startTime = Date.now();
const endTime = startTime + duration;
const animate = () => {
const currentTime = Date.now();
const progress = Math.min((currentTime - startTime) / duration, 1);
const currentValue = Math.floor(startValue + (endValue - startValue) * progress);
updateCallback(currentValue);
if (progress < 1) {
requestAnimationFrame(animate);
}
};
requestAnimationFrame(animate);
};
onMounted(() => {
products.value.forEach((item, index) => {
animateNumber(0, item.count, 2000, (value) => animatedValues.value.products[index] = value);
});
});
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.training-products-container {
padding: 24px;
min-height: 100vh;
color: #fff;
.products-section {
border-radius: 12px;
padding: 10px;
.products-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 60px;
.product-card {
border-radius: 8px;
display: flex;
align-items: center;
height: 280px;
&:hover {
transform: translateY(-4px);
border-color: rgba(24, 144, 255, 0.6);
box-shadow: 0 0 30px rgba(24, 144, 255, 0.25);
}
.icon {
width: 201px;
margin-right: 16px;
display: flex;
align-items: center;
justify-content: center;
background: rgba(24, 144, 255, 0.2);
border-radius: 12px;
padding: 10px;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
.info {
.label {
font-size: 1.5vw;
color: #8cc8ff;
margin-bottom: 8px;
font-family: "YSBTH";
@include textColor(#003D63, #ffffff);
}
.value {
font-size: 2.2vw;
font-weight: bold;
color: #fff;
@include textColor(#8cc8ff, #ffffff);
span {
font-size: 1.5vw;
margin-left: 4px;
opacity: 0.8;
@include textColor(#8cc8ff, #ffffff);
}
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,134 @@
<template>
<!-- 供需技能匹配分析 -->
<div id="zdqycxEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick } from "vue";
import { rotate } from "ol/transform";
onMounted(() => {
lineChartFn();
});
const lineChartFn = (val) => {
var myChart = echarts.init(document.getElementById("zdqycxEcharts"));
var option = {
legend: {
show: true,
right: 10,
top: 10,
textStyle: { color: "#fff" },
},
legend: {
textStyle: { color: "#fff", fontSize: 40 },
selectedMode: false
},
tooltip: {
trigger: "axis",
axisPointer: { type: "shadow" }
},
grid: {
top: "10%",
right: "1%",
left: "5%",
bottom: "30%"
},
xAxis: [
{
type: "category",
axisTick: {
show: false
},
splitLine: {
show: false
},
axisPointer: {
type: "shadow"
},
axisLine: {
show: false,
lineStyle: {
color: "#fff"
},
show: false
},
axisTick: {
show: false,
},
axisLabel: {
show:true,
rotate: 20,
fontSize: 40,
interval: 0
},
data: ["电工证", "焊工证", '数控机床操作证书', '叉车证', '起重机械操作证', '钳工证', 'CAD 认证', '注册质量工程师', '安全生产管理人员证书', 'CAM认证', '注册安全工程师', '物流管理师证书'],
}
],
yAxis: [
{
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
},
axisLabel: {
fontSize: 40,
interval: 0
},
splitLine: {
show: true,
lineStyle: {
color: "rgb(15,54,90)",
type: "solid"
}
}
}
],
series: [
{
name: "",
type: "bar",
stack: 'total',
data: [36, 33, 29, 28, 24, 19, 18, 14, 8, 6, 5, 4],
barWidth: 60,
label: {
show: true,
position: 'top', // 将标签显示在柱状图的顶部
color: "#fff",
fontSize:40
// formatter: '{c} %' // {c}表示数据值,{d}%表示百分比,计算方式为 (c / 总和) * 100%
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#7d792e" },
{ offset: 1, color: "#f1c515" }
], false),
borderColor: new echarts.graphic.LinearGradient(0, 0, 0, 1,
[
{ offset: 1, color: '#f1c515' },
{ offset: 1, color: '#f1c515' }
], false),
shadowColor: "#f1c515",
shadowBlur: 2
},
},
}
]
};
option && myChart.setOption(option);
myChart.on("click", function (params) { });
window.onresize = function () {
myChart.resize();
};
};
</script>
<style lang="scss" scoped></style>

260
src/views/cpp/index.vue Normal file
View File

@ -0,0 +1,260 @@
<template>
<div class="bigScrenn cppBox">
<!-- 第一部分 -->
<div class="none-Cont">
<Head title='"产教评"融合培训平台'></Head>
<div class="conttent">
<div class="bt-Title tc"><span>三产技能人才分析</span></div>
<ul class="conttentOne flex just-between">
<li class="childOne">
<div class="title-small">产值及技能人才比对</div>
<div class="childCnt">
<Czjjnrcdd></Czjjnrcdd>
</div>
</li>
<li class="childOne">
<div class="title-small">各产业新兴行业分析</div>
<div class="childCnt">
<Czjjnrcdb></Czjjnrcdb>
</div>
</li>
</ul>
</div>
</div>
<!-- 第二个部分 -->
<div class="two-cont itemsBox">
<div class="bt-Title tc"><span>技术培训体系</span></div>
<ul class="cntBoxcpp flex">
<li class="childOne">
<div class="title-small">培训机构集群</div>
<div class="childCnt">
<TrainingInstitutions></TrainingInstitutions>
</div>
</li>
<li class="childOne">
<div class="title-small">培训项目分布</div>
<div class="childCnt">
<Pxxm></Pxxm>
</div>
</li>
<li class="childOne">
<div class="title-small">培训课程分类</div>
<div class="childCnt">
<sjpx></sjpx>
</div>
</li>
<li class="childOne">
<div class="title-small">企业定制培训班</div>
<div class="childCnt">
<Qyzdpxb></Qyzdpxb>
</div>
</li>
<li class="childOne">
<div class="title-small">培训成果</div>
<div class="childCnt">
<pxcg></pxcg>
</div>
</li>
<li class="childOne">
<div class="title-small">重点培训群体</div>
<div class="childCnt">
<zdpxqt></zdpxqt>
</div>
</li>
</ul>
</div>
<!-- 第三部分-->
<div class="two-cont">
<div class="bt-Title tc"><span>三方评价体系</span></div>
<ul class="cntBoxcpp cntBoxcpp2 flex">
<li class="childOne">
<div class="title-small">三方评价机构构成</div>
<div class="childCnt">
<pfjgfb></pfjgfb>
</div>
</li>
<li class="childOne">
<div class="title-small">三产技能认证数量</div>
<div class="childCnt">
<bfzs></bfzs>
</div>
</li>
</ul>
<div class="cntBoxcpp cntBoxcpp2 cntbox555">
<div class="title-small">职业资格证书颁发情况</div>
<!-- <div class="chartsBox"> -->
<Zyzgzs />
<!-- </div> -->
</div>
</div>
</div>
</template>
<script setup>
import Czjjnrcdd from './components/czjjnrcdd.vue';
import Czjjnrcdb from './components/czjjnrcdb.vue';
import TrainingInstitutions from './components/trainingInstitutions.vue';
import Pxxm from './components/pxxm.vue';
import Qyzdpxb from './components/qyzdpxb.vue';
import sjpx from './components/sjpx.vue';
import Zyzgzs from './components/zyzgzs.vue';
import zdpxqt from './components/zdpxqt.vue';
import pxcg from './components/pxcg.vue';
import bfzs from './components/bfzs.vue';
import pfjgfb from './components/pfjgfb.vue';
import Head from "@/views/largeScreen/layout/head.vue";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import {
ref,
reactive,
onMounted,
onUnmounted,
getCurrentInstance,
onBeforeUnmount
} from "vue";
const { proxy } = getCurrentInstance();
const data = reactive({
});
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0deg, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.cppBox {
width: 100%;
background: url("~@/assets/images/par_bg.jpg") no-repeat center center;
background-size: 100% 100%;
padding: 0 60px;
box-sizing: border-box;
}
// 第一部分
.none-Cont {
// height: calc(100% / 3);
height: 1800px;
position: relative;
.conttent {
position: absolute;
height: calc(100% - 310px);
width: 100%;
overflow: auto;
top: 9vw;
padding: 0 10px 10px;
box-sizing: border-box;
background: url("~@/assets/images/mb.png") no-repeat center center;
background-size: 100% 100%;
.conttentOne {
width: 100%;
height: calc(100% - 150px);
padding-bottom: 20px;
box-sizing: border-box;
padding-top: 60px;
padding-left: 20px;
padding-right: 30px;
.childOne {
width: 49%;
height: 100%;
background: url("~@/assets/images/bg_16.png") no-repeat center center;
background-size: 100% 100%;
.childCnt {
height: calc(100% - 80px);
overflow: hidden;
}
}
}
}
}
// 第二三不部分
.two-cont {
// height: calc(100% / 3);
height: 1800px;
// background: url("~@/assets/images/bg_13.png") no-repeat center center;
background: url("~@/assets/images/mb.png") no-repeat center center;
background-size: 100% 100%;
.cntBoxcpp {
height: calc(100% - 160px);
overflow: hidden;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
padding: 60px 10px 10px 10px;
box-sizing: border-box;
.childOne {
width: 33%;
height: 50%;
background: url("~@/assets/images/bg_16.png") no-repeat center center;
background-size: 100% 100%;
.childCnt {
height: calc(100% - 80px);
overflow: hidden;
}
}
}
.cntBoxcpp2 {
height: calc((100% - 160px) / 2);
.childOne {
width: 49%;
height: 100%;
}
}
.cntbox555{
background: url("~@/assets/images/999999.png") no-repeat center center;
background-size: 100% 100%;
}
}
.bt-Title {
height: 140px;
line-height: 200px;
// background: url("~@/assets/images/bg_14.png") no-repeat center center;
background-size: 100% 100%;
span {
font-size: 2.8vw;
@include textColor(#499fe2, #ffffff);
font-family: "YSBTH";
}
}
.title-small {
height: 80px;
line-height: 80px;
padding-left: 150px;
margin: 10px 0;
box-sizing: border-box;
font-size: 2.2vw;
font-family: "YSBTH";
position: relative;
&::before {
position: absolute;
content: "";
left: 50px;
top: 50%;
transform: translateY(-50%);
width: 68px;
height: 68px;
background: url("~@/assets/images/icon_20.png") no-repeat center center;
background-size: 100% 100%;
}
}
</style>

View File

@ -0,0 +1,109 @@
<template>
<!-- 保供预警 -->
<div class="bgyjBox">
<ul class="bgyj-top flex mt4 mb8 pl10 pr10">
<li class="bgyj-top-item flex align-center" v-for="(it,idx) in dataInfo.qyData" :key="idx">
<div class="left"></div>
<div class="gapline"></div>
<div class="right f20">{{it.num}} <span class="ml4"></span></div>
</li>
</ul>
<ul class="bgyj-bottom flex pl20 pr20">
<li class="bgyj-bottom-item flex mr4" v-for="(it,idx) in dataInfo.ryData" :key="idx">
<div class="mr8"><img :src="it.icon" alt=""></div>
<div class="">
<div class="num f20" :class="'num'+idx">{{it.num}}</div>
<div class="text f14">{{it.mc}}</div>
</div>
</li>
</ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, reactive,defineProps, onUnmounted } from "vue";
const props = defineProps({
data:Object,
})
const dataInfo = reactive({
qyData:[
{ lx:'yjzs',num:300},
{ lx:'qtyj',num:300},
],
ryData:[
{ mc:'重点岗位缺口预警', num:5, icon:require('@/assets/images/icon12.png')},
{ mc:'经纪人分配预警', num:5, icon:require('@/assets/images/icon13.png')},
{ mc:'领金分配预警', num:1500, icon:require('@/assets/images/icon14.png')},
]
})
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 70%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.bgyjBox{
width: 100%;
height: 100%;
overflow: hidden;
.bgyj-top{
width: 100%;
height: 74px;
.bgyj-top-item{
width: 50%;
height: 74px;
.left{
width: 50%;
height: 60px;
background: url('~@/assets/images/bg08.png') no-repeat left bottom;
background-size: 100% 100%;
}
.gapline{
width: 3px;
height: 20px;
border-radius: 3px;
margin-right: 6px;
background: linear-gradient(to top, #d88f25 0%, #ffffff 70%);
}
.right{
font-weight: 600;
@include textColor(#d88f25,#ffffff)
}
}
.bgyj-top-item:nth-child(2){
.left{
background: url('~@/assets/images/bg09.png') no-repeat left bottom;
background-size: 100% 100%;
}
.gapline{
background: linear-gradient(to top, #5cb2f7 0%, #ffffff 70%);
}
.right{
@include textColor(#5cb2f7,#ffffff)
}
}
}
.bgyj-bottom-item{
flex: 1 0 0;
}
.text{
font-family: "YSBTH";
}
.num{
font-family: "YSBTH";
@include textColor(#0936ff,#ffffff);
}
.num1{
@include textColor(#5cb2f7,#ffffff);
}
.num2{
@include textColor(#31eafb,#ffffff);
}
}
</style>

View File

@ -0,0 +1,98 @@
<template>
<!-- 产业 产值岗位缺口趋势 -->
<ul class="flex align-center" style="width: 100%; height: 100%;align-items: center;">
<li class="itemQs" v-for="it in list" :key="it">
<!-- class="ml14" -->
<div style="text-align: center;"><img :src="it.icon" class="imgs" alt=""></div>
<!-- lh24 -->
<div class="ml14 text "><span>{{it.label}}</span></div>
<div class="line ml14"></div>
<div class="flex mt14">
<span class="info">产值</span>
<span class="num">{{it.cz}}亿
<span class="ml2"><img width="10" src="@/assets/images/up.png" alt=""> <span class="dwww">{{it.cyqs}}</span></span>
</span>
</div>
<div class="flex align-center mt10">
<span class="info">岗位缺口</span>
<span class="num num1">{{it.gwqk}}<span class="ml2"><img width="10" src="@/assets/images/up.png" alt=""><span class="dwww">{{it.zzl}}</span></span></span>
</div>
</li>
</ul>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick, reactive } from "vue";
const list = reactive([
  {label:'第一产业',cyqs:'3%',gwqk:1879,cz:'36.75',zzl:'1%',icon:require('@/assets/images/icon_32.png')},
  {label:'第二产业',cyqs:'6%',gwqk:6358,cz:'240.9',zzl:'3%',icon:require('@/assets/images/icon_41.png')},
  {label:'第三产业',cyqs:'7%',gwqk:4924,cz:'232.79',zzl:'4%',icon:require('@/assets/images/icon_25.png')},
])
onMounted(() => {
});
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0deg, $color1 0%, $color2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.itemQs{
flex: 1 0 0;
// padding: 0 4px;
box-sizing: border-box;
.imgs{
width: 2.567vw;
}
.text{
font-size: 1.2vw;
text-align: center;
font-weight: 600;
font-weight: bolder;
@include textColor(#0072FF, #ffffff);
}
.line{
height: 1vw;
margin:6px auto;
width: 50%;
// width: 3.542vw;
height: 0.208vw;
// margin-top: 6px;
// margin-bottom: 6px;
// margin-left: 20px;
background: url('~@/assets/images//icon_27.png') no-repeat center center;
background-size: 100% 100%;
}
.info{
display: inline-block;
// width: 43%;
text-align: right;
// font-size: 14px;
font-size: 1.5rem;
line-height: 1.5vw;
font-family: "icrosoft YaHei";
font-weight: 600;
white-space: nowrap;
}
.num{
display: inline-block;
width: 60%;
white-space: nowrap;
font-size: 2rem;
margin-top: 6px;
font-weight: 600;
color: #fff;
}
.num1{
margin-top: 2px !important;
margin-left: 4px !important;
}
}
.dwww{
@include textColor(#03c087, #ffffff);
}
</style>

View File

@ -0,0 +1,139 @@
<template>
<!-- 产业岗位缺口趋势 -->
<div id="zcsbEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick } from "vue";
onMounted(() => {
lineChartFn();
});
const lineChartFn = (val) => {
var myChart = echarts.init(document.getElementById("zcsbEcharts"));
var option = {
legend: {
show: true,
right: 10,
top: 10,
textStyle: { color: "#fff" },
data: ["第一产业", "第二产业",'第三产业']
},
tooltip: {
trigger: "axis",
axisPointer: { type: "shadow" }
},
grid: {
top: "24%",
right: "4%",
left: "10%",
bottom: "12%"
},
xAxis: [
{
type: "category",
axisLabel: { interval: 0, rotate: 0 },
axisLine: { lineStyle: { color: "#fff" } },
axisTick:{
show:false,
},
data: ["一月", "二月", "三月", "四月", "五月", "六月"]
}
],
yAxis: [
{
axisLabel: { formatter: "{value}", color: "#fff" },
axisLine: {
show: false,
lineStyle: { color: "rgba(255,255,255,1)" }
},
splitLine: {
lineStyle: { color: "rgba(255,255,255,0.2)" }
}
}
],
series: [
{
name: "第一产业",
type: "bar",
data: [20, 30, 40, 12, 50, 20],
barWidth: 12,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#7d792e" },
{ offset: 1, color: "#f1c515" }
],false),
borderColor:new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset:1,color:'#f1c515'},
{ offset:1, color:'#f1c515'}
],false),
shadowColor: "#f1c515",
shadowBlur: 2
},
},
},
{
name: "第二产业",
type: "bar",
data: [10, 10, 10, 20, 30, 40],
barWidth: 12,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#0488cf" },
{ offset: 1, color: "#01a3f7" }
],false),
borderColor:new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset:1, color:'#01a3f7' },
{ offset:0.8, color:'#01a3f7'}
],false),
shadowColor: "#01a3f7",
shadowBlur: 2
},
},
},
{
name: "第三产业",
type: "bar",
data: [10, 20, 30, 20, 40, 20],
barWidth: 12,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#13a2a1" },
{ offset: 1, color: "#16dacd" }
],false),
borderColor:new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset:1, color:'#16dacd' },
{ offset:0.8, color:'#16dacd'}
],false),
shadowColor: "#16dacd",
shadowBlur: 2
},
},
},
]
};
option && myChart.setOption(option);
myChart.on("click", function (params) {});
window.onresize = function () {
myChart.resize();
};
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,84 @@
<template>
<!-- 服务质量预警 -->
<div class="zdwdcdBox flex align-center">
<div><img src="~@/assets/images/icon_31.png" alt=""></div>
<ul class="cntbox ml5 mr20">
<li class="cntItem flex just-between align-center" v-for="it in dataInfo" :key="it">
<span class="text">{{it.label}}</span>
<span class="num">{{it.num}} <span></span></span>
</li>
</ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, reactive,defineProps, onUnmounted } from "vue";
const props = defineProps({
data:Object,
})
const dataInfo = reactive([
{ label:'劳务经纪人差评聚集',num:2 },
{ label:'培训差评聚集',num:0 },
{ label:'入园机构差评聚集',num:0 },
])
let timer = ref(null)
onMounted(()=>{
// timer.value = setInterval(()=>{
// if(dataInfo[0].num > 300) dataInfo[0].num = 100;
// else dataInfo[0].num = dataInfo[0].num + 12;
// if(dataInfo[1].num < 10) dataInfo[1].num = 50;
// else dataInfo[1].num -= 4;
// if(dataInfo[2].num > 100) dataInfo[2].num = 20;
// else dataInfo[2].num += 4;
// },3000)
})
onUnmounted(()=>{
clearInterval(timer.value)
})
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 70%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.zdwdcdBox{
width: 100%;
height: 100%;
overflow: hidden;
img{
width: 4.567vw;
}
.cntbox{
flex: 1 0 0;
display: flex;
flex-direction: column;
justify-content: space-around;
height: 100%;
padding-top: 5px;
padding-bottom: 10px;
box-sizing: border-box;
.text{
font-size: 1vw;
font-family: "icrosoft YaHei";
}
.num{
font-size: 1.4vw;
@include textColor(#05fc64,#ffffff);
span{
@include textColor(#ffffff,#ffffff);
}
}
}
}
</style>

View File

@ -0,0 +1,129 @@
<template>
<!-- 岗位缺口需求 -->
<div class="cardCnt relative flex align-center">
<div class="bottom-item-left">
<div class="leftImg">
<div class="sirxle" ></div>
</div>
</div>
<ul class="bottom-item-right noScollLine">
<li class="itemChild" v-for="item in dataObj.countList" :key="item">
<div class="label">
<span class="imgicon mr10" :style="{background:item.color}"></span>
{{item.label}}
</div>
<div class="num">{{item.num}}</div>
<div class="per" :style="{color:item.color}">{{item.persont}}</div>
</li>
</ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, reactive,defineProps, onUnmounted } from "vue";
const props = defineProps({
data:Object,
})
const dataObj = reactive({
countList:[
{color:'#1AB1F0',label:'普工',num:0,persont:'0%'},
{color:'#1EE7E7',label:'车工',num:0,persont:'0%'},
{color:'#F9F05E',label:'叉车司机',num:0,persont:'0%'},
{color:'#FFAC26',label:'家政保洁',num:0,persont:'0%'},
{color:'#00FFA2',label:'搬运工',num:0,persont:'0%'},
{color:'#5C49E9',label:'其他',num:0,persont:'0%'},
]
})
</script>
<style lang="scss" scoped>
.cardCnt{
height: 100%;
overflow: hidden;
padding: 4px;
box-sizing: border-box;
position: relative;
.bottom-item-left{
width: 120px;
height: 120px;
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
.leftImg{
width: 100%;
height: 100%;
&::before{
position: absolute;
content: '';
left: 0;
top: 0;
width: 120px;
height: 120px;
background: url('~@/assets/images/sircleOut.png') no-repeat center center;
background-size: 100% 100%;
}
&::after{
position: absolute;
content: '';
left: 36px;
top: 37px;
width: 50px;
height: 50px;
background: url('~@/assets/images/bg_05.png') no-repeat center center;
background-size: 100% 100%;
}
.sirxle{
position: absolute;
width: 91px;
height: 91px;
left: 15px;
top: 15px;
background: url('~@/assets/images/sircleIn.png') no-repeat;
background-size: 100% 100%;
}
}
}
.bottom-item-right{
display: flex;
flex-direction: column;
justify-content: center;
width: calc(100% - 150px);
height: 100%;
overflow: hidden;
overflow-y: auto;
margin-left: 30px;
position: absolute;
left: 116px;
top: 50%;
transform: translateY(-50%);
.itemChild {
display: flex;
align-items: center;
height: 26px;
border-bottom: 1px dashed #0072FF;
}
.label{
width: 60%;
.imgicon{
display: inline-block;
width: 13px;
height: 10px;
border-radius: 2px;
transform: rotate(-3deg) skew(6deg,6deg);
}
}
.num{
width: 20%;
}
.per{
width: 20%;
}
}
}
</style>

View File

@ -0,0 +1,80 @@
<template>
<!-- 合规监管预警 -->
<div class="zdwdcdBox flex align-center">
<div><img src="~@/assets/images/icon_30.png" alt=""></div>
<ul class="cntbox ml10 mr30">
<li class="cntItem flex just-between align-center" v-for="it in dataInfo" :key="it">
<span class="text">{{it.label}}</span>
<span class="num">{{it.num}} <span></span></span>
</li>
</ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, reactive,defineProps, onUnmounted } from "vue";
const props = defineProps({
data:Object,
})
const dataInfo = reactive([
{ label:'劳动用工安全指标',num:7 },
{ label:'劳动纠纷风险异常',num:1 },
])
let timer = ref(null)
onMounted(()=>{
// timer.value = setInterval(()=>{
// if(dataInfo[0].num > 300) dataInfo[0].num = 100;
// else dataInfo[0].num = dataInfo[0].num + 12;
// if(dataInfo[1].num < 10) dataInfo[1].num = 50;
// else dataInfo[1].num -= 4;
// },3000)
})
onUnmounted(()=>{
clearInterval(timer.value)
})
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 70%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.zdwdcdBox{
width: 100%;
height: 100%;
overflow: hidden;
img{
width: 4.567vw;
}
.cntbox{
flex: 1 0 0;
display: flex;
flex-direction: column;
justify-content: space-around;
height: 100%;
padding-top: 20px;
padding-bottom: 20px;
box-sizing: border-box;
.text{
font-size: 1vw;
font-family: "icrosoft YaHei";
}
.num{
font-size: 1.4vw;
@include textColor(#0568fc,#ffffff);
span{
@include textColor(#ffffff,#ffffff);
}
}
}
}
</style>

View File

@ -0,0 +1,80 @@
<template>
<!-- 劳务市场异常预警 -->
<div class="zdwdcdBox flex align-center">
<div><img src="~@/assets/images/icon_29.png" alt=""></div>
<ul class="cntbox ml10 mr30">
<li class="cntItem flex just-between align-center" v-for="it in dataInfo" :key="it">
<span class="text f18">{{it.label}}</span>
<span class="num f20">{{it.num}} <span></span></span>
</li>
</ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, reactive,defineProps, onUnmounted } from "vue";
const props = defineProps({
data:Object,
})
const dataInfo = reactive([
{ label:'劳务中介活跃预警',num:2 },
{ label:'用工风险预警',num:5 },
])
let timer = ref(null)
onMounted(()=>{
// timer.value = setInterval(()=>{
// if(dataInfo[0].num > 300) dataInfo[0].num = 100;
// else dataInfo[0].num = dataInfo[0].num + 15;
// if(dataInfo[1].num < 100) dataInfo[1].num = 500;
// else dataInfo[1].num -= 15;
// },3000)
})
onUnmounted(()=>{
clearInterval(timer.value)
})
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 70%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.zdwdcdBox{
width: 100%;
height: 100%;
overflow: hidden;
img{
width: 4.567vw;
}
.cntbox{
flex: 1 0 0;
display: flex;
flex-direction: column;
justify-content: space-around;
height: 100%;
padding-top: 20px;
padding-bottom: 20px;
box-sizing: border-box;
.text{
font-size: 1vw;
font-family: "icrosoft YaHei";
}
.num{
font-size: 1.4vw;
@include textColor(#fca505,#ffffff);
span{
@include textColor(#ffffff,#ffffff);
}
}
}
}
</style>

View File

@ -0,0 +1,85 @@
<template>
<!-- 用工供需风险预警 -->
<div class="zdwdcdBox flex align-center">
<div><img src="~@/assets/images/icon_28.png" alt=""></div>
<ul class="cntbox ml10 mr30">
<li class="cntItem flex just-between align-center" v-for="it in dataInfo" :key="it">
<span class="text">{{ it.label }}</span>
<span class="num">{{ it.num }} <span></span></span>
</li>
</ul>
</div>
</template>
<script setup>
import Statis from "@/components/statis.vue";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, reactive, defineProps, onUnmounted } from "vue";
const props = defineProps({
data: Object,
})
const dataInfo = reactive([
{ label: '企业用工缺口率', num: 8 },
{ label: '技能错配指数', num: 3 },
{ label: '离职潮预警', num: 4 },
])
let timer = ref(null)
onMounted(() => {
// timer.value = setInterval(()=>{
// if(dataInfo[0].num > 300) dataInfo[0].num = 100;
// else dataInfo[0].num = dataInfo[0].num + 15;
// if(dataInfo[1].num < 100) dataInfo[1].num = 500;
// else dataInfo[1].num -= 15;
// if(dataInfo[2].num >200) dataInfo[2].num = 200;
// else dataInfo[2].num += 5;
// },3000)
})
onUnmounted(() => {
clearInterval(timer.value)
})
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 70%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.zdwdcdBox {
width: 100%;
height: 100%;
overflow: hidden;
img{
width: 4.567vw;
}
.cntbox {
flex: 1 0 0;
display: flex;
flex-direction: column;
justify-content: space-around;
height: 100%;
.text {
font-size: 1vw;
color: #fff;
font-family: "icrosoft YaHei";
}
.num {
font-size: 1.4vw;
@include textColor(#f70404, #ffffff);
span {
@include textColor(#ffffff, #ffffff);
}
}
}
}
</style>

View File

@ -0,0 +1,87 @@
<template>
<!-- 重点保供企业分布 -->
<ul class="flex align-center"
style="width: 100%; height: 100%">
<li class="itemQs tc"
v-for="it in list"
:key="it">
<div><img :src="it.icon"></div>
<div class="text">{{ it.label }}</div>
<div class="line"></div>
<div class="info">
<Statis :count="it.gwqk" :height="4"
:len="3" danw="rem"/>
</div>
<div class="num">{{ it.dw }}</div>
</li>
</ul>
</template>
<script setup>
import Statis from "@/components/statis.vue";
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick, reactive, ref } from "vue";
const list = ref([
{ label: '第一产业', gwqk: 3, dw: '家', icon: require('@/assets/images/icon_37.png') },
{ label: '第二产业', gwqk: 93, dw: '家', icon: require('@/assets/images/icon_38.png') },
{ label: '第三产业', gwqk: 32, dw: '家', icon: require('@/assets/images/icon_39.png') },
])
onMounted(() => {
});
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0deg, $color1 0%, $color2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.itemQs {
flex: 1 0 0;
img {
width: 2.567vw;
}
.text {
font-size: 1.2vw;
font-weight: 600;
font-weight: bolder;
@include textColor(#03c087, #ffffff);
}
.line {
margin: 0.208vw auto 0.313vw;
width: 3.542vw;
height: 0.208vw;
background: url("~@/assets/images/icon_27.png") no-repeat center center;
background-size: 100% 100%;
}
.info {
font-size: 1.042vw;
line-height: 1.563vw;
font-family: "DigifaceWide";
}
.num {
text-align: center;
font-size: 1.9rem;
line-height: 1.25vw;
font-family: "DigifaceWide";
}
}
::v-deep .fp-box li {
width: 0.729vw;
margin-right: 0.3vw;
height: 4rem;
span{
height: 4rem;
line-height: 4rem;
font-size: 4rem;
}
}
</style>

View File

@ -0,0 +1,143 @@
<template>
<!-- 重点企业缺口需求 -->
<div class="review_box" id="review_box" style="width:100%;height:100%;overflow: hidden" @mouseover="rollStop()" @mouseout="rollStart(60)">
<ul id="comment1" class="zdqyqkxqBox noScollLine">
<li v-for="(it,indx) in list" :key="indx" class="lineItem flex align-center mb4">
<div class="label">
<span class="order mr4" :style="{color:indx < 3 ? '#01d0db' : ''}">TOP.{{indx+1}}</span>
<img src="@/assets/images/icon_03.png" alt="">
<span class="ml4 text one_text_detail" :style="{color:indx < 3 ? '#01d0db' : ''}">{{it.mc}}</span>
</div>
<div class="line">
<div class="lineOut">
<div class="persont" :style="{width:it.persont}"></div>
</div>
</div>
<div class="num">{{it.num}}</div>
</li>
</ul>
<ul id="comment2" class="zdqyqkxqBox noScollLine"></ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref,defineProps, onUnmounted } from "vue";
const props = defineProps({
data:Object,
})
const list = ref([
{mc:'数控操作技师',persont:'90%',num:1079},
{mc:'车工(服装制造)',persont:'80%',num:867},
{mc:'应用工程师',persont:'70%',num:804},
{mc:'交易业务专员',persont:'60%',num:778},
{mc:'产品实施顾问',persont:'50%',num:352},
{mc:'印后机长',persont:'40%',num:254},
{mc:'研发工程师(电子/机械)',persont:'30%',num:89},
{mc:'质量技术员/检验员',persont:'20%',num:73},
{mc:'电商运营负责人',persont:'10%',num:51},
{mc:'消防运维技术员',persont:'5%',num:17},
])
const timer = ref(null)
onMounted(()=>{
roll(60)
})
onUnmounted(()=>{
if(timer.value) clearInterval(timer.value)
})
// 滚动
function roll(t){
var ul1 = document.getElementById("comment1");
var ul2 = document.getElementById("comment2");
var ulbox = document.getElementById("review_box");
ul2.innerHTML = ul1.innerHTML;
ulbox.scrollTop = 0;
rollStart(t);
}
// 开始滚动
function rollStart (t){
var ul1 = document.getElementById("comment1");
var ul2 = document.getElementById("comment2");
var ulbox = document.getElementById("review_box");
rollStop();
timer.value = setInterval(()=>{
// 当滚动高度大于列表内容高度时恢复为0
if (ulbox.scrollTop >= 204) {
ulbox.scrollTop = 0;
} else {
ulbox.scrollTop++;
}
}, t);
}
// 停止滚动
function rollStop (){
clearInterval(timer.value);
}
</script>
<style lang="scss" scoped>
.zdqyqkxqBox{
width: 100%;
height: 100%;
overflow: hidden;
overflow-y: auto;
padding: 6px 0;
box-sizing: border-box;
.lineItem{
.label{
width: 36%;
font-family: "DigifaceWide";
font-size: 12px;
.order{
display: inline-block;
width: 46px;
}
.text{
display: inline-block;
width: 80px;
white-space: nowrap;
}
}
.line {
width: 54%;
height: 12px;
padding: 0 4px;
border: 1px solid #1e3a44;
border-radius: 4px;
display: flex;
align-items: center;
.lineOut{
width: 100%;
height:5px;
background: rgba(32, 74, 111, 0.5);
.persont {
height: 5px;
background: linear-gradient(60deg, #187593 0%, #aff1f4 100%);
border-radius: 10px;
position: relative;
&::after{
position: absolute;
content: "";
right: -6px;
top: -7px;
width: 18px;
height: 19px;
background: url('~@/assets/images/icon_04.png') no-repeat left bottom;
background-size: 100%;
}
}
}
}
.num{
width: 10%;
margin-left: 10px;
}
}
}
</style>

View File

@ -0,0 +1,153 @@
<template>
<!-- 重点企业缺口需求 -->
<div class="review_box" id="review_box" style="width:100%;height:100%;overflow: hidden" @mouseover="rollStop()"
@mouseout="rollStart(60)">
<ul id="comment1" class="zdqyqkxqBox noScollLine">
<li v-for="(it, indx) in list" :key="indx" class="lineItem flex align-center mb4">
<div class="label">
<span class="order mr4" :style="{ color: indx < 3 ? '#01d0db' : '' }">TOP.{{ indx + 1 }}</span>
<img src="@/assets/images/icon_03.png" alt="">
<span class="ml4 text one_text_detail" :style="{ color: indx < 3 ? '#01d0db' : '' }">{{ it.mc }}</span>
</div>
<div class="line">
<div class="lineOut">
<div class="persont" :style="{ width: it.persont }"></div>
</div>
</div>
<div class="num">{{ it.num }}</div>
</li>
</ul>
<ul id="comment2" class="zdqyqkxqBox noScollLine"></ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, defineProps, onUnmounted } from "vue";
const props = defineProps({
data: Object,
})
const list = ref([
{ mc: '数控操作技师', persont: '90%', num: 1079 },
{ mc: '车工(服装制造)', persont: '80%', num: 867 },
{ mc: '应用工程师', persont: '70%', num: 804 },
{ mc: '交易业务专员', persont: '60%', num: 778 },
{ mc: '产品实施顾问', persont: '50%', num: 352 },
{ mc: '印后机长', persont: '40%', num: 254 },
{ mc: '研发工程师(电子/机械)', persont: '30%', num: 89 },
{ mc: '质量技术员/检验员', persont: '20%', num: 73 },
{ mc: '电商运营负责人', persont: '10%', num: 51 },
{ mc: '消防运维技术员', persont: '5%', num: 17 },
])
const timer = ref(null)
onMounted(() => {
roll(60)
})
onUnmounted(() => {
if (timer.value) clearInterval(timer.value)
})
// 滚动
function roll(t) {
var ul1 = document.getElementById("comment1");
var ul2 = document.getElementById("comment2");
var ulbox = document.getElementById("review_box");
ul2.innerHTML = ul1.innerHTML;
ulbox.scrollTop = 0;
rollStart(t);
}
// 开始滚动
function rollStart(t) {
var ul1 = document.getElementById("comment1");
var ul2 = document.getElementById("comment2");
var ulbox = document.getElementById("review_box");
rollStop();
timer.value = setInterval(() => {
// 计算滚动临界值
const maxScroll = ul1.offsetHeight;
if (ulbox.scrollTop >= maxScroll) {
ulbox.scrollTop = 0;
} else {
ulbox.scrollTop++;
}
}, t);
}
// 停止滚动
function rollStop() {
clearInterval(timer.value);
}
</script>
<style lang="scss" scoped>
.zdqyqkxqBox {
width: 100%;
height: 100%;
overflow: hidden;
overflow-y: auto;
padding: .375rem 0;
box-sizing: border-box;
.lineItem {
.label {
width: 38%;
font-size: 0.625vw;
.order {
display: inline-block;
width: 2.396vw;
}
.text {
display: inline-block;
width: 4.167vw;
white-space: nowrap;
// font-weight: 600;
font-family: "icrosoft YaHei";
}
}
.line {
width: 54%;
height: 0.625vw;
padding: 0 0.208vw;
border: 1px solid #1e3a44;
border-radius: 0.208vw;
display: flex;
align-items: center;
.lineOut {
width: 100%;
height: 0.26vw;
background: rgba(32, 74, 111, 0.5);
.persont {
height: 0.26vw;
background: linear-gradient(0deg, #187593 0%, #aff1f4 100%);
border-radius: 0.521vw;
position: relative;
&::after {
position: absolute;
content: "";
right: -0.313vw;
top: -0.365vw;
width: 0.938vw;
height: 0.99vw;
background: url('~@/assets/images/icon_04.png') no-repeat left bottom;
background-size: 100%;
}
}
}
}
.num {
width: 10%;
margin-left: 0.521vw;
}
}
}
</style>

View File

@ -0,0 +1,114 @@
<template>
<div class="bigScrenn">
<!-- 头部 -->
<Head title="兴蜀数智化驾驶舱"></Head>
<!-- 左边展开-关闭按钮 -->
<div class="showNeun transition" @click="isOpen_L = !isOpen_L" :style="{ left: isOpen_L ? '23vw' : '0' }"></div>
<!-- 左边 -->
<div class="asidemodel transition modelImgleft " :style="{ left: isOpen_L ? '1vw' : '-22.369vw' }">
<div class="asideHead">
<span>产业岗位需求</span>
</div>
<div class="modelBox ">
<Module v-for="(item, idx) in asideMeun.leftMeun" :key="idx" :data="item" :len="asideMeun.leftMeun.length" />
</div>
</div>
<!-- 中间 -->
<CenterModel></CenterModel>
<!-- 右边展开 - 关闭按钮 -->
<div class="showNeun showNeunR transition" @click="isOpen_R = !isOpen_R"
:style="{ right: isOpen_R ? '23vw' : '0' }">
</div>
<!-- 右边 -->
<div class="asidemodel asidemodelR transition modelImgright" :style="{ right: isOpen_R ? '1vw' : '-22.369vw' }">
<div class="asideHead asideHeadR tr">
<span>保供预警体系</span>
</div>
<div class="modelBox ">
<Module v-for="(item, idx) in asideMeun.rightMeun" :key="idx" :data="item" :len="asideMeun.rightMeun.length" />
</div>
</div>
<!-- 弹窗 -->
<HomeDialogInfo v-model="dialogShow" />
</div>
</template>
<script setup>
import Head from './layout/headHome.vue'
import CenterModel from './layout/centerModel.vue'
import Module from "./layout/module.vue";
import HomeDialogInfo from "@/components/homeDialogInfo/index.vue";
import openWebSocket from "@/utils/webSocket.js";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { ref, reactive, onMounted, onUnmounted, getCurrentInstance, onBeforeUnmount } from "vue";
import { fa } from 'element-plus/es/locale.mjs';
const { proxy } = getCurrentInstance();
const isOpen_L = ref(true); //展开菜单-左边
const isOpen_R = ref(true); //展开菜单 - 右边
const dialogShow = ref(false);
const asideMeun = reactive({
leftMeun: [
{ mkMc: "产业产值、岗位缺口趋势", mkLydz: "cycz_gwqk_card" },
{ mkMc: "重点保供企业分布", mkLydz: "zdbgqy_card" },
{ mkMc: "缺口岗位TOP10", mkLydz: "zdqyqkxq_card" },
],
rightMeun: [
{ mkMc: "用工供需风险预警", mkLydz: "yggxfxyj_card" },
{ mkMc: "劳务市场异常预警", mkLydz: "lwscycyj_card" },
{ mkMc: "合规监管预警", mkLydz: "hgjgyj_card" },
{ mkMc: "服务质量预警", mkLydz: "fwzlyj_card" }
],
})
onMounted(() => {
getWebSocketData()
})
// 获取WebSocket数据
function getWebSocketData() {
let dws = openWebSocket.getInstance();
dws.connect((res) => {
// 接收发送消息
dws.ws.onmessage = (e) => {
let dataInfo = JSON.parse(e.data).data;
console.log(dataInfo, 'dataInfo');
if (dataInfo == 1) {
dialogShow.value = true;
} else {
dialogShow.value = false;
}
};
});
}
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.transition {
transition: all 0.5s;
}
// .modelImgleft{
// background: url('~@/assets/images/left.png') no-repeat center center;
// background-size: 100% 100%;
// }
// .modelImgright{
// background: url('~@/assets/images/right.png') no-repeat center center;
// background-size: 100% 100%;
// }
// .modelCopy{
// width: 100%;
// height: 100%;
// position: relative;
// .thewe{
// transform: perspective(7.25vw) rotateY(-2deg) rotate(-5deg);
// position: absolute;
// left: -6px;
// width: 100%;
// bottom: 16px;
// height: calc((100% / 3) - 60px);
// }
// }
</style>

View File

@ -0,0 +1,348 @@
<template>
<div class="contantHome">
<div class="countTop">
<!-- 中间统计 -->
<ul class="centerBox">
<li class="center-item" v-for="(it,idx) in centerList" :key="idx">
<div class="label">{{it.label}}</div>
<div class="count">
<Statis :count="it.num" :height="86" :len="2" bg="countBg" />
<span class="num">( {{it.dw}} )</span>
</div>
</li>
</ul>
</div>
<!-- 边缘统计 -->
<div class="num_bj" :class="'num_bj'+idx" v-for="(it,idx) in list" :key="idx">
<div class="by_title">{{it.label}}</div>
<div class="by_num">{{it.num}}</div>
<div class="by_dw">{{it.dw}}</div>
</div>
<!-- 按钮 -->
<div class="btn-home"></div>
<!-- 评语 -->
<div class="home-py">
<div class="tc"><img src="@/assets/images/icon_02.png" alt=""></div>
<div class="tc text-one"><span>2023年获评</span></div>
<div class="tc text-two"><span>成都市级产业园</span></div>
<div class="tc text-three"><span>崇州市人力资源</span></div>
<div class="tc text-three"><span>服务产业园</span></div>
</div>
<!-- 底部按钮 -->
<ul class="homeFoot">
<li v-for="(it,idx) in footBtn" :key="idx" class="absolute homeFootItem" :class="'homeFootItem'+idx">
<img class="footImg" :src="it.icon" alt="">
<div class="tc footlabel f16">{{it.label}}</div>
</li>
</ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import Statis from "@/components/statis.vue";
import emitter from "@/utils/eventBus.js";
import { ref, reactive, onMounted, onUnmounted, getCurrentInstance ,onBeforeUnmount} from "vue";
const { proxy } = getCurrentInstance();
const list = reactive([
{ label:'重点企业',num:128,dw:'家' },
{ label:'入驻机构',num:17,dw:'家' },
{ label:'合作区县数量',num:19,dw:'个' },
{ label:'经纪人数量',num:118,dw:'个' },
{ label:'岗位',num:13,dw:'万个' },
{ label:'用户总数',num:28,dw:'万人' },
{ label:'合作院校',num:36,dw:'家' },
{ label:'链主企业',num:8,dw:'家' },
{ label:'培训课程',num:17,dw:'期' },
{ label:'技能认证',num:711,dw:'个' },
])
const centerList = reactive([
{label:'岗位总数',num:13,dw:'万个'},
{label:'就业人员',num:10,dw:'万人'},
])
const footBtn = reactive([
{label:'智能客服呼叫中心',width:120,icon:require('@/assets/images/icon_12.png') },
// {label:'区域合作',width:130,icon:require('@/assets/images/icon_13.png') },
{label:'蓝领直招中心',width:130,icon:require('@/assets/images/icon_14.png') },
{label:'综合服务一体机',width:130,icon:require('@/assets/images/icon_15.png') },
{label:'人力资源共享中心',width:140,icon:require('@/assets/images/icon_16.png') },
{label:'兴蜀来了APP',width:130,icon:require('@/assets/images/icon_17.png') },
{label:'跨企业培训中心',width:130,icon:require('@/assets/images/icon_18.png') },
{label:'智库平台',width:120,icon:require('@/assets/images/icon_19.png') },
])
onMounted(()=>{
// setInterval(()=>{
// centerList[0].num +=2;
// centerList[1].num +=1;
// },5000)
})
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0, $color1 0%, $color2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
// 中间
.contantHome{
position: relative;
top: 5.208vw;
left: 50%;
width: 43.958vw;
transform: translateX(-50%);
height: calc(100vh - 6.25vw);
z-index: 99;
.countTop{
position: relative;
width: 43.958vw;
height: 43.75vw;
top: -3.906vw;
background: url('~@/assets/images/home_center_new.png') no-repeat center center;
background-size: 100% 100%;
.centerBox{
position: absolute;
left: 50%;
top: 50%;
transform: translateX(-50%) translateY(-58%);
.center-item{
.label{
text-align: center;
font-size: 1.042vw;
// font-family: "HANYILINGXINTIJIAN";
line-height: 2.604vw;
@include textColor(#00ccff,#ffffff)
}
.count{
display: flex;
align-items: flex-end;
.num{
font-size: 0.938vw;
// font-family: "DigifaceRegular";
margin-left: 0.208vw;
@include textColor(rgba(0 ,61 ,99,0.2),#ffffff)
}
}
::v-deep .countBg{
width: 1.563vw;
height: 2.396vw;
& > span {
font-size: 1.563vw;
width: 1.458vw;
height: 2.24vw;
line-height: 2.24vw;
background: url('~@/assets/images/bg_01.png') no-repeat center center;
background-size: 100% 100%;
color: #0DE0FF;
}
}
}
}
}
.btn-home{
position: absolute;
top: 26.042vw;
left: 54%;
transform: translateX(-50%);
width: 20.313vw;
height: 2.448vw;
background: url('~@/assets/images/bg_02.png') no-repeat center center;
background-size: 100% 100%;
}
.home-py{
position: absolute;
top: 28.646vw;
left: 50%;
transform: translateX(-50%);
.tc{
margin: 0 auto;
img{
width: 2.865vw;
}
}
.text-one{
font-size: 1.563vw;
font-family: "YSBTH";
letter-spacing: 0.104vw;
span{
background: linear-gradient(0deg,#ffae01 10%,#ffffff 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
.text-two{
font-size: 1.927vw;
font-family: "YSBTH";
letter-spacing: 0.104vw;
span{
background: linear-gradient(0deg,#fd7c03 0%,#FFFFFF 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
.text-three{
font-size: 1.198vw;
line-height: 1.979vw;
letter-spacing: 0.104vw;
font-family: "YSBTH";
span{
background: linear-gradient(0deg,#00ccff 0%,#FFFFFF 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
}
.num_bj{
position: absolute;
.by_title{
font-size: 0.938vw;
font-family: "icrosoft YaHei";
}
.by_num{
text-align: center;
margin-top: 1.563vw;
color: #00FFA2;
font-size: 1.354vw;
}
.by_dw{
text-align: center;
font-size: 0.625vw;
margin-top: 0.208vw;
color: #0DE0FF;
font-family: "icrosoft YaHei";
}
}
.num_bj0{
top: 25.313vw;
left: 7.969vw;
}
.num_bj1{
top: 18.49vw;
left: 2.708vw;
}
.num_bj2{
top: 8.646vw;
left: 2.24vw;
}
.num_bj3{
top: 2.76vw;
left: 8.125vw;
}
.num_bj4{
top: -0.469vw;
left: 16.771vw;
}
.num_bj5{
top: -0.156vw;
left: 24.271vw;
}
.num_bj6{
top: 3.438vw;
left: 31.615vw;
}
.num_bj7{
top: 9.479vw;
left: 36.667vw;
}
.num_bj8{
top: 17.708vw;
left: 37.344vw;
}
.num_bj9{
top: 25.26vw;
left: 33.594vw;
}
// 底部
.homeFoot{
position:absolute ;
bottom: 0;
.footlabel{
font-size: 1.042vw;
font-weight: 600;
white-space: nowrap;
@include textColor(#00ccff,#ffffff)
}
.homeFootItem{
font-family: "icrosoft YaHei";
font-size: 0.625vw;
.footImg{
width: 6.25vw;
}
.footlabel{
width: 4.688vw;
white-space: pre-wrap;
margin-left: 0.521vw;
}
}
.homeFootItem0{
bottom: 3.49vw;
left: -6.25vw;
.footlabel{
width: 10.417vw;
white-space: pre-wrap;
margin-left: -2.083vw;
}
}
.homeFootItem1{
bottom: 6.406vw;
left: 1.823vw;
.footlabel{
font-size: 1.25vw;
width: 8.125vw;
margin-left: -0.729vw;
white-space: nowrap;
@include textColor(#ED860B,#ffffff);
}
}
.homeFootItem2{
bottom: 0.573vw;
left: 10vw;
.footlabel{
width: 8.125vw;
font-size: 1.042vw;
margin-left: -1.458vw;
white-space: nowrap;
}
}
.homeFootItem3{
bottom: -0.521vw;
left: 18.49vw;
.footlabel{
font-size: 1.25vw;
width: 10.02vw;
margin-left: -1.421vw;
@include textColor(#ff8c00,#ffffff);
}
}
.homeFootItem4{
bottom: 0.573vw;
left: 29.115vw;
.footlabel{
width: 6.771vw;
margin-left: -0.521vw;
}
}
.homeFootItem5{
bottom: 6.25vw;
left: 35.885vw;
.footlabel{
width: 7.813vw;
margin-left: -0.521vw;
@include textColor(#ff8c00,#ffffff);
}
}
.homeFootItem6{
bottom: 4.844vw;
left: 44.323vw;
.footlabel{
margin-left: 0.521vw;
}
}
}
}
</style>

View File

@ -0,0 +1,66 @@
<template>
<div class="homeHead">
<!-- <div class="left_Head">
<el-icon style="top:5px" color="#0DE7EE" :size="20"><Cloudy/></el-icon>
<span class="head_text ml5 mr5"></span>
<span class="head_text ml5 mr5">空气质量</span>
<span class="head_text ml5">8 ~ 13°C</span>
</div> -->
<div class="center_head" :text="props.title">
<span>{{props.title}}</span>
</div>
<!-- <div class="right_head">
<img src="@/assets/images/icon_01.png" alt="" class="setting">
<span class="head_text ml5 mr5">{{ hour + ":" + minute + ":" + second }}</span>
<span class="head_text ml5 mr5">{{weekenday}} </span>
<span class="head_text ml5">{{ datatime }}</span>
</div> -->
</div>
</template>
<script setup>
import { timeValidate ,weekValidate} from "@/utils/tools.js";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { ref, reactive, onMounted, onUnmounted, getCurrentInstance ,onBeforeUnmount} from "vue";
const { proxy } = getCurrentInstance();
const minute = ref("00"); //分
const second = ref("00"); //秒
const hour = ref("00"); //时
const day = ref();
const weekenday = weekValidate() //星期几
const datatime = ref(timeValidate(null,'ymd'));
const timersfm = ref(null);
const props = defineProps({
title:{
type:String,
default:'兴蜀数智化驾驶舱'
}
})
onMounted(() => {
timersfm.value = setInterval(() => {
CurrentTime();
}, 1000);
});
// 获取时分秒
function CurrentTime() {
const date = new Date();
hour.value = date.getHours();
minute.value = date.getMinutes();
second.value = date.getSeconds();
day.value = day.value < 10 ? "0" + day.value : day.value;
hour.value = hour.value < 10 ? "0" + hour.value : hour.value;
minute.value = minute.value < 10 ? "0" + minute.value : minute.value;
second.value = second.value < 10 ? "0" + second.value : second.value;
}
onUnmounted(() => {
clearInterval(timersfm.value)
});
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.head_text{
font-size: 1.8vw;
}
</style>

View File

@ -0,0 +1,66 @@
<template>
<div class="homeHeadsmall">
<div class="left_Head">
<el-icon style="top:5px" color="#0DE7EE" :size="20"><Cloudy/></el-icon>
<span class="head_text ml5 mr5"></span>
<span class="head_text ml5 mr5">空气质量</span>
<span class="head_text ml5">8 ~ 13°C</span>
</div>
<div class="center_head" :text="props.title">
<span>{{props.title}}</span>
</div>
<div class="right_head">
<img src="@/assets/images/icon_01.png" alt="" class="setting">
<span class="head_text ml5 mr5">{{ hour + ":" + minute + ":" + second }}</span>
<span class="head_text ml5 mr5">{{weekenday}} </span>
<span class="head_text ml5">{{ datatime }}</span>
</div>
</div>
</template>
<script setup>
import { timeValidate ,weekValidate} from "@/utils/tools.js";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { ref, reactive, onMounted, onUnmounted, getCurrentInstance ,onBeforeUnmount} from "vue";
const { proxy } = getCurrentInstance();
const minute = ref("00"); //分
const second = ref("00"); //秒
const hour = ref("00"); //时
const day = ref();
const weekenday = weekValidate() //星期几
const datatime = ref(timeValidate(null,'ymd'));
const timersfm = ref(null);
const props = defineProps({
title:{
type:String,
default:'兴蜀数智化驾驶舱'
}
})
onMounted(() => {
timersfm.value = setInterval(() => {
CurrentTime();
}, 1000);
});
// 获取时分秒
function CurrentTime() {
const date = new Date();
hour.value = date.getHours();
minute.value = date.getMinutes();
second.value = date.getSeconds();
day.value = day.value < 10 ? "0" + day.value : day.value;
hour.value = hour.value < 10 ? "0" + hour.value : hour.value;
minute.value = minute.value < 10 ? "0" + minute.value : minute.value;
second.value = second.value < 10 ? "0" + second.value : second.value;
}
onUnmounted(() => {
clearInterval(timersfm.value)
});
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
.head_text{
font-size: 2rem;
}
</style>

View File

@ -0,0 +1,73 @@
<!--
* @Author: your name
* @Date: 2024-12-04 17:01:59
* @LastEditTime: 2024-12-09 18:36:37
* @LastEditors: your name
* @Description: In User Settings Edit
* @FilePath: \tq_web_gd\src\views\largeScreen\layout\module.vue
-->
<template>
<div class="asideItem" :class="props.data.class" :style="changeHeight()">
<div class="topFlex">
<span class="title">{{ props.data.mkMc}}</span>
</div>
<div class="aside-content-all">
<component :is="mkModel" :data="props.data"/>
</div>
</div>
</template>
<script setup>
import emitter from "@/utils/eventBus.js";
import { ref, defineProps, watch, defineAsyncComponent } from "vue";
const props = defineProps({
data: Object,
len: {
type: Number,
default: 1
}
});
const mkModel = ref(null)
const modelList = ref([]);
watch(() => props.data,(val) => {
if(!val.mkLydz) return;
mkModel.value = defineAsyncComponent(() => import(`@/views/largeScreen/cards/${val.mkLydz}.vue`));
},{ immediate: true });
// 自适应高度
const changeHeight = () => {
if (props.len) {
let num = 100 / props.len;
return `height:calc(${num}% - 5px)`;
}
};
</script>
<style lang="scss" scoped>
.topFlex {
width: 100%;
height: 1.823vw;
line-height: 2.083vw;
padding-left: 1.719vw;
background: url('~@/assets/images/bg_10.png') no-repeat center center;
background-size: 100% 100%;
.title {
font-family: "icrosoft YaHei";
font-size: 1.2vw;
font-weight: 600;
white-space: nowrap;
background: linear-gradient(0deg, #21a5e1 0%, #ffffff 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
}
.aside-content-all {
height: calc(100% - 1.823vw);
padding: 0 6px 0 4px;
box-sizing: border-box;
overflow: hidden;
overflow-y: auto;
background: #082f74;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,107 @@
<template>
<div class="box-container">
<div class="data-item"
v-for="(item, index) in dataItems"
:key="index">
<div class="mr15">
<img class="imgs"
:src="item.icon"
alt="" />
</div>
<div class="data-content">
<div class="label">{{ item.label }}</div>
<div class="value">{{ item.value }}</div>
<div class="value">{{ item.dw }}</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const dataItems = ref([
{
label: '上架创业项目',
value: 6,
dw: '个',
icon: require('@/assets/images/1.png')
},
{
label: '撮合成功项目',
value: 2,
dw: '个',
icon: require('@/assets/images/2.png')
},
{
label: '创业导师提供项目',
value: 3,
icon: require('@/assets/images/27.png'),
dw: '个'
},
{
label: '累计孵化企业',
value: 1,
icon: require('@/assets/images/28.png'),
dw: '家'
},
{
label: '孵化企业就业人数',
icon: require('@/assets/images/1.png'),
value: 8,
dw: '人'
},
]);
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.box-container {
padding: 2vw 10px;
box-sizing: border-box;
border-radius: 8px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.data-item {
display: flex;
align-items: center;
flex-wrap: wrap;
padding: 2vw 15px;
border-radius: 6px;
transition: all 0.3s ease;
margin-bottom: 30px;
}
.data-content {
flex: 1;
display: flex;
align-items: center;
.label {
font-size: 2vw;
margin-left: 40px;
font-family: "YSBTH";
@include textColor(#8cc8ff, #ffffff);
}
.value {
font-weight: bold;
font-size: 2.5vw;
font-family: "YSBTH";
@include textColor(#03aaf7, #ffffff);
margin-left: 40px;
}
}
.imgs {
width: 6vw;
}
</style>

View File

@ -0,0 +1,413 @@
<!--
* @Author: your name
* @Date: 2024-12-27 11:12:25
* @LastEditTime: 2025-02-20 15:59:28
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit%
* @FilePath: \tq_web_gd\src\views\navigationModel\echartsMap.vue
-->
<template>
<div class="mapBpx relative">
<ul class="topbox">
<li v-for="it in list"
:key="it"
class="flex align-center">
<span class="lebel">{{ it.label }} :</span>
<span class="value">{{ it.value }}</span>
<span class="dw">{{ it.dw }}</span>
</li>
</ul>
<!-- 弹窗 -->
<div class="infoMessage">
<div class="tipTitle">{{ dataForm.fwmc }}</div>
<div class="gapLine"></div>
<div class=" text flex just-between align-center pl10 pr10 mt10 mb10">
<span>组长<span class="itexs">{{ dataForm.zzmc }}</span></span>
<span>经纪人<span class="itexs">{{ dataForm.jjr }}</span> </span>
</div>
<div class=" text flex just-between align-center pl10 pr10 mt10 mb10">
<span>合作用人单位 <span class="itexs">{{ dataForm.hzr }}</span> </span>
<span>上架岗位<span class="itexs">{{ dataForm.sjgw }}</span> </span>
</div>
<div class=" text pl10 pr10 mt10 mb10">搓配就业人数<span class="itexs">{{ dataForm.cpsl }}</span> </div>
<div class=" text pl10 pr10 mt10 mb10">求职社群人数<span class="itexs">{{ dataForm.qzsl }}</span> </div>
</div>
<!-- 地图 -->
<div class="map">
<div ref="myMap"
style="width: 100%; height: 100%"></div>
</div>
</div>
</template>
<script setup>
import * as echarts from 'echarts'
import 'echarts-gl'
import { onMounted, onUnmounted, reactive, ref } from 'vue';
const list = ref([
{ label: '就业服务站', value: 40, dw: '个' },
{ label: '服务一体机', value: 40, dw: '个' },
{ label: '劳务经纪人', value: 118, dw: '人' },
{ label: '招聘岗位', value: 9637, dw: '个' },
{ label: '成功入职', value: 1305, dw: '个' },
])
const dataForm = ref({})
const baseList = ref([])
const myMap = ref()
const mapSource = ref([])
const timer = ref(null)
// 地图上显示的数据
const mapData = ref({})
const myChart = ref(null)
onMounted(() => {
let num = 0;
timer.value = setInterval(() => {
let len = baseList.value.length;
num++;
if (num > len) num = 0;
dataForm.value = baseList.value[num];
if (myChart.value) {
myChart.value.clear();
initMap()
} else {
initMap()
}
}, 5000)
getList();
})
onUnmounted(() => {
clearInterval(timer.value)
})
function getList() {
let peoJson = require('./jd.json');
baseList.value = peoJson;
dataForm.value = peoJson[0]
mapSource.value = peoJson.map(v => {
return {
coords: [
[103.691049, 30.631478],
[v.jd, v.wd]
],
value: 100,// 数据值
name: v.fwmc,// 数据名
lineStyle: {
normal: {
color: "#01d3f3",
width: 2, // 线条宽度
opacity: 0.1, // 尾迹线条透明度
curveness: 0.1, // 尾迹线条曲直度
},
}
}
})
let geoCoordMap = {}
let projectData = []
peoJson.map(v => {
geoCoordMap[v.fwmc] = [v.jd, v.wd, 50];
let obj = { name: v.fwmc, value: (Math.random() * 300).toFixed(2), projectName: v.fwmc }
projectData.push(obj)
})
mapData.value = { geoCoordMap, projectData }
setTimeout(() => {
initMap()
}, 1000);
}
function initMap() {
if (myChart.value) myChart.value.clear();
// json地图数据-需要根据需求下载引入对应名称文件
let mapJson = require('./510184.json')
myChart.value = echarts.init(myMap.value)
myChart.value.showLoading()
myChart.value.hideLoading()
echarts.registerMap('myMap', mapJson)
var option = {
tooltip: {},
geo3D: {
type: 'map3D',
name: '地图',
// center: ['40%', '90%'],// 相对于父容器比例
top: '-20%',
right: '0%',
left: '0%',
bottom: '8%',
selectedMode: 'single', // 地图高亮单选
regionHeight: 6, // 地图高度
map: 'myMap',
viewControl: {
distance: 100,// 缩放大小,数值越大,地图越小
alpha: 50,// 上下倾斜角度
// rotateSensitivity: [1, 1],
beta: 15 // 左右倾斜角度
},
label: {
show: true, // 是否显示名字
color: '#fff', // 文字颜色
fontSize: 16, // 文字大小
fontWeight: 'bold' // 文字大小
},
itemStyle: {
color: 'rgba(1,59,110,0.2)', // 地图背景颜色
borderWidth: 1, // 分界线wdith
borderColor: '#61CFF8', // 分界线颜色
opacity: 0.92
},
emphasis: {
label: {
show: true, // 是否显示高亮
textStyle: {
color: '#fff' // 高亮文字颜色
}
},
itemStyle: {
color: 'rgba(1,59,110,0.5)', // 地图高亮颜色
borderWidth: 10, // 分界线wdith
borderColor: 'rgba(10,148,184,1)' // 分界线颜色
}
},
light: {
main: {
color: '#fff',
intensity: 1,
shadow: true,
shadowQuality: 'high',
alpha: 25,
beta: 20
},
ambient: {
color: '#fff',
intensity: 0.6
}
},
},
series: [
{
//配置路径
type: 'lines3D',
coordinateSystem: 'geo3D',
blendMode: 'lighter',
zlevel: 10,
effect: {
show: true,
period: 8,// 箭头指向速度,值越小速度越快
trailLength: 0.1,//[0,1] // 尾迹的长度,范围从 0 到 1为线条长度的百分比。特效尾迹长度[0,1]值越大,尾迹越长重
opacity: 12, // 尾迹线条透明度
trailWidth: 10, //宽度
trailColor: "#d80cfc",
color: "#38bd98",//移动点的颜色
constantSpeed: 5,//速度
trailOpacity: 0.5,
},
data: mapSource.value
},
// 叠加地图上需要显示的数据,插牌
{
type: 'scatter3D',
name: 'scatter3D',
coordinateSystem: 'geo3D',
symbol: 'path://M262.775253 0m64 0l0 0q64 0 64 64l0 896q0 64-64 64l0 0q-64 0-64-64l0-896q0-64 64-64Z',
symbolSize: [4, 28],
itemStyle: {
color: '#FF771A',
opacity: 1,
},
data: convertData(mapData.value.projectData),
},
]
}
myChart.value.setOption(option);
setTimeout(() => {
window.addEventListener('resize', () => {
myChart.value.resize()
initMap();
});
}, 500);
}
// 转化已有数据到地图上显示的配置数据
function convertData(data) {
const res = [];
for (let i = 0; i < data.length; i++) {
const geoCoord = mapData.value.geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value),
projectName: data[i].projectName,
label: {
show: true,
position: 'top',
distance: -5,
formatter(param) {
return `{sty1|${param.data.projectName}}`;
},
rich: {
sty1: {
padding: getSize(0.07),
backgroundColor: 'rgba(7, 28, 38, 0.7)',
borderWidth: 1,
borderColor: '#FF771A',
borderRadius: 2,
fontSize: getSize(0.14),
},
},
textStyle: {
color: '#ffffff',
},
},
emphasis: {
label: {
show: true,
position: 'top',
distance: 0,
formatter(param) {
return `{sty1|${param.data.projectName}}`;
},
rich: {
sty1: {
padding: 7,
backgroundColor: 'rgba(7, 28, 38, 0.7)',
borderWidth: 1,
borderColor: '#FF771A',
borderRadius: 2,
fontSize: getSize(0.14),
},
},
textStyle: {
color: '#ffffff',
},
},
},
});
}
}
return res;
}
// 适配不同尺寸浏览器,避免地图上的字号过小或过大
function getSize(res) {
const clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
if (!clientWidth) return;
const fontSize = 100 * (clientWidth / 1920);
return res * fontSize;
}
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0deg, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.mapBpx {
width: 100%;
height: 100%;
overflow: hidden;
.topbox {
height: 120px;
display: flex;
justify-content: space-around;
align-items: center;
.lebel {
font-size: 2.5vw;
font-family: "YSBTH";
font-weight: 600;
@include textColor(#07c5f5, #ffffff);
}
.value {
margin: 0 10px;
font-size: 2.5vw;
font-family: "YSBTH";
@include textColor(#e2480c, #ffffff);
}
.dw {
font-size: 20px;
font-family: "YSBTH";
}
}
.infoMessage {
position: absolute;
top: 5vw;
left: 37px;
min-width: 4vw;
min-height: 4vw;
padding: 0 1vw;
box-sizing: border-box;
border: 1px solid #07c5f5;
border-bottom: 1px dashed #07c5f5;
border-radius: 10px;
background: url("~@/assets/images/bg_04.png") no-repeat center center;
background-size: 100% 100%;
z-index: 99;
.tipTitle {
text-align: center;
font-size: 2vw;
line-height: 4vw;
font-family: "YSBTH";
@include textColor(#026ed3, #ffffff);
padding: 0 10px;
box-sizing: border-box;
}
.gapLine {
position: relative;
width: calc(100% - 20px);
height: 3px;
background: #026ed3;
border-radius: 10px;
margin: 0 10px 10px;
&::before {
position: absolute;
content: "";
left: 0px;
top: 0px;
height: 3px;
width: 20px;
border-radius: 50%;
text-shadow: 0 0 10px #ffffff;
background: linear-gradient(to right, #e2480c 0%, #07c5f5 50%);
}
&::after {
position: absolute;
content: "";
right: 0px;
top: 0px;
height: 3px;
width: 20px;
border-radius: 50%;
text-shadow: 0 0 10px #ffffff;
background: linear-gradient(to right, #07c5f5 0%, #e2480c 50%);
}
}
.itexs {
font-weight: 600;
@include textColor(#22e9e0, #ffffff);
}
.text {
font-size: 1.5vw;
line-height: 2.5vw;
}
}
.map {
width: 100%;
height: calc(100% - 120px);
overflow: hidden;
}
}
</style>
<style lang="scss">
</style>

View File

@ -0,0 +1,471 @@
<!--
* @Author: your name
* @Date: 2024-12-27 11:12:25
* @LastEditTime: 2025-02-20 15:59:28
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit%
* @FilePath: \tq_web_gd\src\views\navigationModel\echartsMap.vue
-->
<template>
<div class="mapBpx relative">
<ul class="topbox">
<li v-for="(it,idx) in list"
:key="it"
class="flex align-center">
<span class="lebel">{{ it.label }} :</span>
<span class="value"
:class="'value_'+idx">{{ it.value }}</span>
<span class="value"
:class="'value_'+idx">{{ it.dw }}</span>
</li>
</ul>
<!-- 弹窗 -->
<div class="infoMessage">
<div class="tipTitle">{{ dataForm.fwmc }}</div>
<div class="gapLine"></div>
<div class=" text flex just-between align-center pl10 pr10 mt10 mb10">
<span>组长<span class="itexs">{{ dataForm.zzmc }}</span></span>
<span>经纪人<span class="itexs">{{ dataForm.jjr }}</span> </span>
</div>
<div class=" text flex just-between align-center pl10 pr10 mt10 mb10">
<span>合作用人单位 <span class="itexs">{{ dataForm.hzr }}</span> </span>
<span>上架岗位<span class="itexs">{{ dataForm.sjgw }}</span> </span>
</div>
<div class=" text pl10 pr10 mt10 mb10">搓配就业人数<span class="itexs">{{ dataForm.cpsl }}</span> </div>
<div class=" text pl10 pr10 mt10 mb10">求职社群人数<span class="itexs">{{ dataForm.qzsl }}</span> </div>
</div>
<!-- 地图 -->
<div class="map">
<div ref="myMap"
style="width: 100%; height: 100%"></div>
</div>
</div>
</template>
<script setup>
import * as echarts from 'echarts'
import 'echarts-gl'
import { onMounted, onUnmounted, nextTick , ref } from 'vue';
const list = ref([
{ label: '就业服务站', value: 40, dw: '个' },
{ label: '服务一体机', value: 40, dw: '个' },
{ label: '劳务经纪人', value: 118, dw: '人' },
{ label: '招聘岗位', value: 9637, dw: '个' },
{ label: '成功入职', value: 1305, dw: '人' },
])
const dataForm = ref({})
const baseList = ref([])
const myMap = ref()
const mapSource = ref([])
const timer = ref(null)
// 地图上显示的数据
const mapData = ref({})
const myChart = ref(null)
onMounted(() => {
getList();
let num = 0;
timer.value = setInterval(() => {
let len = baseList.value.length;
num++;
// console.log(num)
if (num >= len) num = 0;
dataForm.value = baseList.value[num];
if (myChart.value) {
// echatsPoint(num);
myChart.value.setOption({
series: [
{
data: mapSource.value
},
{
data: convertData(mapData.value.projectData)
}
]
});
}
}, 5000);
window.addEventListener('resize', () => {
if (myChart.value) {
myChart.value.resize();
}
});
// 确保在组件挂载后初始化地图
nextTick(() => {
initMap();
});
})
onUnmounted(() => {
// 清理定时器
if (timer.value) {
clearInterval(timer.value);
timer.value = null;
}
// 销毁echarts实例
if (myChart.value) {
myChart.value.dispose();
myChart.value = null;
}
// 移除resize事件监听
window.removeEventListener('resize', () => {
if (myChart.value) {
myChart.value.resize();
}
});
})
function getList() {
let peoJson = require('./jd.json');
baseList.value = peoJson;
dataForm.value = peoJson[0]
mapSource.value = peoJson.map(v => {
return {
coords: [
[103.691049, 30.631478],
[v.jd, v.wd]
],
value: 100,// 数据值
name: v.fwmc,// 数据名
lineStyle: {
normal: {
color: "#01d3f3",
width: 2, // 线条宽度
opacity: 0.1, // 尾迹线条透明度
curveness: 0.1, // 尾迹线条曲直度
},
}
}
})
echatsPoint(0)
setTimeout(() => {
initMap()
}, 1000);
}
function echatsPoint(idx) {
let peoJson = require('./jd.json');
let geoCoordMap = {}
let projectData = []
// let arrNew = [peoJson[idx]]
let arrNew = peoJson
arrNew.forEach(v => {
geoCoordMap[v.fwmc] = [v.jd, v.wd, 50];
let obj = { name: v.fwmc, value: (Math.random() * 300).toFixed(2), projectName: v.fwmc }
projectData.push(obj)
});
mapData.value = { geoCoordMap, projectData }
}
function initMap() {
if (myChart.value) myChart.value.clear();
// json地图数据-需要根据需求下载引入对应名称文件
let mapJson = require('./510184.json')
myChart.value = echarts.init(myMap.value)
myChart.value.showLoading()
myChart.value.hideLoading()
echarts.registerMap('myMap', mapJson)
var option = {
tooltip: {},
geo3D: {
type: 'map3D',
name: '地图',
// center: ['40%', '90%'],// 相对于父容器比例
top: '4%',
right: '0%',
left: '0%',
bottom: '6%',
selectedMode: 'single', // 地图高亮单选
regionHeight: 10, // 地图高度
map: 'myMap',
viewControl: {
distance: 105,// 缩放大小,数值越大,地图越小
alpha: 50,// 上下倾斜角度
// rotateSensitivity: [1, 1],
beta: 15 // 左右倾斜角度
},
label: {
show: true, // 是否显示名字
color: '#fff', // 文字颜色
fontSize: 16, // 文字大小
fontWeight: 'bold' // 文字大小
},
itemStyle: {
color: 'rgba(5,75,189,0.8)', // 地图背景颜色
borderWidth: 1, // 分界线wdith
borderColor: '#61CFF8', // 分界线颜色
opacity: 0.92
},
emphasis: {
label: {
show: true, // 是否显示高亮
textStyle: {
color: '#fff' // 高亮文字颜色
}
},
itemStyle: {
color: 'rgba(1,59,110,0.5)', // 地图高亮颜色
borderWidth: 10, // 分界线wdith
borderColor: 'rgba(10,148,184,1)' // 分界线颜色
}
},
light: {
main: {
color: '#fff',
intensity: 1,
shadow: true,
shadowQuality: 'high',
alpha: 25,
beta: 20
},
ambient: {
color: '#fff',
intensity: 0.6
}
},
},
series: [
{
//配置路径
type: 'lines3D',
coordinateSystem: 'geo3D',
blendMode: 'lighter',
zlevel: 10,
effect: {
show: true,
period: 8,// 箭头指向速度,值越小速度越快
trailLength: 0.1,//[0,1] // 尾迹的长度,范围从 0 到 1为线条长度的百分比。特效尾迹长度[0,1]值越大,尾迹越长重
opacity: 12, // 尾迹线条透明度
trailWidth: 10, //宽度
trailColor: "#d80cfc",
color: "#38bd98",//移动点的颜色
constantSpeed: 5,//速度
trailOpacity: 0.5,
},
data: mapSource.value
},
// 叠加地图上需要显示的数据,插牌
{
type: 'scatter3D',
name: 'scatter3D',
coordinateSystem: 'geo3D',
symbol: 'path://M262.775253 0m64 0l0 0q64 0 64 64l0 896q0 64-64 64l0 0q-64 0-64-64l0-896q0-64 64-64Z',
symbolSize: [4, 28],
itemStyle: {
color: '#FF771A',
opacity: 1,
},
data: convertData(mapData.value.projectData),
},
]
}
myChart.value.setOption(option);
setTimeout(() => {
window.addEventListener('resize', () => {
myChart.value.resize()
initMap();
});
}, 500);
}
// 转化已有数据到地图上显示的配置数据
function convertData(data) {
const res = [];
for (let i = 0; i < data.length; i++) {
const geoCoord = mapData.value.geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value),
projectName: data[i].projectName,
label: {
show: true,
position: 'top',
distance: -5,
formatter(param) {
return `{sty1|${param.data.projectName}}`;
},
rich: {
sty1: {
padding: getSize(0.07),
backgroundColor: 'rgba(7, 28, 38, 0.7)',
borderWidth: 1,
borderColor: '#FF771A',
borderRadius: 2,
fontSize: getSize(0.14),
},
},
textStyle: {
color: '#ffffff',
},
},
emphasis: {
label: {
show: true,
position: 'top',
distance: 0,
formatter(param) {
return `{sty1|${param.data.projectName}}`;
},
rich: {
sty1: {
padding: 7,
backgroundColor: 'rgba(7, 28, 38, 0.7)',
borderWidth: 1,
borderColor: '#FF771A',
borderRadius: 2,
fontSize: getSize(0.14),
},
},
textStyle: {
color: '#ffffff',
},
},
},
});
}
}
return res;
}
// 适配不同尺寸浏览器,避免地图上的字号过小或过大
function getSize(res) {
const clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
if (!clientWidth) return;
const fontSize = 100 * (clientWidth / 1920);
return res * fontSize;
}
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0deg, $color1 0%, $color2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.mapBpx {
width: 100%;
height: 100%;
overflow: hidden;
.topbox {
position: absolute;
width: 100%;
height: 250px;
display: flex;
top: 20px;
justify-content: space-around;
align-items: center;
border: 2px solid #07c5f5;
box-sizing: border-box;
border-radius: 10px;
box-shadow: inset 0 0 40px#0072ff;
.lebel {
font-size: 2vw;
font-family: "YSBTH";
font-weight: 600;
@include textColor(#07c5f5, #ffffff);
}
.value {
margin: 0 10px;
font-size: 2.5vw;
}
.value_0 {
@include textColor(#d59a26, #fcfbf8);
}
.value_1 {
@include textColor(#28f1e2, #fcfbf8);
}
.value_2 {
@include textColor(#4094dd, #fcfbf8);
}
.value_3 {
@include textColor(#d59a26, #fcfbf8);
}
.value_4 {
@include textColor(#28f1e2, #fcfbf8);
}
}
.infoMessage {
position: absolute;
top: 22vw;
left: 37px;
min-width: 4vw;
min-height: 4vw;
padding: 0 1.5vw;
box-sizing: border-box;
// border: 1px solid #07c5f5;
border-radius: 10px;
background: url("~@/assets/images/dialig.png") no-repeat center center;
background-size: 100% 100%;
z-index: 99;
.tipTitle {
text-align: center;
font-size: 2vw;
line-height: 4vw;
font-family: "YSBTH";
@include textColor(#026ed3, #ffffff);
padding: 0 10px;
box-sizing: border-box;
}
.gapLine {
position: relative;
width: calc(100% - 20px);
height: 3px;
background: #026ed3;
border-radius: 10px;
margin: 0 10px 10px;
&::before {
position: absolute;
content: "";
left: 0px;
top: 0px;
height: 3px;
width: 20px;
border-radius: 50%;
text-shadow: 0 0 10px #ffffff;
background: linear-gradient(to right, #e2480c 0%, #07c5f5 50%);
}
&::after {
position: absolute;
content: "";
right: 0px;
top: 0px;
height: 3px;
width: 20px;
border-radius: 50%;
text-shadow: 0 0 10px #ffffff;
background: linear-gradient(to right, #07c5f5 0%, #e2480c 50%);
}
}
.itexs {
font-weight: 600;
@include textColor(#22e9e0, #ffffff);
}
.text {
font-size: 1.5vw;
line-height: 2.5vw;
}
}
.map {
width: 100%;
height: calc(100% - 120px);
overflow: hidden;
}
}
</style>
<style lang="scss">
</style>

View File

@ -0,0 +1,545 @@
<!--
* @Author: your name
* @Date: 2024-12-27 11:12:25
* @LastEditTime: 2025-02-20 15:59:28
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit%
* @FilePath: \tq_web_gd\src\views\navigationModel\echartsMap.vue
-->
<template>
<div class="mapBpx relative">
<ul class="topbox">
<li v-for="(it,idx) in list"
:key="it"
class="flex align-center">
<span class="lebel">{{ it.label }} :</span>
<span class="value"
:class="'value_'+idx">{{ it.value }}</span>
<span class="value"
:class="'value_'+idx">{{ it.dw }}</span>
</li>
</ul>
<!-- 弹窗 -->
<div class="infoMessage">
<div class="tipTitle">{{ dataForm.fwmc }}</div>
<div class="gapLine"></div>
<div class=" text flex just-between align-center pl10 pr10 mt10 mb10">
<span v-if="dataForm.zz">站长:<span class="itexs">{{ dataForm.zz }}</span></span>
<span>组长<span class="itexs">{{dataForm.zz?dataForm.zd :dataForm.zzmc}}</span></span>
<span>经纪人<span class="itexs">{{ dataForm.jjr }}</span> </span>
</div>
<div class=" text flex just-between align-center pl10 pr10 mt10 mb10">
<span>合作用人单位 <span class="itexs">{{ dataForm.hzr }}</span> </span>
<span>上架岗位<span class="itexs">{{ dataForm.sjgw }}</span> </span>
</div>
<div class=" text pl10 pr10 mt10 mb10">搓配就业人数<span class="itexs">{{ dataForm.cpsl }}</span> </div>
<div class=" text pl10 pr10 mt10 mb10">求职社群人数<span class="itexs">{{ dataForm.qzsl }}</span> </div>
</div>
<!-- 地图 -->
<div class="map" style="margin-top: 2.7vh;margin-left: 7vw;">
<div ref="myMap"
style="width: 100%; height: 100%;transform: scale(0.85);"></div>
</div>
</div>
</template>
<script setup>
import * as echarts from 'echarts'
// import 'echarts-gl'
import { onMounted, onUnmounted, nextTick, ref } from 'vue';
const list = ref([
{ label: '就业服务站', value: 40, dw: '个' },
{ label: '服务一体机', value: 40, dw: '个' },
{ label: '劳务经纪人', value: 118, dw: '人' },
{ label: '招聘岗位', value: 9637, dw: '个' },
{ label: '成功入职', value: 1305, dw: '人' },
])
const dataForm = ref({})
const baseList = ref([])
const myMap = ref()
const mapSource = ref([])
const mapSource1 = ref([])
const timer = ref(null)
// 地图上显示的数据
const mapData = ref({})
const myChart = ref(null)
const newdataForm = ref({})
const cyyName = {
name: "崇州市人力资源服务产业园",
value: [103.782722,30.545252]}
onMounted(() => {
getList();
valueFrom();
let num = 0;
timer.value = setInterval(() => {
let len = baseList.value.length;
num++;
if (num >= len) num = 0;
dataForm.value = baseList.value[num];
newdataForm.value = {
name: dataForm.value.fwmc,
value: [
dataForm.value.jd,
dataForm.value.wd
]
}
initMap()
}, 5000);
window.addEventListener('resize', () => {
if (myChart.value) {
myChart.value.resize();
}
});
// 确保在组件挂载后初始化地图
nextTick(() => {
initMap();
});
})
const dataValue = ref()
const valueFrom = () => {
let jjr = 0
let hzr = 0
let sjgw = 0
let cpsl = 0
let qzsl = 0
baseList.value.forEach(item => {
dataValue.value = {
jjr: jjr += parseInt(item.jjr),
hzr: hzr += parseInt(item.hzr),
sjgw: sjgw += parseInt(item.sjgw),
cpsl: cpsl += parseInt(item.cpsl),
qzsl: qzsl += parseInt(item.qzsl),
}
if (item.jdmc == "崇州市人力资源服务产业园") {
dataForm.value = { ...item, ...dataValue.value }
}
})
}
onUnmounted(() => {
// 清理定时器
if (timer.value) {
clearInterval(timer.value);
timer.value = null;
}
// 销毁echarts实例
if (myChart.value) {
myChart.value.dispose();
myChart.value = null;
}
// 移除resize事件监听
window.removeEventListener('resize', () => {
if (myChart.value) {
myChart.value.resize();
}
});
})
// 转化已有数据到地图上显示的配置数据
function convertData(data) {
const res = [];
for (let i = 0; i < data.length; i++) {
const geoCoord = mapData.value.geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value),
projectName: data[i].projectName,
label: {
show: true,
position: 'top',
distance: -5,
formatter(param) {
return `{sty1|${param.data.projectName}}`;
},
rich: {
sty1: {
padding: getSize(0.07),
backgroundColor: 'rgba(7, 28, 38, 0.7)',
borderWidth: 1,
borderColor: '#FF771A',
borderRadius: 2,
fontSize: getSize(0.14),
},
},
textStyle: {
color: '#ffffff',
},
},
emphasis: {
label: {
show: true,
position: 'top',
distance: 0,
formatter(param) {
return `{sty1|${param.data.projectName}}`;
},
rich: {
sty1: {
padding: 7,
backgroundColor: 'rgba(7, 28, 38, 0.7)',
borderWidth: 1,
borderColor: '#FF771A',
borderRadius: 2,
fontSize: getSize(0.14),
},
},
textStyle: {
color: '#ffffff',
},
},
},
});
}
}
return res;
}
function getList() {
let peoJson = require('./jd.json');
baseList.value = peoJson;
dataForm.value = peoJson[0]
mapSource.value = peoJson.map(v => {
return {
coords: [
[103.782722,
30.545252],
[v.jd, v.wd]
],
value: 100,// 数据值
name: v.fwmc,// 数据名
lineStyle: {
normal: {
color: "#01d3f3",
width: 2, // 线条宽度
opacity: 0.1, // 尾迹线条透明度
curveness: 0.1, // 尾迹线条曲直度
},
}
}
})
mapSource1.value = peoJson.map(v => {
return {
name: v.fwmc,
value: [v.jd, v.wd],
}
})
setTimeout(() => {
initMap()
}, 1000);
}
function initMap() {
if (myChart.value) myChart.value.clear();
// json地图数据-需要根据需求下载引入对应名称文件
let mapJson = require('./510184.json')
myChart.value = echarts.init(myMap.value)
myChart.value.showLoading()
myChart.value.hideLoading()
echarts.registerMap('myMap', mapJson)
var option = {
tooltip: {},
geo: [{
type: 'map',
name: '地图',
top: '4%',
right: '0%',
left: '0%',
bottom: '6%',
selectedMode: 'single',
regionHeight: 10,
map: 'myMap',
viewControl: {
distance: 105,
alpha: 50,
beta: 15,
autoRotate: true,
autoRotateSpeed: 1
},
emphasis: {
label: {
show: true,
textStyle: {
color: '#fff',
fontSize: 16,
fontWeight: 'bold'
}
},
itemStyle: {
color: 'rgba(1,59,110,0.8)',
opacity: 0.8
}
},
label: {
show: true,
color: '#fff',
fontSize: 16,
fontWeight: 'bold'
},
itemStyle: {
color: 'rgba(5,75,189,0.8)',
borderWidth: 1,
borderColor: '#61CFF8',
opacity: 0.92
},
emphasis: {
label: {
show: true,
textStyle: {
color: '#fff'
}
},
itemStyle: {
color: 'rgba(1,59,110,0.5)',
borderWidth: 10,
borderColor: 'rgba(10,148,184,1)'
}
},
light: {
main: {
color: '#fff',
intensity: 1,
shadow: true,
shadowQuality: 'high',
alpha: 25,
beta: 20
},
ambient: {
color: '#fff',
intensity: 0.6
}
},
},
],
series: [
{
type: 'lines',
coordinateSystem: 'geo',
blendMode: 'lighter',
zlevel: 10,
effect: {
show: true,
period: 8,
trailLength: 0.1,
opacity: 12,
trailWidth: 10,
symbolSize: 4,
// symbol: 'path://M1705.06,1318.313v-89.254l-319.9-221.799l0.073-208.063c0.521-84.662-26.629-121.796-63.961-121.491c-37.332-0.305-64.482,36.829-63.961,121.491l0.073,208.063l-319.9,221.799v89.254l330.343-157.288l12.238,241.308l-134.449,92.931l0.531,42.034l175.125-42.917l175.125,42.917l0.531-42.034l-134.449-92.931l12.238-241.308L1705.06,1318.313z',
trailColor: "#d80cfc",
color: "#38bd98",
constantSpeed: 100,
trailOpacity: 0.9,
},
data: mapSource.value
},
{
tooltip: {
show: false,
},
type: "effectScatter",
coordinateSystem: "geo",
rippleEffect: {
brushType: "stroke",
},
showEffectOn: "render",
itemStyle: {
normal: {
color: {
type: "radial",
x: 0.5,
y: 0.5,
r: 0.5,
colorStops: [
{
offset: 0,
color: "rgba(0,255,246,0.1)",
},
{
offset: 0.6,
color: "rgba(0,255,246,0.4)",
},
{
offset: 0.85,
color: "transparent",
},
],
global: false, // 缺省为 false
},
},
},
symbol: "circle",
symbolSize: 18,
data: mapSource1.value,
zlevel: 1,
},
{
type: 'scatter',
name: 'scatter',
coordinateSystem: 'geo',
symbol: 'image://' + require('@/assets/images/34.png'),
// symbol: 'path://M262.775253 0m64 0l0 0q64 0 64 64l0 896q0 64-64 64l0 0q-64 0-64-64l0-896q0-64 64-64Z',
symbolSize: [100, 100],
itemStyle: {
color: 'red',
opacity: 1,
z:10
},
data: [cyyName,newdataForm.value],
},
]
}
myChart.value.setOption(option);
setTimeout(() => {
window.addEventListener('resize', () => {
myChart.value.resize()
initMap();
});
}, 500);
}
// 适配不同尺寸浏览器,避免地图上的字号过小或过大
function getSize(res) {
const clientWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
if (!clientWidth) return;
const fontSize = 100 * (clientWidth / 1920);
return res * fontSize;
}
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0deg, $color1 0%, $color2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.mapBpx {
width: 100%;
height: 100%;
overflow: hidden;
.topbox {
position: absolute;
width: 100%;
height: 250px;
display: flex;
top: 20px;
justify-content: space-around;
align-items: center;
border: 2px solid #07c5f5;
box-sizing: border-box;
border-radius: 10px;
box-shadow: inset 0 0 40px#0072ff;
.lebel {
font-size: 2vw;
font-family: "YSBTH";
font-weight: 600;
@include textColor(#07c5f5, #ffffff);
}
.value {
margin: 0 10px;
font-size: 2.5vw;
}
.value_0 {
@include textColor(#d59a26, #fcfbf8);
}
.value_1 {
@include textColor(#28f1e2, #fcfbf8);
}
.value_2 {
@include textColor(#4094dd, #fcfbf8);
}
.value_3 {
@include textColor(#d59a26, #fcfbf8);
}
.value_4 {
@include textColor(#28f1e2, #fcfbf8);
}
}
.infoMessage {
position: absolute;
top: 26vw;
left: 37px;
min-width: 4vw;
min-height: 4vw;
padding: 0 1.5vw;
box-sizing: border-box;
// border: 1px solid #07c5f5;
border-radius: 10px;
background: url("~@/assets/images/dialig.png") no-repeat center center;
background-size: 100% 100%;
z-index: 99;
.tipTitle {
text-align: center;
font-size: 2vw;
line-height: 4vw;
font-family: "YSBTH";
@include textColor(#026ed3, #ffffff);
padding: 0 10px;
box-sizing: border-box;
}
.gapLine {
position: relative;
width: calc(100% - 20px);
height: 3px;
background: #026ed3;
border-radius: 10px;
margin: 0 10px 10px;
&::before {
position: absolute;
content: "";
left: 0px;
top: 0px;
height: 3px;
width: 20px;
border-radius: 50%;
text-shadow: 0 0 10px #ffffff;
background: linear-gradient(to right, #e2480c 0%, #07c5f5 50%);
}
&::after {
position: absolute;
content: "";
right: 0px;
top: 0px;
height: 3px;
width: 20px;
border-radius: 50%;
text-shadow: 0 0 10px #ffffff;
background: linear-gradient(to right, #07c5f5 0%, #e2480c 50%);
}
}
.itexs {
font-weight: 600;
@include textColor(#22e9e0, #ffffff);
}
.text {
font-size: 1.5vw;
line-height: 2.5vw;
}
}
.map {
width: 100%;
height: calc(100% - 120px);
overflow: hidden;
}
}
</style>
<style lang="scss">
</style>

View File

@ -0,0 +1,482 @@
[
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道办事处(党群服务中心)",
"zzmc": "李建强",
"jjr": "2",
"hzr": "6",
"sjgw": "12",
"cpsl": "11",
"qzsl": "1027",
"jd": "103.709593",
"wd": "30.642669"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道金鸡社区党群服务中心",
"zzmc": "张卫东",
"jjr": "4",
"hzr": "3",
"sjgw": "34",
"cpsl": "27",
"qzsl": "2143",
"jd": "103.699256",
"wd": "30.610056"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道彭庙社区党群服务中心",
"zzmc": "陈俊峰",
"jjr": "3",
"hzr": "8",
"sjgw": "27",
"cpsl": "23",
"qzsl": "886",
"jd": "103.681954",
"wd": "30.613231"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道三和社区党群服务中心",
"zzmc": "王刚",
"jjr": "1",
"hzr": "2",
"sjgw": "46",
"cpsl": "33",
"qzsl": "1765",
"jd": "103.714911",
"wd": "30.629494"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道西江社区党群服务中心",
"zzmc": "陈丽娟",
"jjr": "5",
"hzr": "7",
"sjgw": "18",
"cpsl": "15",
"qzsl": "2532",
"jd": "103.657393",
"wd": "30.641023"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道毛桥社区党群服务中心",
"zzmc": "李红梅",
"jjr": "3",
"hzr": "4",
"sjgw": "41",
"cpsl": "30",
"qzsl": "941",
"jd": "103.690241",
"wd": "30.640704"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道永安社区党群服务中心",
"zzmc": "赵志勇",
"jjr": "2",
"hzr": "5",
"sjgw": "23",
"cpsl": "17",
"qzsl": "1478",
"jd": "103.701054",
"wd": "30.655325"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道办事处(综合便民服务中心)",
"zzmc": "刘庆",
"jjr": "4",
"hzr": "9",
"sjgw": "38",
"cpsl": "24",
"qzsl": "2890",
"jd": "103.675986",
"wd": "30.648424"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道石羊社区党群服务中心",
"zzmc": "周伟",
"jjr": "1",
"hzr": "1",
"sjgw": "15",
"cpsl": "11",
"qzsl": "1136",
"jd": "103.695859",
"wd": "30.635775"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道明湖社区党群服务中心",
"zzmc": "吴海平",
"jjr": "5",
"hzr": "6",
"sjgw": "49",
"cpsl": "27",
"qzsl": "2011",
"jd": "103.728995",
"wd": "30.617806"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道成都市跨企业培训中心",
"zzmc": "张秀兰",
"jjr": "4",
"hzr": "3",
"sjgw": "29",
"cpsl": "12",
"qzsl": "1344",
"jd": "103.724047",
"wd": "30.629753"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇州市人社局人力资源服务市场",
"zzmc": "赵晓燕",
"jjr": "10",
"hzr": "2",
"sjgw": "32",
"cpsl": "30",
"qzsl": "2357",
"jd": "103.697652",
"wd": "30.629184"
},
{
"jdmc": "崇阳街道",
"fwmc": "天府青年城就业创业驿站",
"zzmc": "孙晓军",
"jjr": "2",
"hzr": "8",
"sjgw": "11",
"cpsl": "7",
"qzsl": "798",
"jd": "103.69337",
"wd": "30.619366"
},
{
"jdmc": "大划街道",
"fwmc": "大划街道崇州市公共就业服务站(大划站)",
"zzmc": "郑学兵",
"jjr": "4",
"hzr": "7",
"sjgw": "43",
"cpsl": "34",
"qzsl": "1660",
"jd": "103.733269",
"wd": "30.58804"
},
{
"jdmc": "大划街道",
"fwmc": "大划街道办事处(党群服务中心)",
"zzmc": "杨德明",
"jjr": "1",
"hzr": "4",
"sjgw": "25",
"cpsl": "16",
"qzsl": "2671",
"jd": "103.74272",
"wd": "30.586272"
},
{
"jdmc": "羊马街道",
"fwmc": "羊马街道办事处(党群服务中心)",
"zzmc": "刘芳",
"jjr": "3",
"hzr": "5",
"sjgw": "37",
"cpsl": "30",
"qzsl": "1854",
"jd": "103.752865",
"wd": "30.661384"
},
{
"jdmc": "羊马街道",
"fwmc": "羊马街道安阜社区党群服务中心",
"zzmc": "周雅琴",
"jjr": "4",
"hzr": "1",
"sjgw": "17",
"cpsl": "13",
"qzsl": "2288",
"jd": "103.755043",
"wd": "30.613517"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道红土社区党群服务中心",
"zzmc": "吴静怡",
"jjr": "2",
"hzr": "9",
"sjgw": "44",
"cpsl": "33",
"qzsl": "1593",
"jd": "103.788962",
"wd": "30.636562"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道唐兴社区党群服务中心",
"zzmc": "徐国栋",
"jjr": "3",
"hzr": "6",
"sjgw": "26",
"cpsl": "18",
"qzsl": "2766",
"jd": "103.782691",
"wd": "30.595346"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道办事处(综合便民服务中心)",
"zzmc": "郭斌",
"jjr": "1",
"hzr": "3",
"sjgw": "31",
"cpsl": "23",
"qzsl": "1240",
"jd": "103.782381",
"wd": "30.594802"
},
{
"jdmc": "三江街道",
"fwmc": "三江街道皂角社区党群服务中心",
"zzmc": "马晓辉",
"jjr": "3",
"hzr": "8",
"sjgw": "13",
"cpsl": "10",
"qzsl": "1939",
"jd": "103.81626",
"wd": "30.582133"
},
{
"jdmc": "三江街道",
"fwmc": "三江街道办事处(党群服务中心)",
"zzmc": "朱志华",
"jjr": "2",
"hzr": "2",
"sjgw": "47",
"cpsl": "37",
"qzsl": "832",
"jd": "103.775139",
"wd": "30.550747"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇五星村党群服务中心",
"zzmc": "胡家辉",
"jjr": "4",
"hzr": "7",
"sjgw": "22",
"cpsl": "13",
"qzsl": "1707",
"jd": "103.617672",
"wd": "30.62182"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇和乐社区党群服务中心",
"zzmc": "黄波",
"jjr": "5",
"hzr": "4",
"sjgw": "35",
"cpsl": "31",
"qzsl": "2483",
"jd": "103.617672",
"wd": "30.62182"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇便民服务中心(党群服务中心)",
"zzmc": "林国平",
"jjr": "1",
"hzr": "5",
"sjgw": "19",
"cpsl": "16",
"qzsl": "2955",
"jd": "103.620409",
"wd": "30.599988"
},
{
"jdmc": "道明镇",
"fwmc": "道明镇便民服务中心(党群服务中心)",
"zzmc": "许军",
"jjr": "4",
"hzr": "9",
"sjgw": "40",
"cpsl": "31",
"qzsl": "1098",
"jd": "103.607164",
"wd": "30.677037"
},
{
"jdmc": "道明镇",
"fwmc": "道明镇白马社区党群服务中心",
"zzmc": "董志强",
"jjr": "3",
"hzr": "1",
"sjgw": "28",
"cpsl": "19",
"qzsl": "2186",
"jd": "103.666775",
"wd": "30.684182"
},
{
"jdmc": "观胜镇",
"fwmc": "观胜镇便民服务中心(党群服务中心)",
"zzmc": "孙慧敏",
"jjr": "2",
"hzr": "6",
"sjgw": "33",
"cpsl": "32",
"qzsl": "977",
"jd": "103.679284",
"wd": "30.746676"
},
{
"jdmc": "怀远镇",
"fwmc": "怀远镇泉水社区党群服务中心(党群活动中心)",
"zzmc": "郑丽萍",
"jjr": "3",
"hzr": "3",
"sjgw": "14",
"cpsl": "12",
"qzsl": "1618",
"jd": "103.539942",
"wd": "30.743908"
},
{
"jdmc": "怀远镇",
"fwmc": "怀远镇便民服务中心(党群服务中心)",
"zzmc": "杨晓",
"jjr": "3",
"hzr": "2",
"sjgw": "48",
"cpsl": "45",
"qzsl": "2304",
"jd": "103.541238",
"wd": "30.746072"
},
{
"jdmc": "街子镇",
"fwmc": "街子镇便民服务中心(崇州市街子镇综合便民服务和智慧蓉城运行中心)",
"zzmc": "郭雪梅",
"jjr": "1",
"hzr": "8",
"sjgw": "21",
"cpsl": "15",
"qzsl": "1421",
"jd": "103.573014",
"wd": "30.816296"
},
{
"jdmc": "街子镇",
"fwmc": "街子镇唐公社区党群服务中心",
"zzmc": "马玉玲",
"jjr": "4",
"hzr": "7",
"sjgw": "36",
"cpsl": "34",
"qzsl": "2069",
"jd": "103.564798",
"wd": "30.816778"
},
{
"jdmc": "廖家镇",
"fwmc": "廖家镇便民服务中心(党群服务中心)",
"zzmc": "朱晓红",
"jjr": "2",
"hzr": "4",
"sjgw": "16",
"cpsl": "13",
"qzsl": "1182",
"jd": "103.592506",
"wd": "30.830493"
},
{
"jdmc": "廖家镇",
"fwmc": "廖家镇明珠社区党群服务中心",
"zzmc": "胡彩莲",
"jjr": "5",
"hzr": "5",
"sjgw": "42",
"cpsl": "41",
"qzsl": "2578",
"jd": "103.704745",
"wd": "30.715253"
},
{
"jdmc": "廖家镇",
"fwmc": "隆兴镇便民服务中心(党群服务中心)",
"zzmc": "黄丽君",
"jjr": "3",
"hzr": "1",
"sjgw": "24",
"cpsl": "11",
"qzsl": "873",
"jd": "103.636015",
"wd": "30.584103"
},
{
"jdmc": "隆兴镇",
"fwmc": "隆兴镇中和社区党群服务中心",
"zzmc": "林小芳",
"jjr": "1",
"hzr": "9",
"sjgw": "30",
"cpsl": "23",
"qzsl": "1810",
"jd": "103.640649",
"wd": "30.592925"
},
{
"jdmc": "文井江镇",
"fwmc": "文井江镇综合便民服务中心(党群服务中心)",
"zzmc": "许娟",
"jjr": "2",
"hzr": "6",
"sjgw": "20",
"cpsl": "16",
"qzsl": "2231",
"jd": "103.669377",
"wd": "30.639533"
},
{
"jdmc": "文井江镇",
"fwmc": "文井江镇劳务合作社(文井江镇就业服务站)",
"zzmc": "董艳华",
"jjr": "2",
"hzr": "3",
"sjgw": "45",
"cpsl": "30",
"qzsl": "1396",
"jd": "103.675213",
"wd": "30.626786"
},
{
"jdmc": "元通镇",
"fwmc": "元通镇便民服务中心(党群服务中心)",
"zzmc": "孙斐",
"jjr": "3",
"hzr": "8",
"sjgw": "27",
"cpsl": "10",
"qzsl": "2823",
"jd": "103.630886",
"wd": "30.739136"
},
{
"jdmc": "元通镇",
"fwmc": "元通镇花果山社区党群服务中心",
"zzmc": "张建国",
"jjr": "1",
"hzr": "2",
"sjgw": "39",
"cpsl": "37",
"qzsl": "1555",
"jd": "103.630807",
"wd": "30.743803"
}
]

View File

@ -0,0 +1,482 @@
[
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道办事处(党群服务中心)",
"zzmc": "李建强",
"jjr": "2",
"hzr": "6",
"sjgw": "12",
"cpsl": "11",
"qzsl": "1027",
"jd": "103.709593",
"wd": "30.642669"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道金鸡社区党群服务中心",
"zzmc": "张卫东",
"jjr": "4",
"hzr": "3",
"sjgw": "34",
"cpsl": "27",
"qzsl": "2143",
"jd": "103.699256",
"wd": "30.610056"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道彭庙社区党群服务中心",
"zzmc": "陈俊峰",
"jjr": "3",
"hzr": "8",
"sjgw": "27",
"cpsl": "23",
"qzsl": "886",
"jd": "103.681954",
"wd": "30.613231"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道三和社区党群服务中心",
"zzmc": "王刚",
"jjr": "1",
"hzr": "2",
"sjgw": "46",
"cpsl": "33",
"qzsl": "1765",
"jd": "103.714911",
"wd": "30.629494"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道西江社区党群服务中心",
"zzmc": "陈丽娟",
"jjr": "5",
"hzr": "7",
"sjgw": "18",
"cpsl": "15",
"qzsl": "2532",
"jd": "103.657393",
"wd": "30.641023"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道毛桥社区党群服务中心",
"zzmc": "李红梅",
"jjr": "3",
"hzr": "4",
"sjgw": "41",
"cpsl": "30",
"qzsl": "941",
"jd": "103.690241",
"wd": "30.640704"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道永安社区党群服务中心",
"zzmc": "赵志勇",
"jjr": "2",
"hzr": "5",
"sjgw": "23",
"cpsl": "17",
"qzsl": "1478",
"jd": "103.701054",
"wd": "30.655325"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道办事处(综合便民服务中心)",
"zzmc": "刘庆",
"jjr": "4",
"hzr": "9",
"sjgw": "38",
"cpsl": "24",
"qzsl": "2890",
"jd": "103.675986",
"wd": "30.648424"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道石羊社区党群服务中心",
"zzmc": "周伟",
"jjr": "1",
"hzr": "1",
"sjgw": "15",
"cpsl": "11",
"qzsl": "1136",
"jd": "103.695859",
"wd": "30.635775"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道明湖社区党群服务中心",
"zzmc": "吴海平",
"jjr": "5",
"hzr": "6",
"sjgw": "49",
"cpsl": "27",
"qzsl": "2011",
"jd": "103.728995",
"wd": "30.617806"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道成都市跨企业培训中心",
"zzmc": "张秀兰",
"jjr": "4",
"hzr": "3",
"sjgw": "29",
"cpsl": "12",
"qzsl": "1344",
"jd": "103.724047",
"wd": "30.629753"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇州市人社局人力资源服务市场",
"zzmc": "赵晓燕",
"jjr": "10",
"hzr": "2",
"sjgw": "32",
"cpsl": "30",
"qzsl": "2357",
"jd": "103.697652",
"wd": "30.629184"
},
{
"jdmc": "崇阳街道",
"fwmc": "天府青年城就业创业驿站",
"zzmc": "孙晓军",
"jjr": "2",
"hzr": "8",
"sjgw": "11",
"cpsl": "7",
"qzsl": "798",
"jd": "103.69337",
"wd": "30.619366"
},
{
"jdmc": "大划街道",
"fwmc": "大划街道崇州市公共就业服务站(大划站)",
"zzmc": "郑学兵",
"jjr": "4",
"hzr": "7",
"sjgw": "43",
"cpsl": "34",
"qzsl": "1660",
"jd": "103.733269",
"wd": "30.58804"
},
{
"jdmc": "大划街道",
"fwmc": "大划街道办事处(党群服务中心)",
"zzmc": "杨德明",
"jjr": "1",
"hzr": "4",
"sjgw": "25",
"cpsl": "16",
"qzsl": "2671",
"jd": "103.74272",
"wd": "30.586272"
},
{
"jdmc": "羊马街道",
"fwmc": "羊马街道办事处(党群服务中心)",
"zzmc": "刘芳",
"jjr": "3",
"hzr": "5",
"sjgw": "37",
"cpsl": "30",
"qzsl": "1854",
"jd": "103.752865",
"wd": "30.661384"
},
{
"jdmc": "羊马街道",
"fwmc": "羊马街道安阜社区党群服务中心",
"zzmc": "周雅琴",
"jjr": "4",
"hzr": "1",
"sjgw": "17",
"cpsl": "13",
"qzsl": "2288",
"jd": "103.755043",
"wd": "30.613517"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道红土社区党群服务中心",
"zzmc": "吴静怡",
"jjr": "2",
"hzr": "9",
"sjgw": "44",
"cpsl": "33",
"qzsl": "1593",
"jd": "103.773983",
"wd": "30.591875"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道唐兴社区党群服务中心",
"zzmc": "徐国栋",
"jjr": "3",
"hzr": "6",
"sjgw": "26",
"cpsl": "18",
"qzsl": "2766",
"jd": "103.782691",
"wd": "30.595346"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道办事处(综合便民服务中心)",
"zzmc": "郭斌",
"jjr": "1",
"hzr": "3",
"sjgw": "31",
"cpsl": "23",
"qzsl": "1240",
"jd": "103.782381",
"wd": "30.594802"
},
{
"jdmc": "三江街道",
"fwmc": "三江街道皂角社区党群服务中心",
"zzmc": "马晓辉",
"jjr": "3",
"hzr": "8",
"sjgw": "13",
"cpsl": "10",
"qzsl": "1939",
"jd": "103.782722",
"wd": "30.545252"
},
{
"jdmc": "三江街道",
"fwmc": "三江街道办事处(党群服务中心)",
"zzmc": "朱志华",
"jjr": "2",
"hzr": "2",
"sjgw": "47",
"cpsl": "37",
"qzsl": "832",
"jd": "103.775139",
"wd": "30.550747"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇五星村党群服务中心",
"zzmc": "胡家辉",
"jjr": "4",
"hzr": "7",
"sjgw": "22",
"cpsl": "13",
"qzsl": "1707",
"jd": "103.617672",
"wd": "30.62182"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇和乐社区党群服务中心",
"zzmc": "黄波",
"jjr": "5",
"hzr": "4",
"sjgw": "35",
"cpsl": "31",
"qzsl": "2483",
"jd": "103.617672",
"wd": "30.62182"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇便民服务中心(党群服务中心)",
"zzmc": "林国平",
"jjr": "1",
"hzr": "5",
"sjgw": "19",
"cpsl": "16",
"qzsl": "2955",
"jd": "103.620409",
"wd": "30.599988"
},
{
"jdmc": "道明镇",
"fwmc": "道明镇便民服务中心(党群服务中心)",
"zzmc": "许军",
"jjr": "4",
"hzr": "9",
"sjgw": "40",
"cpsl": "31",
"qzsl": "1098",
"jd": "103.607164",
"wd": "30.677037"
},
{
"jdmc": "道明镇",
"fwmc": "道明镇白马社区党群服务中心",
"zzmc": "董志强",
"jjr": "3",
"hzr": "1",
"sjgw": "28",
"cpsl": "19",
"qzsl": "2186",
"jd": "103.666775",
"wd": "30.684182"
},
{
"jdmc": "观胜镇",
"fwmc": "观胜镇便民服务中心(党群服务中心)",
"zzmc": "孙慧敏",
"jjr": "2",
"hzr": "6",
"sjgw": "33",
"cpsl": "32",
"qzsl": "977",
"jd": "103.679284",
"wd": "30.746676"
},
{
"jdmc": "怀远镇",
"fwmc": "怀远镇泉水社区党群服务中心(党群活动中心)",
"zzmc": "郑丽萍",
"jjr": "3",
"hzr": "3",
"sjgw": "14",
"cpsl": "12",
"qzsl": "1618",
"jd": "103.539942",
"wd": "30.743908"
},
{
"jdmc": "怀远镇",
"fwmc": "怀远镇便民服务中心(党群服务中心)",
"zzmc": "杨晓",
"jjr": "3",
"hzr": "2",
"sjgw": "48",
"cpsl": "45",
"qzsl": "2304",
"jd": "103.541238",
"wd": "30.746072"
},
{
"jdmc": "街子镇",
"fwmc": "街子镇便民服务中心(崇州市街子镇综合便民服务和智慧蓉城运行中心)",
"zzmc": "郭雪梅",
"jjr": "1",
"hzr": "8",
"sjgw": "21",
"cpsl": "15",
"qzsl": "1421",
"jd": "103.573014",
"wd": "30.816296"
},
{
"jdmc": "街子镇",
"fwmc": "街子镇唐公社区党群服务中心",
"zzmc": "马玉玲",
"jjr": "4",
"hzr": "7",
"sjgw": "36",
"cpsl": "34",
"qzsl": "2069",
"jd": "103.564798",
"wd": "30.816778"
},
{
"jdmc": "廖家镇",
"fwmc": "廖家镇便民服务中心(党群服务中心)",
"zzmc": "朱晓红",
"jjr": "2",
"hzr": "4",
"sjgw": "16",
"cpsl": "13",
"qzsl": "1182",
"jd": "103.692861",
"wd": "30.707592"
},
{
"jdmc": "廖家镇",
"fwmc": "廖家镇明珠社区党群服务中心",
"zzmc": "胡彩莲",
"jjr": "5",
"hzr": "5",
"sjgw": "42",
"cpsl": "41",
"qzsl": "2578",
"jd": "103.704745",
"wd": "30.715253"
},
{
"jdmc": "廖家镇",
"fwmc": "隆兴镇便民服务中心(党群服务中心)",
"zzmc": "黄丽君",
"jjr": "3",
"hzr": "1",
"sjgw": "24",
"cpsl": "11",
"qzsl": "873",
"jd": "103.636015",
"wd": "30.584103"
},
{
"jdmc": "隆兴镇",
"fwmc": "隆兴镇中和社区党群服务中心",
"zzmc": "林小芳",
"jjr": "1",
"hzr": "9",
"sjgw": "30",
"cpsl": "23",
"qzsl": "1810",
"jd": "103.640649",
"wd": "30.592925"
},
{
"jdmc": "文井江镇",
"fwmc": "文井江镇综合便民服务中心(党群服务中心)",
"zzmc": "许娟",
"jjr": "2",
"hzr": "6",
"sjgw": "20",
"cpsl": "16",
"qzsl": "2231",
"jd": "103.669377",
"wd": "30.639533"
},
{
"jdmc": "文井江镇",
"fwmc": "文井江镇劳务合作社(文井江镇就业服务站)",
"zzmc": "董艳华",
"jjr": "2",
"hzr": "3",
"sjgw": "45",
"cpsl": "30",
"qzsl": "1396",
"jd": "103.675213",
"wd": "30.626786"
},
{
"jdmc": "元通镇",
"fwmc": "元通镇便民服务中心(党群服务中心)",
"zzmc": "孙斐",
"jjr": "3",
"hzr": "8",
"sjgw": "27",
"cpsl": "10",
"qzsl": "2823",
"jd": "103.630886",
"wd": "30.739136"
},
{
"jdmc": "元通镇",
"fwmc": "元通镇花果山社区党群服务中心",
"zzmc": "张建国",
"jjr": "1",
"hzr": "2",
"sjgw": "39",
"cpsl": "37",
"qzsl": "1555",
"jd": "103.630807",
"wd": "30.743803"
}
]

View File

@ -0,0 +1,495 @@
[
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道办事处(党群服务中心)",
"zzmc": "李建强",
"jjr": "2",
"hzr": "6",
"sjgw": "12",
"cpsl": "11",
"qzsl": "1027",
"jd": "103.709593",
"wd": "30.642669"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道金鸡社区党群服务中心",
"zzmc": "张卫东",
"jjr": "4",
"hzr": "3",
"sjgw": "34",
"cpsl": "27",
"qzsl": "2143",
"jd": "103.699256",
"wd": "30.610056"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道彭庙社区党群服务中心",
"zzmc": "陈俊峰",
"jjr": "3",
"hzr": "8",
"sjgw": "27",
"cpsl": "23",
"qzsl": "886",
"jd": "103.681954",
"wd": "30.613231"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道三和社区党群服务中心",
"zzmc": "王刚",
"jjr": "1",
"hzr": "2",
"sjgw": "46",
"cpsl": "33",
"qzsl": "1765",
"jd": "103.714911",
"wd": "30.629494"
},
{
"jdmc": "崇庆街道",
"fwmc": "崇庆街道西江社区党群服务中心",
"zzmc": "陈丽娟",
"jjr": "5",
"hzr": "7",
"sjgw": "18",
"cpsl": "15",
"qzsl": "2532",
"jd": "103.657393",
"wd": "30.641023"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道毛桥社区党群服务中心",
"zzmc": "李红梅",
"jjr": "3",
"hzr": "4",
"sjgw": "41",
"cpsl": "30",
"qzsl": "941",
"jd": "103.690241",
"wd": "30.640704"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道永安社区党群服务中心",
"zzmc": "赵志勇",
"jjr": "2",
"hzr": "5",
"sjgw": "23",
"cpsl": "17",
"qzsl": "1478",
"jd": "103.701054",
"wd": "30.655325"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道办事处(综合便民服务中心)",
"zzmc": "刘庆",
"jjr": "4",
"hzr": "9",
"sjgw": "38",
"cpsl": "24",
"qzsl": "2890",
"jd": "103.675986",
"wd": "30.648424"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道石羊社区党群服务中心",
"zzmc": "周伟",
"jjr": "1",
"hzr": "1",
"sjgw": "15",
"cpsl": "11",
"qzsl": "1136",
"jd": "103.695859",
"wd": "30.635775"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道明湖社区党群服务中心",
"zzmc": "吴海平",
"jjr": "5",
"hzr": "6",
"sjgw": "49",
"cpsl": "27",
"qzsl": "2011",
"jd": "103.728995",
"wd": "30.617806"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇阳街道成都市跨企业培训中心",
"zzmc": "张秀兰",
"jjr": "4",
"hzr": "3",
"sjgw": "29",
"cpsl": "12",
"qzsl": "1344",
"jd": "103.724047",
"wd": "30.629753"
},
{
"jdmc": "崇阳街道",
"fwmc": "崇州市人社局人力资源服务市场",
"zzmc": "赵晓燕",
"jjr": "10",
"hzr": "2",
"sjgw": "32",
"cpsl": "30",
"qzsl": "2357",
"jd": "103.697652",
"wd": "30.629184"
},
{
"jdmc": "崇阳街道",
"fwmc": "天府青年城就业创业驿站",
"zzmc": "孙晓军",
"jjr": "2",
"hzr": "8",
"sjgw": "11",
"cpsl": "7",
"qzsl": "798",
"jd": "103.69337",
"wd": "30.619366"
},
{
"jdmc": "大划街道",
"fwmc": "大划街道崇州市公共就业服务站(大划站)",
"zzmc": "郑学兵",
"jjr": "4",
"hzr": "7",
"sjgw": "43",
"cpsl": "34",
"qzsl": "1660",
"jd": "103.733269",
"wd": "30.58804"
},
{
"jdmc": "大划街道",
"fwmc": "大划街道办事处(党群服务中心)",
"zzmc": "杨德明",
"jjr": "1",
"hzr": "4",
"sjgw": "25",
"cpsl": "16",
"qzsl": "2671",
"jd": "103.74272",
"wd": "30.586272"
},
{
"jdmc": "羊马街道",
"fwmc": "羊马街道办事处(党群服务中心)",
"zzmc": "刘芳",
"jjr": "3",
"hzr": "5",
"sjgw": "37",
"cpsl": "30",
"qzsl": "1854",
"jd": "103.752865",
"wd": "30.661384"
},
{
"jdmc": "羊马街道",
"fwmc": "羊马街道安阜社区党群服务中心",
"zzmc": "周雅琴",
"jjr": "4",
"hzr": "1",
"sjgw": "17",
"cpsl": "13",
"qzsl": "2288",
"jd": "103.755043",
"wd": "30.613517"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道红土社区党群服务中心",
"zzmc": "吴静怡",
"jjr": "2",
"hzr": "9",
"sjgw": "44",
"cpsl": "33",
"qzsl": "1593",
"jd": "103.773983",
"wd": "30.591875"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道唐兴社区党群服务中心",
"zzmc": "徐国栋",
"jjr": "3",
"hzr": "6",
"sjgw": "26",
"cpsl": "18",
"qzsl": "2766",
"jd": "103.782691",
"wd": "30.595346"
},
{
"jdmc": "江源街道",
"fwmc": "江源街道办事处(综合便民服务中心)",
"zzmc": "郭斌",
"jjr": "1",
"hzr": "3",
"sjgw": "31",
"cpsl": "23",
"qzsl": "1240",
"jd": "103.782381",
"wd": "30.594802"
},
{
"jdmc": "三江街道",
"fwmc": "三江街道皂角社区党群服务中心",
"zzmc": "马晓辉",
"jjr": "3",
"hzr": "8",
"sjgw": "13",
"cpsl": "10",
"qzsl": "1939",
"jd": "103.782722",
"wd": "30.545252"
},
{
"jdmc": "三江街道",
"fwmc": "三江街道办事处(党群服务中心)",
"zzmc": "朱志华",
"jjr": "2",
"hzr": "2",
"sjgw": "47",
"cpsl": "37",
"qzsl": "832",
"jd": "103.775139",
"wd": "30.550747"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇五星村党群服务中心",
"zzmc": "胡家辉",
"jjr": "4",
"hzr": "7",
"sjgw": "22",
"cpsl": "13",
"qzsl": "1707",
"jd": "103.617672",
"wd": "30.62182"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇和乐社区党群服务中心",
"zzmc": "黄波",
"jjr": "5",
"hzr": "4",
"sjgw": "35",
"cpsl": "31",
"qzsl": "2483",
"jd": "103.617672",
"wd": "30.62182"
},
{
"jdmc": "白头镇",
"fwmc": "白头镇便民服务中心(党群服务中心)",
"zzmc": "林国平",
"jjr": "1",
"hzr": "5",
"sjgw": "19",
"cpsl": "16",
"qzsl": "2955",
"jd": "103.620409",
"wd": "30.599988"
},
{
"jdmc": "道明镇",
"fwmc": "道明镇便民服务中心(党群服务中心)",
"zzmc": "许军",
"jjr": "4",
"hzr": "9",
"sjgw": "40",
"cpsl": "31",
"qzsl": "1098",
"jd": "103.607164",
"wd": "30.677037"
},
{
"jdmc": "道明镇",
"fwmc": "道明镇白马社区党群服务中心",
"zzmc": "董志强",
"jjr": "3",
"hzr": "1",
"sjgw": "28",
"cpsl": "19",
"qzsl": "2186",
"jd": "103.666775",
"wd": "30.684182"
},
{
"jdmc": "观胜镇",
"fwmc": "观胜镇便民服务中心(党群服务中心)",
"zzmc": "孙慧敏",
"jjr": "2",
"hzr": "6",
"sjgw": "33",
"cpsl": "32",
"qzsl": "977",
"jd": "103.679284",
"wd": "30.746676"
},
{
"jdmc": "怀远镇",
"fwmc": "怀远镇泉水社区党群服务中心(党群活动中心)",
"zzmc": "郑丽萍",
"jjr": "3",
"hzr": "3",
"sjgw": "14",
"cpsl": "12",
"qzsl": "1618",
"jd": "103.539942",
"wd": "30.743908"
},
{
"jdmc": "怀远镇",
"fwmc": "怀远镇便民服务中心(党群服务中心)",
"zzmc": "杨晓",
"jjr": "3",
"hzr": "2",
"sjgw": "48",
"cpsl": "45",
"qzsl": "2304",
"jd": "103.541238",
"wd": "30.746072"
},
{
"jdmc": "街子镇",
"fwmc": "街子镇便民服务中心(崇州市街子镇综合便民服务和智慧蓉城运行中心)",
"zzmc": "郭雪梅",
"jjr": "1",
"hzr": "8",
"sjgw": "21",
"cpsl": "15",
"qzsl": "1421",
"jd": "103.573014",
"wd": "30.816296"
},
{
"jdmc": "街子镇",
"fwmc": "街子镇唐公社区党群服务中心",
"zzmc": "马玉玲",
"jjr": "4",
"hzr": "7",
"sjgw": "36",
"cpsl": "34",
"qzsl": "2069",
"jd": "103.564798",
"wd": "30.816778"
},
{
"jdmc": "廖家镇",
"fwmc": "廖家镇便民服务中心(党群服务中心)",
"zzmc": "朱晓红",
"jjr": "2",
"hzr": "4",
"sjgw": "16",
"cpsl": "13",
"qzsl": "1182",
"jd": "103.692861",
"wd": "30.707592"
},
{
"jdmc": "廖家镇",
"fwmc": "廖家镇明珠社区党群服务中心",
"zzmc": "胡彩莲",
"jjr": "5",
"hzr": "5",
"sjgw": "42",
"cpsl": "41",
"qzsl": "2578",
"jd": "103.704745",
"wd": "30.715253"
},
{
"jdmc": "廖家镇",
"fwmc": "隆兴镇便民服务中心(党群服务中心)",
"zzmc": "黄丽君",
"jjr": "3",
"hzr": "1",
"sjgw": "24",
"cpsl": "11",
"qzsl": "873",
"jd": "103.636015",
"wd": "30.584103"
},
{
"jdmc": "隆兴镇",
"fwmc": "隆兴镇中和社区党群服务中心",
"zzmc": "林小芳",
"jjr": "1",
"hzr": "9",
"sjgw": "30",
"cpsl": "23",
"qzsl": "1810",
"jd": "103.640649",
"wd": "30.592925"
},
{
"jdmc": "文井江镇",
"fwmc": "文井江镇综合便民服务中心(党群服务中心)",
"zzmc": "许娟",
"jjr": "2",
"hzr": "6",
"sjgw": "20",
"cpsl": "16",
"qzsl": "2231",
"jd": "103.669377",
"wd": "30.639533"
},
{
"jdmc": "文井江镇",
"fwmc": "文井江镇劳务合作社(文井江镇就业服务站)",
"zzmc": "董艳华",
"jjr": "2",
"hzr": "3",
"sjgw": "45",
"cpsl": "30",
"qzsl": "1396",
"jd": "103.675213",
"wd": "30.626786"
},
{
"jdmc": "元通镇",
"fwmc": "元通镇便民服务中心(党群服务中心)",
"zzmc": "孙斐",
"jjr": "3",
"hzr": "8",
"sjgw": "27",
"cpsl": "10",
"qzsl": "2823",
"jd": "103.630886",
"wd": "30.739136"
},
{
"jdmc": "元通镇",
"fwmc": "元通镇花果山社区党群服务中心",
"zzmc": "张建国",
"jjr": "1",
"hzr": "2",
"sjgw": "39",
"cpsl": "37",
"qzsl": "1555",
"jd": "103.630807",
"wd": "30.743803"
},
{
"jdmc": "崇州市人力资源服务产业园",
"fwmc": "江源街道红土社区党群服务中心",
"zz": "赵皓盈",
"jjr": "2",
"hzr": "9",
"zd":"40",
"sjgw": "44",
"cpsl": "33",
"qzsl": "1593",
"jd": "103.782722",
"wd": "30.545252"
}
]

View File

@ -0,0 +1,144 @@
<template>
<div class="box-container">
<div class="data-item"
v-for="(item, index) in dataItems"
:key="index">
<div class="mr15">
<img class="imgs"
:src="item.icon"
alt="" />
</div>
<div class="data-content">
<div class="label">{{ item.label }}</div>
<div class="value">{{ item.value }}</div>
<div class="value">{{ item.dw }}</div>
</div>
<div style="width:100%;"
class="mt20 flex flex-warp"
v-if="item.data">
<div class="data-content-item"
v-for="(itemchild, iex) in item.data"
:key="iex">
<div class="label">{{ itemchild.label }}</div>
<div class="value">{{ itemchild.value }} {{ itemchild.dw }}</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const dataItems = ref([
{
label: '岗位需求数',
value: 120000,
icon: require('@/assets/images/30.png'),
dw: '个'
},
{
label: '培训机构',
value: 5,
icon: require('@/assets/images/31.png'),
dw: '家'
},
{
label: '上架培训项目数',
value: 23,
icon: require('@/assets/images/32.png'),
dw: '个'
},
{
label: '学员入职率',
value: 93.80,
icon: require('@/assets/images/33.png'),
dw: '%'
},
{
label: '培训成效',
icon: require('@/assets/images/34.png'),
value: 3727,
dw: '次',
data: [
{ label: '培训项目', value: 53, dw: '个' },
{ label: '培训课程数', value: 114, dw: '个' },
{ label: '报名人次', value: 925, dw: '次' },
{ label: '签到人数', value: 886, dw: '人' },
{ label: '培训完结', value: 879, dw: '人' },
{ label: '证书颁发', value: 870, dw: '人' },
]
},
]);
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.box-container {
padding: 2vw 10px;
box-sizing: border-box;
border-radius: 8px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.data-item {
display: flex;
align-items: center;
flex-wrap: wrap;
padding: 10px 15px;
border-radius: 6px;
margin-bottom: 30px;
}
.data-content {
flex: 1;
display: flex;
align-items: center;
.label {
margin-left: 10px;
font-size: 2vw;
font-family: "YSBTH";
}
.value {
font-weight: bold;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#0deb0d, #ffffff);
margin-left: 40px;
}
}
.data-content-item {
width: 100%;
display: flex;
line-height: 4vw;
align-content: center;
.label {
margin-left: 80px;
font-size: 1.5vw;
font-family: "YSBTH";
}
.value {
font-weight: bold;
font-size: 1.5vw;
font-family: "YSBTH";
@include textColor(#0deb0d, #ffffff);
margin-left: 40px;
}
}
.imgs {
width: 6vw;
}
</style>

View File

@ -0,0 +1,125 @@
<template>
<div class="box-container">
<div class="data-item" v-for="(item, index) in dataItems" :key="index">
<div class="mr15">
<img class="imds" :src="item.icon" alt="" />
</div>
<div class="data-content">
<div class="label">{{ item.label }}</div>
<div class="value">{{ item.value }}</div>
</div>
<div style="width:100%;" class="mt20 flex flex-warp" v-if="item.data">
<div class="data-content-item" v-for="(itemchild, iex) in item.data" :key="iex">
<div class="label">{{ itemchild.label }}</div>
<div class="value">{{ itemchild.value }} {{ itemchild.dw }}</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const dataItems = ref([
{
label: '零工岗位',
icon:require('@/assets/images/4.png'),
value: '',
data: [
{label:'养老陪护',value:41,dw:'个'},
{label:'保洁家教',value:188,dw:'个'},
{label:'三嫂服务',value:103,dw:'个'},
{label:'家电清洗',value:18,dw:'个'},
{label:'家电维修',value:7,dw:'个'},
{label:'安装服务',value:5,dw:'个'},
]
},
{
label: '零工人才库',
icon:require('@/assets/images/5.png'),
value: 219,
},
{
label: '就业人次',
icon:require('@/assets/images/6.png'),
value: 271,
},
]);
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.box-container {
padding: 2vw 10px;
box-sizing: border-box;
border-radius: 8px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.data-item {
display: flex;
align-items: center;
flex-wrap: wrap;
padding: 2vw 15px;
// background: rgba(4, 24, 48, 0.8);
// border: 1px solid rgba(0, 157, 255, 0.3);
border-radius: 6px;
// box-shadow: 0 0 10px rgba(0, 157, 255, 0.1);
// transition: all 0.3s ease;
margin-bottom: 30px;
&:hover {
// transform: translateY(-2px);
// box-shadow: 0 0 15px rgba(0, 157, 255, 0.2);
}
}
.data-content {
flex: 1;
display: flex;
align-items: center;
.label {
margin-left: 40px;
font-size: 2vw;
font-family: "YSBTH";
// @include textColor(#8cc8ff, #ffffff);
}
.value {
font-weight: bold;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#0deb0d, #ffffff);
margin-left: 40px;
}
}
.data-content-item {
width: 100%;
display: flex;
line-height: 3vw;
.label {
margin-left: 100px;
margin-right: 30px;
font-size: 1.5vw;
font-family: "YSBTH";
// @include textColor(#ffa38c, #ffffff);
}
.value {
font-size: 1.5vw;
font-family: "YSBTH";
@include textColor(#0deb0d, #ffffff);
}
}
.imds{
width: 6vw;
}
</style>

View File

@ -0,0 +1,135 @@
<template>
<div class="box-container">
<div class="data-item" v-for="(item, index) in dataItems" :key="index">
<div class="mr15">
<img class="imds" :src="item.icon" />
</div>
<div class="data-content">
<div class="label">{{ item.label }}</div>
<div class="value">{{ item.value }}</div>
<div class="value">{{ item.dw }}</div>
</div>
<div style="width:100%;" class="mt20" v-if="item.data">
<div class="flex">
<div class="mr15">
<img class="imds" :src="item.data.icon" />
</div>
<div class="data-content">
<div class="label">{{ item.data.label }}</div>
</div>
</div>
<ul class="child-Box" v-for="(itemchild, iex) in item.data.list" :key="iex">
<li class="child-item flex align-center">
<span class="mr20 ml50">0{{ iex + 1 }}{{ itemchild.mc }}</span>
<span class="nums">{{ itemchild.num }} <span>{{ itemchild.dw }}</span></span>
</li>
</ul>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const dataItems = ref([
{
label: '用人单位数',
value: 233,
dw:'家',
icon:require('@/assets/images/1.png')
},
{
label: '发布岗位数',
dw:'个',
icon:require('@/assets/images/2.png'),
value: 9637,
data: {
label: '招聘热门岗位',
icon:require('@/assets/images/35.png'),
list: [
{ mc: '制造业普工', num: 4000, dw: '岗位' },
{ mc: '光伏业务员', num: 1400, dw: '岗位'},
{ mc: '软件开发', num: 800, dw: '岗位' },
]
}
},
{
label: '匹配入职人数',
value: 1300,
icon: require('@/assets/images/3.png'),
dw:'人',
data: {
label: '入职热门岗位',
icon:require('@/assets/images/36.png'),
list: [
{ mc: '普工', num: 680, dw: '岗位', },
{ mc: '销售', num: 230, dw: '岗位' },
{ mc: '操作工', num: 103, dw: '岗位' },
]
}
}
]);
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 60%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.box-container {
padding: 2vw 20px;
border-radius: 8px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.data-item {
display: flex;
align-items: center;
flex-wrap: wrap;
border-radius: 6px;
}
.data-content {
flex: 1;
display: flex;
align-items: center;
.label {
font-size: 2vw;
margin-left: 40px;
font-family: "YSBTH";
@include textColor(#8cc8ff, #ffffff);
}
.value {
font-weight: bold;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#03aaec, #ffffff);
margin-left: 40px;
}
}
.child-item {
padding: 6px 30px;
box-sizing: border-box;
font-size: 1.5vw;
font-family: "YSBTH";
// line-height: 4vw;
.nums{
@include textColor(#03aaec, #ffffff);
}
span {
flex: 1;
}
}
.imds{
width: 6vw;
}
</style>

View File

@ -0,0 +1,108 @@
<template>
<div class="box-container">
<div class="data-item"
v-for="(item, index) in dataItems"
:key="index">
<div class="mr15">
<img class="imds"
:src="item.icon"
alt="" />
</div>
<div class="data-content">
<div class="label">{{ item.label }}</div>
<div class="value">{{ item.value }}</div>
<div class="value">{{ item.dw }}</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const dataItems = ref([
{
label: '实习合作企业',
value: 43,
icon: require('@/assets/images/11.png'),
dw: '家'
},
{
label: '实习合作院校',
icon: require('@/assets/images/12.png'),
value: 28,
dw: '个'
},
{
label: '校企联合实习基地',
icon: require('@/assets/images/38.png'),
value: 3,
dw: '个'
},
{
label: '定向推送实习岗位',
icon: require('@/assets/images/37.png'),
value: 64,
dw: '个'
},
{
label: '实习入职人员',
icon: require('@/assets/images/14.png'),
value: 2780,
dw: '人'
},
]);
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.box-container {
padding: 2vw 10px;
border-radius: 8px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.data-item {
display: flex;
align-items: center;
flex-wrap: wrap;
padding: 2vw 15px;
border-radius: 6px;
transition: all 0.3s ease;
margin-bottom: 30px;
}
.data-content {
flex: 1;
display: flex;
align-items: center;
.label {
font-size: 14px;
// margin-left: 40px;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#8cc8ff, #ffffff);
}
.value {
font-weight: bold;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#e6f703, #ffffff);
margin-left: 40px;
}
}
.imds {
width: 6vw;
}
</style>

View File

@ -0,0 +1,142 @@
<template>
<div class="box-container">
<div class="data-item"
v-for="(item, index) in dataItems"
:key="index">
<div class="mr15">
<img class="imgs"
:src="item.icon"
alt="" />
</div>
<div class="data-content">
<div class="label">{{ item.label }}</div>
<div class="value">{{ item.value }}</div>
<div class="numbe">{{ item.dw }}</div>
</div>
<div style="width:100%;"
class="mt20 flex flex-warp"
v-if="item.data">
<div class="data-content-item pl50"
v-for="(itemchild, iex) in item.data"
:key="iex">
<div class="label">{{ itemchild.label }}</div>
<div class="value">{{ itemchild.value }} {{ itemchild.dw }}</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const dataItems = ref([
{
label: '帮扶就业困难人员',
value: 55,
icon: require('@/assets/images/41.png'),
dw: '人',
data: [
{ label: '城镇零就业家庭成员', value: 0, dw: '人' },
{ label: '城镇低保家庭', value: 5175, dw: '人' },
{ label: '残疾人', value: 18000, dw: '人' },
{ label: '现役军人配偶', value: 8970, dw: '人' },
{ label: '烈士家属', value: 48, dw: '人' },
{ label: '脱贫劳动力', value: 119000, dw: '人' },
{ label: '农村低收入群体', value: 11200, dw: '人' },
]
},
{
label: '困难毕业生',
icon: require('@/assets/images/29.png'),
value: 1434,
dw: '人'
},
{
label: '退役军人',
value: 25700,
icon: require('@/assets/images/39.png'),
dw: '人'
},
{
label: '长期失业人员',
icon: require('@/assets/images/40.png'),
value: 2208,
dw: '人'
},
]);
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.box-container {
padding: 2vw 10px 3vw;
box-sizing: border-box;
border-radius: 8px;
height: 100%;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.data-item {
display: flex;
align-items: center;
flex-wrap: wrap;
border-radius: 6px;
}
.data-content {
flex: 1;
display: flex;
align-items: center;
.label {
margin-left: 40px;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#8cc8ff, #ffffff);
}
.value {
font-weight: bold;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#07c5f5, #ffffff);
margin-left: 40px;
}
.numbe{
font-size: 2vw;
font-family: "YSBTH";
}
}
.data-content-item {
width: 100%;
display: flex;
line-height: 4vw;
align-content: center;
.label {
margin-left: 20px;
font-size: 1.5vw;
margin-right: 40px;
font-family: "YSBTH";
}
.value {
font-size: 1.5vw;
font-family: "YSBTH";
@include textColor(#8cc8ff, #ffffff);
}
}
.imgs {
width: 6vw;
}
</style>

View File

@ -0,0 +1,177 @@
<template>
<div class="bigScrenn cppBox">
<!-- 第一部分 -->
<div class="none-Cont" >
<Head title='兴蜀来了人力资源搓配服务平台'></Head>
<div class="conttent">
<echartsMap></echartsMap>
</div>
</div>
<!-- 第二个部分 -->
<div class="two-cont">
<ul class="cntBoxcpp flex">
<li class="childOne">
<div class="title-small">全职招聘</div>
<div class="childCnt">
<qzzp></qzzp>
</div>
</li>
<li class="childOne">
<div class="title-small">零工招聘</div>
<div class="childCnt">
<lgzp></lgzp>
</div>
</li>
<li class="childOne">
<div class="title-small">实习招聘</div>
<div class="childCnt">
<sszp></sszp>
</div>
</li>
</ul>
</div>
<!-- 第三部分-->
<div class="two-cont">
<ul class="cntBoxcpp flex">
<li class="childOne">
<div class="title-small">创业撮合</div>
<div class="childCnt">
<cych></cych>
</div>
</li>
<li class="childOne">
<div class="title-small">技能培训</div>
<div class="childCnt">
<jnpx></jnpx>
</div>
</li>
<li class="childOne">
<div class="title-small">重点人群</div>
<div class="childCnt">
<zdrq></zdrq>
</div>
</li>
</ul>
</div>
</div>
</template>
<script setup>
import echartsMap from './components/echartsMap.vue';
import qzzp from './components/qzzp.vue';
import lgzp from './components/lgzp.vue';
import sszp from './components/sszp.vue';
import cych from './components/cych.vue';
import jnpx from './components/jnpx.vue';
import zdrq from './components/zdrq.vue';
import Head from "@/views/largeScreen/layout/head.vue";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import {
ref,
reactive,
onMounted,
onUnmounted,
getCurrentInstance,
onBeforeUnmount
} from "vue";
const { proxy } = getCurrentInstance();
const data = reactive({
});
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0deg, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.cppBox {
width: 100%;
background: url("~@/assets/images/bigHome.png") no-repeat center center;
background-size: 100% 100%;
padding: 0 60px;
box-sizing: border-box;
}
// 第一部分
.none-Cont {
height: calc(100% / 3);
// height: 900px;
position: relative;
.conttent {
position: absolute;
height: calc(100% - 120px);
width: 100%;
overflow: auto;
top: 9vw;
padding: 0 10px 10px;
box-sizing: border-box;
.conttentOne {
width: 100%;
height: calc(100% - 286px);
padding-bottom: 20px;
box-sizing: border-box;
}
}
}
// 第二三不部分
.two-cont {
height: calc(100% / 3);
padding-bottom: 20px;
box-sizing: border-box;
.cntBoxcpp {
height: 100%;
overflow: hidden;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
padding: 0 10px;
box-sizing: border-box;
.childOne {
width: 33%;
height: 100%;
background: url("~@/assets/images/bg_16.png") no-repeat center center;
background-size: 100% 100%;
.childCnt {
height: calc(100% - 80px);
overflow: hidden;
padding: 0 10px;
box-sizing: border-box;
}
}
}
.chartsBox {
height: calc(100% - 125px);
overflow: hidden;
}
}
.title-small {
line-height: 130px;
padding-left: 150px;
box-sizing: border-box;
font-size: 2.2vw;
font-family: "icrosoft YaHei";
position: relative;
background: url("~@/assets/images/ttt.png") no-repeat center center;
background-size: 100% 100%;
&::before {
position: absolute;
content: "";
left: 50px;
top: 38px;
width: 68px;
height: 68px;
background: url("~@/assets/images/icon_20.png") no-repeat center center;
background-size: 100% 100%;
}
}
</style>

View File

@ -0,0 +1,213 @@
<template>
<!-- 技能岗位薪资酬对比 -->
<div ref="gwxcdbEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const gwxcdbEcharts = ref()
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
var option = {
color: ["#00DFE3", "#00ABFB", "#21F9A3", "#F9C521"],
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985"
}
}
},
legend: {
data: ["技能岗位需求数", '非技能岗位需求数'],
show: true,
right: 10,
top: 10,
textStyle: { color: "#fff", fontSize: 32 },
},
grid: {
top: "10%",
right: "10%",
left: "10%",
bottom: "4%",
containLabel: true
},
xAxis: [
{
type: "category",
boundaryGap: false,
show: true,
data: ['2020', '2021', '2022', '2023', '2024'],
splitLine: {
show: false
},
axisTick: {
show: false,
},
axisLine: {
lineStyle: {
color: "#fff"
}
},
axisLabel: {
fontSize: 30,
interval: 0
},
lineStyle: {
color: "#fff"
}
}
],
yAxis: [
{
axisTick: {
show: false
},
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
},
axisLabel: {
fontSize: 30,
interval: 0
},
splitLine: {
show: true,
lineStyle: {
color: "rgb(15,36,90)",
type: "solid"
}
}
}
],
series: [
{
name: "技能岗位需求数",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [6700, 7800, 10100, 11010, 13200]
},
{
name: "非技能岗位需求数",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [18600, 17100, 14200, 13100, 13200]
},
{
name: "增幅",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [20, 20, 20]
},
]
};
nextTick(() => {
var myChart = echarts.init(gwxcdbEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,66 @@
<template>
<!-- 机构数量 -->
<ul>
<li v-for="item in dataList" :key="item">
<div class="name_text">{{ item.name }}</div>
<div class="num">{{ item.num }}</div>
</li>
</ul>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jgslEcharts = ref();
const dataList = ref([
{
name: '招聘机构',
num: 17
},
{
name: '猎头公司',
num: 0
},
{
name: '培训机构',
num: 5
},
{
name: '劳务派遣',
num: 2
}
])
onMounted(() => {
});
</script>
<style lang="scss" scoped>
ul {
display: flex;
flex-wrap: wrap;
li {
width: 50%;
text-align: center;
align-items: center;
font-size: 18px;
height: 450px;
display: flex;
font-family: "YSBTH";
justify-content: center;
flex-wrap: wrap;
.name_text {
font-size: 2.2vw;
width: 100%;
color: aqua;
}
.num{
font-size: 2vw;
width: 100%;
}
}
}
</style>

View File

@ -0,0 +1,115 @@
<template>
<!-- 失业率 -->
<div ref="sylEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const sylEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
let option = {
legend: {
show: true
},
grid: {
left: "10px",
right: "30px",
bottom: "10px",
top: "20px",
containLabel: true
},
yAxis: {
type: "value",
axisLine: { lineStyle: { color: "#c3c5c8" } },
splitLine: { show: false },
axisLabel: {
fontSize: 40,
interval: 0
},
},
xAxis: {
type: "category",
data: ["招聘机构", "猎头公司", "培训机构", "劳务派遣公司"],
axisLine: { show: true, lineStyle: { color: "#c3c5c8" } },
splitLine: {
show: true,
lineStyle: { color: "#21343e" }
},
axisLabel: {
// rotate: 20,
fontSize: 10,
interval: 0
},
axisLabel: {
fontSize: 40,
interval: 0
},
axisTick: { show: false }
},
series: [
{
data: [25, 60, 75, 87],
type: "bar",
barWidth: 60,
label: {
show: true,
position: 'top', // 将标签显示在柱状图的顶部
color: "#fff",
formatter: '{c} %' // {c}表示数据值,{d}%表示百分比,计算方式为 (c / 总和) * 100%
},
itemStyle: {
type: "bar",
color: function (params) {
switch (params.dataIndex) {
case 0:
return new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{ offset: 0, color: "#eb2b2b" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
case 1:
case 2:
case 3:
return new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{ offset: 0, color: "#ff9500" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
}
}
}
}
]
};
nextTick(() => {
var myChart = echarts.init(sylEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,210 @@
<template>
<div class="seconent">
<div class="inbox flex space-between">
<ul class="inLeft items">
<li class="child left_child" v-for="it in data.left" :key="it">
<div class="text">{{ it.label }}</div>
<div v-if="it.label == '人才供需比例'">
<div class="num">需求人力:2452</div>
<div class="num">供应人力:4752</div>
</div>
<div v-else class="num">{{ it.per }}</div>
</li>
</ul>
<ul class="inright items tc">
<li class="child relative right_child" v-for="it in data.right" :key="it">
<div class="text">{{ it.label }}</div>
<div class="num">{{ it.per }}</div>
</li>
</ul>
</div>
<div class="incenter items">
<div class="hedbt"><span class="text">产业求人倍率</span></div>
<ul class="ctbox flex">
<li>第一产业1.2</li>
<li>第二产业1.6</li>
<li>第三产业1.4</li>
</ul>
</div>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
const data = reactive({
left: [
{ label: "人才供需比例", per: "12%" },
{ label: "技能岗位占比", per: "80%" },
{ label: "行业需求增幅", per: "5.6%" }
],
right: [
{ label: "总体就业率", per: "78.3%" },
{ label: "总体失业率", per: "23.1%" },
{ label: "人才流失比例", per: "34.2%" }
]
});
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 70%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.seconent {
position: relative;
height: 100%;
}
.inbox {
width: 100%;
height: 100%;
margin-top: 2vw;
.items {
width: 50%;
height: 70%;
.child {
height: 170px;
background-size: 100% 100%;
}
.left_child {
// width: 439px;
background-size: 100% 100%;
.text {
margin-left: 5vw;
margin-top: -24px;
white-space: nowrap;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#5cb2f7, #ffffff);
}
.num {
margin-left: 5vw;
font-family: "YSBTH";
white-space: nowrap;
font-size: 1.6vw;
@include textColor(#5cb2f7, #ffffff);
}
&:nth-child(1) {
margin-left: 12vw;
background: url("~@/assets/images/ztjyl.png") no-repeat;
}
&:nth-child(2) {
background: url("~@/assets/images/rclsl.png") no-repeat;
}
&:nth-child(3) {
margin-left: 12vw;
background: url("~@/assets/images/ztsyl.png") no-repeat;
}
}
.right_child {
width: 500px;
background-size: 100% 100%;
.text {
margin-right: 4vw;
margin-top: -24px;
white-space: nowrap;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#5cb2f7, #ffffff);
}
.num {
margin-right: 5vw;
font-family: "YSBTH";
white-space: nowrap;
font-size: 1.6vw;
@include textColor(#5cb2f7, #ffffff);
}
&:nth-child(1) {
margin-right: 12vw;
background: url("~@/assets/images/hyxqzf.png") no-repeat right center;
}
&:nth-child(2) {
background: url("~@/assets/images/jngw.png") no-repeat right center;
}
&:nth-child(3) {
margin-right: 12vw;
background: url("~@/assets/images/rcxq.png") no-repeat right center;
}
}
}
.inLeft,
.inright {
display: flex;
flex-direction: column;
justify-content: space-around;
align-items: center;
}
.inLeft {
// margin-left: -2vw;
}
.inright {
margin-left: 25vw;
.num {
margin-left: 40px !important;
}
}
.ohher {
position: absolute;
top: 60px;
left: 162px;
font-family: "YSBTH";
font-size: 16px;
white-space: nowrap;
}
}
.incenter {
box-sizing: border-box;
position: absolute;
top: 73%;
left: 50%;
transform: translateX(-54%);
width: 60%;
.hedbt {
text-align: center;
margin-bottom: 10px;
.text {
white-space: nowrap;
font-size: 2vw;
font-family: "YSBTH";
@include textColor(#5cb2f7, #ffffff);
margin-left: 70px;
}
}
.ctbox {
justify-content: space-around;
padding-left: 30px;
font-size: 3vw;
font-family: "YSBTH";
@include textColor(#5cb2f7, #ffffff);
}
}
</style>

View File

@ -0,0 +1,83 @@
<template>
<!-- 产业供需分析 -->
<ul>
<li v-for="item in dataList" :key="item">
<el-row :gutter="20">
<el-col :span="6">
<div class="name_text">
{{ item.name }}
</div>
</el-col>
<el-col :span="6">
<div class="cont_text">
生产总值<br />{{ item.sczz }}亿
</div>
</el-col>
<el-col :span="6">
<div class="cont_text">
岗位需求<br />{{ item.gwxq }}
</div>
</el-col>
<el-col :span="6">
<div class="cont_text">
供给人数<br />{{ item.gjrs }}
</div>
</el-col>
</el-row>
</li>
</ul>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick, ref } from "vue";
const dataList = ref([
{
name: '第一产业',
sczz: 36.75,
gwxq: 5477,
gjrs: 5525
},
{
name: '第二产业',
sczz: 240.9,
gwxq: 3176,
gjrs: 5525
},
{
name: '第三产业',
sczz: 232.79,
gwxq: 3050,
gjrs: 5525
}
])
onMounted(() => {
});
</script>
<style lang="scss" scoped>
ul {
padding: 10px;
box-sizing: border-box;
font-family: "YSBTH";
li {
height: 4.1vw;
.cont_text {
font-size: 1.6vw;
}
}
.name_text {
font-size: 1.2vw;
}
}
::v-deep .el-row {
align-items: center;
width: 100%;
}
</style>

View File

@ -0,0 +1,206 @@
<template>
<!-- 供需技能匹配分析 -->
<div ref="ghyxqEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted,ref , nextTick } from "vue";
const ghyxqEcharts = ref()
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
var option = {
color: ["#00DFE3", "#00ABFB", "#21F9A3", "#F9C521"],
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985"
}
}
},
legend: {
data: ["去年同期",'今年年同期','增幅'],
show: true,
right: 10,
top: 10,
textStyle: { color: "#fff" },
},
grid: {
top: "24%",
right: "10%",
left: "10%",
bottom: "4%",
containLabel: true
},
xAxis: [
{
type: "category",
boundaryGap: false,
show: true,
data: ['制造业','信息技术业','建筑业'],
splitLine: {
show: false
},
axisTick:{
show:false,
},
axisLine: {
lineStyle: {
color: "#fff"
}
},
lineStyle: {
color: "#fff"
}
}
],
yAxis: [
{
axisTick: {
show: false
},
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
},
splitLine: {
show: true,
lineStyle: {
color: "rgb(15,36,90)",
type: "solid"
}
}
}
],
series: [
{
name: "去年同期",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [20,40,53]
},
{
name: "今年年同期",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [30,50,53]
},
{
name: "增幅",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [20,20,20]
},
]
};
nextTick(() => {
var myChart = echarts.init(ghyxqEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,118 @@
<template>
<!-- 供需技能匹配分析 -->
<div id="gjgrzmydEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick } from "vue";
onMounted(() => {
lineChartFn();
});
const lineChartFn = (val) => {
var myChart = echarts.init(document.getElementById("gjgrzmydEcharts"));
var option = {
// legend: {
// show: true,
// right: 10,
// top: 10,
// textStyle: { color: "#fff" },
// data: ["总岗位数量", "需求技能岗位数量"]
// },
tooltip: {
trigger: "axis",
axisPointer: { type: "shadow" }
},
grid: {
top: "20%",
right: "10%",
left: "14%",
bottom: "12%"
},
yAxis: [
{
type: "category",
axisTick: {
show: false
},
splitLine: {
show: false
},
axisPointer: {
type: "shadow"
},
axisLine: {
show: false,
lineStyle: {
color: "#fff"
},
show: false
},
axisTick: {
show: false,
},
axisLabel: {
rotate: 40,
fontSize: 10,
interval: 0
},
data: ["装备制造业", "电子信息产业",'航空航天产业','新能源产业','生物科技与医疗健康产业'],
}
],
xAxis: [
{
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
},
splitLine: {
show: true,
lineStyle: {
color: "rgb(15,36,90)",
type: "solid"
}
}
}
],
series: [
{
name: "总岗位数量",
type: "bar",
stack:'total',
data: [10000, 6500, 3000,2500,1500],
barWidth: 10,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#7d792e" },
{ offset: 1, color: "#f1c515" }
],false),
borderColor:new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset:1,color:'#f1c515'},
{ offset:1, color:'#f1c515'}
],false),
shadowColor: "#f1c515",
shadowBlur: 2
},
},
},
]
};
option && myChart.setOption(option);
myChart.on("click", function (params) {});
window.onresize = function () {
myChart.resize();
};
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,118 @@
<template>
<!-- 供需技能匹配分析 -->
<div id="gjgrzmydEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick } from "vue";
import { rotate } from "ol/transform";
onMounted(() => {
lineChartFn();
});
const lineChartFn = (val) => {
var myChart = echarts.init(document.getElementById("gjgrzmydEcharts"));
var option = {
// legend: {
// show: true,
// right: 10,
// top: 10,
// textStyle: { color: "#fff" },
// data: ["总岗位数量", "需求技能岗位数量"]
// },
tooltip: {
trigger: "axis",
axisPointer: { type: "shadow" }
},
grid: {
top: "8%",
right: "10%",
left: "35%",
bottom: "12%"
},
yAxis: [
{
type: "category",
axisTick: {
show: false
},
splitLine: {
show: false
},
axisPointer: {
type: "shadow"
},
axisLine: {
show: false,
lineStyle: {
color: "#fff"
},
show: false
},
axisTick: {
show: false,
},
axisLabel: {
rotate:0,
fontSize: 51,
interval: 0
},
data: ["装备制造业", "电子信息产业", '航空航天产业', '新能源产业', '生物科技与医疗健康'],
}
],
xAxis: [
{
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
},
splitLine: {
show: true,
lineStyle: {
color: "rgb(15,36,90)",
type: "solid"
}
}
}
],
series: [
{
name: "总岗位数量",
type: "bar",
stack: 'total',
data: [10000, 6500, 3000, 2500, 1500],
barWidth: 30,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#7d792e" },
{ offset: 1, color: "#f1c515" }
], false),
borderColor: new echarts.graphic.LinearGradient(0, 0, 0, 1,
[
{ offset: 1, color: '#f1c515' },
{ offset: 1, color: '#f1c515' }
], false),
shadowColor: "#f1c515",
shadowBlur: 2
},
},
},
]
};
option && myChart.setOption(option);
myChart.on("click", function (params) { });
window.onresize = function () {
myChart.resize();
};
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,75 @@
<template>
<!-- 机构数量 -->
<ul class="mr40">
<li v-for="item in dataList" :key="item">
<div class="name_text">{{ item.name }}</div>
<div class="num">{{ item.num }}%</div>
</li>
</ul>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jgslEcharts = ref();
const dataList = ref([
{
name: '院校毕业生',
num: 78
},
{
name: '就业困难人群',
num: 45
},
{
name: '退役军人',
num: 78
},
{
name: '失业人群',
num: 72
},
{
name: '残疾人',
num: 34
},
{
name: '其他人群',
num: 65
}
])
onMounted(() => {
});
</script>
<style lang="scss" scoped>
ul {
display: flex;
flex-wrap: wrap;
li {
width: 50%;
text-align: center;
align-items: center;
font-size: 36px;
height: 320px;
display: flex;
font-family: "YSBTH";
justify-content: center;
flex-wrap: wrap;
.name_text {
font-size: 2vw;
width: 100%;
color: skyblue;
}
.num{
width: 100%;
font-size: 2vw;
}
}
}
</style>

View File

@ -0,0 +1,206 @@
<template>
<!-- 技能岗位薪资酬对比 -->
<div ref="gwxcdbEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted,ref , nextTick } from "vue";
const gwxcdbEcharts = ref()
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
var option = {
color: ["#00DFE3", "#00ABFB", "#21F9A3", "#F9C521"],
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985"
}
}
},
legend: {
data: ["技能岗位",'非技能岗位'],
show: true,
right: 10,
top: 10,
textStyle: { color: "#fff" },
},
grid: {
top: "24%",
right: "10%",
left: "10%",
bottom: "4%",
containLabel: true
},
xAxis: [
{
type: "category",
boundaryGap: false,
show: true,
data: ['A岗位','B岗位','C岗位'],
splitLine: {
show: false
},
axisTick:{
show:false,
},
axisLine: {
lineStyle: {
color: "#fff"
}
},
lineStyle: {
color: "#fff"
}
}
],
yAxis: [
{
axisTick: {
show: false
},
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
},
splitLine: {
show: true,
lineStyle: {
color: "rgb(15,36,90)",
type: "solid"
}
}
}
],
series: [
{
name: "技能岗位",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [20,40,53]
},
{
name: "非技能岗位",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [30,50,53]
},
{
name: "增幅",
type: "line",
stack: "Total",
// smooth: true,
lineStyle: {
width: 2
},
// showSymbol: false,
// areaStyle: {
// opacity: 0.8,
// color: {
// opacity: 0.8,
// colorStops: [
// {
// offset: 0,
// color: "rgba(0,233,227,0)"
// },
// {
// offset: 0.5,
// color: "rgba(0,233,227,0.5)"
// },
// {
// offset: 1,
// color: "rgba(0,233,227,1)"
// }
// ],
// global: false
// }
// },
emphasis: {
focus: "series"
},
data: [20,20,20]
},
]
};
nextTick(() => {
var myChart = echarts.init(gwxcdbEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,158 @@
<template>
<!-- 重点企业缺口需求 -->
<div class="review_box" id="review" @mouseover="rollStop()" @mouseout="rollStart(60)">
<ul id="comment1" class="zdqyqkxqBox noScollLine">
<li v-for="(it, indx) in list" :key="indx" class="lineItem flex align-center mb4">
<div class="label">
<span class="order mr4" :style="{ color: indx < 3 ? '#01d0db' : '' }">TOP.{{ indx + 1 }}</span>
<img class="ml20 mr10" src="@/assets/images/icon_03.png" alt="">
<span class="ml4 text one_text_detail" :style="{ color: indx < 3 ? '#01d0db' : '' }">{{ it.mc }}</span>
</div>
<div class="line">
<div class="lineOut">
<div class="persont" :style="{ width: it.persont }"></div>
</div>
</div>
<div class="num">{{ it.num }}</div>
</li>
</ul>
<ul id="comment2" class="zdqyqkxqBox noScollLine"></ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, defineProps, onUnmounted } from "vue";
const props = defineProps({
data: Object,
})
const list = ref([
{ mc: '数控操作技师', persont: '90%', num: 1079 },
{ mc: '车工(服装制造)', persont: '80%', num: 867 },
{ mc: '应用工程师', persont: '70%', num: 804 },
{ mc: '交易业务专员', persont: '60%', num: 778 },
{ mc: '产品实施顾问', persont: '50%', num: 352 },
])
const timer = ref(null)
onMounted(() => {
// roll(60)
})
onUnmounted(() => {
if (timer.value) clearInterval(timer.value)
})
// 滚动
function roll(t) {
var ul1 = document.getElementById("comment1");
var ul2 = document.getElementById("comment2");
var ulbox = document.getElementById("review");
ul2.innerHTML = ul1.innerHTML;
ulbox.scrollTop = 0;
rollStart(t);
}
// 开始滚动
function rollStart(t) {
var ul1 = document.getElementById("comment1");
var ul2 = document.getElementById("comment2");
var ulbox = document.getElementById("review");
rollStop();
timer.value = setInterval(() => {
// 当滚动高度大于列表内容高度时恢复为0
if (ulbox.scrollTop >= 204) {
ulbox.scrollTop = 0;
} else {
ulbox.scrollTop++;
}
}, t);
}
// 停止滚动
function rollStop() {
clearInterval(timer.value);
}
</script>
<style lang="scss" scoped>
.review_box {
// padding: 10px;
box-sizing: border-box;
width: 100%;
height: 100%;
overflow: hidden;
}
.zdqyqkxqBox {
width: 100%;
height: 100%;
overflow: hidden;
// overflow-y: auto;
// padding: 6px 0;
box-sizing: border-box;
.lineItem {
margin: 1px 0;
.label {
width: 36%;
font-size: 1.6vw;
font-family: "DigifaceWide";
display: flex;
align-items: center;
.order {
display: inline-block;
width: 120px;
white-space: nowrap;
}
.text {
display: inline-block;
width: 280px;
white-space: nowrap;
}
}
.line {
width: 54%;
height: 12px;
padding: 0 4px;
border: 1px solid #1e3a44;
border-radius: 4px;
display: flex;
align-items: center;
.lineOut {
width: 100%;
height: 5px;
background: rgba(32, 74, 111, 0.5);
.persont {
height: 5px;
background: linear-gradient(60deg, #187593 0%, #aff1f4 100%);
border-radius: 10px;
position: relative;
&::after {
position: absolute;
content: "";
right: -6px;
top: -7px;
width: 18px;
height: 19px;
background: url('~@/assets/images/icon_04.png') no-repeat left bottom;
background-size: 100%;
}
}
}
}
.num {
width: 10%;
font-size: 1.3vw;
margin-left: 10px;
}
}
}
</style>

View File

@ -0,0 +1,107 @@
<template>
<!-- 行业就业率 -->
<div ref="jgrzcglEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jgrzcglEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
let option = {
legend: {
show: true
},
grid: {
left: "10px",
right: "30px",
bottom: "10px",
top: "20px",
containLabel: true
},
xAxis: {
type: "value",
axisLine: { lineStyle: { color: "#c3c5c8" } },
splitLine: { show: false }
},
yAxis : {
type: "category",
data: ["制造业","金融业",'房地产业'],
axisLine: { show: false, lineStyle: { color: "#c3c5c8" } },
splitLine: {
show: true,
lineStyle: { color: "#21343e" }
},
axisLabel: {
rotate: 20,
fontSize: 10,
interval: 0
},
axisTick: { show: false }
},
series: [
{
data: [10, 20,30],
type: "bar",
barWidth: "14px",
label: {
show: true,
position: "right",
color: "#fff"
},
itemStyle: {
type: "bar",
color: function (params) {
switch (params.dataIndex) {
case 0:
return new echarts.graphic.LinearGradient(
1,
0,
0,
0,
[
{ offset: 0, color: "#eb2b2b" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
case 1:
case 2:
return new echarts.graphic.LinearGradient(
1,
0,
0,
0,
[
{ offset: 0, color: "#ff9500" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
}
}
}
}
]
};
nextTick(() => {
var myChart = echarts.init(jgrzcglEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,132 @@
<template>
<!-- 各类机构入职满意度 -->
<div ref="jgmydEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jgmydEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
let option = {
legend: {
show: true
},
grid: {
left: "10px",
right: "30px",
bottom: "10px",
top: "20px",
containLabel: true
},
yAxis: {
type: "value",
axisLine: { lineStyle: { color: "#c3c5c8" } },
splitLine: { show: false }
},
xAxis: {
type: "category",
data: ["招聘公司", "猎头公司", "培训机构", "劳动派遣公司"],
axisLine: { show: false, lineStyle: { color: "#c3c5c8" } },
splitLine: {
show: true,
lineStyle: { color: "#21343e" }
},
axisLabel: {
rotate: 20,
fontSize: 10,
interval: 0
},
axisTick: { show: false }
},
series: [
{
data: [10, 20, 30, 20, 15],
type: "bar",
barWidth: "14px",
label: {
show: true,
position: "top",
color: "#fff"
},
itemStyle: {
type: "bar",
color: function (params) {
switch (params.dataIndex) {
case 0:
return new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{ offset: 0, color: "#eb2b2b" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
case 1:
return new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{ offset: 0, color: "#ff9500" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
case 2:
case 3:
return new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{ offset: 0, color: "rgb(24, 245, 157)" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
case 4:
return new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{ offset: 0, color: "#7d792e" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
}
}
}
}
]
};
nextTick(() => {
var myChart = echarts.init(jgmydEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,91 @@
<template>
<!-- 技能培训机构分布 -->
<div ref="jsjgpxfbEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jsjgpxfbEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
var option = {
backgroundColor: "rgba(0,0,0,0)",
// legend: {
// icon: "circle",
// bottom: 0,
// left: 0,
// itemWidth: 16,
// itemGap: 10,
// },
tooltip: {
trigger: "item"
},
series: [
{
type: "pie",
radius: ["65%", "0%"],
center: ["48%", "48%"],
// avoidLabelOverlap: false,
label: {
normal: {
show: true,
color: "#fff",
formatter: (param) => {
return `{a|${param.name}}\n{c|${param.value}}`;
},
rich: {
a: {
fontSize: 12,
color: "#fff",
},
b: {
color: "#accdff"
},
c: {
fontSize: 14,
color: "#2682ff",
lineHeight: 30
}
}
},
emphasis: {
show: true
}
},
labelLine: {
show: true,
length: 20
},
data: [
{name:'A区域',value:50},
{name:'B区域',value:50},
{name:'C区域',value:50},
{name:'D区域',value:50},
],
animationType: "scale",
animationEasing: "elasticOut",
animationDelay: function (idx) {
return Math.random() * 200;
}
}
]
};
nextTick(() => {
var myChart = echarts.init(jsjgpxfbEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,142 @@
<template>
<!-- 重点企业技能短缺招聘难度 -->
<div id="jnzpndEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick } from "vue";
onMounted(() => {
lineChartFn();
});
const lineChartFn = (val) => {
var myChart = echarts.init(document.getElementById("jnzpndEcharts"));
var option = {
legend: {
show: true,
right: 10,
top: 10,
textStyle: { color: "#fff" },
data: ["无技能要求", "技能要求"]
},
tooltip: {
trigger: "axis",
axisPointer: { type: "shadow" }
},
grid: {
top: "14%",
right: "4%",
left: "10%",
bottom: "12%"
},
xAxis: [
{
type: "category",
axisTick: {
show: false
},
splitLine: {
show: false
},
axisPointer: {
type: "shadow"
},
axisLine: {
show: false,
lineStyle: {
color: "#fff"
},
show: false
},
axisTick: {
show: false,
},
axisLabel: {
// rotate: 50,
fontSize: 10,
interval: 0
},
data: ["A企业", "B企业",'C企业','D企业','E企业'],
}
],
yAxis: [
{
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
},
splitLine: {
show: true,
lineStyle: {
color: "rgb(15,36,90)",
type: "solid"
}
}
}
],
series: [
{
name: "无技能要求",
type: "bar",
stack:'total',
data: [12, 50, 20,10,10],
barWidth: 10,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#7d792e" },
{ offset: 1, color: "#f1c515" }
],false),
borderColor:new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset:1,color:'#f1c515'},
{ offset:1, color:'#f1c515'}
],false),
shadowColor: "#f1c515",
shadowBlur: 2
},
},
},
{
name: "技能要求",
type: "bar",
stack:'total',
data: [ 20, 30, 40,10,10],
barWidth: 10,
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#0488cf" },
{ offset: 1, color: "#01a3f7" }
],false),
borderColor:new echarts.graphic.LinearGradient(0,0,0,1,
[
{ offset:1, color:'#01a3f7' },
{ offset:0.8, color:'#01a3f7'}
],false),
shadowColor: "#01a3f7",
shadowBlur: 2
},
},
},
]
};
option && myChart.setOption(option);
myChart.on("click", function (params) {});
window.onresize = function () {
myChart.resize();
};
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,109 @@
<template>
<!-- 短缺技能岗位TOP -->
<div ref="jngwtopEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jngwtopEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
let option = {
legend: {
show: true
},
grid: {
left: "10px",
right: "30px",
bottom: "10px",
top: "20px",
containLabel: true
},
xAxis: {
type: "value",
axisLine: { lineStyle: { color: "#c3c5c8" } },
splitLine: { show: false }
},
yAxis : {
type: "category",
data: ["A岗位","B岗位",'C岗位','D岗位','E岗位'],
axisLine: { show: false, lineStyle: { color: "#c3c5c8" } },
splitLine: {
show: true,
lineStyle: { color: "#21343e" }
},
axisLabel: {
rotate: 20,
fontSize: 10,
interval: 0
},
axisTick: { show: false }
},
series: [
{
data: [10, 20,30,40,50],
type: "bar",
barWidth: "14px",
label: {
show: true,
position: "right",
color: "#fff"
},
itemStyle: {
type: "bar",
color: function (params) {
switch (params.dataIndex) {
case 0:
return new echarts.graphic.LinearGradient(
1,
0,
0,
0,
[
{ offset: 0, color: "#eb2b2b" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
case 1:
case 2:
case 3:
case 4:
return new echarts.graphic.LinearGradient(
1,
0,
0,
0,
[
{ offset: 0, color: "#ff9500" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
}
}
}
}
]
};
nextTick(() => {
var myChart = echarts.init(jngwtopEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,76 @@
<template>
<!-- 技术型岗位需求 -->
<div ref="jsxgwEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jsxgwEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
var option = {
backgroundColor: "rgba(0,0,0,0)",
tooltip: {
trigger: "item"
},
series: [
{
type: "pie",
radius: ["65%", "0%"],
center: ["48%", "48%"],
label: {
normal: {
show: true,
color: "#fff",
formatter: (param) => {
return `{c|${param.value}}`;
},
rich: {
c: {
fontSize: 14,
color: "#ffffff",
}
}
},
emphasis: {
show: true
}
},
labelLine: {
show: true,
length: 20
},
data: [
{name:'司机',value:50},
{name:'炊事员',value:50},
{name:'保管员',value:50},
{name:'修理工程师',value:50},
{name:'高空作业员',value:50},
],
animationType: "scale",
animationEasing: "elasticOut",
animationDelay: function (idx) {
return Math.random() * 200;
}
}
]
};
nextTick(() => {
var myChart = echarts.init(jsxgwEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,76 @@
<template>
<!-- 技能型人才分布 -->
<div ref="jsxrcfbEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jsxrcfbEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
var option = {
backgroundColor: "rgba(0,0,0,0)",
tooltip: {
trigger: "item"
},
series: [
{
type: "pie",
radius: ["65%", "0%"],
center: ["48%", "48%"],
// avoidLabelOverlap: false,
label: {
normal: {
show: true,
color: "#fff",
formatter: (param) => {
return `{c|${param.value}}`;
},
rich: {
c: {
fontSize: 14,
color: "#2682ff",
lineHeight: 30
}
}
},
emphasis: {
show: true
}
},
labelLine: {
show: true,
length: 20
},
data: [
{name:'技术性人才',value:50},
{name:'复合型人才',value:50},
{name:'知识型人才',value:50},
],
animationType: "scale",
animationEasing: "elasticOut",
animationDelay: function (idx) {
return Math.random() * 200;
}
}
]
};
nextTick(() => {
var myChart = echarts.init(jsxrcfbEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,70 @@
<template>
<!-- 机构数量 -->
<ul>
<li v-for="item in dataList" :key="item">
<div class="name_text">{{ item.name }}</div>
<div class="num">{{ item.num }}</div>
</li>
</ul>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jgslEcharts = ref();
const dataList = ref([
{
name: '职业规划',
num: 7000
},
{
name: '就业环境',
num: 2000
},
{
name: '薪酬',
num: 4000
},
{
name: '政策因素',
num: 6000
},
{
name: '其他',
num: 2000
}
])
onMounted(() => {
});
</script>
<style lang="scss" scoped>
ul {
display: flex;
flex-wrap: wrap;
li {
width: 50%;
text-align: center;
align-items: center;
font-size: 18px;
height: 300px;
display: flex;
font-family: "YSBTH";
justify-content: center;
flex-wrap: wrap;
.name_text {
font-size: 2vw;
width: 100%;
color: rgb(3, 239, 207);
}
.num{
font-size: 1.8vw;
width: 100%;
}
}
}
</style>

View File

@ -0,0 +1,88 @@
<template>
<!-- 失业率 -->
<div ref="lxfxEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const lxfxEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
let option = {
tooltip: {
trigger: 'item'
},
legend: {
show:false,
top: '5%',
left: 'center'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: ['40%', '70%'],
// avoidLabelOverlap: false,
// itemStyle: {
// borderRadius: 10,
// borderColor: '#fff',
// borderWidth: 2
// },
label: {
show: true,
fontSize: 24,
},
// emphasis: {
// label: {
// show: true,
// fontSize: 40,
// fontWeight: 'bold'
// }
// },
// labelLine: {
// show: false
// },
data: [
{ value: 3100, name: '成都其他县区' },
{ value: 1600, name: '绵阳市' },
{ value: 500, name: '自贡市' },
{ value: 300, name: '攀枝花市' },
{ value: 1000, name: '泸州市' },
{ value: 1500, name: '德阳市' },
{ value: 400, name: '广元市' },
{ value: 700, name: '遂宁市' },
{ value: 700, name: '内江市' },
{ value: 600, name: '乐山市' },
{ value: 500, name: '资阳市' },
{ value: 2100, name: '宜宾市' },
{ value: 900, name: '南充市' },
{ value: 500, name: '达州市' },
{ value: 400, name: '雅安市' },
{ value: 200, name: '巴中市' },
{ value: 1000, name: '眉山市' },
{ value: 400, name: '广安市' },
{ value: 100, name: '阿坝州' },
{ value: 150, name: '甘孜州' },
{ value: 250, name: '凉山州' },
{ value: 4000, name: '其他省' },
]
}
]
};
nextTick(() => {
var myChart = echarts.init(lxfxEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,90 @@
<template>
<!-- 机构数量 -->
<ul>
<li v-for="item in dataList" :key="item">
<div class="name_text">{{ item.name }}</div>
<div class="num">{{ item.num }}</div>
<div class="num"></div>
</li>
</ul>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const jgslEcharts = ref();
const dataList = ref([
// {
// name: '捷普科技',
// num: 19808
// },
{
name: '比亚迪电子',
num: 3500
},
{
name: '全友家私',
num: 320
},
{
name: '成都领益科技',
num: 86
},
{
name: '掌上明珠',
num: 68
},
{
name: '裕同印刷',
num: 62
},
{
name: '四川福蓉科技',
num: 45
},
{
name: '四川一宇钢结构',
num: 28
},
{
name: '索菲亚',
num: 25
}
])
onMounted(() => {
});
</script>
<style lang="scss" scoped>
ul {
display: flex;
flex-wrap: wrap;
li {
width: 50%;
text-align: center;
align-items: center;
font-size: 18px;
height: 230px;
display: flex;
font-family: "YSBTH";
justify-content: center;
flex-wrap: wrap;
.name_text {
font-size: 2vw;
width: 100%;
color: rgb(3, 239, 207);
}
.num{
font-size: 1.8vw;
width: 100%;
}
}
}
</style>

View File

@ -0,0 +1,76 @@
<template>
<!-- 人才流动原因 -->
<div ref="rcldyyEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const rcldyyEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
var option = {
backgroundColor: "rgba(0,0,0,0)",
tooltip: {
trigger: "item"
},
series: [
{
type: "pie",
radius: ["65%", "0%"],
center: ["48%", "48%"],
label: {
normal: {
show: true,
color: "#fff",
formatter: (param) => {
return `{c|${param.value}}`;
},
rich: {
c: {
fontSize: 14,
color: "#ffffff",
}
}
},
emphasis: {
show: true
}
},
labelLine: {
show: true,
length: 20
},
data: [
{name:'职业发展机会',value:50},
{name:'薪资待遇流动',value:50},
{name:'工作环境流动',value:50},
{name:'政策因素流动',value:50},
{name:'其他',value:50},
],
animationType: "scale",
animationEasing: "elasticOut",
animationDelay: function (idx) {
return Math.random() * 200;
}
}
]
};
nextTick(() => {
var myChart = echarts.init(rcldyyEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,107 @@
<template>
<!-- 失业率 -->
<div ref="sylEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const sylEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
let option = {
legend: {
show: true
},
grid: {
left: "10px",
right: "30px",
bottom: "10px",
top: "20px",
containLabel: true
},
yAxis: {
type: "value",
axisLine: { lineStyle: { color: "#c3c5c8" } },
splitLine: { show: false }
},
xAxis: {
type: "category",
data: ["成都","绵阳","资阳","简阳"],
axisLine: { show: false, lineStyle: { color: "#c3c5c8" } },
splitLine: {
show: true,
lineStyle: { color: "#21343e" }
},
axisLabel: {
// rotate: 20,
fontSize: 10,
interval: 0
},
axisTick: { show: false }
},
series: [
{
data: [10, 20,30,40],
type: "bar",
barWidth: "14px",
label: {
show: true,
position: "top",
color: "#fff"
},
itemStyle: {
type: "bar",
color: function (params) {
switch (params.dataIndex) {
case 0:
return new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{ offset: 0, color: "#eb2b2b" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
case 1:
case 2:
case 3:
return new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{ offset: 0, color: "#ff9500" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
}
}
}
}
]
};
nextTick(() => {
var myChart = echarts.init(sylEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,109 @@
<template>
<!-- 学历层次就业率 -->
<div ref="xlccjyEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const xlccjyEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
let option = {
legend: {
show: true
},
grid: {
left: "10px",
right: "30px",
bottom: "10px",
top: "20px",
containLabel: true
},
xAxis: {
type: "value",
axisLine: { lineStyle: { color: "#c3c5c8" } },
splitLine: { show: false }
},
yAxis : {
type: "category",
data: ["小学","中学",'高中','专科','本科'],
axisLine: { show: false, lineStyle: { color: "#c3c5c8" } },
splitLine: {
show: true,
lineStyle: { color: "#21343e" }
},
axisLabel: {
rotate: 20,
fontSize: 10,
interval: 0
},
axisTick: { show: false }
},
series: [
{
data: [10, 20,30,40,50],
type: "bar",
barWidth: "14px",
label: {
show: true,
position: "right",
color: "#fff"
},
itemStyle: {
type: "bar",
color: function (params) {
switch (params.dataIndex) {
case 0:
return new echarts.graphic.LinearGradient(
1,
0,
0,
0,
[
{ offset: 0, color: "#eb2b2b" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
case 1:
case 2:
case 3:
case 4:
return new echarts.graphic.LinearGradient(
1,
0,
0,
0,
[
{ offset: 0, color: "#ff9500" },
{ offset: 0.9, color: "#041A33" }
],
false
);
break;
}
}
}
}
]
};
nextTick(() => {
var myChart = echarts.init(xlccjyEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,76 @@
<template>
<!-- 新型岗位需求 -->
<div ref="xxgwxqEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, nextTick } from "vue";
const xxgwxqEcharts = ref();
onMounted(() => {
lineChartFn();
});
//初始化统计图
const lineChartFn = () => {
var option = {
backgroundColor: "rgba(0,0,0,0)",
tooltip: {
trigger: "item"
},
series: [
{
type: "pie",
radius: ["65%", "0%"],
center: ["48%", "48%"],
label: {
normal: {
show: true,
color: "#fff",
formatter: (param) => {
return `{c|${param.value}}`;
},
rich: {
c: {
fontSize: 14,
color: "#ffffff",
}
}
},
emphasis: {
show: true
}
},
labelLine: {
show: true,
length: 20
},
data: [
{name:'司机',value:50},
{name:'炊事员',value:50},
{name:'保管员',value:50},
{name:'修理工程师',value:50},
{name:'高空作业员',value:50},
],
animationType: "scale",
animationEasing: "elasticOut",
animationDelay: function (idx) {
return Math.random() * 200;
}
}
]
};
nextTick(() => {
var myChart = echarts.init(xxgwxqEcharts.value);
myChart.setOption(option);
window.addEventListener("resize", () => {
myChart.resize();
});
});
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,124 @@
<template>
<!-- 重点企业缺口需求 -->
<div class="review_box" id="review_box" style="width:100%;overflow: hidden" @mouseover="rollStop()"
@mouseout="rollStart(60)">
<ul id="comment1" class="zdqyqkxqBox noScollLine">
<li v-for="(it, indx) in list" :key="indx" class="lineItem align-center mb4">
<div class="label">
<span class="order mr4" :style="{ color: indx < 3 ? '#01d0db' : '' }">TOP.{{ indx + 1 }}</span>
<img src="@/assets/images/icon_03.png" alt="">
<span class="ml4 text one_text_detail" :style="{ color: indx < 3 ? '#01d0db' : '' }">{{ it.mc }}</span>
</div>
<div class="flex align-center just-around">
<div class="line">
<div class="lineOut">
<div class="persont" :style="{ width: it.persont }"></div>
</div>
</div>
<div class="num">{{ it.num }}</div>
</div>
</li>
</ul>
<ul id="comment2" class="zdqyqkxqBox noScollLine"></ul>
</div>
</template>
<script setup>
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, ref, defineProps, onUnmounted } from "vue";
const props = defineProps({
data: Object,
})
const list = ref([
{ mc: '工业机器人操作工程师', persont: '90%', num: 456 },
{ mc: '智能生产线调试工程师', persont: '80%', num: 355 },
{ mc: '精密仪器装配工程师', persont: '70%', num: 322 },
{ mc: '人工智能算法工程师', persont: '60%', num: 189 },
{ mc: '数字孪生工程师。', persont: '50%', num: 67 },
])
const timer = ref(null)
onMounted(() => {
})
onUnmounted(() => {
})
</script>
<style lang="scss" scoped>
.review_box {
padding: 0 10px;
box-sizing: border-box;
}
.zdqyqkxqBox {
width: 100%;
height: 100%;
overflow: hidden;
overflow-y: auto;
padding: 6px 0;
box-sizing: border-box;
font-size: 20px;
.lineItem {
height: 190px;
.label {
width: 100%;
font-family: "YSBTH";
display: flex;
font-size: 1.8vw;
margin: 10px 0 20px 0;
.order {
display: inline-block;
}
.text {
display: inline-block;
white-space: nowrap;
}
}
.line {
width: 80%;
height: 12px;
padding: 0 4px;
border: 1px solid #1e3a44;
border-radius: 4px;
display: flex;
align-items: center;
.lineOut {
width: 100%;
height: 5px;
background: rgba(32, 74, 111, 0.5);
.persont {
height: 5px;
background: linear-gradient(60deg, #187593 0%, #aff1f4 100%);
border-radius: 10px;
position: relative;
&::after {
position: absolute;
content: "";
right: -6px;
top: -7px;
width: 18px;
height: 19px;
background: url('~@/assets/images/icon_04.png') no-repeat left bottom;
background-size: 100%;
}
}
}
}
.num {
width: 10%;
margin-left: 10px;
font-size: 1.6vw;
}
}
}
</style>

View File

@ -0,0 +1,163 @@
<template>
<!-- 供需技能匹配分析 -->
<div id="zdqycxEcharts" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import { onMounted, nextTick } from "vue";
import { rotate } from "ol/transform";
onMounted(() => {
lineChartFn();
});
const lineChartFn = (val) => {
var myChart = echarts.init(document.getElementById("zdqycxEcharts"));
var option = {
legend: {
show: true,
right: 10,
top: 10,
textStyle: { color: "#fff" },
data: ['总岗位数量', '需求技能岗位数量']
},
legend: {
textStyle: { color: "#fff", fontSize: 46 },
selectedMode: false
},
tooltip: {
trigger: "axis",
axisPointer: { type: "shadow" }
},
grid: {
top: "10%",
right: "10%",
left: "14%",
bottom: "12%"
},
xAxis: [
{
type: "category",
axisTick: {
show: false
},
splitLine: {
show: false
},
axisPointer: {
type: "shadow"
},
axisLine: {
show: false,
lineStyle: {
color: "#fff"
},
show: false
},
axisTick: {
show: false,
},
axisLabel: {
rotate: 20,
fontSize: 40,
interval: 0
},
data: ["比亚迪电子", '全友家私','成都领益科技','四川福蓉科技', '掌上明珠', '裕同印刷'],
}
],
yAxis: [
{
type: "value",
axisLine: {
lineStyle: {
color: "#fff"
}
},
axisLabel: {
fontSize: 40,
interval: 0
},
splitLine: {
show: true,
lineStyle: {
color: "rgb(15,54,90)",
type: "solid"
}
}
}
],
series: [
{
name: "无技能要求",
type: "bar",
stack: 'total',
data: [78, 81, 45, 37, 72, 79, 85, 81],
barWidth: 60,
label: {
show: true,
position: 'top', // 将标签显示在柱状图的顶部
color: "#fff",
formatter: '{c} %' // {c}表示数据值,{d}%表示百分比,计算方式为 (c / 总和) * 100%
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1,
[
{ offset: 0, color: "#072133" },
{ offset: 0.5, color: "#7d792e" },
{ offset: 1, color: "#f1c515" }
], false),
borderColor: new echarts.graphic.LinearGradient(0, 0, 0, 1,
[
{ offset: 1, color: '#f1c515' },
{ offset: 1, color: '#f1c515' }
], false),
shadowColor: "#f1c515",
shadowBlur: 2
},
},
},
{
name: "技能要求",
type: "bar",
stack: 'total',
data: [87, 85, 67, 59, 79, 84, 82, 83],
barWidth: 60,
label: {
show: true,
position: 'top', // 将标签显示在柱状图的顶部
color: "#fff",
formatter: '{c} %' // {c}表示数据值,{d}%表示百分比,计算方式为 (c / 总和) * 100%
},
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1,
[
{ offset: 0, color: "#052521" },
{ offset: 0.5, color: "#0488cf" },
{ offset: 1, color: "#01a3f7" }
], false),
borderColor: new echarts.graphic.LinearGradient(0, 0, 0, 1,
[
{ offset: 1, color: '#01a3f7' },
{ offset: 0.8, color: '#01a3f7' }
], false),
shadowColor: "#01a3f7",
shadowBlur: 2
},
},
},
]
};
option && myChart.setOption(option);
myChart.on("click", function (params) { });
window.onresize = function () {
myChart.resize();
};
};
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,336 @@
<template>
<div class="bigScrenn portraitBox">
<!-- 头部 -->
<div class="portratCnt noScollLine">
<!-- 头部 -->
<div class="port-head">
<Head title="崇州市就业生态链数据"></Head>
<div class="bg-bbb">
<Cygjbl></Cygjbl>
</div>
<!-- <ul class="ul-bbb">
<li class="bbb-item" v-for="(it, idx) in data.twoList" :key="idx">
<div class="top">{{ it.label }}</div>
<div class="cntBox">
<Gxjnppfx v-if="it.label == '技能岗位缺口TOP5'"></Gxjnppfx>
<Cygxfx v-if="it.label == '产业供需分析'"></Cygxfx>
<Gjgrzmyd v-if="it.label == '各行业需求TOP5'"></Gjgrzmyd>
</div>
</li>
</ul> -->
</div>
<!-- 第二部分 -->
<ul class="port-three">
<li class="port-three-item" v-for="(it, idx) in data.threeList" :key="idx">
<div class="bt-Title tc">
<span>{{ it.title }}</span>
</div>
<ul class="childBox flex">
<li v-for="(iv, ix) in it.list" :key="ix" class="childItem">
<div class="info tc">{{ iv.label }}</div>
<div class="chartsBox">
<Jgsl v-if="iv.label == '服务机构分类与数量'"></Jgsl>
<Glrq v-if="iv.label == '各类人群就业率'"></Glrq>
<Csgf v-if="iv.label == '服务机构入职成功率'"></Csgf>
<Jgrzcgl v-if="iv.label == '技能型岗位需求'"></Jgrzcgl>
<Xxrcgw v-if="iv.label == '新兴人才岗位需求'" />
<Zdrc v-if="iv.label == '重点企业人才招聘技能要求'" />
<Jgmyd v-if="iv.label == '各类机构入职满意度'"></Jgmyd>
<Hyjyl v-if="iv.label == '行业就业率'"></Hyjyl>
<Xlccjyl v-if="iv.label == '学历层次就业率'"></Xlccjyl>
<Qylsry v-if="iv.label == '企业流失人员分析'"></Qylsry>
<Lsyyfx v-if="iv.label == '流失原因分析'"></Lsyyfx>
<Lxfx v-if="iv.label == '流向分析'"></Lxfx>
<Xxgwxq v-if="iv.label == '新型岗位需求'"></Xxgwxq>
<Rcldyy v-if="iv.label == '人才流动原因'"></Rcldyy>
<Jgpxfb v-if="iv.label == '技能培训机构分布'"></Jgpxfb>
<Jngwtop v-if="iv.label == '短缺技能岗位TOP'"></Jngwtop>
<Jndqzpnd v-if="iv.label == '重点企业技能短缺招聘难度'"></Jndqzpnd>
<Gwxzdb v-if="iv.label == '技能岗位薪资酬对比'"></Gwxzdb>
</div>
</li>
</ul>
</li>
</ul>
<!-- <ul class="port-four">
<li class="port-four-item" :key="idx">
<div class="bt-Title tc">
<span>人才流失趋势分析</span>
</div>
<div class="bottom_box">
<img src="@/assets/images/sjt.png" alt="">
</div>
</li>
</ul> -->
</div>
</div>
</template>
<script setup>
import Head from "@/views/largeScreen/layout/head.vue";
import Cygjbl from "./components/cygjbl.vue";
import Gxjnppfx from "./components/gxjnppfx.vue";
import Cygxfx from "./components/cygxfx.vue";
import Ghyxqzf from "./components/ghyxqzf.vue";
import Gjgrzmyd from "./components/gjgrzmyd.vue";
import Jsxrcfb from "./components/jsxrcfb.vue";
import Jgsl from "./components/Jgsl.vue";
import Qylsry from "./components/qylsry.vue";
import Lsyyfx from "./components/lsyyfx.vue";
import Lxfx from "./components/lxfx.vue";
import Xxrcgw from "./components/xxrcgw.vue";
import Zdrc from "./components/zdrc.vue";
import Glrq from "./components/glrq.vue";
import Jgrzcgl from "./components/Jgrzcgl.vue";
import Jgmyd from "./components/jgmyd.vue";
import Csgf from "./components/csgf.vue";
import Hyjyl from "./components/hyjyl.vue";
import Xlccjyl from "./components/xlccjyl.vue";
import Syl from "./components/syl.vue";
import Jgpxfb from "./components/jgpxfb.vue";
import Jnxgwxq from "./components/jnxgwxq.vue";
import Xxgwxq from "./components/xxgwxq.vue";
import Rcldyy from "./components/rcldyy.vue";
import Jngwtop from "./components/jngwtop.vue";
import Jndqzpnd from "./components/jndqzpnd.vue";
import Gwxzdb from "./components/gwxzdb.vue";
import { qcckPost, qcckGet } from "@/api/qcckApi.js";
import emitter from "@/utils/eventBus.js";
import {
ref,
reactive,
onMounted,
onUnmounted,
getCurrentInstance,
onBeforeUnmount
} from "vue";
const { proxy } = getCurrentInstance();
const data = reactive({
twoList: [
{ label: "产业供需分析" },
{ label: "各行业需求TOP5" },
{ label: "技能岗位缺口TOP5" },
],
threeList: [
{
title: "人力资源服务市场",
list: [
{ label: "服务机构分类与数量" },
{ label: "服务机构入职成功率" },
{ label: "各类人群就业率" },
]
},
{
title: "人才结构分析",
list: [
{ label: "技能型岗位需求" },
{ label: "新兴人才岗位需求" },
{ label: "重点企业人才招聘技能要求" }
]
},
{
title: "人才流失趋势分析",
list: [
{ label: "企业流失人员分析" },
{ label: "流失原因分析" },
{ label: "流向分析" },
]
}
]
});
</script>
<style lang="scss" scoped>
@import "@/assets/css/homeScreen.scss";
@mixin textColor($color1, $color2) {
background-image: linear-gradient(to top, $color1 0%, $color2 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.portraitBox {
width: 100%;
background: url("~@/assets/images/0000.png") no-repeat center center;
background-size: 100% 100%;
padding: 0 40px;
.portratCnt {
width: 100%;
height: calc(100vh - 90px);
overflow: hidden;
.port-head {
height: calc(1800px - 190px);
// height: 1800px ;
margin-bottom: 10px;
border-radius: 10px;
margin-right: 4px;
margin-left: 4px;
margin-top: 190px;
position: relative;
background: url("~@/assets/images/top_bg.png") no-repeat center center;
background-size: 100% 100%;
.bg-bbb {
// height: 1300px;
height: 100%;
padding-top: 260px;
}
.ul-bbb {
width: 100%;
height: 500px;
position: absolute;
bottom: 34px;
left: 0;
width: 100%;
display: flex;
.bbb-item {
flex: 1;
height: 100%;
margin: 0 4px;
border-radius: 10px;
// background: url("~@/assets/images/fff.png") no-repeat center center;
// background-size: 100% 100%;
.top {
height: 120px;
line-height: 120px;
padding-left: 40px;
box-sizing: border-box;
font-size: 2.2vw;
font-family: "YSBTH";
position: relative;
&::before {
position: absolute;
content: '';
left: 20px;
top: 50%;
transform: translateY(-50%);
width: 16px;
height: 17px;
background: url("~@/assets/images/icon_20.png") no-repeat center center;
background-size: 100% 100%;
}
}
.cntBox {
height: calc(100% - 120px);
overflow: hidden;
}
}
}
}
.port-three {
height: 2400px;
// background: url("~@/assets/images/bg_13.png") no-repeat center center;
// background-size: 100% 100%;
.port-three-item {
height: 50%;
min-height: 350px;
margin: 0 4px;
border-radius: 10px;
margin-bottom: 6px;
.bt-Title {
font-size: 2.8vw;
background: url("~@/assets/images/bg_14.png") no-repeat center center;
background-size: 100% 100%;
height: 120px;
span {
@include textColor(#499fe2, #ffffff);
font-family: "YSBTH";
}
}
.childBox {
height: calc(100% - 120px);
background: url('~@/assets/images/ggg.png') no-repeat center center;
.childItem {
flex: 1;
position: relative;
.info {
font-size: 2.2vw;
@include textColor(#09b8cf, #ffffff);
font-family: "YSBTH";
}
.chartsBox {
height: calc(100% - 125px);
overflow: hidden;
}
&::after {
position: absolute;
content: '';
top: 10px;
right: 0;
width: 3px;
height: 90%;
background: url("~@/assets/images/lien.png") no-repeat center center;
background-size: 100% 100%;
}
&:nth-last-child(1) {
position: relative;
&::after {
position: absolute;
content: '';
background: none;
}
}
}
}
.bottom_box {
height: calc(100% - 56px);
img {
width: 100%;
height: 100%;
}
}
}
}
.port-four {
height: 1200px;
.port-four-item {
height: 100%;
background: none;
.bt-Title {
font-size: 2.8vw;
background: url("~@/assets/images/bg_14.png") no-repeat center center;
background-size: 100% 100%;
height: 120px;
span {
@include textColor(#499fe2, #ffffff);
font-family: "YSBTH";
}
}
.bottom_box {
height: calc(100% - 120px);
img {
width: 100%;
height: 100%;
}
}
}
}
}
}
</style>