Compare commits

...

19 Commits

Author SHA1 Message Date
ae04a588a0 提交 2025-11-06 14:23:03 +08:00
210231ada4 修改地图撒点数据处理 2025-10-31 12:51:49 +08:00
47ef3fcac8 修改地图撒点数据处理 2025-10-30 18:14:08 +08:00
89439528df Merge branch 'master' of http://61.139.16.27:26684/DEV_ZZ/rsxm-master 2025-10-30 18:01:46 +08:00
b9ad571738 修改地图撒点数据处理 2025-10-30 17:57:55 +08:00
lcw
ddea6d7c97 lcw 2025-10-25 10:29:09 +08:00
35583f52d4 修改大屏数据处理 2025-10-23 15:14:00 +08:00
f63bb358d4 推送 2025-10-23 14:59:19 +08:00
c7158482c6 推送 2025-10-23 14:01:59 +08:00
314b2f566d 修改委托招聘服务协议图片展示处理 2025-10-23 13:39:04 +08:00
lcw
5bba56800a Merge branch 'master' of http://61.139.16.27:26684/DEV_ZZ/rsxm-master 2025-10-23 13:38:11 +08:00
lcw
0becdcc9eb lcw 2025-10-23 13:38:03 +08:00
4cd029afbd 推送 2025-10-23 13:02:49 +08:00
lcw
6a1ea10ee6 Merge branch 'master' of http://61.139.16.27:26684/DEV_ZZ/rsxm-master 2025-10-23 12:57:58 +08:00
lcw
0432791b0c lcw 2025-10-23 12:57:48 +08:00
lcw
2763361356 lcw 2025-10-23 12:56:32 +08:00
lcw
7fccd2b942 Merge branch 'master' of http://61.139.16.27:26684/DEV_ZZ/rsxm-master 2025-10-23 12:46:36 +08:00
lcw
ddfe55e58c lcw 2025-10-23 12:46:31 +08:00
lcw
9d6a593e2e lcw 2025-10-23 12:28:47 +08:00
19 changed files with 1163 additions and 776 deletions

28
package-lock.json generated
View File

@ -2076,31 +2076,6 @@
"webpack-chain": "^6.4.0", "webpack-chain": "^6.4.0",
"webpack-dev-server": "^3.11.0", "webpack-dev-server": "^3.11.0",
"webpack-merge": "^4.2.2" "webpack-merge": "^4.2.2"
},
"dependencies": {
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
}
} }
}, },
"@vue/cli-shared-utils": { "@vue/cli-shared-utils": {
@ -15010,7 +14985,6 @@
} }
} }
}, },
<<<<<<< HEAD
"vue-loader-v16": { "vue-loader-v16": {
"version": "npm:vue-loader@16.8.3", "version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz", "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
@ -15036,8 +15010,6 @@
} }
} }
}, },
=======
>>>>>>> ac9e27d045b841a3a3a2a3dca10cce199d7f3c77
"vue-router": { "vue-router": {
"version": "4.5.1", "version": "4.5.1",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.1.tgz",

View File

@ -105,4 +105,3 @@ v-deep .el-loading-mask {
} }
</style> </style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 MiB

View File

@ -0,0 +1,33 @@
<svg width="1920" height="1080" viewBox="0 0 1920 1080" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_9_2545)">
<rect width="1920" height="1080" fill="url(#paint0_linear_9_2545)" fill-opacity="0.75"/>
<rect width="1920" height="1080" fill="url(#paint1_linear_9_2545)" fill-opacity="0.75"/>
</g>
<defs>
<linearGradient id="paint0_linear_9_2545" x1="960" y1="0" x2="960" y2="1080" gradientUnits="userSpaceOnUse">
<stop stop-color="#0078A4"/>
<stop offset="0.120509" stop-color="#0078A4" stop-opacity="0.545518"/>
<stop offset="0.179314" stop-color="#0078A4" stop-opacity="0.268142"/>
<stop offset="0.286458" stop-color="#0078A4" stop-opacity="0.0154769"/>
<stop offset="0.671875" stop-color="#0078A4" stop-opacity="0"/>
<stop offset="0.790323" stop-color="#0078A4" stop-opacity="0.221651"/>
<stop offset="0.863472" stop-color="#0078A4" stop-opacity="0.503942"/>
<stop offset="1" stop-color="#0078A4"/>
</linearGradient>
<linearGradient id="paint1_linear_9_2545" x1="1920" y1="592.5" x2="3.32107e-06" y2="592.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#0078A4"/>
<stop offset="0.0924192" stop-color="#0078A4" stop-opacity="0.441093"/>
<stop offset="0.147393" stop-color="#0078A4" stop-opacity="0.212322"/>
<stop offset="0.194418" stop-color="#0078A4" stop-opacity="0.0732132"/>
<stop offset="0.249495" stop-color="#0078A4" stop-opacity="0"/>
<stop offset="0.756487" stop-color="#0078A4" stop-opacity="0"/>
<stop offset="0.815023" stop-color="#0078A4" stop-opacity="0.0812947"/>
<stop offset="0.870659" stop-color="#0078A4" stop-opacity="0.224653"/>
<stop offset="0.92232" stop-color="#0078A4" stop-opacity="0.463412"/>
<stop offset="1" stop-color="#0078A4"/>
</linearGradient>
<clipPath id="clip0_9_2545">
<rect width="1920" height="1080" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -0,0 +1,33 @@
<svg width="1920" height="1080" viewBox="0 0 1920 1080" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_9_2545)">
<rect width="1920" height="1080" fill="url(#paint0_linear_9_2545)" fill-opacity="0.5"/>
<rect width="1920" height="1080" fill="url(#paint1_linear_9_2545)" fill-opacity="0.5"/>
</g>
<defs>
<linearGradient id="paint0_linear_9_2545" x1="960" y1="0" x2="960" y2="1080" gradientUnits="userSpaceOnUse">
<stop stop-color="#0078A4"/>
<stop offset="0.120509" stop-color="#0078A4" stop-opacity="0.545518"/>
<stop offset="0.179314" stop-color="#0078A4" stop-opacity="0.268142"/>
<stop offset="0.286458" stop-color="#0078A4" stop-opacity="0.0154769"/>
<stop offset="0.671875" stop-color="#0078A4" stop-opacity="0"/>
<stop offset="0.790323" stop-color="#0078A4" stop-opacity="0.221651"/>
<stop offset="0.863472" stop-color="#0078A4" stop-opacity="0.503942"/>
<stop offset="1" stop-color="#0078A4"/>
</linearGradient>
<linearGradient id="paint1_linear_9_2545" x1="1920" y1="592.5" x2="3.32107e-06" y2="592.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#0078A4"/>
<stop offset="0.0924192" stop-color="#0078A4" stop-opacity="0.441093"/>
<stop offset="0.147393" stop-color="#0078A4" stop-opacity="0.212322"/>
<stop offset="0.194418" stop-color="#0078A4" stop-opacity="0.0732132"/>
<stop offset="0.249495" stop-color="#0078A4" stop-opacity="0"/>
<stop offset="0.756487" stop-color="#0078A4" stop-opacity="0"/>
<stop offset="0.815023" stop-color="#0078A4" stop-opacity="0.0812947"/>
<stop offset="0.870659" stop-color="#0078A4" stop-opacity="0.224653"/>
<stop offset="0.92232" stop-color="#0078A4" stop-opacity="0.463412"/>
<stop offset="1" stop-color="#0078A4"/>
</linearGradient>
<clipPath id="clip0_9_2545">
<rect width="1920" height="1080" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@ -76,7 +76,7 @@ export const publicRoutes = [
name: "/platformBusinessData", name: "/platformBusinessData",
component: () => import("@/views/platformBusinessData/index"), component: () => import("@/views/platformBusinessData/index"),
meta: {} meta: {}
} },
]; ];
const router = createRouter({ const router = createRouter({

View File

@ -6,7 +6,7 @@
<li class="center-item" v-for="(it,idx) in centerList" :key="idx"> <li class="center-item" v-for="(it,idx) in centerList" :key="idx">
<div class="label">{{it.label}}</div> <div class="label">{{it.label}}</div>
<div class="count"> <div class="count">
<Statis :count="it.num" :height="86" :len="2" bg="countBg" /> <Statis :count="it.num" :height="86" :len="2" bg="countBg" />
<span class="num">( {{it.dw}} )</span> <span class="num">( {{it.dw}} )</span>
</div> </div>
</li> </li>
@ -135,7 +135,7 @@ onMounted(()=>{
font-size: 1.563vw; font-size: 1.563vw;
width: 1.458vw; width: 1.458vw;
height: 2.24vw; height: 2.24vw;
line-height: 2.24vw; line-height: 2.24vw;
background: url('~@/assets/images/bg_01.png') no-repeat center center; background: url('~@/assets/images/bg_01.png') no-repeat center center;
background-size: 100% 100%; background-size: 100% 100%;
color: #0DE0FF; color: #0DE0FF;
@ -345,4 +345,4 @@ onMounted(()=>{
} }
} }
} }
</style> </style>

View File

@ -23,7 +23,7 @@
<div class="gapLine"></div> <div class="gapLine"></div>
<div class=" text flex just-between align-center pl10 pr10 mt10 mb10"> <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.zzmc }}</span></span>
<span>经纪人<span class="itexs">{{ dataForm.jjr }}</span> </span> <span>经纪人<span class="itexs">{{ dataForm.jjr }}</span> </span>
</div> </div>
<div class=" text flex just-between align-center pl10 pr10 mt10 mb10"> <div class=" text flex just-between align-center pl10 pr10 mt10 mb10">
@ -48,9 +48,9 @@ import { onMounted, onUnmounted, reactive, ref } from 'vue';
const list = ref([ const list = ref([
{ label: '就业服务站', value: 40, dw: '个' }, { label: '就业服务站', value: 40, dw: '个' },
{ label: '服务一体机', value: 40, dw: '个' }, { label: '服务一体机', value: 40, dw: '个' },
{ label: '劳务经纪人', value: 118, dw: '人' }, { label: '劳务经纪人', value: 178, dw: '人' },
{ label: '招聘岗位', value: 9637, dw: '个' }, // { label: '招聘岗位', value: 9637, dw: '个' },
{ label: '成功入职', value: 1305, dw: '个' }, // { label: '成功入职', value: 1305, dw: '个' },
]) ])
const dataForm = ref({}) const dataForm = ref({})
const baseList = ref([]) const baseList = ref([])
@ -410,4 +410,4 @@ function getSize(res) {
} }
</style> </style>
<style lang="scss"> <style lang="scss">
</style> </style>

View File

@ -49,9 +49,9 @@ import { onMounted, onUnmounted, nextTick , ref } from 'vue';
const list = ref([ const list = ref([
{ label: '就业服务站', value: 40, dw: '个' }, { label: '就业服务站', value: 40, dw: '个' },
{ label: '服务一体机', value: 40, dw: '个' }, { label: '服务一体机', value: 40, dw: '个' },
{ label: '劳务经纪人', value: 118, dw: '人' }, { label: '劳务经纪人', value: 178, dw: '人' },
{ label: '招聘岗位', value: 9637, dw: '个' }, // { label: '招聘岗位', value: 9637, dw: '个' },
{ label: '成功入职', value: 1305, dw: '人' }, // { label: '成功入职', value: 1305, dw: '人' },
]) ])
const dataForm = ref({}) const dataForm = ref({})
const baseList = ref([]) const baseList = ref([])
@ -468,4 +468,4 @@ function getSize(res) {
} }
</style> </style>
<style lang="scss"> <style lang="scss">
</style> </style>

View File

@ -51,9 +51,9 @@ import { onMounted, onUnmounted, nextTick, ref } from 'vue';
const list = ref([ const list = ref([
{ label: '就业服务站', value: 40, dw: '个' }, { label: '就业服务站', value: 40, dw: '个' },
{ label: '服务一体机', value: 40, dw: '个' }, { label: '服务一体机', value: 40, dw: '个' },
{ label: '劳务经纪人', value: 118, dw: '人' }, { label: '劳务经纪人', value: 178, dw: '人' },
{ label: '招聘岗位', value: 9637, dw: '个' }, // { label: '招聘岗位', value: 9637, dw: '个' },
{ label: '成功入职', value: 1305, dw: '人' }, // { label: '成功入职', value: 1305, dw: '人' },
]) ])
const dataForm = ref({}) const dataForm = ref({})
const baseList = ref([]) const baseList = ref([])
@ -542,4 +542,4 @@ function getSize(res) {
} }
</style> </style>
<style lang="scss"> <style lang="scss">
</style> </style>

View File

@ -17,11 +17,6 @@
import { ref, onMounted, onBeforeUnmount } from "vue"; import { ref, onMounted, onBeforeUnmount } from "vue";
const tableData = ref([ const tableData = ref([
{
name: "人社局劳务经纪人培训",
starTime: "2025/09/24",
endTime: "2025/09/26"
},
{ {
name: "退役军人适应性培训", name: "退役军人适应性培训",
starTime: "2025/10/16", starTime: "2025/10/16",
@ -33,45 +28,50 @@ const tableData = ref([
endTime: "2025/10/17" endTime: "2025/10/17"
}, },
{ {
name: "电工", name: "人社局劳务经纪人培训",
starTime: "2025/05/12", starTime: "2025/9/24",
endTime: "2025/06/06" endTime: "2025/9/26"
}, },
{ {
name: "焊工", name: "学生就业指导",
starTime: "2025/05/19", starTime: "2025/9/1",
endTime: "2025/06/13" endTime: "2025/9/1"
}, },
{ {
name: "钳工", name: "高空作业",
starTime: "2025/05/26", starTime: "2025/8/18",
endTime: "2025/06/20" endTime: "2025/9/12"
}, },
{ {
name: "人工智能训练师", name: "机械木工-拼缝接合",
starTime: "2025/06/02", starTime: "2025/8/4",
endTime: "2025/06/27" endTime: "2025/10/17"
}, },
{ {
name: "无人机飞手", name: "无人机飞手",
starTime: "2025/06/16", starTime: "2025/6/16",
endTime: "2025/07/11" endTime: "2025/7/11"
},
{
name: "人工智能训练师",
starTime: "2025/6/2",
endTime: "2025/6/27"
},
{
name: "钳工",
starTime: "2025/5/26",
endTime: "2025/6/20"
},
{
name: "焊工",
starTime: "2025/5/19",
endTime: "2025/6/13"
},
{
name: "电工",
starTime: "2025/5/12",
endTime: "2025/6/6"
} }
// {
// name: "手工木工",
// starTime: "2025/7/14",
// endTime: "2025/8/8"
// },
// {
// name: "高空作业",
// starTime: "2025/8/18",
// endTime: "2025/9/12"
// }
// {
// name: "学生就业指导",
// starTime: "2025/9/1",
// endTime: "2025/9/1"
// }
]); ]);
</script> </script>

View File

@ -26,11 +26,11 @@ const rankData = ref([
{ name: "电工培训", count: "120" }, { name: "电工培训", count: "120" },
{ name: "焊工培训", count: "100" }, { name: "焊工培训", count: "100" },
{ name: "食品安全管理师培训", count: "95" }, { name: "食品安全管理师培训", count: "95" },
{ name: "无人机驾驶员培训", count: "40" }, { name: "无人机驾驶员培训", count: "78" },
{ name: "公共营养师培训", count: "72" }, { name: "公共营养师培训", count: "72" },
{ name: "医疗护理员培训", count: "63" }, { name: "医疗护理员培训", count: "63" },
{ name: "人工智能训练师培训", count: "48" }, { name: "人工智能训练师培训", count: "48" },
{ name: "机械木工", count: "78" }, { name: "机械木工", count: "40" },
{ name: "高处安装维护拆除作业培训", count: "32" }, { name: "高处安装维护拆除作业培训", count: "32" },
{ name: "登高架设培训", count: "29" } { name: "登高架设培训", count: "29" }
]); ]);
@ -54,16 +54,18 @@ onMounted(() => {
ul.rankList { ul.rankList {
width: 100%; width: 100%;
margin: 0 auto; margin: 0 auto;
li { li {
margin: 0 100px; margin: 0 100px;
height: 85px; height: 85px;
background: url("~@/assets/images/largeScreen/rankList-bg.png") no-repeat 0 background: url("~@/assets/images/largeScreen/rankList-bg.png") no-repeat 0 0;
0;
background-size: 100% 100%; background-size: 100% 100%;
margin: 40px 0 0 0; margin: 40px 0 0 0;
position: relative; position: relative;
.left { .left {
float: left; float: left;
.sequence { .sequence {
position: absolute; position: absolute;
text-align: right; text-align: right;
@ -75,16 +77,20 @@ ul.rankList {
color: #0a9eb5; color: #0a9eb5;
font-weight: bold; font-weight: bold;
font-size: 40px; font-size: 40px;
&.red { &.red {
color: #ff0000; color: #ff0000;
} }
&.orange { &.orange {
color: #ffa500; color: #ffa500;
} }
&.yellow { &.yellow {
color: #ffd700; color: #ffd700;
} }
} }
.name { .name {
font-size: 50px; font-size: 50px;
margin: 0 0 0 200px; margin: 0 0 0 200px;
@ -92,6 +98,7 @@ ul.rankList {
height: 60px; height: 60px;
} }
} }
.right { .right {
float: right; float: right;
height: 60px; height: 60px;
@ -103,19 +110,19 @@ ul.rankList {
-webkit-text-fill-color: transparent; -webkit-text-fill-color: transparent;
font-weight: 400; font-weight: 400;
} }
.jdtBox { .jdtBox {
position: absolute; position: absolute;
top: 0px; top: 0px;
left: 194px; left: 194px;
right: 0px; right: 0px;
height: 4px; height: 4px;
.jdt { .jdt {
height: 4px; height: 4px;
background: linear-gradient( background: linear-gradient(90deg,
90deg, rgba(53, 168, 235, 0) 0%,
rgba(53, 168, 235, 0) 0%, #00ddff 100%);
#00ddff 100%
);
border-radius: 4px 4px 4px 4px; border-radius: 4px 4px 4px 4px;
} }
} }

View File

@ -3,33 +3,54 @@
</template> </template>
<script setup> <script setup>
// Vue 3 Composition API 的 setup 语法糖 import { ref, onMounted, onUnmounted, nextTick } from "vue";
// 在这里直接编写响应式数据和方法,无需返回
import { ref, reactive, computed, onMounted } from "vue";
import * as echarts from "echarts"; import * as echarts from "echarts";
const enterpriseTwoRef = ref(null); const enterpriseTwoRef = ref(null);
const option = { let chart = null;
// 添加标题
// 响应式设计稿配置
const designConfig = {
designWidth: 1920,
designHeight: 1080
};
// 计算实际的像素值(基于设计稿比例)
function calcResponsivePX(pxValue) {
const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
return (pxValue / designConfig.designWidth) * screenWidth;
}
// 计算 vw 单位值(真正的 vw
function calcVW(pxValue) {
return (pxValue / designConfig.designWidth) * 100;
}
// 计算 vh 单位值
function calcVH(pxValue) {
return (pxValue / designConfig.designHeight) * 100;
}
// 图表配置
const getChartOption = () => ({
title: { title: {
text: '重点保供企业分布', text: '重点保供企业分布',
left: 'center', left: 'center',
top: '5%', top: '5%',
textStyle: { textStyle: {
color: '#30DCFF', color: '#30DCFF',
fontSize: 16, fontSize: calcResponsivePX(16),
fontWeight: 'normal' fontWeight: 'normal'
} }
}, },
// 设置图形位置
grid: { grid: {
top: '20%', top: `${calcVH(210)}%`, // 使用 vh 确保垂直方向也响应式
left: '15%', left: `${calcVW(130)}%`,
right: '5%', right: `${calcVW(120)}%`,
bottom: '25%' bottom: `${calcVH(170)}%`
}, },
xAxis: { xAxis: {
show: true, show: true,
axisTick: { axisTick: {
show: true, show: true,
lineStyle: { lineStyle: {
@ -37,17 +58,19 @@ const option = {
} }
}, },
axisLabel: { axisLabel: {
fontSize: 14, fontSize: calcResponsivePX(12),
color: '#CBF2FA', color: '#CBF2FA',
rotate: 0, rotate: 0,
margin: 15 show: true,
interval: 0,
hideOverlap: false,
margin: calcResponsivePX(14)
}, },
type: "category", type: "category",
data: ["第一产业", "第二产业", "第三产业"] data: ["第一产业", "第二产业", "第三产业"]
}, },
yAxis: { yAxis: {
interval: 50, // 设置刻度间隔 interval: 50,
//显示网格线
splitLine: { splitLine: {
show: true, show: true,
lineStyle: { lineStyle: {
@ -72,34 +95,54 @@ const option = {
name: "企业数", name: "企业数",
type: "bar", type: "bar",
showBackground: false, showBackground: false,
barWidth: 25, barWidth: calcResponsivePX(25), // 柱状图宽度也要响应式
data: [6, 581, 41], data: [6, 581, 41],
// 设置柱状图的数值
label: { label: {
show: true, show: true,
position: "top", position: "top",
color: '#30DCFF', color: '#30DCFF',
fontSize: 14, fontSize: calcResponsivePX(14),
formatter: function(params) { formatter: function(params) {
return params.value + '家'; return params.value + '家';
} }
}, },
itemStyle: { itemStyle: {
//纯色
color: '#30DCFF' color: '#30DCFF'
} }
} }
] ]
});
// 处理图表重绘
const handleChartResize = () => {
if (chart) {
chart.resize();
// 重新设置选项以更新所有响应式尺寸
chart.setOption(getChartOption(), true); // true 表示不合并,完全替换
}
};
// 初始化图表
const initChart = () => {
if (!enterpriseTwoRef.value) return;
chart = echarts.init(enterpriseTwoRef.value);
chart.setOption(getChartOption());
}; };
// 生命周期钩子 // 生命周期钩子
onMounted(() => { onMounted(() => {
if (enterpriseTwoRef.value) { nextTick(() => {
const chart = echarts.init(enterpriseTwoRef.value); initChart();
// 设置option });
chart.setOption(option); window.addEventListener('resize', handleChartResize);
});
onUnmounted(() => {
window.removeEventListener('resize', handleChartResize);
if (chart) {
chart.dispose();
chart = null;
} }
}); });
</script> </script>
<style lang="scss" scoped></style>

View File

@ -1,104 +1,214 @@
<template> <template>
<div> <div>
<div class="carcTitle">省内区域劳务协作撒点</div> <div class="carcTitle">省内区域劳务协作撒点</div>
<div ref="map" style="width: 17vw; height: 14.5vw"></div> <div ref="map" style="width: 19vw; height: 16vw"></div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, reactive, computed, onMounted } from "vue"; import { ref, onMounted, onUnmounted, nextTick } from "vue";
// 引入Echarts
import * as echarts from "echarts"; import * as echarts from "echarts";
import 'echarts-gl'; import 'echarts-gl';
// 引入崇州市地图json数据 import { debounce } from 'lodash';
// 引入地图数据
import sichuanJSON from "@/assets/json/sichuan.json"; import sichuanJSON from "@/assets/json/sichuan.json";
// 引入本地撒点图片
import pointImage from "@/assets/images/recruitment/map-point1.png"; import pointImage from "@/assets/images/recruitment/map-point1.png";
// 获取地图DOM元素
let map = ref(); // DOM 引用
// 注册崇州地图 const map = ref();
let myMap = null;
// 注册地图
echarts.registerMap("sichuan", sichuanJSON); echarts.registerMap("sichuan", sichuanJSON);
// 响应式设计配置
const designConfig = {
designWidth: 1920,
designHeight: 1080
};
// 计算响应式尺寸
const calcResponsivePX = (pxValue) => {
const screenWidth = window.innerWidth || document.documentElement.clientWidth;
return (pxValue / designConfig.designWidth) * screenWidth;
};
// 初始点位数据
const initialPoints = [ const initialPoints = [
{ name: "攀枝花", value: [101.718, 26.582, 0], count: 0 }, { name: "绵阳市", value: [104.69,31.47, 0], count: 0 },
{ name: "雅安", value: [103.009, 29.988, 0], count: 0 }, { name: "广元市昭化区", value: [105.97,32.33, 0], count: 0 },
{ name: "眉山", value: [103.848, 30.082, 0], count: 0 }, { name: "巴中市恩阳区", value: [106.64,31.80, 0], count: 0 },
{ name: "自贡", value: [104.777, 29.350, 0], count: 0 }, { name: "达州市渠县", value: [106.98,30.84, 0], count: 0 },
{ name: "泸州", value: [105.442, 28.871, 0], count: 0 }, { name: "达州市开江县", value: [107.88,31.09, 0], count: 0 },
{ name: "资阳", value: [104.628, 30.122, 0], count: 0 }, { name: "达州市大竹县", value: [107.21,30.74, 0], count: 0 },
{ name: "遂宁", value: [105.576, 30.523, 0], count: 0 }, { name: "广安市", value: [106.64,30.46, 0], count: 0 },
{ name: "广安", value: [106.636, 30.463, 0], count: 0 }, { name: "广安市岳池县", value: [106.45,30.54, 0], count: 0 },
{ name: "德阳", value: [104.399, 31.130, 0], count: 0 }, { name: "广安华蓥市", value: [106.79,30.40, 0], count: 0 },
{ name: "绵阳", value: [104.684185, 31.473263, 0], count: 0 }, { name: "南充顺庆区", value: [106.10,30.80, 0], count: 0 },
{ name: "广元", value: [105.834, 32.435, 0], count: 0 }, { name: "遂宁市大英县", value: [105.24,30.60, 0], count: 0 },
{ name: "巴中", value: [106.753, 31.857, 0], count: 0 }, { name: "德阳市中江县", value: [104.69,31.04, 0], count: 0 },
{ name: "达州", value: [107.467, 31.209, 0], count: 0 }, { name: "资阳市雁江区", value: [104.68,30.11, 0], count: 0 },
{ name: "南充", value: [106.110, 30.837, 0], count: 0 } { name: "雅安市荥经县", value: [102.85,29.80, 0], count: 0 },
{ name: "雅安市天全县", value: [102.76,30.07, 0], count: 0 },
{ name: "眉山市青神县", value: [103.85,29.84, 0], count: 0 },
{ name: "自贡贡井区", value: [104.72,29.35, 0], count: 0 },
{ name: "泸州市", value: [105.45,28.88, 0], count: 0 },
{ name: "攀枝花市", value: [101.73,26.59, 0], count: 0 },
]; ];
// 地图参数设置
let option = { // 生成随机高度值函数
tooltip: { const generateRandomHeights = (points, minHeight = 10, maxHeight = 25) => {
trigger: "item", return points.map(point => ({
formatter: function (params) { ...point,
if (params.seriesType === "scatter3D") { value: [point.value[0], point.value[1], Math.random() * (maxHeight - minHeight) + minHeight]
return `${params.name}<br/>合作社数量:${params.data.count || 0}`; }));
};
// 获取动态配置
const getChartOption = () => {
const pointsWithRandomHeights = generateRandomHeights(initialPoints);
return {
tooltip: {
trigger: "item",
formatter: (params) => {
if (params.seriesType === "scatter3D") {
return `${params.name}<br/>合作社数量:${params.data.count || 0}`;
}
return params.name;
},
backgroundColor: "rgba(0, 0, 0, 0.8)",
borderColor: "#30DCFF",
textStyle: {
color: "#fff",
fontSize: 12
} }
return params.name;
}
},
geo3D: {
type: "map3D",
map: "sichuan",
regionHeight: 6,
boxHeight: 2,
roam: false,
label: {
show: true,
color: "#CBF2FA",
fontSize: 12,
fontWeight: "bold"
}, },
itemStyle: { geo3D: {
color: "rgba(27, 129, 150, 0.4)", type: "map3D",
map: "sichuan",
regionHeight: 6,
boxHeight: 2,
roam: true,
label: {
show: false,
color: "#fff",
fontSize: 10,
fontWeight: "bold"
},
itemStyle: {
color: "rgba(27,129,150,0.18)",
borderColor: "#61cfff", borderColor: "#61cfff",
borderWidth: 2, borderWidth: 2,
opacity: 0.75 opacity: 0.3
}, },
emphasis: { emphasis: {
itemStyle: { color: "rgba(27, 129, 150, 0.65)", opacity: 0.85 }, itemStyle: {
label: { color: "#ffff00" } color: "rgba(27, 129, 150, 0.3)",
opacity: 0.5
}, },
light: { label: { show: false }
main: { intensity: 1.6, shadow: true, shadowQuality: "high", alpha: 35, beta: 15 }, },
ambient: { intensity: 0.35 } light: {
main: {
intensity: 1.6,
shadow: true,
shadowQuality: "high",
alpha: 35,
beta: 15
},
ambient: { intensity: 0.35 }
},
shading: "lambert",
viewControl: {
distance: 110,
alpha: 45,
beta: 10
},
groundPlane: { show: false }
}, },
shading: "lambert", series: [
viewControl: { distance: 110, alpha: 45, beta: 10 },
groundPlane: { show: false },
postEffect: { enable: true, bloom: { enable: true, bloomIntensity: 0.25 } }
},
series: [
{ {
name: "城市点位(3D)", name: "城市点位(3D)",
type: "scatter3D", type: "scatter3D",
coordinateSystem: "geo3D", coordinateSystem: "geo3D",
data: initialPoints.map(p => ({ data: pointsWithRandomHeights.map(p => ({
name: p.name, name: p.name,
value: [p.value[0], p.value[1], 6], value: p.value,
count: p.count count: p.count,
// 关键:使用正确的 label 配置方式
label: {
show: true,
formatter: p.name,
position: [p.value[2] + 5, p.value[2] + 5, p.value[2] + 5], // [x, y, z] - 在点上方固定偏移
distance: 0, // 重要设置为0使用绝对位置
textStyle: {
backgroundColor: 'rgba(0,0,0,0.7)',
borderWidth: 1,
borderColor: '#30dcff',
padding: [4, 8],
borderRadius: 4,
color: '#fff',
fontSize: 10
}
}
})), })),
symbol: "triangle", symbol: "triangle", // 改为圆形,更明显
symbolSize: 12, symbolSize: calcResponsivePX(12), // 增大符号尺寸
itemStyle: { color: "#FFBE34" }, itemStyle: { color: "#FFBE34" },
label: { show: false } label: {
textStyle: {
backgroundColor: 'rgba(255,190,52,0.9)',
color: '#000',
fontWeight: 'bold'
}
}
} }
] ]
}
};
// 处理图表重绘(防抖优化)
const handleChartResize = debounce(() => {
if (myMap) {
myMap.resize();
// 重新设置配置以更新响应式尺寸
myMap.setOption(getChartOption(), true);
}
}, 300);
// 初始化图表
const initChart = () => {
if (!map.value) return;
myMap = echarts.init(map.value);
myMap.setOption(getChartOption());
// 添加点击事件(可选)
myMap.on('click', (params) => {
if (params.componentType === 'series' && params.seriesType === 'scatter3D') {
console.log('点击了城市:', params.name);
// 可以在这里添加点击后的业务逻辑
}
});
}; };
// 生命周期钩子 // 生命周期钩子
onMounted(() => { onMounted(() => {
let myMap = echarts.init(map.value); nextTick(() => {
// 设置配置项 initChart();
myMap.setOption(option); });
window.addEventListener('resize', handleChartResize);
});
onUnmounted(() => {
window.removeEventListener('resize', handleChartResize);
if (myMap) {
myMap.dispose();
myMap = null;
}
}); });
</script> </script>
@ -110,7 +220,7 @@ onMounted(() => {
text-align: center; text-align: center;
color: #c4f3fe; color: #c4f3fe;
background: url("~@/assets/images/recruitment/card-title@2x.png") no-repeat background: url("~@/assets/images/recruitment/card-title@2x.png") no-repeat
center; center;
background-size: auto 100%; background-size: auto 100%;
margin-top: 0.7vw; margin-top: 0.7vw;
} }

View File

@ -70,7 +70,7 @@
<el-carousel-item> <el-carousel-item>
<div class="carousel-item-content"> <div class="carousel-item-content">
<div class="carousel-item-title"> <div class="carousel-item-title">
仁寿县劳务合作社联合送工 农民工返乡慰问现场
</div> </div>
<div style="height:20vw;"> <div style="height:20vw;">
<img src="@/assets/images/ms/fxww.jpg" class="carousel-image"> <img src="@/assets/images/ms/fxww.jpg" class="carousel-image">

View File

@ -104,6 +104,7 @@ const props = defineProps({
color: #ffffff; color: #ffffff;
margin-bottom: 0.46875vw; margin-bottom: 0.46875vw;
font-size: 0.729vw; font-size: 0.729vw;
font-weight:700 ;
} }
.modelItem1 { .modelItem1 {

View File

@ -13,67 +13,70 @@
background-size: 100% 100%; background-size: 100% 100%;
color: #fff; color: #fff;
// 头部 // 头部
.homeHead,.homeHeadsmall { .homeHead,
display: flex; .homeHeadsmall {
justify-content: space-between; display: flex;
position: fixed; justify-content: space-between;
top: 0; position: fixed;
left: 0; top: 0;
width: 100%; left: 0;
z-index: 8; width: 100%;
height: 4.896vw !important; z-index: 8;
background: url('~@/assets/recruitment/header_bg.svg') no-repeat; height: 4.896vw !important;
background-size: 100%; background: url('~@/assets/recruitment/header_bg.svg') no-repeat;
background-size: 100%;
.left_Head { .left_Head {
position: absolute;
left: 1vw;
top: 2.135vw;
font-family: "DigifaceWide";
}
.center_head {
position: absolute;
top: 2vw;
left: 50%;
transform: translateX(-56%);
font-size: 4vw;
font-family: "YSBTH";
letter-spacing: 0.104vw;
font-weight: 400;
white-space: nowrap;
span {
background-image: linear-gradient(to top, #165493 10%, #ffffff 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
&::before {
content: attr(text);
position: absolute; position: absolute;
z-index: -2; left: 1vw;
top: 2.135vw;
font-family: "DigifaceWide";
} }
}
.right_head { .center_head {
position: absolute;
right: 1.875vw;
top: 2.135vw;
.setting {
position: absolute; position: absolute;
top: -10px; top: 2vw;
left: -78px; left: 50%;
width: 1.8vw; transform: translateX(-56%);
height: 1.8vw; font-size: 4vw;
font-family: "YSBTH";
letter-spacing: 0.104vw;
font-weight: 400;
white-space: nowrap;
span {
background-image: linear-gradient(to top, #165493 10%, #ffffff 50%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
&::before {
content: attr(text);
position: absolute;
z-index: -2;
}
}
.right_head {
position: absolute;
right: 1.875vw;
top: 2.135vw;
.setting {
position: absolute;
top: -10px;
left: -78px;
width: 1.8vw;
height: 1.8vw;
}
} }
} }
}
.homeHeadsmall{ .homeHeadsmall {
// background: url('~@/assets/images/home_head_small.png') no-repeat center center; // background: url('~@/assets/images/home_head_small.png') no-repeat center center;
height: 6.771vw; height: 6.771vw;
.center_head { .center_head {
position: absolute; position: absolute;
top: 0.5vw; top: 0.5vw;
@ -87,86 +90,86 @@
} }
} }
// 侧边 // 侧边
.asidemodel { .asidemodel {
position: absolute; position: absolute;
top: 5.888vw; top: 5.888vw;
//width: 22.396vw; //width: 22.396vw;
//height: calc(100vh - 13.75vw); //height: calc(100vh - 13.75vw);
//transform: perspective(6.25vw) rotateY(2deg); //transform: perspective(6.25vw) rotateY(2deg);
.asideHead { .asideHead {
position: relative; position: relative;
height: 2.083vw; height: 2.083vw;
line-height: 2.083vw; line-height: 2.083vw;
margin-bottom: 1.042vw; margin-bottom: 1.042vw;
padding-left: 0.729vw; padding-left: 0.729vw;
padding-right: 0.729vw; padding-right: 0.729vw;
box-sizing: border-box; box-sizing: border-box;
span { span {
font-size: 1.458vw; font-size: 1.458vw;
@include textColor(#499FF2, #ffffff); @include textColor(#499FF2, #ffffff);
font-family: "HANYILINGXINTIJIAN"; font-family: "HANYILINGXINTIJIAN";
}
&::after {
position: absolute;
content: '';
width: 8.594vw;
height: 1.146vw;
left: 0.104vw;
top: 1.823vw;
background: url('~@/assets/images/bg_03.png') no-repeat left bottom;
background-size: 100%;
}
} }
&::after { .asideHeadR {
position: absolute; position: relative;
content: '';
width: 8.594vw; &::after {
height: 1.146vw; position: absolute;
left: 0.104vw; content: '';
top: 1.823vw; width: 8.594vw;
background: url('~@/assets/images/bg_03.png') no-repeat left bottom; height: 1.146vw;
left: 13.333vw;
top: 1.823vw;
background: url('~@/assets/images/bg_03.png') no-repeat left bottom;
background-size: 100%;
transform: rotate(180deg);
}
}
.modelBox {
height: calc(100% - 3.125vw);
}
.asideItem {
flex: 1 0 0;
// margin: 0px 0.052vw;
margin: 0 0.052vw 1.5vh;
overflow: hidden;
// margin-bottom: 0.26vw;
background: url('~@/assets/images/bg_04.png') no-repeat left bottom;
background-size: 100%; background-size: 100%;
} }
} }
.asideHeadR {
position: relative;
&::after {
position: absolute;
content: '';
width: 8.594vw;
height: 1.146vw;
left: 13.333vw;
top: 1.823vw;
background: url('~@/assets/images/bg_03.png') no-repeat left bottom;
background-size: 100%;
transform: rotate(180deg);
}
}
.modelBox {
height: calc(100% - 3.125vw);
}
.asideItem {
flex: 1 0 0;
// margin: 0px 0.052vw;
margin: 0 0.052vw 1.5vh;
overflow: hidden;
// margin-bottom: 0.26vw;
background: url('~@/assets/images/bg_04.png') no-repeat left bottom;
background-size: 100%;
}
}
.asidemodelR { .asidemodelR {
//transform: perspective(6.25vw) rotateY(-2deg); //transform: perspective(6.25vw) rotateY(-2deg);
} }
// 展开-关闭按钮 // 展开-关闭按钮
.showNeun { .showNeun {
position: absolute; position: absolute;
top: 47%; top: 47%;
transform: translateY(-50%); transform: translateY(-50%);
width: 4.313vw; width: 4.313vw;
height: 22.802vw; height: 22.802vw;
background: url('~@/assets/images/home_left.png') no-repeat center center; background: url('~@/assets/images/home_left.png') no-repeat center center;
background-size: 100% 100%; background-size: 100% 100%;
} }
.showNeunR { .showNeunR {
background: url('~@/assets/images/home_right.png') no-repeat center center; background: url('~@/assets/images/home_right.png') no-repeat center center;

View File

@ -1,5 +1,6 @@
<template> <template>
<div class="bigScrenn"> <div class="bigScrenn">
<div class="bg">
<!-- 头部 --> <!-- 头部 -->
<Head title="兴蜀人力数据概览"></Head> <Head title="兴蜀人力数据概览"></Head>
<div <div
@ -58,26 +59,29 @@
:type1="cardFourInfo.type1" :type1="cardFourInfo.type1"
:type2="cardFourInfo.type2" :type2="cardFourInfo.type2"
> >
<el-carousel <!-- <el-carousel-->
:interval="8000" <!-- :interval="8000"-->
type="card" <!-- type="card"-->
height="17vw" <!-- height="17vw"-->
indicator-position="none" <!-- indicator-position="none"-->
:autoplay="true" <!-- :autoplay="true"-->
> <!-- >-->
<!-- <el-carousel-item><LaborSystemOne /></el-carousel-item> --> <!-- <el-carousel-item><LaborSystemOne /></el-carousel-item> -->
<el-carousel-item><LaborSystemTwo /></el-carousel-item> <div class="isVisibleImg"><LaborSystemTwo /></div>
<!-- <el-carousel-item><LaborSystemThree /></el-carousel-item> --> <!-- <el-carousel-item><LaborSystemThree /></el-carousel-item> -->
<!-- <el-carousel-item><LaborSystemFour /></el-carousel-item> --> <!-- <el-carousel-item><LaborSystemFour /></el-carousel-item> -->
</el-carousel> <!-- </el-carousel>-->
</enterprise-employment-card> </enterprise-employment-card>
<enterprise-employment-card <enterprise-employment-card
style="margin-top: 0.625vw"
:title="cardThreeInfo.title" :title="cardThreeInfo.title"
:description="cardThreeInfo.description" :description="cardThreeInfo.description"
:type1="cardThreeInfo.type1" :type1="cardThreeInfo.type1"
:type2="cardThreeInfo.type2" :type2="cardThreeInfo.type2"
style="margin-top: 0.625vw"
> >
<template v-slot:header>
<div class="header_bg" style="margin-top:1vw">近2个月保供入职人员分析</div>
</template>
<ListView/> <ListView/>
@ -89,6 +93,7 @@
<!-- 弹窗 --> <!-- 弹窗 -->
<HomeDialogInfo v-model="dialogShow" /> <HomeDialogInfo v-model="dialogShow" />
</div> </div>
</div>
</template> </template>
<script> <script>
export default { export default {
@ -168,7 +173,7 @@ const cardTwoInfo = {
} }
}; };
const cardThreeInfo = { const cardThreeInfo = {
title: "重点企业保供案例(比亚迪)", title: "重点企业保供案例",
// description: "4000+毕业生", // description: "4000+毕业生",
type1: { type1: {
title: "招募总人数", title: "招募总人数",
@ -176,7 +181,7 @@ const cardThreeInfo = {
class: "modelItem2" class: "modelItem2"
}, },
type2: { type2: {
title: "企业总人数2025/10/25", title: "企业总人数(10/9)",
count: "38448", count: "38448",
class: "modelItem2" class: "modelItem2"
} }
@ -232,6 +237,11 @@ function getWebSocketData() {
.transition { .transition {
transition: all 0.5s; transition: all 0.5s;
} }
.isVisibleImg.el-carousel__item {
background: none !important;
}
.el-carousel { .el-carousel {
margin-top: 0.5vw; margin-top: 0.5vw;
} }
@ -259,4 +269,16 @@ function getWebSocketData() {
font-style: normal; font-style: normal;
text-transform: none; text-transform: none;
} }
.bg{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 1;
background: url('~@/assets/recruitment/bjtl.svg') no-repeat center center;
background-size: 102% 100%;
// background: url("~@/assets/recruitment/mbc.png") no-repeat center center;
// background-size: 100% 100%;
}
</style> </style>

File diff suppressed because it is too large Load Diff