- 什么是埋点?
在前端代码中嵌入特定的代码片段,用于记录用户在网站或应用程序中的行为和交互方式 - 为什么要做?
要目的是为了收集和分析用户行为数据,以便优化产品和提高用户体验。具体来说,埋点可以帮助前端开发人员了解用户在应用中的行为和交互方式,例如点击、滚动、输入等,以及用户使用的设备、浏览器、操作系统等信息。通过对这些数据的分析,前端开发人员可以发现用户的痛点和需求,优化产品设计和功能,提高用户满意度和留存率。此外,埋点还可以帮助前端开发人员监控应用的性能和稳定性,及时发现和解决问题,提高应用的可靠性和安全性。
数据库设计用户画像表
- 需要在画像表(user_log)新增的字段
- unique_id—用户唯一值(用户ip+设备 md5加密)
- device_type—设备类型
- region—地域(地图)
- referer—来源(网站)
- gmt_create—创建时间
- gmt_modified—修改时间
- 获取pv、uv
- pv:统计user_log的个数(一个用户访问多次记为多次)
- uv:根据uniqueId分组获取总个数(一个用户访问多次记为1次)
- 终端类型分布
- device_type:各个终端的占比
- 地域分布
- region:各个省的访问人数
- 来源
- referer:来源网站访问人数
用户的PV/UV统计接口开发 (uv - id pv - 数据条数)
数据层逻辑开发
// 流量访问统计 flowStat: async () => { let timeQuery = [dayjs().subtract(7, 'day').format('YYYY-MM-DD'), dayjs().format('YYYY-MM-DD')] // pv统计 let pvSql = `select gmt_create,count(*) as value from user_log where gmt_create between ? and ? group by gmt_create` // sequelize原始查询 let pvList = await DB.sequelize.query(pvSql, { replacements: timeQuery, type: QueryTypes.SELECT }) // uv统计 let uvSql = `select gmt_create, count(distinct unique_id) as value from user_log where gmt_create between ? and ? group by gmt_create` // sequelize原始查询 let uvList = await DB.sequelize.query(uvSql, { replacements: timeQuery, type: QueryTypes.SELECT }) return BackCode.buildSuccessAndData({ data: { pv: pvList, uv: uvList } }) }
- 后端用户画像统计接口开发
userLog: async (req) => { // 1.ip+设备拼接md5进行加密生成用户唯一值 let uniqueId = SecretTool.md5(GetUserInfoTool.getIp(req) + GetUserInfoTool.getUseragent(req)) // 2.获取用户的设备类型 let userAgent = GetUserInfoTool.getUseragent(req) let device_type = ''; if (/Android/i.test(userAgent)) { device_type = 'Android'; } else if (/iPhone|iPad/i.test(userAgent)) { device_type = 'IOS'; } else if (/Windows|Macintosh/i.test(userAgent)) { device_type = 'PC'; } // 获取用户所在地域 let ip = GetUserInfoTool.getIp(req) let geo = geoip.lookup(ip) // 用户访问的来源(前端通过document.referrer获取) let referer = req.body?.referer || '直接访问' // 插入数据库 await DB.UserLog.create({ unique_id: uniqueId, device_type, region: geo?.region, referer }) return BackCode.buildSuccess() }
geoip-lite插件获得地域。
// 终端类型分布 deviceType: async () => { let allNum = await DB.UserLog.count() let deviceTypeSql = `select device_type,count(*) as value from user_log group by device_type` // sequelize原始查询 let deviceTypeList = await DB.sequelize.query(deviceTypeSql, { type: QueryTypes.SELECT }) let newList = deviceTypeList.map((item) => { let value = (item.value / allNum * 100).toFixed(0) return { ...item, value } }) return BackCode.buildSuccessAndData({ data: newList }) },