7.0架构及规范
工程结构
工程名 | 说明 | 默认端口号 |
---|---|---|
b2b2c | 主工程(父) | 无 |
config-server | 配置中心 | 8888 |
framework | 基础框架 | 无 |
shoptnt-core | 核心业务 | 无 |
base-api | 基础业务api | 7000 |
buyer-api | 买家api | 7002 |
seller-api | 商家api | 7003 |
manager-api | 管理中心api | 7004 |
consumer | 消费者服务 | 无 |
包名
工程包名规范
项 | 包名 |
---|---|
主包名 | cn.shoptnt |
framework | <mainpackage>.framework |
shoptnt-core | <mainpackage>.core |
buyer-api | <mainpackage>.buyer.api |
seller-api | <mainpackage>.seller.api |
manager-api | <mainpackage>.manager.api |
consumer | <mainpackage>.consumer |
ucenter | <mainpackage>.ucenter |
shoptnt-core 包名规范
业务 | 包名 |
---|---|
主包名 | cn.shoptnt.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 的说明在这里:《错误码对照表》
异常类
系统内置了一些异常类供开发者处理异常
统一定义在:cn.shoptnt.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.严格遵守《shoptnt开发规范》
2.应使用阿里巴巴代码规约扫描插件进行扫描,做到新增的类,全部符合扫描通过
3.前端向服务器端传参使用蛇形规范如:
?user_id=1&user_name=wangfeng
注:shoptnt7.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)不能使用封装对象接收分页参数
配置中心使用规则
- 开发时启动本地配置中心config-server。
- 开发环境可以指向配置本地仓储,线上仓储名为config,可以下载到本地,作为配置文件的本地仓储。
- 配置本地仓储,需要进行git add . 和git commit -m操作,但不可push到线上。
详情可参照教程:配置中心教程。
验权机制
7.0全部采用token验权,
其中seller-api要求的是seller权限
buyer-api要求提buyer的权限
manager-api要求的是 manager的权限
为了便于开发,直接在header中传递token:
Authorization:Bearer yourtoken
在配置文件中可设置token加密秘钥
shoptnt:
#token加密秘钥,请务必更换此词串,且注意保密
token-secret: tokensecret123456
token的获取
详情请参考基于Token机制鉴权架构
注:以下是生成无限期token的方法,测试的时候使用更方便
如果要生成管理端的token需要增加账号对应的角色
public void test() {
//新建买家用户角色对象
Buyer buyer = new Buyer();
//设置用户ID
buyer.setUid(用户uid);
//设置用户名称
buyer.setUsername("用户名");
//设置uuid
buyer.setUuid("用户uuid");
JwtTokenCreater tokenCreater = new JwtTokenCreater("token的秘钥");
tokenCreater.setAccessTokenExp(Integer.MAX_VALUE);
tokenCreater.setRefreshTokenExp(Integer.MAX_VALUE);
//创建Token
Token token = tokenCreater.create(buyer);
System.out.println(token.getAccessToken());
}
当前用户的获取
使用UserContext获取:
//获取买家
Buyer buyer = UserContext.getBuyer();
//获取卖家
Seller seller = UserContext.getSeller();
//获取管理员
Admin admin = AdminUserContext.getAdmin();
获取request( any where)
使用ThreadContextHolder获取:
HttpServletRequest request = ThreadContextHolder.getHttpRequest();
获取spring 上下文
使用ApplicationContextHolder获取:
ApplicationContextHolder.getBean("beanName");