improve:用户体验分级
This commit is contained in:
@@ -2326,251 +2326,9 @@ namespace Ink_Canvas.Helpers
|
||||
return GetUsageDataProtectionSummary();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试每周重置功能
|
||||
/// </summary>
|
||||
public static string TestWeeklyReset()
|
||||
{
|
||||
var results = new StringBuilder();
|
||||
results.AppendLine("每周重置功能测试:");
|
||||
|
||||
try
|
||||
{
|
||||
lock (fileLock)
|
||||
{
|
||||
var stats = LoadUsageStats();
|
||||
if (stats == null)
|
||||
{
|
||||
results.AppendLine("无法加载使用统计数据");
|
||||
return results.ToString();
|
||||
}
|
||||
|
||||
results.AppendLine($"\n当前状态:");
|
||||
results.AppendLine($" 本周开始日期: {(stats.WeekStartDate != DateTime.MinValue ? stats.WeekStartDate.ToString("yyyy-MM-dd") : "未设置")}");
|
||||
results.AppendLine($" 本周启动次数: {stats.WeeklyLaunchCount}");
|
||||
results.AppendLine($" 本周使用时长: {stats.WeeklyUsageMinutes}分钟");
|
||||
results.AppendLine($" 上周启动次数: {stats.LastWeekLaunchCount}");
|
||||
results.AppendLine($" 上周使用时长: {stats.LastWeekUsageMinutes}分钟");
|
||||
|
||||
// 模拟跨周情况
|
||||
results.AppendLine($"\n模拟跨周测试:");
|
||||
var originalWeekStart = stats.WeekStartDate;
|
||||
var originalWeeklyLaunches = stats.WeeklyLaunchCount;
|
||||
var originalWeeklyMinutes = stats.WeeklyUsageMinutes;
|
||||
|
||||
// 手动设置为上周
|
||||
stats.WeekStartDate = DateTime.Now.AddDays(-7).Date;
|
||||
stats.WeeklyLaunchCount = 5;
|
||||
stats.WeeklyUsageMinutes = 120;
|
||||
|
||||
results.AppendLine($" 设置为上周数据 - 启动: {stats.WeeklyLaunchCount}次, 时长: {stats.WeeklyUsageMinutes}分钟");
|
||||
|
||||
// 触发重置检查
|
||||
stats.CheckAndResetWeeklyStats();
|
||||
|
||||
results.AppendLine($"\n重置后状态:");
|
||||
results.AppendLine($" 本周开始日期: {stats.WeekStartDate:yyyy-MM-dd}");
|
||||
results.AppendLine($" 本周启动次数: {stats.WeeklyLaunchCount}");
|
||||
results.AppendLine($" 本周使用时长: {stats.WeeklyUsageMinutes}分钟");
|
||||
results.AppendLine($" 上周启动次数: {stats.LastWeekLaunchCount}");
|
||||
results.AppendLine($" 上周使用时长: {stats.LastWeekUsageMinutes}分钟");
|
||||
|
||||
// 验证重置是否正确
|
||||
var currentWeekStart = stats.GetWeekStartDate(DateTime.Now);
|
||||
if (stats.WeekStartDate == currentWeekStart &&
|
||||
stats.WeeklyLaunchCount == 0 &&
|
||||
stats.WeeklyUsageMinutes == 0 &&
|
||||
stats.LastWeekLaunchCount == 5 &&
|
||||
stats.LastWeekUsageMinutes == 120)
|
||||
{
|
||||
results.AppendLine($"\n✓ 每周重置功能工作正常");
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine($"\n✗ 每周重置功能异常");
|
||||
}
|
||||
|
||||
// 恢复原始数据
|
||||
stats.WeekStartDate = originalWeekStart;
|
||||
stats.WeeklyLaunchCount = originalWeeklyLaunches;
|
||||
stats.WeeklyUsageMinutes = originalWeeklyMinutes;
|
||||
stats.UpdateDataHash();
|
||||
SaveUsageStats(stats);
|
||||
|
||||
results.AppendLine($"\n已恢复原始数据");
|
||||
|
||||
return results.ToString();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.AppendLine($"\n测试失败: {ex.Message}");
|
||||
LogHelper.WriteLogToFile($"DeviceIdentifier | 每周重置测试失败: {ex.Message}", LogHelper.LogType.Error);
|
||||
return results.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 手动触发每周重置(用于测试)
|
||||
/// </summary>
|
||||
public static string ManualWeeklyReset()
|
||||
{
|
||||
try
|
||||
{
|
||||
lock (fileLock)
|
||||
{
|
||||
var stats = LoadUsageStats();
|
||||
if (stats == null)
|
||||
{
|
||||
return "无法加载使用统计数据";
|
||||
}
|
||||
|
||||
var beforeReset = $"重置前 - 本周启动: {stats.WeeklyLaunchCount}次, 本周时长: {stats.WeeklyUsageMinutes}分钟";
|
||||
|
||||
// 强制重置
|
||||
stats.LastWeekLaunchCount = stats.WeeklyLaunchCount;
|
||||
stats.LastWeekUsageMinutes = stats.WeeklyUsageMinutes;
|
||||
stats.WeeklyLaunchCount = 0;
|
||||
stats.WeeklyUsageMinutes = 0;
|
||||
stats.WeekStartDate = stats.GetWeekStartDate(DateTime.Now);
|
||||
|
||||
stats.UpdateDataHash();
|
||||
SaveUsageStats(stats);
|
||||
|
||||
var afterReset = $"重置后 - 本周启动: {stats.WeeklyLaunchCount}次, 本周时长: {stats.WeeklyUsageMinutes}分钟, 上周启动: {stats.LastWeekLaunchCount}次, 上周时长: {stats.LastWeekUsageMinutes}分钟";
|
||||
|
||||
LogHelper.WriteLogToFile($"DeviceIdentifier | 手动每周重置完成");
|
||||
return $"每周重置完成:\n{beforeReset}\n{afterReset}";
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
var errorMsg = $"手动每周重置失败: {ex.Message}";
|
||||
LogHelper.WriteLogToFile($"DeviceIdentifier | {errorMsg}", LogHelper.LogType.Error);
|
||||
return errorMsg;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试注册表写入操作
|
||||
/// </summary>
|
||||
public static string TestRegistryOperations()
|
||||
{
|
||||
var results = new StringBuilder();
|
||||
results.AppendLine("注册表操作测试结果:");
|
||||
|
||||
try
|
||||
{
|
||||
// 测试设备ID写入
|
||||
var testDeviceId = "TEST" + DateTime.Now.ToString("yyyyMMddHHmmss");
|
||||
results.AppendLine($"测试设备ID: {testDeviceId}");
|
||||
|
||||
try
|
||||
{
|
||||
using (var key = Registry.CurrentUser.CreateSubKey(@"Software\ICC\DeviceInfo"))
|
||||
{
|
||||
if (key != null)
|
||||
{
|
||||
key.SetValue("TestDeviceId", testDeviceId);
|
||||
key.SetValue("TestTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
|
||||
results.AppendLine("✓ 主注册表位置写入成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine("✗ 主注册表位置创建失败");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.AppendLine($"✗ 主注册表位置写入失败: {ex.Message}");
|
||||
}
|
||||
|
||||
// 测试多个注册表位置写入
|
||||
var registryPaths = new[]
|
||||
{
|
||||
@"Software\Microsoft\Windows\CurrentVersion\ICC",
|
||||
@"Software\Classes\.icc\UsageData",
|
||||
@"Software\ICC\Config\Usage"
|
||||
};
|
||||
|
||||
foreach (var path in registryPaths)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var key = Registry.CurrentUser.CreateSubKey(path))
|
||||
{
|
||||
if (key != null)
|
||||
{
|
||||
key.SetValue("TestData", "TestValue");
|
||||
key.SetValue("TestTime", DateTime.Now.ToBinary());
|
||||
results.AppendLine($"✓ 注册表位置写入成功: {path}");
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine($"✗ 注册表位置创建失败: {path}");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.AppendLine($"✗ 注册表位置写入失败 ({path}): {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
// 测试读取操作
|
||||
results.AppendLine("\n注册表读取测试:");
|
||||
try
|
||||
{
|
||||
using (var key = Registry.CurrentUser.OpenSubKey(@"Software\ICC\DeviceInfo"))
|
||||
{
|
||||
if (key != null)
|
||||
{
|
||||
var readValue = key.GetValue("TestDeviceId") as string;
|
||||
if (readValue == testDeviceId)
|
||||
{
|
||||
results.AppendLine("✓ 注册表读取验证成功");
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine($"✗ 注册表读取验证失败: 期望 {testDeviceId}, 实际 {readValue}");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine("✗ 注册表读取失败: 键不存在");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.AppendLine($"✗ 注册表读取失败: {ex.Message}");
|
||||
}
|
||||
|
||||
// 测试实际数据保存
|
||||
results.AppendLine("\n实际数据保存测试:");
|
||||
var stats = LoadUsageStats();
|
||||
if (stats != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
SaveUsageStatsToRegistry(stats);
|
||||
SaveUsageStatsToMultipleRegistryLocations(stats);
|
||||
results.AppendLine("✓ 实际使用统计数据保存到注册表成功");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.AppendLine($"✗ 实际使用统计数据保存失败: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
return results.ToString();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return $"注册表操作测试失败: {ex.Message}";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 强制执行一次完整的数据保存操作(包括注册表)
|
||||
@@ -2726,179 +2484,8 @@ namespace Ink_Canvas.Helpers
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试反篡改恢复机制
|
||||
/// </summary>
|
||||
public static string TestAntiTamperingRecovery()
|
||||
{
|
||||
var results = new StringBuilder();
|
||||
results.AppendLine("反篡改恢复机制测试结果:");
|
||||
|
||||
try
|
||||
{
|
||||
lock (fileLock)
|
||||
{
|
||||
// 1. 收集所有数据源
|
||||
results.AppendLine("\n1. 收集数据源:");
|
||||
var allSources = CollectAllUsageDataSources();
|
||||
results.AppendLine($" 找到 {allSources.Count} 个数据源");
|
||||
|
||||
foreach (var source in allSources)
|
||||
{
|
||||
results.AppendLine($" - {source.Source}: 完整性={source.IsIntegrityValid}, 信任度={source.TrustScore}, 修改时间={source.LastModified:yyyy-MM-dd HH:mm:ss}");
|
||||
results.AppendLine($" 启动次数={source.Stats.LaunchCount}, 使用时长={source.Stats.TotalUsageMinutes}分钟");
|
||||
}
|
||||
|
||||
// 2. 选择最可信数据
|
||||
results.AppendLine("\n2. 选择最可信数据:");
|
||||
var bestData = SelectMostTrustedData(allSources);
|
||||
if (bestData != null)
|
||||
{
|
||||
results.AppendLine($" 选择: {bestData.Source}");
|
||||
results.AppendLine($" 完整性: {bestData.IsIntegrityValid}");
|
||||
results.AppendLine($" 信任度: {bestData.TrustScore}");
|
||||
results.AppendLine($" 数据: 启动{bestData.Stats.LaunchCount}次, 使用{bestData.Stats.TotalUsageMinutes}分钟");
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine(" 未找到可信数据");
|
||||
}
|
||||
|
||||
// 3. 测试部分恢复
|
||||
results.AppendLine("\n3. 部分数据恢复测试:");
|
||||
var partialRecovery = AttemptPartialDataRecovery(allSources);
|
||||
if (partialRecovery != null)
|
||||
{
|
||||
results.AppendLine($" 恢复成功: 启动{partialRecovery.LaunchCount}次, 使用{partialRecovery.TotalUsageMinutes}分钟");
|
||||
results.AppendLine($" 完整性验证: {partialRecovery.VerifyDataIntegrity()}");
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine(" 部分恢复失败");
|
||||
}
|
||||
|
||||
// 4. 测试实际加载
|
||||
results.AppendLine("\n4. 实际加载测试:");
|
||||
var loadedStats = LoadUsageStats();
|
||||
if (loadedStats != null)
|
||||
{
|
||||
results.AppendLine($" 加载成功: 启动{loadedStats.LaunchCount}次, 使用{loadedStats.TotalUsageMinutes}分钟");
|
||||
results.AppendLine($" 完整性验证: {loadedStats.VerifyDataIntegrity()}");
|
||||
results.AppendLine($" 使用频率: {loadedStats.UsageFrequency}");
|
||||
results.AppendLine($" 更新优先级: {loadedStats.UpdatePriority}");
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine(" 加载失败");
|
||||
}
|
||||
|
||||
return results.ToString();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.AppendLine($"\n测试失败: {ex.Message}");
|
||||
LogHelper.WriteLogToFile($"DeviceIdentifier | 反篡改恢复测试失败: {ex.Message}", LogHelper.LogType.Error);
|
||||
return results.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 模拟数据篡改并测试恢复
|
||||
/// </summary>
|
||||
public static string SimulateDataTamperingAndRecover()
|
||||
{
|
||||
var results = new StringBuilder();
|
||||
results.AppendLine("数据篡改模拟和恢复测试:");
|
||||
|
||||
try
|
||||
{
|
||||
lock (fileLock)
|
||||
{
|
||||
// 1. 保存当前正常数据
|
||||
results.AppendLine("\n1. 保存当前正常数据作为备份...");
|
||||
var originalStats = LoadUsageStats();
|
||||
if (originalStats == null)
|
||||
{
|
||||
results.AppendLine(" 无法获取原始数据,创建测试数据");
|
||||
originalStats = new UsageStats
|
||||
{
|
||||
DeviceId = DeviceId,
|
||||
LaunchCount = 50,
|
||||
TotalUsageMinutes = 1200,
|
||||
LastLaunchTime = DateTime.Now.AddDays(-1),
|
||||
UpdatePriority = UpdatePriority.Medium,
|
||||
UsageFrequency = UsageFrequency.Medium
|
||||
};
|
||||
originalStats.UpdateDataHash();
|
||||
}
|
||||
|
||||
SaveUsageStatsToAllLocations(originalStats);
|
||||
results.AppendLine($" 原始数据: 启动{originalStats.LaunchCount}次, 使用{originalStats.TotalUsageMinutes}分钟");
|
||||
|
||||
// 2. 模拟篡改主文件
|
||||
results.AppendLine("\n2. 模拟篡改主文件...");
|
||||
try
|
||||
{
|
||||
var tamperedStats = new UsageStats
|
||||
{
|
||||
DeviceId = DeviceId,
|
||||
LaunchCount = 1, // 篡改为很小的值
|
||||
TotalUsageMinutes = 5,
|
||||
LastLaunchTime = DateTime.Now,
|
||||
UpdatePriority = UpdatePriority.Low,
|
||||
UsageFrequency = UsageFrequency.Low,
|
||||
DataHash = "TAMPERED_HASH", // 错误的哈希值
|
||||
LastModified = DateTime.Now
|
||||
};
|
||||
|
||||
var tamperedJson = JsonConvert.SerializeObject(tamperedStats, Formatting.Indented);
|
||||
File.WriteAllText(UsageStatsFilePath, tamperedJson);
|
||||
results.AppendLine(" 主文件已被篡改");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.AppendLine($" 篡改主文件失败: {ex.Message}");
|
||||
}
|
||||
|
||||
// 3. 测试恢复机制
|
||||
results.AppendLine("\n3. 测试智能恢复机制...");
|
||||
var recoveredStats = LoadUsageStats();
|
||||
if (recoveredStats != null)
|
||||
{
|
||||
results.AppendLine($" 恢复成功: 启动{recoveredStats.LaunchCount}次, 使用{recoveredStats.TotalUsageMinutes}分钟");
|
||||
results.AppendLine($" 完整性验证: {recoveredStats.VerifyDataIntegrity()}");
|
||||
|
||||
// 检查是否恢复了正确的数据
|
||||
if (Math.Abs(recoveredStats.LaunchCount - originalStats.LaunchCount) <= 5 &&
|
||||
Math.Abs(recoveredStats.TotalUsageMinutes - originalStats.TotalUsageMinutes) <= 100)
|
||||
{
|
||||
results.AppendLine(" ✓ 数据恢复正确,反篡改机制工作正常");
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine(" ✗ 数据恢复不完全正确,但避免了使用篡改数据");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
results.AppendLine(" ✗ 恢复失败");
|
||||
}
|
||||
|
||||
// 4. 恢复正常状态
|
||||
results.AppendLine("\n4. 恢复正常状态...");
|
||||
SaveUsageStatsToAllLocations(originalStats);
|
||||
results.AppendLine(" 系统已恢复到正常状态");
|
||||
|
||||
return results.ToString();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
results.AppendLine($"\n模拟测试失败: {ex.Message}");
|
||||
LogHelper.WriteLogToFile($"DeviceIdentifier | 数据篡改模拟测试失败: {ex.Message}", LogHelper.LogType.Error);
|
||||
return results.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user