feat: 增加匿名统计选项开关

This commit is contained in:
digua
2025-12-20 10:50:36 +08:00
parent 8c93e23357
commit af83ced997
6 changed files with 187 additions and 99 deletions
+46 -3
View File
@@ -3,7 +3,7 @@
* 使用 Aptabase 进行匿名使用统计
*/
import { app } from 'electron'
import { app, ipcMain } from 'electron'
import { initialize, trackEvent } from '@aptabase/electron/main'
import * as fs from 'fs'
import * as path from 'path'
@@ -16,6 +16,13 @@ function getAnalyticsPath(): string {
// 分析数据结构
interface AnalyticsData {
lastReportDate: string | null
enabled: boolean // 是否启用统计
}
// 默认配置
const defaultAnalyticsData: AnalyticsData = {
lastReportDate: null,
enabled: true, // 默认启用
}
// 读取分析数据
@@ -24,12 +31,12 @@ function loadAnalyticsData(): AnalyticsData {
const filePath = getAnalyticsPath()
if (fs.existsSync(filePath)) {
const data = fs.readFileSync(filePath, 'utf-8')
return JSON.parse(data)
return { ...defaultAnalyticsData, ...JSON.parse(data) }
}
} catch (error) {
console.error('[Analytics] 读取分析数据失败:', error)
}
return { lastReportDate: null }
return { ...defaultAnalyticsData }
}
// 保存分析数据
@@ -48,6 +55,13 @@ function getTodayString(): string {
return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`
}
/**
* 检查统计是否启用
*/
export function isAnalyticsEnabled(): boolean {
return loadAnalyticsData().enabled
}
/**
* 初始化分析模块
* 必须在 app.whenReady() 之前调用
@@ -67,6 +81,24 @@ export function initAnalytics(): void {
}
}
/**
* 注册 Analytics IPC 处理器
*/
export function registerAnalyticsHandlers(): void {
// 获取统计启用状态
ipcMain.handle('analytics:getEnabled', () => {
return loadAnalyticsData().enabled
})
// 设置统计启用状态
ipcMain.handle('analytics:setEnabled', (_, enabled: boolean) => {
const data = loadAnalyticsData()
data.enabled = enabled
saveAnalyticsData(data)
return { success: true }
})
}
/**
* 上报每日活跃事件
*/
@@ -78,6 +110,12 @@ export function trackDailyActive(): void {
try {
const data = loadAnalyticsData()
// 检查是否启用统计
if (!data.enabled) {
return
}
const today = getTodayString()
// 检查今天是否已经上报过
@@ -104,6 +142,11 @@ export function trackAppEvent(eventName: string, properties?: Record<string, str
return
}
// 检查是否启用统计
if (!isAnalyticsEnabled()) {
return
}
try {
trackEvent(eventName, properties)
} catch (error) {
+2
View File
@@ -12,6 +12,7 @@ import { registerMergeHandlers, initMergeModule } from './ipc/merge'
import { registerAIHandlers } from './ipc/ai'
import { registerMessagesHandlers } from './ipc/messages'
import { registerCacheHandlers } from './ipc/cache'
import { registerAnalyticsHandlers } from './analytics'
// 导入 Worker 模块(用于异步分析查询和流式导入)
import * as worker from './worker/workerManager'
@@ -42,6 +43,7 @@ const mainIpcMain = (win: BrowserWindow) => {
registerAIHandlers(context)
registerMessagesHandlers(context)
registerCacheHandlers(context)
registerAnalyticsHandlers()
console.log('[IpcMain] All IPC handlers registered successfully')
}
+6 -1
View File
@@ -89,6 +89,8 @@ interface Api {
checkUpdate: () => void
simulateUpdate: () => void
fetchRemoteConfig: (url: string) => Promise<{ success: boolean; data?: unknown; error?: string }>
getAnalyticsEnabled: () => Promise<boolean>
setAnalyticsEnabled: (enabled: boolean) => Promise<{ success: boolean }>
}
}
@@ -358,7 +360,10 @@ interface CacheApi {
getInfo: () => Promise<CacheInfo>
clear: (cacheId: string) => Promise<{ success: boolean; error?: string; message?: string }>
openDir: (cacheId: string) => Promise<{ success: boolean; error?: string }>
saveToDownloads: (filename: string, dataUrl: string) => Promise<{ success: boolean; filePath?: string; error?: string }>
saveToDownloads: (
filename: string,
dataUrl: string
) => Promise<{ success: boolean; filePath?: string; error?: string }>
}
declare global {
+12
View File
@@ -1002,6 +1002,18 @@ const extendedApi = {
fetchRemoteConfig: (url: string): Promise<{ success: boolean; data?: unknown; error?: string }> => {
return ipcRenderer.invoke('app:fetchRemoteConfig', url)
},
/**
* 获取匿名统计开关状态
*/
getAnalyticsEnabled: (): Promise<boolean> => {
return ipcRenderer.invoke('analytics:getEnabled')
},
/**
* 设置匿名统计开关状态
*/
setAnalyticsEnabled: (enabled: boolean): Promise<{ success: boolean }> => {
return ipcRenderer.invoke('analytics:setEnabled', enabled)
},
},
}