7.0架构及规范
工程结构
| 工程名 | 说明 | 默认端口号 | 
|---|---|---|
| b2b2c | 主工程(父) | 无 | 
| config-server | 配置中心 | 8888 | 
| framework | 基础框架 | 无 | 
| javashop-core | 核心业务 | 无 | 
| base-api | 基础业务api | 7000 | 
| passport | 用户认证中心 | 7001 | 
| buyer-api | 买家api | 7002 | 
| seller-api | 商家api | 7003 | 
| manager-api | 管理中心api | 7004 | 
| consumer | 消费者服务 | 无 | 
包名
工程包名规范
| 项 | 包名 | 
|---|---|
| 主包名 | com.enation.app.javashop | 
| framework | <mainpackage>.framework | 
| javashop-core | <mainpackage>.core | 
| buyer-api | <mainpackage>.buyer.api | 
| seller-api | <mainpackage>.seller.api | 
| manager-api | <mainpackage>.manager.api | 
| consumer | <mainpackage>.consumer | 
| ucenter | <mainpackage>.ucenter | 
javashop-core 包名规范
| 业务 | 包名 | 
|---|---|
| 主包名 | com.enation.app.javashop.core | 
| 会员 | <mainpackage>.member | 
| 店铺 | <mainpackage>.shop | 
| 商品 | <mainpackage>.goods | 
| 商品全文检索 | <mainpackage>.goodssearch | 
| 交易 | <mainpackage>.trade | 
| 支付 | <mainpackage>.payment | 
| 售后 | <mainpackage>.aftersale | 
| 结算 | <mainpackage>.orderbill | 
| 统计 | <mainpackage>.statistics | 
API路径规范
| 项 | 包名 | 
|---|---|
| 会员 | /member/* | 
| 店铺 | /shop/* | 
| 商品 | /goods/* | 
| 交易 | /trade/* | 
| 支付 | /payment/* | 
| 售后 | /aftersale/* | 
| 结算 | /orderbill/* | 
| 统计 | /statistics/* | 
注:在每个api服务中,上述业务路径是相同的
异常规范
根据http状态判断业务是否正常
如果正常要求返回对象的Json
如果有异常返回异常的json
异常Json格式规范
{
    "code": "100",
    "message": "无权访问",
    "data": []
}
| 项 | 类型 | 是否必须 | 说明 | 
|---|---|---|---|
| code | 字符 | 是 | 错误码,详见下面错误码规范 | 
| message | 字符 | 是 | 错误信息 | 
| data | 对象或数组 | 否 | 可能需要的数据 | 
code 规范
三位数字
每个模块code规范:
| 业务 | 规范 | 错误码类 | 
|---|---|---|
| 系统级别 | 000 - 099 | |
| 会员 | 100 - 199 | MemberErrorCode | 
| 店铺 | 200 - 299 | ShopErrorCode | 
| 商品 | 300 - 399 | GoodsErrorCode | 
| 交易 | 400 - 499 | TradeErrorCode | 
| 支付 | 500 - 599 | PaymentErrorCode | 
| 售后 | 600 - 699 | AftersaleErrorCode | 
| 结算 | 700 - 799 | OrderBillErrorCode | 
| 统计 | 800 - 899 | StatisticsErrorCode | 
| 系统 | 900 - 999 | SystemErrorCode | 
每个模块在开发过程中应记录 code 的说明在这里:《错误码对照表》
异常类
系统内置了一些异常类供开发者处理异常
统一定义在:com.enation.app.javashop.framework.exception中
| 异常 | 说明 | 
|---|---|
| NoPermissionException | 无权限异常,比如试图更新一个别人的账号的密码 | 
| ResourceNotFoundException | 资源找不到异常 | 
| ServiceException | 其它业务异常 | 
其中ServiceException 供业务类处理异常使用
throw new ServiceException(GoodsErrorCode.E300.code(),"消息");
可以通过设置其data 属性来向前端输出 error json中的data
List list  = ...
throw new ServiceException(GoodsErrorCode.E300.code(),"消息",list);
可以通过设置其 status_code 来改变http 在status code:
ServiceException e  = new ServiceException(GoodsErrorCode.E300.code(),"消息");
e.setStatus_code(HttpStatus.BAD_REQUEST);
throw e;
参数规范
1.严格遵守《Javashop开发规范》
2.应使用阿里巴巴代码规约扫描插件进行扫描,做到新增的类,全部符合扫描通过
3.前端向服务器端传参使用蛇形规范如:
?user_id=1&user_name=wangfeng
注:Javashop7.0实现了自动将蛇形参数转化为驼峰参数的机制,接收上述参数的controller用驼峰即可:
public String  login(Integer userId,String userName)
4.服务器端向前端输出json参数使用蛇形规范,如:
{
  "brand_id": 0,
  "goods_name": "string"
  "image_list":[]
}
5.客户端向服务器端传递分页参数规范为:
page_no=<当前页号>&page_size=<分页大小>
6.服务器端向客户端口传输分页结果规范为:
{
  "data": [
    {.. }
  ],
  "data_total": 0,
  "page_no": 0,
  "page_size": 0
}
7.带有分页的api 1)分页参数命名必须使用pageNo(页码)和pageSize(每页显示数量) 2)参数类型必须是引用类型Integer 3)不能使用封装对象接收分页参数
多数据源的使用
daoSupport和对数据源对应关系
| 业务 | 数据源 | 事务 | 涵盖业务 | 
|---|---|---|---|
| 会员 | memberDaoSupport | memberTransactionManager | 会员、卖家、店铺 | 
| 系统 | systemDaoSupport | systemTransactionManager | 系统相关 | 
| 商品 | goodsDaoSupport | goodsTransactionManager | 商品、sku、品牌、分类 | 
| 交易 | tradeDaoSupport | tradeTransactionManager | 交易、订单、售后、结算 | 
| 统计 | sssDaoSupport | sssTransactionManager | 统计业务 | 
数据源配置规则
以商品及订单数据源举例(使用了相同的用户名和密码)
spring:        
  datasource:                
    url:    jdbc:mysql://localhost:3306/v641? useUnicode=true&characterEncoding=utf8&autoReconnect=true                
    username:    root                
    password:    123456                
    driver-class-name:    com.mysql.jdbc.Driver                
    druid:                        
      goods:                                
      url:    jdbc:mysql://localhost:3306/goods
      trade:                                
      url:    jdbc:mysql://localhost:3306/trade
#在这里可以继续配置其它数据源
其中spring.datasource的配置是公用配置部分:
    spring:
    datasource:
        url:jdbc:mysql://localhost:3306/v641?useUnicode=true&characterEncoding=utf8&autoReconnect=true
        username:root
        password:123456
        driver-class-name:com.mysql.jdbc.Driver
    druid:
        goods:
          url:jdbc:mysql://localhost:3306/goods
          username:goodsdbname
          password:goodspwd
注:如果不进行数据库分离,则只需要配置spring.datasource即可。
配置中心使用规则
- 开发时启动本地配置中心config-server。
 - 开发环境可以指向配置本地仓储,线上仓储名为config,可以下载到本地,作为配置文件的本地仓储。
 - 配置本地仓储,需要进行git add . 和git commit -m操作,但不可push到线上。
 
详情可参照教程:配置中心教程。
验权机制
7.0全部采用token验权,
其中seller-api要求的是seller权限
buyer-api要求提buyer的权限
manager-api要求的是 manager的权限
分为开发和生产环境两种
环境的声明在工程的bootstrap.yml中:
spring:
  ...
  cloud:
    config:
      uri: http://localhost:8888
      profile: dev
其中的profile标明了开发环境(dev)还是生产环境(prod)
开发环境
开发环境为了便于开发,直接在header中传递token:
Authorization:Bearer yourtoken
生产环境
生产环境为了防止重放攻击,需要传递如下四个参数:
| 参数 | 说明 | 
|---|---|
| uid | 用户id | 
| timestamp | 时间戳,精确到秒 | 
| nonce | 随机数,6位数字 | 
| sign | md5(uid+timestamp+nonce+token) | 
token的获取
除使用统一登录api获取token外,
还可以使用 TokenCreator 生成token
当前的获取
使用UserContext获取:
//获取买家
Buyer buyer  = UserContext.getBuyer();
//获取卖家
Seller seller =  UserContext.getSeller();