refactor(ui): 更新强制预设组件布局和样式

- 重新格式化 HTML 属性和 JavaScript 代码以保持一致性
- 将紧急基础属性卡移至组中的第一个位置
- 为基础属性标签添加图标并调整 flex 布局
- 更新样式中属性卡宽度、间距和图标位置
- 注释掉未使用的属性图标 CSS 属性
This commit is contained in:
Zzc 2025-11-20 12:47:47 +08:00
parent 0471e92160
commit ff7479bbb1

View File

@ -4,9 +4,14 @@
<div class="custom-dropdown" v-click-outside="closeDropdown"> <div class="custom-dropdown" v-click-outside="closeDropdown">
<!-- 触发器 --> <!-- 触发器 -->
<div class="dropdown-trigger" @click="toggleDropdown"> <div class="dropdown-trigger" @click="toggleDropdown">
<span class="trigger-text">距离灾害点{{ forcePreset.searchRadius }}km范围内</span> <span class="trigger-text"
>距离灾害点{{ forcePreset.searchRadius }}km范围内</span
>
<div class="trigger-icon" :class="{ 'is-open': isDropdownOpen }"> <div class="trigger-icon" :class="{ 'is-open': isDropdownOpen }">
<img src="../../assets/images/SketchPng8063f445fba047c290a9620343b62ea51d767b8cdcd86769502b5b160998aacc.png" alt="dropdown" /> <img
src="../../assets/images/SketchPng8063f445fba047c290a9620343b62ea51d767b8cdcd86769502b5b160998aacc.png"
alt="dropdown"
/>
</div> </div>
</div> </div>
@ -21,10 +26,29 @@
@click="selectOption(option.value)" @click="selectOption(option.value)"
> >
<span class="item-text">{{ option.label }}</span> <span class="item-text">{{ option.label }}</span>
<div v-if="forcePreset.searchRadius === option.value" class="item-icon"> <div
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> v-if="forcePreset.searchRadius === option.value"
<circle cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/> class="item-icon"
<path d="M8 12L11 15L16 9" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/> >
<svg
viewBox="0 0 24 24"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle
cx="12"
cy="12"
r="10"
stroke="currentColor"
stroke-width="2"
/>
<path
d="M8 12L11 15L16 9"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg> </svg>
</div> </div>
</div> </div>
@ -37,6 +61,22 @@
<div class="summary-stats"> <div class="summary-stats">
<div class="stat-group"> <div class="stat-group">
<div class="stat-card stat-card--base">
<span class="stat-label flexBox"
>应急基地
<img
src="../../assets/images/SketchPng157040b93d0288f48b67022319d8789e5ccded19d94fa14634044ed62a722b1c.png"
alt="base"
class="stat-icon"
/>
</span>
<div class="stat-value-wrapper">
<span class="stat-value">{{ forcePreset.bases }}</span>
<span class="stat-unit"></span>
</div>
</div>
<div class="stat-card stat-card--equipment"> <div class="stat-card stat-card--equipment">
<span class="stat-label">应急装备</span> <span class="stat-label">应急装备</span>
<div class="stat-value-wrapper"> <div class="stat-value-wrapper">
@ -45,15 +85,6 @@
</div> </div>
</div> </div>
<div class="stat-card stat-card--base">
<span class="stat-label">应急基地</span>
<div class="stat-value-wrapper">
<span class="stat-value">{{ forcePreset.bases }}</span>
<span class="stat-unit"></span>
</div>
<!-- <img src="../../assets/images/SketchPng157040b93d0288f48b67022319d8789e5ccded19d94fa14634044ed62a722b1c.png" alt="base" class="stat-icon" /> -->
</div>
<div class="stat-card stat-card--personnel"> <div class="stat-card stat-card--personnel">
<span class="stat-label">应急人员</span> <span class="stat-label">应急人员</span>
<div class="stat-value-wrapper"> <div class="stat-value-wrapper">
@ -69,10 +100,16 @@
:key="station.id" :key="station.id"
class="station-item" class="station-item"
> >
<img src="../../assets/images/路线icon.png" alt="station" class="station-icon" /> <img
src="../../assets/images/路线icon.png"
alt="station"
class="station-icon"
/>
<div class="station-info"> <div class="station-info">
<span class="station-name">{{ station.name }}</span> <span class="station-name">{{ station.name }}</span>
<span class="station-distance">距离灾害点{{ station.distance }}公里</span> <span class="station-distance"
>距离灾害点{{ station.distance }}公里</span
>
</div> </div>
</div> </div>
</div> </div>
@ -82,34 +119,34 @@
</template> </template>
<script setup> <script setup>
import { ref, inject } from 'vue' import { ref, inject } from "vue";
const { forcePreset } = inject('disasterData') const { forcePreset } = inject("disasterData");
const onDistanceChange = inject('onDistanceChange') const onDistanceChange = inject("onDistanceChange");
// //
const isDropdownOpen = ref(false) const isDropdownOpen = ref(false);
// //
const distanceOptions = [ const distanceOptions = [
{ value: 10, label: '距离灾害点10km范围内' }, // { value: 10, label: "10km" },
{ value: 30, label: '距离灾害点30km范围内' }, { value: 30, label: "距离灾害点30km范围内" },
{ value: 50, label: '距离灾害点50km范围内' } { value: 50, label: "距离灾害点50km范围内" },
] ];
/** /**
* 切换下拉框显示/隐藏 * 切换下拉框显示/隐藏
*/ */
const toggleDropdown = () => { const toggleDropdown = () => {
isDropdownOpen.value = !isDropdownOpen.value isDropdownOpen.value = !isDropdownOpen.value;
} };
/** /**
* 关闭下拉框 * 关闭下拉框
*/ */
const closeDropdown = () => { const closeDropdown = () => {
isDropdownOpen.value = false isDropdownOpen.value = false;
} };
/** /**
* 选择选项 * 选择选项
@ -117,30 +154,30 @@ const closeDropdown = () => {
*/ */
const selectOption = (value) => { const selectOption = (value) => {
if (onDistanceChange) { if (onDistanceChange) {
onDistanceChange(value) onDistanceChange(value);
} }
closeDropdown() closeDropdown();
} };
// //
const vClickOutside = { const vClickOutside = {
mounted(el, binding) { mounted(el, binding) {
el.clickOutsideEvent = (event) => { el.clickOutsideEvent = (event) => {
if (!(el === event.target || el.contains(event.target))) { if (!(el === event.target || el.contains(event.target))) {
binding.value() binding.value();
} }
} };
document.addEventListener('click', el.clickOutsideEvent) document.addEventListener("click", el.clickOutsideEvent);
}, },
unmounted(el) { unmounted(el) {
document.removeEventListener('click', el.clickOutsideEvent) document.removeEventListener("click", el.clickOutsideEvent);
} },
} };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
@use '@/styles/mixins.scss' as *; @use "@/styles/mixins.scss" as *;
@use '../../assets/styles/common.scss' as *; @use "../../assets/styles/common.scss" as *;
.force-preset { .force-preset {
padding: 0; padding: 0;
@ -286,7 +323,7 @@ const vClickOutside = {
.stat-group { .stat-group {
display: flex; display: flex;
justify-content: center; justify-content: center;
gap: vw(32); gap: vw(22);
.stat-card { .stat-card {
// flex: 1; // flex: 1;
@ -298,9 +335,10 @@ const vClickOutside = {
padding: vh(12) vw(12) vh(30); padding: vh(12) vw(12) vh(30);
border-radius: vw(6); border-radius: vw(6);
position: relative; position: relative;
background: url('../../assets/images/完成里程.png') no-repeat center bottom; background: url("../../assets/images/完成里程.png") no-repeat center
bottom;
// background-size: 100% 100%; // background-size: 100% 100%;
width: vw(84); width: vw(104);
.stat-label { .stat-label {
color: var(--text-white); color: var(--text-white);
@ -308,6 +346,11 @@ const vClickOutside = {
font-family: SourceHanSansCN-Medium, sans-serif; font-family: SourceHanSansCN-Medium, sans-serif;
} }
.flexBox{
display: flex;
align-items: center;
}
.stat-value-wrapper { .stat-value-wrapper {
display: flex; display: flex;
align-items: baseline; align-items: baseline;
@ -328,12 +371,12 @@ const vClickOutside = {
} }
.stat-icon { .stat-icon {
position: absolute; // position: absolute;
right: vw(8); // right: vw(8);
bottom: vh(8); // bottom: vh(8);
width: vw(24); width: vw(12);
height: vh(24); height: vw(10);
opacity: 0.5; // opacity: 0.5;
} }
} }
} }
@ -361,7 +404,8 @@ const vClickOutside = {
gap: vw(12); gap: vw(12);
padding: vh(0) vw(12); padding: vh(0) vw(12);
// background: rgba(20, 53, 118, 0.3); // background: rgba(20, 53, 118, 0.3);
background: url('../../assets/images/文本线条框.png') no-repeat center center; background: url("../../assets/images/文本线条框.png") no-repeat center
center;
background-size: 100% 100%; background-size: 100% 100%;
border-radius: vw(6); border-radius: vw(6);