2025-09-27 17:24:52 +08:00
|
|
|
|
import envConfig from "../../env";
|
|
|
|
|
|
|
2025-08-09 17:41:14 +08:00
|
|
|
|
Component({
|
2025-09-25 01:18:30 +08:00
|
|
|
|
data: {
|
2025-09-27 17:24:52 +08:00
|
|
|
|
processedCardsData: [] as any[],
|
|
|
|
|
|
refresherTriggered: false,
|
|
|
|
|
|
url:""
|
2025-09-25 01:18:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
lifetimes: {
|
2025-09-26 01:02:43 +08:00
|
|
|
|
attached() {
|
|
|
|
|
|
// 从全局获取处理后的卡片数据
|
|
|
|
|
|
const app = getApp();
|
|
|
|
|
|
app.fetchRawCardData().then(cards => {
|
|
|
|
|
|
this.setData({ processedCardsData: cards });
|
|
|
|
|
|
}).catch(err => {
|
2025-09-27 23:14:50 +08:00
|
|
|
|
console.log("错误fetchRaw:",err)
|
|
|
|
|
|
wx.showToast({ title: '加载失败1', icon: 'none' });
|
2025-09-26 01:02:43 +08:00
|
|
|
|
});
|
2025-09-27 17:24:52 +08:00
|
|
|
|
const apiBaseUrl = `${envConfig.apiBaseUrl}`;
|
|
|
|
|
|
this.setData({
|
|
|
|
|
|
url:apiBaseUrl
|
|
|
|
|
|
})
|
2025-09-26 01:02:43 +08:00
|
|
|
|
},
|
2025-09-25 01:18:30 +08:00
|
|
|
|
},
|
|
|
|
|
|
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) {
|
2025-09-25 01:18:30 +08:00
|
|
|
|
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
|
|
|
|
}
|
2025-09-25 01:18:30 +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) {
|
2025-09-25 01:18:30 +08:00
|
|
|
|
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
|
|
|
|
}
|
2025-09-25 01:18:30 +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', {
|
2025-09-25 01:18:30 +08:00
|
|
|
|
cardId: card.article_id,
|
|
|
|
|
|
selectedOptions: selected,
|
|
|
|
|
|
timestamp: Date.now()
|
2025-09-24 21:10:29 +08:00
|
|
|
|
});
|
2025-09-25 01:18:30 +08:00
|
|
|
|
|
2025-09-24 21:10:29 +08:00
|
|
|
|
wx.showToast({
|
2025-09-25 01:18:30 +08:00
|
|
|
|
title: '投票成功',
|
|
|
|
|
|
icon: 'success',
|
|
|
|
|
|
duration: 2000
|
2025-09-24 21:10:29 +08:00
|
|
|
|
});
|
2025-09-27 17:24:52 +08:00
|
|
|
|
},
|
|
|
|
|
|
goToDetail(e: { currentTarget: { dataset: { id: any; }; }; }) {
|
2025-09-26 01:02:43 +08:00
|
|
|
|
const id = e.currentTarget.dataset.id;
|
|
|
|
|
|
console.log(id)
|
|
|
|
|
|
wx.navigateTo({
|
|
|
|
|
|
url: `/pages/articledetail/articledetail?id=${id}`,
|
|
|
|
|
|
});
|
2025-09-27 17:24:52 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onRefresherPulling() {
|
|
|
|
|
|
console.log("正在下拉...");
|
|
|
|
|
|
},
|
|
|
|
|
|
onRefresherRestore() {
|
|
|
|
|
|
console.log("刷新完成,已恢复原位");
|
|
|
|
|
|
},
|
|
|
|
|
|
onRefresherRefresh() {
|
|
|
|
|
|
console.log("用户文评刷新")
|
|
|
|
|
|
this.setData({
|
|
|
|
|
|
refresherTriggered: true
|
|
|
|
|
|
});
|
|
|
|
|
|
const app = getApp();
|
|
|
|
|
|
setTimeout(()=>{
|
|
|
|
|
|
app.fetchRawCardData().then(cards => {
|
|
|
|
|
|
this.setData({ processedCardsData: cards });
|
|
|
|
|
|
this.setData({
|
|
|
|
|
|
refresherTriggered: false
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
}).catch(err => {
|
2025-09-27 23:14:50 +08:00
|
|
|
|
wx.showToast({ title: '加载失败2', icon: 'none' });
|
2025-09-27 17:24:52 +08:00
|
|
|
|
this.setData({
|
|
|
|
|
|
refresherTriggered: false
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
},2000)
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-09-25 01:18:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|