Files
emsfront/src/views/ems/dzjk/zxlt/index.vue

651 lines
17 KiB
Vue
Raw Normal View History

2025-07-11 00:14:58 +08:00
<template>
2025-08-18 18:13:24 +08:00
<div class="ems-dashboard-editor-container" v-loading="loading">
<div class="container" v-show="!empty">
<!-- 电脑 -->
<div class="top">
<div class="cloud-container">
<div class="cloud">
<span style="z-index: 2; position: relative"></span>
2025-07-13 20:10:30 +08:00
</div>
2025-07-11 00:14:58 +08:00
</div>
2025-08-18 18:13:24 +08:00
<div class="double-arrows">
<div class="top-arrows"></div>
<div class="bottom-arrows"></div>
</div>
<div class="computer">
2025-12-12 17:38:26 +08:00
<img src="@/assets/images/ems/computer.png" alt=""/>
2025-08-18 18:13:24 +08:00
<span style="z-index: 2; position: relative">ems</span>
</div>
</div>
<div class="outer-border">
<!-- 电表-->
<div class="row-lists-container" v-if="showDb">
<div class="row-title">电表({{ db.length }})</div>
2025-08-20 17:26:01 +08:00
<div
2025-12-12 17:38:26 +08:00
class="row-lists"
v-for="outter in Math.ceil(db.length / 3)"
:key="outter + 'row'"
2025-08-20 17:26:01 +08:00
>
<template v-for="(item, index) in handlerList('db', outter)">
<div :key="index" class="row-items">
<div
2025-12-12 17:38:26 +08:00
style="position: relative; z-index: 2; background-color: #fff"
2025-08-20 17:26:01 +08:00
>
<div
2025-12-12 17:38:26 +08:00
class="status"
:class="
item.deviceStatus === '1' ? 'status-running' : ''
2025-08-20 17:26:01 +08:00
"
>
2025-12-12 17:38:26 +08:00
{{ deviceStatusOptions[item.deviceStatus] }}
2025-07-19 14:14:21 +08:00
</div>
2025-08-20 17:26:01 +08:00
<div class="row-items-img">
<img
2025-12-12 17:38:26 +08:00
class="img-db"
:src="require('@/assets/images/ems/db.png')"
2025-08-20 17:26:01 +08:00
/>
<div class="name">{{ item.deviceName }}</div>
2025-07-11 00:14:58 +08:00
</div>
</div>
</div>
2025-08-20 17:26:01 +08:00
</template>
2025-08-18 18:13:24 +08:00
</div>
</div>
2025-08-20 17:26:01 +08:00
<!-- 冷却-->
2025-08-18 18:13:24 +08:00
<div class="row-lists-container" v-if="showLq">
<div class="row-title">冷却({{ lq.length }})</div>
2025-08-20 17:26:01 +08:00
<div
2025-12-12 17:38:26 +08:00
class="row-lists"
v-for="outter in Math.ceil(lq.length / 3)"
:key="outter + 'row'"
2025-08-20 17:26:01 +08:00
>
<template v-for="(item, index) in handlerList('lq', outter)">
<div :key="index" class="row-items">
<div
2025-12-12 17:38:26 +08:00
style="position: relative; z-index: 2; background-color: #fff"
2025-08-20 17:26:01 +08:00
>
<div
2025-12-12 17:38:26 +08:00
class="status"
:class="
item.deviceStatus === '1' ? 'status-running' : ''
2025-08-20 17:26:01 +08:00
"
>
2025-12-12 17:38:26 +08:00
{{ deviceStatusOptions[item.deviceStatus] }}
2025-07-19 14:14:21 +08:00
</div>
2025-08-20 17:26:01 +08:00
<div class="row-items-img">
<img
2025-12-12 17:38:26 +08:00
class="img-lq"
:src="require('@/assets/images/ems/lq.png')"
2025-08-20 17:26:01 +08:00
/>
<div class="name">{{ item.deviceName }}</div>
2025-07-11 00:14:58 +08:00
</div>
</div>
</div>
2025-08-20 17:26:01 +08:00
</template>
2025-08-18 18:13:24 +08:00
</div>
</div>
2025-08-20 17:26:01 +08:00
<!-- 没有上级设备的bms -->
<div
2025-12-12 17:38:26 +08:00
class="row-lists-container"
v-if="bmsHasParentLength !== bms.length"
2025-08-20 17:26:01 +08:00
>
<div class="row-title">BMS({{ bmsNoParent.length }})</div>
<div
2025-12-12 17:38:26 +08:00
class="row-lists"
v-for="outter in Math.ceil(bmsNoParent.length / 3)"
:key="outter + 'row'"
2025-08-20 17:26:01 +08:00
>
<template
2025-12-12 17:38:26 +08:00
v-for="(item, index) in handlerList('bmsNoParent', outter)"
2025-08-18 18:13:24 +08:00
>
2025-08-20 17:26:01 +08:00
<div :key="index" class="row-items">
2025-08-18 18:13:24 +08:00
<div
2025-12-12 17:38:26 +08:00
style="position: relative; z-index: 2; background-color: #fff"
2025-08-18 18:13:24 +08:00
>
2025-08-20 17:26:01 +08:00
<div
2025-12-12 17:38:26 +08:00
class="status"
:class="
item.deviceStatus === '1' ? 'status-running' : ''
2025-08-20 17:26:01 +08:00
"
>
2025-12-12 17:38:26 +08:00
{{ deviceStatusOptions[item.deviceStatus] }}
2025-08-20 17:26:01 +08:00
</div>
2025-08-25 14:29:27 +08:00
<div class="row-items-img row-items-img-bms">
<div style="position:relative;">
<img
2025-12-12 17:38:26 +08:00
class="img-bms"
:src="require('@/assets/images/ems/bms.png')"
2025-08-25 14:29:27 +08:00
/>
2025-12-12 17:38:26 +08:00
<div class="num">{{ item.batteryNum || 0 }}</div>
2025-08-25 14:29:27 +08:00
</div>
2025-08-20 17:26:01 +08:00
<div class="name">{{ item.deviceName }}</div>
2025-07-11 00:14:58 +08:00
</div>
</div>
</div>
2025-08-20 17:26:01 +08:00
</template>
</div>
</div>
2025-07-19 14:14:21 +08:00
2025-08-20 17:26:01 +08:00
<!-- pcs -->
<div
2025-12-12 17:38:26 +08:00
class="row-lists-container row-lists-container-with-children"
v-if="showPcs"
2025-08-20 17:26:01 +08:00
>
<div class="row-title">
PCS({{ pcs.length }}){{
pcsHasChildren.length > 0 ? `、BMS(${pcsHasChildren.length})` : ""
}}
</div>
<div
2025-12-12 17:38:26 +08:00
class="row-lists"
v-for="outter in Math.ceil(pcs.length / 3)"
:key="outter + 'row'"
2025-08-20 17:26:01 +08:00
>
<template v-for="(item, index) in handlerList('pcs', outter)">
<div :key="index" class="row-items">
<!-- 上级设备 -->
<div class="parent-dash">
<div
2025-12-12 17:38:26 +08:00
class="status"
:class="
item.deviceStatus === '1' ? 'status-running' : ''
2025-08-20 17:26:01 +08:00
"
>
2025-12-12 17:38:26 +08:00
{{ deviceStatusOptions[item.deviceStatus] }}
2025-08-20 17:26:01 +08:00
</div>
<div class="row-items-img">
<img
2025-12-12 17:38:26 +08:00
class="img-pcs"
:src="require('@/assets/images/ems/pcs.png')"
2025-08-20 17:26:01 +08:00
/>
<div class="name">{{ item.deviceName }}</div>
</div>
</div>
<!-- 下级设备 -->
2025-08-18 18:13:24 +08:00
<div
2025-12-12 17:38:26 +08:00
class="children-dash"
v-if="item.children && item.children.length > 0"
2025-08-20 17:26:01 +08:00
>
<div
2025-12-12 17:38:26 +08:00
class="status"
:class="
item.children[0].deviceStatus === '1'
2025-08-20 17:26:01 +08:00
? 'status-running'
: ''
"
>
{{
2025-11-01 13:02:01 +08:00
deviceStatusOptions[
2025-12-12 17:38:26 +08:00
item.children[0].deviceStatus
]
2025-08-20 17:26:01 +08:00
}}
</div>
2025-08-25 14:29:27 +08:00
<div class="row-items-img row-items-img-bms">
<div style="position: relative">
<img
2025-12-12 17:38:26 +08:00
class="img-bms"
:src="require('@/assets/images/ems/bms.png')"
2025-08-25 14:29:27 +08:00
/>
2025-12-12 17:38:26 +08:00
<div class="num">{{ item.batteryNum || 0 }}</div>
2025-08-25 14:29:27 +08:00
</div>
2025-08-20 17:26:01 +08:00
<div class="name">{{ item.children[0].deviceName }}</div>
2025-07-11 00:14:58 +08:00
</div>
</div>
</div>
2025-08-20 17:26:01 +08:00
</template>
2025-07-13 20:10:30 +08:00
</div>
2025-07-11 00:14:58 +08:00
</div>
</div>
</div>
2025-08-18 18:13:24 +08:00
<el-empty v-show="empty" :image-size="200"></el-empty>
</div>
2025-07-11 00:14:58 +08:00
</template>
2025-07-19 15:22:26 +08:00
<script>
2025-12-12 17:38:26 +08:00
import {getDeviceList} from "@/api/ems/site";
2025-07-19 15:22:26 +08:00
import getQuerySiteId from "@/mixins/ems/getQuerySiteId";
2025-12-12 17:38:26 +08:00
import {mapState} from "vuex";
2025-07-19 15:22:26 +08:00
export default {
2025-08-18 18:13:24 +08:00
name: "DzjkZxlt",
2025-07-19 15:22:26 +08:00
mixins: [getQuerySiteId],
data() {
return {
2025-08-18 18:13:24 +08:00
loading: false,
pcs: [],
bms: [],
db: [],
lq: [],
bmsNoParent: [],
};
2025-07-19 15:22:26 +08:00
},
2025-08-18 18:13:24 +08:00
computed: {
2025-07-19 15:22:26 +08:00
...mapState({
2025-11-01 13:02:01 +08:00
deviceStatusOptions: (state) =>
2025-12-12 17:38:26 +08:00
state.ems.deviceStatusOptions,
2025-07-19 15:22:26 +08:00
}),
2025-08-18 18:13:24 +08:00
showPcs() {
return this.pcs.length > 0;
2025-07-19 15:22:26 +08:00
},
2025-08-18 18:13:24 +08:00
showBms() {
return this.bms.length > 0;
2025-07-19 15:22:26 +08:00
},
2025-08-18 18:13:24 +08:00
showDb() {
return this.db.length > 0;
2025-07-19 15:22:26 +08:00
},
2025-08-18 18:13:24 +08:00
showLq() {
return this.lq.length > 0;
2025-07-19 15:22:26 +08:00
},
2025-08-20 17:26:01 +08:00
bmsHasParentLength() {
let count = 0;
this.pcs.forEach((item) => (count += item.children.length));
return count;
2025-07-19 15:22:26 +08:00
},
2025-08-20 17:26:01 +08:00
pcsHasChildren() {
return this.pcs.filter(
2025-12-12 17:38:26 +08:00
(item) => item.children && item.children.length > 0
2025-08-20 17:26:01 +08:00
);
2025-07-19 15:22:26 +08:00
},
2025-08-18 18:13:24 +08:00
empty() {
return !this.showBms && !this.showPcs && !this.showDb && !this.showLq;
2025-07-19 15:22:26 +08:00
},
},
methods: {
2025-08-20 17:26:01 +08:00
handlerList(type, index) {
const arr = this[type];
const max = index * 3 > arr.length ? arr.length % 3 : 3;
let result = [];
for (let i = 1; i <= max; i++) {
result.push(arr[i - 1 + 3 * (index - 1)]);
}
return result;
},
2025-08-18 18:13:24 +08:00
init() {
this.pcs = [];
this.bms = [];
this.lq = [];
this.db = [];
this.bmsNoParent = [];
this.loading = true;
getDeviceList(this.siteId)
2025-12-12 17:38:26 +08:00
.then((response) => {
const data = JSON.parse(JSON.stringify(response?.data || []));
let pcs = [],
bms = [],
db = [],
lq = [],
bmsNoParent = [];
data.forEach((item) => {
// 电表
if (item.deviceCategory === "AMMETER") {
db.push({...item, children: []});
} else if (item.deviceCategory === "PCS") {
// pcs
pcs.push({...item, children: []});
} else if (item.deviceCategory === "STACK") {
// bms
bms.push({...item, children: []});
} else if (item.deviceCategory === "COOLING") {
// 液冷
lq.push({...item, children: []});
}
});
bms.forEach((item, index) => {
if (item.parentId) {
pcs
.find((pcsItem) => pcsItem.deviceId === item.parentId)
.children.push(item);
} else {
bmsNoParent.push(item);
}
});
this.pcs = pcs;
this.bms = bms;
this.lq = lq;
this.db = db;
this.bmsNoParent = bmsNoParent;
})
.finally(() => {
this.loading = false;
2025-08-18 18:13:24 +08:00
});
},
2025-07-19 15:22:26 +08:00
},
2025-08-18 18:13:24 +08:00
};
2025-07-19 15:22:26 +08:00
</script>
2025-07-11 00:14:58 +08:00
<style lang="scss" scoped>
2025-08-18 18:13:24 +08:00
$sqDistance: 30px;
$borderColor: #174a8e;
$lineColor: #86bcc7;
2025-07-11 00:14:58 +08:00
.ems-dashboard-editor-container {
background-color: #ffffff;
2025-08-20 17:53:26 +08:00
padding: 30px;
2025-08-18 18:13:24 +08:00
color: #666666;
.container {
display: flex;
2025-07-11 00:14:58 +08:00
position: relative;
}
2025-12-12 17:38:26 +08:00
2025-07-19 14:14:21 +08:00
//云 、计算机 、箭头
2025-08-18 18:13:24 +08:00
.top {
z-index: 2;
width: fit-content;
2025-07-13 20:10:30 +08:00
display: flex;
2025-08-18 18:13:24 +08:00
justify-content: center;
align-items: center;
// position: absolute;
// top: 50%;
// left: 0;
// transform: translateY(-50%);
2025-07-13 20:10:30 +08:00
//云 样式
2025-08-18 18:13:24 +08:00
.cloud-container {
margin: 0 auto;
2025-12-12 17:38:26 +08:00
2025-07-13 20:10:30 +08:00
.cloud {
2025-08-18 18:13:24 +08:00
width: 60px;
height: 26px;
2025-07-13 20:10:30 +08:00
background: #cbebfd;
2025-08-18 18:13:24 +08:00
border-radius: 100px;
2025-07-13 20:10:30 +08:00
position: relative;
text-align: center;
2025-08-18 18:13:24 +08:00
font-weight: bold;
font-size: 14px;
line-height: 26px;
2025-07-13 20:10:30 +08:00
}
2025-12-12 17:38:26 +08:00
2025-08-18 18:13:24 +08:00
.cloud:before,
.cloud:after {
content: "";
2025-07-13 20:10:30 +08:00
position: absolute;
2025-08-18 18:13:24 +08:00
background: #cbebfd;
width: 30px;
height: 30px;
border-radius: 100%;
2025-07-13 20:10:30 +08:00
}
2025-12-12 17:38:26 +08:00
2025-07-13 20:10:30 +08:00
.cloud:before {
2025-08-18 18:13:24 +08:00
top: -9px;
left: 8px;
2025-07-13 20:10:30 +08:00
}
2025-12-12 17:38:26 +08:00
2025-07-13 20:10:30 +08:00
.cloud:after {
2025-08-18 18:13:24 +08:00
top: -6px;
right: 9px;
2025-07-13 20:10:30 +08:00
}
}
2025-12-12 17:38:26 +08:00
2025-07-16 22:23:28 +08:00
//双箭头
2025-07-13 20:10:30 +08:00
.double-arrows {
2025-08-18 18:13:24 +08:00
height: fit-content;
margin: 0 10px;
2025-07-16 22:23:28 +08:00
text-align: center;
2025-12-12 17:38:26 +08:00
2025-08-18 18:13:24 +08:00
.top-arrows,
.bottom-arrows {
height: 4px;
width: 30px;
background-color: #5ea9df;
2025-07-16 22:23:28 +08:00
margin: 0 10px;
2025-07-13 20:10:30 +08:00
position: relative;
2025-12-12 17:38:26 +08:00
2025-07-13 20:10:30 +08:00
&::after {
2025-08-18 18:13:24 +08:00
content: "";
2025-07-13 20:10:30 +08:00
position: absolute;
2025-08-18 18:13:24 +08:00
left: 0;
2025-07-13 20:10:30 +08:00
width: 0;
height: 0;
}
}
2025-12-12 17:38:26 +08:00
2025-08-18 18:13:24 +08:00
.top-arrows {
2025-07-16 22:23:28 +08:00
vertical-align: super;
}
2025-12-12 17:38:26 +08:00
2025-07-13 20:10:30 +08:00
.top-arrows::after {
2025-08-18 18:13:24 +08:00
top: -4px;
border-bottom: 6px solid transparent;
border-left: 6px solid transparent;
border-right: 6px solid #5ea9df;
border-top: 6px solid transparent;
left: -11px;
2025-07-13 20:10:30 +08:00
}
2025-12-12 17:38:26 +08:00
2025-08-18 18:13:24 +08:00
.bottom-arrows {
margin-top: 8px;
2025-12-12 17:38:26 +08:00
2025-07-13 20:10:30 +08:00
&::after {
2025-08-18 18:13:24 +08:00
top: -4px;
border-top: 6px solid transparent;
border-left: 6px solid #5ea9df;
border-right: 6px solid transparent;
border-bottom: 6px solid transparent;
right: -11px;
left: auto;
2025-07-13 20:10:30 +08:00
}
}
2025-07-11 00:14:58 +08:00
}
2025-07-13 20:10:30 +08:00
//电脑
2025-08-18 18:13:24 +08:00
.computer {
2025-07-13 20:10:30 +08:00
text-align: center;
2025-08-18 18:13:24 +08:00
font-size: 14px;
line-height: 16px;
font-weight: bold;
2025-07-13 20:10:30 +08:00
position: relative;
2025-08-18 18:13:24 +08:00
background: #fff;
2025-12-12 17:38:26 +08:00
2025-07-13 20:10:30 +08:00
img {
2025-08-18 18:13:24 +08:00
width: 80px;
height: auto;
2025-07-13 20:10:30 +08:00
display: block;
}
2025-07-16 22:23:28 +08:00
}
2025-07-11 00:14:58 +08:00
}
2025-12-12 17:38:26 +08:00
2025-08-18 18:13:24 +08:00
.outer-border {
position: relative;
width: fit-content;
2025-08-20 17:26:01 +08:00
border: 1.5px solid $borderColor;
padding-left: 40px;
2025-08-18 18:13:24 +08:00
margin-left: -40px;
2025-08-20 17:26:01 +08:00
display: flex;
// 设备列表
.row-lists-container {
font-size: 10px;
2025-07-16 22:23:28 +08:00
position: relative;
2025-08-20 17:26:01 +08:00
padding: 10px 20px;
display: flex;
&:not(:first-child) {
background: linear-gradient(
2025-12-12 17:38:26 +08:00
to top,
transparent 0%,
transparent 50%,
#ccc 50%,
#ccc 100%
2025-08-20 17:26:01 +08:00
);
background-size: 1px 10px;
background-repeat: repeat-y;
2025-07-13 20:10:30 +08:00
}
2025-08-20 17:26:01 +08:00
.row-title {
position: absolute;
left: -$sqDistance - 30px;
top: -20px;
left: 50%;
transform: translateX(-50%);
color: #000;
font-weight: bolder;
2025-07-16 22:23:28 +08:00
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
.row-lists {
2025-07-19 14:14:21 +08:00
position: relative;
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
.row-items {
2025-08-18 18:13:24 +08:00
position: relative;
2025-08-20 17:26:01 +08:00
padding: 5px 0;
background: #fff;
// &:not(:first-child) {
padding-top: 20px; //todo
// }
&::after {
z-index: 1;
content: "";
2025-07-16 22:23:28 +08:00
display: block;
2025-08-20 17:26:01 +08:00
height: 25px;
width: 3px;
background: $lineColor;
2025-07-16 22:23:28 +08:00
position: absolute;
2025-08-20 17:26:01 +08:00
left: 50%;
top: -10px;
transform: scale(0.4, 1);
2025-07-19 14:14:21 +08:00
}
2025-08-20 17:26:01 +08:00
// 设备状态
.status {
margin: 0 auto 4px;
width: fit-content;
height: 18px;
padding: 0 8px;
box-sizing: border-box;
2025-07-19 14:14:21 +08:00
text-align: center;
2025-08-20 17:26:01 +08:00
font-size: 8px;
line-height: 18px;
border: 1px solid #08ffff;
border-radius: 2px;
background: #aaaaaa;
color: #ffffff;
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
&.status-running {
background: #00c69c;
2025-07-13 20:10:30 +08:00
}
2025-07-19 14:14:21 +08:00
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
// 图片+设备名称
.row-items-img {
2025-07-19 14:14:21 +08:00
position: relative;
2025-08-20 17:26:01 +08:00
padding-top: 12px;
2025-12-12 17:38:26 +08:00
&.row-items-img-bms {
2025-08-25 14:29:27 +08:00
padding-top: 14px;
2025-12-12 17:38:26 +08:00
.num {
2025-08-25 14:29:27 +08:00
position: absolute;
top: -2px;
right: -2px;
font-size: 10px;
line-height: 10px;
padding: 2px 4px;
text-align: center;
border-radius: 10px;
background-color: #03c69d;
color: #fff;
}
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
img {
width: 80px;
height: auto;
display: block;
2025-08-25 14:29:27 +08:00
position: relative;
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
&.img-lq {
width: 50px;
2025-07-19 14:14:21 +08:00
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
&.img-pcs {
width: 50px;
2025-07-19 14:14:21 +08:00
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
&.img-db {
width: 56px;
2025-07-19 14:14:21 +08:00
}
2025-07-13 20:10:30 +08:00
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
.name {
2025-07-13 20:10:30 +08:00
position: absolute;
2025-08-20 17:26:01 +08:00
top: 1px;
left: 0;
color: #666;
white-space: nowrap;
2025-07-19 14:14:21 +08:00
}
2025-07-13 20:10:30 +08:00
}
2025-08-20 17:26:01 +08:00
}
}
}
// 有下级设备
.row-lists-container-with-children {
.row-lists {
&:not(:last-child) {
margin-right: 30px;
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
.row-items {
display: flex;
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
&::after {
display: none;
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
.parent-dash {
position: relative;
z-index: 2;
background-color: #fff;
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
> div {
z-index: 2;
position: inherit;
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
&::after {
z-index: 1;
content: "";
2025-07-19 14:14:21 +08:00
display: block;
2025-08-20 17:26:01 +08:00
height: 45px;
width: 3px;
background: $lineColor;
2025-07-19 14:14:21 +08:00
position: absolute;
2025-08-20 17:26:01 +08:00
left: 50%;
top: -30px;
transform: scale(0.4, 1);
2025-07-13 20:10:30 +08:00
}
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
.children-dash {
position: relative;
z-index: 2;
background-color: #fff;
margin: -20px 0 0 26px;
height: fit-content;
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
> div {
z-index: 2;
position: inherit;
}
2025-12-12 17:38:26 +08:00
2025-08-20 17:26:01 +08:00
&::after {
z-index: 1;
content: "";
display: block;
width: 44px;
height: 1px;
background: #ec7f8c;
position: absolute;
left: -33px;
bottom: -10px;
transform: rotate(-34deg);
2025-07-19 15:22:26 +08:00
}
}
}
2025-07-11 00:14:58 +08:00
}
}
}
}
</style>