using Dpz.Core.Entity.Base;

namespace Dpz.Core.Public.Entity;

public class User : IBaseEntity
{
    /// <summary>
    /// 账号
    /// </summary>
    public required string Id { get; set; }

    /// <summary>
    /// 昵称
    /// </summary>
    public required string Name { get; set; }

    /// <summary>
    /// 密码
    /// </summary>
    public required string Password { get; set; }

    /// <summary>
    /// 是否启用
    /// </summary>
    public bool? Enable { get; set; }

    /// <summary>
    /// /签名
    /// </summary>
    public string? Sign { get; set; }

    /// <summary>
    /// 头像
    /// </summary>
    public required string Avatar { get; set; }

    /// <summary>
    /// 性别
    /// </summary>
    public Sex Sex { get; set; }

    /// <summary>
    /// key
    /// </summary>
    public required string Key { get; set; }

    /// <summary>
    /// 权限
    /// </summary>
    public Permissions? Permissions { 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 UserInfo GetUserInfo()
    {
        return new UserInfo
        {
            Id = Id,
            Name = Name,
            Sign = Sign,
            Sex = Sex,
            Avatar = string.IsNullOrEmpty(Avatar) ? "/images/guest.png" : Avatar,
            Permissions = Permissions,
            Enable = Enable,
            Key = Key,
        };
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个名为 User 的实体类,用于表示系统中的用户信息。下面按要点解释其功能与设计细节:

总体

  • 所属命名空间:Dpz.Core.Public.Entity,引用了 Dpz.Core.Entity.Base(该处应包含 IBaseEntity 接口定义)。
  • User 实现了 IBaseEntity(通常表示这是一个持久化实体/数据库实体)。

属性说明

  • Id (required string):账号(使用 C# 11 的 required 关键字,表示创建实例时必须赋值)。
  • Name (required string):昵称,同样必须赋值。
  • Password (required string):密码(注意:这里是字符串,实际应用中应存储哈希值而非明文)。
  • Enable (bool?):是否启用,使用可空布尔,未设置时为 null。
  • Sign (string?):签名,可空。
  • Avatar (required string):头像 URL 或路径,必须赋值。
  • Sex (Sex):性别,类型为自定义枚举 Sex。
  • Key (required string):key(可能为 API key、识别码等),必须赋值。
  • Permissions (Permissions?):权限,类型为自定义 Permissions(可能是枚举或位标志),可空。
  • CreateTime (DateTime?) / LastUpdateTime (DateTime?):创建时间与最后修改时间,均为可空 DateTime,并带有 [BsonDateTimeOptions(Kind = DateTimeKind.Local)] 特性。

关于 [BsonDateTimeOptions]

  • 该特性来自 MongoDB 驱动(MongoDB.Bson.Serialization.Attributes),用于控制 DateTime 在序列化到/从 MongoDB 时的 Kind(这里指定为本地时间 Local)。

方法

  • GetUserInfo():构造并返回一个 UserInfo 对象(用于外部展示/传输的 DTO),从 User 中拷贝部分字段:
    • 包含 Id、Name、Sign、Sex、Permissions、Enable、Key。
    • 对 Avatar 做了默认处理:如果 Avatar 为空或空字符串,则使用 "/images/guest.png" 作为默认头像。
    • 注意:返回的 UserInfo 未包含 Password(这是正确的做法,避免泄露敏感信息)。

设计与安全建议

  • required 关键字保证关键字段在创建时被赋值,结合可空引用类型可以提高初始化正确性。
  • Password 字段应保存密码哈希与盐,而不是明文;且在序列化或返回给客户端时不要包含密码。
  • Permissions 字段应明确其类型(若为位标志,便于权限组合)。
  • BsonDateTimeOptions 指定为 Local,存储/读取时要注意跨时区问题,通常也可以考虑使用 UTC 以避免时区偏差。

示例(用法概念)

  • 创建用户: var user = new User { Id = "u1", Name = "张三", Password = "hashedPwd", Avatar = "/avatars/zs.png", Key = "abc", Sex = Sex.Male };
  • 获取对外信息: var info = user.GetUserInfo();

总结

  • 该类是一个典型的用户实体,包含用户基本信息、权限、时间戳等,带有 MongoDB 序列化的时间选项,并提供了一个用于返回非敏感用户信息的转换方法 GetUserInfo。
评论加载中...