优化小程序推荐码处理逻辑,支持通过扫码场景解析推荐码和初始章节ID。新增获取用户邀请码的功能以便于分享。更新分享配置,确保分享时自动带上推荐码。调整部分页面逻辑以提升用户体验。
This commit is contained in:
157
miniprogram/pages/scan/scan.js
Normal file
157
miniprogram/pages/scan/scan.js
Normal file
@@ -0,0 +1,157 @@
|
||||
/**
|
||||
* Soul创业派对 - 扫码解析页
|
||||
* 扫描二维码/条形码,展示解析内容
|
||||
*/
|
||||
const app = getApp()
|
||||
|
||||
Page({
|
||||
data: {
|
||||
statusBarHeight: 44,
|
||||
// 最近一次解析结果
|
||||
lastResult: null,
|
||||
scanType: '',
|
||||
charSet: '',
|
||||
// 小程序码解析(路径、参数)
|
||||
parsedPath: null,
|
||||
parsedQuery: [],
|
||||
canNavigate: false,
|
||||
// 历史记录
|
||||
history: []
|
||||
},
|
||||
|
||||
onLoad() {
|
||||
this.setData({
|
||||
statusBarHeight: app.globalData.statusBarHeight || 44
|
||||
})
|
||||
this.loadHistory()
|
||||
},
|
||||
|
||||
loadHistory() {
|
||||
try {
|
||||
const history = wx.getStorageSync('scanHistory') || []
|
||||
this.setData({ history })
|
||||
} catch (e) {
|
||||
console.log('加载扫码历史失败:', e)
|
||||
}
|
||||
},
|
||||
|
||||
saveToHistory(result, scanType, charSet) {
|
||||
const item = { result, scanType, charSet, time: new Date().toLocaleString() }
|
||||
let history = wx.getStorageSync('scanHistory') || []
|
||||
history = [item, ...history].slice(0, 10)
|
||||
wx.setStorageSync('scanHistory', history)
|
||||
this.setData({ history })
|
||||
},
|
||||
|
||||
// 解析小程序码内容:path?key=val 或 path
|
||||
parseMiniProgramCode(result) {
|
||||
if (!result || typeof result !== 'string') return { path: null, query: [], canNavigate: false }
|
||||
const idx = result.indexOf('?')
|
||||
let path = idx >= 0 ? result.slice(0, idx) : result
|
||||
const qs = idx >= 0 ? result.slice(idx + 1) : ''
|
||||
path = path.replace(/^\//, '').trim()
|
||||
const query = []
|
||||
if (qs) {
|
||||
qs.split('&').forEach(pair => {
|
||||
const eq = pair.indexOf('=')
|
||||
const k = eq >= 0 ? pair.slice(0, eq) : pair
|
||||
const v = eq >= 0 ? pair.slice(eq + 1) : ''
|
||||
try {
|
||||
if (k) query.push({ key: decodeURIComponent(k), value: decodeURIComponent(v) })
|
||||
} catch (_) {
|
||||
if (k) query.push({ key: k, value: v })
|
||||
}
|
||||
})
|
||||
}
|
||||
const isMiniProgramPath = /^pages\/[\w-]+\/[\w-]+$/.test(path)
|
||||
return { path: path || null, query, canNavigate: isMiniProgramPath }
|
||||
},
|
||||
|
||||
// 发起扫码(支持小程序码)
|
||||
doScan() {
|
||||
wx.scanCode({
|
||||
onlyFromCamera: false,
|
||||
scanType: ['qrCode', 'barCode'],
|
||||
success: (res) => {
|
||||
const { result, scanType, charSet } = res
|
||||
const parsed = this.parseMiniProgramCode(result)
|
||||
this.setData({
|
||||
lastResult: result,
|
||||
scanType: scanType || '未知',
|
||||
charSet: charSet || '',
|
||||
parsedPath: parsed.path,
|
||||
parsedQuery: parsed.query,
|
||||
canNavigate: parsed.canNavigate
|
||||
})
|
||||
this.saveToHistory(result, scanType, charSet)
|
||||
},
|
||||
fail: (err) => {
|
||||
if (err.errMsg && err.errMsg.includes('cancel')) {
|
||||
return
|
||||
}
|
||||
wx.showToast({ title: err.errMsg || '扫码失败', icon: 'none' })
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 复制内容
|
||||
copyResult() {
|
||||
const { lastResult } = this.data
|
||||
if (!lastResult) {
|
||||
wx.showToast({ title: '暂无解析内容', icon: 'none' })
|
||||
return
|
||||
}
|
||||
wx.setClipboardData({
|
||||
data: lastResult,
|
||||
success: () => wx.showToast({ title: '已复制', icon: 'success' })
|
||||
})
|
||||
},
|
||||
|
||||
// 清空当前结果
|
||||
clearResult() {
|
||||
this.setData({
|
||||
lastResult: null, scanType: '', charSet: '',
|
||||
parsedPath: null, parsedQuery: [], canNavigate: false
|
||||
})
|
||||
},
|
||||
|
||||
// 打开解析出的小程序页面
|
||||
openParsedPage() {
|
||||
const { parsedPath, parsedQuery } = this.data
|
||||
if (!parsedPath || !this.data.canNavigate) {
|
||||
wx.showToast({ title: '非本小程序页面', icon: 'none' })
|
||||
return
|
||||
}
|
||||
const queryStr = parsedQuery.length
|
||||
? '?' + parsedQuery.map(q => `${encodeURIComponent(q.key)}=${encodeURIComponent(q.value)}`).join('&')
|
||||
: ''
|
||||
const url = `/${parsedPath}${queryStr}`
|
||||
const tabPages = ['pages/index/index', 'pages/chapters/chapters', 'pages/match/match', 'pages/my/my']
|
||||
if (tabPages.includes(parsedPath)) {
|
||||
wx.switchTab({ url: `/${parsedPath}` })
|
||||
} else {
|
||||
wx.navigateTo({ url })
|
||||
}
|
||||
},
|
||||
|
||||
// 清空历史
|
||||
clearHistory() {
|
||||
wx.setStorageSync('scanHistory', [])
|
||||
this.setData({ history: [], lastResult: null, scanType: '', charSet: '' })
|
||||
wx.showToast({ title: '已清空', icon: 'success' })
|
||||
},
|
||||
|
||||
// 点击历史项复制
|
||||
onHistoryItemTap(e) {
|
||||
const result = e.currentTarget.dataset.result
|
||||
if (!result) return
|
||||
wx.setClipboardData({
|
||||
data: result,
|
||||
success: () => wx.showToast({ title: '已复制', icon: 'success' })
|
||||
})
|
||||
},
|
||||
|
||||
goBack() {
|
||||
wx.navigateBack()
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user