Files
soul/miniprogram/pages/match/match.js

356 lines
8.3 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.

// pages/match/match.js
const app = getApp()
Page({
data: {
isMatching: false,
currentMatch: null,
onlineCount: 0,
matchAttempts: 0,
recentMatches: [],
matchTimer: null
},
onLoad() {
this.initStarBackground()
this.loadOnlineCount()
this.loadRecentMatches()
},
onUnload() {
// 清理匹配定时器
if (this.data.matchTimer) {
clearTimeout(this.data.matchTimer)
}
},
// 初始化星空背景
initStarBackground() {
const ctx = wx.createCanvasContext('starCanvas')
const width = wx.getSystemInfoSync().windowWidth
const height = wx.getSystemInfoSync().windowHeight
// 绘制星星
for (let i = 0; i < 100; i++) {
const x = Math.random() * width
const y = Math.random() * height
const radius = Math.random() * 2
const opacity = Math.random()
ctx.beginPath()
ctx.arc(x, y, radius, 0, 2 * Math.PI)
ctx.fillStyle = `rgba(255, 255, 255, ${opacity})`
ctx.fill()
}
ctx.draw()
},
// 加载在线人数
loadOnlineCount() {
wx.request({
url: `${app.globalData.apiBase}/match/online-count`,
success: (res) => {
if (res.statusCode === 200) {
this.setData({
onlineCount: res.data.count || 0
})
}
},
fail: () => {
// 使用模拟数据
this.setData({
onlineCount: Math.floor(Math.random() * 500) + 100
})
}
})
},
// 加载最近匹配记录
loadRecentMatches() {
const userInfo = app.getUserInfo()
if (!userInfo) return
wx.request({
url: `${app.globalData.apiBase}/match/recent`,
header: {
'Authorization': `Bearer ${wx.getStorageSync('token')}`
},
success: (res) => {
if (res.statusCode === 200) {
this.setData({
recentMatches: res.data.matches || []
})
}
},
fail: () => {
// 使用本地缓存
const cached = wx.getStorageSync('recentMatches')
if (cached) {
this.setData({ recentMatches: cached })
}
}
})
},
// 开始匹配
startMatch() {
const userInfo = app.getUserInfo()
if (!userInfo) {
this.showLoginModal()
return
}
this.setData({
isMatching: true,
matchAttempts: 0
})
// 模拟匹配过程
this.doMatch()
},
// 执行匹配
doMatch() {
const timer = setInterval(() => {
const attempts = this.data.matchAttempts + 1
this.setData({ matchAttempts: attempts })
// 3-6秒后匹配成功
if (attempts >= 3) {
clearInterval(timer)
this.matchSuccess()
}
}, 1000)
this.setData({ matchTimer: timer })
// 真实匹配请求
wx.request({
url: `${app.globalData.apiBase}/match/find`,
method: 'POST',
header: {
'Authorization': `Bearer ${wx.getStorageSync('token')}`
},
data: {
interests: ['创业', '私域运营', '读书'],
currentChapter: app.globalData.currentChapter
},
success: (res) => {
if (res.statusCode === 200 && res.data.match) {
clearInterval(timer)
this.matchSuccess(res.data.match)
}
},
fail: () => {
// 使用模拟数据
clearInterval(timer)
this.matchSuccess(this.getMockMatch())
}
})
},
// 匹配成功
matchSuccess(matchData) {
const match = matchData || this.getMockMatch()
this.setData({
isMatching: false,
currentMatch: match
})
// 震动反馈
wx.vibrateShort()
// 播放成功提示音
wx.showToast({
title: '匹配成功!',
icon: 'success',
duration: 1500
})
// 保存到最近匹配
this.saveRecentMatch(match)
},
// 获取模拟匹配数据
getMockMatch() {
const nicknames = ['阅读爱好者', '创业小白', '私域达人', '书虫一枚', '灵魂摆渡人']
const avatars = [
'https://picsum.photos/200/200?random=1',
'https://picsum.photos/200/200?random=2',
'https://picsum.photos/200/200?random=3'
]
const tagsList = [
['创业者', '私域运营', 'MBTI-INTP'],
['读书达人', 'Soul用户', '内容创作'],
['互联网人', '产品经理', '深度思考']
]
const concepts = [
'一个坚持长期主义的私域玩家,擅长内容结构化。',
'相信阅读可以改变人生每天坚持读书1小时。',
'在Soul上分享创业经验希望帮助更多人少走弯路。'
]
const wechats = [
'soul_book_friend_1',
'soul_reader_2024',
'soul_party_fan'
]
const randomIndex = Math.floor(Math.random() * nicknames.length)
return {
id: `user_${Date.now()}`,
nickname: nicknames[randomIndex],
avatar: avatars[randomIndex % avatars.length],
tags: tagsList[randomIndex % tagsList.length],
matchScore: Math.floor(Math.random() * 20) + 80,
concept: concepts[randomIndex % concepts.length],
wechat: wechats[randomIndex % wechats.length],
commonInterests: [
{ icon: '📚', text: '都在读《创业实验》' },
{ icon: '💼', text: '对私域运营感兴趣' },
{ icon: '🎯', text: '相似的职业背景' }
]
}
},
// 保存最近匹配
saveRecentMatch(match) {
let recent = this.data.recentMatches
const newMatch = {
...match,
matchTime: '刚刚'
}
recent.unshift(newMatch)
if (recent.length > 10) {
recent = recent.slice(0, 10)
}
this.setData({ recentMatches: recent })
wx.setStorageSync('recentMatches', recent)
},
// 取消匹配
cancelMatch() {
if (this.data.matchTimer) {
clearTimeout(this.data.matchTimer)
}
this.setData({
isMatching: false,
matchAttempts: 0
})
wx.showToast({
title: '已取消匹配',
icon: 'none'
})
},
// 一键加好友
addWechat() {
const match = this.data.currentMatch
if (!match || !match.wechat) return
wx.setClipboardData({
data: match.wechat,
success: () => {
wx.showModal({
title: '微信号已复制',
content: `微信号:${match.wechat}\n\n已复制到剪贴板,请打开微信添加好友,备注"书友"即可。`,
showCancel: false,
confirmText: '打开微信',
success: (res) => {
if (res.confirm) {
// 尝试打开微信(小程序无法直接跳转,只能提示)
wx.showToast({
title: '请手动打开微信添加',
icon: 'none',
duration: 2000
})
}
}
})
}
})
},
// 加入书友群
joinGroup() {
wx.showModal({
title: '加入书友群',
content: '请先添加书友微信,备注"书友群",对方会拉你入群。\n\n群内可以\n· 深度交流读书心得\n· 参加线下读书会\n· 获取独家资源',
showCancel: true,
cancelText: '取消',
confirmText: '添加好友',
success: (res) => {
if (res.confirm) {
this.addWechat()
}
}
})
},
// 下一位
nextMatch() {
this.setData({
currentMatch: null,
matchAttempts: 0
})
wx.showToast({
title: '重新匹配中',
icon: 'loading'
})
setTimeout(() => {
this.startMatch()
}, 500)
},
// 查看匹配详情
viewMatchDetail(e) {
const matchId = e.currentTarget.dataset.id
wx.showToast({
title: '功能开发中',
icon: 'none'
})
},
// 显示登录弹窗
showLoginModal() {
wx.showModal({
title: '需要登录',
content: '匹配书友前需要先登录账号',
confirmText: '立即登录',
success: (res) => {
if (res.confirm) {
app.wxLogin((success) => {
if (success) {
wx.showToast({
title: '登录成功',
icon: 'success'
})
setTimeout(() => {
this.startMatch()
}, 1500)
}
})
}
}
})
},
// 分享
onShareAppMessage() {
return {
title: '来Soul派对匹配志同道合的书友吧',
path: '/pages/match/match',
imageUrl: '/assets/images/share-match.png'
}
}
})