From ada903de07997e12260d7b4b8c2ff179a0dc4188 Mon Sep 17 00:00:00 2001 From: XingQue Date: Mon, 27 Jul 2026 04:48:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9C=AA=E7=99=BB=E5=BD=95=E4=B8=80?= =?UTF-8?q?=E5=BE=8B=E5=9B=9E=E6=89=93=E6=89=8B=E7=99=BB=E5=BD=95=E9=A1=B5?= =?UTF-8?q?=EF=BC=9B=E6=97=A0=E5=95=86=E5=AE=B6=E8=BA=AB=E4=BB=BD=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E8=BF=9B=E5=85=A5=E5=95=86=E5=AE=B6=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- pages/category/category.js | 9 +++++++++ pages/fighter/fighter.js | 34 ++++++++++++++++++++-------------- pages/index/index.js | 19 +++++++++++++++++++ pages/mine/mine.js | 10 ++++++++++ utils/base-page.js | 4 ++-- utils/fighter-only.js | 10 ++++++++++ utils/phone-auth.js | 7 ++++++- utils/primary-role.js | 8 ++++++++ utils/request.js | 23 +++++++++++++++++++++-- utils/role-tab-bar.js | 21 +++++++++++++-------- 10 files changed, 118 insertions(+), 27 deletions(-) diff --git a/pages/category/category.js b/pages/category/category.js index 5dffc1a..1943bb1 100644 --- a/pages/category/category.js +++ b/pages/category/category.js @@ -2,6 +2,7 @@ const app = getApp() import { createPage } from '../../utils/base-page.js'; import { buildClubHeaders } from '../../utils/club-context.js'; +import { isFighterOnly, resolveFighterOnlyLaunchUrl } from '../../utils/fighter-only.js'; Page(createPage({ data: { @@ -25,6 +26,10 @@ Page(createPage({ }, onLoad(options) { + if (isFighterOnly()) { + wx.reLaunch({ url: resolveFighterOnlyLaunchUrl() }); + return; + } this.setData({ ossImageUrl: app.globalData.ossImageUrl }) @@ -32,6 +37,10 @@ Page(createPage({ }, onShow() { + if (isFighterOnly()) { + wx.reLaunch({ url: resolveFighterOnlyLaunchUrl() }); + return; + } this.registerNotificationComponent(); }, diff --git a/pages/fighter/fighter.js b/pages/fighter/fighter.js index 19af8cf..054337c 100644 --- a/pages/fighter/fighter.js +++ b/pages/fighter/fighter.js @@ -18,7 +18,7 @@ import { } from '../../utils/miniapp-icons.js' import { getDefaultAvatarUrl } from '../../utils/avatar.js' import { ensureRoleAgreement } from '../../utils/role-agreement-gate.js' -import { isFighterOnly, FIGHTER_ONLY_DEFAULT_INVITE, FIGHTER_HOME, shouldSkipAutoAuth, clearSkipAutoAuth } from '../../utils/fighter-only.js' +import { isFighterOnly, FIGHTER_ONLY_DEFAULT_INVITE, FIGHTER_HOME, shouldSkipAutoAuth, clearSkipAutoAuth, isShangjiaCertified } from '../../utils/fighter-only.js' const PLATFORM_INVITE_CODE = FIGHTER_ONLY_DEFAULT_INVITE || '0000008VfJKPu4Spmcjt' const app = getApp() @@ -288,7 +288,7 @@ Page(createPage({ const isGuanshi = isRoleStatusActive(wx.getStorageSync('guanshistatus')); const isZuzhang = isRoleStatusActive(wx.getStorageSync('zuzhangstatus')); const isKaoheguan = isRoleStatusActive(wx.getStorageSync('kaoheguanstatus')); - const isShangjia = isRoleStatusActive(wx.getStorageSync('shangjiastatus')); + const isShangjia = isShangjiaCertified(); const subRoleCount = [isGuanshi, isZuzhang, isKaoheguan].filter(Boolean).length; this.setData({ isDashou, isGuanshi, isZuzhang, isKaoheguan, @@ -370,11 +370,10 @@ Page(createPage({ push('goToKefu', '在线客服', img.iconKefu); push('goToComplaintCreate', '投诉反馈', img.iconComplaint || img.iconContact); push('goToComplaintList', '投诉记录', img.iconComplaint || img.iconRecord); - // 龙先生:仅已开通商家时显示入口;未开通不展示 - if (d.shangjiaCertified) { + // 仅 shangjiastatus===1 的商家老板显示;客服入口另算 + if (isShangjiaCertified()) { push('onTapShangjiaAuth', '进入商家端', img.iconShangjia); } - // 仅已是商家客服时显示工作台,未入驻不展示「入驻」入口 if (isStaffMode()) { push('onTapStaffAuth', '商家客服工作台', img.iconKefu || img.iconShangjia); } @@ -1272,17 +1271,22 @@ Page(createPage({ goToAuth(e) { const type = e.currentTarget.dataset.type; if (!type || !['dashou', 'shangjia', 'guanshi', 'zuzhang'].includes(type)) return; + // 纯打手端:禁止走商家认证页,未开通则直接提示 + if (type === 'shangjia') { + if (isShangjiaCertified()) { + enterLockedRole('shangjia', getApp()); + } else { + wx.showToast({ title: '未开通商家身份', icon: 'none' }); + } + return; + } const statusMap = { dashou: 'dashoustatus', - shangjia: 'shangjiastatus', guanshi: 'guanshistatus', zuzhang: 'zuzhangstatus', }; const statusKey = statusMap[type]; if (isRoleStatusActive(wx.getStorageSync(statusKey))) { - if (type === 'shangjia') { - enterLockedRole('shangjia', getApp()); - } return; } wx.navigateTo({ url: `/pages/verify/verify?type=${type}` }); @@ -1294,7 +1298,7 @@ Page(createPage({ if (isStaffMode()) { enterLockedRole('shangjia', getApp()); } else { - wx.navigateTo({ url: '/pages/staff-join/staff-join' }); + wx.showToast({ title: '未入驻商家客服', icon: 'none' }); } return; } @@ -1306,19 +1310,21 @@ Page(createPage({ }, enterShangjiaCenter() { - if (!this.data.shangjiaCertified) { - wx.showToast({ title: '请联系客服开通商家', icon: 'none' }); + if (!isShangjiaCertified()) { + this.setData({ shangjiaCertified: false, isShangjia: false }); + wx.showToast({ title: '未开通商家身份', icon: 'none' }); return; } enterLockedRole('shangjia', getApp()); }, onTapShangjiaAuth() { - if (this.data.shangjiaCertified) { + if (isShangjiaCertified()) { this.enterShangjiaCenter(); return; } - wx.showToast({ title: '请联系客服开通商家', icon: 'none' }); + this.setData({ shangjiaCertified: false, isShangjia: false }); + wx.showToast({ title: '未开通商家身份', icon: 'none' }); }, goToReceiveOrder() { wx.switchTab({ url: '/pages/accept-order/accept-order' }) }, diff --git a/pages/index/index.js b/pages/index/index.js index c0d60da..5e46d69 100644 --- a/pages/index/index.js +++ b/pages/index/index.js @@ -6,12 +6,22 @@ import { backfillUserProfileCache, getSessionToken } from '../../utils/role-tab- import PopupService from '../../services/popupService.js'; import { createPage } from '../../utils/base-page.js'; import { fetchGonggaoLunbo, isGonggaoCacheValid, getCachedGonggaoLunbo } from '../../utils/display-config'; +import { isFighterOnly, getLoginPageUrl, resolveFighterOnlyLaunchUrl } from '../../utils/fighter-only.js'; // 扫码场景参数名 const SCENE_PARAM = 'scene'; /** 点单商城轮播 page_key */ const ORDER_PAGE_KEY = 'order_pool'; +function buildFighterRedirectUrl(options = {}) { + const q = []; + if (options.scene) q.push('scene=' + encodeURIComponent(options.scene)); + if (options.inviteCode) q.push('inviteCode=' + encodeURIComponent(options.inviteCode)); + if (options.registerType) q.push('registerType=' + encodeURIComponent(options.registerType)); + const base = options.scene || options.inviteCode ? getLoginPageUrl() : resolveFighterOnlyLaunchUrl(); + return q.length ? `${base}?${q.join('&')}` : base; +} + Page(createPage({ data: { ossImageUrl: '', @@ -38,6 +48,11 @@ Page(createPage({ shopId: null, onLoad(options) { + // 纯打手端:点单商城不再使用;带扫码参数则转发到打手登录/注册页 + if (isFighterOnly()) { + wx.reLaunch({ url: buildFighterRedirectUrl(options || {}) }); + return; + } // 解析二维码参数 if (options[SCENE_PARAM]) { try { @@ -80,6 +95,10 @@ Page(createPage({ }, onShow() { + if (isFighterOnly()) { + wx.reLaunch({ url: resolveFighterOnlyLaunchUrl() }); + return; + } backfillUserProfileCache(app); if (this.data.ossImageUrl) { this.setData({ diff --git a/pages/mine/mine.js b/pages/mine/mine.js index 6af4faf..17a5012 100644 --- a/pages/mine/mine.js +++ b/pages/mine/mine.js @@ -21,6 +21,7 @@ import { warmupPindaoConfig, PINDAO_ICON_FALLBACK, } from '../../utils/miniapp-icons.js'; +import { isFighterOnly, getLoginPageUrl } from '../../utils/fighter-only.js'; Page(createPage({ data: { @@ -47,6 +48,11 @@ Page(createPage({ }, onLoad() { + // 纯打手端:误入点单「我的」时立刻拉回打手登录页 + if (isFighterOnly()) { + wx.reLaunch({ url: getLoginPageUrl() }); + return; + } this.initIconUrls(); this.loadUserData(); this.setBottomSafe(); @@ -54,6 +60,10 @@ Page(createPage({ }, onShow() { + if (isFighterOnly()) { + wx.reLaunch({ url: getLoginPageUrl() }); + return; + } ensurePhoneAuth({ redirect: true, returnPage: '/pages/mine/mine', diff --git a/utils/base-page.js b/utils/base-page.js index 47358cc..8538983 100644 --- a/utils/base-page.js +++ b/utils/base-page.js @@ -155,10 +155,10 @@ const BASE_METHODS = { // ---------- 返回点单端(纯打手端禁用) ---------- switchToNormal() { try { - const { isFighterOnly, FIGHTER_MINE } = require('./fighter-only.js'); + const { isFighterOnly, getLoginPageUrl } = require('./fighter-only.js'); if (isFighterOnly()) { wx.showToast({ title: '当前为打手端小程序', icon: 'none' }); - wx.reLaunch({ url: FIGHTER_MINE }); + wx.reLaunch({ url: getLoginPageUrl() }); return; } } catch (e) {} diff --git a/utils/fighter-only.js b/utils/fighter-only.js index 31e6902..fa8186b 100644 --- a/utils/fighter-only.js +++ b/utils/fighter-only.js @@ -53,3 +53,13 @@ export function resolveFighterOnlyLaunchUrl() { } return FIGHTER_MINE } + +/** 未登录 / 登录失效时的落地页(绝不再回点单端我的) */ +export function getLoginPageUrl() { + return isFighterOnly() ? FIGHTER_MINE : '/pages/mine/mine' +} + +/** 严格判断是否已开通商家老板身份 */ +export function isShangjiaCertified() { + return Number(wx.getStorageSync('shangjiastatus')) === 1 +} diff --git a/utils/phone-auth.js b/utils/phone-auth.js index ad7a79f..4533164 100644 --- a/utils/phone-auth.js +++ b/utils/phone-auth.js @@ -121,7 +121,12 @@ function resolveReturnRole() { function defaultReturnPage(role) { if (role === 'dashou') return '/pages/accept-order/accept-order'; if (role === 'shangjia') return '/pages/merchant-home/merchant-home'; - return '/pages/mine/mine'; + try { + const { getLoginPageUrl } = require('./fighter-only.js'); + return getLoginPageUrl(); + } catch (e) { + return '/pages/fighter/fighter'; + } } async function check() { diff --git a/utils/primary-role.js b/utils/primary-role.js index 94f7d47..7015afe 100644 --- a/utils/primary-role.js +++ b/utils/primary-role.js @@ -125,6 +125,14 @@ function finishEnterLockedRole(role, app) { export function enterLockedRole(role, app) { if (!VALID.includes(role) || role === 'normal') return false; + // 未开通商家/客服身份时,禁止进入商家端(纯打手端尤其重要) + if (role === 'shangjia') { + const isOwner = isRoleStatusActive(wx.getStorageSync('shangjiastatus')); + if (!isOwner && !isStaffMode()) { + wx.showToast({ title: '未开通商家身份', icon: 'none' }); + return false; + } + } if (role === 'dashou' || role === 'shangjia') { ensurePhoneAuth({ redirect: true, role }).then((ok) => { if (ok) finishEnterLockedRole(role, app); diff --git a/utils/request.js b/utils/request.js index 4aae63a..40b696a 100644 --- a/utils/request.js +++ b/utils/request.js @@ -1,6 +1,25 @@ // utils/request.js import { buildClubHeaders } from './club-context'; +function getLoginFallbackUrl() { + try { + const { getLoginPageUrl } = require('./fighter-only.js'); + return getLoginPageUrl(); + } catch (e) { + return '/pages/fighter/fighter'; + } +} + +function goLoginPage() { + const url = getLoginFallbackUrl(); + wx.reLaunch({ + url, + fail: () => { + try { wx.redirectTo({ url }); } catch (e) {} + }, + }); +} + function request(options) { const app = getApp(); const token = wx.getStorageSync('token'); @@ -41,7 +60,7 @@ function request(options) { success: (modalRes) => { if (modalRes.confirm) { wx.removeStorageSync('token'); - wx.switchTab({ url: '/pages/mine/mine' }); + goLoginPage(); } }, }); @@ -55,7 +74,7 @@ function request(options) { success: (modalRes) => { if (modalRes.confirm) { wx.removeStorageSync('token'); - wx.reLaunch({ url: '/pages/mine/mine' }); + goLoginPage(); } }, }); diff --git a/utils/role-tab-bar.js b/utils/role-tab-bar.js index 864604b..9eddf45 100644 --- a/utils/role-tab-bar.js +++ b/utils/role-tab-bar.js @@ -142,17 +142,22 @@ export function syncProfileFields(data) { }); } -/** 清除缓存:清空登录与身份;纯打手端回到打手「我的」,否则点单「我的」 */ +/** 清除缓存:清空登录与身份;纯打手端回到打手登录页,否则点单「我的」 */ export function clearCacheAndEnterNormal(page) { resetGuestSession(page, { skipPageReset: true }); + let url = '/pages/mine/mine'; try { - const { isFighterOnly, FIGHTER_MINE } = require('./fighter-only.js'); - if (isFighterOnly()) { - wx.reLaunch({ url: FIGHTER_MINE }); - return; - } - } catch (e) {} - wx.reLaunch({ url: '/pages/mine/mine' }); + const { getLoginPageUrl } = require('./fighter-only.js'); + url = getLoginPageUrl(); + } catch (e) { + url = '/pages/fighter/fighter'; + } + wx.reLaunch({ + url, + fail: () => { + try { wx.redirectTo({ url }); } catch (err) {} + }, + }); } /** 清除缓存并重置为点单端(不跳转,供当前已在点单端时使用) */