Files
toutoukan_front/miniprogram/pages/home/home.ts

131 lines
4.4 KiB
TypeScript
Raw Normal View History

2025-08-09 17:41:14 +08:00
Component({
data: {
processedCardsData: [] as any[]
},
lifetimes: {
2025-09-26 01:02:43 +08:00
attached() {
// 从全局获取处理后的卡片数据
const app = getApp();
app.fetchRawCardData().then(cards => {
this.setData({ processedCardsData: cards });
}).catch(err => {
wx.showToast({ title: '加载失败', icon: 'none' });
});
},
},
methods: {
processVoteData(cards: any[]): any[] {
return cards.map(card => {
const totalVoters = card.total_voters;
const optionsWithPercentage = card.options.map((option: any) => {
let percentage: number;
if (totalVoters === 0) {
percentage = 0;
} else {
percentage = Number((option.votes / totalVoters * 100).toFixed(0));
}
return {
...option,
percentage: percentage,
isSelected: false
};
});
return {
...card,
options: optionsWithPercentage,
// 在每个卡片对象内部维护自己的选中状态数组
selectedOptions: [] as number[]
};
});
},
2025-09-24 21:10:29 +08:00
selectOption(e: WechatMiniprogram.TouchEvent) {
const { optionId, cardId } = e.currentTarget.dataset as { optionId: number; cardId: number };
const cardIndex = this.data.processedCardsData.findIndex(card => card.article_id === cardId);
if (cardIndex === -1) {
return;
2025-09-24 21:10:29 +08:00
}
const card = this.data.processedCardsData[cardIndex];
if (card.is_ended) {
return;
}
const newProcessedCardsData = [...this.data.processedCardsData];
const currentCard = newProcessedCardsData[cardIndex];
if (currentCard.vote_type === 'multiple') {
// 多选逻辑
const option = currentCard.options.find((o: any) => o.id === optionId);
if (option) {
option.isSelected = !option.isSelected;
}
currentCard.selectedOptions = currentCard.options
.filter((o: any) => o.isSelected)
.map((o: any) => o.id);
} else if (currentCard.vote_type === 'single') {
// 单选逻辑
currentCard.options.forEach((option: any) => {
option.isSelected = (option.id === optionId);
});
currentCard.selectedOptions = currentCard.options
.filter((o: any) => o.isSelected)
.map((o: any) => o.id);
}
this.setData({
processedCardsData: newProcessedCardsData
}, () => {
console.log(`卡片 ${cardId} 当前选中项:`, currentCard.selectedOptions);
});
2025-09-24 21:10:29 +08:00
},
submitVote(e: WechatMiniprogram.TouchEvent) {
const { cardId } = e.currentTarget.dataset as { cardId: number };
const card = this.data.processedCardsData.find(c => c.article_id === cardId);
if (!card) {
console.error('未找到对应的卡片数据');
return;
2025-09-24 21:10:29 +08:00
}
const selected = card.selectedOptions;
if (!selected || selected.length === 0) {
wx.showToast({
title: '请先选择至少一个选项',
icon: 'none',
duration: 2000
});
return;
}
// 在这里输出你想要的信息
console.log(`正在提交卡片ID: ${card.article_id}`);
console.log('所选选项ID:', selected);
// 触发父组件的事件并传递卡片ID和选中的选项
2025-09-24 21:10:29 +08:00
this.triggerEvent('voteSuccess', {
cardId: card.article_id,
selectedOptions: selected,
timestamp: Date.now()
2025-09-24 21:10:29 +08:00
});
2025-09-24 21:10:29 +08:00
wx.showToast({
title: '投票成功',
icon: 'success',
duration: 2000
2025-09-24 21:10:29 +08:00
});
2025-09-26 01:02:43 +08:00
},
goToDetail(e: { currentTarget: { dataset: { id: any; }; }; }) {
const id = e.currentTarget.dataset.id;
console.log(id)
wx.navigateTo({
url: `/pages/articledetail/articledetail?id=${id}`,
});
2025-09-24 21:10:29 +08:00
}
}
});