From 4ab272934c194a86c3c43d03a15889652d7c9c96 Mon Sep 17 00:00:00 2001 From: niedongsheng <605973111@qq.com> Date: Tue, 7 Apr 2026 17:01:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=81=BE=E5=AE=B3=E5=A1=AB=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/mobile/src/components/TagFilter.vue | 223 ++++++++ packages/mobile/src/router/index.js | 5 + .../DisasterManagement/DisasterManagement.vue | 159 ++++-- .../DisasterManagement/DisasterReport.vue | 139 +++++ .../DisasterManagement/WaterDisaster.vue | 532 ++++++++++++++++++ 5 files changed, 1006 insertions(+), 52 deletions(-) create mode 100644 packages/mobile/src/components/TagFilter.vue create mode 100644 packages/mobile/src/views/DisasterManagement/DisasterReport.vue create mode 100644 packages/mobile/src/views/DisasterManagement/WaterDisaster.vue diff --git a/packages/mobile/src/components/TagFilter.vue b/packages/mobile/src/components/TagFilter.vue new file mode 100644 index 0000000..8246d0a --- /dev/null +++ b/packages/mobile/src/components/TagFilter.vue @@ -0,0 +1,223 @@ + + + + + + 类型筛选 + + + + + + {{ tag.label }} + + + + + + + + + + + \ No newline at end of file diff --git a/packages/mobile/src/router/index.js b/packages/mobile/src/router/index.js index c902cb7..7355826 100644 --- a/packages/mobile/src/router/index.js +++ b/packages/mobile/src/router/index.js @@ -100,6 +100,11 @@ const routes = [ path: '/disasterManagement', name: 'DisasterManagement', component: () => import('../views/DisasterManagement/DisasterManagement.vue') + }, + { + path: '/disasterReport', + name: 'DisasterReport', + component: () => import('../views/DisasterManagement/DisasterReport.vue') } ] diff --git a/packages/mobile/src/views/DisasterManagement/DisasterManagement.vue b/packages/mobile/src/views/DisasterManagement/DisasterManagement.vue index 87cd869..bb92888 100644 --- a/packages/mobile/src/views/DisasterManagement/DisasterManagement.vue +++ b/packages/mobile/src/views/DisasterManagement/DisasterManagement.vue @@ -1,21 +1,10 @@ - - - - - 全部 - - - - - - + - {{ item.status }} @@ -30,27 +19,30 @@ 预计恢复时间: {{ item.estimateRecoverTime }} - {{ item.disasterType }} - - 加载中... - - - 冰雪填报 + 冰雪填报 + + + @@ -63,6 +55,7 @@ import SearchInput from '@/components/SearchInput.vue' import CardItem from '@/components/CardItem.vue' import EmptyBox from '@/components/EmptyBox.vue' import CurrentSite from '@/components/CurrentSite.vue' +import TagFilter from '@/components/TagFilter.vue' import mockDataJSON from './mockData.json' const router = useRouter() @@ -79,45 +72,90 @@ const loading = ref(false) // 空状态文本 const emptyText = ref('暂无相关灾毁信息') -// 获取灾毁列表数据(后端接口) -const getDisasterList = async (keyword = '') => { +// 筛选弹窗显示状态 +const showFilter = ref(false) + +// 当前选中的灾毁类型(通过 v-model 传给 TagFilter) +const selectedDisasterType = ref('all') + +// 灾毁类型列表 +const disasterTypes = [ + { label: '全部', value: 'all' }, + { label: '边坡坍塌', value: '边坡坍塌' }, + { label: '泥石流', value: '泥石流' }, + { label: '路基沉陷', value: '路基沉陷' }, + { label: '山体滑坡', value: '山体滑坡' }, + { label: '行道树倒塌', value: '行道树倒塌' }, + { label: '积水', value: '积水' }, + { label: '积雪', value: '积雪' }, + { label: '其他', value: '其他' } +] + +// 获取简短类型名称 +const getShortTypeName = (type) => { + const typeMap = { + '边坡坍塌': '边坡', + '泥石流': '泥石', + '路基沉陷': '路基', + '山体滑坡': '滑坡', + '行道树倒塌': '树倒', + '积水': '积水', + '积雪': '积雪', + '其他': '其他' + } + return typeMap[type] || type.substring(0, 2) +} + +// 获取灾毁列表数据 +const getDisasterList = async (keyword = '', disasterType = 'all') => { loading.value = true try { // TODO: 替换为实际的后端接口地址 - const response = await fetch('/api/disaster/list', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - keyword: keyword.trim() - }) - }) - - // 模拟接口响应格式,实际使用时根据后端返回结构调整 + // const response = await fetch('/api/disaster/list', { + // method: 'POST', + // headers: { + // 'Content-Type': 'application/json' + // }, + // body: JSON.stringify({ + // keyword: keyword.trim(), + // disasterType: disasterType === 'all' ? '' : disasterType + // }) + // }) // const result = await response.json() - - // 模拟异步请求 // if (result.code === 200) { // list.value = result.data - // emptyText.value = keyword ? '未搜索到相关灾毁信息' : '暂无相关灾毁信息' // } else { // showToast(result.message || '获取数据失败') // list.value = [] // } - // ========== 模拟数据(实际开发时删除此部分) ========== + // ========== 模拟数据 ========== await new Promise((resolve) => setTimeout(resolve, 500)) const mockData = mockDataJSON - // 模拟后端搜索过滤(实际由后端完成) + let filteredData = [...mockData] + if (keyword) { - const filtered = mockData.filter((item) => item.title.toLowerCase().includes(keyword.toLowerCase())) - list.value = filtered - emptyText.value = filtered.length === 0 ? '未搜索到相关灾毁信息' : '暂无相关灾毁信息' + filteredData = filteredData.filter((item) => + item.title.toLowerCase().includes(keyword.toLowerCase()) + ) + } + + if (disasterType !== 'all') { + filteredData = filteredData.filter((item) => + item.disasterType === disasterType + ) + } + + list.value = filteredData + + if (keyword && filteredData.length === 0) { + emptyText.value = '未搜索到相关灾毁信息' + } else if (disasterType !== 'all' && filteredData.length === 0) { + const typeLabel = disasterTypes.find(t => t.value === disasterType)?.label || disasterType + emptyText.value = `暂无${typeLabel}类型灾毁信息` } else { - list.value = mockData emptyText.value = '暂无相关灾毁信息' } // ========== 模拟数据结束 ========== @@ -130,9 +168,23 @@ const getDisasterList = async (keyword = '') => { } } -// 搜索处理(调用后端接口) +// 搜索处理 const handleSearch = () => { - getDisasterList(searchValue.value) + getDisasterList(searchValue.value, selectedDisasterType.value) +} + +// 点击全部按钮 +const handleAllClick = () => { + if (selectedDisasterType.value !== 'all') { + selectedDisasterType.value = 'all' + getDisasterList(searchValue.value, 'all') + } +} + +// 筛选确认 +const handleFilterConfirm = (type) => { + // selectedDisasterType 已经通过 v-model 更新,这里只需重新请求数据 + getDisasterList(searchValue.value, type) } // 点击返回 @@ -140,7 +192,7 @@ const handleClickBack = () => { router.push('/') } -// 点击列表项,跳转详情 +// 点击列表项 const handleClickItem = (item) => { router.push({ path: '/disaster-detail', @@ -157,9 +209,7 @@ const handleClickItem = (item) => { // 灾毁填报 const handleAdd = () => { - // TODO: 跳转到灾毁填报页面 - console.log('点击灾毁填报') - // router.push('/disaster-report') + router.push('/disasterReport') } // 页面初始化加载数据 @@ -176,7 +226,6 @@ onMounted(() => { padding-bottom: 80px; } -/* CardItem 需要设置相对定位 */ :deep(.card-item) { position: relative; } @@ -185,7 +234,7 @@ onMounted(() => { display: flex; flex-direction: column; gap: 8px; - padding-right: 24px; /* 为箭头留出空间 */ + padding-right: 24px; } .time-box { @@ -206,7 +255,6 @@ onMounted(() => { color: #333333; } -/* 使用绝对定位的箭头样式 */ .jump-icon-absolute { position: absolute; right: 16px; @@ -217,12 +265,11 @@ onMounted(() => { cursor: pointer; } -/* 灾毁类型标签样式 */ .disaster-type-wrapper { margin-top: 4px; } -.fab-btn { +.footer-btn { position: fixed; bottom: 30px; left: 50%; @@ -249,4 +296,12 @@ onMounted(() => { justify-content: center; padding: 40px 0; } - + +:deep(.van-button) { + &.active { + background-color: #1989fa; + color: #fff; + border-color: #1989fa; + } +} + \ No newline at end of file diff --git a/packages/mobile/src/views/DisasterManagement/DisasterReport.vue b/packages/mobile/src/views/DisasterManagement/DisasterReport.vue new file mode 100644 index 0000000..d2df783 --- /dev/null +++ b/packages/mobile/src/views/DisasterManagement/DisasterReport.vue @@ -0,0 +1,139 @@ + + + + + + + + + 水毁灾害 + 冰雪灾害 + + + + + + + + + + + + + + 提交 + + + + + + + \ No newline at end of file diff --git a/packages/mobile/src/views/DisasterManagement/WaterDisaster.vue b/packages/mobile/src/views/DisasterManagement/WaterDisaster.vue new file mode 100644 index 0000000..acf7a26 --- /dev/null +++ b/packages/mobile/src/views/DisasterManagement/WaterDisaster.vue @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + 公里 + + + + + + + + 校准时间 + + + + + + + + + + + + + + + + 校准经纬度 + + + + + + + + + + + + + 校准经纬度 + + + + + + + + + + + + + + 处置措施 + + + 半幅封闭 + 全副封闭 + 便道通行 + 正常通行 + + + + + + + + + + + + + + + + + 个 + + + + + 个 + + + + + 个 + + + + + 辆 + + + + + 辆 + + + + + + + + + 塌方及损失 + {{ formData.collapseLoss }}万/万元 + + 添加损失 + + + + 万元 + + + + + + + + 台/班 + + + + + 人次 + + + + + 万元 + + + + + + + + + + + + + + + + + + + + + 预估塌方量:{{ calculatedVolume }} m³ + 预估损失:{{ calculatedLoss }} 万元 + + + + + + + +