187 lines
3.7 KiB
TypeScript
187 lines
3.7 KiB
TypeScript
// 事件类型
|
|
export enum EventType {
|
|
CLICK = 'click',
|
|
REDIRECT = 'redirect',
|
|
CONVERSION = 'conversion',
|
|
ERROR = 'error'
|
|
}
|
|
|
|
// 转化类型
|
|
export enum ConversionType {
|
|
VISIT = 'visit',
|
|
STAY = 'stay',
|
|
INTERACT = 'interact',
|
|
SIGNUP = 'signup',
|
|
SUBSCRIPTION = 'subscription',
|
|
PURCHASE = 'purchase'
|
|
}
|
|
|
|
// 设备类型
|
|
export enum DeviceType {
|
|
MOBILE = 'mobile',
|
|
TABLET = 'tablet',
|
|
DESKTOP = 'desktop',
|
|
OTHER = 'other'
|
|
}
|
|
|
|
// API 响应基础接口
|
|
export interface ApiResponse<T> {
|
|
success: boolean;
|
|
data?: T;
|
|
error?: string;
|
|
meta?: {
|
|
total?: number;
|
|
page?: number;
|
|
pageSize?: number;
|
|
filters?: {
|
|
startTime?: string;
|
|
endTime?: string;
|
|
tags?: string[];
|
|
teamId?: string;
|
|
projectId?: string;
|
|
searchSlug?: string;
|
|
};
|
|
};
|
|
}
|
|
|
|
// 事件查询参数
|
|
export interface EventsQueryParams {
|
|
startTime?: string; // ISO 格式时间
|
|
endTime?: string; // ISO 格式时间
|
|
eventType?: EventType;
|
|
linkId?: string;
|
|
linkSlug?: string;
|
|
userId?: string;
|
|
teamId?: string;
|
|
projectId?: string;
|
|
tags?: string[]; // 标签筛选
|
|
searchSlug?: string; // slug搜索关键词
|
|
page?: number;
|
|
pageSize?: number;
|
|
sortBy?: string;
|
|
sortOrder?: 'asc' | 'desc';
|
|
}
|
|
|
|
// 属性值类型
|
|
export type AttributeValue = string | number | boolean | null | AttributeValue[] | { [key: string]: AttributeValue };
|
|
|
|
// 属性记录类型
|
|
export type AttributesRecord = Record<string, AttributeValue>;
|
|
|
|
// 事件基础信息
|
|
export interface Event {
|
|
event_id: string;
|
|
event_time: string;
|
|
event_type: EventType;
|
|
event_attributes: AttributesRecord;
|
|
|
|
// 链接信息
|
|
link_id: string;
|
|
link_slug: string;
|
|
link_label: string;
|
|
link_title: string;
|
|
link_original_url: string;
|
|
link_attributes: AttributesRecord;
|
|
link_created_at: string;
|
|
link_expires_at: string | null;
|
|
link_tags: string[];
|
|
|
|
// 用户信息
|
|
user_id: string;
|
|
user_name: string;
|
|
user_email: string;
|
|
user_attributes: AttributesRecord;
|
|
|
|
// 团队信息
|
|
team_id: string;
|
|
team_name: string;
|
|
team_attributes: AttributesRecord;
|
|
|
|
// 项目信息
|
|
project_id: string;
|
|
project_name: string;
|
|
project_attributes: AttributesRecord;
|
|
|
|
// 访问者信息
|
|
visitor_id: string;
|
|
session_id: string;
|
|
ip_address: string;
|
|
country: string;
|
|
city: string;
|
|
device_type: DeviceType;
|
|
browser: string;
|
|
os: string;
|
|
user_agent: string;
|
|
|
|
// 来源信息
|
|
referrer: string;
|
|
utm_source: string;
|
|
utm_medium: string;
|
|
utm_campaign: string;
|
|
|
|
// 交互信息
|
|
time_spent_sec: number;
|
|
is_bounce: boolean;
|
|
is_qr_scan: boolean;
|
|
conversion_type: ConversionType;
|
|
conversion_value: number;
|
|
}
|
|
|
|
// 事件概览数据
|
|
export interface EventsSummary {
|
|
totalEvents: number;
|
|
uniqueVisitors: number;
|
|
totalConversions: number;
|
|
averageTimeSpent: number;
|
|
deviceTypes: {
|
|
mobile: number;
|
|
desktop: number;
|
|
tablet: number;
|
|
other: number;
|
|
};
|
|
browsers: Array<{
|
|
name: string;
|
|
count: number;
|
|
percentage: number;
|
|
}>;
|
|
operatingSystems: Array<{
|
|
name: string;
|
|
count: number;
|
|
percentage: number;
|
|
}>;
|
|
}
|
|
|
|
// 时间序列数据
|
|
export interface TimeSeriesData {
|
|
timestamp: string;
|
|
events: number;
|
|
visitors: number;
|
|
conversions: number;
|
|
}
|
|
|
|
// 地理位置数据
|
|
export interface GeoData {
|
|
location: string;
|
|
visits: number;
|
|
visitors: number;
|
|
percentage: number;
|
|
}
|
|
|
|
// 设备分析数据
|
|
export interface DeviceAnalytics {
|
|
deviceTypes: Array<{
|
|
type: DeviceType;
|
|
count: number;
|
|
percentage: number;
|
|
}>;
|
|
browsers: Array<{
|
|
name: string;
|
|
count: number;
|
|
percentage: number;
|
|
}>;
|
|
operatingSystems: Array<{
|
|
name: string;
|
|
count: number;
|
|
percentage: number;
|
|
}>;
|
|
}
|