2026-03-16 15:47:55 +08:00
|
|
|
|
// 应用入口文件
|
|
|
|
|
|
App({
|
|
|
|
|
|
onLaunch: function () {
|
|
|
|
|
|
console.log('智控未来小程序启动')
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化系统信息
|
|
|
|
|
|
this.globalData.systemInfo = wx.getSystemInfoSync()
|
|
|
|
|
|
|
|
|
|
|
|
// 检查更新
|
|
|
|
|
|
this.checkForUpdate()
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化网络监听
|
|
|
|
|
|
this.initNetworkListener()
|
2026-04-21 13:46:20 +08:00
|
|
|
|
|
|
|
|
|
|
// 初始化用户信息
|
|
|
|
|
|
this.initUserInfo()
|
2026-03-16 15:47:55 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
onShow: function () {
|
|
|
|
|
|
console.log('小程序显示')
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
onHide: function () {
|
|
|
|
|
|
console.log('小程序隐藏')
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
onError: function (msg) {
|
|
|
|
|
|
console.error('小程序错误:', msg)
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-04-21 13:46:20 +08:00
|
|
|
|
// 初始化用户信息
|
|
|
|
|
|
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)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2026-03-16 15:47:55 +08:00
|
|
|
|
// 检查更新
|
|
|
|
|
|
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,
|
2026-04-21 13:46:20 +08:00
|
|
|
|
globalUserId: null,
|
|
|
|
|
|
phoneNumber: null,
|
2026-03-16 15:47:55 +08:00
|
|
|
|
systemInfo: null,
|
|
|
|
|
|
apiBase: 'https://pactgo.cn/api/v1',
|
|
|
|
|
|
websocketUrl: 'wss://pactgo.cn/ws/task',
|
2026-04-21 13:46:20 +08:00
|
|
|
|
gatewayUrl: 'http://localhost:8000',
|
2026-03-16 15:47:55 +08:00
|
|
|
|
version: '1.0.0'
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|