# shop-cloud **Repository Path**: mmm666/shop-cloud ## Basic Information - **Project Name**: shop-cloud - **Description**: 基于Spring Cloud构建的一个商城项目,包括前端,后端和h5应用,作为微服务架构的模板项目。基于SpringBoot2.x、SpringCloud Hoxton.SR6并采用前后端分离的企业级微服务敏捷开发系统架构。并引入组件化的思想实现高内聚低耦合,[ 微信 + 支付宝 + 百度 + 头条 ] 小程序 + APP + 公众号 + PC + H5 项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于oauth2的jwt和无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,提供应用管理方便第三方系统接入;同时还集合各种微服务治理功能和监控功能。模块包括: 企业级的认证系统、开发平台、应用监控、慢sql监控、统一日志、单点登录、Redis分布式高速缓存、接口限流、接口统一加解密、配置中心、分布式任务调度、分布式事务、分布式链路追踪、接口文档、代码生成等等 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2020-10-20 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 开发说明 本文档需要有一定基础的人看,需要具备 SpringCloud + SringBoot 开发基础、Mysql基础、Mongodb基础、Redis基础. 本项目前后端完全分离,使用JSON数据进行前后端数据交互,接口文档使用Swagger2文档. #### 项目开发技术说明: > 核心包: Spring Boot - 项目基于**Spring Boot Start Web**核心包,版本号: 2.3.1.RELEASE. > > 微服务架构基于: **Spring Cloud**,版本号: Hoxton.SR6 > > 使用: **Eureka** + **Spring Cloud Config** + **Open Feign** + **TX-LCN分布式事务** + **Zipkin链路追踪** > > 面向切面: 项目中面向切面(AOP)使用 **SpringBoot 拦截器**. > > 缓存: 前期使用单机架构**Redis**, 后期业务上数据量提高可做Redis集群. > > 数据库(DB): **MYSQL** - 版本号: 8.0.21 > > 持久化框架: SpringBoot 集成 **MyBatis** - 版本号: 1.3.2 > > 持久化数据分页框架: **PageHelper** - 版本号: 1.2.5 > > 数据库连接池: **Druid** - 版本号: 1.1.22 > > 接口文档: swagger : **knife4j-spring-ui** > > 分布式锁: 使用 **Redisson** > > JSON解析器: 阿里JSON解析器**fastjson** - 版本号: 1.2.73 > > **权限框架:** > > > 管理后台使用 **Spring Security** 安全认证 > > 前端接口(APP/H5) 使用**jwt** > #### 目录说明 ``` 等待完善。。。。。 ``` #### 微服务启动顺序 ``` 1. shop-eureka-server ---> ShopEurekaServerApplication 注册中心 访问: http://127.0.0.1:11111 查看eureka服务注册情况 2. shop-config-server ---> ConfigApplication 配置中心 3. shop-tx ---> TxApplication 分布式事务控制中心 需要创建 "shop_tx" 数据库(doc/sql/shop-tx/TX-LCN分布式事务-INIT.sql), 初始化sql. 更改配置文件中tx-lcn mysql连接信息: shop-config/shop-tx/shop-tx-dev.properties, shop-config/shop-oms/shop-oms-dev.properties, shop-config/shop-pms/shop-pms-dev.properties 访问:http://127.0.0.1:7970/admin/index.html#/login 进入管理后台 默认密码是:codingapi 4. shop-pms ---> pms-server ---> PMSApplication 商品微服务 5. shop-oms ---> oms-server ---> OMSApplication 订单微服务 6. shop-gateway ---> GatewayApplication 统一网关 (使用 GateWay,因为gateway集成的SpringWebflux) 访问: http://127.0.0.1:5555/order/order/orderInfo/13 通过 Gateway 网关请求订单微服务 ``` #### 接口规范: > **1.协议** > > > API与用户的通信协议,总是使用HTTPS协议,确保交互数据的传输安全。 > > **2.安全** > > > 为了保证接口接收到的数据不是被篡改以及防止信息泄露造成损失,对敏感数据进行加密及签名。 > > > **数据加密** > > api接口请求参数一律采用RSA进行加解密,在客户端使用公钥对请求参数进行加密,在服务端使用对数私钥据进行解密,防止信息泄露。 > > > **签名** > > 为了防止请求数据在网络传输过程中被恶意篡改,对所有非查询接口增加数字签名,签名原串为对请求参数进行自然排序,通过私钥加签后放入sign参数中。 > > > **时间戳** > > api接口中增加时间戳timestamp字段,作用:固定时间范围内,减少同一请求被暴力调用的次数。 > > **3.API版本控制** > > API的版本号统一放入URL。 > > https://api.example.com/v{n}/ --- v{n}n代表版本号,分为整形和浮点型 > > 整形版本号:大功能版本发布形式;具有当前版本状态下的所有API接口,例如:v1,v2 > > 浮点型:为小版本号,只具备补充api的功能,其他api都默认调用大版本号的API,例如v1.1,v1.2 > > **4.API路径规则** > > > 在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词。名词尽量与数据库表格名对应。 > > > 例子: > > > https://api.example.com/v1/products > > https://api.example.com/v1/users > > https://api.example.com/v1/employees > > **5.HTTP请求方式** > > > 对于资源的具体操作类型,由HTTP动词表示。 > > 常用的HTTP动词由下面四个(括号里是对应的SQL命令)。 > > GET(SELECT):从服务器取出资源。 > > POST(CREATE):在服务器新建一个资源。 > > PUT(UPDATE):在服务器更新资源。 > > DELETE(DELETE):从服务器删除资源。 > > > 例子: > > > GET/product:列出所有商品 > > POST/product:新建一个商品 > > GET/product/ID:获取某个指定商品的信息 > > PUT/product/ID:更新某个指定商品的信息 > > DELETE/product/ID:删除某个商品 > > GET/product/ID/purchase:列出某个指定商品的所有投资者 > > GET/product/ID/purchase/ID:获取某个指定商品的指定投资者信息 > > **6.请求数据** > > 公共请求参数 > > > > POST 请求: 接受json格式请求参数 > > 使用注册 @RequestBody ,需要单独封装dto,进行接受请求参数 ```json { "request": { "name": "ddcat", "age": 18 } } ``` > > 示例: ``` @ApiOperation("增加币种") @AnonymousAccess @GetMapping("/add") AjaxResult add(@RequestBody CoinDTO coin){ if(coin == null){ return AjaxResult.error("币种信息不能为空!"); } // 下面执行把dto转为实体类然后插入业务.... return AjaxResult.success("新增成功"); } ``` > > > > GET 请求:以 key=value 接受请求参数 > > 使用注解 @RequestParam 标注每个接口参数 ``` https://ip:port/api/v1/coin/info?id=129&value=wawd ``` > > 示例: ``` @ApiOperation("查询币种详情") @AnonymousAccess @GetMapping("/info") AjaxResult info(@RequestParam(value = "id", required = false) Long id){ if(id == null){ return AjaxResult.error("查询币种不能为空,请稍后重试!"); } // 下面执行查询业务.... Coin coin = new Coin(); return AjaxResult.success(coin); } ```