feat: 访问埋点统计——VisitLog模型+/api GET埋点中间件(小程序/H5/直接访问来源识别)+访问统计接口+看板PV/UV/来源分布卡+日志页访问埋点Tab
This commit is contained in:
@@ -8,6 +8,7 @@ const morgan = require('morgan')
|
||||
const rateLimit = require('express-rate-limit')
|
||||
|
||||
const connectDB = require('./config/database')
|
||||
const { VisitLog } = require('./models')
|
||||
const initRoutes = require('./routes')
|
||||
const seoRoutes = require('./routes/seo')
|
||||
const registerWxMsgRoutes = require('./routes/wxmsg')
|
||||
@@ -65,6 +66,29 @@ const limiter = rateLimit({
|
||||
})
|
||||
app.use('/api/', limiter)
|
||||
|
||||
// 访问埋点:记录页面级 GET 请求(排除管理后台/认证/健康检查),小程序与 H5 访问均可统计
|
||||
app.use('/api', (req, res, next) => {
|
||||
try {
|
||||
if (req.method === 'GET' && !req.path.startsWith('/admin') && !req.path.startsWith('/auth')) {
|
||||
const ua = String(req.headers['user-agent'] || '')
|
||||
const referer = String(req.headers.referer || '')
|
||||
let source = '直接访问'
|
||||
if (referer.includes('servicewechat.com')) source = '小程序'
|
||||
else if (referer.includes('/h5') || referer.includes('wdkj.yuzhiran.com.cn')) source = 'H5'
|
||||
const os = /windows/i.test(ua) ? 'Windows' : /iphone|ipad|ios/i.test(ua) ? 'iOS' : /android/i.test(ua) ? 'Android' : /mac os/i.test(ua) ? 'MacOS' : ''
|
||||
const browser = /MicroMessenger/i.test(ua) ? '微信' : /Mobile Safari/i.test(ua) ? 'Safari' : /Edg\//i.test(ua) ? 'Edge' : /Chrome/i.test(ua) ? 'Chrome' : /Firefox/i.test(ua) ? 'Firefox' : ''
|
||||
const device = /Mobile|iPhone/i.test(ua) || (/Android/i.test(ua) && /Mobile/i.test(ua)) ? '移动端' : '桌面端'
|
||||
VisitLog.create({
|
||||
path: String(req.originalUrl || req.path).slice(0, 120),
|
||||
source,
|
||||
ip: req.ip || '',
|
||||
os, browser, device,
|
||||
}).catch(() => {})
|
||||
}
|
||||
} catch (e) { /* 埋点失败不影响业务 */ }
|
||||
next()
|
||||
})
|
||||
|
||||
// 健康检查
|
||||
app.get('/health', (req, res) => {
|
||||
res.status(200).json({
|
||||
|
||||
Reference in New Issue
Block a user