Browse Source

完善气象预警

wangqin
zhangzhang 7 months ago
parent
commit
529531b079
  1. 9
      ruoyi-ui/src/api/MonthlyEquipment/index.js
  2. 8
      ruoyi-ui/src/api/perception/meteorologyCheck.js
  3. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/DialogVisible/index.vue
  4. 13
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/onLineBarCharts/index.vue
  5. 16
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/index.vue
  6. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/TemperatureTrend/index.vue
  7. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/visibilityTrends/assets/charts.js
  8. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/visibilityTrends/index.vue
  9. 46
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/weaterData/index.vue
  10. 217
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherWarning/components/infowWarningList/index.vue

9
ruoyi-ui/src/api/MonthlyEquipment/index.js

@ -55,10 +55,17 @@ export function getSystemStatusExport(query) {
} }
// 拖拽排序 // 拖拽排序
export function getStatusRule(rule) { export function getStatusRule(rule) {
return request({ return request({
url: "/system/status/rule?rule=" + rule, url: "/system/status/rule?rule=" + rule,
method: "get", method: "get",
}); });
} }
// 拖拽排序
export function getStatusSection() {
return request({
url: "/system/status/section",
method: "get",
});
}

8
ruoyi-ui/src/api/perception/meteorologyCheck.js

@ -55,3 +55,11 @@ export function getIdDevices(id) {
method: "get", method: "get",
}); });
} }
// 查询气象预警筛选类别
export function getListVisibility() {
return request({
url: "/dc/system/meteorologicalDetector/listVisibility",
method: "get",
});
}

4
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/DialogVisible/index.vue

@ -134,12 +134,12 @@ export default {
chemicalsStatus: "", chemicalsStatus: "",
fireStatus: "", fireStatus: "",
}, },
fromDept: "济青济南运管中心", fromDept: "齐鲁高速股份有限公司",
createTime: "2024年04月24日17时22分", createTime: "2024年04月24日17时22分",
title: "关于G20青银高速K305+208交通事故的续报1", title: "关于G20青银高速K305+208交通事故的续报1",
toDept: "智慧管理中心", toDept: "智慧管理中心",
content: "路管等单位及清障救援车辆已到达现场。预计结束时间为12时44分。", content: "路管等单位及清障救援车辆已到达现场。预计结束时间为12时44分。",
createName: "智慧高速菜单", createName: "张三",
phoneNumber: "18678866677", phoneNumber: "18678866677",
issued: "康传刚", issued: "康传刚",
// submitting: false, // submitting: false,

13
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/onLineBarCharts/index.vue

@ -40,11 +40,14 @@ export default {
} }
let xData = []; let xData = [];
let valueData = []; let valueData = [];
console.log("newD", newD); for (let key in newD) {
newD.forEach((element) => { xData.push(key);
xData.push(element.title); valueData.push(newD[key].sucessRate.replace("%", ""));
valueData.push(+element.pctOnl.replace("%", "")); }
}); // newD.forEach((element) => {
// xData.push(element.title);
// valueData.push(+element.pctOnl.replace("%", ""));
// });
// newD.forEach((element) => { // newD.forEach((element) => {
// value.push(+element.pctOnl.replace("%", "")); // value.push(+element.pctOnl.replace("%", ""));
// indicator.push({ name: element.title, max: 100 }); // indicator.push({ name: element.title, max: 100 });

16
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/index.vue

@ -8,7 +8,7 @@
></DeviceSummary> ></DeviceSummary>
<div class="bottomTabs"> <div class="bottomTabs">
<DeviceUptime :dataList="equipments" class="tabs-lo" /> <DeviceUptime :dataList="equipments" class="tabs-lo" />
<OnLineBarCharts :dataList="equipments" class="tabs-mo" /> <OnLineBarCharts :dataList="sectionData" class="tabs-mo" />
<!-- <MonthlyEquipment class="tabs-mo" :dataList="equipments" /> --> <!-- <MonthlyEquipment class="tabs-mo" :dataList="equipments" /> -->
</div> </div>
</el-tab-pane> </el-tab-pane>
@ -128,6 +128,7 @@ import {
getSystemStatusTabList, getSystemStatusTabList,
getSystemStatusType, getSystemStatusType,
getSystemStatusExport, getSystemStatusExport,
getStatusSection,
} from "@/api/MonthlyEquipment"; } from "@/api/MonthlyEquipment";
// import { download } from "../../../../../utils/request.js"; // import { download } from "../../../../../utils/request.js";
import Pagination from "@screen/components/Pagination.vue"; import Pagination from "@screen/components/Pagination.vue";
@ -182,6 +183,7 @@ export default {
activeName: "first", activeName: "first",
tableData: [], tableData: [],
interval: null, interval: null,
sectionData: [],
}; };
}, },
provide() { provide() {
@ -193,6 +195,11 @@ export default {
clearInterval(this.interval); clearInterval(this.interval);
}, },
methods: { methods: {
getSection() {
getStatusSection().then((res) => {
this.sectionData = res.data;
});
},
handleSizeChange(size) { handleSizeChange(size) {
this.pageSize = size; this.pageSize = size;
this.initData(); this.initData();
@ -242,7 +249,6 @@ export default {
this.initQueryTable(1); this.initQueryTable(1);
}, },
handleSearch(data) { handleSearch(data) {
console.log(777, data);
this.typeQuery = data.type; this.typeQuery = data.type;
this.startTime = moment(data.time[0]).format("YYYY-MM-DD HH:mm:ss"); this.startTime = moment(data.time[0]).format("YYYY-MM-DD HH:mm:ss");
this.time = moment(data.time[1]).format("YYYY-MM-DD HH:mm:ss"); this.time = moment(data.time[1]).format("YYYY-MM-DD HH:mm:ss");
@ -273,7 +279,6 @@ export default {
type: this.typeQuery, type: this.typeQuery,
}) })
.then((res) => { .then((res) => {
console.log(res);
const url = window.URL.createObjectURL(new Blob([res])); const url = window.URL.createObjectURL(new Blob([res]));
let link = document.createElement("a"); let link = document.createElement("a");
link.style.display = "none"; link.style.display = "none";
@ -312,7 +317,6 @@ export default {
getSystemStatusType().then((res) => { getSystemStatusType().then((res) => {
let allList = []; let allList = [];
let sort = res.data["排序规则"].rule.split(","); let sort = res.data["排序规则"].rule.split(",");
console.log("sort", sort);
sort.forEach((i) => { sort.forEach((i) => {
for (let key in res.data) { for (let key in res.data) {
let val = res.data[key]; let val = res.data[key];
@ -365,9 +369,6 @@ export default {
type: this.typeQuery, type: this.typeQuery,
}).then((res) => { }).then((res) => {
if (res.code == 200) { if (res.code == 200) {
console.log("res.data", res.data);
// if (res.data && Object.keys(res.data).length > 0) {
console.log("res.data", res.data);
this.setStatus("01", "finish"); this.setStatus("01", "finish");
let origin = res.data; let origin = res.data;
let startStamp = +moment(this.startTime).startOf("day").format("x"); let startStamp = +moment(this.startTime).startOf("day").format("x");
@ -429,6 +430,7 @@ export default {
}, },
async mounted() { async mounted() {
await this.initData(); await this.initData();
this.getSection();
}, },
}; };
</script> </script>

6
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/TemperatureTrend/index.vue

@ -30,10 +30,14 @@ export default {
data: { data: {
handler(data) { handler(data) {
let newData = []; let newData = [];
// let xData = [];
console.log("data77777", data);
data.forEach((item) => { data.forEach((item) => {
newData.push(item.avgVisibility); newData.push(item.avgTemperature);
// xData.push(item.timeSlot);
}); });
temperatureCharts.series[0].data = newData; temperatureCharts.series[0].data = newData;
// temperatureCharts.xAxis.data = newData;
this.myChart.setOption(temperatureCharts); this.myChart.setOption(temperatureCharts);
}, },
deep: true, deep: true,

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/visibilityTrends/assets/charts.js

@ -5,7 +5,7 @@ var options = {
show: true, show: true,
trigger: "axis", trigger: "axis",
valueFormatter: function (value) { valueFormatter: function (value) {
return value + " M"; return value + " km";
}, },
}, },
grid: { grid: {

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/visibilityTrends/index.vue

@ -26,7 +26,7 @@ export default {
handler(data) { handler(data) {
let newData = []; let newData = [];
data.forEach((item) => { data.forEach((item) => {
newData.push(item.avgTemperature); newData.push(item.avgVisibility);
}); });
visibilityCharts.series[0].data = newData; visibilityCharts.series[0].data = newData;
this.myChart.setOption(visibilityCharts); this.myChart.setOption(visibilityCharts);

46
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/weaterData/index.vue

@ -28,11 +28,17 @@
}}</span> }}</span>
</div> </div>
<div class="item"> <div class="item">
<span class="label">能见度</span> <span class="label">能见度等级</span>
<span class="text">{{ <span class="text">{{
data.visibilityType ? data.visibilityType + "级" : "-" data.visibilityType ? data.visibilityType + "级" : "-"
}}</span> }}</span>
</div> </div>
<div class="item">
<span class="label">能见度</span>
<span class="text">{{
data.visibility ? data.visibility + "km" : "-"
}}</span>
</div>
<!-- <div class="item"> <!-- <div class="item">
<span class="label">能见度类型</span> <span class="label">能见度类型</span>
<span class="text">{{ data.visibilityType }}</span> <span class="text">{{ data.visibilityType }}</span>
@ -43,12 +49,44 @@
data.recipitationType ? data.recipitationType : "-" data.recipitationType ? data.recipitationType : "-"
}}</span> }}</span>
</div> --> </div> -->
<div class="item">
<span class="label">下雨类型</span>
<span class="text">{{
data.rainfall == 0
? "无降"
: data.rainfall == 1
? "雨"
: data.rainfall == 2
? "雪"
: data.rainfall == 3
? "毛毛雨"
: "雨夹雪"
}}</span>
</div>
<div class="item"> <div class="item">
<span class="label">降雨量</span> <span class="label">降雨量</span>
<span class="text">{{ <span class="text">{{
data.rainfall ? data.rainfall + "mm" : "-" data.rainfall ? data.rainfall + "mm" : "-"
}}</span> }}</span>
</div> </div>
<div class="item">
<span class="label">路面状态</span>
<span class="text">{{
data.remoteRoadSurfaceStatus == "00"
? "干燥"
: data.rainfall == "01"
? "潮湿"
: data.rainfall == "02"
? "积水"
: data.rainfall == "03"
? "结冰"
: data.rainfall == "04"
? "积雪"
: data.rainfall == "05"
? "冰水混合物"
: "泥泞"
}}</span>
</div>
<div class="item"> <div class="item">
<span class="label">路面温度</span> <span class="label">路面温度</span>
<span class="text">{{ <span class="text">{{
@ -63,6 +101,12 @@
data.atmosphericPressure ? data.atmosphericPressure + "Pa" : "-" data.atmosphericPressure ? data.atmosphericPressure + "Pa" : "-"
}}</span> }}</span>
</div> </div>
<div class="item">
<span class="label"> 水膜厚度</span>
<span class="text">{{
data.waterFilmlceSnowValue ? data.waterFilmlceSnowValue + "mm" : "-"
}}</span>
</div>
</div> </div>
</div> </div>
</div> </div>

217
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherWarning/components/infowWarningList/index.vue

@ -1,116 +1,75 @@
<template> <template>
<div class='congestion'> <div class="congestion">
<WgtTitle :title="'能见度异常信息'"></WgtTitle> <WgtTitle :title="'能见度异常信息'"></WgtTitle>
<div class="board"> <div class="board">
<div class="weaterMain"> <div class="weaterMain">
<el-table :border="false" :data="tableData" height="670" style="width: 100%"> <el-table
<el-table-column prop="nem" label="" width="30"> :border="false"
:data="tableData"
height="670"
style="width: 100%"
>
<el-table-column prop="nem" label="" width="30"> </el-table-column>
<el-table-column prop="stakeMark" label="桩号范围" width="230">
</el-table-column> </el-table-column>
<el-table-column prop="address" label="桩号范围" width="230"> <el-table-column
</el-table-column> prop="visibility"
<el-table-column prop="name" label="能见度" class-name="showClass" width="250"> label="能见度"
class-name="showClass"
width="250"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span class="showClass">{{ scope.row.name }}</span> <span class="showClass">{{ scope.row.visibility }}km</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="date" label="发生时间" width="230"> <el-table-column prop="createTime" label="发生时间" width="230">
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import Card from "@screen/components/Card1/index.vue" import Card from "@screen/components/Card1/index.vue";
import WgtTitle from '../../../../../widgets/title' import WgtTitle from "../../../../../widgets/title";
import {
getMeteorologicalEarlyWarning,
getListVisibility,
} from "@/api/perception/meteorologyCheck";
export default { export default {
name: 'infoWarning', name: "infoWarning",
components: { components: {
WgtTitle WgtTitle,
}, },
data() { data() {
return { return {
tableData: [{ tableData: [],
date: '2023-12-31 13:00:00', };
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
}, {
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},
]
}
}, },
created() { created() {},
},
methods: { methods: {
selectItem(index) { selectItem(index) {
this.selectIndex = index; this.selectIndex = index;
}, },
getWarningType() {
getListVisibility().then((res) => {
console.log("获取预警类型", res.rows);
this.tableData = res.rows;
});
},
}, },
mounted() { mounted() {
this.getWarningType();
setTimeout(() => {
this.$nextTick(() => {
});
});
}, },
} };
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.showClass { .showClass {
color: #00EBC1; color: #00ebc1;
} }
::v-deep .el-table .cell { ::v-deep .el-table .cell {
@ -119,7 +78,7 @@ export default {
::v-deep .el-table .el-table__header-wrapper th { ::v-deep .el-table .el-table__header-wrapper th {
background-color: #064258 !important; background-color: #064258 !important;
color: #00D1FF; color: #00d1ff;
border-color: #064258 !important; border-color: #064258 !important;
border: 0px !important; border: 0px !important;
font-size: 12px !important; font-size: 12px !important;
@ -138,11 +97,11 @@ export default {
::v-deep .el-table tr:hover td { ::v-deep .el-table tr:hover td {
background: #1b2528 !important; background: #1b2528 !important;
color: #00D1FF; color: #00d1ff;
} }
::v-deep .el-table tr:nth-child(odd) td { ::v-deep .el-table tr:nth-child(odd) td {
background-color: #13272F; background-color: #13272f;
border: 0px !important; border: 0px !important;
} }
@ -175,15 +134,13 @@ export default {
flex-direction: column; flex-direction: column;
margin-top: 20px; margin-top: 20px;
.warningList { .warningList {
display: inline-flex; display: inline-flex;
flex-direction: column; flex-direction: column;
width: 100%; width: 100%;
height: calc(100% - 40px); height: calc(100% - 40px);
>div { > div {
display: inline-flex; display: inline-flex;
width: 100%; width: 100%;
height: 138px; height: 138px;
@ -191,16 +148,21 @@ export default {
border-radius: 2px 2px 2px 2px; border-radius: 2px 2px 2px 2px;
opacity: 1; opacity: 1;
border: 1px solid; border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 1), rgba(55, 231, 255, 0)) 1 1; border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 1),
rgba(55, 231, 255, 0)
)
1 1;
overflow: hidden; overflow: hidden;
margin-top: 20px; margin-top: 20px;
padding: 23px 29px; padding: 23px 29px;
font-size: 14px; font-size: 14px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #37E7FF; color: #37e7ff;
>.left-w { > .left-w {
display: inline-flex; display: inline-flex;
width: 40%; width: 40%;
height: 100%; height: 100%;
@ -213,7 +175,7 @@ export default {
height: 30px; height: 30px;
flex-direction: row; flex-direction: row;
>.value { > .value {
color: #fff; color: #fff;
} }
@ -221,13 +183,12 @@ export default {
font-size: 14px; font-size: 14px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 400; font-weight: 400;
color: #F4A125 color: #f4a125;
} }
} }
} }
>.right-w { > .right-w {
margin-left: 30px; margin-left: 30px;
display: inline-flex; display: inline-flex;
width: 100%; width: 100%;
@ -242,7 +203,6 @@ export default {
color: #fff; color: #fff;
} }
} }
} }
} }
@ -252,12 +212,11 @@ export default {
width: 100%; width: 100%;
height: 40px; height: 40px;
.buttons { .buttons {
width: 100%; width: 100%;
height: 38px; height: 38px;
>div { > div {
display: inline-flex; display: inline-flex;
width: 10%; width: 10%;
height: 35px; height: 35px;
@ -266,36 +225,56 @@ export default {
font-size: 12px; font-size: 12px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 800; font-weight: 800;
color: #FFFFFF; color: #ffffff;
z-index: 9; z-index: 9;
} }
>div::after { > div::after {
content: ""; content: "";
position: absolute; position: absolute;
display: inline-flex; display: inline-flex;
width: 55px; width: 55px;
height: 36px; height: 36px;
background: linear-gradient(180deg, #6557D7 0%, rgba(101, 87, 216, 0) 100%); background: linear-gradient(
180deg,
#6557d7 0%,
rgba(101, 87, 216, 0) 100%
);
border-radius: 50%; border-radius: 50%;
opacity: 1; opacity: 1;
z-index: -1; z-index: -1;
} }
.redSel::after { .redSel::after {
background: linear-gradient(180deg, #E73A14 0%, rgba(240, 92, 9, 0) 100%); background: linear-gradient(
180deg,
#e73a14 0%,
rgba(240, 92, 9, 0) 100%
);
} }
.yelSel::after { .yelSel::after {
background: linear-gradient(180deg, #FFFA79 0%, rgba(255, 208, 137, 0) 100%); background: linear-gradient(
180deg,
#fffa79 0%,
rgba(255, 208, 137, 0) 100%
);
} }
.bluSel::after { .bluSel::after {
background: linear-gradient(180deg, #121ADE 0%, rgba(40, 18, 228, 0) 100%); background: linear-gradient(
180deg,
#121ade 0%,
rgba(40, 18, 228, 0) 100%
);
} }
.orgSel::after { .orgSel::after {
background: linear-gradient(180deg, #FFA623 0%, rgba(255, 173, 53, 0) 100%); background: linear-gradient(
180deg,
#ffa623 0%,
rgba(255, 173, 53, 0) 100%
);
} }
} }
@ -306,7 +285,12 @@ export default {
left: 0px; left: 0px;
width: 100%; width: 100%;
height: 2px; height: 2px;
background: linear-gradient(90deg, rgba(189, 255, 246, 0) 0%, #BDFFF6 52%, rgba(189, 255, 246, 0) 100%); background: linear-gradient(
90deg,
rgba(189, 255, 246, 0) 0%,
#bdfff6 52%,
rgba(189, 255, 246, 0) 100%
);
border-radius: 0px 0px 0px 0px; border-radius: 0px 0px 0px 0px;
opacity: 1; opacity: 1;
} }
@ -318,7 +302,12 @@ export default {
left: 0px; left: 0px;
width: 100%; width: 100%;
height: 2px; height: 2px;
background: linear-gradient(90deg, rgba(189, 255, 246, 0) 0%, #BDFFF6 52%, rgba(189, 255, 246, 0) 100%); background: linear-gradient(
90deg,
rgba(189, 255, 246, 0) 0%,
#bdfff6 52%,
rgba(189, 255, 246, 0) 100%
);
border-radius: 0px 0px 0px 0px; border-radius: 0px 0px 0px 0px;
opacity: 1; opacity: 1;
} }
@ -328,21 +317,25 @@ export default {
display: inline-flex; display: inline-flex;
width: 277px; width: 277px;
height: 38px; height: 38px;
background: linear-gradient(269deg, rgba(55, 231, 255, 0) 6%, rgba(55, 231, 255, 0.6) 50%, rgba(55, 231, 255, 0) 92%); background: linear-gradient(
269deg,
rgba(55, 231, 255, 0) 6%,
rgba(55, 231, 255, 0.6) 50%,
rgba(55, 231, 255, 0) 92%
);
border-radius: 0px 0px 0px 0px; border-radius: 0px 0px 0px 0px;
opacity: 1; opacity: 1;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
>span.text { > span.text {
display: inline-flex; display: inline-flex;
font-size: 16px; font-size: 16px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 400; font-weight: 400;
color: #FFFFFF; color: #ffffff;
} }
.num { .num {
display: inline-flex; display: inline-flex;
justify-content: center; justify-content: center;
@ -350,11 +343,10 @@ export default {
font-size: 22px; font-size: 22px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 400; font-weight: 400;
color: #D9001B; color: #d9001b;
} }
} }
} }
} }
} }
@ -363,4 +355,3 @@ export default {
width: 100%; width: 100%;
} }
</style> </style>
Loading…
Cancel
Save