feat: add wechat mini program mall, check-in supplement and pet skin system

This commit implements a complete WeChat mini program mall and related features:
1. Add pet skin entity and backpack item type support
2. Add make-up check-in and missed date query functions
3. Implement mall product browsing, exchange and record query
4. Add backpack management and item usage (make-up card)
5. Add pet skin equipping function
6. Fix UserBag ItemId type from int to long
7. Adjust Dockerfile exposed port to 8080
8. Fix session cookie unprotect warning
This commit is contained in:
glz
2026-06-04 18:03:34 +08:00
parent 903ccd3073
commit ae2c6ddfc7
14 changed files with 1128 additions and 8 deletions

View File

@ -0,0 +1,87 @@
namespace QYZH.InteractiveMagazine.Models.Dto.Bag;
/// <summary>
/// 背包物品输出
/// </summary>
public class UserBagOutput
{
public long Id { get; set; }
public long ItemId { get; set; }
public string ItemType { get; set; } = string.Empty;
public int Quantity { get; set; }
public string Status { get; set; } = string.Empty;
/// <summary>
/// 关联商品信息(如果有)
/// </summary>
public BagProductBrief? Product { get; set; }
/// <summary>
/// 关联皮肤信息PetBg 类型时)
/// </summary>
public BagSkinBrief? Skin { get; set; }
public DateTime CreatedAt { get; set; }
}
/// <summary>
/// 背包中的商品简要
/// </summary>
public class BagProductBrief
{
public string Name { get; set; } = string.Empty;
public string? ImageUrl { get; set; }
public string? Description { get; set; }
}
/// <summary>
/// 背包中的皮肤简要
/// </summary>
public class BagSkinBrief
{
public long SkinId { get; set; }
public string SkinName { get; set; } = string.Empty;
public string? SkinImage { get; set; }
public string Rarity { get; set; } = string.Empty;
}
/// <summary>
/// 使用物品输入(补签卡)
/// </summary>
public class UseItemInput
{
/// <summary>
/// 背包物品Id
/// </summary>
public long BagItemId { get; set; }
/// <summary>
/// 补签目标日期yyyy-MM-dd仅补签卡使用
/// </summary>
public string? TargetDate { get; set; }
}
/// <summary>
/// 换肤输入
/// </summary>
public class EquipSkinInput
{
/// <summary>
/// 皮肤Id传0则恢复默认皮肤
/// </summary>
public long SkinId { get; set; }
}
/// <summary>
/// 使用物品输出
/// </summary>
public class UseItemOutput
{
public bool IsSuccess { get; set; }
public string Message { get; set; } = string.Empty;
/// <summary>
/// 补签时返回的签到结果
/// </summary>
public object? Extra { get; set; }
}

View File

@ -0,0 +1,80 @@
namespace QYZH.InteractiveMagazine.Models.Dto.Mall;
/// <summary>
/// 小程序商品展示输出
/// </summary>
public class WxProductOutput
{
public long Id { get; set; }
public string Name { get; set; } = string.Empty;
public string? Description { get; set; }
public string? ImageUrl { get; set; }
public int Price { get; set; }
public string Type { get; set; } = string.Empty;
/// <summary>
/// 皮肤信息(仅 PetBg 类型有值)
/// </summary>
public PetSkinBrief? Skin { get; set; }
/// <summary>
/// 用户是否已拥有PetBg 类型时判断背包中是否有)
/// </summary>
public bool Owned { get; set; }
}
/// <summary>
/// 皮肤简要信息
/// </summary>
public class PetSkinBrief
{
public long SkinId { get; set; }
public string SkinName { get; set; } = string.Empty;
public string? SkinImage { get; set; }
public string? Description { get; set; }
public string Rarity { get; set; } = string.Empty;
}
/// <summary>
/// 兑换输入
/// </summary>
public class ExchangeInput
{
/// <summary>
/// 商品Id
/// </summary>
public long ProductId { get; set; }
/// <summary>
/// 兑换数量默认1
/// </summary>
public int Quantity { get; set; } = 1;
}
/// <summary>
/// 兑换输出
/// </summary>
public class ExchangeOutput
{
public long RecordId { get; set; }
public string ProductName { get; set; } = string.Empty;
public int PointsCost { get; set; }
public int PointsBalance { get; set; }
public string Message { get; set; } = string.Empty;
}
/// <summary>
/// 兑换记录输出
/// </summary>
public class ExchangeRecordOutput
{
public long Id { get; set; }
public long ProductId { get; set; }
public string ProductName { get; set; } = string.Empty;
public string ProductType { get; set; } = string.Empty;
public int PointsCost { get; set; }
public int PointsBalance { get; set; }
public int Quantity { get; set; }
public string Status { get; set; } = string.Empty;
public DateTime CreatedAt { get; set; }
}

View File

@ -0,0 +1,69 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
/// <summary>
/// 商品兑换记录表
/// </summary>
[SugarTable("ExchangeRecord")]
public partial class ExchangeRecord : SqlSugarBaseEntity
{
public ExchangeRecord() { }
/// <summary>
/// Desc:用户Id
/// Default:
/// Nullable:False
/// </summary>
public long UserId { get; set; }
/// <summary>
/// Desc:商品Id
/// Default:
/// Nullable:False
/// </summary>
public long ProductId { get; set; }
/// <summary>
/// Desc:商品名称(快照)
/// Default:
/// Nullable:False
/// </summary>
public string ProductName { get; set; }
/// <summary>
/// Desc:商品类型(快照): MakeUpCard, PetBg
/// Default:
/// Nullable:False
/// </summary>
public string ProductType { get; set; }
/// <summary>
/// Desc:消耗积分
/// Default:
/// Nullable:False
/// </summary>
public int PointsCost { get; set; }
/// <summary>
/// Desc:兑换后积分余额
/// Default:
/// Nullable:False
/// </summary>
public int PointsBalance { get; set; }
/// <summary>
/// Desc:兑换数量
/// Default:1
/// Nullable:False
/// </summary>
public int Quantity { get; set; }
/// <summary>
/// Desc:状态: Success, Refunded
/// Default:Success
/// Nullable:False
/// </summary>
public new string Status { get; set; }
}
}

View File

@ -47,6 +47,13 @@ namespace QYZH.InteractiveMagazine.Models.Entity
/// </summary>
public int FeedingCount {get;set;}
/// <summary>
/// Desc:当前皮肤Id0为默认皮肤
/// Default:0
/// Nullable:False
/// </summary>
public long CurrentSkinId {get;set;}
/// <summary>
/// Desc:宠物类型
/// Default:Normal

View File

@ -0,0 +1,55 @@
using SqlSugar;
namespace QYZH.InteractiveMagazine.Models.Entity
{
/// <summary>
/// 宠物皮肤定义表
/// </summary>
[SugarTable("PetSkin")]
public partial class PetSkin : SqlSugarBaseEntity
{
public PetSkin() { }
/// <summary>
/// Desc:皮肤名称
/// Default:
/// Nullable:False
/// </summary>
public string Name { get; set; }
/// <summary>
/// Desc:皮肤图片
/// Default:
/// Nullable:True
/// </summary>
public string ImageUrl { get; set; }
/// <summary>
/// Desc:描述/特效说明
/// Default:
/// Nullable:True
/// </summary>
public string Description { get; set; }
/// <summary>
/// Desc:关联商品Id用于兑换
/// Default:
/// Nullable:False
/// </summary>
public long ProductId { get; set; }
/// <summary>
/// Desc:稀有度: Normal, Rare, Epic, Legendary
/// Default:Normal
/// Nullable:False
/// </summary>
public string Rarity { get; set; }
/// <summary>
/// Desc:排序权重
/// Default:0
/// Nullable:False
/// </summary>
public int SortOrder { get; set; }
}
}

View File

@ -31,7 +31,7 @@ namespace QYZH.InteractiveMagazine.Models.Entity
/// Default:
/// Nullable:False
/// </summary>
public int ItemId {get;set;}
public long ItemId {get;set;}
/// <summary>
/// Desc:数量