341 lines
8.8 KiB
JavaScript
341 lines
8.8 KiB
JavaScript
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: '加载失败'
|
||
});
|
||
});
|
||
}
|
||
});
|