179 lines
5.5 KiB
JavaScript
179 lines
5.5 KiB
JavaScript
const AIChatSocket = require('./utils/chatmsg.js')
|
||
const API = require('./utils/api.js')
|
||
const request = require('./utils/request.js')
|
||
|
||
App({
|
||
onLaunch() {
|
||
// request 层遇到 code 401(token 已失效)时回调这里:静默重登后自动重试原请求。
|
||
// 登录逻辑只在 app 里有一份,request 层不碰
|
||
request.setUnauthorizedHandler(() => this.silentSignin())
|
||
|
||
let appId = wx.getStorageSync('attendant-appid')
|
||
if (!appId) {
|
||
appId = 'app_' + Date.now().toString(36) + Math.random().toString(36).substr(2, 9)
|
||
wx.setStorageSync('attendant-appid', appId)
|
||
}
|
||
this.globalData.appId = appId
|
||
|
||
this.globalData.servicesReady = new Promise((resolve) => {
|
||
API.resource.getServices().then((data) => {
|
||
this.globalData.services = data.data.services
|
||
resolve(data.data.services)
|
||
}).catch((err) => {
|
||
console.error('获取服务列表失败', err)
|
||
resolve([])
|
||
})
|
||
})
|
||
|
||
this.globalData.agreementReady = new Promise((resolve) => {
|
||
API.resource.getAgreement().then((data) => {
|
||
this.globalData.agreement = data.data.agreement
|
||
resolve(data.data.agreement)
|
||
}).catch((err) => {
|
||
console.error('获取服务协议失败', err)
|
||
resolve(null)
|
||
})
|
||
})
|
||
|
||
this.checkUpdate();
|
||
},
|
||
|
||
onShow() {
|
||
this.silentSignin()
|
||
this.initChatSocket()
|
||
},
|
||
|
||
// 静默重登:app.onShow 与 request 层的 401 兜底共用这一个入口
|
||
// (wxsignin 只凭 code 换到 openid 就能签发 token,见 api/user/handler/users.js)。
|
||
//
|
||
// 单飞:并发只发一次——每次 wxsignin 都会重签 token 覆盖上一次,
|
||
// 两个请求重叠时 DB 里存的是后保存的那个、而 globalData 存的是后返回的那个,
|
||
// 一旦错位本机就拿着作废的 token,之后所有接口都 401。
|
||
//
|
||
// 用户主动退出过(has_logout)就不再静默重登,否则「我的」页的退出登录
|
||
// 会被切后台/重进抵消;用户在「我的」页重新授权成功时会清掉这个标记
|
||
silentSignin() {
|
||
if (wx.getStorageSync('has_logout')) {
|
||
return Promise.resolve(false)
|
||
}
|
||
if (this.signinPromise) {
|
||
return this.signinPromise
|
||
}
|
||
|
||
this.signinPromise = new Promise((resolve) => {
|
||
wx.login({
|
||
success: res => {
|
||
if (!res.code) {
|
||
console.log('登录失败!' + res.errMsg)
|
||
resolve(false)
|
||
return
|
||
}
|
||
API.user.wxSignin({
|
||
code: res.code
|
||
})
|
||
.then((data) => {
|
||
if (data.code == 0) {
|
||
this.globalData.user = data.data.user
|
||
resolve(true)
|
||
} else {
|
||
console.log('error:', data)
|
||
resolve(false)
|
||
}
|
||
})
|
||
.catch((err) => {
|
||
console.log('请求失败', err)
|
||
resolve(false)
|
||
})
|
||
},
|
||
fail: (err) => {
|
||
console.log('登录失败!' + err.errMsg)
|
||
resolve(false)
|
||
}
|
||
})
|
||
}).then((ok) => {
|
||
this.signinPromise = null
|
||
return ok
|
||
})
|
||
|
||
return this.signinPromise
|
||
},
|
||
|
||
initChatSocket() {
|
||
if (this.globalData.chatSocket) return
|
||
|
||
const socket = new AIChatSocket()
|
||
|
||
socket.onOpen(() => {
|
||
console.log('[App] Chat WebSocket connected')
|
||
})
|
||
|
||
socket.onClose((res) => {
|
||
console.log('[App] Chat WebSocket closed', res)
|
||
})
|
||
|
||
socket.onError((err) => {
|
||
console.error('[App] Chat WebSocket error', err)
|
||
})
|
||
|
||
socket.connect().catch((err) => {
|
||
console.error('[App] Chat WebSocket connect failed', err)
|
||
})
|
||
|
||
this.globalData.chatSocket = socket
|
||
},
|
||
|
||
checkUpdate() {
|
||
// 老基础库(< 1.9.90)没有 getUpdateManager,先挡一层:
|
||
// 否则下面直接 .onCheckForUpdate 会抛 TypeError
|
||
if (!wx.canIUse('getUpdateManager')) {
|
||
return;
|
||
}
|
||
|
||
// 获取小程序更新管理器实例
|
||
const updateManager = wx.getUpdateManager();
|
||
|
||
// 监听检查更新事件,当小程序有新版本时会触发此回调
|
||
updateManager.onCheckForUpdate(function (res) {
|
||
// 请求完新版本信息的回调
|
||
console.log('[App] 是否有新版本:', res.hasUpdate); // 打印是否有新版本
|
||
});
|
||
|
||
// 监听更新准备就绪事件,当新版本下载完成时会触发此回调
|
||
updateManager.onUpdateReady(function () {
|
||
wx.showModal({
|
||
title: '更新提示',
|
||
content: '新版本已经准备好,是否重启应用?',
|
||
confirmText: '立即重启',
|
||
cancelText: '稍后',
|
||
success(res) {
|
||
if (res.confirm) {
|
||
// 用户确认更新,调用 applyUpdate 应用新版本并重启小程序
|
||
updateManager.applyUpdate();
|
||
return;
|
||
}
|
||
// 用户选了「稍后」:新版本此时不会生效,要等下次冷启动才自动应用。
|
||
// 这里必须说清楚,否则用户以为已经升级完了
|
||
wx.showToast({
|
||
title: '下次打开将自动更新',
|
||
icon: 'none'
|
||
});
|
||
}
|
||
});
|
||
});
|
||
|
||
// 监听更新失败事件,当新版本下载失败时会触发此回调
|
||
updateManager.onUpdateFailed(function () {
|
||
// 下载失败没有可交给用户的动作(微信会在下次启动时重试),
|
||
// 只留日志便于线上排查,不打断用户
|
||
console.warn('[App] 新版本下载失败');
|
||
});
|
||
},
|
||
|
||
globalData: {
|
||
appId: '',
|
||
user: null,
|
||
chatSocket: null,
|
||
services: [],
|
||
agreement: null,
|
||
}
|
||
}) |