using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
///
/// 用户操作日志服务
/// 负责记录、存储和管理用户的各种操作日志
///
public class UserLogService : IService
{
private readonly string _logFilePath;
private UserLogDatabase _logDatabase;
private const string LOG_FILE_NAME = "user_logs.json";
private const int MAX_LOG_ENTRIES = 10000; // 最大日志条数
public UserLogService()
{
// 使用 persistentDataPath 确保跨平台兼容性
_logFilePath = Path.Combine(Application.persistentDataPath, LOG_FILE_NAME);
LoadLogDatabase();
Debug.Log($"用户日志存储路径: {_logFilePath}");
}
///
/// 记录用户操作日志
///
/// 用户名
/// 操作类型
/// 操作详情
/// 操作是否成功
public void LogUserOperation(string username, string operation, string details = null, bool successful = true)
{
var logEvent = new UserLogEvent(username, operation, details, successful)
{
Id = GetNextId()
};
_logDatabase.UserLogs.Add(logEvent);
// 如果日志条数超过限制,删除最旧的日志
if (_logDatabase.UserLogs.Count > MAX_LOG_ENTRIES)
{
int removeCount = _logDatabase.UserLogs.Count - MAX_LOG_ENTRIES;
_logDatabase.UserLogs.RemoveRange(0, removeCount);
}
SaveLogDatabase();
Debug.Log($"记录用户操作: {username} - {operation} - {(successful ? "成功" : "失败")}");
}
///
/// 记录系统日志(保持向后兼容)
///
/// 账户
/// 操作内容
public void LogSystemOperation(string account, string operationContent)
{
var logEvent = new UseLogEvent(account, operationContent)
{
Id = GetNextId()
};
_logDatabase.SystemLogs.Add(logEvent);
// 如果日志条数超过限制,删除最旧的日志
if (_logDatabase.SystemLogs.Count > MAX_LOG_ENTRIES)
{
int removeCount = _logDatabase.SystemLogs.Count - MAX_LOG_ENTRIES;
_logDatabase.SystemLogs.RemoveRange(0, removeCount);
}
SaveLogDatabase();
Debug.Log($"记录系统操作: {account} - {operationContent}");
}
///
/// 获取所有用户日志
///
/// 用户日志列表
public List GetAllUserLogs()
{
return new List(_logDatabase.UserLogs);
}
///
/// 获取所有系统日志(保持向后兼容)
///
/// 系统日志列表
public List GetAllSystemLogs()
{
return new List(_logDatabase.SystemLogs);
}
///
/// 获取指定用户的日志
///
/// 用户名
/// 用户的日志列表
public List GetUserLogs(string username)
{
return _logDatabase.UserLogs.FindAll(log =>
log.Username.Equals(username, StringComparison.OrdinalIgnoreCase));
}
///
/// 获取指定时间范围内的日志
///
/// 开始时间
/// 结束时间
/// 时间范围内的日志列表
public List GetLogsByTimeRange(DateTime startTime, DateTime endTime)
{
return _logDatabase.UserLogs.FindAll(log =>
log.Timestamp >= startTime && log.Timestamp <= endTime);
}
///
/// 获取指定操作类型的日志
///
/// 操作类型
/// 操作类型的日志列表
public List GetLogsByOperation(string operation)
{
return _logDatabase.UserLogs.FindAll(log =>
log.Operation.Equals(operation, StringComparison.OrdinalIgnoreCase));
}
///
/// 清空所有日志
///
public void ClearAllLogs()
{
_logDatabase.UserLogs.Clear();
_logDatabase.SystemLogs.Clear();
_logDatabase.NextId = 1;
SaveLogDatabase();
Debug.Log("已清空所有日志记录");
}
///
/// 清空用户日志
///
public void ClearUserLogs()
{
_logDatabase.UserLogs.Clear();
SaveLogDatabase();
Debug.Log("已清空用户日志记录");
}
///
/// 清空系统日志
///
public void ClearSystemLogs()
{
_logDatabase.SystemLogs.Clear();
SaveLogDatabase();
Debug.Log("已清空系统日志记录");
}
///
/// 获取日志统计信息
///
/// 日志统计信息
public LogStatistics GetLogStatistics()
{
var stats = new LogStatistics
{
TotalUserLogs = _logDatabase.UserLogs.Count,
TotalSystemLogs = _logDatabase.SystemLogs.Count,
SuccessfulOperations = _logDatabase.UserLogs.FindAll(log => log.IsSuccessful).Count,
FailedOperations = _logDatabase.UserLogs.FindAll(log => !log.IsSuccessful).Count
};
if (_logDatabase.UserLogs.Count > 0)
{
stats.FirstLogTime = _logDatabase.UserLogs[0].Timestamp;
stats.LastLogTime = _logDatabase.UserLogs[_logDatabase.UserLogs.Count - 1].Timestamp;
}
return stats;
}
private int GetNextId()
{
return _logDatabase.NextId++;
}
private void LoadLogDatabase()
{
try
{
if (File.Exists(_logFilePath))
{
string json = File.ReadAllText(_logFilePath);
_logDatabase = JsonUtility.FromJson(json);
if (_logDatabase == null)
{
Debug.LogWarning("日志数据库格式错误,创建新的数据库");
CreateDefaultLogDatabase();
}
else
{
Debug.Log($"成功加载日志数据库,共 {_logDatabase.UserLogs.Count} 条用户日志,{_logDatabase.SystemLogs.Count} 条系统日志");
}
}
else
{
CreateDefaultLogDatabase();
}
}
catch (Exception ex)
{
Debug.LogError($"加载日志数据库失败: {ex.Message}");
CreateDefaultLogDatabase();
}
if (_logDatabase == null)
{
CreateDefaultLogDatabase();
}
}
private void SaveLogDatabase()
{
try
{
string directory = Path.GetDirectoryName(_logFilePath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string json = JsonUtility.ToJson(_logDatabase, true);
File.WriteAllText(_logFilePath, json);
}
catch (Exception ex)
{
Debug.LogError($"保存日志数据库失败: {ex.Message}");
}
}
private void CreateDefaultLogDatabase()
{
_logDatabase = new UserLogDatabase
{
Version = "1.0",
NextId = 1,
UserLogs = new List(),
SystemLogs = new List()
};
// 添加初始化日志
LogUserOperation("system", "系统初始化", "创建日志数据库", true);
SaveLogDatabase();
Debug.Log("创建默认日志数据库");
}
///
/// 获取日志文件路径(用于调试)
///
/// 日志文件路径
public string GetLogFilePath()
{
return _logFilePath;
}
}
///
/// 用户日志数据库结构
///
[System.Serializable]
public class UserLogDatabase
{
public string Version = "1.0";
public int NextId = 1;
public List UserLogs = new List();
public List SystemLogs = new List();
}
///
/// 日志统计信息
///
[System.Serializable]
public class LogStatistics
{
public int TotalUserLogs;
public int TotalSystemLogs;
public int SuccessfulOperations;
public int FailedOperations;
public DateTime FirstLogTime;
public DateTime LastLogTime;
}