|
|
|
<template>
|
|
|
|
<view class="container">
|
|
|
|
<!-- Tab 切换 -->
|
|
|
|
<view class="tab-container">
|
|
|
|
<view
|
|
|
|
v-for="tab in tabs"
|
|
|
|
:key="tab.label"
|
|
|
|
class="tab-item"
|
|
|
|
:class="{ active: queryParams.templateId === tab.label }"
|
|
|
|
@tap="switchTab(tab.label)"
|
|
|
|
>
|
|
|
|
<text>
|
|
|
|
{{ $dict.echoDicValue(dictMap.notfy_message_type, tab.label) }}
|
|
|
|
</text>
|
|
|
|
<text v-if="tab.value > 0" class="badge">{{ tab.value }}</text>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<!-- 列表内容 -->
|
|
|
|
<scroll-view
|
|
|
|
class="scroll-container"
|
|
|
|
scroll-y
|
|
|
|
@scrolltolower="loadMore"
|
|
|
|
@refresherrefresh="onRefresh"
|
|
|
|
refresher-enabled
|
|
|
|
:refresher-triggered="isRefreshing"
|
|
|
|
>
|
|
|
|
<view
|
|
|
|
v-for="(item, index) in list"
|
|
|
|
:key="index"
|
|
|
|
:class="['notice-item', !item.readStatus ? 'is-read' : '']"
|
|
|
|
@tap="goDetail(item)"
|
|
|
|
>
|
|
|
|
<view :class="['notice-icon', !item.readStatus ? 'green' : '']">
|
|
|
|
<image
|
|
|
|
:src="
|
|
|
|
!item.readStatus
|
|
|
|
? '/static/images/owner/message.png'
|
|
|
|
: '/static/images/owner/message-grey.png'
|
|
|
|
"
|
|
|
|
mode="aspectFill"
|
|
|
|
></image>
|
|
|
|
</view>
|
|
|
|
<view class="notice-content">
|
|
|
|
<view class="notice-title">
|
|
|
|
{{ item.templateParams.title }}
|
|
|
|
</view>
|
|
|
|
<view class="notice-time" v-if="item.templateParams.startTime">
|
|
|
|
{{
|
|
|
|
`${$util.formatDate(
|
|
|
|
item.templateParams.startTime,
|
|
|
|
'YYYY年M月D日'
|
|
|
|
)} -
|
|
|
|
${$util.formatDate(
|
|
|
|
item.templateParams.endTime,
|
|
|
|
'YYYY年M月D日'
|
|
|
|
)}`
|
|
|
|
}}
|
|
|
|
</view>
|
|
|
|
<view class="notice-time" v-else>
|
|
|
|
{{
|
|
|
|
`到期时间
|
|
|
|
${$util.formatDate(item.templateParams.endTime, 'YYYY年M月D日')}`
|
|
|
|
}}
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="notice-arrow">
|
|
|
|
<text class="iconfont icon-right"></text>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<cs-emty v-if="list.length == 0" :marginTop="24"></cs-emty>
|
|
|
|
</scroll-view>
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import { getDictBatchByType } from '@/api/system/dict.js'
|
|
|
|
import { NoticApi } from '@/api/common/notic.js'
|
|
|
|
export default {
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
tabs: [],
|
|
|
|
queryParams: {
|
|
|
|
templateId: 0,
|
|
|
|
pageSize: 6,
|
|
|
|
pageNo: 1
|
|
|
|
},
|
|
|
|
list: [],
|
|
|
|
dictMap: {},
|
|
|
|
isRefreshing: false,
|
|
|
|
hasMore: true // 添加是否有更多数据的标志
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
onLoad() {
|
|
|
|
this.getDict()
|
|
|
|
// this.getTabber()
|
|
|
|
},
|
|
|
|
onShow() {
|
|
|
|
this.getTabber()
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
async getDict() {
|
|
|
|
const dict = await getDictBatchByType({
|
|
|
|
type: ['notfy_message_type'].join(',')
|
|
|
|
})
|
|
|
|
this.dictMap = {
|
|
|
|
...dict.data
|
|
|
|
}
|
|
|
|
},
|
|
|
|
async getTabber() {
|
|
|
|
const res = await NoticApi.getTabData()
|
|
|
|
this.tabs = res.data
|
|
|
|
this.queryParams.templateId = res.data[0].label
|
|
|
|
this.getList()
|
|
|
|
},
|
|
|
|
switchTab(index) {
|
|
|
|
if (this.queryParams.templateId === index) return
|
|
|
|
this.queryParams.templateId = index
|
|
|
|
this.queryParams.pageNo = 1
|
|
|
|
this.list = []
|
|
|
|
this.getList()
|
|
|
|
},
|
|
|
|
async getList() {
|
|
|
|
const res = await NoticApi.getListData(this.queryParams)
|
|
|
|
this.list = res.data.list
|
|
|
|
if (this.list.length == res.data.total) {
|
|
|
|
this.hasMore = false
|
|
|
|
}
|
|
|
|
},
|
|
|
|
async loadMore() {
|
|
|
|
if (!this.hasMore) return // 没有更多数据时不再加载
|
|
|
|
this.queryParams.pageNo++
|
|
|
|
await this.getList()
|
|
|
|
},
|
|
|
|
async onRefresh() {
|
|
|
|
try {
|
|
|
|
this.isRefreshing = true
|
|
|
|
this.queryParams.pageNo = 1
|
|
|
|
await this.getList()
|
|
|
|
} finally {
|
|
|
|
this.isRefreshing = false
|
|
|
|
}
|
|
|
|
},
|
|
|
|
goDetail(item) {
|
|
|
|
// 跳转到详情页
|
|
|
|
uni.navigateTo({
|
|
|
|
url: item.templateParams.url,
|
|
|
|
success() {
|
|
|
|
NoticApi.readNotic(item.id)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
.tab-container {
|
|
|
|
display: flex;
|
|
|
|
flex-flow: row now;
|
|
|
|
max-width: 100%;
|
|
|
|
overflow-x: scroll;
|
|
|
|
background: #fff;
|
|
|
|
padding: 24rpx 32rpx;
|
|
|
|
gap: 24rpx;
|
|
|
|
border-bottom: 2rpx solid var(--LightMode-Grey-Grey-100, #f9f9f9);
|
|
|
|
.tab-item {
|
|
|
|
flex: 1;
|
|
|
|
text-align: center;
|
|
|
|
position: relative;
|
|
|
|
padding: 16rpx 0;
|
|
|
|
color: #4b5675;
|
|
|
|
background: #f9f9f9;
|
|
|
|
border-radius: 240rpx;
|
|
|
|
&.active {
|
|
|
|
color: #07c160;
|
|
|
|
background: rgba(7, 193, 96, 0.1);
|
|
|
|
font-weight: bold;
|
|
|
|
}
|
|
|
|
|
|
|
|
.badge {
|
|
|
|
margin-left: 8rpx;
|
|
|
|
color: #07c160;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.scroll-container {
|
|
|
|
box-sizing: border-box;
|
|
|
|
height: calc(100vh - 124rpx);
|
|
|
|
padding: 0 24rpx;
|
|
|
|
}
|
|
|
|
|
|
|
|
.notice-item {
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
padding: 32rpx 24rpx;
|
|
|
|
border-radius: 16rpx;
|
|
|
|
border: 2rpx solid #f9f9f9;
|
|
|
|
background: #fff;
|
|
|
|
color: #4b5675;
|
|
|
|
margin-top: 24rpx;
|
|
|
|
&:last-child {
|
|
|
|
margin-bottom: 48rpx;
|
|
|
|
}
|
|
|
|
.notice-icon {
|
|
|
|
padding: 16rpx;
|
|
|
|
border-radius: 50%;
|
|
|
|
background-color: #f9f9f9;
|
|
|
|
box-sizing: border-box;
|
|
|
|
margin-right: 24rpx;
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
image {
|
|
|
|
width: 40rpx;
|
|
|
|
height: 40rpx;
|
|
|
|
flex-shrink: 0;
|
|
|
|
z-index: 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.green {
|
|
|
|
background-color: #eafff1;
|
|
|
|
}
|
|
|
|
.notice-content {
|
|
|
|
flex: 1;
|
|
|
|
|
|
|
|
.notice-title {
|
|
|
|
margin-bottom: 10rpx;
|
|
|
|
font-weight: bold;
|
|
|
|
max-width: 486rpx;
|
|
|
|
overflow: hidden;
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
white-space: nowrap;
|
|
|
|
}
|
|
|
|
|
|
|
|
.notice-time {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.notice-arrow {
|
|
|
|
color: #c4cada;
|
|
|
|
font-size: 24rpx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.is-read {
|
|
|
|
color: #071437;
|
|
|
|
}
|
|
|
|
</style>
|