e9c3dc1120
保留 SpacetimeDB 历史表、迁移白名单与旧业务源码 切换前端 active 入口并解除旧创作页面和路由编译链 移除旧后端路由、worker 与纯业务 crate 依赖 收敛 SpacetimeDB 模块为历史数据壳 同步 Nginx、Pingora、验证门禁与架构文档
404 lines
10 KiB
TypeScript
404 lines
10 KiB
TypeScript
import type {
|
|
AdminTrackingEventKeyPayload,
|
|
TrackingScopeKind,
|
|
} from '../api/adminApiTypes';
|
|
|
|
export interface AdminTrackingEventDefinition {
|
|
key: string;
|
|
title: string;
|
|
scopeKind: TrackingScopeKind;
|
|
remark: string;
|
|
taskConfigEligible?: boolean;
|
|
}
|
|
|
|
export interface AdminTrackingEventKeyOption {
|
|
key: string;
|
|
title: string;
|
|
scopeKind: TrackingScopeKind | string;
|
|
scopeKinds: string[];
|
|
remark: string;
|
|
}
|
|
|
|
export const adminTrackingEventDefinitions: AdminTrackingEventDefinition[] = [
|
|
{
|
|
key: 'auth_login_options_view',
|
|
title: '登录方式查看',
|
|
scopeKind: 'site',
|
|
remark: '读取当前可用登录方式时记录,用于观察登录入口曝光。',
|
|
},
|
|
{
|
|
key: 'auth_phone_code_send',
|
|
title: '发送手机验证码',
|
|
scopeKind: 'site',
|
|
remark: '提交手机验证码发送请求成功后记录。',
|
|
},
|
|
{
|
|
key: 'daily_login',
|
|
title: '每日登录',
|
|
scopeKind: 'user',
|
|
remark:
|
|
'认证成功或 refresh 续期后由后端幂等记录,用于每日登录任务进度校验。',
|
|
taskConfigEligible: true,
|
|
},
|
|
{
|
|
key: 'auth_phone_login_success',
|
|
title: '手机号登录成功',
|
|
scopeKind: 'user',
|
|
remark: '手机号验证码登录成功后记录。',
|
|
},
|
|
{
|
|
key: 'auth_me_view',
|
|
title: '当前账号查看',
|
|
scopeKind: 'user',
|
|
remark: '读取当前登录账号信息成功后记录。',
|
|
},
|
|
{
|
|
key: 'auth_sessions_view',
|
|
title: '登录会话查看',
|
|
scopeKind: 'user',
|
|
remark: '读取当前账号登录会话列表成功后记录。',
|
|
},
|
|
{
|
|
key: 'auth_refresh_success',
|
|
title: '登录续期成功',
|
|
scopeKind: 'site',
|
|
remark: 'refresh cookie 续期成功后记录。',
|
|
},
|
|
{
|
|
key: 'auth_logout',
|
|
title: '退出登录',
|
|
scopeKind: 'user',
|
|
remark: '退出当前登录会话成功后记录。',
|
|
},
|
|
{
|
|
key: 'auth_logout_all',
|
|
title: '退出全部会话',
|
|
scopeKind: 'user',
|
|
remark: '退出全部登录会话成功后记录。',
|
|
},
|
|
{
|
|
key: 'auth_wechat_bind_phone_success',
|
|
title: '微信绑定手机成功',
|
|
scopeKind: 'user',
|
|
remark: '微信账号绑定手机号成功后记录。',
|
|
},
|
|
{
|
|
key: 'profile_identity_update',
|
|
title: '资料更新',
|
|
scopeKind: 'user',
|
|
remark: '用户资料更新成功后记录。',
|
|
},
|
|
{
|
|
key: 'profile_dashboard_view',
|
|
title: '个人看板查看',
|
|
scopeKind: 'user',
|
|
remark: '读取个人看板成功后记录。',
|
|
},
|
|
{
|
|
key: 'wallet_ledger_view',
|
|
title: '钱包流水查看',
|
|
scopeKind: 'user',
|
|
remark: '读取泥点钱包流水成功后记录。',
|
|
},
|
|
{
|
|
key: 'recharge_center_view',
|
|
title: '充值中心查看',
|
|
scopeKind: 'user',
|
|
remark: '读取充值中心信息成功后记录。',
|
|
},
|
|
{
|
|
key: 'recharge_order_create',
|
|
title: '充值订单创建',
|
|
scopeKind: 'user',
|
|
remark: '创建充值订单成功后记录。',
|
|
},
|
|
{
|
|
key: 'feedback_submit',
|
|
title: '反馈提交',
|
|
scopeKind: 'user',
|
|
remark: '资料页反馈提交成功后记录。',
|
|
},
|
|
{
|
|
key: 'invite_center_view',
|
|
title: '邀请中心查看',
|
|
scopeKind: 'user',
|
|
remark: '读取邀请中心成功后记录。',
|
|
},
|
|
{
|
|
key: 'referral_invite_code_redeem',
|
|
title: '邀请码绑定',
|
|
scopeKind: 'user',
|
|
remark: '绑定推荐邀请码成功后记录。',
|
|
},
|
|
{
|
|
key: 'redeem_code_submit',
|
|
title: '兑换码提交',
|
|
scopeKind: 'user',
|
|
remark: '提交运营兑换码成功后记录。',
|
|
},
|
|
{
|
|
key: 'task_center_view',
|
|
title: '任务中心查看',
|
|
scopeKind: 'user',
|
|
remark: '读取个人任务中心成功后记录。',
|
|
},
|
|
{
|
|
key: 'task_reward_claim',
|
|
title: '任务奖励领取',
|
|
scopeKind: 'user',
|
|
remark: '领取个人任务奖励成功后记录。',
|
|
},
|
|
{
|
|
key: 'profile_analytics_metric_view',
|
|
title: '个人指标查看',
|
|
scopeKind: 'user',
|
|
remark: '读取个人埋点指标成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_create',
|
|
title: 'AI 任务创建',
|
|
scopeKind: 'user',
|
|
remark: '创建 AI 任务成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_start',
|
|
title: 'AI 任务启动',
|
|
scopeKind: 'user',
|
|
remark: '启动 AI 任务成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_stage_start',
|
|
title: 'AI 阶段启动',
|
|
scopeKind: 'user',
|
|
remark: '启动 AI 任务阶段成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_chunk_append',
|
|
title: 'AI 分片追加',
|
|
scopeKind: 'user',
|
|
remark: '追加 AI 文本分片成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_stage_complete',
|
|
title: 'AI 阶段完成',
|
|
scopeKind: 'user',
|
|
remark: '完成 AI 任务阶段成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_reference_attach',
|
|
title: 'AI 结果引用绑定',
|
|
scopeKind: 'user',
|
|
remark: '绑定 AI 结果引用成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_complete',
|
|
title: 'AI 任务完成',
|
|
scopeKind: 'user',
|
|
remark: '完成 AI 任务成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_fail',
|
|
title: 'AI 任务失败标记',
|
|
scopeKind: 'user',
|
|
remark: '标记 AI 任务失败成功后记录。',
|
|
},
|
|
{
|
|
key: 'ai_task_cancel',
|
|
title: 'AI 任务取消',
|
|
scopeKind: 'user',
|
|
remark: '取消 AI 任务成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_upload_ticket_create',
|
|
title: '资产上传票据创建',
|
|
scopeKind: 'user',
|
|
remark: '创建直传票据成功后记录,metadata 包含低敏资产定位字段。',
|
|
},
|
|
{
|
|
key: 'asset_sts_credentials_create',
|
|
title: '资产 STS 凭证创建',
|
|
scopeKind: 'user',
|
|
remark: '创建临时上传凭证成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_upload_confirm',
|
|
title: '资产上传确认',
|
|
scopeKind: 'user',
|
|
remark: '确认 OSS 对象为平台资产成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_bind',
|
|
title: '资产绑定',
|
|
scopeKind: 'user',
|
|
remark: '把平台资产绑定到业务实体成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_character_visual_generate',
|
|
title: '角色形象生成',
|
|
scopeKind: 'user',
|
|
remark: '角色主图生成请求成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_character_visual_publish',
|
|
title: '角色形象发布',
|
|
scopeKind: 'user',
|
|
remark: '角色主图发布成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_character_animation_generate',
|
|
title: '角色动画生成',
|
|
scopeKind: 'user',
|
|
remark: '角色动画生成请求成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_character_animation_publish',
|
|
title: '角色动画发布',
|
|
scopeKind: 'user',
|
|
remark: '角色动画发布成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_character_animation_import',
|
|
title: '角色动画视频导入',
|
|
scopeKind: 'user',
|
|
remark: '角色动画导入视频成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_character_workflow_cache_save',
|
|
title: '角色工作流缓存保存',
|
|
scopeKind: 'user',
|
|
remark: '保存角色工作流缓存成功后记录。',
|
|
},
|
|
{
|
|
key: 'asset_history_view',
|
|
title: '资产历史查看',
|
|
scopeKind: 'user',
|
|
remark: '读取资产历史成功后记录。',
|
|
},
|
|
{
|
|
key: 'llm_request',
|
|
title: 'LLM 请求',
|
|
scopeKind: 'user',
|
|
remark: '调用后端 LLM 门面成功后记录。',
|
|
},
|
|
{
|
|
key: 'speech_config_view',
|
|
title: '语音配置查看',
|
|
scopeKind: 'user',
|
|
remark: '读取语音配置成功后记录。',
|
|
},
|
|
{
|
|
key: 'asr_stream_start',
|
|
title: 'ASR 流启动',
|
|
scopeKind: 'user',
|
|
remark: '启动语音识别流成功后记录。',
|
|
},
|
|
{
|
|
key: 'tts_bidirection_start',
|
|
title: 'TTS 双向流启动',
|
|
scopeKind: 'user',
|
|
remark: '启动双向语音合成流成功后记录。',
|
|
},
|
|
{
|
|
key: 'tts_sse_start',
|
|
title: 'TTS SSE 启动',
|
|
scopeKind: 'user',
|
|
remark: '启动 SSE 语音合成成功后记录。',
|
|
},
|
|
{
|
|
key: 'runtime_settings_view',
|
|
title: '运行设置查看',
|
|
scopeKind: 'user',
|
|
remark: '读取运行设置成功后记录。',
|
|
},
|
|
{
|
|
key: 'runtime_settings_update',
|
|
title: '运行设置更新',
|
|
scopeKind: 'user',
|
|
remark: '更新运行设置成功后记录。',
|
|
},
|
|
];
|
|
|
|
export const adminProfileTaskTrackingEventDefinitions =
|
|
adminTrackingEventDefinitions.filter(
|
|
(definition) => definition.taskConfigEligible,
|
|
);
|
|
|
|
export function findAdminTrackingEventDefinition(eventKey: string) {
|
|
const normalizedEventKey = eventKey.trim();
|
|
return (
|
|
adminTrackingEventDefinitions.find(
|
|
(definition) => definition.key === normalizedEventKey,
|
|
) ?? null
|
|
);
|
|
}
|
|
|
|
export function filterAdminTrackingEventDefinitions(query: string) {
|
|
return filterTrackingEventDefinitions(adminTrackingEventDefinitions, query);
|
|
}
|
|
|
|
export function buildAdminTrackingEventKeyOptions(
|
|
eventKeys: AdminTrackingEventKeyPayload[],
|
|
): AdminTrackingEventKeyOption[] {
|
|
const options = new Map<string, AdminTrackingEventKeyOption>();
|
|
for (const payload of eventKeys) {
|
|
const key = payload.eventKey.trim();
|
|
if (!key || options.has(key)) {
|
|
continue;
|
|
}
|
|
const definition = findAdminTrackingEventDefinition(key);
|
|
const scopeKinds = payload.scopeKinds.length
|
|
? payload.scopeKinds
|
|
: definition
|
|
? [definition.scopeKind]
|
|
: [];
|
|
options.set(key, {
|
|
key,
|
|
title: definition?.title ?? (payload.eventTitle || key),
|
|
scopeKind: definition?.scopeKind ?? scopeKinds[0] ?? '',
|
|
scopeKinds,
|
|
remark: definition?.remark ?? '真实埋点库中已出现的 event key。',
|
|
});
|
|
}
|
|
return [...options.values()].sort((left, right) =>
|
|
left.key.localeCompare(right.key),
|
|
);
|
|
}
|
|
|
|
export function filterAdminTrackingEventKeyOptions(
|
|
options: AdminTrackingEventKeyOption[],
|
|
query: string,
|
|
) {
|
|
return filterTrackingEventDefinitions(options, query);
|
|
}
|
|
|
|
export function filterAdminProfileTaskTrackingEventDefinitions(query: string) {
|
|
return filterTrackingEventDefinitions(
|
|
adminProfileTaskTrackingEventDefinitions,
|
|
query,
|
|
);
|
|
}
|
|
|
|
function filterTrackingEventDefinitions(
|
|
definitions: Array<
|
|
AdminTrackingEventDefinition | AdminTrackingEventKeyOption
|
|
>,
|
|
query: string,
|
|
) {
|
|
const normalizedQuery = query.trim().toLowerCase();
|
|
if (!normalizedQuery) {
|
|
return definitions;
|
|
}
|
|
|
|
return definitions.filter((definition) => {
|
|
const haystack = [
|
|
definition.key,
|
|
definition.title,
|
|
definition.scopeKind,
|
|
definition.remark,
|
|
]
|
|
.join(' ')
|
|
.toLowerCase();
|
|
return haystack.includes(normalizedQuery);
|
|
});
|
|
}
|