20 changed files with 1190 additions and 200 deletions
@ -0,0 +1,43 @@ |
|||||
|
<template> |
||||
|
<div id="div-container" style="height:100%;overflow: auto; "> |
||||
|
<img v-for="(item, index) in imgList" :key="index" class="img-box" :src="item" style="width: 100%" /> |
||||
|
</div> |
||||
|
|
||||
|
</template> |
||||
|
|
||||
|
<script > |
||||
|
import {baseUrl} from "@/config/env"; |
||||
|
import {transPdf} from "@/api/enforce.js"; |
||||
|
|
||||
|
export default { |
||||
|
name: 'PdfViewer', |
||||
|
data() { |
||||
|
return { |
||||
|
imgList:[], |
||||
|
// 可引入网络文件或者本地文件 |
||||
|
pdfUrl: "http://192.168.110.36:85/profile/upload/2024/03/29/40eb1a97ca27c3369370e90632d92db0.pdf", |
||||
|
}; |
||||
|
}, |
||||
|
mounted() { |
||||
|
this.pdfUrl =baseUrl+ this.$route.query.url; |
||||
|
console.log("pdf地址", this.pdfUrl) |
||||
|
this.loadImage(); |
||||
|
}, |
||||
|
methods: { |
||||
|
loadImage() { |
||||
|
let searchParam = reactive({url: this.$route.query.url}); |
||||
|
transPdf(searchParam, success => { |
||||
|
this.imgList = success.data; |
||||
|
if (success.data.length > 0) { |
||||
|
this.imgList.forEach((item, index) => { |
||||
|
this.imgList[index] = "data:image/png;base64,"+item; |
||||
|
}); |
||||
|
} |
||||
|
}, error => { |
||||
|
|
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
@ -0,0 +1,187 @@ |
|||||
|
<template> |
||||
|
<div class="banner-detail-page"> |
||||
|
<!-- 顶部导航栏 --> |
||||
|
<!-- <van-nav-bar |
||||
|
title="-banner详情" |
||||
|
left-text="关闭" |
||||
|
left-arrow |
||||
|
@click-left="onClickLeft" |
||||
|
/> --> |
||||
|
|
||||
|
<!-- 内容区域 --> |
||||
|
<div class="detail-content"> |
||||
|
<!-- 标题 --> |
||||
|
<h1 class="detail-title">{{ detail.title }}</h1> |
||||
|
|
||||
|
<!-- 来源和时间 --> |
||||
|
<div class="detail-meta"> |
||||
|
<span class="detail-source">{{ detail.source }}</span> |
||||
|
<span class="detail-time">{{ detail.time }}</span> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 图片 --> |
||||
|
<div class="detail-images" v-if="detail.imageUrl"> |
||||
|
<img |
||||
|
:src="baseUrl + detail.imageUrl" |
||||
|
alt="" |
||||
|
@click="previewImage" |
||||
|
/> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 正文内容 --> |
||||
|
<div class="detail-body" v-if="detail.content" v-html="detail.content"> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="bannerDetail"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
import { useRouter, useRoute } from 'vue-router'; |
||||
|
import { showToast, showImagePreview } from 'vant'; |
||||
|
import 'vant/es/toast/style'; |
||||
|
import 'vant/es/image-preview/style'; |
||||
|
import { baseUrl } from '@/config/env'; |
||||
|
import { getCarouselBannerDetail } from '@/api/enforcement'; |
||||
|
|
||||
|
const router = useRouter(); |
||||
|
const route = useRoute(); |
||||
|
|
||||
|
// ========== 详情数据 ========== |
||||
|
const detail = ref({ |
||||
|
id: '', |
||||
|
title: '', |
||||
|
source: '', |
||||
|
time: '', |
||||
|
imageUrl: '', |
||||
|
content: '', |
||||
|
}); |
||||
|
|
||||
|
const loading = ref(false); |
||||
|
|
||||
|
// ========== 获取详情数据 ========== |
||||
|
const fetchDetail = () => { |
||||
|
const id = route.query.id; |
||||
|
if (!id) { |
||||
|
showToast('缺少详情ID'); |
||||
|
router.back(); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
loading.value = true; |
||||
|
getCarouselBannerDetail( |
||||
|
{ id }, |
||||
|
(res) => { |
||||
|
loading.value = false; |
||||
|
if (res.code === 200 && res.data) { |
||||
|
detail.value = { |
||||
|
id: res.data.id || '', |
||||
|
title: res.data.title || '', |
||||
|
source: res.data.source || '', |
||||
|
time: res.data.time || '', |
||||
|
imageUrl: res.data.imageUrl || '', |
||||
|
content: res.data.content || '', |
||||
|
}; |
||||
|
} else { |
||||
|
showToast(res.message || '获取详情失败'); |
||||
|
} |
||||
|
}, |
||||
|
(err) => { |
||||
|
loading.value = false; |
||||
|
showToast(err.message || '获取详情失败'); |
||||
|
} |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
// ========== 页面加载时获取数据 ========== |
||||
|
onMounted(() => { |
||||
|
fetchDetail(); |
||||
|
}); |
||||
|
|
||||
|
// ========== 返回上一页 ========== |
||||
|
const onClickLeft = () => { |
||||
|
router.back(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 预览图片 ========== |
||||
|
const previewImage = () => { |
||||
|
showImagePreview({ |
||||
|
images: [baseUrl + detail.value.imageUrl], |
||||
|
startPosition: 0, |
||||
|
}); |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="less" scoped> |
||||
|
.banner-detail-page { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
height: 100%; |
||||
|
background-color: #fff; |
||||
|
|
||||
|
.detail-content { |
||||
|
flex: 1; |
||||
|
overflow-y: auto; |
||||
|
padding: 0.4rem 0.4rem 0.6rem; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar) { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar__title) { |
||||
|
font-size: 0.45rem; |
||||
|
font-weight: 600; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar__text) { |
||||
|
font-size: 0.35rem; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar .van-icon) { |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.detail-title { |
||||
|
font-size: 0.55rem; |
||||
|
font-weight: bold; |
||||
|
color: #1a1a1a; |
||||
|
line-height: 1.5; |
||||
|
margin-bottom: 0.25rem; |
||||
|
} |
||||
|
|
||||
|
.detail-meta { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 0.4rem; |
||||
|
|
||||
|
.detail-source { |
||||
|
font-size: 0.3rem; |
||||
|
color: #2d94fa; |
||||
|
margin-right: 0.3rem; |
||||
|
} |
||||
|
|
||||
|
.detail-time { |
||||
|
font-size: 0.3rem; |
||||
|
color: #999; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.detail-images { |
||||
|
margin-bottom: 0.4rem; |
||||
|
|
||||
|
img { |
||||
|
width: 100%; |
||||
|
border-radius: 0.2rem; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.detail-body { |
||||
|
font-size: 0.37rem; |
||||
|
color: #333; |
||||
|
line-height: 1.8; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,289 @@ |
|||||
|
<template> |
||||
|
<div class="evaluate-list-page"> |
||||
|
<!-- 顶部导航栏 --> |
||||
|
<van-nav-bar title="执法评价" left-text="返回" left-arrow @click-left="onClickLeft"> |
||||
|
</van-nav-bar> |
||||
|
|
||||
|
<!-- 列表区域 --> |
||||
|
<div class="list-container"> |
||||
|
<van-pull-refresh v-model="refreshing" @refresh="onRefresh"> |
||||
|
<van-list v-model:loading="loading" :finished="finished" finished-text="已全部加载" @load="onLoad" |
||||
|
:offset="50"> |
||||
|
<van-empty v-if="finished && list.length === 0" description="暂无执法评价" /> |
||||
|
|
||||
|
<div class="evaluate-card" v-for="item in list" :key="item.id" @click="toDetail(item)"> |
||||
|
<!-- 执法时间 --> |
||||
|
<div class="card-time"> |
||||
|
执法时间:{{ item.enforcementTime }} |
||||
|
</div> |
||||
|
|
||||
|
<!-- 标题 --> |
||||
|
<div class="card-title">{{ item.title || item.checkItemText || '执法检查' }}</div> |
||||
|
|
||||
|
<!-- 内容 --> |
||||
|
<div class="card-content"> |
||||
|
<div class="info-row"> |
||||
|
<span class="label">执法单位</span> |
||||
|
<span class="value">{{ item.lawEnforcement || item.bureauDeptName }}</span> |
||||
|
</div> |
||||
|
<div class="info-row"> |
||||
|
<span class="label">执法人员:</span> |
||||
|
<div> |
||||
|
<div v-for="(enforcer, index) in formatEnforcer(item)" :key="index" |
||||
|
class="enforcer-item"> |
||||
|
{{ enforcer }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="info-row"> |
||||
|
<span class="label">企业名称</span> |
||||
|
<span class="value">{{ item.enterpriseName }}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 底部状态 --> |
||||
|
<div class="card-footer"> |
||||
|
<span class="status">状态:<span :class="getStatusClass(item.hasEvaluate)">{{ |
||||
|
getStatusText(item.hasEvaluate) }}</span></span> |
||||
|
<span class="evaluate-time">评价时间:{{ item.evaluateTime }}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</van-list> |
||||
|
</van-pull-refresh> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="enforcementEvaluateList"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
import { useRouter } from 'vue-router'; |
||||
|
import { showToast } from 'vant'; |
||||
|
import 'vant/es/toast/style'; |
||||
|
import { queryEvaluateList } from '@/api/enforcement/index'; |
||||
|
import { formatEnforcer } from '@/util/util'; |
||||
|
|
||||
|
const router = useRouter(); |
||||
|
|
||||
|
// ========== 列表状态 ========== |
||||
|
const list = ref([]); |
||||
|
const loading = ref(false); |
||||
|
const finished = ref(false); |
||||
|
const refreshing = ref(false); |
||||
|
const pageNum = ref(1); |
||||
|
const pageSize = ref(10); |
||||
|
|
||||
|
// ========== 获取状态文本 ========== |
||||
|
const getStatusText = (status) => { |
||||
|
const statusMap = { |
||||
|
'0': '未评价', |
||||
|
'1': '已评价', |
||||
|
'2': '已退回', |
||||
|
}; |
||||
|
return statusMap[status] || '未知'; |
||||
|
}; |
||||
|
|
||||
|
// ========== 获取状态样式类 ========== |
||||
|
const getStatusClass = (status) => { |
||||
|
const classMap = { |
||||
|
'0': 'status-pending', |
||||
|
'1': 'status-evaluated', |
||||
|
'2': 'status-rejected', |
||||
|
}; |
||||
|
return classMap[status] || 'status-default'; |
||||
|
}; |
||||
|
|
||||
|
// ========== 加载数据 ========== |
||||
|
const fetchList = () => { |
||||
|
const params = { |
||||
|
pageNum: pageNum.value, |
||||
|
pageSize: pageSize.value, |
||||
|
hasEvaluate: 1, |
||||
|
}; |
||||
|
queryEvaluateList(params, (res) => { |
||||
|
if (res.code === 200) { |
||||
|
const rows = res.rows || res.data?.rows || res.data?.list || res.data || []; |
||||
|
const total = res.total ?? res.data?.total ?? 0; |
||||
|
|
||||
|
if (refreshing.value) { |
||||
|
list.value = Array.isArray(rows) ? rows : []; |
||||
|
refreshing.value = false; |
||||
|
} else { |
||||
|
list.value = [...list.value, ...(Array.isArray(rows) ? rows : [])]; |
||||
|
} |
||||
|
|
||||
|
if (!Array.isArray(rows) || rows.length === 0 || list.value.length >= total) { |
||||
|
finished.value = true; |
||||
|
} else { |
||||
|
pageNum.value++; |
||||
|
} |
||||
|
loading.value = false; |
||||
|
} else { |
||||
|
finished.value = true; |
||||
|
loading.value = false; |
||||
|
refreshing.value = false; |
||||
|
showToast(res.msg || '加载失败'); |
||||
|
} |
||||
|
}, () => { |
||||
|
finished.value = true; |
||||
|
loading.value = false; |
||||
|
refreshing.value = false; |
||||
|
showToast('网络请求失败'); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
// ========== 触底加载 ========== |
||||
|
const onLoad = () => { |
||||
|
if (refreshing.value) return; |
||||
|
fetchList(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 下拉刷新 ========== |
||||
|
const onRefresh = () => { |
||||
|
pageNum.value = 1; |
||||
|
list.value = []; |
||||
|
finished.value = false; |
||||
|
loading.value = true; |
||||
|
fetchList(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 跳转详情页面 ========== |
||||
|
const toDetail = (item) => { |
||||
|
router.push({ |
||||
|
path: '/enforcement/enforcementEvaluateDetail', |
||||
|
query: { id: item.id, hasEvaluate: 1, from: 'evaluateList' } |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
// ========== 返回上一页 ========== |
||||
|
const onClickLeft = () => { |
||||
|
router.back(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 组件挂载时加载数据 ========== |
||||
|
onMounted(() => { |
||||
|
fetchList(); |
||||
|
}); |
||||
|
</script> |
||||
|
|
||||
|
<style lang="less" scoped> |
||||
|
.evaluate-list-page { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
height: 100%; |
||||
|
background-color: #f5f5f5; |
||||
|
} |
||||
|
|
||||
|
/* ===== 导航栏样式 ===== */ |
||||
|
:deep(.van-nav-bar) { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar__title) { |
||||
|
font-size: 17px; |
||||
|
font-weight: 600; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar__text) { |
||||
|
font-size: 15px; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar .van-icon) { |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
/* ===== 列表容器 ===== */ |
||||
|
.list-container { |
||||
|
flex: 1; |
||||
|
overflow-y: auto; |
||||
|
padding: 15px; |
||||
|
} |
||||
|
|
||||
|
/* ===== 卡片样式 ===== */ |
||||
|
.evaluate-card { |
||||
|
background: #fff; |
||||
|
border-radius: 10px; |
||||
|
padding: 15px; |
||||
|
margin-bottom: 15px; |
||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); |
||||
|
} |
||||
|
|
||||
|
.card-time { |
||||
|
font-size: 12px; |
||||
|
color: #999; |
||||
|
margin-bottom: 10px; |
||||
|
} |
||||
|
|
||||
|
.card-title { |
||||
|
font-size: 16px; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
margin-bottom: 15px; |
||||
|
line-height: 1.4; |
||||
|
} |
||||
|
|
||||
|
.card-content { |
||||
|
border-top: 1px dashed #e5e5e5; |
||||
|
padding-top: 15px; |
||||
|
} |
||||
|
|
||||
|
.info-row { |
||||
|
display: flex; |
||||
|
margin-bottom: 10px; |
||||
|
font-size: 14px; |
||||
|
|
||||
|
.label { |
||||
|
color: #999; |
||||
|
min-width: 80px; |
||||
|
} |
||||
|
|
||||
|
.enforcer-item { |
||||
|
padding: 4px 0px; |
||||
|
} |
||||
|
|
||||
|
.value { |
||||
|
flex: 1; |
||||
|
color: #333; |
||||
|
word-break: break-all; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.card-footer { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
margin-top: 15px; |
||||
|
padding-top: 15px; |
||||
|
border-top: 1px dashed #e5e5e5; |
||||
|
font-size: 13px; |
||||
|
color: #666; |
||||
|
|
||||
|
.status { |
||||
|
.status-pending { |
||||
|
color: #faad14; |
||||
|
} |
||||
|
|
||||
|
.status-evaluated { |
||||
|
color: #52c41a; |
||||
|
} |
||||
|
|
||||
|
.status-rejected { |
||||
|
color: #f5222d; |
||||
|
} |
||||
|
|
||||
|
.status-default { |
||||
|
color: #999; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.evaluate-time { |
||||
|
color: #999; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* ===== 空状态样式 ===== */ |
||||
|
:deep(.van-empty) { |
||||
|
padding: 60px 0; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,297 @@ |
|||||
|
<template> |
||||
|
<div class="plan-notice-page"> |
||||
|
<!-- 顶部导航栏 --> |
||||
|
<van-nav-bar title="计划通知" left-text="返回" left-arrow @click-left="onClickLeft"> |
||||
|
</van-nav-bar> |
||||
|
|
||||
|
<!-- 搜索栏 --> |
||||
|
<div class="search-bar"> |
||||
|
<van-search v-model="searchText" show-action placeholder="请输入计划名称/单位" clearable clear-icon="clear" |
||||
|
clear-trigger="always" @clear="onClear" @search="onSearch"> |
||||
|
<template #action> |
||||
|
<div @click="onSearch">搜索</div> |
||||
|
</template> |
||||
|
</van-search> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 列表区域 --> |
||||
|
<div class="list-container"> |
||||
|
<van-pull-refresh v-model="refreshing" @refresh="onRefresh"> |
||||
|
<van-list v-model:loading="loading" :finished="finished" finished-text="已全部加载" @load="onLoad" |
||||
|
:offset="50"> |
||||
|
<van-empty v-if="finished && list.length === 0" description="暂无计划通知" /> |
||||
|
|
||||
|
<div class="plan-card" v-for="item in list" :key="item.id"> |
||||
|
<div class="card-header"> |
||||
|
<van-icon name="bell" class="bell-icon" /> |
||||
|
<span class="plan-title">{{ item.checkItemText || item.checkItem }}</span> |
||||
|
</div> |
||||
|
<div class="card-content"> |
||||
|
<div class="info-row"> |
||||
|
<span class="label">执法单位:</span> |
||||
|
<span class="value">{{ item.bureauDeptName || item.lawEnforcement }}</span> |
||||
|
</div> |
||||
|
<div class="info-row"> |
||||
|
<span class="label">执法区域:</span> |
||||
|
<span class="value">{{ item.unitCheck }}</span> |
||||
|
</div> |
||||
|
<div class="info-row"> |
||||
|
<span class="label">发布时间:</span> |
||||
|
<span class="value">{{ item.checkTime }}</span> |
||||
|
</div> |
||||
|
<div class="info-row"> |
||||
|
<span class="label">附件:</span> |
||||
|
<span class="value"></span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</van-list> |
||||
|
</van-pull-refresh> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="planNoticeList"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
import { useRouter } from 'vue-router'; |
||||
|
import { showToast } from 'vant'; |
||||
|
import 'vant/es/toast/style'; |
||||
|
import { getLawNoticeList } from '@/api/enforcement/index'; |
||||
|
|
||||
|
const router = useRouter(); |
||||
|
|
||||
|
// ========== 列表状态 ========== |
||||
|
const list = ref([]); |
||||
|
const loading = ref(false); |
||||
|
const finished = ref(false); |
||||
|
const refreshing = ref(false); |
||||
|
const searchText = ref(''); |
||||
|
const pageNum = ref(1); |
||||
|
const pageSize = ref(10); |
||||
|
|
||||
|
// ========== 加载数据 ========== |
||||
|
const fetchList = () => { |
||||
|
const params = { |
||||
|
pageNum: pageNum.value, |
||||
|
pageSize: pageSize.value, |
||||
|
planName: searchText.value || undefined, |
||||
|
}; |
||||
|
getLawNoticeList(params, (res) => { |
||||
|
if (res.code === 200) { |
||||
|
const rows = res.rows || []; |
||||
|
const total = res.total; |
||||
|
|
||||
|
if (refreshing.value) { |
||||
|
list.value = Array.isArray(rows) ? rows : []; |
||||
|
refreshing.value = false; |
||||
|
} else { |
||||
|
list.value = [...list.value, ...(Array.isArray(rows) ? rows : [])]; |
||||
|
} |
||||
|
|
||||
|
if (!Array.isArray(rows) || rows.length === 0 || list.value.length >= total) { |
||||
|
finished.value = true; |
||||
|
} else { |
||||
|
pageNum.value++; |
||||
|
} |
||||
|
loading.value = false; |
||||
|
} else { |
||||
|
finished.value = true; |
||||
|
loading.value = false; |
||||
|
refreshing.value = false; |
||||
|
showToast(res.msg || '加载失败'); |
||||
|
} |
||||
|
}, () => { |
||||
|
finished.value = true; |
||||
|
loading.value = false; |
||||
|
refreshing.value = false; |
||||
|
showToast('网络请求失败'); |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
// ========== 触底加载 ========== |
||||
|
const onLoad = () => { |
||||
|
if (refreshing.value) return; |
||||
|
fetchList(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 下拉刷新 ========== |
||||
|
const onRefresh = () => { |
||||
|
pageNum.value = 1; |
||||
|
list.value = []; |
||||
|
finished.value = false; |
||||
|
loading.value = true; |
||||
|
fetchList(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 清除搜索 ========== |
||||
|
const onClear = () => { |
||||
|
searchText.value = ''; |
||||
|
onSearch(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 搜索 ========== |
||||
|
const onSearch = () => { |
||||
|
pageNum.value = 1; |
||||
|
list.value = []; |
||||
|
finished.value = false; |
||||
|
loading.value = true; |
||||
|
fetchList(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 返回上一页 ========== |
||||
|
const onClickLeft = () => { |
||||
|
router.back(); |
||||
|
}; |
||||
|
|
||||
|
// ========== 组件挂载时加载数据 ========== |
||||
|
onMounted(() => { |
||||
|
// fetchList(); |
||||
|
}); |
||||
|
</script> |
||||
|
|
||||
|
<style lang="less" scoped> |
||||
|
.plan-notice-page { |
||||
|
height: 100%; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
background-color: #ebf3fb; |
||||
|
} |
||||
|
|
||||
|
/* ===== 导航栏样式 ===== */ |
||||
|
:deep(.van-nav-bar) { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar__title) { |
||||
|
font-size: 17px; |
||||
|
font-weight: 600; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar__text) { |
||||
|
font-size: 15px; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-nav-bar .van-icon) { |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
/* ===== 搜索栏样式 ===== */ |
||||
|
:deep(.van-search) { |
||||
|
background: #fff; |
||||
|
padding: 12px 16px; |
||||
|
margin-bottom: -1px; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-search__content) { |
||||
|
height: 0.9rem; |
||||
|
border: 1px solid #ececec; |
||||
|
border-radius: 0.15rem 0 0 0.15rem; |
||||
|
} |
||||
|
|
||||
|
:deep(.van-search__action) { |
||||
|
margin: 0 3% 0 0; |
||||
|
width: 10%; |
||||
|
height: 0.9rem; |
||||
|
background: #1367fe; |
||||
|
border: 1px solid #1367fe; |
||||
|
border-radius: 0 0.15rem 0.15rem 0; |
||||
|
color: #fff; |
||||
|
text-align: center; |
||||
|
line-height: 0.9rem; |
||||
|
} |
||||
|
|
||||
|
/* ===== 列表容器 ===== */ |
||||
|
.list-container { |
||||
|
flex: 1; |
||||
|
overflow-y: auto; |
||||
|
position: relative; |
||||
|
padding-bottom: 60px; |
||||
|
margin: 10px; |
||||
|
} |
||||
|
|
||||
|
/* ===== 卡片样式 ===== */ |
||||
|
.plan-card { |
||||
|
background: #fff; |
||||
|
border-radius: 10px; |
||||
|
padding: 15px; |
||||
|
margin-bottom: 15px; |
||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); |
||||
|
} |
||||
|
|
||||
|
.card-header { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 12px; |
||||
|
} |
||||
|
|
||||
|
.bell-icon { |
||||
|
color: #2d94fa; |
||||
|
font-size: 18px; |
||||
|
margin-right: 8px; |
||||
|
} |
||||
|
|
||||
|
.plan-title { |
||||
|
font-size: 16px; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
flex: 1; |
||||
|
line-height: 1.4; |
||||
|
} |
||||
|
|
||||
|
.card-content { |
||||
|
padding-left: 28px; |
||||
|
} |
||||
|
|
||||
|
.info-row { |
||||
|
display: flex; |
||||
|
margin-bottom: 8px; |
||||
|
font-size: 14px; |
||||
|
color: #666; |
||||
|
line-height: 1.6; |
||||
|
|
||||
|
.label { |
||||
|
color: #000; |
||||
|
min-width: 80px; |
||||
|
} |
||||
|
|
||||
|
.value { |
||||
|
flex: 1; |
||||
|
color: #999; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.attachments { |
||||
|
margin-top: 8px; |
||||
|
} |
||||
|
|
||||
|
.attachment-item { |
||||
|
display: flex; |
||||
|
font-size: 14px; |
||||
|
color: #666; |
||||
|
line-height: 1.6; |
||||
|
|
||||
|
.label { |
||||
|
color: #999; |
||||
|
min-width: 80px; |
||||
|
} |
||||
|
|
||||
|
.attachment-link { |
||||
|
flex: 1; |
||||
|
color: #2d94fa; |
||||
|
text-decoration: underline; |
||||
|
word-break: break-all; |
||||
|
} |
||||
|
|
||||
|
.no-attachment { |
||||
|
flex: 1; |
||||
|
color: #999; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
/* ===== 空状态样式 ===== */ |
||||
|
:deep(.van-empty) { |
||||
|
padding: 60px 0; |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue