移动端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

245 lines
6.2 KiB

<template>
<!-- 政策法规列表页面容器 -->
<view class="policy-container">
<!-- 搜索框区域 -->
<view class="search-box">
<van-search
:value="abc"
placeholder="输入关键字查询"
id="sreach"
@clear="handleClear"
@change="handleSearch"
/>
</view>
<!-- 政策法规列表区域 -->
<!-- 修改列表项部分 -->
<view class="policy-list">
<scroll-view
class="policy-scroll"
scroll-y
@scrolltolower="loadNextPage"
@refresherrefresh="onRefresh"
refresher-enabled
:refresher-triggered="isRefreshing"
>
<view
class="policy-item"
v-for="item in policyList"
:key="item.id"
@click="handlePolicyClick(item)"
>
<view class="item-left">
<image
src="@/static/images/owner/policy.png"
class="policy-icon"
mode="aspectFit"
></image>
</view>
<view class="item-right">
<view class="policy-title">
{{ item.title }}
</view>
<view class="policy-time">
生效时间: {{ item.effectiveDate }}
</view>
</view>
</view>
</scroll-view>
</view>
<!-- 加载更多状态组件 -->
<uni-load-more :status="loadMoreStatus" />
</view>
</template>
<script>
import { PolicyApi, formatPolicyContext } from '@/api/policy/index.js'
import { formatDate } from '@/utils/ruoyi.js'
import config from '@/config'
export default {
data() {
return {
isRefreshing: false, // 是否正在刷新
searchValue: '', // 搜索关键字
abc: '',
policyList: [], // 政策法规列表数据
pageNum: 1, // 当前页码
pageSize: 10, // 每页显示条数
total: 0, // 总数据条数
loadMoreStatus: 'more' // 加载更多状态:more-加载前 loading-加载中 noMore-没有更多
}
},
// 页面加载时获取列表数据
onShow() {
this.getPolicyList()
},
methods: {
// 下拉刷新
onRefresh() {
this.isRefreshing = true
this.pageNum = 1
this.getPolicyList()
},
loadNextPage() {
console.log('列表值', this.policyList.length)
if (this.policyList.length < this.total) {
this.pageNum++
this.getPolicyList()
}
},
// 获取政策法规列表数据
async getPolicyList() {
try {
console.log('PolicyApi', this.searchValue)
this.loadMoreStatus = 'loading'
const res = await PolicyApi.getPolicyPage({
pageNum: this.pageNum,
pageSize: this.pageSize,
name: this.searchValue // 搜索关键字
})
if (res.code === 0 && res.data.total > 0) {
// 限制标题长度,超出显示省略号
const formattedData = res.data.list.map(item => ({
...item,
title:
item.name.length > 15
? item.name.slice(0, 15) + '...'
: item.name,
effectiveDate: formatDate(item.effectiveDate, 'YYYY年MM月DD日')
}))
// 判断是首次加载还是加载更多
if (this.pageNum === 1) {
this.policyList = formattedData
} else {
this.policyList = [...this.policyList, ...formattedData]
}
console.log('列表信息', res)
this.total = res.data.total
// 更新加载状态
this.loadMoreStatus =
this.policyList.length >= this.total ? 'noMore' : 'more'
}
} catch (error) {
console.error(error)
this.loadMoreStatus = 'more'
uni.showToast({
title: '获取列表失败',
icon: 'none'
})
} finally {
this.loadMoreStatus =
this.policyList.length >= this.total ? 'noMore' : 'more'
// 无论成功失败都关闭刷新状态
// 确保在数据加载完成后关闭刷新状态
setTimeout(() => {
this.isRefreshing = false
}, 300) // 添加短暂延时,确保动画效果完整
}
},
// 搜索事件处理
handleSearch(e) {
if (e.detail && e.detail.length > 1) {
this.pageNum = 1 // 重置页码
this.searchValue = e.detail // 更新搜索关键字
this.getPolicyList()
}
},
// 清除搜索事件处理
handleClear() {
this.pageNum = 1 // 重置页码
this.searchValue = '' // 清空搜索关键字
this.getPolicyList()
},
// 点击政策条目跳转详情
handlePolicyClick(item) {
uni.navigateTo({
url: `/sub/owner/policy-detail?id=${item.id}`
})
}
}
}
</script>
<style lang="scss">
.policy-container {
background: var(--LightMode-Secondary-Secondary, #f9f9f9);
min-height: 100vh;
display: flex;
flex-direction: column;
.search-box {
padding: 20rpx;
background: #fff;
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1;
}
.policy-list {
margin-top: 120rpx; // 为搜索框留出空间
flex: 1;
.policy-scroll {
height: calc(100vh - 120rpx);
box-sizing: border-box;
padding-top: 24rpx;
}
.policy-item {
display: flex;
padding: 24rpx;
align-items: center;
gap: 24rpx;
background: #fff;
margin: 24rpx;
margin-bottom: 0;
border-radius: 16rpx;
border-bottom: 2rpx solid var(--LightMode-Grey-Grey-100, #f9f9f9);
.item-left {
border-radius: 100rpx;
background: var(--LightMode-Grey-Grey-100, #f9f9f9);
padding: 16rpx;
display: flex;
justify-content: center;
align-items: center;
.policy-icon {
width: 40rpx;
height: 40rpx;
flex-shrink: 0;
}
}
.item-right {
flex: 1;
overflow: hidden;
.policy-title {
font-weight: bold;
margin-bottom: 8rpx;
font-size: 28rpx;
color: #333;
line-height: 1.4;
}
.policy-time {
font-size: 24rpx;
color: #999;
line-height: 1.2;
}
}
}
}
}
// 加载更多组件样式
::v-deep .uni-load-more {
padding: 24rpx 0;
}
</style>