123 lines
5.0 KiB
C#
123 lines
5.0 KiB
C#
using Store.Users.Contracts.Enums;
|
|
using System.ComponentModel.DataAnnotations;
|
|
namespace Store.Users.Contracts.Dtos;
|
|
|
|
/// <summary>账户资料;null 保留原值,空字符串清空文本。输入约束由 DTO 声明,权限与账户关系由服务检查。</summary>
|
|
public class UserEditRequest
|
|
{
|
|
[StringLength(50)]
|
|
public string? NickName { get; set; }
|
|
[StringLength(30)]
|
|
public string? Mobile { get; set; }
|
|
[StringLength(100)]
|
|
public string? CompanyName { get; set; }
|
|
[StringLength(255)]
|
|
public string? Notes { get; set; }
|
|
[StringLength(50)]
|
|
public string? CardId { get; set; }
|
|
[EnumDataType(typeof(UserGroup), ErrorMessage = "请选择有效的用户分组")]
|
|
public UserGroup? GroupId { get; set; }
|
|
/// <summary>仅管理员可设置;普通账号不能通过资料修改提升管理员级别。</summary>
|
|
[EnumDataType(typeof(UserAdminLevel), ErrorMessage = "管理员级别只能为普通用户或超级管理员")]
|
|
public UserAdminLevel? SaLevel { get; set; }
|
|
[StringLength(1000)]
|
|
public string? Authority { get; set; }
|
|
[StringLength(1000)]
|
|
public string? ForbiddenPage { get; set; }
|
|
[StringLength(50)]
|
|
public string? OemId { get; set; }
|
|
[Range(30, int.MaxValue, ErrorMessage = "每月续费积分不能低于30")]
|
|
public int? ShopPointsPerMonth { get; set; }
|
|
[Range(typeof(decimal), "2.2", "999999")]
|
|
public decimal? PostagePerOrder { get; set; }
|
|
[Range(typeof(decimal), "2.5", "999999")]
|
|
public decimal? RefundPostagePerOrder { get; set; }
|
|
[Range(typeof(decimal), "0", "999999")]
|
|
public decimal? GiftOemAmountPerOrder { get; set; }
|
|
[Range(typeof(decimal), "0", "999999")]
|
|
public decimal? SyncLogisticsPerOrder { get; set; }
|
|
|
|
}
|
|
|
|
/// <summary>修改账户资料;账户 ID 与资料字段统一通过 JSON 请求体提交。</summary>
|
|
public sealed class UserUpdateRequest : UserEditRequest
|
|
{
|
|
[Range(1, int.MaxValue, ErrorMessage = "ID必须大于0")]
|
|
public int Id { get; set; }
|
|
}
|
|
|
|
/// <summary>创建主账号或当前主账号的直属子账号。</summary>
|
|
public sealed class UserCreateRequest : UserEditRequest
|
|
{
|
|
/// <summary>创建子账号时的父账号;管理员可指定任意主账号,普通主账号只能指定自己。</summary>
|
|
[StringLength(20)]
|
|
public string? ParentUserName { get; set; }
|
|
[Required(ErrorMessage = "用户名不能为空"), StringLength(20)] public string UserName { get; set; } = "";
|
|
[Required(ErrorMessage = "密码不能为空"), StringLength(128, MinimumLength = 6)] public string Password { get; set; } = "";
|
|
}
|
|
|
|
/// <summary>非管理员本人改密需原密码;管理员可重置任意账户,主账号可重置直属子账号密码。</summary>
|
|
public sealed class ChangePasswordRequest
|
|
{
|
|
[StringLength(20)]
|
|
public string? UserName { get; set; }
|
|
[StringLength(128)]
|
|
public string? OldPassword { get; set; }
|
|
[Required(ErrorMessage = "新密码不能为空"), StringLength(128, MinimumLength = 6)] public string NewPassword { get; set; } = "";
|
|
}
|
|
|
|
/// <summary>本人修改密码时验证原密码非空。</summary>
|
|
public sealed class UserPasswordProofRequest
|
|
{
|
|
[Required(ErrorMessage = "原密码不能为空")] public string OldPassword { get; set; } = "";
|
|
}
|
|
|
|
/// <summary>分页参数;在查询数据库前完成范围校验。</summary>
|
|
public class UserSearchRequest
|
|
{
|
|
[Range(1, 1000000)]
|
|
public int Page { get; set; } = 1;
|
|
[Range(1, 200)]
|
|
public int PageSize { get; set; } = 50;
|
|
[StringLength(100)]
|
|
public string? Keyword { get; set; }
|
|
[EnumDataType(typeof(UserGroup), ErrorMessage = "请选择有效的用户分组")]
|
|
public UserGroup? GroupId { get; set; }
|
|
/// <summary>查询子账号时可按父账号筛选;管理员可指定任意账号,普通主账号只能指定自己。</summary>
|
|
[StringLength(20)]
|
|
public string? ParentUserName { get; set; }
|
|
|
|
}
|
|
|
|
public sealed record UserPage<T>(long Total, IReadOnlyList<T> Items);
|
|
|
|
/// <summary>流水查询支持时间范围、操作类型、店铺及订单过滤。</summary>
|
|
public sealed class UserRecordSearchRequest : UserSearchRequest, IValidatableObject
|
|
{
|
|
/// <summary>目标账户;省略时查询本人。</summary>
|
|
[StringLength(20)]
|
|
public string? UserName { get; set; }
|
|
public DateTime? StartTime { get; set; }
|
|
public DateTime? EndTime { get; set; }
|
|
[StringLength(20)]
|
|
public string? Operation { get; set; }
|
|
[StringLength(50)]
|
|
public string? ShopId { get; set; }
|
|
public int? PaymentType { get; set; }
|
|
[StringLength(100)]
|
|
public string? OrderId { get; set; }
|
|
|
|
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
|
{
|
|
if (StartTime > EndTime)
|
|
yield return new ValidationResult("开始时间不能晚于结束时间", [nameof(StartTime), nameof(EndTime)]);
|
|
}
|
|
}
|
|
|
|
/// <summary>单个账户 ID 参数的校验,供服务内部调用复用。</summary>
|
|
public sealed class UserIdRequest
|
|
{
|
|
[Range(1, int.MaxValue, ErrorMessage = "ID必须大于0")]
|
|
public int Id { get; set; }
|
|
}
|