feat: 初始化后台管理模块与基础业务框架

1.  新增依赖注入生命周期标记接口、基础仓储与管理员仓储实现
2.  新增管理员认证与用户服务接口,补充认证相关DTO
3.  重构实体审计字段命名,统一Created/UpdatedAt规范
4.  新增大量业务实体类与API版本枚举配置
5.  集成Autofac依赖注入、JWT自动刷新与跨域配置
6.  替换原有微信小程序与旧认证服务为后台管理系统架构
7.  完善Swagger文档配置与项目基础部署配置
This commit is contained in:
glz
2026-06-01 17:59:23 +08:00
parent ab53492cc4
commit 831f8ba7f5
51 changed files with 2417 additions and 596 deletions

View File

@ -0,0 +1,51 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///后台管理员表
///</summary>
[SugarTable("AdminUser")]
public partial class AdminUser : BaseEntity
{
public AdminUser(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public new int Id { get; set; }
/// <summary>
/// Desc:用户名
/// Default:
/// Nullable:False
/// </summary>
public string UserName {get;set;}
/// <summary>
/// Desc:密码哈希
/// Default:
/// Nullable:False
/// </summary>
public string PasswordHash {get;set;}
/// <summary>
/// Desc:管理员类型: SuperAdmin, Editor
/// Default:Editor
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Active, Inactive
/// Default:Active
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -23,21 +23,21 @@ public abstract class BaseEntity
/// 创建人
/// </summary>
[SugarColumn(Length = 50)]
public string? CreatedBy { get; set; }
public string? CreatedBy { get; set; } = "System";
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreatedTime { get; set; } = DateTime.Now;
public DateTime CreatedAt { get; set; } = DateTime.Now;
/// <summary>
/// 更新人
/// </summary>
[SugarColumn(Length = 50)]
public string? UpdatedBy { get; set; }
public string? UpdatedBy { get; set; } = "System";
/// <summary>
/// 更新时间
/// </summary>
public DateTime UpdatedTime { get; set; } = DateTime.Now;
public DateTime? UpdatedAt { get; set; } = DateTime.Now;
}

View File

@ -0,0 +1,58 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///签到配置表
///</summary>
[SugarTable("CheckInConfig")]
public partial class CheckInConfig : BaseEntity
{
public CheckInConfig(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public new int Id {get;set;}
/// <summary>
/// Desc:连续签到天数
/// Default:
/// Nullable:False
/// </summary>
public int DayNumber {get;set;}
/// <summary>
/// Desc:奖励积分数
/// Default:
/// Nullable:False
/// </summary>
public int RewardPoints {get;set;}
/// <summary>
/// Desc:额外奖励积分
/// Default:0
/// Nullable:False
/// </summary>
public int BonusPoints {get;set;}
/// <summary>
/// Desc:配置类型: Daily, Streak
/// Default:Daily
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Active, Inactive
/// Default:Active
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,57 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///签到记录表
///</summary>
[SugarTable("CheckInRecord")]
public partial class CheckInRecord : BaseEntity
{
public CheckInRecord(){
}
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId {get;set;}
/// <summary>
/// Desc:签到日期
/// Default:
/// Nullable:False
/// </summary>
public DateTime CheckInDate {get;set;}
/// <summary>
/// Desc:本次签到获得积分
/// Default:
/// Nullable:False
/// </summary>
public int PointsAwarded {get;set;}
/// <summary>
/// Desc:连续签到天数
/// Default:
/// Nullable:False
/// </summary>
public int ConsecutiveDays {get;set;}
/// <summary>
/// Desc:签到类型: Normal, MakeUp
/// Default:Normal
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Success
/// Default:Success
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,64 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///社区预置消息表
///</summary>
[SugarTable("CommunityMessage")]
public partial class CommunityMessage : BaseEntity
{
public CommunityMessage(){
}
/// <summary>
/// Desc:期刊Id
/// Default:
/// Nullable:False
/// </summary>
public long JournalId {get;set;}
/// <summary>
/// Desc:消息内容
/// Default:
/// Nullable:False
/// </summary>
public string Content {get;set;}
/// <summary>
/// Desc:配图
/// Default:
/// Nullable:True
/// </summary>
public string ImageUrl {get;set;}
/// <summary>
/// Desc:排序
/// Default:0
/// Nullable:False
/// </summary>
public int SortOrder {get;set;}
/// <summary>
/// Desc:是否启用
/// Default:b'1'
/// Nullable:False
/// </summary>
public bool IsActive {get;set;}
/// <summary>
/// Desc:消息类型: Article, Quote, Announcement
/// Default:Article
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Draft, Published
/// Default:Draft
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,92 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///期刊表
///</summary>
[SugarTable("Journal")]
public partial class Journal : BaseEntity
{
public Journal(){
}
/// <summary>
/// Desc:期刊号
/// Default:
/// Nullable:False
/// </summary>
public int IssueNumber {get;set;}
/// <summary>
/// Desc:期刊标题
/// Default:
/// Nullable:False
/// </summary>
public string Title {get;set;}
/// <summary>
/// Desc:封面图地址
/// Default:
/// Nullable:True
/// </summary>
public string CoverImageUrl {get;set;}
/// <summary>
/// Desc:摘要
/// Default:
/// Nullable:True
/// </summary>
public string Summary {get;set;}
/// <summary>
/// Desc:发布时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? PublishDate {get;set;}
/// <summary>
/// Desc:是否启用
/// Default:b'1'
/// Nullable:False
/// </summary>
public bool IsActive {get;set;}
/// <summary>
/// Desc:排序权重
/// Default:0
/// Nullable:False
/// </summary>
public int SortOrder {get;set;}
/// <summary>
/// Desc:编者寄语
/// Default:
/// Nullable:True
/// </summary>
public string EditorNote {get;set;}
/// <summary>
/// Desc:主题色
/// Default:
/// Nullable:True
/// </summary>
public string ThemeColor {get;set;}
/// <summary>
/// Desc:期刊类型: Normal, Special
/// Default:Normal
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Draft, Published, Archived
/// Default:Draft
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,79 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///勋章定义表
///</summary>
[SugarTable("Medal")]
public partial class Medal : BaseEntity
{
public Medal(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public new int Id {get;set;}
/// <summary>
/// Desc:勋章名称
/// Default:
/// Nullable:False
/// </summary>
public string Name {get;set;}
/// <summary>
/// Desc:获得条件描述
/// Default:
/// Nullable:True
/// </summary>
public string Description {get;set;}
/// <summary>
/// Desc:图片地址
/// Default:
/// Nullable:True
/// </summary>
public string ImageUrl {get;set;}
/// <summary>
/// Desc:条件类型: EvolutionCount, FeedingCount等
/// Default:
/// Nullable:False
/// </summary>
public string ConditionType {get;set;}
/// <summary>
/// Desc:条件阈值
/// Default:
/// Nullable:False
/// </summary>
public int ConditionValue {get;set;}
/// <summary>
/// Desc:排序
/// Default:0
/// Nullable:False
/// </summary>
public int SortOrder {get;set;}
/// <summary>
/// Desc:勋章的类型: Pet, Community
/// Default:Pet
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Active, Inactive
/// Default:Active
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,50 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///模板评论表
///</summary>
[SugarTable("MessageComment")]
public partial class MessageComment : BaseEntity
{
public MessageComment(){
}
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId {get;set;}
/// <summary>
/// Desc:消息Id
/// Default:
/// Nullable:False
/// </summary>
public long MessageId {get;set;}
/// <summary>
/// Desc:模板Id
/// Default:
/// Nullable:False
/// </summary>
public int TemplateId {get;set;}
/// <summary>
/// Desc:评论类型
/// Default:TemplateComment
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Published, Hidden
/// Default:Published
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,43 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///点赞记录表
///</summary>
[SugarTable("MessageLike")]
public partial class MessageLike : BaseEntity
{
public MessageLike(){
}
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId {get;set;}
/// <summary>
/// Desc:消息Id
/// Default:
/// Nullable:False
/// </summary>
public long MessageId {get;set;}
/// <summary>
/// Desc:点赞类型
/// Default:Like
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Liked, Cancelled
/// Default:Liked
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,64 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///宠物实例表
///</summary>
[SugarTable("Pet")]
public partial class Pet : BaseEntity
{
public Pet(){
}
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId {get;set;}
/// <summary>
/// Desc:宠物昵称
/// Default:
/// Nullable:True
/// </summary>
public string Name {get;set;}
/// <summary>
/// Desc:当前进化形态Id
/// Default:
/// Nullable:False
/// </summary>
public int CurrentEvolutionId {get;set;}
/// <summary>
/// Desc:当前成长值
/// Default:0
/// Nullable:False
/// </summary>
public int GrowthPoints {get;set;}
/// <summary>
/// Desc:累计喂养次数
/// Default:0
/// Nullable:False
/// </summary>
public int FeedingCount {get;set;}
/// <summary>
/// Desc:宠物类型
/// Default:Normal
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Active, Sleeping
/// Default:Active
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,100 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///宠物进化链定义表
///</summary>
[SugarTable("PetEvolution")]
public partial class PetEvolution : BaseEntity
{
public PetEvolution(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public new int Id {get;set;}
/// <summary>
/// Desc:阶段名称
/// Default:
/// Nullable:False
/// </summary>
public string StageName {get;set;}
/// <summary>
/// Desc:阶段等级
/// Default:
/// Nullable:False
/// </summary>
public int StageLevel {get;set;}
/// <summary>
/// Desc:进化所需成长值
/// Default:
/// Nullable:False
/// </summary>
public int RequiredGrowth {get;set;}
/// <summary>
/// Desc:形态图片
/// Default:
/// Nullable:True
/// </summary>
public string ImageUrl {get;set;}
/// <summary>
/// Desc:前一形态Id
/// Default:
/// Nullable:True
/// </summary>
public int? PreviousEvolutionId {get;set;}
/// <summary>
/// Desc:基础力量
/// Default:0
/// Nullable:False
/// </summary>
public int BaseStrength {get;set;}
/// <summary>
/// Desc:基础敏捷
/// Default:0
/// Nullable:False
/// </summary>
public int BaseAgility {get;set;}
/// <summary>
/// Desc:基础智力
/// Default:0
/// Nullable:False
/// </summary>
public int BaseIntelligence {get;set;}
/// <summary>
/// Desc:基础魅力
/// Default:0
/// Nullable:False
/// </summary>
public int BaseCharm {get;set;}
/// <summary>
/// Desc:进化类型: Normal, Special
/// Default:Normal
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Active, Inactive
/// Default:Active
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,71 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///宠物喂养记录表
///</summary>
[SugarTable("PetFeedingRecord")]
public partial class PetFeedingRecord : BaseEntity
{
public PetFeedingRecord(){
}
/// <summary>
/// Desc:宠物Id
/// Default:
/// Nullable:False
/// </summary>
public long PetId {get;set;}
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId {get;set;}
/// <summary>
/// Desc:消耗积分
/// Default:
/// Nullable:False
/// </summary>
public int PointsUsed {get;set;}
/// <summary>
/// Desc:成长值变化量
/// Default:
/// Nullable:False
/// </summary>
public int GrowthChange {get;set;}
/// <summary>
/// Desc:喂养前成长值
/// Default:
/// Nullable:False
/// </summary>
public int GrowthBefore {get;set;}
/// <summary>
/// Desc:喂养后成长值
/// Default:
/// Nullable:False
/// </summary>
public int GrowthAfter {get;set;}
/// <summary>
/// Desc:喂养类型: Normal, Special
/// Default:Normal
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态
/// Default:Success
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,71 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///积分流水记录表
///</summary>
[SugarTable("PointsRecord")]
public partial class PointsRecord : BaseEntity
{
public PointsRecord(){
}
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId {get;set;}
/// <summary>
/// Desc:变动数值
/// Default:
/// Nullable:False
/// </summary>
public int ChangeAmount {get;set;}
/// <summary>
/// Desc:变动后余额
/// Default:
/// Nullable:False
/// </summary>
public int BalanceAfter {get;set;}
/// <summary>
/// Desc:变动类型: Exchange, FeedPet, SignIn, TaskReward
/// Default:
/// Nullable:False
/// </summary>
public string ChangeType {get;set;}
/// <summary>
/// Desc:关联业务Id
/// Default:
/// Nullable:True
/// </summary>
public long? RelatedId {get;set;}
/// <summary>
/// Desc:备注
/// Default:
/// Nullable:True
/// </summary>
public string Description {get;set;}
/// <summary>
/// Desc:流水分类
/// Default:
/// Nullable:True
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Success, Failed, Pending
/// Default:Success
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,86 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///虚拟商品表
///</summary>
[SugarTable("Product")]
public partial class Product : BaseEntity
{
public Product(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public new int Id {get;set;}
/// <summary>
/// Desc:商品名称
/// Default:
/// Nullable:False
/// </summary>
public string Name {get;set;}
/// <summary>
/// Desc:描述
/// Default:
/// Nullable:True
/// </summary>
public string Description {get;set;}
/// <summary>
/// Desc:商品图片
/// Default:
/// Nullable:True
/// </summary>
public string ImageUrl {get;set;}
/// <summary>
/// Desc:所需积分
/// Default:
/// Nullable:False
/// </summary>
public int Price {get;set;}
/// <summary>
/// Desc:商品类型: MakeUpCard, PetBg
/// Default:
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: OnSale, OffSale
/// Default:OnSale
/// Nullable:False
/// </summary>
public string Status {get;set;}
/// <summary>
/// Desc:扩展数据
/// Default:
/// Nullable:True
/// </summary>
public string MetaData {get;set;}
/// <summary>
/// Desc:是否上架
/// Default:b'1'
/// Nullable:False
/// </summary>
public bool IsActive {get;set;}
/// <summary>
/// Desc:库存(-1无限)
/// Default:-1
/// Nullable:False
/// </summary>
public int Stock {get;set;}
}
}

View File

@ -0,0 +1,51 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///固定模板言论表
///</summary>
[SugarTable("TemplateSentence")]
public partial class TemplateSentence : BaseEntity
{
public TemplateSentence(){
}
/// <summary>
/// Desc:主键
/// Default:
/// Nullable:False
/// </summary>
[SugarColumn(IsPrimaryKey=true,IsIdentity=true)]
public new int Id {get;set;}
/// <summary>
/// Desc:模板内容
/// Default:
/// Nullable:False
/// </summary>
public string Sentence {get;set;}
/// <summary>
/// Desc:是否启用
/// Default:b'1'
/// Nullable:False
/// </summary>
public bool IsActive {get;set;}
/// <summary>
/// Desc:分类: Positive, Neutral, Negative
/// Default:Neutral
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Active, Inactive
/// Default:Active
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,71 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///用户表
///</summary>
[SugarTable("User")]
public partial class User : BaseEntity
{
public User(){
}
/// <summary>
/// Desc:微信OpenId
/// Default:
/// Nullable:False
/// </summary>
public string OpenId {get;set;}
/// <summary>
/// Desc:微信UnionId
/// Default:
/// Nullable:True
/// </summary>
public string UnionId {get;set;}
/// <summary>
/// Desc:昵称
/// Default:
/// Nullable:True
/// </summary>
public string NickName {get;set;}
/// <summary>
/// Desc:头像地址
/// Default:
/// Nullable:True
/// </summary>
public string AvatarUrl {get;set;}
/// <summary>
/// Desc:手机号
/// Default:
/// Nullable:True
/// </summary>
public string Phone {get;set;}
/// <summary>
/// Desc:积分余额
/// Default:0
/// Nullable:False
/// </summary>
public int Points {get;set;}
/// <summary>
/// Desc:用户类型: Normal, VIP
/// Default:Normal
/// Nullable:False
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Active, Disabled
/// Default:Active
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,64 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///用户背包表
///</summary>
[SugarTable("UserBag")]
public partial class UserBag : BaseEntity
{
public UserBag(){
}
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId {get;set;}
/// <summary>
/// Desc:物品类型: MakeUpCard, PetBg
/// Default:
/// Nullable:False
/// </summary>
public string ItemType {get;set;}
/// <summary>
/// Desc:关联商品Id或资源Id
/// Default:
/// Nullable:False
/// </summary>
public int ItemId {get;set;}
/// <summary>
/// Desc:数量
/// Default:1
/// Nullable:False
/// </summary>
public int Quantity {get;set;}
/// <summary>
/// Desc:扩展信息
/// Default:
/// Nullable:True
/// </summary>
public string MetaData {get;set;}
/// <summary>
/// Desc:背包物品分类
/// Default:
/// Nullable:True
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Available, Expired
/// Default:Available
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,50 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
///<summary>
///用户勋章表
///</summary>
[SugarTable("UserMedal")]
public partial class UserMedal : BaseEntity
{
public UserMedal(){
}
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId {get;set;}
/// <summary>
/// Desc:勋章Id
/// Default:
/// Nullable:False
/// </summary>
public int MedalId {get;set;}
/// <summary>
/// Desc:获得时间
/// Default:
/// Nullable:True
/// </summary>
public DateTime? AwardedAt {get;set;}
/// <summary>
/// Desc:勋章记录类型
/// Default:
/// Nullable:True
/// </summary>
public string Type {get;set;}
/// <summary>
/// Desc:状态: Awarded, Revoked
/// Default:Awarded
/// Nullable:False
/// </summary>
public string Status {get;set;}
}
}

View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace QYZH.InteractiveMagazine.Models.Enum
{
public enum ApiVersionEnum
{
/// <summary>
/// Platform
/// </summary>
[Description("平台管理")]
Platform = 10,
/// <summary>
/// Wechat
/// </summary>
[Description("小程序管理")]
Wechat = 20,
}
}

View File

@ -1,9 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<ItemGroup>