16 Star 199 Fork 91

wuyang/memberclub订单交易引擎

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
1个月前
4个月前
Loading...
README
Apache-2.0

您的star是我继续前进的动力,如果喜欢请右上角帮忙点个Star,随时感知我们的进展

star fork

大家我是五阳,专注于电商交易系统架构的经验分享,欢迎关注我的掘金主页,目前粉丝超过 4000,文章点赞收藏量已超过30000

简介

开源平台上有很多在线商城系统,功能很全,很完善,关注者众多,然而实际业务场景非常复杂和多样化,开源的在线商城系统很难完全匹配实际业务,广泛的痛点是

  • 功能堆砌,大部分功能用不上,需要大量裁剪;

  • 逻辑差异点较多,需要大量修改;

  • 功能之间耦合,难以独立替换某个功能。

由于技术中间件功能诉求较为一致,使用者无需过多定制化,技术中间件开源项目以上的痛点不明显,然而电商交易等业务系统虽然通用性较多,但各行业各产品的业务差异化极大,所以导致以上痛点比较明显

所以我在思考,有没有一个开源系统,能提供电商交易的基础能力,能让开发者搭积木的方式,快速搭建一个完全契合自己业务的新系统呢?

  • 他们可以通过编排和配置选择自己需要的功能,而无需在一个现成的开源系统上进行裁剪

  • 他们可以轻松的新增扩展业务的差异化逻辑,不需要阅读然后修改原有的系统代码!

  • 他们可以轻松的替换掉他们认为垃圾的、多余的系统组件,而不需要考虑其他功能是否会收到影响

开发者们,可以择需选择需要的能力组件,组件中差异化的部分有插件扩展点能轻松扩展。或者能支持开发者快速的重新写一个完全适合自己的新组件然后编排注册到系统中?

memberclub 就是基于这样的想法而设计的。 它是开源免费的交易引擎,通过扩展点引擎和流程引擎定义复杂的交易流程, 以SDK方式对外提供通用的交易能力,能让开发者像搭积木方式,从0到1,快速构建一个新的电商交易系统!

Fork me on Gitee

我认为这很有价值!

项目架构

doc/img_5.png

可以学到什么技术?

在这个项目中你可以学习到 SpringBoot 集成 以下框架或组件。

  1. Mybatis-plus
  2. Sharding-sphere 多数据源分库分表
  3. Redis/redisson
  4. Apollo
  5. Springcloud(feign/enreka)
  6. RabbitMQ
  7. H2 内存数据库
  8. Swagger
  9. Lombok+MapStruct

同时你也可以学习到以下组件的实现原理

  1. 流程引擎
  2. 扩展点引擎
  3. 分布式重试组件
  4. 通用日志组件
  5. 商品库存
  6. 分布式锁组件
  7. Redis Lua的使用
  8. Spring 上下文工具类

效果展示

这是五阳花了1天时间,模仿京东plus会员和抖音券包产品,借助于memberclub 提供的sdk,新搭建的一套交易系统。

使用效果如下

  1. 首先购买会员类商品,提单并且模拟支付(开发者可以集成自身公司的收银支付能力)
  2. 完成模拟支付后,可以在订单列表页看到购买记录,有效期和实付金额等。
  3. 选择发起退款后,可以看到售后预览金额等,最终点击退款,系统回收优惠券和订单逆向。

针对优惠券卡包形式的产品业务,可以支持多商品、多份数等形式的购买,支持购物车提单。最后也展示了购买配额能力。

以上交易提单、履约、售后和结算等模块均依赖 memberclub 提供的sdk实现。

视频演示

如何快速搭建一套交易系统

点击这篇文章查看 解密如何快速搭建一套虚拟商品交易系统,推荐这个神奇的开源项目

你的顾虑

在memberclub中,除业务组件可以自由的编排、扩展和替换之外,服务所依赖的其他中间件和基础能力也可以轻松的替换和扩展。 例如我们为 MQ、缓存、分布式锁、重试组件、延迟组件、分布式配置组件、SPI等定义类接口,使用者可以配置组件名,使用自己的组件。

所以你无需有以下顾虑

  1. 我们使用的MQ 是Kafka,memberclub万一使用的MQ是 rabbitmq,这怎么办?
  2. 我们有分布式ID服务,替换成本高怎么办?
  3. 我们有自己的分布式锁组件,替换成本高怎么办?
  4. 我们使用其他分布式配置中心,我们不使用apollo,替换成本高怎么办?

下图展示了,memberclub依赖的组件配置,在业务代码中并不依赖组件的具体实现类,而是接口,如果你需要替换,只需要在配置文件中换成你的组件名即可!业务代码不会受到一丝丝影响!

memberclub:
  infrastructure:
    config: apollo
    lock: redis
    feign:
      enabled: false
    id: redisson
    retry: redisson
    mq: rabbitmq
    order: local
    asset: local
    sku: local
    cache: redis
    usertag: redis
  extension:
    bootcheck: true

交易域的领域划分和领域能力

订单交易领域划分包括 购买域、履约域、售后域和结算域等。

购买域

购买域需提供提交订单、预览订单、取消订单的业务能力,需提供续费购买、自动续费、先享后付、不回本包退、随单搭售、直购、兑换码购买等多样化的购买能力。领域能力则包括会员开通单能力、库存能力、购买配额能力、会员新客能力等。

履约域

履约域需提供主单履约、主单逆向履约、周期履约的业务能力,领域能力上包括履约单管理、履约接单完单能力、履约拆合单能力、权益发放能力、周期发放能力等。

售后域

售后域需提供售后预览、售后提交的业务能力。领域能力上包括售后可退校验能力、售后金额计算能力、过期退能力、随单退、售后次数限额能力,支持在续费、自动续费、直购、搭售等购买场景的售后。

结算域

会员交易订单在多个时点需要进行结算,包括交易结算和离线收入报账,结算模块需提供支付完成、履约、退款、过期等业务变更时点的结算能力。

系统架构

业务能力和领域能力

系统设计时应区分业务能力和领域能力,业务能力是指系统对外部提供的业务能力,不可再细分,如购买域需提供购买预览、购买提单、取消等业务能力。领域能力则为实现该业务能力所必须的能力,如购买域在提单阶段需扣减商品库存、记录用户购买配额数据、记录会员新客标签、记录会员单等,这类系统能力视为领域能力。

为什么要区分业务能力和领域能力呢?

可编排的流程

业务中台要负责承接各类业务形态相似的业务系统,一般情况下业务能力是业务必选的能力,中台负责对外提供的标准 API(也可以由中台提供端到端的接入),而领域能力在不同的产品线上所需不同。如部分产品线不需要库存、购买配额等能力,不需要年卡等周期卡履约能力等。

业务中台如何抽象业务共性、隔离业务差异性、提供快速可靠的扩展机制,是中台建设的重点和难点。业界常见的做法是

1) 抽象共用的业务逻辑为领域能力。

2) 前瞻性的预置扩展点,业务通过插件进行差异化能力扩展

3) 通过流程引擎编排流程,实现流程的差异化配置,实现业务流程的可视化和扁平化。

扩展点插件

扩展点在业务中台中无处不在,这是因为业务中台要承接的业务太多,很难保证所有业务完全相同。而业务差异性部分又不能叠罗汉式堆叠在主流程中,因为这意味 影响点扩散导致业务隔离性差。即业务特性配置在主流程中,势必潜在影响其他业务。久而久之,系统必定到处是陷阱,难以梳理维护。 外加系统架构腐化后的破窗效应,会让后来者倾向于在屎山代码继续堆屎!连重构都变得困难,最终难以收场。

扩展点插件通过业务线和业务域两层路由,在运行时委托某一业务的插件执行业务逻辑,系统主流程依然保持简洁和扁平,改动其中一个业务,完全不会影响到其他业务,系统扩展性和隔离性大大增强!

状态驱动

在实现各个领域能力时,应该依托于领域模型的状态变更执行业务逻辑。如会员交易锁领域能力在预提单、提单成功、预取消、取消成功、履约和履约成功等各个业务状态下 实现锁的领域能力。

在购买、履约、售后等主流程中,各领域能力封装到流程节点中,由流程引擎负责编排执行。

模型驱动

会员C 端交易流程要解决以下问题:C端高并发低延迟、业务复杂、数据一致性要求高、资金安全等,因此应尽可能的保证 C 端系统流程设计的简洁。

如C 端在实现库存扣减、用户配额记录、年卡履约等领域能力时,应由商品模型驱动业务流程,而非 C 端根据不同条件决定是否 做某件事,尽可能简化 C 端业务逻辑。 商品模型应实现 BC端模型分离。

技术架构

在 memberclub 项目中你可以学习到

条件注入

为了提供更好的扩展点,memberclub 对各类基础组件、外部存储系统依赖均抽象了接口,不同接口实现类可通过 Spring 条件注入到系统。如你希望自己重写分布式锁组件,那么你可以上线分布式锁接口,将其注入到 Spring 中,就可以直接替换掉原有的分布式锁组件,无需改动原有代码。

在单元测试和standalone模式下,系统不应该依赖各类外部存储系统,因此通过抽象各个基础组件为通用接口,在不同的环境先可配置不同的实现类注入到 Spring,保证了系统在单测和 Standalone 模型下的独立运营。

分布式锁组件

系统提供了 本地组件和 Redis lua 组件。

public interface DistributeLock {

    boolean lock(String key, Long value, int timeSeconds);

    boolean unlock(String key, Long value);
}

通用日志组件

打印日志时,自动填充用户id和订单Id等通参,无需手动指定

原理参考 https://juejin.cn/post/7407275971902357558

重试组件

被标注了 Retryable 注解的方法,当抛出异常后,系统可自动重试。重试依然失败,失败请求将自动投递到延迟队列,进行分布式重试 。

@Retryable(maxTimes = 5, initialDelaySeconds = 1, maxDelaySeconds = 30, throwException = true)
@Override
public void process(AfterSaleApplyContext context) {
    try {
        extensionManager.getExtension(context.toBizScene(),
                AfterSaleApplyExtension.class).doApply(context);
    } catch (Exception e) {
        CommonLog.error("售后受理流程异常 context:{}", context, e);
        throw new AftersaleDoApplyException(AFTERSALE_DO_APPLY_ERROR, e);
    }
}

Spring 上下文静态类组件

ApplicationContextUtils 可以在Spring 启动后,任意地方通过静态方法获取到 Spring 上下文。确保任意地方获取上下文时,Spring已被加载到静态属性中。

延迟队列组件

延迟队列组件提供延迟事件触发能力,如异常重试场景往往需要延迟一段时间后再次重试,此时将请求投递到延迟队列可实现延迟重试。

系统实现了本地 DelayQueue 和 Redison 、Rabbitmq 延迟队列能力。

分布式 ID 组件

系统提供了本地 RandomUtils 和 Redisson 分布式 ID 组件,你可以接入基于雪花算法的分布式 ID 系统。

@ExtensionConfig(desc = "分布式 ID 生成扩展点", type = ExtensionType.COMMON, must = true)
public interface IdGenerator extends BaseExtension {

    public Long generateId(IdTypeEnum idType);
}

通用任务表触发组件

周期履约、结算过期、售后过期退等场景,均需要系统有一个指定时间大批量任务触发能力。通过抽象通用任务表,实现通用任务延迟触发能力。

mybatis-plus

集成 mybatis-plus,在数据模型更新时可通过 UpdateWrapper等由各业务线自行扩展,无需手动编写 SQL,扩展性更强!

同时系统实现了 insert ignore 批量插入能力。

sharding-jdbc

通过集成 sharding-jdbc 实现了多数据源的分库分表能力。 使用者自行定义分表规则即可

RabbitMQ接入和重试

集成了rabbitmq,并且基于死信队列实现了消息消费的延迟重试能力!

Redisson

集成 Redisson,使用其延迟队列和分布式 ID 能力。

Redis Lua

集成了 RedisTemplate,其中库存更新、用户标签写入更新、分布式锁部分实现通过 RedisLua 脚本实现。

Apollo接入

系统集成了 Apollo 作为配置中心,同时系统提供了配置中心的接口,并内置了本地Map和 Apollo 两种组件

public interface DynamicConfig {

    boolean getBoolean(String key, Boolean value);

    int getInt(String key, int value);

    long getLong(String key, long value);

    String getString(String key, String value);
}

内存数据库和单元测试

集成了 H2 内存数据库,在开发阶段使用 单元测试 profile 执行,访问内存数据库,不会污染测试环境数据库!

工程目录结构

memberclub                       # 主项目①pom.xml
├── starter                      # memberclub 的启东入口,Rpc/MQ/Http/Job等流量入口
├── common                       # Common 公共工具类
├── sdk                          # 会员领域能力 sdk
├── domain                       # 领域对象,主要包括 DO、DTO、VO、PO 等
├── plugin.demomember            # Demo会员(每个会员产品线独占一个 pom 工程)
├── infrastruce                  # 基础设置层,包括rpc下游/mq/redis/apollo/db等下游
详细说明
├── starter                      # 启动服务
│   ├── controller                       # Http 入口
│   ├── job                              # Job 入口
│   └── mq                               # MQ 流量入口
├── domain                       # 领域对象
│   ├── contants                         # 常量
│   ├── context                          # 流程引擎和领域服务的上下文对象
│   ├── dataobject                       # 数据对象 DO 等
│   ├── entity                           # 数据库实体类 PO
├── sdk                         # 会员领域能力以 sdk形式对各产品线提供
│   ├── common                           # sdk 公共类工具类如 Topic/配置中心等
│   ├── aftersale                        # 会员售后域(核心)
│   ├── config                           # 配置中心
│   ├── event                            # 会员交易事件领域能力(核心)
│   ├── inventory                        # 会员商品库存领域能力(核心)
│   ├── lock                             # 会员锁(核心)
│   └── memberorder                      # 会员单管理(核心)
│   └── membership                       # 会员资格域(核心)
│   └── newmember                        # 会员新客域
│   └── oncetask                         # 会员任务域
│   └── ordercenter                      # 订单中心域(防腐层)
│   └── perform                          # 会员履约域(核心)
│   └── prefinance                       # 会员预结算域
│   └── purchase                         # 会员购买域
│   └── quota                            # 会员配额域
│   └── sku                              # 会员商品域
│   └── usertag                          # 会员用户标签域
├── common                      # 会员 Common 公共工程,包括各类基础组价实现
│   ├── annotation                       # 常见注解
│   ├── extension                        # 扩展点引擎实现
│   ├── flow                             # 流程引擎实现
│   ├── log                              # 通用日志组件
│   ├── retry                            # 通用分布式重试组件
│   ├── util                             # 通用 Util 工具如 Spring 上下文工具类、加解密、集合类、周期计算、JSON 解析
├── infrastructure             # 基础设置层,包括rpc下游/mq/redis/apollo/db等下游
│   ├── assets                          # 下游资产服务防腐层和 资产SPI接口 
│   ├── cache                           # 缓存组件
│   ├── dynamic_config                  # 分布式配置中心组件
│   ├── id                              # 分布式 ID 组件
│   ├── lock                            # 分布式锁组件
│   ├── mapstruct                       # mapstruct 接口
│   ├── mq                              # MQ 接口(屏蔽了具体 MQ 接入方式,可独立替换)
│   └── mybatis                         # Mybatis dao 层
│   └── order                           # 订单中心防腐层
│   └── retry                           # 分布式重试组件
│   └── swagger                         # Swagger 配置
│   └── usertag                         # 会员用户标签组件
├── plugin.demomember          # Demo 会员业务特性
│   └── config                          # 会员配置表
│   └── perform                         # 会员履约域扩展点插件
│   └── aftersale                       # 会员售后域扩展点插件
│   └── prefinance                      # 会员预结算域扩展点插件
│   └── purchase                        # 会员购买域扩展点插件

技术选型

后端技术

技术 说明 官网
SpringBoot Web应用开发框架 https://spring.io/projects/spring-boot
MyBatis ORM框架 http://www.mybatis.org/mybatis-3/zh/index.html
RabbitMQ 消息队列 https://www.rabbitmq.com/
Redis 内存数据存储 https://redis.io/
Druid 数据库连接池 https://github.com/alibaba/druid
Lombok Java语言增强库 https://github.com/rzwitserloot/lombok
Hutool Java工具类库 https://github.com/looly/hutool
Swagger-UI API文档生成工具 https://github.com/swagger-api/swagger-ui

环境搭建

开发工具

工具 说明 官网
IDEA 开发IDE https://www.jetbrains.com/idea/download
Navicat 数据库连接工具 http://www.formysql.com/xiazai.html
Postman API接口调试工具 https://www.postman.com/
Typora Markdown编辑器 https://typora.io/

开发环境

工具 版本号 下载
JDK 1.8 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
MySQL 8.1.0 https://www.mysql.com/
Redis 7.0 https://redis.io/download
RabbitMQ 3.10.5 http://www.rabbitmq.com/download.html
Apollo - https://github.com/apolloconfig/apollo-quick-start

如何初始化

memberclub 在standalone模式下无需任何中间件即可启动,在集成测试环境默认依赖 mysql/redis/apollo/rabbitmq 等中间件。所以如果仅学习使用,可以选择独立启动模式,那么只需要1条命令就可以启动memberclub服务!

独立启动(不依赖其他中间件)

下载项目

git clone git@gitee.com:juejinwuyang/memberclub.git

启动 MemberClub 后端服务

MAC Linux

进入项目目录下

cd bin && ./starter.sh -e ut

-e ut 是指指定启动模式为 独立启动,不依赖mysql数据库、redis等。(方便学习和展示,实际业务使用应使用集成模式)

Windows

  1. mvn clean package -P ut -Dmaven.test.skip=true
  2. java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar memberclub.starter/target/memberclub-starter-ut.jar

-P ut 是指指定启动模式为 独立启动,不依赖mysql数据库、redis等。(方便学习和展示,实际业务使用应使用集成模式)

下载启动 H5项目

然后 git clone 下载memberclub H5项目,地址在 https://gitee.com/juejinwuyang/memberclub-buy-app

下载完成后,需要下载 HBuilderX IDE 启动H5项目。 HBuilderX 地址: https://www.dcloud.io/hbuilderx.html

选择工程,打开IDE 以后,点击运行-> 运行到浏览器。输入地址:http://localhost:8080/# img_1.png

效果展示

img.png

视频演示

集成测试环境下启动

安装 mysql

https://www.cnblogs.com/liyihua/p/12306159.html

初始化数据库

初始化SQL脚本的位置在: memberclub/memberclub.starter/src/main/resources/sql/initial.sql 在mysql client中通过 source执行sql脚本,如下所示

source memberclub/memberclub.starter/src/main/resources/sql/initial.sql 

以下命令初始化一些展示用的sku商品数据

source memberclub/memberclub.starter/src/main/resources/sql/init_demo_sku.sql 

该脚本会自动创建数据库和表。

安装 rabbitmq

brew install rabbitmq

启动rabbitmq

brew services start rabbitmq

安装redis

brew install redis

启动redis

brew services start redis

安装 Apollo(可选)

https://developer.aliyun.com/article/1369063

启动项目

MAC 和 Linux

memberclub项目根目录下

cd bin && ./starter.sh -e test

Windows

  1. mvn clean package -P test -Dmaven.test.skip=true
  2. java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar memberclub.starter/target/memberclub-starter-test.jar

调试单元测试

1. 先本地编译

使用mvn命令编译

mvn clean package -P ut

2 配置IDEA

路径 Settings -> Build, Execution, Deployment -> Compiler -> User-LOCAL VM Options

添加如下

-Djps.track.ap.dependencies=false

3. 调试单元测试

从TestDemoMember 单测类入手,通过断点调试,深入学习。

加入社区

我们鼓励用户加入 MemberClub 的开源社区,共同参与到产品的开发和改进中来。无论是提交 Bug 报告、功能请求还是代码贡献,都是我们社区宝贵的一部分。

您可以通过 https://gitee.com/juejinwuyang/memberclub/issues 提交问题或意见。

技术博客

https://juejin.cn/user/1732486057428952/posts

Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

简介

memberclub 可实现一天时间快搭建一套订单交易系统。 轻量级完全开源的交易引擎,以SDK方式对外提供通用的交易能力,能让开发者像搭积木方式,从0到1,快速构建一个新的电商交易系统! 包含交易提单、履约、售后、结算、库存管理、用户配额管理等模块,非常适合用来学习如何构建电商业务中台! 展开 收起
Java 等 3 种语言
Apache-2.0
取消

发行版

暂无发行版

贡献者 (5)

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/juejinwuyang/memberclub.git
git@gitee.com:juejinwuyang/memberclub.git
juejinwuyang
memberclub
memberclub订单交易引擎
master

搜索帮助