using Dpz.Core.Entity.Base;
using Dpz.Core.Entity.Base.Indexes;

namespace Dpz.Core.Public.Entity;

/// <summary>
/// 账号登录记录
/// </summary>
public class AccountLoginHistory : BaseEntity, IIndexedEntity<AccountLoginHistory>
{
    /// <summary>
    /// 账号
    /// </summary>
    public required string Account { get; set; }

    /// <summary>
    /// IP地址
    /// </summary>
    public string? IpAddress { get; set; }

    /// <summary>
    /// User-Agent
    /// </summary>
    public string? UserAgent { get; set; }

    /// <summary>
    /// SessionId
    /// </summary>
    public string? SessionId { get; set; }

    /// <summary>
    /// 登录方式
    /// </summary>
    [BsonRepresentation(BsonType.String)]
    public LoginMethod Method { get; set; }

    /// <summary>
    /// 登录状态
    /// </summary>
    [BsonRepresentation(BsonType.String)]
    public LoginResultStatus Status { get; set; }

    /// <summary>
    /// 创建时间
    /// </summary>
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime CreateTime { get; set; }

    /// <summary>
    /// 最后更新时间
    /// </summary>
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime LastUpdateTime { get; set; }

    public static IReadOnlyList<EntityIndexDefinition> GetIndexDefinitions()
    {
        return new[]
        {
            new EntityIndexDefinition
            {
                Fields = [EntityIndexField.Ascending<AccountLoginHistory>(x => x.Account)],
            },
        };
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个用于记录用户账号登录历史的实体类,主要用于安全审计和用户行为分析。让我详细解释一下这个代码:

类定义和继承关系

public class AccountLoginHistory : BaseEntity, IIndexedEntity<AccountLoginHistory>
  • 继承自 BaseEntity:获得基础实体的通用功能(如ID、基础操作等)
  • 实现 IIndexedEntity<AccountLoginHistory>:支持数据库索引定义,用于优化查询性能

属性字段

核心登录信息

  • Account:登录账号(必填字段,使用 required 关键字)
  • Method:登录方式(枚举类型,如密码登录、短信验证码等)
  • Status:登录结果状态(枚举类型,如成功、失败、被锁定等)

环境信息

  • IpAddress:客户端IP地址,用于地理位置分析和安全检测
  • UserAgent:浏览器/客户端信息,用于设备识别
  • SessionId:会话标识符,用于会话管理

时间戳

  • CreateTime:记录创建时间
  • LastUpdateTime:最后更新时间

MongoDB 特定配置

[BsonRepresentation(BsonType.String)]
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
  • BsonRepresentation(BsonType.String):将枚举类型以字符串形式存储在MongoDB中,提高可读性
  • BsonDateTimeOptions(Kind = DateTimeKind.Local):指定日期时间以本地时区格式存储

数据库索引优化

public static IReadOnlyList<EntityIndexDefinition> GetIndexDefinitions()
{
    return new[]
    {
        new EntityIndexDefinition
        {
            Fields = [EntityIndexField.Ascending<AccountLoginHistory>(x => x.Account)],
        },
    };
}

Account 字段上创建升序索引,这样做的好处:

  • 快速查询:根据账号查询登录历史时性能更优
  • 安全分析:快速统计某个账号的登录频次、异常登录等

使用场景

这个实体类通常用于:

  1. 安全审计:记录所有登录尝试,便于安全分析
  2. 异常检测:识别异常登录行为(如异地登录、频繁失败尝试)
  3. 用户行为分析:了解用户登录习惯和设备使用情况
  4. 合规要求:满足某些行业的审计日志要求

这是一个设计良好的审计实体类,既考虑了功能需求,也兼顾了性能优化。

评论加载中...