yxk_pc_mdh/src/pages/independent/kanban8.vue

1053 lines
29 KiB
Vue
Raw Normal View History

2025-09-03 14:12:15 +08:00
<!--生产运营驾驶舱-->
<template>
<div class="home">
<dv-border-box-1>
<div class="head_title">数字化设备监控大屏</div>
<div class="time2">
<div>{{ date }}</div>
<div style="margin-left: 12px;">{{ time }}</div>
</div>
<!-- <img :src="logoUrl?logoUrl:logoUrlDefault" v-if="logoUrlFlag" class='logo_kanban'> -->
<!-- <div class="time">星期{{weekday}}</div> -->
<!-- <div class="date">
<div>{{date}}</div>
<div>星期{{weekday}}</div>
</div> -->
<div class="main">
<div
:class="is_first ? 'main_pre' : 'main_pre main_pre_light'"
@click="to_pre"
></div>
<div
class="main_center"
v-loading="loading"
element-loading-background="rgba(0, 0, 0, 0.4)"
>
<div class="main_item" v-for="(items, index) in dataList">
<dv-border-box-13 backgroundColor="rgba(11, 21, 44, 0.8)">
<div class="item_top">
<div class="item_top_left">
<div>{{ items.deviceName }}</div>
<!-- <div>{{items.deviceCode}}</div> -->
</div>
<!-- :class="items.statusName == '开机' ? 'work_bg' : 'close_bg'" -->
<div class="item_top_left item_top_right">
<div class="item_top_right_div">
<div
style="width:80%;text-align: center;"
:class="items.status == '开机' ? 'work_bg' : 'close_bg'"
>
{{ items.status }}
</div>
</div>
<!-- <div class="item_top_right_div">
<el-tooltip class="item" effect="light" content="点击可查询设备一周产能分析" placement="top-start">
<div @click="deviceCapacity(items)">产能分析</div>
</el-tooltip>
</div> -->
</div>
</div>
<div class="item_center">
<!-- <div style="font-size: 35px;text-align: center;">
{{ items.kaitong ? items.kaitong : 0 }}%
</div> -->
<div
style="width:100%;height:100%;display: flex;flex-direction:column; justify-content: center;align-items: center;"
>
<el-progress
width="95"
text-color="#fff"
type="circle"
:stroke-width="8"
:percentage="items.ktl ? items.ktl : 0"
></el-progress>
<div
style="font-size: 12px;text-align: center;position: absolute;top:57%"
>
开通率
</div>
<div style="font-size: 12px;text-align: center;"></div>
</div>
<!-- <div class="item_center_item">设备状态<span>{{items.statusName}}</span></div> -->
<!-- <div class="item_center_item">今日产量<span>{{items.outPut}}</span></div> -->
<!-- <div class="item_center_item">在制工单<span>{{items.workOrder}}</span></div> -->
<!-- <div class="item_center_item">产品名称<span>{{items.materielName}}</span></div>
<div class="item_center_item">规格型号<span>{{items.specification}}</span></div>
<div class="item_center_item">计划数量<span>{{items.planCount}}</span></div> -->
<!-- <div v-for="(items2,index2) in items.pointList">
<div :class="['item_status',items2.value==1?'item_status_green':'item_status_red']" v-if="items2.pointName.includes('开关机') || items2.pointName.includes('开机')"></div>
</div> -->
<!-- <div v-for="(items2,index2) in items.pointList">
<div class="item_status_green" v-if="(items2.pointName.includes('开关机') || items2.pointName.includes('开机')) && items2.value==1"></div>
<div class="item_status_red" v-if="(items2.pointName.includes('开关机') || items2.pointName.includes('开机')) && items2.value==0"></div>
</div> -->
</div>
<div class="item_bottom">
<div class="item_table">
<!-- <div class="item_table_item">
<div>测点</div>
<div>计量单位</div>
<div>数值</div>
</div> -->
<div
class="item_table_item"
v-for="(items2, index2) in pointInfoList"
>
<!-- <div class="item_status item_status_yellow" v-if="items2.pointName=='开关机'"></div>
<div class="item_status item_status_red" v-if="items2.pointName=='停机'"></div> -->
<div>{{ items2.pointName }}</div>
<div>{{ items[items2.pointKey] }}</div>
<div>{{ items2.unitUomName }}</div>
</div>
</div>
</div>
</dv-border-box-13>
</div>
</div>
<div
:class="is_last ? 'main_next' : 'main_next main_next_light'"
@click="to_next"
></div>
</div>
<footer></footer>
<!--产能分析-->
<el-dialog
v-dialogDrag
center
:title="dialog_title"
:visible.sync="innerVisible"
width="900px"
>
<div class="chart_container"></div>
<div class="charts_footer">
<el-button type="primary" size="small" @click="innerVisible = false"
>关闭</el-button
>
</div>
</el-dialog>
</dv-border-box-1>
</div>
</template>
<script>
import echarts from "echarts";
import Auth from "@/utils/auth";
import Cookies from "js-cookie";
import { mapState } from "vuex";
import jsCookie from "js-cookie";
var websocket = null;
//监听窗口关闭事件当窗口关闭时主动去关闭websocket连接防止连接还没断开就关闭窗口server端会抛异常。
window.onbeforeunload = function() {
if (websocket) {
websocket.close();
}
};
window.addEventListener("resize", function() {
// location.reload();
});
export default {
name: "kanban",
data() {
return {
config: {
value: 66
},
timer_list: "",
loading: true,
first_in: true, //第一次进入页面
dialog_title: "",
innerVisible: false,
dataList: [],
totalPages: 0, //总页数
search_data: {
pageno: 1,
pagesize: 10
},
is_first: true,
is_last: true,
date: "",
time: "",
weekday: "",
flag: false,
showLogo: false,
logoUrlDefault: require("../../assets/logo.png"),
logoUrlSubei: require("../../assets/logo_sbly.png"),
interval_time: "10000",
websoketData: [],
pointInfoList: [
{
pointName: "每日产量",
pointKey: "mrcl",
value: 0,
unitUomName: "米"
},
{
pointName: "今日开机时间",
pointKey: "jrkjsjString",
value: 0,
unitUomName: ""
},
{
pointName: "累计米数",
pointKey: "ljms",
value: 0,
unitUomName: "米"
},
{
pointName: "今日电量",
pointKey: "jrdl",
value: 0,
unitUomName: "度"
},
{
pointName: "累计运行时长",
pointKey: "ljyxsc",
value: 0,
unitUomName: "Min"
}
]
};
},
components: {},
computed: {
...mapState({
logoUrl: state => state.common.logoUrl,
logoUrlFlag: state => state.common.logoUrlFlag
})
},
activated() {
if (this.dataList.length > 0) {
this.openWebsoket();
this.onmessageWebsoket();
} else {
this.first_in = true;
}
},
beforeRouteLeave(to, from, next) {
this.closeWebSocket();
next();
},
mounted() {
let allWidth = document.documentElement.clientWidth; //1440
let allHeight = document.documentElement.clientHeight; //714
if (this.$route.query.deptId) {
this.$set(this.search_data, "deptId", this.$route.query.deptId);
}
this.getLogo();
this.getTime();
let this_ = this;
setInterval(function() {
this_.getTime();
}, 1000);
this.getList();
//定时刷新数据
// setInterval(function() {
// if (this_.is_last) {
// this_.to_pre();
// } else {
// this_.to_next();
// }
// }, 30000);
},
watch: {
websoketData: {
handler: function(newVal, oldVal) {
if (newVal[0] == "{") {
if (JSON.parse(newVal).datas && this.dataList.length > 0) {
this.changeValue();
}
}
},
deep: true
},
$route: "fetchData"
},
methods: {
getLogo() {
this.$api.fileAPI.getLogo().then(res => {
if (res.code == 0 && res.logoUrl == "sbly") {
this.flag = true;
}
this.showLogo = true;
});
},
//关闭连接
closeWebSocket() {
websocket.close();
},
//连接成功建立的回调方法
openWebsoket() {
if (websocket) {
websocket.close();
}
let href = window.location.href;
let wsHref = href.split("//")[1].split(":")[0];
let port = JSON.parse(Cookies.get("userInfo")).port;
let url = JSON.parse(Cookies.get("userInfo")).mqttUrl;
let ws = "ws://" + url + "/cusWebSocket/" + Auth.hasToken();
// let ws="ws://"+wsHref+":"+port+"/cusWebSocket/"+Auth.hasToken()
//判断当前浏览器是否支持WebSocket
if ("WebSocket" in window) {
//连接WebSocket节点
// websocket = new WebSocket("ws://192.168.1.50:8888/cusWebSocket/"+Auth.hasToken());
websocket = new WebSocket(ws);
} else {
alert("Not support websocket");
}
websocket.onopen = function(event) {};
},
//接收到消息的回调方法
onmessageWebsoket() {
let _this = this;
websocket.onmessage = function(event) {
_this.websoketData = event.data;
};
},
changeValue() {
if (this.websoketData[0] == "{") {
let websoketArr = JSON.parse(this.websoketData).datas;
for (let n = 0; n < this.dataList.length; n++) {
let pointData = this.dataList[n].pointList;
if (pointData) {
for (let i = 0; i < pointData.length; i++) {
let flag = true;
for (let j = 0; j < websoketArr.length; j++) {
if (pointData[i].pointId == websoketArr[j].pointId) {
flag = false;
this.$set(pointData[i], "value", websoketArr[j].value);
}
}
}
}
}
}
},
//上一页
to_pre() {
if (this.search_data.pageno == 1) {
return;
}
this.search_data.pageno = this.search_data.pageno - 1;
this.first_in = true;
this.getList();
},
//下一页
to_next() {
if (this.search_data.pageno == this.totalPages) {
return;
}
this.search_data.pageno = this.search_data.pageno + 1;
this.first_in = true;
this.getList();
},
//工单查询-跳转派工记录
to_dispatch(items) {
window.open(
"/#/jobShop/dispatch?deviceName=" +
encodeURIComponent(items.deviceName) +
"&deviceId=" +
items.deviceId +
"&t=" +
Date.now()
);
},
getList() {
console.log("进来了");
this.$api.yxkAPI
.yxkPost("/apis/hl/kanban/kanbanTwo", this.search_data)
.then(res => {
// this.$api.kanbanAPI.ManageKanbanAllDevice(this.search_data).then(res => {
this.loading = false;
let _this = this;
clearTimeout(_this.timer_list);
_this.timer_list = setTimeout(function() {
_this.getList();
}, _this.interval_time);
if (res.code === 0) {
// if (this.first_in) {
this.dataList = res.data.records ? res.data.records : [];
this.first_in = false;
// this.openWebsoket();
// this.onmessageWebsoket();
// } else {
// let dataList = res.data.records ? res.data.records : [];
// for (let i = 0; i < this.dataList.length; i++) {
// for (let j = 0; j < dataList.length; j++) {
// if (this.dataList[i].deviceId == dataList[j].deviceId) {
// this.$set(
// this.dataList[i],
// "deviceCode",
// dataList[j].deviceCode
// );
// this.$set(
// this.dataList[i],
// "deviceName",
// dataList[j].deviceName
// );
// this.$set(
// this.dataList[i],
// "statusName",
// dataList[j].statusName
// );
// this.$set(this.dataList[i], "outPut", dataList[j].outPut);
// this.$set(
// this.dataList[i],
// "workOrder",
// dataList[j].workOrder
// );
// this.$set(
// this.dataList[i],
// "materielName",
// dataList[j].materielName
// );
// this.$set(
// this.dataList[i],
// "specification",
// dataList[j].specification
// );
// this.$set(
// this.dataList[i],
// "planCount",
// dataList[j].planCount
// );
// }
// }
// }
// }
// this.dataList.forEach(item => {
// if (!!item.pointList && item.pointList.length > 0) {
// item.statusName = "开机";
// }
// });
// let listData = JSON.parse(JSON.stringify(this.dataList));
// listData.map(item => {
// let list = JSON.parse(JSON.stringify(item.pointList));
// let realList = [];
// if (item.statusName == "开机") {
// item.kaitong = Math.floor(Math.random() * (95 - 60 + 1)) + 60;
// realList.push({
// pointName: "每日产量",
// unitUomName: "个",
// value: item.outPut
// });
// realList.push({
// pointName: "今日开机时间",
// unitUomName: "",
// value:
// "7:" +
// Math.floor(Math.random() * 59) +
// ":" +
// Math.floor(Math.random() * 59)
// });
// }
// list.map((v, idx) => {
// // if(idx==1){
// // v.pointName = '实际电压'
// // realList.push(v)
// // }
// if (v.pointName == "运转时间") {
// v.pointName = "累计运行时长";
// realList.push(v);
// }
// });
// list.map((v, idx) => {
// if (v.pointName == "电压") {
// v.pointName = "实际电压";
// realList.push(v);
// }
// });
// item.pointList = [...JSON.parse(JSON.stringify(realList))];
// console.log(realList, "====realList=====");
// });
// this.dataList = [...listData];
// this.changeValue();
this.totalPages = res.data.pages ? res.data.pages : 0;
if (this.search_data.pageno > 1) {
this.is_first = false;
} else {
this.is_first = true;
}
if (this.search_data.pageno == res.data.pages) {
this.is_last = true;
} else {
this.is_last = false;
}
}
});
},
//产能分析
deviceCapacity(items) {
this.innerVisible = true;
this.dialog_title = items.deviceName + "产能分析";
this.$nextTick(function() {
var myChart = echarts.init(document.querySelector(".chart_container"));
var option;
this.$api.kanbanAPI
.ManageKanbanDeviceCapacityAnalysis(items.deviceId)
.then(res => {
if (res.code === 0) {
let xAxis = [];
let yAxis1 = [];
let yAxis2 = [];
// res.data = {
// "2020-08-10": {"actualCapacity": 10, "rate": "10", "totalCapacity": 20},
// "2020-08-11": {"actualCapacity": 20, "rate": "20", "totalCapacity": 20},
// "2020-08-12": {"actualCapacity": 10, "rate": 0, "totalCapacity": 30},
// "2020-08-13": {"actualCapacity": 10, "rate": 0, "totalCapacity": 40},
// "2020-08-14": {"actualCapacity": 10, "rate": 0, "totalCapacity": 20},
// "2020-08-15": {"actualCapacity": 30, "rate": 0, "totalCapacity": 20},
// "2020-08-16": {"actualCapacity": 40, "rate": 0, "totalCapacity": 20}
// }
if (res.data) {
for (let n in res.data) {
xAxis.push(n);
if (res.data[n].actualCapacity <= res.data[n].totalCapacity) {
//实际未超出总的,超出部分灰色显示
yAxis1.push(res.data[n].actualCapacity);
yAxis2.push({
value:
res.data[n].totalCapacity - res.data[n].actualCapacity,
rate: res.data[n].rate + "%",
is_red: false
});
} else {
//实际超出总的,超出部分红色显示
yAxis1.push(res.data[n].totalCapacity);
yAxis2.push({
value:
res.data[n].actualCapacity - res.data[n].totalCapacity,
rate: res.data[n].rate + "%",
is_red: true
});
}
}
}
option.xAxis.data = xAxis;
option.series[0].data = yAxis1;
option.series[1].data = yAxis2;
myChart.setOption(option, true);
}
});
option = {
title: {
text: "",
left: "center"
},
tooltip: {
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow" // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function(val) {
if (val[1].data.is_red) {
let actualCapacity = val[0].value + val[1].value;
let totalCapacity = val[0].value;
return (
val[0].name +
"<br>" +
"实际产能:" +
actualCapacity +
"<br>" +
"总产能:" +
totalCapacity
);
} else {
let actualCapacity = val[0].value;
let totalCapacity = val[1].value + val[0].value;
return (
val[0].name +
"<br>" +
"实际产能:" +
actualCapacity +
"<br>" +
"总产能:" +
totalCapacity
);
}
}
},
xAxis: {
name: "日期",
type: "category",
// boundaryGap: false,
data: [],
axisLabel: {
interval: 0,
rotate: 30
}
},
yAxis: [
{
name: "设备产能(工时)",
type: "value"
}
],
grid: {
left: "40",
bottom: "10",
top: "40",
right: "15",
containLabel: true
},
series: [
{
// data: [100, 250, 180, 450, 300, 150, 250,400,160],//实际
data: [], //实际
type: "bar",
stack: "产能",
barWidth: 30, //柱图宽度
itemStyle: {
color: function(paras) {
return "#20a267";
}
}
},
{
name: "",
type: "bar",
stack: "产能",
barWidth: 30, //柱图宽度
itemStyle: {
normal: {
color: function(paras) {
if (paras.data.is_red) {
return "#df5c53";
} else {
return "#dfdfdf";
}
},
label: {
show: true, //开启显示
position: "top", //在上方显示
formatter: function(val) {
return val.data.rate;
// if (val.value !== 0) {
// return val.value+'%';
// } else {
// return '';
// }
},
textStyle: {
//数值样式
color: "#1a1a1a",
fontSize: 12
}
}
}
},
// data: [80, 80, 90, 60, 70, 50, 50,80,80]//总的减去实际
data: [] //总的减去实际
}
]
};
});
},
formatDate(n) {
if (n.toString().length == 1) {
return "0" + n;
} else {
return n;
}
},
getTime() {
let datatime = new Date();
this.date =
datatime.getFullYear() +
"-" +
this.formatDate(datatime.getMonth() + 1) +
"-" +
this.formatDate(datatime.getDate());
this.time =
this.formatDate(datatime.getHours()) +
":" +
this.formatDate(datatime.getMinutes()) +
":" +
this.formatDate(datatime.getSeconds());
let a = ["日", "一", "二", "三", "四", "五", "六"];
this.weekday = a[datatime.getDay()];
}
}
};
</script>
<style>
.error-page {
height: 100%;
}
</style>
<style scoped>
.logo_kanban {
width: 120px;
height: 29px;
position: absolute;
left: 20px;
top: 20px;
}
.home {
position: relative;
width: 100%;
min-width: 1200px;
background-color: #062a5d;
/* background-image: url("../../assets/back.png");
background-size: cover; */
min-height: 600px;
height: 100%;
}
.head_title {
position: relative;
height: 80px;
line-height: 80px;
color: #fff;
font-size: 20px;
font-weight: 900;
width: 1115px;
text-align: center;
/* background-image: url("../../assets/head8.png");
background-repeat: no-repeat;
background-size: contain; */
margin: auto;
}
.main {
position: absolute;
top: 80px;
width: 100%;
box-sizing: border-box;
margin: auto;
bottom: 25px;
left: 0;
right: 0;
display: flex;
justify-content: center;
flex-wrap: wrap;
}
.main_pre,
.main_next {
position: absolute;
width: 25px;
height: 100%;
left: 15px;
top: 0;
background-image: url("../../assets/kanban8_pre0.png");
background-position: center;
background-size: contain;
background-repeat: no-repeat;
}
.main_next {
background-image: url("../../assets/kanban8_next0.png");
right: 15px;
left: auto;
}
.main_pre_light {
cursor: pointer;
background-image: url("../../assets/kanban8_pre1.png");
}
.main_next_light {
cursor: pointer;
background-image: url("../../assets/kanban8_next1.png");
}
.main_center {
position: absolute;
left: 50px;
right: 50px;
top: 0;
bottom: 0;
overflow: hidden;
}
.main_item {
position: relative;
float: left;
margin: 5px;
border-radius: 5px;
/* border: 1px solid #0d7cd7; */
/* background-color: rgba(11, 21, 44, 0.8); */
width: calc((100% - 50px) / 5);
height: calc((100% - 20px) / 2);
box-sizing: border-box;
}
.item_top {
position: relative;
top: 15px;
width: 100%;
height: 40px;
margin-bottom: 5px;
color: #fff;
/* background-image: url("../../assets/device_kanban_icon.png"); */
background-size: cover;
background-position: center;
background-repeat: no-repeat;
}
.work_bg {
background-color: #2fab62 !important;
}
.close_bg {
background-color: #909399 !important;
}
.danger_bg {
background-color: #f56c6c !important;
}
.item_top_left {
position: relative;
width: calc(100% - 80px);
font-size: 15px;
color: #fff;
padding-top: 4px;
box-sizing: border-box;
float: left;
/* background-color: #95f204; */
}
.item_top_left div {
width: 100%;
height: 20px;
line-height: 20px;
padding-left: 15px;
box-sizing: border-box;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: #fff;
}
.item_top_right {
float: right;
text-align: right;
padding-left: 0;
padding-right: 15px;
color: #fff;
font-size: 14px;
width: 80px;
box-sizing: border-box;
}
.item_top_right_div,
.item_top_right div {
cursor: pointer;
padding-left: 0 !important;
}
.item_top_right_div:hover {
color: #134363;
}
.item_center {
position: relative;
width: 100%;
height: 30%;
font-size: 13px;
color: #e2e2e2;
}
.item_center_item {
position: relative;
color: #fff;
padding-left: 10px;
box-sizing: border-box;
display: flex;
align-items: center;
height: calc(100% / 6);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.item_center_item span {
margin-left: 10px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.item_bottom {
position: relative;
width: calc(100% - 16px);
margin: auto;
height: 70%;
font-size: 13px;
color: #e2e2e2;
margin-top: 10px;
}
.item_bottom:before {
position: absolute;
content: "";
width: 100%;
left: 0;
height: 1px;
background-color: #e2e2e2;
top: -5px;
}
.item_table {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.item_table_item {
position: relative;
display: flex;
justify-content: space-around;
width: 100%;
align-items: center;
}
.item_table_item div {
width: 40%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
text-align: center;
}
.item_table_item div:nth-child(1) {
text-align: left;
width: 40%;
}
.item_table_item div:nth-child(3) {
text-align: right;
width: 20%;
}
.item_status {
position: absolute;
width: 30px;
height: 30px;
border-radius: 40px;
background-color: #ffffff;
right: 5px;
top: 0px;
}
.item_status_red {
background-color: #e52929;
box-shadow: 1px 1px 2px rgba(229, 41, 41, 0.5),
-1px -1px 2px rgba(229, 41, 41, 0.5), -1px 1px 2px rgba(229, 41, 41, 0.5),
1px -1px 2px rgba(229, 41, 41, 0.5);
}
.item_status_green {
background-color: #3bffc4;
box-shadow: 1px 1px 2px rgba(59, 255, 196, 0.5),
-1px -1px 2px rgba(59, 255, 196, 0.5), -1px 1px 2px rgba(59, 255, 196, 0.5),
1px -1px 2px rgba(59, 255, 196, 0.5);
}
.item_status_yellow {
background-color: #ffd96a;
box-shadow: 1px 1px 2px rgba(255, 217, 106, 0.5),
-1px -1px 2px rgba(255, 217, 106, 0.5),
-1px 1px 2px rgba(255, 217, 106, 0.5), 1px -1px 2px rgba(255, 217, 106, 0.5);
}
.time {
font-family: "黑体";
position: absolute;
right: 30px;
top: 30px;
color: #fff;
font-size: 16px;
transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
}
.time2 {
display: flex;
font-family: "黑体";
position: absolute;
left: 30px;
top: 30px;
color: #fff;
font-size: 20px;
transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
}
.date {
font-family: "黑体";
position: absolute;
right: 50px;
top: 15px;
font-size: 18px;
color: #fff;
text-align: center;
transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
}
footer {
position: absolute;
left: 0px;
right: 0px;
bottom: 0px;
text-align: center;
padding: 2px 0px;
/* background: rgb(247, 247, 247); */
font-size: 12px;
color: #fff;
}
.chart_container {
position: relative;
width: 700px;
height: 400px;
margin: auto;
}
.charts_footer {
position: relative;
display: flex;
align-items: center;
width: 100%;
justify-content: center;
margin-top: 15px;
}
footer span {
padding: 0px 20px;
}
footer span a {
color: #fff;
}
@media (max-width: 1600px) {
}
@media (min-width: 1600px) {
footer {
font-size: 18px;
}
.item_bottom,
.item_center {
font-size: 17px;
}
}
</style>