统一排行榜对齐星雀UI,页面资源后台配置实时刷新

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-06-27 01:26:11 +08:00
parent 1ab2e2080a
commit 21112173f2
292 changed files with 64010 additions and 81 deletions

View File

@@ -0,0 +1,548 @@
// pages/guanshizhongxin/guanshizhongxin.js
import request from '../../utils/request.js';
import popupService from '../../services/popupService.js';
import { getDefaultInviteCode } from '../../utils/default-invite-code.js';
import { getGroupImgUrls, GUANSHIDUAN_DEFAULTS, buildOssUrl } from '../../utils/page-assets.js';
Page({
data: {
// 图片路径对象逻辑层拼接完整URL
imgUrls: {},
isGuanshi: false,
isLoading: false,
inviteCode: '',
uid: '',
nicheng: '',
avatarUrl: '',
// 管事信息
gszhstatus: '',
yaoqingzongshu: 0,
fenyongzonge: '0.00',
fenyongtixian: '0.00',
yichongzhiDashou: 0,
zhuanhualv: 0,
// 称号列表
chenghaoList: [],
// 邀请人(组长)缓存
inviterCache: null,
},
onLoad(options) {
const app = getApp();
this._onConfigReady = () => this.initImageUrls();
app.on('configReady', this._onConfigReady);
this.initImageUrls();
// 处理扫码 scene
if (options.scene) {
try {
const scene = decodeURIComponent(options.scene);
options.inviteCode = scene;
} catch (e) {
console.error('scene解码失败', e);
}
}
this.checkGuanshiStatus();
const { inviteCode } = options || {};
if (inviteCode) {
this.setData({ inviteCode });
setTimeout(() => {
this.handleInviteCodeWithLoginCheck(inviteCode);
}, 500);
}
if (!app.globalData.hasShownPopupOnColdStart) {
app.globalData.hasShownPopupOnColdStart = true;
setTimeout(() => {
popupService.checkAndShow(this, 'guanshiduan');
}, 300);
}
},
onHide() {
const popupComp = this.selectComponent('#popupNotice');
if (popupComp && popupComp.cleanup) {
popupComp.cleanup();
}
},
onUnload() {
if (this._onConfigReady) {
getApp().off('configReady', this._onConfigReady);
}
},
initImageUrls() {
const urls = getGroupImgUrls('guanshiduan', GUANSHIDUAN_DEFAULTS);
const g = getApp().globalData;
urls.avatarDefault = buildOssUrl(g.morentouxiang || GUANSHIDUAN_DEFAULTS.avatarDefault);
this.setData({ imgUrls: urls });
},
onShow() {
this.initImageUrls();
const inviterCache = wx.getStorageSync('inviterCache') || null;
this.setData({ inviterCache });
this.registerNotificationComponent();
if (this.data.isGuanshi) {
setTimeout(() => {
this.getGuanshiInfo();
this.fetchChenghaoList();
}, 300);
}
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
const options = currentPage.options || {};
if (options.inviteCode && !this.data.isGuanshi) {
setTimeout(() => {
this.handleInviteCodeWithLoginCheck(options.inviteCode);
}, 300);
}
},
// ========== 全局通知注册 ==========
registerNotificationComponent() {
const app = getApp();
const comp = this.selectComponent('#global-notification');
if (comp && comp.showNotification) {
app.globalData.globalNotification = {
show: (data) => comp.showNotification(data),
hide: () => comp.hideNotification()
};
}
},
// ========== 称号列表(新接口,区分管事) ==========
async fetchChenghaoList() {
try {
const res = await request({
url: '/dengji/chenghao',
method: 'POST',
data: { role: 'guanshi' }
});
if (res && res.data.code === 0 && res.data.data) {
this.setData({ chenghaoList: res.data.data.chenghao_list || [] });
}
} catch (e) {
console.error('获取称号失败', e);
}
},
// ========== 联系组长(新接口) ==========
// 管事联系组长 —— 获取组长信息并跳转聊天
// 管事联系组长
async contactInviter() {
wx.showLoading({ title: '获取组长信息...', mask: true });
try {
const res = await request({
url: '/yonghu/guanshi_contact',
method: 'POST'
});
if (res && res.data.code === 200 && res.data.data) {
const inviter = res.data.data;
const ossImageUrl = getApp().globalData.ossImageUrl || '';
const fullAvatar = inviter.touxiang
? (inviter.touxiang.startsWith('http') ? inviter.touxiang : ossImageUrl + inviter.touxiang)
: '';
// 缓存邀请人信息
const cacheData = {
uid: inviter.uid,
nicheng: inviter.nicheng || '',
avatar: fullAvatar
};
wx.setStorageSync('inviterCache', cacheData);
this.setData({ inviterCache: cacheData });
// 跳转聊天(组长前缀请确认,默认 'Zz'
const param = {
toUserId: 'Zz' + inviter.uid,
toName: inviter.nicheng || '组长',
toAvatar: fullAvatar
};
wx.navigateTo({
url: '/pages/liaotian/liaotian?data=' + encodeURIComponent(JSON.stringify(param))
});
} else {
wx.showToast({ title: '未绑定邀请人', icon: 'none' });
}
} catch (e) {
wx.showToast({ title: '网络错误', icon: 'none' });
} finally {
wx.hideLoading();
}
},
// ========== 邀请码处理(完全照搬打手端) ==========
handleInviteCodeWithLoginCheck(inviteCode) {
const token = wx.getStorageSync('token');
const uid = wx.getStorageSync('uid');
if (!token || !uid) {
this.loginAndRegisterWithInviteCode(inviteCode);
} else {
if (!this.data.isGuanshi) {
wx.showLoading({ title: '自动注册中...', mask: true });
this.callRegisterApi(inviteCode);
} else {
wx.showToast({ title: '您已是管事', icon: 'success' });
}
}
},
loginAndRegisterWithInviteCode(inviteCode) {
const that = this;
wx.showLoading({ title: '登录注册中...', mask: true });
wx.login({
success: (loginRes) => {
if (loginRes.code) {
that.callLoginRegisterApi(loginRes.code, inviteCode);
} else {
wx.hideLoading();
wx.showToast({ title: '微信登录失败', icon: 'none' });
}
},
fail: () => {
wx.hideLoading();
wx.reLaunch({ url: '/pages/gerenzhongxin/gerenzhongxin' });
}
});
},
callLoginRegisterApi(code, inviteCode) {
const that = this;
const app = getApp();
const apiBaseUrl = app.globalData.apiBaseUrl;
if (!apiBaseUrl) {
wx.hideLoading();
wx.showToast({ title: '服务器配置错误', icon: 'none' });
return;
}
wx.request({
url: apiBaseUrl + '/yonghu/zuzhangyqmzc',
method: 'POST',
data: { code: code, inviteCode: inviteCode },
header: { 'content-type': 'application/json' },
success: (res) => {
if (res.statusCode === 200 && res.data && res.data.code === 200 && res.data.data) {
const userData = res.data.data;
if (userData.token) wx.setStorageSync('token', userData.token);
const identityFields = ['nicheng', 'uid', 'touxiang', 'dashoustatus', 'guanshistatus', 'shangjiastatus', 'zuzhangstatus'];
identityFields.forEach(field => {
if (userData[field] !== undefined) {
wx.setStorageSync(field, userData[field]);
app.globalData[field] = userData[field];
}
});
if (userData.guanshistatus === undefined) {
wx.setStorageSync('guanshistatus', 1);
app.globalData.guanshistatus = 1;
}
const groupFields = ['dashouqun', 'dashouqunid', 'guanshiqun', 'guanshiqunid'];
groupFields.forEach(field => {
if (userData[field] !== undefined) {
wx.setStorageSync(field, userData[field]);
app.globalData[field] = userData[field];
}
});
const guanshiData = {
gszhstatus: userData.gszhstatus || '',
yaoqingzongshu: userData.yaoqingzongshu || 0,
fenyongzonge: userData.fenyongzonge || '0.00',
fenyongtixian: userData.fenyongtixian || '0.00',
yichongzhiDashou: userData.yichongzhiDashou || 0
};
if (!app.globalData.guanshi) app.globalData.guanshi = {};
Object.assign(app.globalData.guanshi, guanshiData);
const zhuanhualv = guanshiData.yaoqingzongshu > 0
? (guanshiData.yichongzhiDashou / guanshiData.yaoqingzongshu * 100).toFixed(1)
: 0;
that.setData({
isGuanshi: true,
uid: userData.uid || '',
nicheng: userData.nicheng || '',
...guanshiData,
zhuanhualv,
isLoading: false
});
that.loadUserInfo();
that.switchToGuanshiRole();
wx.hideLoading();
wx.showToast({ title: '注册成功!', icon: 'success', duration: 2000 });
} else {
wx.hideLoading();
wx.showToast({ title: (res.data && res.data.msg) || '注册失败', icon: 'none' });
}
},
fail: () => {
wx.hideLoading();
wx.showToast({ title: '网络请求失败', icon: 'none' });
}
});
},
async callRegisterApi(inviteCode) {
try {
const res = await request({
url: '/yonghu/guanshizhuce',
method: 'POST',
data: { inviteCode }
});
if (res && res.data.code === 200 && res.data.data) {
const userData = res.data.data;
const identityFields = ['nicheng', 'uid', 'touxiang', 'dashoustatus', 'guanshistatus', 'shangjiastatus', 'zuzhangstatus'];
const app = getApp();
identityFields.forEach(field => {
if (userData[field] !== undefined) {
wx.setStorageSync(field, userData[field]);
app.globalData[field] = userData[field];
}
});
if (userData.guanshistatus === undefined) {
wx.setStorageSync('guanshistatus', 1);
app.globalData.guanshistatus = 1;
}
const guanshiData = {
gszhstatus: userData.gszhstatus || '',
yaoqingzongshu: userData.yaoqingzongshu || 0,
fenyongzonge: userData.fenyongzonge || '0.00',
fenyongtixian: userData.fenyongtixian || '0.00',
yichongzhiDashou: userData.yichongzhiDashou || 0
};
if (!app.globalData.guanshi) app.globalData.guanshi = {};
Object.assign(app.globalData.guanshi, guanshiData);
const zhuanhualv = guanshiData.yaoqingzongshu > 0
? (guanshiData.yichongzhiDashou / guanshiData.yaoqingzongshu * 100).toFixed(1)
: 0;
this.setData({
isGuanshi: true,
uid: userData.uid || '',
nicheng: userData.nicheng || '',
...guanshiData,
zhuanhualv,
isLoading: false
});
this.loadUserInfo();
this.switchToGuanshiRole();
wx.hideLoading();
wx.showToast({ title: '注册成功!', icon: 'success', duration: 2000 });
} else {
wx.hideLoading();
wx.showToast({ title: res?.data?.msg || '注册失败', icon: 'none' });
}
} catch (e) {
console.error('注册失败:', e);
wx.hideLoading();
wx.showToast({ title: e.message || '注册失败', icon: 'error' });
}
},
switchToGuanshiRole() {
const app = getApp();
app.globalData.currentRole = 'guanshi';
wx.setStorageSync('currentRole', 'guanshi');
const tabBar = this.getTabBar();
if (tabBar && tabBar.refresh) tabBar.refresh();
if (app.connectForCurrentRole) {
app.connectForCurrentRole();
} else if (app.ensureConnection) {
app.ensureConnection();
}
},
checkGuanshiStatus() {
try {
const status = wx.getStorageSync('guanshistatus');
if (status === 1) {
this.setData({ isGuanshi: true });
this.loadUserInfo();
this.checkGlobalData();
} else {
this.setData({ isGuanshi: false });
}
} catch (e) {
this.setData({ isGuanshi: false });
}
},
loadUserInfo() {
const app = getApp();
const globalData = app.globalData || {};
const touxiang = wx.getStorageSync('touxiang');
const ossImageUrl = globalData.ossImageUrl || '';
const morentouxiang = 'avatar/default.jpg';
let avatarUrl = '';
if (touxiang) {
avatarUrl = ossImageUrl + (touxiang.startsWith('/') ? touxiang : '/' + touxiang);
} else {
avatarUrl = ossImageUrl + (morentouxiang.startsWith('/') ? morentouxiang : '/' + morentouxiang);
}
this.setData({
avatarUrl,
uid: wx.getStorageSync('uid') || '',
nicheng: globalData.nicheng || ''
});
},
checkGlobalData() {
const app = getApp();
const gd = app.globalData.guanshi || {};
const needRefresh = !gd.yaoqingzongshu && !gd.fenyongzonge && !gd.fenyongtixian;
if (needRefresh) {
this.getGuanshiInfo();
} else {
this.setDataFromGlobalData();
}
},
setDataFromGlobalData() {
const gd = getApp().globalData.guanshi || {};
const zhuanhualv = gd.yaoqingzongshu > 0
? (gd.yichongzhiDashou / gd.yaoqingzongshu * 100).toFixed(1)
: 0;
this.setData({
gszhstatus: gd.gszhstatus || '',
yaoqingzongshu: gd.yaoqingzongshu || 0,
fenyongzonge: gd.fenyongzonge || '0.00',
fenyongtixian: gd.fenyongtixian || '0.00',
yichongzhiDashou: gd.yichongzhiDashou || 0,
zhuanhualv,
isLoading: false
});
},
async getGuanshiInfo() {
this.setData({ isLoading: true });
try {
const res = await request({
url: '/yonghu/guanshixinxi',
method: 'POST'
});
if (res && res.data.code === 200) {
const data = res.data.data;
const app = getApp();
if (!app.globalData.guanshi) app.globalData.guanshi = {};
const updateData = {
gszhstatus: data.gszhstatus || '',
yaoqingzongshu: data.yaoqingzongshu || 0,
fenyongzonge: data.fenyongzonge || '0.00',
fenyongtixian: data.fenyongtixian || '0.00',
yichongzhiDashou: data.yichongzhiDashou || 0
};
Object.assign(app.globalData.guanshi, updateData);
const zhuanhualv = updateData.yaoqingzongshu > 0
? (updateData.yichongzhiDashou / updateData.yaoqingzongshu * 100).toFixed(1)
: 0;
this.setData({
...updateData,
zhuanhualv,
isLoading: false
});
wx.showToast({ title: '信息已更新', icon: 'success', duration: 1500 });
}
} catch (e) {
this.setData({ isLoading: false });
wx.showToast({ title: e.message || '获取失败', icon: 'error' });
}
},
refreshGuanshiInfo() {
this.getGuanshiInfo();
this.fetchChenghaoList();
},
onInviteCodeInput(e) {
this.setData({ inviteCode: e.detail.value.trim() });
},
async onRegister() {
const { inviteCode } = this.data;
if (!inviteCode) {
wx.showToast({ title: '请输入邀请码', icon: 'none' });
return;
}
if (inviteCode.length > 100) {
wx.showToast({ title: '邀请码过长', icon: 'none' });
return;
}
this.setData({ isLoading: true });
try {
const res = await request({
url: '/yonghu/guanshizhuce',
method: 'POST',
data: { inviteCode }
});
if (res && res.data.code === 200) {
const userData = res.data.data;
const identityFields = ['dashoustatus', 'guanshistatus', 'shangjiastatus', 'zuzhangstatus'];
const app = getApp();
identityFields.forEach(field => {
if (userData[field] !== undefined) {
wx.setStorageSync(field, userData[field]);
app.globalData[field] = userData[field];
}
});
if (userData.guanshistatus === undefined) {
wx.setStorageSync('guanshistatus', 1);
app.globalData.guanshistatus = 1;
}
if (!app.globalData.guanshi) app.globalData.guanshi = {};
const updateData = {
gszhstatus: userData.gszhstatus || '',
yaoqingzongshu: userData.yaoqingzongshu || 0,
fenyongzonge: userData.fenyongzonge || '0.00',
fenyongtixian: userData.fenyongtixian || '0.00',
yichongzhiDashou: userData.yichongzhiDashou || 0
};
Object.assign(app.globalData.guanshi, updateData);
this.setData({
isGuanshi: true,
...updateData,
isLoading: false
});
this.loadUserInfo();
wx.showToast({ title: '注册成功!', icon: 'success', duration: 2000 });
}
} catch (e) {
this.setData({ isLoading: false });
wx.showToast({ title: e.message || '注册失败', icon: 'error' });
}
},
onQuickRegister() {
const code = getDefaultInviteCode('guanshi');
if (!code) {
wx.showToast({ title: '暂不支持无邀请码注册', icon: 'none' });
return;
}
this.setData({ inviteCode: code });
this.onRegister();
},
copyUid() {
const { uid } = this.data;
if (!uid) return;
wx.setClipboardData({
data: uid,
success: () => wx.showToast({ title: '已复制', icon: 'success' })
});
},
// ========== 页面跳转 ==========
goToWithdraw() { wx.navigateTo({ url: '/pages/tixian/tixian' }); },
goToInviteUser() { wx.navigateTo({ url: '/pages/yaoqingdashou/yaoqingdashou' }); },
goToMySubordinate() { wx.navigateTo({ url: '/pages/wodedashou/wodedashou' }); },
goToRechargeRecord() { wx.navigateTo({ url: '/pages/czjilu/czjilu' }); },
goToGuanshiRanking() {
wx.navigateTo({ url: '/pages/dashoupaihang/dashoupaihang?type=guanshi' })
},
goToPromoPoster() { wx.navigateTo({ url: '/pages/haibao/haibao' }); }
});