一、字段校验和设置请求返回值
FluentValidation是一个用于构建强类型验证规则的 .NET 库
可以对前端传过来的数据进行校验,比如是否是空值和长度限制等。
官网:docs.fluentvalidation.net/en/latest/i…
nuget安装FluentValidation.AspNetCore
新建一个验证类并且继承AbstractValidator,泛型里面放上要验证的对象。验证规则在构造函数里面写上
public class UsersValidator : AbstractValidator<RegisterUser>
{
public UsersValidator()
{
//对每个字段进行单独校验
RuleFor(it => it.UserName)
.NotNull().WithMessage("请填写用户名").NotEmpty().WithMessage("用户名不能为空");
RuleFor(it => it.Account)
.NotNull().WithMessage("请填写用户账号").NotEmpty().WithMessage("账号不能为空")
.MaximumLength(11).WithMessage("账号长度太长");
RuleFor(it => it.Password)
.NotNull().WithMessage("请填写用户密码").NotEmpty().WithMessage("密码不能为空")
.MaximumLength(11).WithMessage("密码长度太长");
}
}
新建一个HttpResult类统一响应格式
public class HttpResult<T>
{
public int status { get; set; }
public string? Message { get; set; }
public T? Data { get; set; }
/// <summary>
/// 统一返回
/// </summary>
/// <returns></returns>
public static HttpResult<T> success(string message)
{
return new HttpResult<T>()
{
status = 200,
Message = message
};
}
public static HttpResult<T> success(T data)
{
return new HttpResult<T>()
{
status = 200,
Data = data
};
}
/// <summary>
/// 统一错误
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static HttpResult<T> error(T data)
{
return new HttpResult<T>()
{
status = 400,
Data = data
};
}
public static HttpResult<T> error(string message)
{
return new HttpResult<T>()
{
status = 400,
Message = message
};
}
public static HttpResult<T> unauthorized(string message)
{
return new HttpResult<T>()
{
status = 401,
Message = message
};
}
}
在program.cs里面添加
#region 设置响应错误信息格式
builder.Services.AddMvc().ConfigureApiBehaviorOptions(options =>
{
options.InvalidModelStateResponseFactory = c =>
{
Console.WriteLine(c);
//处理错误消息拼接成字符串
var errors = string.Join("&", c.ModelState.Values.Where(v => v.Errors.Count > 0)
.SelectMany(v => v.Errors).Select(v => v.ErrorMessage).Where(v => v.IndexOf("field is required.") == -1));
return new BadRequestObjectResult(HttpResult<Object>.error(errors));
};
});
#endregion
#region FluentValidation 字段校验注入
builder.Services.AddFluentValidation(opt =>
{
opt.RegisterValidatorsFromAssembly(Assembly.Load("验证类所在的位置"));
});
#endregion
二、使用Sqlsugar仓储
官网: www.donet5.com/Home/Doc?ty…
在Repository类库中创建一个BaseRepository类,
using SqlSugar;
namespace skuMall
{
public class BaseRepository<T> : SimpleClient<T> where T : class, new()
{
public BaseRepository(ISqlSugarClient context) : base(context)
{
base.Context = context;
}
/// <summary>
/// 扩展方法,自带方法不能满足的时候可以添加新方法
/// </summary>
/// <returns></returns>
public List<T>? CommQuery(string json)
{
//base.Context.Queryable<T>().ToList();可以拿到SqlSugarClient 做复杂操作
return null;
}
}
}
在领域模型中新建视图层VO 和数据传输层 DTO
Repository层创建一个接口和实现类
internal interface InterfaceUserRepository
{
/// <summary>
/// 添加
/// </summary>
/// <param name="users"></param>
/// <returns></returns>
bool Insert(Users users);
}
public class UserRepository : BaseRepository<Users> , InterfaceUserRepository
{
public UserRepository(ISqlSugarClient db) : base(db) { }
/// <summary>
/// 添加
/// </summary>
/// <param name="users"></param>
/// <returns></returns>
public override bool Insert(Users users)
{
return base.Insert(users);
}
}
在services层中同样创建接口和实现类
interface InterfaceUserServices<T>
{
/// <summary>
/// 注册用户
/// </summary>
/// <param name="users"></param>
/// <returns></returns>
Task<T> registerUser(Users users);
}
public async Task<IActionResult> registerUser(Users users)
{
try
{
if (userRepository.Insert(users))
{
return new OkObjectResult(HttpResult<Users>.success("注册成功"));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
string err = ex.Message;
if(ex.Message.Contains("Duplicate entry") && ex.Message.Contains(" for key 'Account'"))
{
err = "账号重复,请换一个试试";
}
return new OkObjectResult(HttpResult<Users>.error(err));
}
return new BadRequestObjectResult(HttpResult<Users>.error("系统异常"));
}