⚠️ 重要:在执行任何测试前,必须先创建数据库表!
执行以下SQL创建表结构:
-- 埋点事件表
CREATE TABLE `store_track_event` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`event_type` varchar(50) NOT NULL COMMENT '事件类型',
`event_category` varchar(50) NOT NULL COMMENT '事件分类',
`user_id` int(11) DEFAULT NULL COMMENT '用户ID',
`store_id` int(11) DEFAULT NULL COMMENT '店铺ID',
`target_id` int(11) DEFAULT NULL COMMENT '目标对象ID',
`target_type` varchar(50) DEFAULT NULL COMMENT '目标对象类型',
`event_data` text COMMENT '事件附加数据(JSON格式)',
`amount` decimal(10,2) DEFAULT NULL COMMENT '金额',
`duration` bigint(20) DEFAULT NULL COMMENT '时长(毫秒)',
`ip_address` varchar(50) DEFAULT NULL COMMENT 'IP地址',
`user_agent` varchar(500) DEFAULT NULL COMMENT '用户代理',
`device_type` varchar(20) DEFAULT NULL COMMENT '设备类型',
`app_version` varchar(20) DEFAULT NULL COMMENT 'APP版本号',
`event_time` datetime NOT NULL COMMENT '事件发生时间',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`delete_flag` int(1) NOT NULL DEFAULT '0' COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `idx_store_id` (`store_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_event_type` (`event_type`),
KEY `idx_event_category` (`event_category`),
KEY `idx_event_time` (`event_time`),
KEY `idx_store_event_time` (`store_id`,`event_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='埋点事件表';
-- 埋点统计表
CREATE TABLE `store_track_statistics` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`store_id` int(11) NOT NULL COMMENT '店铺ID',
`stat_date` date NOT NULL COMMENT '统计日期',
`stat_type` varchar(50) NOT NULL COMMENT '统计类型',
`traffic_data` text COMMENT '流量数据(JSON格式)',
`interaction_data` text COMMENT '互动数据(JSON格式)',
`coupon_data` text COMMENT '优惠券数据(JSON格式)',
`voucher_data` text COMMENT '代金券数据(JSON格式)',
`service_data` text COMMENT '服务质量数据(JSON格式)',
`price_ranking_data` text COMMENT '价目表排名数据(JSON格式)',
`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_store_date_type` (`store_id`,`stat_date`,`stat_type`),
KEY `idx_store_id` (`store_id`),
KEY `idx_stat_date` (`stat_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='埋点统计表';
@EnableScheduling)接口地址: POST http://localhost:8080/track/event
请求头:
Content-Type: application/json
Authorization: Bearer {your_token} # 如果需要认证
请求体:
{
"eventType": "VIEW",
"eventCategory": "TRAFFIC",
"storeId": 1001,
"targetType": "STORE",
"duration": 3000
}
预期结果:
{
"code": 200,
"success": true,
"msg": "上报成功",
"data": null
}
验证步骤:
调用接口后,检查Redis List中是否有数据
# 连接到Redis,查看队列长度
LLEN track:event:queue
# 查看队列中的数据
LRANGE track:event:queue 0 -1
等待10秒(定时任务消费间隔),检查数据库
-- 查询最新埋点数据
SELECT * FROM store_track_event
ORDER BY created_time DESC
LIMIT 10;
// 测试搜索事件
{
"eventType": "SEARCH",
"eventCategory": "TRAFFIC",
"storeId": 1001,
"targetType": "STORE"
}
// 测试收藏事件
{
"eventType": "COLLECT",
"eventCategory": "INTERACTION",
"storeId": 1001,
"targetType": "STORE"
}
// 测试分享事件
{
"eventType": "SHARE",
"eventCategory": "INTERACTION",
"storeId": 1001,
"targetType": "STORE"
}
// 测试价目表浏览
{
"eventType": "PRICE_VIEW",
"eventCategory": "PRICE",
"storeId": 1001,
"targetId": 2001,
"targetType": "PRICE"
}
在需要埋点的Controller方法上添加 @TrackEvent 注解:
@TrackEvent(
eventType = "VIEW",
eventCategory = "TRAFFIC",
storeId = "#{#storeId}",
targetType = "STORE"
)
@GetMapping("/store/detail")
public R<StoreInfo> getStoreDetail(@RequestParam Integer storeId) {
// 业务逻辑
return R.data(storeInfo);
}
GET /store/detail?storeId=1001)接口地址: GET http://localhost:8080/business/data
请求参数:
storeId=1001
startDate=2026-01-08
endDate=2026-01-14
category=TRAFFIC # 可选:TRAFFIC, INTERACTION, COUPON, VOUCHER, SERVICE, PRICE
完整URL示例:
GET http://localhost:8080/business/data?storeId=1001&startDate=2026-01-08&endDate=2026-01-14
预期响应:
{
"code": 200,
"success": true,
"msg": "查询成功",
"data": {
"trafficData": {
"searchCount": 10,
"viewCount": 50,
"visitorCount": 30,
"totalDuration": 150000,
"avgDuration": 3000
},
"interactionData": {
"collectCount": 5,
"shareCount": 3,
"checkinCount": 2,
"consultCount": 1
}
}
}
接口地址: GET http://localhost:8080/business/data/compare
请求参数:
storeId=1001
startDate1=2026-01-08
endDate1=2026-01-14
startDate2=2026-01-01
endDate2=2026-01-07
完整URL示例:
GET http://localhost:8080/business/data/compare?storeId=1001&startDate1=2026-01-08&endDate1=2026-01-14&startDate2=2026-01-01&endDate2=2026-01-07
预期响应:
{
"code": 200,
"success": true,
"msg": "查询成功",
"data": {
"period1": {
"trafficData": {
"viewCount": 100
}
},
"period2": {
"trafficData": {
"viewCount": 80
}
},
"compare": {
"traffic": {
"viewCountChange": 25.00
}
}
}
}
接口地址: GET http://localhost:8080/business/ai/recommendation
请求参数:
storeId=1001
完整URL示例:
GET http://localhost:8080/business/ai/recommendation?storeId=1001
预期响应:
{
"code": 200,
"success": true,
"msg": "查询成功",
"data": {
"summary": "相较于其他同星级的店铺,您价目表中的锅包肉和烤羊腿价格远高于其他商家",
"recommendations": [
{
"type": "PRICING",
"title": "价格优化建议",
"content": "寻找原材料更便宜的菜场、菜量降低、菜名突出特色,如锡林郭勒盟羔羊烤羊腿"
}
]
}
}
查看日志
成功消费X条埋点数据手动触发测试
LLEN track:event:queueLLEN track:event:queue(应该为0或减少)如果有多个服务实例,验证分布式锁是否生效:
# 步骤1: 上报多条埋点数据
curl -X POST http://localhost:8080/track/event \
-H "Content-Type: application/json" \
-d '{"eventType":"VIEW","eventCategory":"TRAFFIC","storeId":1001,"targetType":"STORE","duration":3000}'
curl -X POST http://localhost:8080/track/event \
-H "Content-Type: application/json" \
-d '{"eventType":"SEARCH","eventCategory":"TRAFFIC","storeId":1001,"targetType":"STORE"}'
curl -X POST http://localhost:8080/track/event \
-H "Content-Type: application/json" \
-d '{"eventType":"COLLECT","eventCategory":"INTERACTION","storeId":1001,"targetType":"STORE"}'
# 步骤2: 检查Redis List
# 连接到Redis执行: LLEN track:event:queue
# 步骤3: 等待10秒,定时任务会自动消费
# 步骤4: 查询数据库验证数据已写入
# SELECT COUNT(*) FROM store_track_event WHERE store_id = 1001;
# 步骤5: 查询统计数据
curl "http://localhost:8080/business/data?storeId=1001&startDate=2026-01-08&endDate=2026-01-14"
检查项:
LLEN track:event:queue检查项:
@EnableSchedulingTrackEventConsumer 类是否被Spring管理(@Component)检查项:
getTrafficData() 等方法是否有TODO未实现检查项:
@TrackEvent 注解在正确的方法上TrackEventAspect 类被Spring管理@Order)### 测试日期: 2026-01-14
### 测试人员: [姓名]
#### 测试结果
- ✅ 前端埋点上报: 通过
- ✅ AOP自动埋点: 通过
- ✅ Redis队列: 正常
- ✅ 定时消费: 正常
- ✅ 统计查询: 通过
- ⚠️ AI推荐: 待完善
#### 发现问题
1. [问题描述]
#### 建议
1. [建议内容]