统一排行榜对齐星雀UI,页面资源后台配置实时刷新
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
548
miniprogram/pages/guanshiduan/guanshiduan.js
Normal file
548
miniprogram/pages/guanshiduan/guanshiduan.js
Normal 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' }); }
|
||||
});
|
||||
Reference in New Issue
Block a user