我正在开展一个业余爱好项目,以培养我的 ASP.NET Core 技能。我希望在此项目中进行用户身份验证,为此我使用微软身份。作为登录用户,应该能够创建食物并出售它。类似地,作为登录用户应该能够购买这种食物。最初我创建的模型如下;
public class User : IdentityUser
{
public UserRole Role { get; set; }
public Profile? Profile { get; set; }
}
public class Seller : User
{
public List<Food> Foods { get; set; } = new List<Food>();
}
public class Buyer : User
{
public List<Food> Foods { get; set; } = new List<Food>();
}
public class Category
{
public Guid Id { get; set; }
public required string Name { get; set; }
}
public class Food
{
public Guid Id { get; set; }
public DateTime AvailableDate { get; set; }
public required string Name { get; set; }
public decimal Price { get; set; }
public required string Description { get; set; }
public required string Ingredients { get; set; }
public int QuantityAvailable { get; set; }
public required string SellerId { get; set; }
public required Seller Seller { get; set; }
public Guid FoodImageId { get; set; }
public Guid CategoryId { get; set; }
public List<FoodImage>? FoodImage { get; set; }
public required Category Category { get; set; }
}
public class FoodImage
{
public Guid Id { get; set; }
public Guid FoodId { get; set; }
public required Food Food { get; set; }
public required string Image { get; set; }
}
public class Order
{
public Guid Id { get; set; }
public DateTime OrderDate { get; set; }
public decimal TotalPrice { get; set; }
public required string BuyerId { get; set; }
public required string SellerId { get; set; }
public Guid FoodId { get; set; }
public required Buyer Buyer { get; set; }
public required Seller Seller { get; set; }
public required Food Food { get; set; }
}
public class OrderItem
{
public Guid Id { get; set; }
public Guid OrderId { get; set; }
public required Order Order { get; set; }
public Guid FoodId { get; set; }
public required Food Food { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
}
public class Profile
{
public Guid Id { get; set; }
public required string Address { get; set; }
public required string PhoneNumber { get; set; }
public required string City { get; set; }
public required string Country { get; set; }
public required string PostCode { get; set; }
public string? Bio { get; set; }
public string? ProfileImage { get; set; }
public required string UserId { get; set; }
public required User User { get; set; }
}
我最初的想法是在注册时为买家和卖家扮演角色。当我实现微软身份时,在注册过程中它只要求提供电子邮件和密码 - 现在一种解决方案可能是进行一些自定义并添加其他输入来询问用户是买家还是卖家。但现在我开始思考我的项目中真的需要像买家和卖家这样的角色吗?由于我是 asp.net core 的新手并且知识有限,所以我需要有人可以帮助我做出这个决定。这个项目背后的想法是,作为登录用户,我应该能够发布食物,其他用户可以购买它。但只有所有者用户才能更新食物。
也欢迎您对其他型号的任何更改提出建议。感谢您提前的帮助。
您的项目概念很扎实,但您当前的模型结构可以进行一些改进,以更好地符合您的要求。具体来说:
您需要单独的买家和卖家角色吗? 不,您可能不需要单独的买方和卖方角色。任何登录的用户都应该能够根据上下文同时充当买家和卖家。这通过消除 Seller 和 Buyer 类并为所有用户使用单个 User 类来简化您的模型。
模型修改及建议 这是修改后的方法:
用户类别 将 User 保留为继承自 IdentityUser 的单个类。添加他们销售的食品和他们下的订单的集合:
{
public Profile? Profile { get; set; }
public List<Food> FoodsForSale { get; set; } = new List<Food>();
public List<Order> Orders { get; set; } = new List<Order>();
}
食品类 将 SellerId 设置为 UserId 引用并确保用户导航属性双向工作:
{
public Guid Id { get; set; }
public DateTime AvailableDate { get; set; }
public required string Name { get; set; }
public decimal Price { get; set; }
public required string Description { get; set; }
public required string Ingredients { get; set; }
public int QuantityAvailable { get; set; }
public required string SellerId { get; set; }
public required User Seller { get; set; }
public Guid FoodImageId { get; set; }
public Guid CategoryId { get; set; }
public List<FoodImage>? FoodImages { get; set; }
public required Category Category { get; set; }
}
Order 和 OrderItem 类 确保订单通过买家和卖家的用户帐户链接到买家和卖家,并包含导航属性以确保清晰:
{
public Guid Id { get; set; }
public DateTime OrderDate { get; set; }
public decimal TotalPrice { get; set; }
public required string BuyerId { get; set; }
public required User Buyer { get; set; }
public List<OrderItem> Items { get; set; } = new List<OrderItem>();
}
public class OrderItem
{
public Guid Id { get; set; }
public Guid OrderId { get; set; }
public required Order Order { get; set; }
public Guid FoodId { get; set; }
public required Food Food { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
}
配置文件类 这里不需要进行重大更改,但请确保用户可以选择是否拥有个人资料。
自定义 Microsoft 身份 如果您希望允许用户在注册期间指定其他详细信息(例如,他们最初的出售或购买意图),您可以延长注册过程。但是,您不需要单独的角色,因为每个用户都可以既是买家又是卖家。
仅当您定义卖家角色时才使用 User.IsInRole("Seller")(不推荐)。 或者,直接在服务或控制器中强制执行所有权检查:
{
return Unauthorized();
}