From b770725a5d7554a28f5369cc889d398e6f5aa107 Mon Sep 17 00:00:00 2001 From: Daniel Kou Date: Thu, 2 Jul 2026 16:15:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A6=96=E9=A1=B5=E9=87=91?= =?UTF-8?q?=E5=88=9A=E5=8C=BA=E6=98=BE=E7=A4=BA=EF=BC=8C=E5=B9=BF=E5=91=8A?= =?UTF-8?q?=E5=8C=BA=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/index/index.css | 2 +- pages/index/index.vue | 172 ++++++++++++++++++++---------------------- 2 files changed, 82 insertions(+), 92 deletions(-) diff --git a/pages/index/index.css b/pages/index/index.css index 0a735608..dbe04f01 100644 --- a/pages/index/index.css +++ b/pages/index/index.css @@ -237,7 +237,7 @@ page { } .tabList text { - font-size: 30rpx; + font-size: 26rpx; } .tabItem { diff --git a/pages/index/index.vue b/pages/index/index.vue index 85de8781..803b06e6 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -65,8 +65,7 @@ - - + @@ -92,13 +91,12 @@ - + - + @@ -112,7 +110,7 @@ - + @@ -259,6 +257,22 @@ import { 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 { components: { @@ -353,22 +367,28 @@ export default { }) }, - // 广告商品跳转 - toAdvertisingView(itemArry) { - const item = itemArry[0] - NavgateTo('/packages/advertising/index/index?id=' + item.id, { isLogin: false }) - }, - - //跳转到净水小程序 - goToPurify() { - uni.navigateToMiniProgram({ - appId: 'wx77b22c0a0018e580', - path: 'pages/newLogin/newLogin', - envVersion: 'release', - success(res) { - // 打开成功 - } - }) + // 统一广告点击:按后台 promotion_type 分发跳转 + // 1无 / 3跳本小程序页面(link_url) / 4跳其他小程序(appid+link_url) / 5选择商品(跳广告商品列表页) + handleAdClick(item) { + if (!item) return + switch (item.promotion_type) { + case 3: // 跳转本小程序页面 + if (!item.link_url) return this.NotOpen() + if (item.link_url === '/packages/shopEnter/index/index') return this.headershopEnterClick() + return NavgateTo(item.link_url, { isLogin: false }) + case 4: // 跳转其他小程序 + if (!item.appid) return this.NotOpen() + return uni.navigateToMiniProgram({ + 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() { @@ -715,87 +735,57 @@ export default { 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() { - const rows = await this.getBannerRows(1); - if (rows && rows.length) { - let filterRes = this.filterShowList(rows, 1); - filterRes.forEach(item => { - item.pic_src = picUrl + item.pic_src - }) - return filterRes - } else { - return [] - } + const rows = await this.getBannerRows(AD_POS.TOP_BANNER); + return this.withPicUrl(this.filterShowList(rows, 1)); }, async getServerLeft() { - const rows = await this.getBannerRows(2); - if (!rows || !rows.length) { - this.serverLeftList = [] - } - - 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 [] - } + const rows = await this.getBannerRows(AD_POS.CARD_LEFT); + const shown = this.withPicUrl(this.filterShowList(rows, 1)); + this.serverLeftList = shown; // 与展示的首图保持一致,点击取 [0] 即为当前图 + return shown.length ? shown[0].pic_src : []; }, async getServerRight() { - const rightList = [] - for (let i = 3; i < 5; i++) { - const rows = await this.getBannerRows(i); - if (!rows || !rows.length) { - this.serverRightList = [] - } - 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 + // 卡片橱窗右侧两格,各取第一条;无广告则不占位(保持原「无则隐藏」行为) + const list = await this.getBannersAt([ + AD_POS.CARD_RIGHT_TOP, + AD_POS.CARD_RIGHT_BOTTOM, + ]); + return list.filter(Boolean); }, async getHomeMidLeft() { - const rows = await this.getBannerRows(5); - if (rows && rows.length) { - let filterRes = this.filterShowList(rows, 1); - filterRes.forEach(item => { - item.pic_src = picUrl + item.pic_src - }) - return filterRes - } else { - return [] - } + const rows = await this.getBannerRows(AD_POS.MID_LEFT); + return this.withPicUrl(this.filterShowList(rows, 1)); }, async getHomeMidRight() { - const rightList = [] - for (let i = 6; i < 12; i++) { - const rows = await this.getBannerRows(i); - if (rows && rows.length) { - let filterRes = this.filterShowList(rows, 1); - filterRes.forEach(item => { - item.pic_src = picUrl + item.pic_src - }) - rightList.push(...filterRes) - } else { - rightList.push({ - ad_position: i, - pic_src: '' - }) - } - } - return rightList + // 中部右侧宫格固定 6 格,各取第一条,保证 slice(0,3)/slice(3,6) 对齐 + return this.getBannersAt([ + AD_POS.MID_CENTER_TOP, AD_POS.MID_CENTER, AD_POS.MID_CENTER_BOTTOM, + AD_POS.MID_RIGHT_TOP, AD_POS.MID_RIGHT_CENTER, AD_POS.MID_RIGHT_BOTTOM, + ], { placeholder: true }); }, // async getHomeCenterTop() { @@ -936,7 +926,7 @@ export default { async getHomeBottom(val = false) { const res = await request(apiArr2.getHomeBanner, "POST", { ad_code: uni.getStorageSync('ad_code'), - ad_position: 5, + ad_position: AD_POS.BOTTOM_RECOMMEND, longitude: uni.getStorageSync('location').lng, latitude: uni.getStorageSync('location').lat, page_num: this.bottomPageNum,