270 lines
6.3 KiB
JavaScript
270 lines
6.3 KiB
JavaScript
// pages/game/create/create.js
|
||
import request from '../../../utils/request'
|
||
|
||
Page({
|
||
data: {
|
||
roomName: '',
|
||
gameType: 'mahjong', // 默认麻将
|
||
gameTypes: [
|
||
{ value: 'mahjong', label: '麻将' },
|
||
{ value: 'poker', label: '扑克' },
|
||
{ value: 'other', label: '其他' }
|
||
],
|
||
tableFee: '0',
|
||
quickSettings: ['10', '20', '30'],
|
||
showSuccessModal: false,
|
||
inviteCode: '',
|
||
roomCode: '',
|
||
roomId: null,
|
||
creating: false,
|
||
navbarHeight: 0,
|
||
qrcodeUrl: ''
|
||
},
|
||
|
||
onLoad() {
|
||
// 计算导航栏高度
|
||
const windowInfo = wx.getWindowInfo()
|
||
const menuButtonInfo = wx.getMenuButtonBoundingClientRect()
|
||
const statusBarHeight = windowInfo.statusBarHeight
|
||
const menuButtonTop = menuButtonInfo.top
|
||
const navbarHeight = menuButtonInfo.bottom + (menuButtonTop - statusBarHeight)
|
||
this.setData({ navbarHeight })
|
||
|
||
// 检查登录状态
|
||
const app = getApp()
|
||
const userInfo = app.getUserInfo()
|
||
if (!userInfo) {
|
||
wx.showToast({
|
||
title: '请先登录',
|
||
icon: 'none'
|
||
})
|
||
setTimeout(() => {
|
||
wx.navigateBack()
|
||
}, 1500)
|
||
return
|
||
}
|
||
|
||
// 设置默认房间名称为"昵称的房间"
|
||
this.setData({
|
||
roomName: `${userInfo.nickname}的房间`
|
||
})
|
||
},
|
||
|
||
// 游戏类型选择
|
||
onGameTypeChange(e) {
|
||
const value = e.currentTarget.dataset.value
|
||
this.setData({
|
||
gameType: value
|
||
})
|
||
},
|
||
|
||
// 桌位费输入
|
||
onTableFeeInput(e) {
|
||
let value = e.detail.value
|
||
// 只允许正整数
|
||
value = value.replace(/[^\d]/g, '')
|
||
this.setData({
|
||
tableFee: value
|
||
})
|
||
},
|
||
|
||
// 快捷设置输入
|
||
onQuickSettingInput(e) {
|
||
const index = e.currentTarget.dataset.index
|
||
const value = e.detail.value
|
||
const quickSettings = [...this.data.quickSettings]
|
||
quickSettings[index] = value
|
||
this.setData({ quickSettings })
|
||
},
|
||
|
||
// 添加快捷设置
|
||
addQuickSetting() {
|
||
if (this.data.quickSettings.length >= 10) {
|
||
wx.showToast({
|
||
title: '最多添加10个快捷设置',
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
const quickSettings = [...this.data.quickSettings]
|
||
quickSettings.push('')
|
||
this.setData({ quickSettings })
|
||
},
|
||
|
||
// 删除快捷设置
|
||
removeQuickSetting(e) {
|
||
const index = e.currentTarget.dataset.index
|
||
if (this.data.quickSettings.length <= 1) {
|
||
wx.showToast({
|
||
title: '至少保留一个快捷设置',
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
const quickSettings = [...this.data.quickSettings]
|
||
quickSettings.splice(index, 1)
|
||
this.setData({ quickSettings })
|
||
},
|
||
|
||
// 创建房间
|
||
async createRoom() {
|
||
const roomName = this.data.roomName.trim()
|
||
const tableFee = parseFloat(this.data.tableFee) || 0
|
||
const quickSettings = this.data.quickSettings
|
||
.map(val => parseInt(val))
|
||
.filter(val => !isNaN(val) && val > 0)
|
||
|
||
if (!roomName) {
|
||
wx.showToast({
|
||
title: '请输入房间名称',
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
|
||
if (quickSettings.length === 0) {
|
||
wx.showToast({
|
||
title: '请至少设置一个有效的快捷输入',
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
|
||
if (this.data.creating) return
|
||
|
||
this.setData({ creating: true })
|
||
wx.showLoading({ title: '创建中...' })
|
||
|
||
try {
|
||
const data = await request.post('/rooms/create', {
|
||
room_name: roomName,
|
||
game_type: this.data.gameType,
|
||
table_fee: tableFee,
|
||
quick_settings: quickSettings
|
||
})
|
||
|
||
wx.hideLoading()
|
||
|
||
this.setData({
|
||
inviteCode: data.invite_code,
|
||
roomCode: data.room_code,
|
||
roomId: data.room_id,
|
||
showSuccessModal: true
|
||
})
|
||
|
||
// 延迟生成二维码,确保canvas已渲染
|
||
setTimeout(() => {
|
||
this.generateQRCode(data.invite_code)
|
||
}, 100)
|
||
|
||
// 更新全局房间信息
|
||
const app = getApp()
|
||
app.setCurrentSession({
|
||
id: data.room_id,
|
||
room_code: data.room_code,
|
||
room_name: roomName
|
||
})
|
||
|
||
} catch (error) {
|
||
wx.hideLoading()
|
||
wx.showToast({
|
||
title: error.message || '创建失败',
|
||
icon: 'none'
|
||
})
|
||
} finally {
|
||
this.setData({ creating: false })
|
||
}
|
||
},
|
||
|
||
// 生成二维码
|
||
async generateQRCode(inviteCode) {
|
||
try {
|
||
const app = getApp()
|
||
// 构建scene参数(使用邀请码)
|
||
const scene = `code=${inviteCode}`
|
||
|
||
console.log('【创建页】开始生成二维码, scene:', scene, 'invite_code:', inviteCode)
|
||
|
||
wx.showLoading({ title: '生成二维码...' })
|
||
|
||
// 调用app.js中的getQrcode方法获取二维码
|
||
const qrcodeBuffer = await app.getQrcode(scene)
|
||
|
||
console.log('【创建页】二维码数据返回:', qrcodeBuffer)
|
||
|
||
wx.hideLoading()
|
||
|
||
// 检查返回数据类型
|
||
if (!qrcodeBuffer) {
|
||
throw new Error('二维码数据为空')
|
||
}
|
||
|
||
// 将arraybuffer转换为base64
|
||
const base64 = wx.arrayBufferToBase64(qrcodeBuffer)
|
||
const qrcodeUrl = `data:image/png;base64,${base64}`
|
||
|
||
console.log('【创建页】base64长度:', base64.length)
|
||
|
||
// 更新页面数据,显示二维码图片
|
||
this.setData({
|
||
qrcodeUrl: qrcodeUrl
|
||
})
|
||
|
||
} catch (error) {
|
||
wx.hideLoading()
|
||
console.error('【创建页】生成二维码失败:', error)
|
||
wx.showToast({
|
||
title: error.message || '二维码生成失败',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
},
|
||
|
||
// 复制邀请码
|
||
copyInviteCode() {
|
||
if (!this.data.inviteCode) return
|
||
|
||
wx.setClipboardData({
|
||
data: this.data.inviteCode,
|
||
success: () => {
|
||
wx.showToast({
|
||
title: '已复制邀请码',
|
||
icon: 'success'
|
||
})
|
||
}
|
||
})
|
||
},
|
||
|
||
// 进入房间
|
||
goToRoom() {
|
||
if (!this.data.roomId) return
|
||
|
||
wx.redirectTo({
|
||
url: `/pages/game/detail/detail?id=${this.data.roomId}`
|
||
})
|
||
},
|
||
|
||
// 关闭弹窗
|
||
closeModal() {
|
||
this.setData({
|
||
showSuccessModal: false
|
||
})
|
||
},
|
||
|
||
// 阻止事件冒泡
|
||
stopPropagation() {
|
||
// 阻止点击弹窗内容时关闭
|
||
},
|
||
|
||
// 分享给朋友
|
||
onShareAppMessage() {
|
||
if (this.data.inviteCode) {
|
||
return {
|
||
title: `邀请你加入房间:${this.data.roomName}`,
|
||
path: `/pages/game/join/join?code=${this.data.inviteCode}`,
|
||
imageUrl: '/images/share-bg.png'
|
||
}
|
||
}
|
||
}
|
||
})
|