wutong 4b83a95d2e fix: 修改未来到家以及我的社区的部分内容修订
- 未来到家:金刚区图标去底块并对齐首页尺寸;瀑布流默认展示全部小类商品
- 我的社区:岁银改临时事件并扩充各分类假数据;公告改资讯卡样式(阅读数+更新时间);
  轮播/横幅统一 300rpx 圆角、指示点右下角;tab 去灰底改红色横杠;默认页轮播换新图
- 首页:金刚区间距加大;推荐 tab 改为附近;扫一扫按钮转红色系;清理遗留 console.log

Claude-Session: https://claude.ai/code/session_01WQrg6u9Cp9sFPLF6vmbJDq
2026-07-08 18:17:12 +08:00

934 lines
31 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="container">
<!-- <view class="empty" v-if="communityList.length == 0">
<image src="https://static.hshuishang.com/property-img-file/com_newEmpty.png" alt="" />
<text>当前账户未绑定任何项目房源信息</text>
<button class="emptyBtn" @click="addCommunity">新增房产绑定</button>
</view> -->
<view v-if="communityList.length == 0">
<view class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }">
<view class="back-btn" v-if="showBack" @tap="goBack">
<u-icon name="arrow-left" color="#333" size="40"></u-icon>
</view>
<view class="searchBox_add">
<view class="emptyCommunity" @click="addCommunity">
{{ communityVal }}
</view>
</view>
</view>
<view class="swiperBox_no1">
<swiper @animationfinish="swipers" autoplay circular>
<swiper-item v-for="(img, index) in defaultBannerImgs" :key="index">
<image :src="img" mode="aspectFill" class="swiperBox_no_img" @click="addCommunity" />
</swiper-item>
</swiper>
<view class="dot">
<view :class="['dotItem', currentIdx == index ? 'active' : '']" v-for="(item, index) in defaultBannerImgs"
:key="index">
</view>
</view>
</view>
<!-- 金刚区与「消费送物业费」广告互换:金刚区在上、广告在下(与已绑定状态一致) -->
<view class="funcList">
<u-grid :col="5" :border="false">
<u-grid-item v-for="(item, index) in noValFunctionList" @click="addCommunity" :key="index">
<image class="grid_Pic" :src="item.nav_icon" mode=""></image>
<text class="grid_Text">{{ item.nav_name }}</text>
</u-grid-item>
</u-grid>
</view>
<view class="swiperBox_no2">
<!-- 横幅轮播无指示点,不绑 animationfinish避免污染顶部轮播的 currentIdx -->
<swiper autoplay circular>
<swiper-item v-for="(img, index) in defaultStreamerImgs" :key="index">
<image :src="img" mode="aspectFill" class="swiperBox_no_img" @click="addCommunity" />
</swiper-item>
</swiper>
</view>
<view class="tabs" v-if="defaultCategoryList.length > 0">
<view v-for="(item, index) in defaultCategoryList" :key="index"
:class="['tabItem', selectedTab === index ? 'active2' : '']" @click="selectTab(index, item)">
{{ item.category_name }}
</view>
</view>
<!-- 宣传栏:图左 + 标题/预览 + 底部阅读数与更新时间(未绑定用假数据) -->
<view class="newsList" v-if="defaultCategoryList.length > 0">
<view class="newsItemL" v-for="item in defaultInfoList" @click="defaultDetail(item)" :key="item.id">
<view class="newsItemL_pic">
<image :src="item.pic" mode="aspectFill" />
</view>
<view class="newsItemL_body">
<view class="newsItemL_tit">{{ item.title }}</view>
<view class="newsItemL_desc">{{ contentPreview(item.id) }}</view>
<view class="newsItemL_meta">
<view class="newsItemL_reads" v-if="newsReads(item)">
<u-icon name="eye" color="#9a9fa8" size="26"></u-icon>
<text>{{ newsReads(item) }}次阅读</text>
</view>
<text class="newsItemL_time" v-if="newsTime(item)">更新于 {{ newsTime(item) }}</text>
</view>
</view>
</view>
</view>
</view>
<view v-else>
<view class="searchBox" :style="{ height: localHeight + 'px', paddingTop: top + 'px' }">
<view class="back-btn" v-if="showBack" @tap="goBack">
<u-icon name="arrow-left" color="#333" size="40"></u-icon>
</view>
<view class="searchBox_add">
<view class="emptyCommunity" @click="addCommunity">
{{ communityVal }}
</view>
</view>
</view>
<view class="swiperBox1" v-if="bannerList.length > 0">
<swiper @animationfinish="swipers" autoplay circular>
<swiper-item v-for="(item, index) in bannerList" :key="index" @click="headerServerClick(item)">
<image :src="item.ad_picture" mode="aspectFill" />
</swiper-item>
</swiper>
<view class="dot">
<view :class="['dotItem', currentIdx == index ? 'active' : '']" v-for="(item, index) in bannerList"
:key="index">
</view>
</view>
</view>
<view class="swiperBox_no1" v-else>
<swiper @animationfinish="swipers" autoplay circular>
<swiper-item v-for="(img, index) in defaultBannerImgs" :key="index">
<image :src="img" mode="aspectFill" class="swiperBox_no_img" />
</swiper-item>
</swiper>
<view class="dot">
<view :class="['dotItem', currentIdx == index ? 'active' : '']" v-for="(item, index) in defaultBannerImgs"
:key="index">
</view>
</view>
</view>
<!-- 金刚区(与「消费送物业费」广告互换:金刚区在上,广告在下) -->
<view class="funcList">
<u-grid :col="rowNum" :border="false">
<u-grid-item v-for="(item, index) in functionList" @click="jump(item.mini_program_url)" :key="index">
<image class="grid_Pic" :src="item.nav_icon" mode=""></image>
<text class="grid_Text">{{ item.nav_name }}</text>
</u-grid-item>
</u-grid>
</view>
<view class="swiperBox2" v-if="streamerList.length > 0">
<!-- 横幅轮播无指示点,不绑 animationfinish避免污染顶部轮播的 currentIdx -->
<swiper autoplay circular>
<swiper-item v-for="(item, index) in streamerList" :key="index" @click="headerServerClick(item)">
<image :src="item.ad_picture" mode="aspectFill" class="swiperBox2_img" />
</swiper-item>
</swiper>
</view>
<view class="swiperBox_no2" v-else>
<!-- 横幅轮播无指示点,不绑 animationfinish避免污染顶部轮播的 currentIdx -->
<swiper autoplay circular>
<swiper-item v-for="(img, index) in defaultStreamerImgs" :key="index">
<image :src="img" mode="aspectFill" class="swiperBox_no_img" />
</swiper-item>
</swiper>
</view>
<view v-for="(item, index) in tileList" :key="index" :class="['ads', index == 0 ? 'ads_first' : '']"
@click="headerServerClick(item)">
<image :src="item.ad_picture" mode="aspectFill" />
</view>
<view class="tabs" v-if="categoryList.length > 0">
<view v-for="(item, index) in categoryList" :key="index"
:class="['tabItem', selectedTab === index ? 'active2' : '']" @click="selectTab(index, item)">
{{ item.category_name }}
</view>
</view>
<view class="tabs" v-else>
<view v-for="(item, index) in defaultCategoryList" :key="index"
:class="['tabItem', selectedTab === index ? 'active2' : '']" @click="selectTab(index, item)">
{{ item.category_name }}
</view>
</view>
<!-- 已绑定:通知列表,图左 + 标题/预览 + 底部阅读数与更新时间(与未绑定同形式) -->
<view class="newsList" v-if="categoryList.length > 0">
<view class="newsItemL" v-for="item in infoList" @click="detail(item)" :key="item.id">
<view class="newsItemL_pic">
<image :src="item.list_image" mode="aspectFill" />
</view>
<view class="newsItemL_body">
<view class="newsItemL_tit">{{ item.title }}</view>
<view class="newsItemL_desc">{{ noticePreview(item) }}</view>
<view class="newsItemL_meta">
<view class="newsItemL_reads" v-if="newsReads(item)">
<u-icon name="eye" color="#9a9fa8" size="26"></u-icon>
<text>{{ newsReads(item) }}次阅读</text>
</view>
<text class="newsItemL_time" v-if="newsTime(item)">更新于 {{ newsTime(item) }}</text>
</view>
</view>
</view>
</view>
<view class="newsList" v-else>
<view class="newsItemL" v-for="item in defaultInfoList" @click="defaultDetail(item)" :key="item.id">
<view class="newsItemL_pic">
<image :src="item.pic" mode="aspectFill" />
</view>
<view class="newsItemL_body">
<view class="newsItemL_tit">{{ item.title }}</view>
<view class="newsItemL_desc">{{ contentPreview(item.id) }}</view>
<view class="newsItemL_meta">
<view class="newsItemL_reads" v-if="newsReads(item)">
<u-icon name="eye" color="#9a9fa8" size="26"></u-icon>
<text>{{ newsReads(item) }}次阅读</text>
</view>
<text class="newsItemL_time" v-if="newsTime(item)">更新于 {{ newsTime(item) }}</text>
</view>
</view>
</view>
</view>
<view class="tips">{{ loadMoreText }}</view>
<view class="bigAds" v-if="ads1Show">
<view class="bigAdsCon">
<view class="bigAdsCon_img">
<swiper @animationfinish="swipers" autoplay circular>
<swiper-item v-for="(item, index) in largePopList" :key="index" @click="headerServerClick(item)">
<image :src="item.ad_picture" mode="aspectFill" />
</swiper-item>
</swiper>
</view>
<view class="close" @click="closeAds">
<image src="https://static.hshuishang.com/property-img-file/com_close.png">
</image>
</view>
</view>
</view>
<view class="bigAds" v-if="ads2Show">
<view class="bigAdsCon2">
<view class="bigAdsCon2_img">
<swiper :current="currentSwiperIndex" @change="onSwiperChange" @animationfinish="swipers" autoplay circular>
<swiper-item v-for="(item, index) in popList" :key="index">
<image :src="item.ad_picture" mode="aspectFill" />
</swiper-item>
</swiper>
</view>
<view class="AdsBtnList">
<view class="AdsBtnItem1" @click="closeAds2">取消</view>
<view class="AdsBtnItem2" @click="onDetailClick">了解详情</view>
</view>
</view>
</view>
</view>
<nav-footer :current="3" />
</view>
</template>
<script>
import {
request,
picUrl,
uniqueByField,
menuButtonInfo,
NavgateTo,
} from "../../../utils";
import { apiArr } from "../../../api/v2Community";
import { apiArr as apiArr2 } from "../../../api/community";
// 引入数据文件
import dataJson from './data.json';
export default {
data() {
return {
communityVal: "添加我的房产",
picUrl,
top: "",
localHeight: "",
showBack: false, // 有上级页面时(如从未来社区「我的房屋」跳入)显示返回按钮作为底部tab进入时不显示
queryPage: {
page_num: 1,
page_size: 10,
},
communityList: [],
flag: false,
defaultFunctionList: [],
functionList: [],
noValFunctionList: [
{
nav_icon: 'https://static.hshuishang.com/noValFunction1.png',
nav_name: "物业介绍",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction2.png',
nav_name: "物业缴费",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction3.png',
nav_name: "岁银",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction1.png',
nav_name: "物业报修",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction4.png',
nav_name: "便民电话",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction5.png',
nav_name: "人脸门禁",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction6.png',
nav_name: "手机开门",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction7.png',
nav_name: "物业活动",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction8.png',
nav_name: "访客邀请",
},
{
nav_icon: 'https://static.hshuishang.com/noValFunction10.png',
nav_name: "场地预约",
},
],
ads1Show: false,
ads2Show: false,
// 默认页轮播图(未绑定房源/无广告兜底):顶部 1/2/3横幅 10/20
defaultBannerImgs: [
"https://static.hshuishang.com/static/1.jpg",
"https://static.hshuishang.com/static/2.jpg",
"https://static.hshuishang.com/static/3.jpg",
],
defaultStreamerImgs: [
"https://static.hshuishang.com/static/10.jpg",
"https://static.hshuishang.com/static/20.jpg",
],
bannerList: [], //轮播图广告
currentIdx: 0,
streamerList: [], //横幅广告
tileList: [], //平铺广告
largePopList: [], //巨幅弹屏广告
popList: [], //弹屏广告
categoryList: [],
infoList: [],
selectedTab: 0,
currentAdIndex: 0,
rowNum: 0,
colNum: 0,
page_size: 10,
page_num: 1,
flag: false,
loadMoreText: "",
isShowBill: false,
houseVal: "",
// 从JSON文件中获取默认数据
defaultCategoryList: dataJson.defaultCategoryList,
defaultInfoList: dataJson.defaultInfoList,
defaultNoticeList: dataJson.defaultNoticeList, // 含正文,用于宣传栏内容预览
// 用于存储原始的defaultInfoList数据
originalDefaultInfoList: null
};
},
async onLoad(options) {
if (options.item) {
this.checkComm(JSON.parse(options.item));
}
},
onHide() {
uni.removeStorageSync("is_me");
},
onUnload() {
uni.removeStorageSync("is_me");
},
async onShow() {
const meun = menuButtonInfo();
this.top = meun.top;
// this.top = meun.height + meun.top;
this.localHeight = meun.height;
this.showBack = getCurrentPages().length > 1;
this.defaultFunctionList = [
{
create_time: "",
id: 4,
is_published: 1,
jump_target: 1,
mini_program_url: "/packages/community/repairList/index",
nav_icon: "https://static.hshuishang.com/noValFunction1.png",
nav_name: "报事报修",
other_appid: "",
other_path: "",
sort: 5,
update_time: "",
visible_communities: ""
},
{
create_time: "",
id: 5,
is_published: 1,
jump_target: 1,
mini_program_url: "/packages/community/propertyPayment/index",
nav_icon: "https://static.hshuishang.com/noValFunction2.png",
nav_name: "物业缴费",
other_appid: "",
other_path: "",
sort: 4,
update_time: "",
visible_communities: "",
},
{
create_time: "",
id: 7,
is_published: 1,
jump_target: 1,
mini_program_url: "/packages/community/providentFund/index",
nav_icon: "https://static.hshuishang.com/noValFunction3.png",
nav_name: "岁银",
other_appid: "",
other_path: "",
sort: 2,
update_time: "",
visible_communities: ""
}
]
const isMe = uni.getStorageSync("is_me");
// 当is_me不存在或为true时执行存在且为false时不执行
if (isMe === true || isMe === undefined || isMe === null || isMe === '') {
await this.getCommunityList();
}
this.getfunctionNum();
this.getAdvertising();
this.getCategoryList();
// 初始化默认数据,确保在没有绑定社区时选中第一个分类
setTimeout(() => {
if (this.categoryList.length === 0 && this.defaultCategoryList.length > 0) {
this.selectedTab = 0;
if (!this.originalDefaultInfoList) {
this.originalDefaultInfoList = JSON.parse(JSON.stringify(dataJson.defaultInfoList));
}
// 默认选中第一个分类并展示对应数据(按 category_id 关联,每个分类多条)
this.defaultInfoList = this.originalDefaultInfoList.filter(info => info.category_id === this.defaultCategoryList[0].id);
}
}, 100);
},
//上拉刷新
onPullDownRefresh() {
this.communityVal = uni.getStorageSync("changeCommData").name;
this.bannerList = [];
this.currentIdx = 0;
this.streamerList = []; //横幅广告
this.tileList = []; //平铺广告
this.largePopList = []; //巨幅弹屏广告
this.popList = []; //弹屏广告
this.categoryList = [];
this.infoList = [];
this.selectedTab = 0;
this.currentAdIndex = 0;
this.getfunctionNum();
this.getAdvertising();
this.getCategoryList();
uni.stopPullDownRefresh();
},
//下拉加载
onReachBottom() {
if (this.flag) {
this.page_num++;
const currentItem = this.categoryList[this.selectedTab];
if (currentItem) {
this.selectTab(this.selectedTab, currentItem);
}
}
},
methods: {
// desc() {
// NavgateTo("../communityDetail/index")
// },
checkComm(item) {
if (uni.getStorageSync("is_me")) {
uni.setStorageSync("changeCommData", { name: item.name, id: item.community_id })
} else {
this.communityList = []
this.communityVal = item.name;
}
},
async getCommunityList() {
await request(apiArr2.commInfo, "POST", {
user_id: uni.getStorageSync("userId"),
longitude: uni.getStorageSync("location").lng,
latitude: uni.getStorageSync("location").lat,
page_num: this.page_num,
page_size: this.page_size,
}).then((res) => {
if (res.rows.length == 0) {
uni.removeStorageSync("changeCommData");
return;
}
const targetItem = res.rows.find((item) => {
return item.community_id == uni.getStorageSync("changeCommData").id;
});
if (targetItem) {
//是否跳转物业缴费
this.isShowBill = targetItem.bill_front_end_display == 1;
//小区是否隐藏
if (targetItem.front_end_display == 1) {
uni.removeStorageSync("changeCommData");
}
} else {
uni.removeStorageSync("changeCommData");
}
res.rows = res.rows.filter((item) => {
return item.front_end_display != 1;
});
if (!uni.getStorageSync("changeCommData")) {
uni.setStorageSync("changeCommData", { name: res.rows[0].name, id: res.rows[0].community_id })
}
this.communityList = res.rows;
});
if (this.communityList.length == 0) {
this.communityVal = "添加我的房产";
} else {
this.communityVal = uni.getStorageSync("changeCommData").name;
}
},
apply() {
NavgateTo("../applyOwer/index");
},
closeAds() {
this.ads1Show = false;
// 记录用户已关闭过弹窗1
uni.setStorageSync('ads1Showed', true);
},
closeAds2() {
this.ads2Show = false;
// 记录用户已关闭过弹窗2
uni.setStorageSync('ads2Showed', true);
},
jump(e) {
if (!e) {
this.NotOpen();
return;
}
if (
e == "/packages/community/propertyPayment/index" &&
!this.isShowBill
) {
uni.showToast({
title: "请配置账单",
icon: "none",
});
return;
}
NavgateTo(e);
},
addCommunity() {
NavgateTo("/packages/community/myCommunity/index");
},
goBack() {
uni.navigateBack({ delta: 1 });
},
swipers(event) {
// 获取当前轮播图索引
this.currentIdx = event.detail.current;
},
async getfunctionNum() {
this.functionList = this.defaultFunctionList;
const res = await request(
apiArr.commInfo,
"POST",
{},
{
slice: false,
}
);
this.rowNum = res.nav_row_num_comm;
this.colNum = res.nav_row_total_comm;
return await this.getfunctionList();
},
async getfunctionList() {
if (!uni.getStorageSync("changeCommData")) {
return;
}
const res = await request(apiArr.navPage, "POST", {
community_id: Number(uni.getStorageSync("changeCommData").id),
page_num: 1,
page_size: 50,
});
// 获取 rowNum 和 colNum 的乘积
const totalItems = this.rowNum * this.colNum - 3;
// 截取前 totalItems 个元素
const newItems = res.rows.slice(0, totalItems).map((item) => {
return {
...item,
nav_icon: picUrl + item.nav_icon,
};
});
// 根据nav_name判断是否已存在不存在则添加
newItems.forEach(newItem => {
const exists = this.functionList.some(existingItem =>
existingItem.nav_name === newItem.nav_name
);
if (!exists) {
this.functionList.push(newItem);
}
});
},
async getAdvertising() {
if (!uni.getStorageSync("changeCommData")) {
return;
}
const res = await request(apiArr.advPage, "POST", {
community_id: Number(uni.getStorageSync("changeCommData").id),
ad_position: 1,
page_num: 1,
page_size: 50,
});
this.bannerList = res.rows.map((item) => {
return {
...item,
ad_picture: picUrl + item.ad_picture,
};
});
const res2 = await request(apiArr.advPage, "POST", {
community_id: Number(uni.getStorageSync("changeCommData").id),
ad_position: 2,
page_num: 1,
page_size: 50,
});
this.streamerList = res2.rows.map((item) => {
return {
...item,
ad_picture: picUrl + item.ad_picture,
};
});
const res3 = await request(apiArr.advPage, "POST", {
community_id: Number(uni.getStorageSync("changeCommData").id),
ad_position: 3,
page_num: 1,
page_size: 50,
});
this.tileList = res3.rows.map((item) => {
return {
...item,
ad_picture: picUrl + item.ad_picture,
};
});
const res4 = await request(apiArr.advPage, "POST", {
community_id: Number(uni.getStorageSync("changeCommData").id),
ad_position: 4,
page_num: 1,
page_size: 50,
});
this.largePopList = res4.rows.map((item) => {
return {
...item,
ad_picture: picUrl + item.ad_picture,
};
});
// 检查用户是否已关闭过弹窗1只有当没有关闭过且有广告数据时才显示
const ads1Showed = uni.getStorageSync('ads1Showed');
this.ads1Show = !ads1Showed && res4.rows.length !== 0 ? true : false;
const res5 = await request(apiArr.advPage, "POST", {
community_id: Number(uni.getStorageSync("changeCommData").id),
ad_position: 5,
page_num: 1,
page_size: 50,
});
this.popList = res5.rows.map((item) => {
return {
...item,
ad_picture: picUrl + item.ad_picture,
};
});
// 检查用户是否已关闭过弹窗2只有当没有关闭过且有广告数据时才显示
const ads2Showed = uni.getStorageSync('ads2Showed');
this.ads2Show = !ads2Showed && res5.rows.length !== 0 ? true : false;
},
headerServerClick(e) {
if (!e.target_page) {
this.NotOpen();
return;
}
if (e.target_page) {
// #ifdef APP-PLUS
uni.navigateTo({
url:
"/pages/webview/webview?url=" + encodeURIComponent(e.target_page),
});
// #endif
// #ifdef H5
window.open(e.target_page, "_blank");
// #endif
// #ifdef MP-WEIXIN || MP-ALIPAY || MP-BAIDU
if (e.appid) {
uni.navigateToMiniProgram({
appId: e.appid,
path: e.target_page,
//需要传递给目标小程序的数据
extraData: {
data1: "test",
},
});
} else {
// 确保路径是绝对路径
let targetPage = e.target_page;
if (!targetPage.startsWith("/")) {
targetPage = "/" + targetPage;
}
NavgateTo(targetPage);
// NavgateTo('/packages/localLife/index/index')
}
// 小程序中可能需要用户手动复制链接或使用web-view
// uni.showModal({
// title: '提示',
// content: '即将打开外部链接,请复制后在浏览器中打开: ' + e.target_page,
// confirmText: '复制链接',
// success(res) {
// if (res.confirm) {
// uni.setClipboardData({
// data: e.target_page,
// success() {
// uni.showToast({
// title: '复制成功',
// icon: 'success'
// });
// }
// });
// }
// }
// });
// #endif
}
},
onSwiperChange(e) {
this.currentAdIndex = e.detail.current;
},
onDetailClick() {
// 获取当前显示的广告项
const currentAd = this.popList[this.currentAdIndex];
if (currentAd) {
this.headerServerClick(currentAd);
} else if (this.popList.length > 0) {
// 如果当前索引无效,默认使用第一项
this.headerServerClick(this.popList[0]);
}
},
NotOpen() {
uni.showModal({
title: "提示",
content: "此功能暂未开通!",
showCancel: false,
complete: (res) => {
if (res.cancel) {
}
},
});
},
async getCategoryList() {
if (!uni.getStorageSync("changeCommData")) {
return;
}
const res = await request(apiArr.categoryPage, "POST", {
community_id: Number(uni.getStorageSync("changeCommData").id),
category_code: "",
category_name: "",
page_num: 1,
page_size: 30,
});
this.categoryList = res.rows;
this.selectTab(0, res.rows[0]);
},
async selectTab(index, item) {
// 检查是否使用的是默认数据(没有绑定社区时)
if (this.categoryList.length === 0) {
this.selectedTab = index;
if (!this.originalDefaultInfoList) {
this.originalDefaultInfoList = JSON.parse(JSON.stringify(dataJson.defaultInfoList));
}
// 根据选中的分类ID筛选数据按 category_id 关联,每个分类多条)
this.defaultInfoList = this.originalDefaultInfoList.filter(info => info?.category_id === item?.id);
return;
}
// 原有逻辑(有绑定社区时)
const isTabChange = this.selectedTab !== index;
if (isTabChange) {
this.page_num = 1;
this.infoList = [];
}
this.selectedTab = index;
// 如果不是切换tab且已经没有更多数据且已有数据则不发送请求
if (!isTabChange && !this.flag && this.infoList.length > 0) {
return;
}
const res = await request(apiArr.infoPage, "POST", {
community_id: Number(uni.getStorageSync("changeCommData").id),
announcement_category_id: item?.id,
title: "",
category_name: "",
page_num: this.page_num,
page_size: this.page_size,
});
// 处理数据
const newData = res.rows.map((item) => ({
...item,
list_image: picUrl + item.list_image,
}));
// 判断是否还有更多数据
const hasMore = res.rows.length === this.page_size;
// 限制最多3页
this.flag = hasMore;
// 检查数据是否重复
const isDataDuplicate =
!isTabChange &&
this.infoList.length > 0 &&
newData.length > 0 &&
this.infoList[this.infoList.length - 1].id === newData[0].id;
// 更新数据
if (isTabChange) {
this.infoList = newData;
} else if (!isDataDuplicate) {
this.infoList = this.infoList.concat(newData);
}
// 更新提示文本
if (this.infoList.length > 10 && !hasMore) {
uni.showToast({
title: "没有更多了",
icon: "none",
});
} else {
// this.loadMoreText = `下拉加载后续10条`;
}
},
detail(e) {
NavgateTo("../noticeDesc/index?id=" + e.id);
},
defaultDetail(e) {
NavgateTo("../defaultNotice/index?id=" + e.id);
},
// 静态默认宣传栏内容预览:按 id 取对应正文,去掉换行/空白占位/标签,截取一段
contentPreview(id) {
const n = (this.defaultNoticeList || []).find((x) => x.id === id);
if (!n || !n.content) return "";
const text = n.content
.replace(/&nbsp;/g, " ")
.replace(/<[^>]+>/g, "")
.replace(/\s+/g, " ")
.trim();
return text.length > 50 ? text.slice(0, 50) + "…" : text;
},
// 资讯条目阅读数:假数据 reads / 接口字段兜底(公告表暂无阅读数字段,无值不展示)
newsReads(item) {
if (!item) return 0;
return item.reads || item.view_count || item.read_num || 0;
},
// 资讯条目更新日期:假数据 update_date / 接口 update_time、publish_time取日期部分
newsTime(item) {
if (!item) return "";
const t =
item.update_date ||
item.update_time ||
item.publish_time ||
item.create_time ||
"";
return t ? String(t).slice(0, 10) : "";
},
// 已绑定:临时通知列表项内容预览(接口数据),字段兜底 + 去标签截取
noticePreview(item) {
if (!item) return "";
const raw =
item.content ||
item.summary ||
item.describe ||
item.intro ||
item.sub_title ||
"";
if (raw) {
const text = String(raw)
.replace(/&nbsp;/g, " ")
.replace(/<[^>]+>/g, "")
.replace(/\s+/g, " ")
.trim();
if (text) return text.length > 50 ? text.slice(0, 50) + "…" : text;
}
return item.author || "";
},
},
};
</script>
<style>
@import url("./index.css");
</style>