You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

214 lines
5.9 KiB
C#

// ============================================================================
// 【文件说明】AnalyticsCollectRequest.cs - 分析事件收集请求 DTO
// ============================================================================
// 这是前端上报访问事件的请求数据结构。
//
// 【什么是 DTO
// DTO = Data Transfer Object数据传输对象
// - 用于在 API 和前端之间传递数据
// - 不包含业务逻辑
// - 通常是简单的属性容器
//
// 【与 Java Spring Boot 的对比】
// Java 通常用 POJO 或 Record
// public class AnalyticsCollectRequest {
// private String visitorId;
// private String sessionId;
// // getter/setter...
// }
//
// 或 Java 14+ Record
// public record AnalyticsCollectRequest(
// String visitorId,
// String sessionId,
// ...
// ) {}
//
// C# 用普通类 + 自动属性,更简洁。
// ============================================================================
namespace Admin.NET.Plugin.HwPortal;
/// <summary>
/// 分析事件收集请求。
/// <para>
/// 【业务场景】
/// 前端在以下时机上报事件:
/// - 页面加载完成page_view
/// - 离开页面page_leave带停留时长
/// - 提交搜索search_submit带关键词
/// - 点击下载download_click
/// - 提交联系表单contact_submit
/// </para>
/// <para>
/// 【C# 语法知识点 - 自动属性】
/// public string VisitorId { get; set; }
///
/// 这是 C# 3.0 引入的"自动属性"语法:
/// - 编译器自动生成私有字段
/// - 不需要显式声明 getter/setter
/// - 等价于 Java 的 private field + public getter/setter
///
/// 对比 Java
/// Java:
/// private String visitorId;
/// public String getVisitorId() { return visitorId; }
/// public void setVisitorId(String visitorId) { this.visitorId = visitorId; }
///
/// C# 一行代码完成同样功能。
/// </para>
/// </summary>
public class AnalyticsCollectRequest
{
/// <summary>
/// 访客 ID。
/// <para>
/// 【业务说明】
/// 由前端生成并存储在 Cookie 或 localStorage
/// - 首次访问时生成 UUID
/// - 后续访问复用同一 ID
/// - 用于识别同一访客的多次访问
/// </para>
/// </summary>
public string VisitorId { get; set; }
/// <summary>
/// 会话 ID。
/// <para>
/// 【业务说明】
/// 每次访问生成新的会话 ID
/// - 用于区分不同的访问会话
/// - 计算跳出率(单页会话占比)
/// </para>
/// </summary>
public string SessionId { get; set; }
/// <summary>
/// 事件类型。
/// <para>
/// 【允许值】
/// - page_view页面浏览
/// - page_leave离开页面
/// - search_submit提交搜索
/// - download_click点击下载
/// - contact_submit提交联系表单
/// </para>
/// </summary>
public string EventType { get; set; }
/// <summary>
/// 页面路径。
/// <para>
/// 【示例】
/// /product/detail
/// /search?keyword=xxx
/// </para>
/// </summary>
public string Path { get; set; }
/// <summary>
/// 来源页面Referrer
/// <para>
/// 【业务说明】
/// 用户从哪个页面跳转过来:
/// - 搜索引擎https://www.google.com/search?q=xxx
/// - 外部网站https://partner.com/link
/// - 直接访问:为空
/// </para>
/// </summary>
public string Referrer { get; set; }
/// <summary>
/// UTM 来源参数。
/// <para>
/// 【业务说明】
/// 用于营销追踪:
/// - utm_source流量来源如 google, baidu
/// - utm_medium营销媒介如 cpc, email
/// - utm_campaign营销活动名称
/// </para>
/// </summary>
public string UtmSource { get; set; }
/// <summary>
/// UTM 媒介参数。
/// </summary>
public string UtmMedium { get; set; }
/// <summary>
/// UTM 活动参数。
/// </summary>
public string UtmCampaign { get; set; }
/// <summary>
/// 搜索关键词。
/// <para>
/// 【业务说明】
/// 仅 search_submit 事件需要此字段。
/// </para>
/// </summary>
public string Keyword { get; set; }
/// <summary>
/// User-Agent 字符串。
/// <para>
/// 【业务说明】
/// 前端可以上报自己的 UA如果不传则使用请求头中的 UA。
/// </para>
/// </summary>
public string Ua { get; set; }
/// <summary>
/// 设备类型(前端上报)。
/// <para>
/// 【允许值】
/// - Mobile手机
/// - Tablet平板
/// - Desktop桌面
/// </para>
/// </summary>
public string Device { get; set; }
/// <summary>
/// 浏览器名称(前端上报)。
/// </summary>
public string Browser { get; set; }
/// <summary>
/// 操作系统(前端上报)。
/// </summary>
public string Os { get; set; }
/// <summary>
/// 停留时长(毫秒)。
/// <para>
/// 【C# 语法知识点 - 可空值类型】
/// long? 是可空的长整型:
/// - 可以是 null表示未提供
/// - 可以是 long 值
///
/// 对比 Java
/// Java 用 Long 包装类:
/// private Long stayMs; // 可以为 null
///
/// C# 的可空值类型是值类型,更高效。
/// </para>
/// <para>
/// 【业务说明】
/// 仅 page_leave 事件需要此字段。
/// </para>
/// </summary>
public long? StayMs { get; set; }
/// <summary>
/// 事件时间Unix 毫秒时间戳)。
/// <para>
/// 【业务说明】
/// 前端上报事件发生的时间:
/// - 如果不传,使用服务器当前时间
/// - 用于处理网络延迟导致的时间偏差
/// </para>
/// </summary>
public long? EventTime { get; set; }
}