refactor: 统一业务异常处理,标准化结果码和错误响应
1. 新增并完善ResultCode枚举,补充标准HTTP状态码对应的业务状态码 2. 重构BusinessException,新增基于ResultCode的构造函数和ThrowIf扩展方法 3. 替换所有硬编码的HTTP状态码为统一的ResultCode枚举 4. 优化全局异常中间件,根据业务状态码映射对应HTTP状态码并规范化JSON响应 5. 修复OssImageHelper和AutoDotCodeConsumer中的OSS文件处理逻辑 6. 新增用户答题快照实体类 7. 清理废弃的宠物模块迁移脚本
This commit is contained in:
@ -1,3 +1,5 @@
|
||||
using QYZH.InteractiveMagazine.Models.Dto;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Common;
|
||||
|
||||
/// <summary>
|
||||
@ -10,6 +12,11 @@ public class BusinessException : Exception
|
||||
/// </summary>
|
||||
public int Code { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 业务状态码
|
||||
/// </summary>
|
||||
public ResultCode ResultCode { get; set; } = ResultCode.FAIL;
|
||||
|
||||
/// <summary>
|
||||
/// 无参构造函数
|
||||
/// </summary>
|
||||
@ -33,6 +40,18 @@ public class BusinessException : Exception
|
||||
public BusinessException(string message, int code) : base(message)
|
||||
{
|
||||
Code = code;
|
||||
ResultCode = System.Enum.IsDefined(typeof(ResultCode), code) ? (ResultCode)code : ResultCode.FAIL;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 构造函数(按业务状态码)
|
||||
/// </summary>
|
||||
/// <param name="message">异常消息</param>
|
||||
/// <param name="resultCode">业务状态码</param>
|
||||
public BusinessException(string message, ResultCode resultCode) : base(message)
|
||||
{
|
||||
ResultCode = resultCode;
|
||||
Code = (int)resultCode;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -62,4 +81,15 @@ public class BusinessException : Exception
|
||||
throw new BusinessException(message);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 条件抛出业务异常(带业务状态码)
|
||||
/// </summary>
|
||||
/// <param name="isTrue">是否触发</param>
|
||||
/// <param name="message">异常消息</param>
|
||||
/// <param name="resultCode">业务状态码</param>
|
||||
public static void ThrowIf(bool isTrue, string message, ResultCode resultCode)
|
||||
{
|
||||
if (isTrue) throw new BusinessException(message, resultCode);
|
||||
}
|
||||
}
|
||||
|
||||
@ -195,5 +195,23 @@ public enum ResultCode
|
||||
FORBIDDEN = 403,
|
||||
|
||||
[Description("Bad Request")]
|
||||
BAD_REQUEST = 400
|
||||
BAD_REQUEST = 400,
|
||||
|
||||
[Description("资源不存在")]
|
||||
NOT_FOUND = 404,
|
||||
|
||||
[Description("冲突/重复提交")]
|
||||
CONFLICT = 409,
|
||||
|
||||
[Description("业务规则校验失败")]
|
||||
UNPROCESSABLE_ENTITY = 422,
|
||||
|
||||
[Description("请求过于频繁")]
|
||||
TOO_MANY_REQUESTS = 429,
|
||||
|
||||
[Description("第三方服务异常")]
|
||||
BAD_GATEWAY = 502,
|
||||
|
||||
[Description("服务不可用")]
|
||||
SERVICE_UNAVAILABLE = 503
|
||||
}
|
||||
|
||||
@ -0,0 +1,161 @@
|
||||
using SqlSugar;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Entity
|
||||
{
|
||||
/// <summary>
|
||||
/// Snapshot record for a user answer.
|
||||
/// </summary>
|
||||
[SugarTable("JournalPageTaskUserAnswerSnapshot")]
|
||||
public class JournalPageTaskUserAnswerSnapshot : SqlSugarBaseEntity
|
||||
{
|
||||
/// <summary>
|
||||
/// Source JournalPageTaskUserAnswer record Id.
|
||||
/// </summary>
|
||||
public long JournalPageTaskUserAnswerId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Journal Id.
|
||||
/// </summary>
|
||||
public long JournalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Journal page Id.
|
||||
/// </summary>
|
||||
public long JournalPageId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Journal page task Id.
|
||||
/// </summary>
|
||||
public long JournalPageTaskId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Journal page task group Id.
|
||||
/// </summary>
|
||||
public long JournalPageTaskGroupId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// User Id.
|
||||
/// </summary>
|
||||
public long UserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Answer result.
|
||||
/// </summary>
|
||||
public string? Result { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Points awarded.
|
||||
/// </summary>
|
||||
public float Points { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Growth points awarded.
|
||||
/// </summary>
|
||||
public float GrowthPoints { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Task score.
|
||||
/// </summary>
|
||||
public float Score { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Question answer image URL.
|
||||
/// </summary>
|
||||
public string? QuestionAnswerUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Answer image URL.
|
||||
/// </summary>
|
||||
public string? AnswerUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Page answer image URL.
|
||||
/// </summary>
|
||||
public string? PageAnswerUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Optimistic concurrency revision.
|
||||
/// </summary>
|
||||
public int Revision { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Answer status.
|
||||
/// </summary>
|
||||
public int AnswerStatus { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Answer start time.
|
||||
/// </summary>
|
||||
public DateTime AnswerStartTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Answer end time.
|
||||
/// </summary>
|
||||
public DateTime AnswerEndTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Answer duration in seconds.
|
||||
/// </summary>
|
||||
public int AnswerSeconds { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Image recognition result.
|
||||
/// </summary>
|
||||
public int ImageRecognition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Journal page number.
|
||||
/// </summary>
|
||||
public int JournalPageNum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Modify count.
|
||||
/// </summary>
|
||||
public int Modify { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Last tag Id.
|
||||
/// </summary>
|
||||
public long LastTag { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Dot page number.
|
||||
/// </summary>
|
||||
public int DotPageNum { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Page result image URL.
|
||||
/// </summary>
|
||||
public string? PageResultUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Question type.
|
||||
/// </summary>
|
||||
public string? Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Dot page number text.
|
||||
/// </summary>
|
||||
public string? DotPageNo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Page answer dot image URL.
|
||||
/// </summary>
|
||||
public string? PageAnswerDotUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Break count.
|
||||
/// </summary>
|
||||
public int BreakCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Break time records.
|
||||
/// </summary>
|
||||
public string? BreakTimes { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Assignment status.
|
||||
/// </summary>
|
||||
public string? AssignmentStatus { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user