refactor: 重构项目基础架构与实体体系

- 替换原有自定义生命周期接口为通用基础服务体系
- 将所有实体基类替换为带雪花ID的SqlSugarBaseEntity
- 迁移DTO到Models项目并统一管理
- 移除冗余的Repository层实现,改用通用基础服务
- 添加Yitter.IdGenerator雪花ID生成支持
- 重构SqlSugar数据库上下文与依赖注入配置
- 新增微信用户、用户勋章、背包等实体与配套服务
- 整理分页查询与结果封装类
- 优化WebApi控制器结构
This commit is contained in:
glz
2026-06-02 14:10:43 +08:00
parent 831f8ba7f5
commit 8ed012bba8
51 changed files with 1762 additions and 1141 deletions

View File

@ -0,0 +1,96 @@
using QYZH.InteractiveMagazine.Models.Dto;
namespace QYZH.InteractiveMagazine.Models.Dto;
/// <summary>
/// 管理员创建/更新输入
/// </summary>
public class AdminUserInput
{
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; } = string.Empty;
/// <summary>
/// 密码(创建时必填,更新时为空表示不修改密码)
/// </summary>
public string? Password { get; set; }
/// <summary>
/// 管理员类型: SuperAdmin, Editor
/// </summary>
public string Type { get; set; } = "Editor";
/// <summary>
/// 状态: Active, Inactive
/// </summary>
public string Status { get; set; } = "Active";
}
/// <summary>
/// 管理员输出
/// </summary>
public class AdminUserOutput
{
/// <summary>
/// 主键ID
/// </summary>
public long Id { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; } = string.Empty;
/// <summary>
/// 管理员类型
/// </summary>
public string Type { get; set; } = string.Empty;
/// <summary>
/// 状态
/// </summary>
public string Status { get; set; } = string.Empty;
/// <summary>
/// 创建人
/// </summary>
public string? CreatedBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreatedAt { get; set; }
/// <summary>
/// 更新人
/// </summary>
public string? UpdatedBy { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime? UpdatedAt { get; set; }
}
/// <summary>
/// 管理员分页查询输入
/// </summary>
public class AdminUserQueryInput : PageQueryModel
{
/// <summary>
/// 用户名(模糊查询)
/// </summary>
public string? UserName { get; set; }
/// <summary>
/// 管理员类型
/// </summary>
public string? Type { get; set; }
/// <summary>
/// 状态
/// </summary>
public string? Status { get; set; }
}

View File

@ -0,0 +1,40 @@
namespace QYZH.InteractiveMagazine.Models.Dto;
/// <summary>
/// 管理员登录输入
/// </summary>
public class AdminLoginInput
{
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; } = string.Empty;
/// <summary>
/// 密码
/// </summary>
public string Password { get; set; } = string.Empty;
}
public class AdminLoginOutput
{
public string Token { get; set; } = string.Empty;
public long UserId { get; set; }
public string UserName { get; set; } = string.Empty;
public string Type { get; set; } = string.Empty;
}
public class AdminUserInfoOutput
{
public long UserId { get; set; }
public string UserName { get; set; } = string.Empty;
public string Type { get; set; } = string.Empty;
public string Status { get; set; } = string.Empty;
}

View File

@ -1,33 +1,73 @@
namespace QYZH.InteractiveMagazine.Models.Dto;
/// <summary>
/// 分页输出
/// 通用分页信息类
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
public class PageListModel<T>
{
/// <summary>
/// 页码
/// 每页行数
/// </summary>
public int PageIndex { get; set; }
public int PageSize { get; set; } = 10;
/// <summary>
/// 每页条数
/// 当前页
/// </summary>
public int PageSize { get; set; }
public int PageIndex { get; set; } = 1;
/// <summary>
/// 总记录数
/// </summary>
public long TotalCount { get; set; }
public int TotalNum { get; set; }
/// <summary>
/// 总页数
/// </summary>
public int TotalPages => PageSize > 0 ? (int)Math.Ceiling((double)TotalCount / PageSize) : 0;
public int TotalPage
{
get
{
if (TotalNum > 0)
return TotalNum % PageSize == 0 ? TotalNum / PageSize : TotalNum / PageSize + 1;
else
return 0;
}
}
public List<T> Result { get; set; }
/// <summary>
/// 数据列表
/// 额外数据
/// </summary>
public List<T>? List { get; set; }
public Dictionary<string, object> Extra { get; set; } = new Dictionary<string, object>();
/// <summary>
/// 是否有上一页
/// </summary>
public bool HasPrev
{
get
{
return PageIndex > 1;
}
}
/// <summary>
/// 下一页是否可用
/// </summary>
public bool HasNext
{
get
{
return TotalPage > PageIndex;
}
}
public PageListModel()
{
}
public PageListModel(List<T> result, int pageIndex, int pageSize, int totalNum)
{
PageIndex = pageIndex;
PageSize = pageSize;
TotalNum = totalNum;
Result = result;
}
}

View File

@ -1,27 +1,57 @@
namespace QYZH.InteractiveMagazine.Models.Dto;
/// <summary>
/// 分页查询输入
/// 通用分页查询
/// </summary>
public class PageQueryModel
{
/// <summary>
/// 页码默认1
///当前页
/// </summary>
public int PageIndex { get; set; } = 1;
/// <summary>
/// 每页条数默认10
///每页条数
/// </summary>
public int PageSize { get; set; } = 10;
/// <summary>
/// 排序字段
/// </summary>
public string? SortField { get; set; }
public string Sort { get; set; } = string.Empty;
/// <summary>
/// 排序类型,前端传入的是"ascending""descending"
/// </summary>
public string SortType { get; set; } = string.Empty;
/// <summary>
/// 排序方式asc/desc
/// 关键字
/// </summary>
public string? SortOrder { get; set; }
public string? KeyWord { get; set; }
}
/// <summary>
/// 分页查询泛型类
/// </summary>
/// <typeparam name="T">查询参数类型</typeparam>
public class PageQueryModel<T> : PageQueryModel where T : class, new()
{
/// <summary>
/// 查询参数
/// </summary>
public T Params { get; set; } = new T();
public TP ConvertTo<TP>() where TP : class
{
if (Params != null)
{
return Params as TP;
}
return default;
}
public int Start => (PageIndex - 1) * PageSize + 1;
public int End => PageIndex * PageSize;
}

View File

@ -0,0 +1,198 @@
using QYZH.InteractiveMagazine.Models.Dto;
namespace QYZH.InteractiveMagazine.IService.Dto;
/// <summary>
/// 微信登录输出
/// </summary>
public class WeChatLoginOutput
{
/// <summary>
/// 访问令牌
/// </summary>
public string Token { get; set; } = string.Empty;
/// <summary>
/// 用户ID
/// </summary>
public long UserId { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; } = string.Empty;
/// <summary>
/// 微信OpenId
/// </summary>
public string OpenId { get; set; } = string.Empty;
}
/// <summary>
/// 微信用户创建/更新输入
/// </summary>
public class WxUserInput
{
/// <summary>
/// 微信OpenId
/// </summary>
public string OpenId { get; set; } = string.Empty;
/// <summary>
/// 微信UnionId
/// </summary>
public string? UnionId { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string? NickName { get; set; }
/// <summary>
/// 头像地址
/// </summary>
public string? AvatarUrl { get; set; }
/// <summary>
/// 手机号
/// </summary>
public string? Phone { get; set; }
/// <summary>
/// 积分余额
/// </summary>
public int Points { get; set; } = 0;
/// <summary>
/// 用户类型: Normal, VIP
/// </summary>
public string Type { get; set; } = "Normal";
/// <summary>
/// 状态: Active, Disabled
/// </summary>
public string Status { get; set; } = "Active";
/// <summary>
/// 密码默认手机后4位
/// </summary>
public string? Pwd { get; set; }
/// <summary>
/// 当前成长值
/// </summary>
public int GrowthPoints { get; set; } = 0;
}
/// <summary>
/// 微信用户输出
/// </summary>
public class WxUserOutput
{
/// <summary>
/// 主键ID
/// </summary>
public long Id { get; set; }
/// <summary>
/// 微信OpenId
/// </summary>
public string OpenId { get; set; } = string.Empty;
/// <summary>
/// 微信UnionId
/// </summary>
public string? UnionId { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string? NickName { get; set; }
/// <summary>
/// 头像地址
/// </summary>
public string? AvatarUrl { get; set; }
/// <summary>
/// 手机号
/// </summary>
public string? Phone { get; set; }
/// <summary>
/// 积分余额
/// </summary>
public int Points { get; set; }
/// <summary>
/// 用户类型
/// </summary>
public string Type { get; set; } = string.Empty;
/// <summary>
/// 状态
/// </summary>
public string Status { get; set; } = string.Empty;
/// <summary>
/// 当前成长值
/// </summary>
public int GrowthPoints { get; set; }
/// <summary>
/// 创建人
/// </summary>
public string? CreatedBy { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreatedAt { get; set; }
/// <summary>
/// 更新人
/// </summary>
public string? UpdatedBy { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime? UpdatedAt { get; set; }
}
/// <summary>
/// 微信用户分页查询输入
/// </summary>
public class WxUserQueryInput : PageQueryModel
{
/// <summary>
/// 昵称(模糊查询)
/// </summary>
public string? NickName { get; set; }
/// <summary>
/// 手机号(模糊查询)
/// </summary>
public string? Phone { get; set; }
/// <summary>
/// 用户类型
/// </summary>
public string? Type { get; set; }
/// <summary>
/// 状态
/// </summary>
public string? Status { get; set; }
}
/// <summary>
/// 微信手机号获取输出
/// </summary>
public class WeChatPhoneNumberOutput
{
/// <summary>
/// 手机号
/// </summary>
public string PhoneNumber { get; set; } = string.Empty;
}