287 lines
7.9 KiB
JavaScript
287 lines
7.9 KiB
JavaScript
// 应用入口文件
|
||
App({
|
||
onLaunch: function () {
|
||
console.log('智控未来小程序启动')
|
||
|
||
// 初始化系统信息
|
||
this.globalData.systemInfo = wx.getSystemInfoSync()
|
||
|
||
// 检查更新
|
||
this.checkForUpdate()
|
||
|
||
// 初始化网络监听
|
||
this.initNetworkListener()
|
||
|
||
// 初始化用户信息
|
||
this.initUserInfo()
|
||
},
|
||
|
||
onShow: function () {
|
||
console.log('小程序显示')
|
||
},
|
||
|
||
onHide: function () {
|
||
console.log('小程序隐藏')
|
||
},
|
||
|
||
onError: function (msg) {
|
||
console.error('小程序错误:', msg)
|
||
},
|
||
|
||
// 初始化用户信息
|
||
initUserInfo: function() {
|
||
// 从本地存储获取用户信息
|
||
const storedUserInfo = wx.getStorageSync('userInfo')
|
||
if (storedUserInfo) {
|
||
this.globalData.userInfo = storedUserInfo
|
||
console.log('从本地存储加载用户信息:', storedUserInfo)
|
||
}
|
||
|
||
// 检查授权状态
|
||
this.checkAuthStatus()
|
||
},
|
||
|
||
// 检查授权状态
|
||
checkAuthStatus: function() {
|
||
wx.getSetting({
|
||
success: (res) => {
|
||
console.log('授权状态:', res.authSetting)
|
||
// 检查用户信息授权
|
||
if (res.authSetting['scope.userInfo']) {
|
||
console.log('已授权用户信息')
|
||
} else {
|
||
console.log('未授权用户信息')
|
||
}
|
||
|
||
// 检查地理位置授权
|
||
if (res.authSetting['scope.userLocation']) {
|
||
console.log('已授权地理位置')
|
||
} else {
|
||
console.log('未授权地理位置')
|
||
}
|
||
}
|
||
})
|
||
},
|
||
|
||
// 获取用户信息
|
||
getUserInfo: function(cb) {
|
||
const that = this
|
||
|
||
if (this.globalData.userInfo) {
|
||
typeof cb == "function" && cb(this.globalData.userInfo)
|
||
} else {
|
||
// 检查本地存储是否有用户信息
|
||
const storedUserInfo = wx.getStorageSync('userInfo')
|
||
if (storedUserInfo) {
|
||
that.globalData.userInfo = storedUserInfo
|
||
typeof cb == "function" && cb(storedUserInfo)
|
||
} else {
|
||
// 未授权,需要用户点击授权
|
||
typeof cb == "function" && cb(null)
|
||
}
|
||
}
|
||
},
|
||
|
||
// 触发用户授权
|
||
triggerUserAuth: function(cb) {
|
||
const that = this
|
||
|
||
wx.getUserProfile({
|
||
desc: '用于完善个人资料,提供个性化服务',
|
||
success: (res) => {
|
||
that.globalData.userInfo = res.userInfo
|
||
// 存储到本地
|
||
wx.setStorageSync('userInfo', res.userInfo)
|
||
// 获取全局唯一ID
|
||
that.getGlobalUserId((userId) => {
|
||
typeof cb == "function" && cb(res.userInfo)
|
||
})
|
||
},
|
||
fail: (err) => {
|
||
console.error('获取用户信息失败:', err)
|
||
typeof cb == "function" && cb(null)
|
||
}
|
||
})
|
||
},
|
||
|
||
// 获取全局唯一ID(UnionID或OpenID)
|
||
getGlobalUserId: function(cb) {
|
||
const that = this
|
||
|
||
// 尝试从本地存储获取
|
||
let userId = wx.getStorageSync('globalUserId')
|
||
|
||
if (userId) {
|
||
typeof cb == "function" && cb(userId)
|
||
return
|
||
}
|
||
|
||
// 调用微信登录获取code
|
||
wx.login({
|
||
success: (res) => {
|
||
if (res.code) {
|
||
// 这里应该调用后端接口获取UnionID
|
||
// 由于是模拟环境,我们使用code生成一个假的UnionID
|
||
// 实际项目中应该发送code到后端,后端调用微信接口获取UnionID
|
||
const mockUnionId = `union_${res.code}_${Date.now()}`
|
||
userId = mockUnionId
|
||
|
||
// 存储到本地
|
||
wx.setStorageSync('globalUserId', userId)
|
||
that.globalData.globalUserId = userId
|
||
|
||
typeof cb == "function" && cb(userId)
|
||
} else {
|
||
console.error('获取微信登录凭证失败:', res.errMsg)
|
||
// 失败时生成一个基于设备的ID作为备选
|
||
const deviceInfo = that.globalData.systemInfo
|
||
const fallbackId = `fallback_${deviceInfo.model.replace(/\s+/g, '_')}_${Date.now()}`
|
||
wx.setStorageSync('globalUserId', fallbackId)
|
||
that.globalData.globalUserId = fallbackId
|
||
typeof cb == "function" && cb(fallbackId)
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
console.error('微信登录失败:', err)
|
||
// 失败时生成一个基于设备的ID作为备选
|
||
const deviceInfo = that.globalData.systemInfo
|
||
const fallbackId = `fallback_${deviceInfo.model.replace(/\s+/g, '_')}_${Date.now()}`
|
||
wx.setStorageSync('globalUserId', fallbackId)
|
||
that.globalData.globalUserId = fallbackId
|
||
typeof cb == "function" && cb(fallbackId)
|
||
}
|
||
})
|
||
},
|
||
|
||
// 获取手机号
|
||
getPhoneNumber: function(e, cb) {
|
||
const that = this
|
||
|
||
if (e.detail.encryptedData && e.detail.iv) {
|
||
// 调用网关接口解密手机号
|
||
wx.request({
|
||
url: `${that.globalData.gatewayUrl}/v1/wechat/phone`,
|
||
method: 'POST',
|
||
data: {
|
||
encryptedData: e.detail.encryptedData,
|
||
iv: e.detail.iv,
|
||
code: e.detail.code // 有些版本会返回code
|
||
},
|
||
header: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
success: (res) => {
|
||
if (res.data && res.data.phoneNumber) {
|
||
const phoneNumber = res.data.phoneNumber
|
||
// 存储到本地
|
||
wx.setStorageSync('phoneNumber', phoneNumber)
|
||
that.globalData.phoneNumber = phoneNumber
|
||
typeof cb == "function" && cb(phoneNumber)
|
||
} else {
|
||
console.error('解密手机号失败:', res.data)
|
||
typeof cb == "function" && cb(null)
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
console.error('请求网关失败:', err)
|
||
typeof cb == "function" && cb(null)
|
||
}
|
||
})
|
||
} else {
|
||
console.error('用户拒绝授权手机号或获取加密数据失败')
|
||
typeof cb == "function" && cb(null)
|
||
}
|
||
},
|
||
|
||
// 获取地理位置信息
|
||
getLocation: function(cb) {
|
||
wx.getLocation({
|
||
type: 'wgs84',
|
||
success: (res) => {
|
||
const locationInfo = {
|
||
latitude: res.latitude,
|
||
longitude: res.longitude,
|
||
speed: res.speed,
|
||
accuracy: res.accuracy
|
||
}
|
||
// 存储到本地
|
||
wx.setStorageSync('locationInfo', locationInfo)
|
||
typeof cb == "function" && cb(locationInfo)
|
||
},
|
||
fail: (err) => {
|
||
console.error('获取地理位置失败:', err)
|
||
typeof cb == "function" && cb(null)
|
||
}
|
||
})
|
||
},
|
||
|
||
// 获取设备信息
|
||
getDeviceInfo: function() {
|
||
return this.globalData.systemInfo
|
||
},
|
||
|
||
// 获取网络状态
|
||
getNetworkType: function(cb) {
|
||
wx.getNetworkType({
|
||
success: (res) => {
|
||
typeof cb == "function" && cb(res.networkType)
|
||
}
|
||
})
|
||
},
|
||
|
||
// 检查更新
|
||
checkForUpdate: function() {
|
||
if (wx.canIUse('getUpdateManager')) {
|
||
const updateManager = wx.getUpdateManager()
|
||
|
||
updateManager.onCheckForUpdate(function (res) {
|
||
console.log('检查更新结果:', res.hasUpdate)
|
||
})
|
||
|
||
updateManager.onUpdateReady(function () {
|
||
wx.showModal({
|
||
title: '更新提示',
|
||
content: '新版本已经准备好,是否重启应用?',
|
||
success: function (res) {
|
||
if (res.confirm) {
|
||
updateManager.applyUpdate()
|
||
}
|
||
}
|
||
})
|
||
})
|
||
|
||
updateManager.onUpdateFailed(function () {
|
||
wx.showModal({
|
||
title: '更新提示',
|
||
content: '新版本下载失败',
|
||
showCancel: false
|
||
})
|
||
})
|
||
}
|
||
},
|
||
|
||
// 初始化网络监听
|
||
initNetworkListener: function() {
|
||
wx.onNetworkStatusChange(function(res) {
|
||
console.log('网络状态变化:', res)
|
||
if (!res.isConnected) {
|
||
wx.showToast({
|
||
title: '网络已断开',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
})
|
||
},
|
||
|
||
// 全局数据
|
||
globalData: {
|
||
userInfo: null,
|
||
globalUserId: null,
|
||
phoneNumber: null,
|
||
systemInfo: null,
|
||
apiBase: 'https://pactgo.cn/api/v1',
|
||
websocketUrl: 'wss://pactgo.cn/ws/task',
|
||
gatewayUrl: 'http://localhost:8000',
|
||
version: '1.0.0'
|
||
}
|
||
}) |