diff --git a/app.js b/app.js
index be37b63..84cb2e8 100644
--- a/app.js
+++ b/app.js
@@ -3,6 +3,7 @@ import GoEasy from './static/lib/goeasy-2.13.24.esm.min';
const ChatCore = require('./utils/chat-core');
import { ensurePhoneAuth } from './utils/phone-auth';
import { getPrimaryRole, lockPrimaryRole, migrateLegacyCenterRole, PRIMARY_DEFAULT_PAGES } from './utils/primary-role';
+import { isFighterOnly, resolveFighterOnlyLaunchUrl } from './utils/fighter-only';
import { setClubId, getConfiguredClubId, buildClubHeaders, getClubId } from './utils/club-context';
import { CLUB_ID, WX_APP_ID } from './config/club-config';
import { applyMiniappAssetsFromConfig, warmupPindaoConfig } from './utils/miniapp-icons.js';
@@ -201,7 +202,7 @@ App({
}
migrateLegacyCenterRole(this);
- const savedRole = getPrimaryRole(this);
+ const savedRole = isFighterOnly() ? 'dashou' : getPrimaryRole(this);
lockPrimaryRole(savedRole, this);
// ②b 冷启动:有 token 时先问后端是否需要手机号认证
@@ -215,8 +216,11 @@ App({
refreshDashouMembership(this).catch(() => {});
}
- const targetPage = roleDefaultPage[savedRole] || '/pages/index/index';
- if (savedRole !== 'normal') {
+ // 纯打手端:始终 reLaunch 到抢单池或注册页;不再停在点单商城
+ const targetPage = isFighterOnly()
+ ? resolveFighterOnlyLaunchUrl()
+ : (roleDefaultPage[savedRole] || '/pages/index/index');
+ if (isFighterOnly() || savedRole !== 'normal') {
setTimeout(() => {
wx.reLaunch({ url: targetPage });
}, 0);
diff --git a/app.json b/app.json
index 3ba1281..ad577e0 100644
--- a/app.json
+++ b/app.json
@@ -1,13 +1,13 @@
{
"pages": [
- "pages/index/index",
- "pages/category/category",
- "pages/messages/messages",
- "pages/mine/mine",
"pages/accept-order/accept-order",
"pages/team-hall/team-hall",
"pages/fighter-orders/fighter-orders",
"pages/fighter/fighter",
+ "pages/messages/messages",
+ "pages/index/index",
+ "pages/category/category",
+ "pages/mine/mine",
"pages/merchant-home/merchant-home",
"pages/merchant-orders/merchant-orders",
"pages/merchant/merchant",
diff --git a/pages/accept-order/accept-order.js b/pages/accept-order/accept-order.js
index 9861a7f..4d6ae67 100644
--- a/pages/accept-order/accept-order.js
+++ b/pages/accept-order/accept-order.js
@@ -12,6 +12,7 @@ import { fetchGonggaoLunbo, isGonggaoCacheValid, getCachedGonggaoLunbo } from '.
import { checkPenaltyForGrab } from '../../utils/grab-order-gate.js';
import { ensureRoleAgreement } from '../../utils/role-agreement-gate.js';
import { fetchMyZhidingOrders, submitZhidingResponse, processZhidingList, filterZhidingBannerList, ZHIDING_HF_MAP } from '../../utils/zhiding-order.js';
+import { isFighterOnly, FIGHTER_MINE, isDashouCertified } from '../../utils/fighter-only.js';
/** 抢单池轮播 page_key(勿与点单页 order_pool 混用) */
const ACCEPT_ORDER_PAGE_KEY = 'accept_order';
@@ -156,6 +157,12 @@ Page({
},
async onShow() {
+ // 纯打手端:未认证时引导到「我的」完成自动注册,不在抢单池空转
+ if (isFighterOnly() && !isDashouCertified()) {
+ wx.reLaunch({ url: FIGHTER_MINE });
+ return;
+ }
+
if (!app.globalData._dashouPhoneChecked) {
const phoneOk = await ensurePhoneAuth({ redirect: true, role: 'dashou' });
if (!phoneOk) return;
diff --git a/pages/fighter/fighter.js b/pages/fighter/fighter.js
index b1182a0..373776b 100644
--- a/pages/fighter/fighter.js
+++ b/pages/fighter/fighter.js
@@ -18,8 +18,10 @@ 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 } from '../../utils/fighter-only.js'
+import { ensureLogin } from '../../utils/login.js'
-const PLATFORM_INVITE_CODE = '0000008RffVgKHMj7kQC'
+const PLATFORM_INVITE_CODE = FIGHTER_ONLY_DEFAULT_INVITE || '0000008VfJKPu4Spmcjt'
const app = getApp()
Page(createPage({
@@ -174,6 +176,11 @@ Page(createPage({
this.handleInviteCodeWithLoginCheck(inviteCode);
}, 500);
}
+ } else if (isFighterOnly()) {
+ // 无邀请码进入:自动用硬编码管事邀请码注册(有邀请链路不受影响)
+ setTimeout(() => {
+ this.tryAutoRegisterDefaultInvite();
+ }, 600);
}
this.checkColdStartPopup('dashouduan');
this.syncConfiguredAssets();
@@ -269,6 +276,10 @@ Page(createPage({
this.handleInviteCodeWithLoginCheck(options.inviteCode);
}, 300);
}
+ } else if (isFighterOnly() && !isCenterPageActive(this, 'isDashou', 'dashoustatus')) {
+ setTimeout(() => {
+ this.tryAutoRegisterDefaultInvite();
+ }, 400);
}
if (app.startImWhenReady) app.startImWhenReady();
},
@@ -397,8 +408,11 @@ Page(createPage({
push('goToAuth', '接单员认证', img.iconDashouAuth, { authType: 'dashou' });
}
- push('switchToNormal', '返回点单端', img.iconSwitch);
- push('clearCache', '退出登录', img.iconClear);
+ if (!isFighterOnly()) {
+ push('switchToNormal', '返回点单端', img.iconSwitch);
+ }
+ push('handleWechatLogin', '一键登录', img.iconRefresh);
+ push('clearCache', '清除缓存/退出', img.iconClear);
this.setData({ moreFuncList: list });
},
@@ -913,12 +927,15 @@ Page(createPage({
const that = this;
const token = wx.getStorageSync('token');
const uid = wx.getStorageSync('uid');
+ if (inviteCode) {
+ this.setData({ inviteCode });
+ }
if (!token || !uid) {
this.loginAndRegisterWithInviteCode(inviteCode);
} else {
if (!that.data.isDashou) {
wx.showLoading({ title: '自动注册中...', mask: true });
- that.setData({ isAutoRegistering: true });
+ that.setData({ isAutoRegistering: true, inviteCode: inviteCode || that.data.inviteCode });
that.onRegister();
} else {
wx.showToast({ title: '您已是接单员', icon: 'success', duration: 2000 });
@@ -926,6 +943,41 @@ Page(createPage({
}
},
+ /** 纯打手端:无邀请码时自动绑定默认管事 */
+ tryAutoRegisterDefaultInvite() {
+ if (!isFighterOnly()) return;
+ if (this.data.isDashou || this.data.isGuanshi || this.data.isZuzhang || this.data.isKaoheguan) return;
+ if (this.data.isAutoRegistering) return;
+ if (Number(wx.getStorageSync('dashoustatus')) === 1) return;
+ const code = PLATFORM_INVITE_CODE;
+ this.setData({ inviteCode: code, isAutoRegistering: true });
+ this.handleInviteCodeWithLoginCheck(code);
+ },
+
+ handleWechatLogin() {
+ ensureLogin({ silent: false, page: this })
+ .then(() => {
+ this.checkDashouStatus();
+ this.checkRoleStatuses();
+ if (!this.data.isDashou && isFighterOnly()) {
+ this.tryAutoRegisterDefaultInvite();
+ } else if (this.data.isDashou) {
+ this.refreshAllInfo(false);
+ }
+ wx.showToast({ title: '登录成功', icon: 'success' });
+ })
+ .catch(() => {
+ wx.showToast({ title: '登录失败', icon: 'none' });
+ });
+ },
+
+ _goFighterHomeAfterRegister() {
+ if (!isFighterOnly()) return;
+ setTimeout(() => {
+ wx.reLaunch({ url: FIGHTER_HOME });
+ }, 800);
+ },
+
loginAndRegisterWithInviteCode(inviteCode) {
const that = this;
wx.showLoading({ title: '登录注册中...', mask: true });
@@ -941,7 +993,7 @@ Page(createPage({
fail: () => {
wx.hideLoading();
console.error('微信登录失败');
- wx.reLaunch({ url: '/pages/mine/mine' });
+ wx.reLaunch({ url: isFighterOnly() ? '/pages/fighter/fighter' : '/pages/mine/mine' });
}
});
},
@@ -1009,6 +1061,7 @@ Page(createPage({
lockPrimaryRole('dashou');
wx.hideLoading();
wx.showToast({ title: '登录注册成功!', icon: 'success', duration: 2000 });
+ that._goFighterHomeAfterRegister();
} else {
wx.hideLoading();
wx.showToast({ title: (res.data && res.data.msg) || '登录注册失败', icon: 'none' });
@@ -1176,6 +1229,7 @@ Page(createPage({
lockPrimaryRole('dashou');
wx.showToast({ title: '注册成功!', icon: 'success', duration: 2000 });
this._updateTotalAssets();
+ this._goFighterHomeAfterRegister();
} else {
this.setData({ isLoading: false, isAutoRegistering: false });
wx.showToast({ title: (res.data && res.data.message) || '注册失败', icon: 'error', duration: 2000 });
@@ -1472,7 +1526,9 @@ Page(createPage({
const that = this;
wx.showModal({
title: '提示',
- content: '使用此功能后,您将不属于任何管事,确认注册吗?',
+ content: isFighterOnly()
+ ? '将使用默认管事邀请码完成注册,确认继续吗?'
+ : '使用此功能后,您将不属于任何管事,确认注册吗?',
success: (res) => {
if (res.confirm) {
that.setData({ inviteCode: PLATFORM_INVITE_CODE });
diff --git a/pages/fighter/fighter.wxml b/pages/fighter/fighter.wxml
index c78fd46..2952f59 100644
--- a/pages/fighter/fighter.wxml
+++ b/pages/fighter/fighter.wxml
@@ -9,12 +9,12 @@
- 接单员认证
-
+ {{isAutoRegistering ? '正在自动注册...' : '接单员认证'}}
+
立即注册
- 平台直签注册
- 返回点单端
- 退出登录
+ 一键登录
+ 默认管事注册
+ 清除缓存 / 退出
diff --git a/tab-bar/index.js b/tab-bar/index.js
index 872ec1f..6952f47 100644
--- a/tab-bar/index.js
+++ b/tab-bar/index.js
@@ -1,6 +1,7 @@
-// tab-bar/index.js — 三端固定,无身份切换
+// tab-bar/index.js — 纯打手端固定 Tab(点单/商家配置保留但不启用)
const app = getApp();
import { getTabRole } from '../utils/primary-role.js';
+import { isFighterOnly } from '../utils/fighter-only.js';
const roleCfg = {
normal: {
@@ -118,7 +119,10 @@ Component({
refresh() {
const token = wx.getStorageSync('token');
let role = getTabRole(app);
- if (!token) {
+ // 纯打手端:无 token 也固定打手 Tab,绝不回落点单端
+ if (isFighterOnly()) {
+ role = 'dashou';
+ } else if (!token) {
role = 'normal';
}
app.globalData.currentRole = role;
@@ -126,8 +130,8 @@ Component({
let cfg = roleCfg[role];
if (!cfg) {
- cfg = roleCfg.normal;
- role = 'normal';
+ cfg = isFighterOnly() ? roleCfg.dashou : roleCfg.normal;
+ role = isFighterOnly() ? 'dashou' : 'normal';
}
const list = cfg.tabList.map((v, i) => ({ ...v, index: i }));
diff --git a/utils/base-page.js b/utils/base-page.js
index bb13c82..47358cc 100644
--- a/utils/base-page.js
+++ b/utils/base-page.js
@@ -134,17 +134,34 @@ const BASE_METHODS = {
// ---------- 清除缓存 ----------
clearCache() {
+ const fighterOnly = (() => {
+ try {
+ return require('./fighter-only.js').isFighterOnly();
+ } catch (e) {
+ return false;
+ }
+ })();
wx.showModal({
title: '清除缓存',
- content: '将清除所有登录与身份数据,并回到点单端,确定继续?',
+ content: fighterOnly
+ ? '将清除所有登录与身份数据,并回到打手端「我的」,确定继续?'
+ : '将清除所有登录与身份数据,并回到点单端,确定继续?',
confirmText: '确定',
cancelText: '取消',
success: (r) => { if (r.confirm) clearCacheAndEnterNormal(this); },
});
},
- // ---------- 返回点单端 ----------
+ // ---------- 返回点单端(纯打手端禁用) ----------
switchToNormal() {
+ try {
+ const { isFighterOnly, FIGHTER_MINE } = require('./fighter-only.js');
+ if (isFighterOnly()) {
+ wx.showToast({ title: '当前为打手端小程序', icon: 'none' });
+ wx.reLaunch({ url: FIGHTER_MINE });
+ return;
+ }
+ } catch (e) {}
lockPrimaryRole('normal');
wx.reLaunch({ url: '/pages/mine/mine' });
},
diff --git a/utils/fighter-only.js b/utils/fighter-only.js
new file mode 100644
index 0000000..4a30aff
--- /dev/null
+++ b/utils/fighter-only.js
@@ -0,0 +1,32 @@
+/**
+ * 纯打手端开关:点单端页面保留但不作为入口/回落目标。
+ * 回退:git checkout backup/before-fighter-only-20260727
+ * 或:git reset --hard backup-fighter-only-20260727
+ */
+export const FIGHTER_ONLY = true
+
+/** 无邀请码搜索进入时,自动注册绑定的管事邀请码(前端硬编码) */
+export const FIGHTER_ONLY_DEFAULT_INVITE = '0000008VfJKPu4Spmcjt'
+
+/** 已认证打手冷启动默认页 */
+export const FIGHTER_HOME = '/pages/accept-order/accept-order'
+
+/** 未登录 / 未认证 / 清缓存后的落地页(注册 + 我的) */
+export const FIGHTER_MINE = '/pages/fighter/fighter'
+
+export function isFighterOnly() {
+ return FIGHTER_ONLY === true
+}
+
+export function isDashouCertified() {
+ return Number(wx.getStorageSync('dashoustatus')) === 1
+}
+
+/** 冷启动应去的页面 */
+export function resolveFighterOnlyLaunchUrl() {
+ const token = wx.getStorageSync('token')
+ if (token && isDashouCertified()) {
+ return FIGHTER_HOME
+ }
+ return FIGHTER_MINE
+}
diff --git a/utils/primary-role.js b/utils/primary-role.js
index cb949e3..1b980ef 100644
--- a/utils/primary-role.js
+++ b/utils/primary-role.js
@@ -2,6 +2,7 @@
import { isStaffMode } from './staff-api.js';
import { ensurePhoneAuth } from './phone-auth.js';
+import { isFighterOnly, FIGHTER_HOME, FIGHTER_MINE } from './fighter-only.js';
const VALID = ['normal', 'dashou', 'shangjia'];
const LEGACY_CENTER_ROLES = ['guanshi', 'zuzhang', 'kaoheguan'];
@@ -34,6 +35,10 @@ export function isRoleStatusActive(status) {
/** 读取主端(兼容旧 currentRole / 管事组长落地页) */
export function getPrimaryRole(app) {
app = app || getApp();
+ // 纯打手端:始终锁定 dashou,不进入点单/商家主端
+ if (isFighterOnly()) {
+ return 'dashou';
+ }
const stored = wx.getStorageSync('primaryRole');
if (VALID.includes(stored)) {
return stored;
@@ -83,13 +88,14 @@ export function getTabRole(app) {
export function clearPrimaryRole(app) {
app = app || getApp();
wx.removeStorageSync('primaryRole');
- lockPrimaryRole('normal', app);
+ // 纯打手端清缓存后仍锁定打手端,避免回落点单
+ lockPrimaryRole(isFighterOnly() ? 'dashou' : 'normal', app);
}
export const PRIMARY_DEFAULT_PAGES = {
- normal: '/pages/mine/mine',
- dashou: '/pages/accept-order/accept-order',
- shangjia: '/pages/merchant-home/merchant-home',
+ normal: isFighterOnly() ? FIGHTER_MINE : '/pages/mine/mine',
+ dashou: FIGHTER_HOME,
+ shangjia: isFighterOnly() ? FIGHTER_HOME : '/pages/merchant-home/merchant-home',
};
/** 锁定主端并跳转到该端默认首页,同时建立 IM 长连接 */
diff --git a/utils/role-tab-bar.js b/utils/role-tab-bar.js
index 39f766f..31b11c1 100644
--- a/utils/role-tab-bar.js
+++ b/utils/role-tab-bar.js
@@ -142,9 +142,16 @@ export function syncProfileFields(data) {
});
}
-/** 清除缓存:清空登录与身份,回到点单端「我的」 */
+/** 清除缓存:清空登录与身份;纯打手端回到打手「我的」,否则点单「我的」 */
export function clearCacheAndEnterNormal(page) {
resetGuestSession(page, { skipPageReset: true });
+ 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' });
}
@@ -189,7 +196,12 @@ export function resetGuestSession(page, options = {}) {
app.globalData._dashouPhoneChecked = false;
app.globalData._shangjiaPhoneChecked = false;
- app.emitEvent('currentRoleChanged', { role: 'normal' });
+ let emitRole = 'normal';
+ try {
+ const { isFighterOnly } = require('./fighter-only.js');
+ if (isFighterOnly()) emitRole = 'dashou';
+ } catch (e) {}
+ app.emitEvent('currentRoleChanged', { role: emitRole });
refreshTabBar(page);
if (!options.skipPageReset && page && page.setData) {