xxx项目于2020年11月30日正式投入试用,使用期间每天都有各种各样的用户反馈,有一眼就能看出问题的、有样式的问题、有老数据问题、有兼容问题,有脚本错误问题,等等。
一、对于WEB 端来说
1、比较好解决问题,直接让用户提供账号密码,在自己的电脑上就可以定位问题,APP 的问题,也是同样如此,都可以通过登录账号的方式,在本地操作看到日志,然后与后端进行一起定位,很快就可以定位出原因,快速处理解决。
二、对于微信小程序
a、然而,小程序就比较例外,是通过微信授权登录体系就行的,我们无法拿到用户的微信号进行登录操作;
b、期间,我定位小程序的一些问题,主要以往经验,以及对小程序的认识,业务的理解,定位问题。
c、但是这种定位问题的方式,试错成本较大,特别是一些关键的业务流程,养户是需要马上处理,否则养殖业务无法继续下去,另外,假如换了一个人,对业务逻辑不太熟悉的,可能就没那么好定位了;
d、因此,C 端的业务接口数据错误上报,变得尤为重要。因此我开始了此项工作的设计~~
微信小程序在管理后台,也有提供查看日志的功能,但此类的日志,只能查看该用户由于脚本、api 调用出错的
对业务逻辑不太熟悉的可能就没那么好定位了
同时,也提供 developers.weixin.qq.com/miniprogram… 接口,自定义业务数据错误上报
但是此方式不够灵活,而且后端开发人员较多,每个人负责不同的模块,每次都要登录小程序的管理后台定位问题,也是很不方便的操作。所以~~~ 自己搞吧。
设计前的思考:
1、不能够一直上传数据,否则会造成数据爆炸。通过开关解决
2、开关不能够太明显,否则会对用户造成困扰。隐藏式按钮,必要时才知道用户打开 出现问题时,需要远程指导用户,按具体的问题,触发开关
3、开启数据上传开关之后,需要自动关闭,否则会造成无效数据上传。通过时间对比,超过指定时间后自动关闭。
- 按钮页面: 页面进来的时候,通过本地的缓存,初始化按钮状态
onShow() {
const switchStatus = storage.getStorage('switchStatus') || false
this.setData({
isOpen: switchStatus
})
},
2) 点击开关,改变按钮状态的同时,记录当前的时间,用作计算时间差
switch() {
const { isOpen } = this.data
this.setData({
isOpen: !isOpen
})
storage.setStorage('switchStatus', !isOpen)
if(!isOpen){
storage.setStorage('switchStatusCreateTime', dayjs().format('YYYY-MM-DD HH:mm'))
} else {
storage.removeStorage('switchStatusCreateTime')
}
}
3) 触发上传操作的时候,计算间隔
// 获取当前的时间
const currentTime = dayjs()
// 获取本地存储的时间
const switchStatusCreateTime = storage.getStorage('switchStatusCreateTime')
// 获取开关状态
const switchStatus = storage.getStorage('switchStatus')
// 对比2个时间,是否已经超过12小时
const outTimeNumber = currentTime.diff(dayjs(switchStatusCreateTime), 'hour')
try {
if (outTimeNumber > outTime) { // 超出时的时间,主动清除上传开关缓存记录时间
storage.removeStorage('switchStatusCreateTime')
storage.removeStorage('switchStatus')
} else if (outTimeNumber < outTime && switchStatus) { // 在开关有效期时间内
const systemInfoObj = getSystemInfo() // 设备信息
const userInfo = getUserInfo()
const payLoad = {
interfaceUrl,
traceId,
accountId: userInfo.accountId,
userName: userInfo.userName,
phone: "",
otherData: { ...systemInfoObj, ...userInfo }
}
postRequestData(baseUrl, payLoad)
} else { // 重置所有配置
storage.removeStorage('switchStatusCreateTime')
storage.removeStorage('switchStatus')
}
} catch (error) {
console.log("error",error);
}
4、数据上传到哪里? 后端能查看到就可以,保存到业务数据库就很简单,后端直接提供接口处理。
后端提供一个日志接口,把需要上传的信息,按照后端规定好的格式上传,一般是用户信息、设备信息,还有关键的 traceId 、interfaceUrl,比如我就整理了比较多的信息上传
5、触发的时机,应该是即时的,无论业务接口成功或者失败,都应该触发。
即时触发,肯定是用户使用的时候,马上触发了,放在网络请求的位置最合适不过,我就放在了用户发起请求的成功或者失败的位置,都做一个上传
以上总结,不仅仅限用于小程序,所有H5 的思路都是差不多的,小程序得益于丰富的API ,获取用户信息、设备信息更为简单。