一步一步abp电商模块-1、搭建模块环境
前言
目前在开发abp电商模块,打算做一步,写一步,算是对自己的记录,主要是参考nopcommoner 并结合abp模块开发
知识都是连贯的,如果你熟悉asp.net core 3.x、abp(非vNext) 并且需要做电商功能,也许可以做个参考。即使不做电商,可能里面的其它功能也可以作为参考,如:如何开发abp模块、如何集成简单的微信功能(小程序登录、小程序支付)、通用字典模块、等等...
如果不熟悉asp.net core或abp,那建议还是补充基础知识后再说
如果你是专注电商的.neter,建议用nopcommerce,它是一个成熟完善的.net开源电商
本篇说说搭建电商模块开发环境
资源
- asp.net core 3框架揭秘【书】
- 大文件分片上传/秒传附件功能【视频】
- 通用数据字典【视频】
- 微信小程序登录【视频】
- 微信小程序支付【视频】
- >>>>>>>>>>>源码地址
建立电商模块项目

abp的模块就是个dll+一个特殊的类(其中包含生命周期方法),具体概念请参考官方文档
我这里说的电商模块是指的功能模块,按abp的分层方式分为:
- xxx.Core:实体、领域服务、领域事件和其它核心功能
- xxx.EFCore:基于efCore的仓储实现,由于abp的牛B,它基本为空
- xxx.Application:应用服务,动态webApi
木有提供UI部分,因为是前后单分离的(WebAdmin是基于JQuery的纯静态网站)
可以看到结构与abp默认项目模板保持一致
XXX.Core

与abp模型项目模板一致,它用来定义实体类、领域服务、领域事件、仓储接口 等。它是一个dll,也是一个独立的abp模块
Authorization:按abp的要求定义电商系统中涉及到的权限定义
Configuration:按abp要求定义的电商系统设计到“设置”功能,这个后期可能细化
Localization:商场模块有自己独立的本地化配置,
BXJGShopConsts:常量定义
BXJGShopDomainServiceBase:领域服务抽象类,将来定义的领域服务可能大多会继承这个类
BXJGShopCoreModule:这个还是按abp的标准模块定义方式,在模块的生命周期事件中做些初始化工作。
可以看到所有东东还是原来的配方,如果你熟悉abp 几乎不用思考。
本篇主要讲商城模块环境搭架,所以下面只是简单说说正在做的一些具体功能
Catalogue/ItemsEntity:是已经在做的“商品上架信息”的实体类,里面包含:商品基本信息、上架信息(是否热卖,是否新品、上架开始/结束时间等)、价格信息(原价、优惠价、等.),后续会陆续添加其它电商业务相关实体,订单、会员啥的...
Common/BXJGShopDictionaryEntity:电商模块单独的“通用字典”功能,比如支付方式、配送方式将来很多下拉框数据都使用这个,它是它是通过我们之前说的通用树模块来实现的。
Customer:顾客功能,它与abp的用户是做一对一关联,可以发现CustomerEntity<TUser>使用的泛型,这样将来你在引入商城模块时需要提供你自己的用户类型。整个商城功能可能会存在大量这种泛型的设计,目的是让模块与主程序分离。
Sale:中是跟销售相关的功能,核心的就是订单咯,后续会细讲
XXX.EFCore

这个是对应abp中的XXX.EntityFrameworkCore模块,是用来定义电商业务中数据操作的,也称为仓储实现层。但是由于abp已经提供了一个通用的泛型仓储实现,因此这个类库中基本上看不到啥东西,除非有特殊情况才需要专门定义。
另一个重要作用是用来定义EF映射配置,因为决定所有实体采用ef api的方式来定义映射。其中ModelBuilderExt用来定义扩展方法,方便将来调用方一次性配置商城系统中的EF映射。在你的主程序的DbContext做如下配置:
1 protected override void OnModelCreating(ModelBuilder modelBuilder)
2 {
3 base.OnModelCreating(modelBuilder);
4 //扫描并应用商城模块中的ef映射
5 modelBuilder.ApplyConfigurationBXJGShop<User>();
6 }
XXX.Applicatiom

商城模块应用服务层,同时它也是一个abp模块。
BXJGShopApplicationModule:按abp模块套路定义的
BXJGShopAppServiceBase:商城功能应用服务基类
BXJGShopNavigationProvider:注意这是一个静态类,里面定义了商城功能的菜单,你需要在你主程序中的NavigationProvider中来调用这个静态方法,并传入上级菜单定义,这样做的目的是允许你将商城功能相关的菜单插入到你主菜单的指定节点位置。
以“商品上架信息ItemEntity”为例感受下
在XXX.Shop.Core中定义实体
商城里肯定包含很多商品咯,它的实体定义在这里:源码
在XXX.Shop.Core中定义商品管理相关权限
在xxx.Shop.EFCore中定义EF映射配置
目前源码里针对商品信息的映射没有定义,因为使用api映射是后来决定的,不过有“订单”的映射文件可以参考。然后修改ModelBuilderExt,添加映射类,参考Order的设计
在xxx.Shop.Application中定义应用服务
定义DTO、IAppService、AppService这个就是abp老套路,特别注意就是泛型的定义,目的之前说过,为了实现商城模块独立于主程序。参考源码。
然后定义商品管理对应的菜单
主程序如何引入?
1、主程序的EF中的DbContext配置
1 #region 注册商城模块中的实体
2 public virtual DbSet<BXJGShopDictionaryEntity> BXJGShopDictionaries { get; set; }
3 public virtual DbSet<ItemEntity> BXJGShopItems { get; set; }
4 public virtual DbSet<CustomerEntity<User>> BXJGShopCustomers { get; set; }
5 public virtual DbSet<OrderEntity<User>> BXJGShopOrders { get; set; }
6 #endregion
7
8 public ZLJDbContext(DbContextOptions<ZLJDbContext> options)
9 : base(options)
10 { }
11
12 protected override void OnModelCreating(ModelBuilder modelBuilder)
13 {
14 base.OnModelCreating(modelBuilder);
15
16 //扫描并应用商城模块中的ef映射
17 modelBuilder.ApplyConfigurationBXJGShop<User>();
18 }
2、主程序的Core/AuthorizationProvider配置商品管理的权限
1 public class ZLJAuthorizationProvider : AuthorizationProvider
2 {
3 GeneralTreeModuleConfig cfg;
4 public ZLJAuthorizationProvider(GeneralTreeModuleConfig cfg)
5 {
6 this.cfg = cfg;
7 }
8 public override void SetPermissions(IPermissionDefinitionContext context)
9 {
10 var admin = context.CreatePermission(PermissionNames.Administrator, L("Administrator"));
11 //{codegenerator}
12 #region 商城
13 BXJGShopAuthorizationProvider.SetPermissions(admin);
14 #endregion
15 #region 资产管理
3、主程序的应用层中提供应用服务类,目的是指定商城管理服务需要的泛型
1 public class ItemAppService : ItemAppService<Tenant, User, Role, TenantManager, UserManager>
2 {
3 public ItemAppService(IRepository<ItemEntity, long> repository) : base(repository)
4 {
5 }
6 }
4、主程序的Web.Core注册商城模块的动态api功能
1 Configuration.Modules.AbpAspNetCore().CreateControllersForAppServices(typeof(BXJGShopApplicationModule).Assembly/*,"bxjgshop"*/);
最后
整个设计尽量做到模块分离,主要还是参考abp zero的思路,它让你去提供User类,使用UserManager时也需要提供TUser,最后达到模块独立的效果、方便扩展,你可以实现自己的User添加扩展字段。
如何做到模块可扩展性呢?有几种思路,刚才说的模块内部大量使用泛型和抽象类,让模块的调用方(比如我们的主程序)可以通过继承的方式来进行扩展。
也可以使用abp提供的EventBus功能,在模块内部触发各种事件,调用方(也就是我们这里的主程序)可以注册这些事件,达到参与到商城业务的目的。
后面再考虑吧,万里长征第一步才开始~希望不会烂尾....
一步一步abp电商模块-1、搭建模块环境的更多相关文章
- 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑
阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...
- 如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成
阅读目录 前言 建模 实现 结语 一.前言 前面几篇已经实现了一个基本的购买+售价计算的过程,这次再让售价丰满一些,增加一个会员价的概念.会员价在现在的主流电商中,是一个不大常见的模式,其带来的问题是 ...
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- 如何一步一步用DDD设计一个电商网站(七)—— 实现售价上下文
阅读目录 前言 明确业务细节 建模 实现 结语 一.前言 上一篇我们已经确立的购买上下文和销售上下文的交互方式,传送门在此:http://www.cnblogs.com/Zachary-Fan/p/D ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- 如何一步一步用DDD设计一个电商网站(五)—— 停下脚步,重新出发
阅读目录 前言 单元测试 纠正错误,重新出发 结语 一.前言 实际编码已经写了2篇了,在这过程中非常感谢有听到观点不同的声音,借着这个契机,今天这篇就把大家提出的建议一个个的过一遍,重新整理,重新出发 ...
- 如何一步一步用DDD设计一个电商网站(四)—— 把商品卖给用户
阅读目录 前言 怎么卖 领域服务的使用 回到现实 结语 一.前言 上篇中我们讲述了“把商品卖给用户”中的商品和用户的初步设计.现在把剩余的“卖”这个动作给做了.这里提醒一下,正常情况下,我们的每一步业 ...
- 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域
一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...
- 一步一步使用ABP框架搭建正式项目系列教程
研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...
- 一步一步使用ABP框架搭建正式项目系列教程之本地化详解
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...
随机推荐
- 高效链接,极致体验:新时代的NFC智能互动系统
在科技不断发展的今天,数字化互动方式的创新已经成为提升用户体验和企业品牌价值的重要环节."碰一碰"系统应运而生,为新时代的社交传播.品牌推广和智能互动提供了一个前所未有的平台. 一 ...
- mysql隐蔽的索引规则导致数据全表扫描
索引是为了加速数据的检索,但是不合理的表结构或适应不当则会起到反作用.我们在项目中就遇到过类似的问题,两个十万级别的数据表,在做连接查询的时候,查询时间达到了7000多秒还没有查出结果. 首先说明,关 ...
- ServiceMesh 4:实现流量染色和分级发布
★ ServiceMesh系列 1 什么是流量染色 在复杂的生产场景中,经常会有同一个服务中,存在多个版本长期共存的需求.为了让不同的用户在不一样的版本中使用,就需要对用户的请求进行采样和染色,打上不 ...
- VL4AD:让语义分割认识未知类别,无需额外数据和训练的OOD语义分割 | ECCV'24
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: VL4AD: Vision-Language Models Improve Pixel-wise Anomaly Detection 论文地址 ...
- Ubuntu 无法播放MP4
今天用ubuntu打开mp4发现无法播放,然后我以为文件损坏了,就传到手机上面,发现还是可以播放的,然后就查了一下相关资料,发现有人让我安装这个 sudo snap install ffmpeg 安装 ...
- linux找到目录下的大文件
用这个命令找一下大于800M的文件 find . -type f -size +800M -print0 | xargs -0 ls -lh 非常方便 能看的到哪些文件有多大
- java——棋牌类游戏五子棋(singlewzq1.0)之二
package basegame; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Image; import ja ...
- Java单例对象同步问题探讨
在本文中,作者向大家讲述了Single Call 模式的原理,同时也介绍了Single Call 模式的实现问题. 评论: 邓明 (dengming@cn.ibm.com), 高级信息系统工程师, ...
- elementui resetFields()不起作用
需要结合prop才有作用
- 命令行应用开发初学者指南:脚手架篇、UI 库和交互工具
在日常的前端开发工作中,我们经常依赖各种命令行工具来提高效率和代码质量.例如,create-react-app 和 eslint 等工具不仅简化了项目的初始化过程,还能自动执行代码检查和格式化任务.当 ...