修复首页金刚区显示,广告区显示

This commit is contained in:
Daniel Kou 2026-07-02 16:15:40 +08:00
parent 96f2ee15eb
commit b770725a5d
2 changed files with 82 additions and 92 deletions

View File

@ -237,7 +237,7 @@ page {
} }
.tabList text { .tabList text {
font-size: 30rpx; font-size: 26rpx;
} }
.tabItem { .tabItem {

View File

@ -65,8 +65,7 @@
<!-- 轮播图 --> <!-- 轮播图 -->
<view class="swiper"> <view class="swiper">
<swiper @animationfinish="swipers" autoplay circular> <swiper @animationfinish="swipers" autoplay circular>
<!-- <swiper-item v-for="(item, index) in bannerList" :key="index" @click="headerServerClick(item)"> --> <swiper-item v-for="(item, index) in bannerList" :key="index" @click="handleAdClick(item)">
<swiper-item v-for="(item, index) in bannerList" :key="index">
<image :src="item.pic_src" mode="aspectFill" /> <image :src="item.pic_src" mode="aspectFill" />
</swiper-item> </swiper-item>
</swiper> </swiper>
@ -92,13 +91,12 @@
<!-- 广告横幅 --> <!-- 广告横幅 -->
<view class="serverList1"> <view class="serverList1">
<view class="serverList1_left" v-if="serverLeftList.length > 0"> <view class="serverList1_left" v-if="serverLeftList.length > 0">
<image :src="serverLeft" mode="aspectFill" @tap="toAdvertisingView(serverLeftList)" /> <image :src="serverLeft" mode="aspectFill" @tap="handleAdClick(serverLeftList[0])" />
</view> </view>
<view class="serverList1_right" v-if="serverRightList.length > 0"> <view class="serverList1_right" v-if="serverRightList.length > 0">
<view :class="['serverItemRight', `serverItemRight${index + 1}`]" v-for="(item, index) in serverRightList" <view :class="['serverItemRight', `serverItemRight${index + 1}`]" v-for="(item, index) in serverRightList"
:key="index"> :key="index">
<image :src="item.pic_src" mode="" <image :src="item.pic_src" mode="" @tap="handleAdClick(item)" />
@tap="index === 0 ? toAdvertisingView(serverRightList) : goToPurify(item)" />
</view> </view>
</view> </view>
</view> </view>
@ -112,7 +110,7 @@
<view class="serverList"> <view class="serverList">
<view class="serverList_left"> <view class="serverList_left">
<swiper> <swiper>
<swiper-item v-for="(item, index) in homeLeftList" :key="index" @click="headerServerClick(item)"> <swiper-item v-for="(item, index) in homeLeftList" :key="index" @click="handleAdClick(item)">
<image :src="item.pic_src" alt="" class="serverList_left_img" /> <image :src="item.pic_src" alt="" class="serverList_left_img" />
<!-- <view>{{ item.ad_position }}</view> --> <!-- <view>{{ item.ad_position }}</view> -->
</swiper-item> </swiper-item>
@ -259,6 +257,22 @@ import {
import nav from '../../components/nav/nav'; //1.导入组件 import nav from '../../components/nav/nav'; //1.导入组件
// 首页广告位常量(对应后台 home_banner_region.ad_position)
const AD_POS = {
TOP_BANNER: 1, // 顶部轮播
CARD_LEFT: 2, // 卡片橱窗左
CARD_RIGHT_TOP: 3, // 卡片橱窗右上
CARD_RIGHT_BOTTOM: 4, // 卡片橱窗右下
MID_LEFT: 5, // 中部广告位左
MID_CENTER_TOP: 6, // 中部中上
MID_CENTER: 7, // 中部中
MID_CENTER_BOTTOM: 8, // 中部中下
MID_RIGHT_TOP: 9, // 中部右上
MID_RIGHT_CENTER: 10, // 中部右中
MID_RIGHT_BOTTOM: 11, // 中部右下
POPUP: 12, // 小程序弹窗
BOTTOM_RECOMMEND: 13, // 底部推荐
};
export default { export default {
components: { components: {
@ -353,22 +367,28 @@ export default {
}) })
}, },
// 广告商品跳转 // 统一广告点击:按后台 promotion_type 分发跳转
toAdvertisingView(itemArry) { // 1无 / 3跳本小程序页面(link_url) / 4跳其他小程序(appid+link_url) / 5选择商品(跳广告商品列表页)
const item = itemArry[0] handleAdClick(item) {
NavgateTo('/packages/advertising/index/index?id=' + item.id, { isLogin: false }) if (!item) return
}, switch (item.promotion_type) {
case 3: // 跳转本小程序页面
//跳转到净水小程序 if (!item.link_url) return this.NotOpen()
goToPurify() { if (item.link_url === '/packages/shopEnter/index/index') return this.headershopEnterClick()
uni.navigateToMiniProgram({ return NavgateTo(item.link_url, { isLogin: false })
appId: 'wx77b22c0a0018e580', case 4: // 跳转其他小程序
path: 'pages/newLogin/newLogin', if (!item.appid) return this.NotOpen()
envVersion: 'release', return uni.navigateToMiniProgram({
success(res) { appId: item.appid,
// 打开成功 path: item.link_url || '',
} envVersion: 'release'
}) })
case 5: // 选择商品 → 广告商品列表页
return NavgateTo('/packages/advertising/index/index?id=' + item.id, { isLogin: false })
case 1:
default: // 无
return this.NotOpen()
}
}, },
async goToWuye() { async goToWuye() {
@ -715,87 +735,57 @@ export default {
return (res && res.rows) ? res.rows : []; return (res && res.rows) ? res.rows : [];
}, },
// 给列表统一补图片前缀
withPicUrl(list) {
list.forEach(item => { item.pic_src = picUrl + item.pic_src })
return list
},
// 取某广告位「第一条已发布」广告(固定单格用);无则按需返回占位或 null
async getBannerAt(position, { placeholder = false } = {}) {
const rows = await this.getBannerRows(position)
const [first] = this.withPicUrl(this.filterShowList(rows, 1))
if (first) return first
return placeholder ? { ad_position: position, pic_src: '' } : null
},
// 按顺序批量取多个固定单格位置
async getBannersAt(positions, opts) {
return Promise.all(positions.map(p => this.getBannerAt(p, opts)))
},
async getHomeBanner() { async getHomeBanner() {
const rows = await this.getBannerRows(1); const rows = await this.getBannerRows(AD_POS.TOP_BANNER);
if (rows && rows.length) { return this.withPicUrl(this.filterShowList(rows, 1));
let filterRes = this.filterShowList(rows, 1);
filterRes.forEach(item => {
item.pic_src = picUrl + item.pic_src
})
return filterRes
} else {
return []
}
}, },
async getServerLeft() { async getServerLeft() {
const rows = await this.getBannerRows(2); const rows = await this.getBannerRows(AD_POS.CARD_LEFT);
if (!rows || !rows.length) { const shown = this.withPicUrl(this.filterShowList(rows, 1));
this.serverLeftList = [] this.serverLeftList = shown; // 与展示的首图保持一致,点击取 [0] 即为当前图
} return shown.length ? shown[0].pic_src : [];
if (rows && rows.length) {
this.serverLeftList = rows
let filterRes = this.filterShowList(rows, 1);
filterRes.forEach(item => {
item.pic_src = picUrl + item.pic_src
})
const itemUrl = filterRes[0].pic_src
return itemUrl
} else {
return []
}
}, },
async getServerRight() { async getServerRight() {
const rightList = [] // 卡片橱窗右侧两格,各取第一条;无广告则不占位(保持原「无则隐藏」行为)
for (let i = 3; i < 5; i++) { const list = await this.getBannersAt([
const rows = await this.getBannerRows(i); AD_POS.CARD_RIGHT_TOP,
if (!rows || !rows.length) { AD_POS.CARD_RIGHT_BOTTOM,
this.serverRightList = [] ]);
} return list.filter(Boolean);
if (rows && rows.length) {
let filterRes = this.filterShowList(rows, 1);
filterRes.forEach(item => {
item.pic_src = picUrl + item.pic_src
})
rightList.push(...filterRes)
}
}
return rightList
}, },
async getHomeMidLeft() { async getHomeMidLeft() {
const rows = await this.getBannerRows(5); const rows = await this.getBannerRows(AD_POS.MID_LEFT);
if (rows && rows.length) { return this.withPicUrl(this.filterShowList(rows, 1));
let filterRes = this.filterShowList(rows, 1);
filterRes.forEach(item => {
item.pic_src = picUrl + item.pic_src
})
return filterRes
} else {
return []
}
}, },
async getHomeMidRight() { async getHomeMidRight() {
const rightList = [] // 中部右侧宫格固定 6 格,各取第一条,保证 slice(0,3)/slice(3,6) 对齐
for (let i = 6; i < 12; i++) { return this.getBannersAt([
const rows = await this.getBannerRows(i); AD_POS.MID_CENTER_TOP, AD_POS.MID_CENTER, AD_POS.MID_CENTER_BOTTOM,
if (rows && rows.length) { AD_POS.MID_RIGHT_TOP, AD_POS.MID_RIGHT_CENTER, AD_POS.MID_RIGHT_BOTTOM,
let filterRes = this.filterShowList(rows, 1); ], { placeholder: true });
filterRes.forEach(item => {
item.pic_src = picUrl + item.pic_src
})
rightList.push(...filterRes)
} else {
rightList.push({
ad_position: i,
pic_src: ''
})
}
}
return rightList
}, },
// async getHomeCenterTop() { // async getHomeCenterTop() {
@ -936,7 +926,7 @@ export default {
async getHomeBottom(val = false) { async getHomeBottom(val = false) {
const res = await request(apiArr2.getHomeBanner, "POST", { const res = await request(apiArr2.getHomeBanner, "POST", {
ad_code: uni.getStorageSync('ad_code'), ad_code: uni.getStorageSync('ad_code'),
ad_position: 5, ad_position: AD_POS.BOTTOM_RECOMMEND,
longitude: uni.getStorageSync('location').lng, longitude: uni.getStorageSync('location').lng,
latitude: uni.getStorageSync('location').lat, latitude: uni.getStorageSync('location').lat,
page_num: this.bottomPageNum, page_num: this.bottomPageNum,