Files
miniwx/utils/api.js
T
ws 0c6b7fcace feat: 实现微信小程序码生成功能
- 新增 pages/scan/result/ 扫码结果页,展示预约详情
- 实现微信小程序码生成(wxacode.getUnlimited)
- 添加环境版本自动检测(release/trial/develop)
- 优化 qrcode-modal 组件,使用 Base64 图片替代本地生成
- 统一 API 接口抽离到 api.js 和 config.js
- 优化代码结构,提升可读性和维护性

主要变更:
1. utils/api.js: 新增 getWxacode() 接口,支持生成小程序码
2. components/qrcode-modal: 改用 API 生成小程序码,移除本地 QRCode 依赖
3. pages/scan/result: 新增扫码结果展示页,解析 scene 参数
4. utils/config.js: 新增 WXACODE 配置项
2026-04-27 18:36:04 +08:00

177 lines
4.2 KiB
JavaScript

// 后端 API 请求工具库
const { BASE_URL, API } = require('./config')
/**
* 封装 wx.request 为 Promise
* @param {object} options - wx.request 参数
* @returns {Promise<object>} 返回 result.data
*/
function request(options) {
return new Promise((resolve, reject) => {
wx.request({
timeout: 30000,
...options,
success: (res) => {
const result = res.data
if (result && result.code === 0) {
resolve(result.data)
} else {
reject(new Error(result ? result.message : '请求失败'))
}
},
fail: (err) => {
console.error('请求失败', options.url, err)
if (err.errMsg && err.errMsg.indexOf('timeout') !== -1) {
reject(new Error('网络请求超时,请检查网络后重试'))
} else {
reject(new Error('网络异常,请检查网络连接'))
}
}
})
})
}
/**
* 格式化记录中的 createTime 字段
* @param {object} record - 含 createTime 的记录
* @returns {object} 格式化后的记录
*/
function formatRecord(record) {
if (!record || !record.createTime) return record
return {
...record,
createTime: new Date(record.createTime).toLocaleString('zh-CN')
}
}
/**
* 将后端 API 返回的预约记录映射为前端模板字段
* 后端: id, visitDate, visitTime → 前端: _id, date, time
*/
function mapApiRecord(record) {
if (!record) return null
return {
...record,
_id: record.id,
date: record.visitDate,
time: record.visitTime
}
}
/**
* 预约相关 API
*/
const appointmentDB = {
/**
* 创建预约
* @param {object} data - 预约表单数据(需包含 openid)
* @returns {Promise<string>} 新记录 id
*/
async create(data) {
const result = await request({
url: BASE_URL + API.APPOINTMENT_CREATE,
method: 'POST',
header: { 'content-type': 'application/json' },
data: {
name: data.name,
phone: data.phone,
company: data.company,
reason: data.reason,
visitDate: data.date,
visitTime: data.time,
hostName: data.hostName,
area: data.area,
openid: data.openid
}
})
return result.id
},
/**
* 获取当前用户的预约列表(按创建时间倒序)
* @param {string} openid
* @returns {Promise<Array>}
*/
async getList(openid) {
const list = await request({
url: BASE_URL + API.APPOINTMENT_LIST,
method: 'GET',
data: { openid }
})
return (list || []).map(item => mapApiRecord(item))
},
/**
* 获取当前用户最新一条预约
* @param {string} openid
* @returns {Promise<object|null>}
*/
async getLatest(openid) {
const data = await request({
url: BASE_URL + API.APPOINTMENT_LATEST,
method: 'GET',
data: { openid }
})
return mapApiRecord(data) || null
},
/**
* 取消预约
* @param {string} id - 预约记录 id
* @param {string} openid - 当前用户 openid
* @returns {Promise<boolean>} 是否成功
*/
async cancel(id, openid) {
const result = await request({
url: BASE_URL + API.APPOINTMENT_CANCEL + '?id=' + encodeURIComponent(id) + '&openid=' + encodeURIComponent(openid),
method: 'PUT'
})
return result === true
},
/**
* 获取预约详情
* @param {string} id - 预约记录 id
* @returns {Promise<object|null>}
*/
async getDetail(id) {
const data = await request({
url: BASE_URL + API.APPOINTMENT_DETAIL,
method: 'GET',
data: { id }
})
return mapApiRecord(data) || null
}
}
/**
* 获取小程序码
* @param {string} scene - 场景值
* @param {string} page - 页面路径
* @returns {Promise<string>} Base64图片数据
*/
async function getWxacode(scene, page = 'pages/scan/result/index') {
const envVersion = wx.getAccountInfoSync().miniProgram.envVersion
const base64Data = await request({
url: BASE_URL + API.WXACODE,
method: 'POST',
header: { 'content-type': 'application/json' },
data: {
scene,
page,
width: 430,
envVersion
}
})
return `data:image/jpeg;base64,${base64Data}`
}
module.exports = {
request,
formatRecord,
appointmentDB,
getWxacode
}