refactor: 重构用户与勋章体系,统一状态管理与数据结构
1. 新增通用默认状态枚举 DefaultStatusEnum,替换原有分散的状态枚举 2. 重构用户体系:拆分 WxUser 独立表存储微信身份,Users 表改为角色子用户表并关联 WxUser 3. 重构勋章模块:新增系统/期刊勋章类型,调整 JournalId 为可空,新增勋章状态字段 4. 重构微信认证流程:基于 WxUser 生成 Token,支持多子用户管理 5. 清理冗余枚举文件,重构多处业务逻辑适配新的数据结构 6. 修复用户手机号关联逻辑,迁移手机号字段至 WxUser 表
This commit is contained in:
@ -30,12 +30,12 @@ public class MedalInput
|
||||
/// <summary>
|
||||
/// 勋章的类型: Pet, Community
|
||||
/// </summary>
|
||||
public string Type { get; set; } = MedalTypeEnum.Pet.ToString();
|
||||
public string Type { get; set; } = MedalTypeEnum.System.ToString();
|
||||
|
||||
/// <summary>
|
||||
/// 书id
|
||||
/// 期刊id
|
||||
/// </summary>
|
||||
public long JournalId { get; set; }
|
||||
public long? JournalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 勋章规则列表
|
||||
@ -81,7 +81,11 @@ public class MedalOutput
|
||||
/// <summary>
|
||||
/// 书id
|
||||
/// </summary>
|
||||
public long JournalId { get; set; }
|
||||
public long? JournalId { get; set; }
|
||||
/// <summary>
|
||||
/// 勋章状态
|
||||
/// </summary>
|
||||
public DefaultStatusEnum Status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 勋章规则列表
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
using QYZH.InteractiveMagazine.Models.Dto;
|
||||
using QYZH.InteractiveMagazine.Models.Enum;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
@ -32,89 +31,33 @@ public class WeChatQuickLoginInput
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 微信登录输出
|
||||
/// 微信登录输出(含微信用户信息 + 该微信下的 Users 列表)
|
||||
/// </summary>
|
||||
public class WeChatLoginOutput
|
||||
{
|
||||
/// <summary>
|
||||
/// 访问令牌
|
||||
/// 访问令牌(基于 WxUser,不绑定具体 User)
|
||||
/// </summary>
|
||||
public string Token { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 微信OpenId
|
||||
/// 微信用户信息
|
||||
/// </summary>
|
||||
public string OpenId { get; set; } = string.Empty;
|
||||
public WxUserInfoOutput WxUser { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 该 OpenId 下的用户列表
|
||||
/// 该微信用户下的用户列表
|
||||
/// </summary>
|
||||
public List<WxUserOutput> Users { get; set; } = [];
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 微信用户创建/更新输入
|
||||
/// 微信用户信息输出(WxUser 表数据)
|
||||
/// </summary>
|
||||
public class WxUserInput
|
||||
public class WxUserInfoOutput
|
||||
{
|
||||
/// <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; } = UsersTypeEnum.Normal.ToString();
|
||||
|
||||
/// <summary>
|
||||
/// 状态: Active, Disabled
|
||||
/// </summary>
|
||||
public string Status { get; set; } = UserStatusEnum.Active.ToString();
|
||||
|
||||
/// <summary>
|
||||
/// 密码,默认手机后4位
|
||||
/// </summary>
|
||||
public string? Pwd { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前成长值
|
||||
/// </summary>
|
||||
public int GrowthPoints { get; set; } = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 微信用户输出
|
||||
/// </summary>
|
||||
public class WxUserOutput
|
||||
{
|
||||
/// <summary>
|
||||
/// 主键ID
|
||||
/// WxUser 主键Id
|
||||
/// </summary>
|
||||
public long Id { get; set; }
|
||||
|
||||
@ -131,7 +74,7 @@ public class WxUserOutput
|
||||
/// <summary>
|
||||
/// 昵称
|
||||
/// </summary>
|
||||
public string? NickName { get; set; }
|
||||
public string? Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 头像地址
|
||||
@ -142,6 +85,32 @@ public class WxUserOutput
|
||||
/// 手机号
|
||||
/// </summary>
|
||||
public string? Phone { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用户输出(Users 表数据,即角色/子用户)
|
||||
/// </summary>
|
||||
public class WxUserOutput
|
||||
{
|
||||
/// <summary>
|
||||
/// Users 主键Id
|
||||
/// </summary>
|
||||
public long Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 关联 WxUserId
|
||||
/// </summary>
|
||||
public long WxUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 昵称
|
||||
/// </summary>
|
||||
public string? NickName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 头像地址
|
||||
/// </summary>
|
||||
public string? AvatarUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 积分余额
|
||||
@ -149,7 +118,12 @@ public class WxUserOutput
|
||||
public int Points { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 用户类型
|
||||
/// 当前成长值
|
||||
/// </summary>
|
||||
public int GrowthPoints { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 用户类型: Normal, VIP
|
||||
/// </summary>
|
||||
public string Type { get; set; } = string.Empty;
|
||||
|
||||
@ -158,86 +132,74 @@ public class WxUserOutput
|
||||
/// </summary>
|
||||
public string Status { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 当前成长值
|
||||
/// </summary>
|
||||
public int GrowthPoints { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否上次在线用户
|
||||
/// </summary>
|
||||
public bool IsLastOnline { 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>
|
||||
/// 微信用户分页查询输入
|
||||
/// 新增用户输入(在 WxUser 下创建子用户/角色)
|
||||
/// </summary>
|
||||
public class WxUserQueryInput : PageQueryModel
|
||||
public class CreateChildUserInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 昵称(模糊查询)
|
||||
/// 昵称
|
||||
/// </summary>
|
||||
public string? NickName { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 手机号(模糊查询)
|
||||
/// 头像地址(可选)
|
||||
/// </summary>
|
||||
public string? Phone { get; set; }
|
||||
|
||||
public string? AvatarUrl { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 微信切换用户输入
|
||||
/// </summary>
|
||||
public class WeChatSwitchUserInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 目标用户ID(Users 表 Id)
|
||||
/// </summary>
|
||||
public long UserId { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 微信切换用户输出(JWT 基于 WxUser,切换不更换 Token)
|
||||
/// </summary>
|
||||
public class WeChatSwitchUserOutput
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前切换的用户详情
|
||||
/// </summary>
|
||||
public WxUserOutput User { get; set; } = new();
|
||||
}
|
||||
|
||||
// ========== 微信 API 响应 DTO(不变) ==========
|
||||
|
||||
/// <summary>
|
||||
/// 微信 code2session 接口响应
|
||||
/// </summary>
|
||||
public class WxCode2SessionResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户唯一标识
|
||||
/// </summary>
|
||||
[JsonProperty("openid")]
|
||||
public string? OpenId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 会话密钥
|
||||
/// </summary>
|
||||
[JsonProperty("session_key")]
|
||||
public string? SessionKey { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 用户统一标识(在开放平台绑定了多个应用时使用)
|
||||
/// </summary>
|
||||
[JsonProperty("unionid")]
|
||||
public string? UnionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 错误码
|
||||
/// </summary>
|
||||
[JsonProperty("errcode")]
|
||||
public int ErrCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 错误信息
|
||||
/// </summary>
|
||||
[JsonProperty("errmsg")]
|
||||
public string? ErrMsg { get; set; }
|
||||
}
|
||||
@ -247,21 +209,12 @@ public class WxCode2SessionResponse
|
||||
/// </summary>
|
||||
public class WxPhoneNumberResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 错误码
|
||||
/// </summary>
|
||||
[JsonProperty("errcode")]
|
||||
public int ErrCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 错误信息
|
||||
/// </summary>
|
||||
[JsonProperty("errmsg")]
|
||||
public string? ErrMsg { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 手机号信息
|
||||
/// </summary>
|
||||
[JsonProperty("phone_info")]
|
||||
public WxPhoneInfo? PhoneInfo { get; set; }
|
||||
}
|
||||
@ -271,21 +224,12 @@ public class WxPhoneNumberResponse
|
||||
/// </summary>
|
||||
public class WxPhoneInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 用户绑定的手机号(国外手机号会有区号)
|
||||
/// </summary>
|
||||
[JsonProperty("phoneNumber")]
|
||||
public string? PhoneNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 没有区号的手机号
|
||||
/// </summary>
|
||||
[JsonProperty("purePhoneNumber")]
|
||||
public string? PurePhoneNumber { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 区号
|
||||
/// </summary>
|
||||
[JsonProperty("countryCode")]
|
||||
public string? CountryCode { get; set; }
|
||||
}
|
||||
@ -295,55 +239,15 @@ public class WxPhoneInfo
|
||||
/// </summary>
|
||||
public class WxAccessTokenResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取到的凭证
|
||||
/// </summary>
|
||||
[JsonProperty("access_token")]
|
||||
public string? AccessToken { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 凭证有效时间(秒)
|
||||
/// </summary>
|
||||
[JsonProperty("expires_in")]
|
||||
public int ExpiresIn { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 错误码
|
||||
/// </summary>
|
||||
[JsonProperty("errcode")]
|
||||
public int ErrCode { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 错误信息
|
||||
/// </summary>
|
||||
[JsonProperty("errmsg")]
|
||||
public string? ErrMsg { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 微信切换用户输入
|
||||
/// </summary>
|
||||
public class WeChatSwitchUserInput
|
||||
{
|
||||
/// <summary>
|
||||
/// 目标用户ID
|
||||
/// </summary>
|
||||
public long UserId { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 微信切换用户输出
|
||||
/// </summary>
|
||||
public class WeChatSwitchUserOutput
|
||||
{
|
||||
/// <summary>
|
||||
/// 新的访问令牌
|
||||
/// </summary>
|
||||
public string Token { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 当前切换的用户详情
|
||||
/// </summary>
|
||||
public WxUserOutput User { get; set; } = new();
|
||||
}
|
||||
|
||||
|
||||
@ -55,7 +55,7 @@ namespace QYZH.InteractiveMagazine.Models.Entity
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public long JournalId { get; set; }
|
||||
public long? JournalId { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,69 +4,58 @@ using QYZH.InteractiveMagazine.Models.Enum;
|
||||
namespace QYZH.InteractiveMagazine.Models.Entity
|
||||
{
|
||||
///<summary>
|
||||
///用户表
|
||||
///用户表 — 游戏/角色数据,关联 WxUser
|
||||
///</summary>
|
||||
[SugarTable("Users")]
|
||||
public partial class Users : SqlSugarBaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// Desc:关联微信用户Id
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public long WxUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:昵称
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:当前成长值
|
||||
/// Default:0
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
/// </summary>
|
||||
public int GrowthPoints { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:头像地址
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
/// </summary>
|
||||
public string AvatarUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:积分余额
|
||||
/// Default:0
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
/// </summary>
|
||||
public int Points { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:用户类型: Normal, VIP
|
||||
/// Default:Normal
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
/// </summary>
|
||||
public UsersTypeEnum Type { get; set; }
|
||||
/// <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 Phone { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:是否上次在线用户
|
||||
/// Default:0
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
/// </summary>
|
||||
public bool IsLastOnline { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
49
QYZH.InteractiveMagazine.Models/Entity/WxUser.cs
Normal file
49
QYZH.InteractiveMagazine.Models/Entity/WxUser.cs
Normal file
@ -0,0 +1,49 @@
|
||||
using SqlSugar;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Entity
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信用户表 — 存储微信身份信息和基本资料
|
||||
/// 一个 WxUser 可关联多个 Users(多角色/多用户)
|
||||
/// </summary>
|
||||
[SugarTable("WxUser")]
|
||||
public partial class WxUser : SqlSugarBaseEntity
|
||||
{
|
||||
public WxUser() { }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:昵称
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:头像地址
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
public string AvatarUrl { get; set; }
|
||||
|
||||
/// <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 Phone { get; set; }
|
||||
}
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Enum;
|
||||
|
||||
/// <summary>
|
||||
/// 签到配置状态枚举
|
||||
/// </summary>
|
||||
public enum CheckInConfigStatusEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 未激活
|
||||
/// </summary>
|
||||
[Description("未激活")]
|
||||
Inactive = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 激活
|
||||
/// </summary>
|
||||
[Description("激活")]
|
||||
Active = 1
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Enum;
|
||||
|
||||
/// <summary>
|
||||
/// 固定模板言论状态枚举
|
||||
/// </summary>
|
||||
public enum CommunityTemplateSentenceStatusEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 未激活
|
||||
/// </summary>
|
||||
[Description("未激活")]
|
||||
Inactive = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 激活
|
||||
/// </summary>
|
||||
[Description("激活")]
|
||||
Active = 1
|
||||
}
|
||||
@ -1,11 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Enum
|
||||
{
|
||||
/// <summary>
|
||||
/// 管理员状态枚举
|
||||
/// 默认通用状态
|
||||
/// </summary>
|
||||
public enum AdminUserStatusEnum
|
||||
public enum DefaultStatusEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 未激活
|
||||
@ -7,6 +7,11 @@ namespace QYZH.InteractiveMagazine.Models.Enum;
|
||||
/// </summary>
|
||||
public enum MedalTypeEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 系统勋章
|
||||
/// </summary>
|
||||
[Description("系统勋章")]
|
||||
System = 0,
|
||||
/// <summary>
|
||||
/// 宠物勋章
|
||||
/// </summary>
|
||||
@ -16,5 +21,11 @@ public enum MedalTypeEnum
|
||||
/// 社区勋章
|
||||
/// </summary>
|
||||
[Description("社区勋章")]
|
||||
Community = 2
|
||||
Community = 2,
|
||||
/// <summary>
|
||||
/// 期刊勋章
|
||||
/// </summary>
|
||||
[Description("期刊勋章")]
|
||||
Journal = 3
|
||||
|
||||
}
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Enum;
|
||||
|
||||
/// <summary>
|
||||
/// 宠物进化状态枚举
|
||||
/// </summary>
|
||||
public enum PetEvolutionStatusEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 未激活
|
||||
/// </summary>
|
||||
[Description("未激活")]
|
||||
Inactive = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 激活
|
||||
/// </summary>
|
||||
[Description("激活")]
|
||||
Active = 1
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Enum;
|
||||
|
||||
/// <summary>
|
||||
/// 宠物模板状态枚举
|
||||
/// </summary>
|
||||
public enum PetTemplateStatusEnum
|
||||
{
|
||||
/// <summary>
|
||||
/// 未激活
|
||||
/// </summary>
|
||||
[Description("未激活")]
|
||||
Inactive = 0,
|
||||
|
||||
/// <summary>
|
||||
/// 激活
|
||||
/// </summary>
|
||||
[Description("激活")]
|
||||
Active = 1
|
||||
}
|
||||
Reference in New Issue
Block a user