2026-04-01 18:00:40 +08:00

341 lines
8.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const { API } = require('../../utils/constants');
const { request } = require('../../utils/http');
const { formatDateTime, eventStatusText, eventFormatText } = require('../../utils/format');
/** 统一后台轮播字段(camelCase / PascalCase、枚举数字)供 wxml 绑定 */
function normalizeBannerItem(raw) {
if (!raw || typeof raw !== 'object') {
return { imageUrl: '', linkType: '', eventId: null, linkUrl: '' };
}
const imageUrl = raw.imageUrl || raw.ImageUrl || '';
const linkUrl = String(raw.linkUrl || raw.LinkUrl || '').trim();
let linkType = raw.linkType != null ? raw.linkType : raw.LinkType;
const rawEventId = raw.eventId != null ? raw.eventId : raw.EventId;
const eventId =
rawEventId != null && rawEventId !== '' ? Number(rawEventId) : null;
const idOk = Number.isFinite(eventId) && eventId > 0;
if (typeof linkType === 'number') {
if (linkType === 1) linkType = 'Event';
else if (linkType === 2) linkType = 'Url';
else if (linkType === 0) linkType = '';
else linkType = String(linkType);
} else if (typeof linkType === 'string') {
const lower = linkType.toLowerCase();
if (lower === 'event') linkType = 'Event';
else if (lower === 'url' || lower === 'link' || lower === 'external') linkType = 'Url';
}
if (linkType == null || linkType === '' || linkType === '0') {
if (idOk) linkType = 'Event';
else if (linkUrl) linkType = 'Url';
else linkType = '';
}
return {
imageUrl,
linkType,
eventId: idOk ? eventId : null,
linkUrl
};
}
Page({
data: {
sectionTab: 'list',
loggedIn: false,
banners: [],
rows: [],
loading: false,
loadingText: '加载中...',
pageNo: 1,
pageSize: 10,
hasMore: true,
status: 1,
keyword: '',
refresherTriggered: false
},
onLoad() {
this.fetchBanners();
this.loadEvents(true);
},
onShow() {
const loggedIn = !!(wx.getStorageSync('accessToken') || '');
this.setData({ loggedIn });
if (this.data.sectionTab === 'registered' && loggedIn) {
this.loadMyEvents(true);
}
},
/** 页面 disableScroll 后,下拉刷新由 scroll-view 的 refresher 承担 */
onRefresherRefresh() {
this.setData({ refresherTriggered: true });
this.fetchBanners();
const p =
this.data.sectionTab === 'list'
? this.loadEvents(true)
: this.loadMyEvents(true);
p.finally(() => {
this.setData({ refresherTriggered: false });
});
},
onPullDownRefresh() {
this.fetchBanners();
const p =
this.data.sectionTab === 'list'
? this.loadEvents(true)
: this.loadMyEvents(true);
p.finally(() => {
wx.stopPullDownRefresh();
});
},
fetchBanners() {
request({
path: API.banners,
method: 'GET',
needAuth: false
})
.then((data) => {
const arr = Array.isArray(data) ? data : [];
const banners = arr.map((item, index) => ({
...normalizeBannerItem(item),
_bannerKey: index
}));
this.setData({ banners });
})
.catch(() => {
this.setData({ banners: [] });
});
},
onSectionTab(e) {
const tab = e.currentTarget.dataset.tab;
if (!tab || tab === this.data.sectionTab) return;
this.setData({
sectionTab: tab,
pageNo: 1,
rows: [],
hasMore: true
});
if (tab === 'list') {
this.loadEvents(true);
} else {
this.loadMyEvents(true);
}
},
onStatusTap(e) {
const status = Number(e.currentTarget.dataset.status);
this.setData({
status,
pageNo: 1,
rows: [],
hasMore: true
});
this.loadEvents(true);
},
onKeywordInput(e) {
this.setData({ keyword: e.detail.value || '' });
},
onSearch() {
if (this.data.sectionTab !== 'list') {
this.setData({ sectionTab: 'list', pageNo: 1, rows: [], hasMore: true });
}
this.setData({
pageNo: 1,
rows: [],
hasMore: true
});
this.loadEvents(true);
},
onScrollToLower() {
if (this.data.loading || !this.data.hasMore) return;
if (this.data.sectionTab === 'list') {
const next = this.data.pageNo + 1;
this.setData({ pageNo: next });
this.loadEvents(false);
} else {
if (!this.data.loggedIn) return;
const next = this.data.pageNo + 1;
this.setData({ pageNo: next });
this.loadMyEvents(false);
}
},
goLogin() {
wx.navigateTo({ url: '/subpackages/mine/login/login' });
},
onBannerTap(e) {
const linkType = e.currentTarget.dataset.linktype;
const eventId = Number(e.currentTarget.dataset.eventid);
const linkUrl = e.currentTarget.dataset.linkurl || '';
if (linkType === 'Event' && eventId > 0) {
wx.navigateTo({ url: `/pages/detail/detail?id=${eventId}` });
return;
}
if (linkUrl) {
wx.showToast({ title: '该轮播链接为外部链接/其他跳转,请在后台配置', icon: 'none' });
}
},
onEventTap(e) {
const id = Number(e.currentTarget.dataset.id);
if (!id) return;
wx.navigateTo({ url: `/pages/detail/detail?id=${id}` });
},
loadEvents(reset) {
if (this.data.loading) return Promise.resolve();
if (reset) {
this.setData({
rows: [],
pageNo: 1,
hasMore: true
});
}
this.setData({ loading: true });
const pageNo = reset ? 1 : this.data.pageNo;
const pageSize = this.data.pageSize;
const status = this.data.status;
const keyword = this.data.keyword;
return request({
path: API.eventList,
method: 'GET',
needAuth: false,
data: {
page: pageNo,
pagesize: pageSize,
PageNo: pageNo,
PageSize: pageSize,
status,
Status: status,
keyword,
Keyword: keyword
}
})
.then((res) => {
const rows = (res && Array.isArray(res.rows) ? res.rows : []).map((item) => {
const id = item.id;
return {
...item,
rowKey: `e-${id}`,
registrationStartText: formatDateTime(item.registrationStartTime),
registrationEndText: formatDateTime(item.registrationEndTime),
matchStartText: formatDateTime(item.matchStartTime),
matchEndText: formatDateTime(item.matchEndTime),
eventStatusText: eventStatusText(item.eventStatus),
eventFormatText: eventFormatText(item.eventType || item.eventFormat)
};
});
const nextRows = reset ? rows : this.data.rows.concat(rows);
const pages = res && typeof res.pages === 'number' ? res.pages : 1;
const hasMore = pageNo < pages && rows.length > 0;
this.setData({
rows: nextRows,
hasMore,
loading: false,
loadingText: hasMore ? '加载中...' : '没有更多了'
});
})
.catch((err) => {
this.setData({
loading: false,
hasMore: false,
rows: reset ? [] : this.data.rows,
loadingText: err && err.message ? err.message : '加载失败'
});
});
},
loadMyEvents(reset) {
if (!this.data.loggedIn) {
this.setData({ rows: [], loading: false });
return Promise.resolve();
}
if (this.data.loading) return Promise.resolve();
if (reset) {
this.setData({
rows: [],
pageNo: 1,
hasMore: true
});
}
this.setData({ loading: true });
const pageNo = reset ? 1 : this.data.pageNo;
const pageSize = this.data.pageSize;
return request({
path: API.eventMyList,
method: 'GET',
needAuth: true,
data: {
page: pageNo,
pagesize: pageSize,
PageNo: pageNo,
PageSize: pageSize
}
})
.then((res) => {
const rows = (res && Array.isArray(res.rows) ? res.rows : []).map((item) => {
const eid = item.eventId;
const rid = item.registrationId;
return {
id: eid,
rowKey: `m-${rid}`,
eventName: item.eventName,
coverImage: item.coverImage,
address: '',
eventStatusText: '已报名',
registrationTimeText: formatDateTime(item.registrationTime),
projectCount: item.projectCount,
eventFormatText: ''
};
});
const nextRows = reset ? rows : this.data.rows.concat(rows);
const pages = res && typeof res.pages === 'number' ? res.pages : 1;
const hasMore = pageNo < pages && rows.length > 0;
this.setData({
rows: nextRows,
hasMore,
loading: false,
loadingText: hasMore ? '加载中...' : '没有更多了'
});
})
.catch(() => {
this.setData({
loading: false,
hasMore: false,
rows: reset ? [] : this.data.rows,
loadingText: '加载失败'
});
});
}
});