bbc7ca6523
- 新增小程序个人收藏回收站页面,支持查看已删除收藏、恢复与彻底删除操作 - 修复个人收藏文件上传时的中文名乱码问题,新增原文件名透传参数 - 接入阿里云百炼TTS服务,实现运动提醒模块的云端语音合成与本地缓存,支持系统TTS与云端MP3双降级播放 - 新增语音引擎探测与异常预警UI,覆盖web端与移动端 - 优化web端订单盒页面布局,修复卡片操作按钮换行问题 - 新增调试探针脚本、ESLint配置与相关lint脚本 - 完善后端接口与路由,更新项目依赖与配置文件
234 lines
7.1 KiB
JavaScript
234 lines
7.1 KiB
JavaScript
const app = () => getApp()
|
|
|
|
const BASE_URL = function () {
|
|
try {
|
|
const a = getApp()
|
|
if (a && a.globalData && a.globalData.apiBase) return a.globalData.apiBase
|
|
} catch (e) {}
|
|
return 'https://traesite.umersoft.com:8975'
|
|
}
|
|
|
|
const request = (options) => {
|
|
return new Promise((resolve, reject) => {
|
|
const { url, method = 'GET', data = {}, header = {}, timeout = 30000 } = options
|
|
const fullUrl = url.indexOf('http') === 0 ? url : BASE_URL() + url
|
|
const h = Object.assign({
|
|
'content-type': 'application/json; charset=utf-8',
|
|
Accept: 'application/json; charset=utf-8',
|
|
'X-Mp-Timeassistant': 'mp_time_assistant_v1_' + Math.random().toString(36).slice(2, 10),
|
|
}, header)
|
|
wx.request({
|
|
url: fullUrl,
|
|
method,
|
|
data,
|
|
header: h,
|
|
timeout,
|
|
success: (res) => {
|
|
const body = res.data || {}
|
|
if (res.statusCode >= 200 && res.statusCode < 300 && body && body.ok) {
|
|
resolve(body)
|
|
} else {
|
|
const msg = body && body.error ? body.error : `请求失败 (HTTP ${res.statusCode})`
|
|
const err = new Error(msg)
|
|
err.statusCode = res.statusCode
|
|
if (body && typeof body === 'object') {
|
|
try { Object.assign(err, body) } catch (_) {}
|
|
}
|
|
reject(err)
|
|
}
|
|
},
|
|
fail: (err) => {
|
|
reject(new Error(err && err.errMsg ? err.errMsg : '网络错误'))
|
|
},
|
|
})
|
|
})
|
|
}
|
|
|
|
const uploadFile = (options) => {
|
|
return new Promise((resolve, reject) => {
|
|
const { url, filePath, name = 'file', formData = {}, timeout = 120000 } = options
|
|
const fullUrl = url.indexOf('http') === 0 ? url : BASE_URL() + url
|
|
wx.uploadFile({
|
|
url: fullUrl,
|
|
filePath,
|
|
name,
|
|
formData,
|
|
header: {
|
|
'X-Mp-Timeassistant': 'mp_time_assistant_v1_' + Math.random().toString(36).slice(2, 10),
|
|
},
|
|
timeout,
|
|
success: (res) => {
|
|
try {
|
|
const body = typeof res.data === 'string' ? JSON.parse(res.data) : (res.data || {})
|
|
if (res.statusCode >= 200 && res.statusCode < 300 && body && body.ok) {
|
|
resolve(body)
|
|
} else {
|
|
const msg = body && body.error ? body.error : `上传失败 (HTTP ${res.statusCode})`
|
|
reject(new Error(msg))
|
|
}
|
|
} catch (e) {
|
|
reject(new Error('上传响应解析失败'))
|
|
}
|
|
},
|
|
fail: (err) => {
|
|
reject(new Error(err && err.errMsg ? err.errMsg : '上传网络错误'))
|
|
},
|
|
})
|
|
})
|
|
}
|
|
|
|
const core = {
|
|
getMeta: () => request({ url: '/api/mp_time_assistant/meta', method: 'GET' }),
|
|
getState: () => request({ url: '/api/mp_time_assistant/state', method: 'GET' }),
|
|
setActiveKit: (kitId) => request({
|
|
url: '/api/mp_time_assistant/state/active-kit',
|
|
method: 'PUT',
|
|
data: { kitId },
|
|
}),
|
|
}
|
|
|
|
const personalCollect = {
|
|
list: (keyword = '') => request({
|
|
url: '/api/mp_personal_collect/kits/personal_collect/items',
|
|
method: 'GET',
|
|
data: { keyword: keyword || '' },
|
|
}),
|
|
get: (id) => request({
|
|
url: `/api/mp_personal_collect/kits/personal_collect/items/${encodeURIComponent(id)}`,
|
|
method: 'GET',
|
|
}),
|
|
create: (payload) => request({
|
|
url: '/api/mp_personal_collect/kits/personal_collect/items',
|
|
method: 'POST',
|
|
data: payload,
|
|
}),
|
|
update: (payload) => request({
|
|
url: '/api/mp_personal_collect/kits/personal_collect/items',
|
|
method: 'PUT',
|
|
data: payload,
|
|
}),
|
|
remove: (id) => request({
|
|
url: '/api/mp_personal_collect/kits/personal_collect/items',
|
|
method: 'DELETE',
|
|
data: { id },
|
|
}),
|
|
trash: () => request({
|
|
url: '/api/mp_personal_collect/kits/personal_collect/trash',
|
|
method: 'GET',
|
|
}),
|
|
restore: (id) => request({
|
|
url: '/api/mp_personal_collect/kits/personal_collect/trash/restore',
|
|
method: 'PUT',
|
|
data: { id },
|
|
}),
|
|
purge: (id) => request({
|
|
url: '/api/mp_personal_collect/kits/personal_collect/trash',
|
|
method: 'DELETE',
|
|
data: { id },
|
|
}),
|
|
upload: (filePath, groupId = '', originalName = '') => uploadFile({
|
|
url: '/api/mp_personal_collect/kits/personal_collect/upload',
|
|
filePath,
|
|
name: 'file',
|
|
// 原始文件名由小程序随 multipart 透传(wx.chooseMessageFile 的 name 是 UTF-8 完好),
|
|
// 避免服务端只能拿到桌面微信传输中已被损坏的多字节文件名
|
|
formData: Object.assign(
|
|
groupId ? { groupId } : {},
|
|
originalName ? { originalName } : {}
|
|
),
|
|
}),
|
|
}
|
|
|
|
const repClock = {
|
|
meta: () => request({ url: '/api/mp_rep_clock/meta', method: 'GET' }),
|
|
state: () => request({ url: '/api/mp_rep_clock/state', method: 'GET' }),
|
|
resetRunning: (sessionId) => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/state/reset-running',
|
|
method: 'POST',
|
|
data: { sessionId },
|
|
}),
|
|
listCards: () => request({ url: '/api/mp_rep_clock/kits/rep_clock/cards', method: 'GET' }),
|
|
getCard: (id) => request({ url: `/api/mp_rep_clock/kits/rep_clock/cards/${encodeURIComponent(id)}`, method: 'GET' }),
|
|
createCard: (payload) => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/cards',
|
|
method: 'POST',
|
|
data: payload,
|
|
}),
|
|
updateCard: (payload) => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/cards',
|
|
method: 'PUT',
|
|
data: payload,
|
|
}),
|
|
removeCard: (id) => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/cards',
|
|
method: 'DELETE',
|
|
data: { id },
|
|
}),
|
|
history: (limit = 200) => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/history',
|
|
method: 'GET',
|
|
data: { limit },
|
|
}),
|
|
sessionStart: (payload) => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/sessions/start',
|
|
method: 'POST',
|
|
data: payload,
|
|
}),
|
|
sessionSync: (payload) => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/sessions/sync',
|
|
method: 'POST',
|
|
data: payload,
|
|
}),
|
|
sessionFinish: (payload) => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/sessions/finish',
|
|
method: 'POST',
|
|
data: payload,
|
|
}),
|
|
ttsPreview: (text, voice = 'female_01') => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/tts/preview',
|
|
method: 'GET',
|
|
data: { text, voice },
|
|
}),
|
|
ttsBatch: (cardId, card, voice = 'female_01') => request({
|
|
url: '/api/mp_rep_clock/kits/rep_clock/tts/batch',
|
|
method: 'POST',
|
|
data: { cardId, card, voice },
|
|
}),
|
|
}
|
|
|
|
const chooseChatAttachments = (count = 9) => {
|
|
return new Promise((resolve, reject) => {
|
|
try {
|
|
if (!wx.chooseMessageFile) {
|
|
reject(new Error('当前微信版本不支持从聊天选择文件,请升级微信'))
|
|
return
|
|
}
|
|
wx.chooseMessageFile({
|
|
count: Math.max(1, Math.min(9, Number(count) || 9)),
|
|
type: 'all',
|
|
success: (res) => resolve(res.tempFiles || []),
|
|
fail: (err) => {
|
|
const msg = err && err.errMsg ? String(err.errMsg) : '用户取消或授权失败'
|
|
if (msg.indexOf('cancel') !== -1 || msg.indexOf('取消') !== -1) {
|
|
resolve([])
|
|
} else {
|
|
reject(new Error(msg))
|
|
}
|
|
},
|
|
})
|
|
} catch (e) {
|
|
reject(e)
|
|
}
|
|
})
|
|
}
|
|
|
|
module.exports = {
|
|
BASE_URL,
|
|
request,
|
|
uploadFile,
|
|
core,
|
|
personalCollect,
|
|
repClock,
|
|
chooseChatAttachments,
|
|
}
|