修改模块

This commit is contained in:
2025-12-10 17:19:01 +08:00
parent 620975c04d
commit 640ec71c74
9 changed files with 1403 additions and 1936 deletions

View File

@@ -1,3 +1,4 @@
@charset "utf-8";
a,p,h1,h2,h3,h4,h5,h6,body,span,label,div{padding:0;margin:0;font-family:'瀵邦喛钂嬮梿鍛寸拨';}
div{font-family:'瀵邦喛钂嬮梿鍛寸拨';}
ul{padding:0;margin:0;}
@@ -50,20 +51,63 @@ html, body, form{overflow-y:auto;height:100%;}
.head_top{position:relative;text-align:center;}
.head_top img{display:block;width:80%;margin:0 auto;}
.head_top .head_logo{position:absolute;top:6px;left:50%;transform:translateX(-50%);color:#55bfff;font-size:35px;font-weight:600;z-index:2;}
.head_top .head_logo{position:absolute;top:6px;left:50%;transform:translateX(-50%);color:#55bfff;font-size:35px;font-weight:600;z-index:10;text-shadow: 0 0 10px rgba(0, 216, 255, 0.5);}
.head_top .head_decor{margin-top:1px;}
.head_top .decor_side {
position: absolute;
top: 15px;
width: 45px !important;
height: auto !important;
z-index: 11;
opacity: 0.9;
display: block; /* ensure it is visible */
margin: 0; /* reset margin from generic rule */
}
.head_top .decor_left {
left: 50%;
margin-left: -170px !important;
}
.head_top .decor_right {
left: 50%;
margin-left: 125px !important;
transform: scaleX(-1);
}
.head_top .decor_bar {
position: absolute;
top: 40px;
width: 25% !important;
height: auto !important;
z-index: 10;
display: block;
}
.head_top .decor_left_outer {
left: 50%;
margin-left: -850px !important;
}
.head_top .decor_right_outer {
left: 50%;
margin-left: 400px !important;
}
.head_top p{width:100%;text-align:center;color:#55bfff;position:absolute;bottom: -18px;left: -10px;}
.head_top p span{font-family:'yjsz';font-size:20px;}
.visual{height:calc(100% - 33px);padding-top:10px;}
.visual{height:calc(100% - 33px);padding-top:5px;}
.visual_box{height:33.3%;}
.visual_box{height:40%;}
.visual_left .visual_box{height:18%;margin-bottom: 2%;}
.visual_right .visual_box{height:18%;margin-bottom: 2%;}
.visual_left .visual_box:nth-child(1),
.visual_right .visual_box:nth-child(1),
.visual_left .visual_box:nth-child(2),
.visual_right .visual_box:nth-child(2) {
height: 34%;
}
.visual_box .visual_title{position:relative;height:35px;margin:5px 0;}
.visual_box .visual_title span{color:#fff;font-size:18px;line-height:35px;}
.visual_box .visual_title img{width:100%;position:absolute;left:0;bottom:0;}
.visual_box .visual_chart{height:calc(100% - 35px);}
.visual_left{width:25%;height:100%;float:left;}
.visual_left{width:25%;height:100%;float:left;margin-top: -15px;}
.visual_left .sfzcll{position:relative;}
.visual_left .sfzcll a{width:32%;text-align:center;line-height:25px;color:#fff;display:inline-block;}
.visual_left .sfzcll .sfzcll_pos_box{width:100%;height:calc(100% - 30px);}
@@ -81,17 +125,17 @@ html, body, form{overflow-y:auto;height:100%;}
.visual_left .sfzcll .sfzcll_box .sfzcll_smallBk .ygl{color:#00ffc6;}
.visual_left .sfzcll .sfzcll_box .sfzcll_smallBk .ygh{color:#ffe400;}
.visual_con{width:50%;height:100%;float:left;padding:25px 20px 0 20px;}
.visual_con .visual_conTop{display:grid;grid-template-columns:repeat(5,1fr);grid-auto-rows:120px;gap:10px;margin-bottom:10px;}
.visual_con{width:50%;height:100%;float:left;padding:0 20px 0 20px;}
.visual_con .visual_conTop{display:grid;grid-template-columns:repeat(5,1fr);grid-auto-rows:80px;gap:10px;margin-bottom:10px;}
.visual_con .visual_conTop .visual_conTop_box{height:100%;padding:0;}
.visual_con .visual_conTop .visual_conTop1{width:100%;height:100%;float:none;}
.visual_con .visual_conTop .visual_conTop1>div{background:url(../images/ksh40.png) no-repeat;background-size:100% 100%;}
.visual_con .visual_conTop .visual_conTop2{width:30%;height:100%;float:left;}
.visual_con .visual_conTop .visual_conTop2>div{background:url(../images/ksh39.png) no-repeat;background-size:100% 100%;}
.visual_right{width:25%;height:100%;float:right;}
.visual_con .visual_conTop .visual_conTop_box>div{height:100%;}
.visual_con .visual_conTop .visual_conTop_box>div h3{color:#fff;font-size:16px;padding:12px 0 0 16px;margin:0;}
.visual_con .visual_conTop .visual_conTop_box>div p{width:100%;float:none;line-height:1.2;color:#20dbfd;text-shadow:0 0 12px #00d8ff;font-size:32px;font-family: 'yjsz';text-align:left;padding:12px 0 0 16px;margin:0;}
.visual_right{width:25%;height:100%;float:right;margin-top: -15px;}
.visual_con .visual_conTop .visual_conTop_box>div{height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;}
.visual_con .visual_conTop .visual_conTop_box>div h3{color:#fff;font-size:14px;padding:0;margin:0;text-align:center;width:100%;}
.visual_con .visual_conTop .visual_conTop_box>div p{width:100%;float:none;line-height:1.2;color:#20dbfd;text-shadow:0 0 12px #00d8ff;font-size:24px;font-family: 'yjsz';text-align:center;padding:5px 0 0 0;margin:0;}
.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil{width:67%;height:60px;float:left;padding-top:23px;}
.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil a{display:block;line-height:20px;text-align: left;color:#fff;padding-left:9px;}
.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil span{width:32px;display:inline-block;margin-left:3px;}
@@ -99,35 +143,408 @@ html, body, form{overflow-y:auto;height:100%;}
.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil a.xd{color:#12fe81;}
.visual_con .visual_conTop .visual_conTop_box>div .conTop_smil a.null{visibility:hidden;}
.visual_conBot{height:calc(100% - 400px);position:relative;margin-top:10px;}
.visual_conBot>img{position:absolute;z-index:99;}
.visual_conBot .visual_conBot_l{left:0;top:0;}
.visual_conBot .visual_conBot_2{right:0;top:0;}
.visual_conBot .visual_conBot_3{right:0;bottom:0;}
.visual_conBot .visual_conBot_4{left:0;bottom:0;}
.visual_conBot .visual_chart{width:100%;height:100%;position:absolute;z-index:9;}
/* 订单状态监控模块样式 */
.visual_conStatus {
height: 90px;
margin-top: 10px;
display: flex;
justify-content: space-between;
padding: 0 10px;
}
.status_item {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
position: relative;
padding-bottom: 5px;
}
.status_label {
color: #fff;
font-size: 14px;
margin-bottom: 5px;
z-index: 2;
}
.status_value_group {
display: flex;
align-items: baseline;
margin-bottom: 15px;
z-index: 2;
}
.status_value_group .stat-value {
color: #fff;
font-size: 24px;
font-family: 'yjsz';
font-weight: bold;
text-shadow: 0 0 10px rgba(255, 255, 255, 0.8);
}
.status_value_group .status_unit {
color: #aaa;
font-size: 12px;
margin-left: 5px;
}
.status_base {
position: absolute;
bottom: 0;
width: 80%;
height: 30px;
display: flex;
justify-content: center;
align-items: center;
}
.status_ring {
position: absolute;
bottom: 0;
width: 100%;
height: 100%;
border-radius: 50%;
border: 2px solid rgba(0, 150, 255, 0.5);
background: rgba(0, 80, 160, 0.2);
box-shadow: 0 0 15px rgba(0, 150, 255, 0.4), inset 0 0 10px rgba(0, 150, 255, 0.2);
transform: rotateX(60deg);
}
.status_light {
position: absolute;
bottom: 10px;
width: 70%;
height: 40px;
background: linear-gradient(to top, rgba(0, 150, 255, 0.4), transparent);
clip-path: polygon(20% 0%, 80% 0%, 100% 100%, 0% 100%);
z-index: 1;
}
/* 为 status_ring 添加旋转动画 */
.status_ring::after {
content: '';
position: absolute;
top: -5px; left: -5px; right: -5px; bottom: -5px;
border-radius: 50%;
border: 2px dashed rgba(0, 216, 255, 0.6);
animation: rotateRing 10s linear infinite;
}
@keyframes rotateRing {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.stat-card{display:flex;flex-direction:column;justify-content:center;align-items:flex-start;height:100%;}
.visual_con .visual_conBot{height:calc(100% - 136px);background:url(../images/ksh41.png) no-repeat;background-size:100% 100%;position:relative;}
.visual_con .visual_conBot>img{position:absolute;width:25px;height:25px;}
.visual_con .visual_conBot .visual_conBot_l{position:absolute;left:0;top:0;}
.visual_con .visual_conBot .visual_conBot_2{position:absolute;right:0;top:0;}
.visual_con .visual_conBot .visual_conBot_3{position:absolute;right:0;bottom:0;}
.visual_con .visual_conBot .visual_conBot_4{position:absolute;left:0;bottom:0;}
.visual_con .visual_conBot .visual_chart{width:100%;height:100%;position:absolute;}
.visual_con .visual_conBot .visual_chart_text{color:#fff;position:absolute;top:15px;left:15px;z-index: 99;}
.visual_con .visual_conBot .visual_chart_text h1{font-size:26px;margin-bottom:6px;}
.visual_con .visual_conBot .visual_chart_text h2{font-size:20px;}
.visual_con .visual_conBot .visual_conBot_bot{width:calc(100% - 8px);height:180px;background:rgba(16,54,87,0.5);border:1px solid #345f92;position:absolute;bottom:4px;left:4px;z-index:99;}
/* Order List Styles */
.order_list_container {
padding: 10px;
display: flex;
flex-direction: column;
}
.order_list_header {
display: flex;
justify-content: space-between;
padding: 8px 10px;
background: rgba(13, 38, 71, 0.8);
border-radius: 4px;
margin-bottom: 5px;
}
.order_list_header span {
color: #00d8ff;
font-size: 14px;
flex: 1;
text-align: center;
}
.order_list_content {
flex: 1;
overflow-y: auto;
}
.order_item {
display: flex;
justify-content: space-between;
padding: 8px 10px;
border-bottom: 1px solid rgba(255,255,255,0.1);
align-items: center;
}
.order_item span {
color: #fff;
font-size: 13px;
flex: 1;
text-align: center;
}
.status-done { color: #00ffc6 !important; }
.status-shipping { color: #ffe400 !important; }
.status-pending { color: #ff6b6b !important; }
.visualSssf_left{width:40%;float:left;color:#fff;padding:10px 20px 0 20px;}
.visualSssf_left h3{color:#fff;font-size:20px;font-weight:600;margin-bottom:10px;}
.visualSssf_left a{width:32%;color:#fff;display:inline-block;margin-bottom:10px;cursor:pointer;}
.visualSssf_left a.active{color:#01f0ff;}
.visualSssf_right{width:60%;height:100%;float:left;}
.visualSssf_right .visualSssf_right_box{width:33%;float:left;height:100%;}
/* 牛只概况列表样式 */
#cattle_overview_container {
padding: 10px 10px 0 10px;
display: flex;
flex-wrap: wrap;
align-content: flex-start;
overflow-y: auto;
height: 100%;
}
.visualSfzsfl{position:relative;}
.visualSfzsfl .visual_chart{opacity:0.6}
.visualSfzsfl .visual_table{width:60%;position:absolute;z-index: 99;top:40px;left:0;}
.visualSfzsfl .visual_table table{width:100%;color:#fff;text-align:center;}
.visualSfzsfl .visual_table table tr{border-bottom: 1px dashed #ddd;}
.visualSfzsfl .visual_table table tr:first-child{color:#01c0ff;}
.visualSfzsfl .visual_table table tr:last-child{border-bottom: 1px solid #ddd;}
.cattle_item {
width: 48%;
margin-right: 4%;
margin-bottom: 12px;
background: rgba(10, 30, 60, 0.6);
border: 1px solid #134572;
border-radius: 20px;
padding: 5px 8px;
display: flex;
align-items: center;
box-sizing: border-box;
box-shadow: inset 0 0 10px rgba(0, 150, 255, 0.1);
cursor: pointer;
transition: all 0.3s;
}
.cattle_item:hover {
background: rgba(10, 30, 60, 0.9);
border-color: #00d8ff;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 216, 255, 0.2);
}
.cattle_item:nth-child(2n) {
margin-right: 0;
}
.cattle_icon {
width: 30px;
height: 30px;
border-radius: 50%;
background: rgba(0, 80, 160, 0.5);
border: 1px solid #0096ff;
display: flex;
justify-content: center;
align-items: center;
margin-right: 8px;
flex-shrink: 0;
position: relative;
}
.cattle_icon::after {
content: '';
position: absolute;
width: 4px;
height: 4px;
background: #00d8ff;
border-radius: 50%;
bottom: 2px;
right: 2px;
box-shadow: 0 0 5px #00d8ff;
}
.cattle_icon .glyphicon {
color: #8acaff;
font-size: 14px;
}
.cattle_info {
flex: 1;
display: flex;
justify-content: space-between;
align-items: baseline;
white-space: nowrap;
overflow: hidden;
}
.cattle_name {
color: #cceeff;
font-size: 13px;
overflow: hidden;
text-overflow: ellipsis;
}
.cattle_value {
color: #fff;
font-size: 16px;
font-family: 'yjsz';
margin-left: 5px;
}
.cattle_unit {
font-size: 12px;
color: #aaa;
margin-left: 2px;
font-family: "Microsoft YaHei";
}
/* 牛只行情列表样式 */
.market_list_container {
padding: 10px;
display: flex;
flex-direction: column;
}
.market_list_header {
display: flex;
justify-content: space-between;
padding: 8px 0;
background: rgba(13, 38, 71, 0.8);
border-radius: 4px;
margin-bottom: 5px;
}
.market_list_header span {
color: #aaa;
font-size: 13px;
text-align: center;
font-weight: bold;
}
.market_list_content {
flex: 1;
overflow-y: auto;
}
.market_item {
display: flex;
justify-content: space-between;
padding: 8px 0;
border-bottom: 1px solid rgba(255,255,255,0.05);
align-items: center;
}
.market_item span {
color: #fff;
font-size: 12px;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 序号列 */
.market_list_header span:nth-child(1),
.market_item span:nth-child(1) {
flex: 0.5;
}
/* 省份列 */
.market_list_header span:nth-child(2),
.market_item span:nth-child(2) {
flex: 1;
}
/* 地区列 */
.market_list_header span:nth-child(3),
.market_item span:nth-child(3) {
flex: 1.5;
}
/* 品种列 */
.market_list_header span:nth-child(4),
.market_item span:nth-child(4) {
flex: 1;
}
/* 单价列 */
.market_list_header span:nth-child(5),
.market_item span:nth-child(5) {
flex: 1;
}
.market_price {
color: #00d8ff !important;
font-weight: bold;
}
/* 合计总数模块样式 */
.total_layout {
display: flex;
flex-direction: column;
justify-content: space-around;
padding: 10px 20px;
}
.total_row {
flex: 1;
display: flex;
align-items: center;
background: rgba(10, 30, 60, 0.6);
border: 1px solid rgba(0, 216, 255, 0.2);
border-radius: 8px;
margin-bottom: 10px;
padding: 0 15px;
box-shadow: inset 0 0 15px rgba(0, 150, 255, 0.1);
}
.total_row:last-child {
margin-bottom: 0;
}
.total_icon_wrapper {
width: 46px;
height: 46px;
background: rgba(0, 80, 160, 0.5);
border: 1px solid #0096ff;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0 0 10px rgba(0, 216, 255, 0.3);
}
.total_icon_wrapper .glyphicon {
font-size: 20px;
color: #00d8ff;
}
.total_text_wrapper {
margin-left: 20px;
display: flex;
flex-direction: column;
justify-content: center;
}
.total_label {
color: #cceeff;
font-size: 14px;
margin-bottom: 2px;
}
.total_data {
display: flex;
align-items: baseline;
}
.total_data .stat-value {
color: #fff;
font-size: 24px;
font-family: 'yjsz';
font-weight: bold;
text-shadow: 0 0 10px rgba(0, 216, 255, 0.5);
}
.total_data .total_unit {
color: #aaa;
font-size: 12px;
margin-left: 5px;
}
/* 屠宰场概况列表样式 - 复用牛只概况样式逻辑 */
#slaughterhouse_overview_container {
padding: 10px 10px 0 10px;
display: flex;
flex-wrap: wrap;
align-content: flex-start;
overflow-y: auto;
height: 100%;
}

View File

@@ -29,153 +29,105 @@
<img class="jzxz2" src="images/jzxz2.png">
</div>
</div>
<div class="head_top">
<!-- <img class="decor_side decor_left" src="images/ksh42.png" alt=""> -->
<img class="decor_bar decor_left_outer" src="images/ksh31.png" alt="">
<div class="head_logo">牛只管理系统</div>
<img class="decor_bar decor_right_outer" src="images/ksh32.png" alt="">
<!-- <img class="decor_side decor_right" src="images/ksh42.png" alt=""> -->
<img class="head_decor" src="images/header.png" alt="标题装饰">
</div>
<div class="visual">
<div class="visual_left">
<div class="visual_box">
<div class="visual_title">
<span>交通流量</span>
<span>订单列表</span>
<img src="images/ksh33.png">
</div>
<div class="visual_chart" id="main1">
</div>
</div>
<div class="visual_box">
<div class="visual_title">
<span>交通工具流量</span>
<img src="images/ksh33.png">
</div>
<div class="visual_chart" id="main2">
</div>
</div>
<div class="visual_box">
<div class="visual_title">
<span>收费站车流量</span>
<img src="images/ksh33.png">
</div>
<div class="visual_chart sfzcll">
<a>运输方式</a>
<a>客运量</a>
<a>货运量</a>
<div class="sfzcll_pos_box">
<div class="sfzcll_box">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<label><img src="images/ksh35.png">公路运输</label>
<div class="sfzcll_smallBk">
<div class="ygl">
<span>4347.2万</span>
</div>
</div>
<div class="sfzcll_smallBk">
<div class="ygh">
<span>4347.2万</span>
</div>
</div>
<div class="clear"></div>
</div>
<div class="sfzcll_box">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<label><img src="images/ksh35.png">公路运输</label>
<div class="sfzcll_smallBk">
<div class="ygl">
<span>4347.2万</span>
</div>
</div>
<div class="sfzcll_smallBk">
<div class="ygh">
<span>4347.2万</span>
</div>
</div>
<div class="clear"></div>
</div>
<div class="sfzcll_box">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<img class="sfzcll_bkJk" src="images/ksh34.png">
<label><img src="images/ksh35.png">公路运输</label>
<div class="sfzcll_smallBk">
<div class="ygl">
<span>4347.2万</span>
</div>
</div>
<div class="sfzcll_smallBk">
<div class="ygh">
<span>4347.2万</span>
</div>
</div>
<div class="clear"></div>
</div>
<div class="visual_chart order_list_container">
<div class="order_list_header">
<span>订单号</span>
<span>金额</span>
<span>状态</span>
</div>
<div class="order_list_content">
</div>
</div>
</div>
<div class="visual_box">
<div class="visual_title">
<span>牛只概况</span>
<img src="images/ksh33.png">
</div>
<div class="visual_chart" id="cattle_overview_container">
</div>
</div>
<div class="visual_box">
<div class="visual_title">
<span>出肉率</span>
<img src="images/ksh33.png">
</div>
<div class="visual_chart" id="meat_yield_chart"></div>
</div>
</div>
<div class="visual_con">
<div class="visual_conTop">
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>采购总额</h3>
<p class="stat-value" data-field="toalProcurementAmount">--</p>
<p class="stat-value" data-field="toalProcurementAmount">423536.29元</p>
</div>
</div>
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>销售总额</h3>
<p class="stat-value" data-field="toalSalesAmount">--</p>
<p class="stat-value" data-field="toalSalesAmount">417832.33元</p>
</div>
</div>
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>利润</h3>
<p class="stat-value" data-field="profits">--</p>
<p class="stat-value" data-field="profits">31525元</p>
</div>
</div>
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>应收货款</h3>
<p class="stat-value" data-field="accountsReceivable">--</p>
<p class="stat-value" data-field="accountsReceivable">215215.25元</p>
</div>
</div>
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>未收货款</h3>
<p class="stat-value" data-field="uncollectedPayment">--</p>
<p class="stat-value" data-field="uncollectedPayment">564231.321元</p>
</div>
</div>
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>实收货款</h3>
<p class="stat-value" data-field="actualPayment">--</p>
<p class="stat-value" data-field="actualPayment">335421.56元</p>
</div>
</div>
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>采购头数</h3>
<p class="stat-value" data-field="totalPurchase">--</p>
<p class="stat-value" data-field="totalPurchase">2200头</p>
</div>
</div>
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>采购单数</h3>
<p class="stat-value" data-field="totalOrder">--</p>
<p class="stat-value" data-field="totalOrder">35车</p>
</div>
</div>
<div class="visual_conTop_box visual_conTop1">
<div class="stat-card">
<h3>销售单数</h3>
<p class="stat-value" data-field="totalSales">--</p>
<p class="stat-value" data-field="totalSales">55单</p>
</div>
</div>
</div>
@@ -186,89 +138,120 @@
<img class="visual_conBot_4" src="images/ksh45.png">
<div class="visual_chart" id="main8"></div>
<div class="visual_conBot_bot">
<div class="visualSssf_left">
<h3>今日实时收费</h3>
<a style="display:block">全省数据</a>
<a>大同北</a>
<a>大同南</a>
<a>朔州</a>
<a>吕梁北</a>
<a>吕梁南</a>
<a>太原</a>
<a class="active">晋中</a>
<a>太旧</a>
<a>长治</a>
</div>
<div class="visual_conStatus">
<div class="status_item">
<div class="status_label">未完成</div>
<div class="status_value_group">
<span class="stat-value" data-field="uncompletedOrders">--</span>
<span class="status_unit"></span>
</div>
<div class="visualSssf_right">
<div class="visualSssf_right_box" id="main5"></div>
<div class="visualSssf_right_box" id="main6"></div>
<div class="visualSssf_right_box" id="main7"></div>
<div class="status_base">
<div class="status_ring"></div>
<div class="status_light"></div>
</div>
</div>
<div class="status_item">
<div class="status_label">未到岸</div>
<div class="status_value_group">
<span class="stat-value" data-field="notArrivedOrders">--</span>
<span class="status_unit"></span>
</div>
<div class="status_base">
<div class="status_ring"></div>
<div class="status_light"></div>
</div>
</div>
<div class="status_item">
<div class="status_label">未售完</div>
<div class="status_value_group">
<span class="stat-value" data-field="unsoldOrders">--</span>
<span class="status_unit"></span>
</div>
<div class="status_base">
<div class="status_ring"></div>
<div class="status_light"></div>
</div>
</div>
<div class="status_item">
<div class="status_label">已完成</div>
<div class="status_value_group">
<span class="stat-value" data-field="completedOrders">--</span>
<span class="status_unit"></span>
</div>
<div class="status_base">
<div class="status_ring"></div>
<div class="status_light"></div>
</div>
<div class="clear"></div>
</div>
</div>
</div>
<div class="visual_right">
<div class="visual_box">
<div class="visual_title">
<span>本月发生事件</span>
<span>牛只行情</span>
<img src="images/ksh33.png">
</div>
<div class="swiper-container visual_swiper1 visual_chart">
<div class="swiper-wrapper">
<div class="swiper-slide" id="main3"></div>
<div class="swiper-slide" id="main31"></div>
<div class="visual_chart market_list_container">
<div class="market_list_header">
<span>序号</span>
<span>省份</span>
<span>地区</span>
<span>品种</span>
<span>单价(元/斤)</span>
</div>
<div class="market_list_content">
</div>
</div>
</div>
<div class="visual_box visualSfzsfl">
<div class="visual_title">
<span>收费站收费量</span>
<img src="images/ksh33.png">
</div>
<div class="visual_chart" id="main9">
</div>
<div class="visual_table">
<table>
<tr>
<td>小型车</td>
<td>中型车</td>
<td>大型车</td>
</tr>
<tr>
<td>2486万</td>
<td>2486万</td>
<td>2486万</td>
</tr>
<tr>
<td>2486万</td>
<td>2486万</td>
<td>2486万</td>
</tr>
<tr>
<td>2486万</td>
<td>2486万</td>
<td>2486万</td>
</tr>
<tr>
<td>2486万</td>
<td>2486万</td>
<td>2486万</td>
</tr>
</table>
</div>
</div>
<div class="visual_box">
<div class="visual_title">
<span>收费站收费排行</span>
<span>屠宰场概况</span>
<img src="images/ksh33.png">
</div>
<div class="swiper-container visual_swiper2 visual_chart">
<div class="swiper-wrapper">
<div class="swiper-slide" id="main4"></div>
<div class="swiper-slide" id="main41"></div>
<div class="visual_chart" id="slaughterhouse_overview_container"></div>
</div>
<div class="visual_box">
<div class="visual_title">
<span>合计总数</span>
<img src="images/ksh33.png">
</div>
<div class="visual_chart total_layout">
<div class="total_row">
<div class="total_icon_wrapper">
<span class="glyphicon glyphicon-list-alt"></span>
</div>
<div class="total_text_wrapper">
<div class="total_label">合计总数</div>
<div class="total_data">
<span class="stat-value" data-field="totalCattle">--</span>
<span class="total_unit"></span>
</div>
</div>
</div>
<div class="total_row">
<div class="total_icon_wrapper">
<span class="glyphicon glyphicon-home"></span>
</div>
<div class="total_text_wrapper">
<div class="total_label">在栏总数</div>
<div class="total_data">
<span class="stat-value" data-field="deliveredCattle">--</span>
<span class="total_unit"></span>
</div>
</div>
</div>
<div class="total_row">
<div class="total_icon_wrapper">
<span class="glyphicon glyphicon-send"></span>
</div>
<div class="total_text_wrapper">
<div class="total_label">在途总数</div>
<div class="total_data">
<span class="stat-value" data-field="inTransitCattle">--</span>
<span class="total_unit"></span>
</div>
</div>
</div>
</div>
</div>
@@ -291,10 +274,12 @@
}
}
/*
var sfzcllH=$('.sfzcll_box').height()
var sfzcllHtwo=sfzcllH-2
$('.sfzcll_box').css('line-height',sfzcllH+'px')
$('.sfzcll_smallBk>div').css('line-height',sfzcllHtwo+'px')
*/
//删除加载动画
$('#load').fadeOut(1000)
@@ -342,10 +327,57 @@
success: function(res) {
const list = res && (res.data || res.rows || res.result || res.list || res);
const first = Array.isArray(list) ? list[0] : list;
renderSalesOverview(first || {});
const data = first || {};
// 模拟测试数据(如果接口未返回)
if (data.toalProcurementAmount === undefined) data.toalProcurementAmount = 423536.29;
if (data.toalSalesAmount === undefined) data.toalSalesAmount = 417832.33;
if (data.profits === undefined) data.profits = 31525;
if (data.accountsReceivable === undefined) data.accountsReceivable = 215215.25;
if (data.uncollectedPayment === undefined) data.uncollectedPayment = 564231.32;
if (data.actualPayment === undefined) data.actualPayment = 335421.56;
if (data.totalPurchase === undefined) data.totalPurchase = 2200;
if (data.totalOrder === undefined) data.totalOrder = 35;
if (data.totalSales === undefined) data.totalSales = 55;
// 模拟合计总数数据
if (data.totalCattle === undefined) data.totalCattle = 12580;
if (data.inTransitCattle === undefined) data.inTransitCattle = 1250;
if (data.deliveredCattle === undefined) data.deliveredCattle = 11330;
// 模拟订单状态数据
if (data.uncompletedOrders === undefined) data.uncompletedOrders = 28;
if (data.notArrivedOrders === undefined) data.notArrivedOrders = 28;
if (data.unsoldOrders === undefined) data.unsoldOrders = 6;
if (data.completedOrders === undefined) data.completedOrders = 22;
renderSalesOverview(data);
},
error: function() {
renderSalesOverview({});
const data = {};
// 模拟测试数据
data.toalProcurementAmount = 423536.29;
data.toalSalesAmount = 417832.33;
data.profits = 31525;
data.accountsReceivable = 215215.25;
data.uncollectedPayment = 564231.32;
data.actualPayment = 335421.56;
data.totalPurchase = 2200;
data.totalOrder = 35;
data.totalSales = 55;
// 模拟合计总数数据
data.totalCattle = 12580;
data.inTransitCattle = 1250;
data.deliveredCattle = 11330;
// 模拟订单状态数据
data.uncompletedOrders = 28;
data.notArrivedOrders = 28;
data.unsoldOrders = 6;
data.completedOrders = 22;
renderSalesOverview(data);
}
});
};
@@ -353,47 +385,12 @@
fetchSalesOverview();
})
//交通流量
var myChart1 = echarts.init(document.getElementById('main1'));
myChart1.setOption(option1);
//交通工具流量
var myChart2 = echarts.init(document.getElementById('main2'));
myChart2.setOption(option2);
//本月发生事件
var myChart3 = echarts.init(document.getElementById('main3'));
myChart3.setOption(option3);
var myChart31 = echarts.init(document.getElementById('main31'));
myChart31.setOption(option31);
var mySwiper1 = new Swiper('.visual_swiper1', {
autoplay: true,//可选选项,自动滑动
speed:800,//可选选项,滑动速度
autoplay: {
delay: 5000,//1秒切换一次
},
})
//收费站收费排行
var myChart4 = echarts.init(document.getElementById('main4'));
myChart4.setOption(option4);
var myChart41 = echarts.init(document.getElementById('main41'));
myChart41.setOption(option41);
var mySwiper2 = new Swiper('.visual_swiper2', {
autoplay: true,//可选选项,自动滑动
direction : 'vertical',//可选选项,滑动方向
speed:2000,//可选选项,滑动速度
})
//今日实时收费
var myChart5 = echarts.init(document.getElementById('main5'));
myChart5.setOption(option5);
var myChart6 = echarts.init(document.getElementById('main6'));
myChart6.setOption(option6);
var myChart7 = echarts.init(document.getElementById('main7'));
myChart7.setOption(option7);
//中间地图
var myChart8 = echarts.init(document.getElementById('main8'));
myChart8.setOption(option8);
//收费站收费量
var myChart9 = echarts.init(document.getElementById('main9'));
myChart9.setOption(option9);
</script>
</body>
</html>

View File

@@ -88,480 +88,3 @@ option8 = {
data: allData.moveLines
}]
};
//收费站收费量
var geoCoordMap = {
"海门":[121.15,31.89],
"鄂尔多斯":[109.781327,39.608266],
"招远":[120.38,37.35],
"舟山":[122.207216,29.985295],
"齐齐哈尔":[123.97,47.33],
"盐城":[120.13,33.38],
"赤峰":[118.87,42.28],
"青岛":[120.33,36.07],
"乳山":[121.52,36.89],
"金昌":[102.188043,38.520089],
"泉州":[118.58,24.93],
"莱西":[120.53,36.86],
"日照":[119.46,35.42],
"胶南":[119.97,35.88],
"南通":[121.05,32.08],
"拉萨":[91.11,29.97],
"云浮":[112.02,22.93],
"梅州":[116.1,24.55],
"文登":[122.05,37.2],
"上海":[121.48,31.22],
"攀枝花":[101.718637,26.582347],
"威海":[122.1,37.5],
"承德":[117.93,40.97],
"厦门":[118.1,24.46],
"汕尾":[115.375279,22.786211],
"潮州":[116.63,23.68],
"丹东":[124.37,40.13],
"太仓":[121.1,31.45],
"曲靖":[103.79,25.51],
"烟台":[121.39,37.52],
"福州":[119.3,26.08],
"瓦房店":[121.979603,39.627114],
"即墨":[120.45,36.38],
"抚顺":[123.97,41.97],
"玉溪":[102.52,24.35],
"张家口":[114.87,40.82],
"阳泉":[113.57,37.85],
"莱州":[119.942327,37.177017],
"湖州":[120.1,30.86],
"汕头":[116.69,23.39],
"昆山":[120.95,31.39],
"宁波":[121.56,29.86],
"湛江":[110.359377,21.270708],
"揭阳":[116.35,23.55],
"荣成":[122.41,37.16],
"连云港":[119.16,34.59],
"葫芦岛":[120.836932,40.711052],
"常熟":[120.74,31.64],
"东莞":[113.75,23.04],
"河源":[114.68,23.73],
"淮安":[119.15,33.5],
"泰州":[119.9,32.49],
"南宁":[108.33,22.84],
"营口":[122.18,40.65],
"惠州":[114.4,23.09],
"江阴":[120.26,31.91],
"蓬莱":[120.75,37.8],
"韶关":[113.62,24.84],
"嘉峪关":[98.289152,39.77313],
"广州":[113.23,23.16],
"延安":[109.47,36.6],
"太原":[112.53,37.87],
"清远":[113.01,23.7],
"中山":[113.38,22.52],
"昆明":[102.73,25.04],
"寿光":[118.73,36.86],
"盘锦":[122.070714,41.119997],
"长治":[113.08,36.18],
"深圳":[114.07,22.62],
"珠海":[113.52,22.3],
"宿迁":[118.3,33.96],
"咸阳":[108.72,34.36],
"铜川":[109.11,35.09],
"平度":[119.97,36.77],
"佛山":[113.11,23.05],
"海口":[110.35,20.02],
"江门":[113.06,22.61],
"章丘":[117.53,36.72],
"肇庆":[112.44,23.05],
"大连":[121.62,38.92],
"临汾":[111.5,36.08],
"吴江":[120.63,31.16],
"石嘴山":[106.39,39.04],
"沈阳":[123.38,41.8],
"苏州":[120.62,31.32],
"茂名":[110.88,21.68],
"嘉兴":[120.76,30.77],
"长春":[125.35,43.88],
"胶州":[120.03336,36.264622],
"银川":[106.27,38.47],
"张家港":[120.555821,31.875428],
"三门峡":[111.19,34.76],
"锦州":[121.15,41.13],
"南昌":[115.89,28.68],
"柳州":[109.4,24.33],
"三亚":[109.511909,18.252847],
"自贡":[104.778442,29.33903],
"吉林":[126.57,43.87],
"阳江":[111.95,21.85],
"泸州":[105.39,28.91],
"西宁":[101.74,36.56],
"宜宾":[104.56,29.77],
"呼和浩特":[111.65,40.82],
"成都":[104.06,30.67],
"大同":[113.3,40.12],
"镇江":[119.44,32.2],
"桂林":[110.28,25.29],
"张家界":[110.479191,29.117096],
"宜兴":[119.82,31.36],
"北海":[109.12,21.49],
"西安":[108.95,34.27],
"金坛":[119.56,31.74],
"东营":[118.49,37.46],
"牡丹江":[129.58,44.6],
"遵义":[106.9,27.7],
"绍兴":[120.58,30.01],
"扬州":[119.42,32.39],
"常州":[119.95,31.79],
"潍坊":[119.1,36.62],
"重庆":[106.54,29.59],
"台州":[121.420757,28.656386],
"南京":[118.78,32.04],
"滨州":[118.03,37.36],
"贵阳":[106.71,26.57],
"无锡":[120.29,31.59],
"本溪":[123.73,41.3],
"克拉玛依":[84.77,45.59],
"渭南":[109.5,34.52],
"马鞍山":[118.48,31.56],
"宝鸡":[107.15,34.38],
"焦作":[113.21,35.24],
"句容":[119.16,31.95],
"北京":[116.46,39.92],
"徐州":[117.2,34.26],
"衡水":[115.72,37.72],
"包头":[110,40.58],
"绵阳":[104.73,31.48],
"乌鲁木齐":[87.68,43.77],
"枣庄":[117.57,34.86],
"杭州":[120.19,30.26],
"淄博":[118.05,36.78],
"鞍山":[122.85,41.12],
"溧阳":[119.48,31.43],
"库尔勒":[86.06,41.68],
"安阳":[114.35,36.1],
"开封":[114.35,34.79],
"济南":[117,36.65],
"德阳":[104.37,31.13],
"温州":[120.65,28.01],
"九江":[115.97,29.71],
"邯郸":[114.47,36.6],
"临安":[119.72,30.23],
"兰州":[103.73,36.03],
"沧州":[116.83,38.33],
"临沂":[118.35,35.05],
"南充":[106.110698,30.837793],
"天津":[117.2,39.13],
"富阳":[119.95,30.07],
"泰安":[117.13,36.18],
"诸暨":[120.23,29.71],
"郑州":[113.65,34.76],
"哈尔滨":[126.63,45.75],
"聊城":[115.97,36.45],
"芜湖":[118.38,31.33],
"唐山":[118.02,39.63],
"平顶山":[113.29,33.75],
"邢台":[114.48,37.05],
"德州":[116.29,37.45],
"济宁":[116.59,35.38],
"荆州":[112.239741,30.335165],
"宜昌":[111.3,30.7],
"义乌":[120.06,29.32],
"丽水":[119.92,28.45],
"洛阳":[112.44,34.7],
"秦皇岛":[119.57,39.95],
"株洲":[113.16,27.83],
"石家庄":[114.48,38.03],
"莱芜":[117.67,36.19],
"常德":[111.69,29.05],
"保定":[115.48,38.85],
"湘潭":[112.91,27.87],
"金华":[119.64,29.12],
"岳阳":[113.09,29.37],
"长沙":[113,28.21],
"衢州":[118.88,28.97],
"廊坊":[116.7,39.53],
"菏泽":[115.480656,35.23375],
"合肥":[117.27,31.86],
"武汉":[114.31,30.52],
"大庆":[125.03,46.58]
};
var convertData = function (data) {
var res = [];
for (var i = 0; i < data.length; i++) {
var geoCoord = geoCoordMap[data[i].name];
if (geoCoord) {
res.push({
name: data[i].name,
value: geoCoord.concat(data[i].value)
});
}
}
return res;
};
option9 = {
title: {
text: ' ',
sublink: ' ',
x:'center',
textStyle: {
color: '#fff'
}
},
tooltip: {
trigger: 'item',
formatter: function (params) {
return params.name + ' : ' + params.value[2];
}
},
legend: {
orient: 'vertical',
y: 'bottom',
x:'right',
data:['pm2.5'],
textStyle: {
color: '#fff'
}
},
visualMap: {
min: 0,
max: 200,
calculable: true,
color: ['#d94e5d','#eac736','#50a3ba'],
textStyle: {
color: '#fff'
}
},
geo: {
map: 'china',
label: {
emphasis: {
show: false
}
},
itemStyle: {
normal: {
areaColor: 'rgba(127,199,221,0.1)',
borderColor: '#0177ff'
},
emphasis: {
areaColor: '#071537'//鼠标指上市时的颜色
}
}
},
series: [
{
name: ' ',
type: 'scatter',
coordinateSystem: 'geo',
data: convertData([
{name: "海门", value: 9},
{name: "鄂尔多斯", value: 12},
{name: "招远", value: 12},
{name: "舟山", value: 12},
{name: "齐齐哈尔", value: 14},
{name: "盐城", value: 15},
{name: "赤峰", value: 16},
{name: "青岛", value: 18},
{name: "乳山", value: 18},
{name: "金昌", value: 19},
{name: "泉州", value: 21},
{name: "莱西", value: 21},
{name: "日照", value: 21},
{name: "胶南", value: 22},
{name: "南通", value: 23},
{name: "拉萨", value: 24},
{name: "云浮", value: 24},
{name: "梅州", value: 25},
{name: "文登", value: 25},
{name: "上海", value: 25},
{name: "攀枝花", value: 25},
{name: "威海", value: 25},
{name: "承德", value: 25},
{name: "厦门", value: 26},
{name: "汕尾", value: 26},
{name: "潮州", value: 26},
{name: "丹东", value: 27},
{name: "太仓", value: 27},
{name: "曲靖", value: 27},
{name: "烟台", value: 28},
{name: "福州", value: 29},
{name: "瓦房店", value: 30},
{name: "即墨", value: 30},
{name: "抚顺", value: 31},
{name: "玉溪", value: 31},
{name: "张家口", value: 31},
{name: "阳泉", value: 31},
{name: "莱州", value: 32},
{name: "湖州", value: 32},
{name: "汕头", value: 32},
{name: "昆山", value: 33},
{name: "宁波", value: 33},
{name: "湛江", value: 33},
{name: "揭阳", value: 34},
{name: "荣成", value: 34},
{name: "连云港", value: 35},
{name: "葫芦岛", value: 35},
{name: "常熟", value: 36},
{name: "东莞", value: 36},
{name: "河源", value: 36},
{name: "淮安", value: 36},
{name: "泰州", value: 36},
{name: "南宁", value: 37},
{name: "营口", value: 37},
{name: "惠州", value: 37},
{name: "江阴", value: 37},
{name: "蓬莱", value: 37},
{name: "韶关", value: 38},
{name: "嘉峪关", value: 38},
{name: "广州", value: 38},
{name: "延安", value: 38},
{name: "太原", value: 39},
{name: "清远", value: 39},
{name: "中山", value: 39},
{name: "昆明", value: 39},
{name: "寿光", value: 40},
{name: "盘锦", value: 40},
{name: "长治", value: 41},
{name: "深圳", value: 41},
{name: "珠海", value: 42},
{name: "宿迁", value: 43},
{name: "咸阳", value: 43},
{name: "铜川", value: 44},
{name: "平度", value: 44},
{name: "佛山", value: 44},
{name: "海口", value: 44},
{name: "江门", value: 45},
{name: "章丘", value: 45},
{name: "肇庆", value: 46},
{name: "大连", value: 47},
{name: "临汾", value: 47},
{name: "吴江", value: 47},
{name: "石嘴山", value: 49},
{name: "沈阳", value: 50},
{name: "苏州", value: 50},
{name: "茂名", value: 50},
{name: "嘉兴", value: 51},
{name: "长春", value: 51},
{name: "胶州", value: 52},
{name: "银川", value: 52},
{name: "张家港", value: 52},
{name: "三门峡", value: 53},
{name: "锦州", value: 54},
{name: "南昌", value: 54},
{name: "柳州", value: 54},
{name: "三亚", value: 54},
{name: "自贡", value: 56},
{name: "吉林", value: 56},
{name: "阳江", value: 57},
{name: "泸州", value: 57},
{name: "西宁", value: 57},
{name: "宜宾", value: 58},
{name: "呼和浩特", value: 58},
{name: "成都", value: 58},
{name: "大同", value: 58},
{name: "镇江", value: 59},
{name: "桂林", value: 59},
{name: "张家界", value: 59},
{name: "宜兴", value: 59},
{name: "北海", value: 60},
{name: "西安", value: 61},
{name: "金坛", value: 62},
{name: "东营", value: 62},
{name: "牡丹江", value: 63},
{name: "遵义", value: 63},
{name: "绍兴", value: 63},
{name: "扬州", value: 64},
{name: "常州", value: 64},
{name: "潍坊", value: 65},
{name: "重庆", value: 66},
{name: "台州", value: 67},
{name: "南京", value: 67},
{name: "滨州", value: 70},
{name: "贵阳", value: 71},
{name: "无锡", value: 71},
{name: "本溪", value: 71},
{name: "克拉玛依", value: 72},
{name: "渭南", value: 72},
{name: "马鞍山", value: 72},
{name: "宝鸡", value: 72},
{name: "焦作", value: 75},
{name: "句容", value: 75},
{name: "北京", value: 79},
{name: "徐州", value: 79},
{name: "衡水", value: 80},
{name: "包头", value: 80},
{name: "绵阳", value: 80},
{name: "乌鲁木齐", value: 84},
{name: "枣庄", value: 84},
{name: "杭州", value: 84},
{name: "淄博", value: 85},
{name: "鞍山", value: 86},
{name: "溧阳", value: 86},
{name: "库尔勒", value: 86},
{name: "安阳", value: 90},
{name: "开封", value: 90},
{name: "济南", value: 92},
{name: "德阳", value: 93},
{name: "温州", value: 95},
{name: "九江", value: 96},
{name: "邯郸", value: 98},
{name: "临安", value: 99},
{name: "兰州", value: 99},
{name: "沧州", value: 100},
{name: "临沂", value: 103},
{name: "南充", value: 104},
{name: "天津", value: 105},
{name: "富阳", value: 106},
{name: "泰安", value: 112},
{name: "诸暨", value: 112},
{name: "郑州", value: 113},
{name: "哈尔滨", value: 114},
{name: "聊城", value: 116},
{name: "芜湖", value: 117},
{name: "唐山", value: 119},
{name: "平顶山", value: 119},
{name: "邢台", value: 119},
{name: "德州", value: 120},
{name: "济宁", value: 120},
{name: "荆州", value: 127},
{name: "宜昌", value: 130},
{name: "义乌", value: 132},
{name: "丽水", value: 133},
{name: "洛阳", value: 134},
{name: "秦皇岛", value: 136},
{name: "株洲", value: 143},
{name: "石家庄", value: 147},
{name: "莱芜", value: 148},
{name: "常德", value: 152},
{name: "保定", value: 153},
{name: "湘潭", value: 154},
{name: "金华", value: 157},
{name: "岳阳", value: 169},
{name: "长沙", value: 175},
{name: "衢州", value: 177},
{name: "廊坊", value: 193},
{name: "菏泽", value: 194},
{name: "合肥", value: 229},
{name: "武汉", value: 273},
{name: "大庆", value: 279}
]),
symbolSize: 12,
label: {
normal: {
show: false
},
emphasis: {
show: false
}
},
itemStyle: {
emphasis: {
borderColor: '#fff',
borderWidth: 1
}
}
}
]
}
//////////////////////收费站收费量 end

File diff suppressed because it is too large Load Diff

256
datav/monitor.html Normal file
View File

@@ -0,0 +1,256 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>仓库监控</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="https://apps.bdimg.com/libs/bootstrap/3.3.4/css/bootstrap.css">
<style>
body {
background: url(images/data08.png) no-repeat #061537;
background-size: cover;
color: #fff;
font-family: '微软雅黑';
display: flex;
justify-content: flex-start;
align-items: center;
height: 100vh;
margin: 0;
flex-direction: column;
overflow: hidden;
}
.head_top {
position: relative;
text-align: center;
width: 100%;
margin-bottom: 10px;
height: 60px;
flex-shrink: 0;
}
.head_top .head_decor {
display: block;
width: 80%;
margin: 0 auto;
}
.head_logo {
position: absolute;
top: 6px;
left: 50%;
transform: translateX(-50%);
color: #55bfff;
font-size: 35px;
font-weight: 600;
z-index: 10;
text-shadow: 0 0 10px rgba(0, 216, 255, 0.5);
}
.decor_side {
position: absolute;
top: 15px;
width: 45px;
height: auto;
z-index: 11;
opacity: 0.9;
}
.decor_left {
left: 50%;
margin-left: -170px; /* Logo half width ~110px + spacing */
}
.decor_right {
left: 50%;
margin-left: 125px; /* Logo half width ~110px + spacing */
transform: scaleX(-1);
}
.monitor-box {
background: rgba(13, 38, 71, 0.8);
padding: 10px;
border: none;
border-radius: 0;
text-align: center;
box-shadow: none;
width: 100%;
max-width: none;
flex: 1;
display: flex;
flex-direction: column;
box-sizing: border-box;
}
h1 {
color: #00d8ff;
margin-bottom: 10px;
font-size: 20px;
text-align: left;
padding-left: 10px;
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 0;
}
.back-btn {
margin-top: 0;
display: inline-block;
padding: 5px 15px;
background: #0096ff;
color: #fff;
border-radius: 5px;
text-decoration: none;
transition: all 0.3s;
font-size: 14px;
}
.back-btn:hover {
background: #00d8ff;
color: #fff;
text-decoration: none;
}
.camera-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 10px;
margin-top: 0;
flex: 1;
height: 100%;
}
.camera-item {
background: rgba(0, 0, 0, 0.3);
padding: 5px;
border: 1px solid #134572;
border-radius: 4px;
display: flex;
flex-direction: column;
}
.camera-mock {
width: 100%;
flex: 1;
padding-bottom: 0;
background: #000;
display: flex;
justify-content: center;
align-items: center;
border: 1px solid #333;
position: relative;
overflow: hidden;
}
.camera-content {
position: relative;
top: auto;
left: auto;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
}
.camera-label {
color: #aaa;
font-size: 14px;
margin-top: 5px;
text-align: left;
padding-left: 5px;
flex-shrink: 0;
}
.camera-mock::after {
content: 'LIVE';
position: absolute;
top: 10px;
right: 10px;
color: red;
font-size: 12px;
font-weight: bold;
animation: blink 1s infinite;
z-index: 10;
}
@keyframes blink {
50% { opacity: 0; }
}
</style>
</head>
<body>
<div class="head_top">
<img class="head_decor" src="images/header.png" alt="标题装饰">
<img class="decor_side decor_left" src="images/ksh42.png" alt="">
<div class="head_logo">牛只管理系统</div>
<img class="decor_side decor_right" src="images/ksh42.png" alt="">
</div>
<div class="monitor-box">
<h1 id="warehouse-title">
<span>正在连接仓库监控...</span>
<a href="index.html" class="back-btn">返回大屏</a>
</h1>
<div class="camera-grid">
<!-- 摄像头 1 -->
<div class="camera-item">
<div class="camera-mock">
<div class="camera-content">
<span class="glyphicon glyphicon-facetime-video" style="font-size: 30px; color: #333;"></span>
</div>
</div>
<div class="camera-label">大门监控</div>
</div>
<!-- 摄像头 2 -->
<div class="camera-item">
<div class="camera-mock">
<div class="camera-content">
<span class="glyphicon glyphicon-facetime-video" style="font-size: 30px; color: #333;"></span>
</div>
</div>
<div class="camera-label">仓库内景 A区</div>
</div>
<!-- 摄像头 3 -->
<div class="camera-item">
<div class="camera-mock">
<div class="camera-content">
<span class="glyphicon glyphicon-facetime-video" style="font-size: 30px; color: #333;"></span>
</div>
</div>
<div class="camera-label">仓库内景 B区</div>
</div>
<!-- 摄像头 4 -->
<div class="camera-item">
<div class="camera-mock">
<div class="camera-content">
<span class="glyphicon glyphicon-facetime-video" style="font-size: 30px; color: #333;"></span>
</div>
</div>
<div class="camera-label">卸货区</div>
</div>
<!-- 摄像头 5 -->
<div class="camera-item">
<div class="camera-mock">
<div class="camera-content">
<span class="glyphicon glyphicon-facetime-video" style="font-size: 30px; color: #333;"></span>
</div>
</div>
<div class="camera-label">饲料区</div>
</div>
<!-- 摄像头 6 -->
<div class="camera-item">
<div class="camera-mock">
<div class="camera-content">
<span class="glyphicon glyphicon-facetime-video" style="font-size: 30px; color: #333;"></span>
</div>
</div>
<div class="camera-label">通道监控</div>
</div>
</div>
</div>
<script>
// 获取URL参数
function getQueryParam(name) {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get(name);
}
const warehouse = getQueryParam('warehouse');
if (warehouse) {
document.querySelector('#warehouse-title span').textContent = warehouse + ' - 实时监控';
} else {
document.querySelector('#warehouse-title span').textContent = '未指定仓库';
}
</script>
</body>
</html>

View File

@@ -16,6 +16,30 @@ app.use((req, res, next) => {
next();
});
// 专用代理:牛只行情数据 (ad.yunmainiu.com)
// 必须放在通用的 /api 代理之前
app.use('/api/cattle-market-data', createProxyMiddleware({
target: 'https://ad.yunmainiu.com',
changeOrigin: true,
secure: false,
pathRewrite: {
'^/': '/api/cattle-data',
},
onProxyReq: (proxyReq, req, res) => {
console.log(`[牛只行情代理] ${req.method} ${req.url} -> https://ad.yunmainiu.com/api/cattle-data`);
// 伪装请求头,防止被反爬或校验
proxyReq.setHeader('Host', 'ad.yunmainiu.com');
proxyReq.setHeader('Referer', 'https://ad.yunmainiu.com/');
proxyReq.setHeader('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
},
onProxyRes: (proxyRes, req, res) => {
console.log(`[牛只行情代理响应] 状态码: ${proxyRes.statusCode}`);
// 允许跨域:覆盖目标服务器的 CORS 设置
delete proxyRes.headers['access-control-allow-origin'];
proxyRes.headers['Access-Control-Allow-Origin'] = '*';
}
}));
// API 代理:必须在静态文件服务之前,将 /api 请求代理到 cattletrack.aiotagro.com
app.use('/api', createProxyMiddleware({
target: 'https://cattletrack.aiotagro.com',

34
datav/test_api.js Normal file
View File

@@ -0,0 +1,34 @@
const https = require('https');
const options = {
hostname: 'ad.yunmainiu.com',
port: 443,
path: '/api/cattle-data',
method: 'GET',
headers: {
'Host': 'ad.yunmainiu.com',
'Referer': 'https://ad.yunmainiu.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
};
const req = https.request(options, (res) => {
console.log('StatusCode:', res.statusCode);
console.log('Headers:', res.headers);
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Body Length:', data.length);
console.log('Body Preview:', data.substring(0, 500));
});
});
req.on('error', (e) => {
console.error(e);
});
req.end();

19
datav/test_proxy.js Normal file
View File

@@ -0,0 +1,19 @@
const http = require('http');
http.get('http://127.0.0.1:8081/api/cattle-market-data', (res) => {
console.log('StatusCode:', res.statusCode);
console.log('Headers:', res.headers);
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Body Length:', data.length);
console.log('Body Preview:', data.substring(0, 500));
});
}).on('error', (e) => {
console.error(e);
});

46
readme.md Normal file
View File

@@ -0,0 +1,46 @@
# 牛只运输项目
## 项目简介
本项目是一个牛只运输管理系统,旨在提供全方位的牛只运输监控和管理功能。
## 项目结构
- `docs`: 文档目录
- `admin-system`: 管理后台目录
- `mini-program`: 小程序APP目录
- `backend`: 后端服务目录
- `website`: 官网目录
- `scripts`: 脚本目录
## 文档索引
请参考 `docs` 目录下的详细文档:
### 需求文档
- [整个项目需求文档](docs/整个项目需求文档.md)
- [官网需求文档](docs/官网需求文档.md)
- [后端管理需求文档](docs/后端管理需求文档.md)
- [管理后台需求文档](docs/管理后台需求文档.md)
- [小程序APP需求文档](docs/小程序app需求文档.md)
### 架构文档
- [整个项目的架构文档](docs/整个项目的架构文档.md)
- [后端架构文档](docs/后端架构文档.md)
- [小程序架构文档](docs/小程序架构文档.md)
- [管理后台架构文档](docs/管理后台架构文档.md)
### 详细设计文档
- [数据库设计文档](docs/数据库设计文档.md)
- [管理后台接口设计文档](docs/管理后台接口设计文档.md)
- [小程序APP接口设计文档](docs/小程序app接口设计文档.md)
### 开发文档
- [后端开发文档](docs/后端开发文档.md)
- [小程序APP开发文档](docs/小程序app开发文档.md)
- [管理后台开发文档](docs/管理后台开发文档.md)
- [后端管理开发文档](docs/后端管理开发文档.md)
### 其他文档
- [测试文档](docs/测试文档.md)
- [部署文档](docs/部署文档.md)
- [运维文档](docs/运维文档.md)
- [安全文档](docs/安全文档.md)
- [用户手册文档](docs/用户手册文档.md)