184 lines
3.5 KiB
TypeScript
184 lines
3.5 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'
|
||
}
|
||
|
||
// 标签类型
|
||
export interface Tag {
|
||
id: string;
|
||
name: string;
|
||
color?: string;
|
||
type?: string;
|
||
attributes?: Record<string, any>;
|
||
team_id?: string;
|
||
}
|
||
|
||
// API 响应基础接口
|
||
export interface ApiResponse<T> {
|
||
success: boolean;
|
||
data?: T;
|
||
error?: string;
|
||
meta?: {
|
||
total?: number;
|
||
page?: number;
|
||
pageSize?: number;
|
||
};
|
||
}
|
||
|
||
// 事件查询参数
|
||
export interface EventsQueryParams {
|
||
startTime?: string; // ISO 格式时间
|
||
endTime?: string; // ISO 格式时间
|
||
eventType?: EventType;
|
||
linkId?: string;
|
||
linkSlug?: string;
|
||
userId?: string;
|
||
teamId?: string;
|
||
teamIds?: string[]; // 团队ID数组,支持多选
|
||
projectId?: string;
|
||
projectIds?: string[]; // 项目ID数组,支持多选
|
||
tagIds?: string[]; // 标签ID数组,支持多选
|
||
page?: number;
|
||
pageSize?: number;
|
||
sortBy?: string;
|
||
sortOrder?: 'asc' | 'desc';
|
||
}
|
||
|
||
// 事件基础信息
|
||
export interface Event {
|
||
event_id: string;
|
||
event_time: string;
|
||
event_type: EventType;
|
||
event_attributes: Record<string, any>;
|
||
|
||
// 链接信息
|
||
link_id: string;
|
||
link_slug: string;
|
||
link_label: string;
|
||
link_title: string;
|
||
link_original_url: string;
|
||
link_attributes: Record<string, any>;
|
||
link_created_at: string;
|
||
link_expires_at: string | null;
|
||
link_tags: string[];
|
||
|
||
// 用户信息
|
||
user_id: string;
|
||
user_name: string;
|
||
user_email: string;
|
||
user_attributes: Record<string, any>;
|
||
|
||
// 团队信息
|
||
team_id: string;
|
||
team_name: string;
|
||
team_attributes: Record<string, any>;
|
||
|
||
// 项目信息
|
||
project_id: string;
|
||
project_name: string;
|
||
project_attributes: Record<string, any>;
|
||
|
||
// 访问者信息
|
||
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;
|
||
}>;
|
||
}
|