From 83a5b921aa2972c03738e7f982cd15fcd9ca7367 Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Tue, 27 Aug 2024 14:36:29 +0800 Subject: [PATCH] =?UTF-8?q?feat(master):=20=E8=B4=A6=E5=8F=B7=E5=BE=AE?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=AE=8C=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 账号微服务, 完成开发 --- .../SpringCloud项目介绍.md | 3 +- .../README-SpringCloud-Gateway.md | 2 +- .../pic/用户账户微服务总设计.png | Bin 0 -> 109148 bytes .../pic/账户微服务在业务中的位置.png | Bin 0 -> 61984 bytes .../pom.xml | 98 ++++++++++++++++ .../java/org/example/AccountApplication.java | 20 ++++ .../example/controller/AddressController.java | 58 +++++++++ .../example/controller/BalanceController.java | 40 +++++++ .../org/example/dao/EcommerceAddressDao.java | 17 +++ .../org/example/dao/EcommerceBalanceDao.java | 13 +++ .../main/java/org/example/entity/Address.java | 106 +++++++++++++++++ .../main/java/org/example/entity/Balance.java | 53 +++++++++ .../org/example/service/IAddressService.java | 31 +++++ .../org/example/service/IBalanceService.java | 21 ++++ .../service/impl/AddressServiceImpl.java | 110 ++++++++++++++++++ .../service/impl/BalanceServiceImpl.java | 76 ++++++++++++ .../src/main/resources/bootstrap.yml | 67 +++++++++++ .../main/resources/http/account-address.http | 43 +++++++ .../main/resources/http/account-balance.http | 14 +++ .../resources/sql/t_ecommerce_address.sql | 13 +++ .../resources/sql/t_ecommerce_balance.sql | 10 ++ .../org/example/AccountApplicationTest.java | 19 +++ .../example/service/AddressServiceTest.java | 76 ++++++++++++ .../example/service/BalanceServiceTest.java | 43 +++++++ .../java/org/example/service/BaseTest.java | 31 +++++ .../用户账户微服务.md | 80 +++++++++++++ .../电商-授权鉴权服务.md | 23 +++- .../pom.xml | 4 + .../README.md | 6 + .../pom.xml | 51 ++++++++ .../example/conf/DevProtocolWebMvcConfig.java | 44 +++++++ .../java/org/example/conf/SwaggerConfig.java | 56 +++++++++ .../org/example/filter/AccessContext.java | 25 ++++ .../filter/LoginUserInfoInterceptor.java | 84 +++++++++++++ .../main/java/org/example/package-info.java | 1 + .../README.md | 6 + .../pom.xml | 52 +++++++++ .../java/org/example/account/AddressInfo.java | 80 +++++++++++++ .../java/org/example/account/BalanceInfo.java | 23 ++++ .../java/org/example/account/UserAddress.java | 32 +++++ .../main/java/org/example/common/TableId.java | 32 +++++ .../example/goods/DeductGoodsInventory.java | 23 ++++ .../java/org/example/goods/GoodsInfo.java | 80 +++++++++++++ .../org/example/goods/SimpleGoodsInfo.java | 33 ++++++ .../main/java/org/example/package-info.java | 1 + pom.xml | 3 + 46 files changed, 1700 insertions(+), 3 deletions(-) create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/pic/用户账户微服务总设计.png create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/pic/账户微服务在业务中的位置.png create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/pom.xml create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/AccountApplication.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/controller/AddressController.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/controller/BalanceController.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/dao/EcommerceAddressDao.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/dao/EcommerceBalanceDao.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/entity/Address.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/entity/Balance.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/IAddressService.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/IBalanceService.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/impl/AddressServiceImpl.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/impl/BalanceServiceImpl.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/bootstrap.yml create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/http/account-address.http create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/http/account-balance.http create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/sql/t_ecommerce_address.sql create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/sql/t_ecommerce_balance.sql create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/AccountApplicationTest.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/AddressServiceTest.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/BalanceServiceTest.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/BaseTest.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/用户账户微服务.md create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/README.md create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/pom.xml create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/conf/DevProtocolWebMvcConfig.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/conf/SwaggerConfig.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/filter/AccessContext.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/filter/LoginUserInfoInterceptor.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/package-info.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/README.md create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/pom.xml create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/AddressInfo.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/BalanceInfo.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/UserAddress.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/common/TableId.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/DeductGoodsInventory.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/GoodsInfo.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/SimpleGoodsInfo.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/package-info.java diff --git a/dev-protocol-springcloud/SpringCloud项目介绍.md b/dev-protocol-springcloud/SpringCloud项目介绍.md index 486c1de..a944c0c 100644 --- a/dev-protocol-springcloud/SpringCloud项目介绍.md +++ b/dev-protocol-springcloud/SpringCloud项目介绍.md @@ -22,9 +22,10 @@ ## 通用工程模块 +- 通用服务 - [身份拦截] + - - 授权、鉴权中心微服务 - [dev-protocol-springcloud-project-authority-center](dev-protocol-springcloud-project-authority-center) - - 用户账户微服务 - 商品微服务 diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/README-SpringCloud-Gateway.md b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/README-SpringCloud-Gateway.md index ab4a8fb..7cf529e 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-gateway/README-SpringCloud-Gateway.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-gateway/README-SpringCloud-Gateway.md @@ -78,7 +78,7 @@ "name": "Path" } ], - "uri": "lb://dev-protocol-spring-cloud-nacos" + "uri": "lb://dev-protocol-spring-cloud-nacos", "filters": [ { "name": "HeaderToken" diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/pic/用户账户微服务总设计.png b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/pic/用户账户微服务总设计.png new file mode 100644 index 0000000000000000000000000000000000000000..649ba51fd8c9e058d685c1f278319fe8cd529eb3 GIT binary patch literal 109148 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∨Epq;^900C--cc7e8Thm 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 T{$Gy&0WOG&wsM)GRq+1+`@>}w literal 0 HcmV?d00001 diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/pic/账户微服务在业务中的位置.png b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/pic/账户微服务在业务中的位置.png new file mode 100644 index 0000000000000000000000000000000000000000..560bc34810d51523a4671f824adc8e2542f37d90 GIT binary patch literal 61984 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 + + 4.0.0 + + org.example + dev-protocol + 1.0-SNAPSHOT + ../../pom.xml + + + dev-protocol-springcloud-project-account-service + + dev-protocol-springcloud-project-account-service + 账户服务 + jar + + + 8 + 8 + UTF-8 + + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + org.springframework.cloud + spring-cloud-starter-zipkin + + + org.springframework.kafka + spring-kafka + 2.5.0.RELEASE + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + mysql + mysql-connector-java + 8.0.12 + runtime + + + org.example + dev-protocol-springcloud-project-service-config + 1.0-SNAPSHOT + + + org.example + dev-protocol-springcloud-project-service-sdk + 1.0-SNAPSHOT + + + org.apache.commons + commons-lang3 + 3.12.0 + + + org.apache.commons + commons-collections4 + 4.4 + + + + + + ${artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/AccountApplication.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/AccountApplication.java new file mode 100644 index 0000000..d3a87fe --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/AccountApplication.java @@ -0,0 +1,20 @@ +package org.example; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +/** + *

用户账户微服务启动入口

+ * 127.0.0.1:8003/dev-protocol-springcloud-project-account-service/swagger-ui.html 原生的地址信息 + * 127.0.0.1:8003/dev-protocol-springcloud-project-account-service/doc.html 美化之后的地址信息 + * */ +@EnableJpaAuditing +@SpringBootApplication +@EnableDiscoveryClient +public class AccountApplication { + public static void main(String[] args) { + SpringApplication.run(AccountApplication.class, args); + } +} \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/controller/AddressController.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/controller/AddressController.java new file mode 100644 index 0000000..6e45322 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/controller/AddressController.java @@ -0,0 +1,58 @@ +package org.example.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.example.account.AddressInfo; +import org.example.common.TableId; +import org.example.service.IAddressService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + *

用户地址服务 Controller

+ * */ +@Api(tags = "用户地址服务") +@Slf4j +@RestController +@RequestMapping("/address") +public class AddressController { + + private final IAddressService addressService; + + public AddressController(IAddressService addressService) { + this.addressService = addressService; + } + + // value 是简述, notes 是详细的描述信息 + @ApiOperation(value = "创建", notes = "创建用户地址信息", httpMethod = "POST") + @PostMapping("/create-address") + public TableId createAddressInfo(@RequestBody AddressInfo addressInfo) { + return addressService.createAddressInfo(addressInfo); + } + + @ApiOperation(value = "当前用户", notes = "获取当前登录用户地址信息", httpMethod = "GET") + @GetMapping("/current-address") + public AddressInfo getCurrentAddressInfo() { + return addressService.getCurrentAddressInfo(); + } + + @ApiOperation(value = "获取用户地址信息", + notes = "通过 id 获取用户地址信息, id 是 Address 表的主键", + httpMethod = "GET") + @GetMapping("/address-info") + public AddressInfo getAddressInfoById(@RequestParam Long id) { + return addressService.getAddressInfoById(id); + } + + @ApiOperation(value = "获取用户地址信息", + notes = "通过 TableId 获取用户地址信息", httpMethod = "POST") + @PostMapping("/address-info-by-table-id") + public AddressInfo getAddressInfoByTablesId(@RequestBody TableId tableId) { + return addressService.getAddressInfoByTableId(tableId); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/controller/BalanceController.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/controller/BalanceController.java new file mode 100644 index 0000000..a344f56 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/controller/BalanceController.java @@ -0,0 +1,40 @@ +package org.example.controller; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.example.account.BalanceInfo; +import org.example.service.IBalanceService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

用户余额服务 Controller

+ * */ +@Api(tags = "用户余额服务") +@Slf4j +@RestController +@RequestMapping("/balance") +public class BalanceController { + + private final IBalanceService balanceService; + + public BalanceController(IBalanceService balanceService) { + this.balanceService = balanceService; + } + + @ApiOperation(value = "当前用户", notes = "获取当前用户余额信息", httpMethod = "GET") + @GetMapping("/current-balance") + public BalanceInfo getCurrentUserBalanceInfo() { + return balanceService.getCurrentUserBalanceInfo(); + } + + @ApiOperation(value = "扣减", notes = "扣减用于余额", httpMethod = "PUT") + @PutMapping("/deduct-balance") + public BalanceInfo deductBalance(@RequestBody BalanceInfo balanceInfo) { + return balanceService.deductBalance(balanceInfo); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/dao/EcommerceAddressDao.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/dao/EcommerceAddressDao.java new file mode 100644 index 0000000..acb1baa --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/dao/EcommerceAddressDao.java @@ -0,0 +1,17 @@ +package org.example.dao; + +import org.example.entity.Address; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +/** + *

EcommerceAddress Dao 接口定义

+ * */ +public interface EcommerceAddressDao extends JpaRepository { + + /** + *

根据 用户 id 查询地址信息

+ * */ + List
findAllByUserId(Long userId); +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/dao/EcommerceBalanceDao.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/dao/EcommerceBalanceDao.java new file mode 100644 index 0000000..d69944e --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/dao/EcommerceBalanceDao.java @@ -0,0 +1,13 @@ +package org.example.dao; + +import org.example.entity.Balance; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + *

Balance Dao 接口定义

+ * */ +public interface EcommerceBalanceDao extends JpaRepository { + + /** 根据 userId 查询 EcommerceBalance 对象 */ + Balance findByUserId(Long userId); +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/entity/Address.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/entity/Address.java new file mode 100644 index 0000000..4f097d3 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/entity/Address.java @@ -0,0 +1,106 @@ +package org.example.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.example.account.AddressInfo; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +/** + *

用户地址表实体类定义

+ * */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@EntityListeners(AuditingEntityListener.class) +@Table(name = "t_dev_protocol_cloud_address") +public class Address { + + /** 自增主键 */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Long id; + + /** 用户 id */ + @Column(name = "user_id", nullable = false) + private Long userId; + + /** 用户名 */ + @Column(name = "username", nullable = false) + private String username; + + /** 电话 */ + @Column(name = "phone", nullable = false) + private String phone; + + /** 省 */ + @Column(name = "province", nullable = false) + private String province; + + /** 市 */ + @Column(name = "city", nullable = false) + private String city; + + /** 详细地址 */ + @Column(name = "address_detail", nullable = false) + private String addressDetail; + + /** 创建时间 */ + @CreatedDate + @Column(name = "create_time", nullable = false) + private Date createTime; + + /** 更新时间 */ + @LastModifiedDate + @Column(name = "update_time", nullable = false) + private Date updateTime; + + /** + *

根据 userId + AddressItem 得到 Address

+ * */ + public static Address to(Long userId, AddressInfo.AddressItem addressItem) { + + Address ecommerceAddress = new Address(); + + ecommerceAddress.setUserId(userId); + ecommerceAddress.setUsername(addressItem.getUsername()); + ecommerceAddress.setPhone(addressItem.getPhone()); + ecommerceAddress.setProvince(addressItem.getProvince()); + ecommerceAddress.setCity(addressItem.getCity()); + ecommerceAddress.setAddressDetail(addressItem.getAddressDetail()); + + return ecommerceAddress; + } + + /** + *

将 Address 对象转成 AddressInfo

+ * */ + public AddressInfo.AddressItem toAddressItem() { + + AddressInfo.AddressItem addressItem = new AddressInfo.AddressItem(); + + addressItem.setId(this.id); + addressItem.setUsername(this.username); + addressItem.setPhone(this.phone); + addressItem.setProvince(this.province); + addressItem.setCity(this.city); + addressItem.setAddressDetail(this.addressDetail); + addressItem.setCreateTime(this.createTime); + addressItem.setUpdateTime(this.updateTime); + + return addressItem; + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/entity/Balance.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/entity/Balance.java new file mode 100644 index 0000000..7225a32 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/entity/Balance.java @@ -0,0 +1,53 @@ +package org.example.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; + +/** + *

用户账户余额表实体类定义

+ * */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@Entity +@EntityListeners(AuditingEntityListener.class) +@Table(name = "t_dev_protocol_cloud_balance") +public class Balance { + + /** 自增主键 */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Long id; + + /** 用户 id */ + @Column(name = "user_id", nullable = false) + private Long userId; + + /** 账户余额 */ + @Column(name = "balance", nullable = false) + private Long balance; + + /** 创建时间 */ + @CreatedDate + @Column(name = "create_time", nullable = false) + private Date createTime; + + /** 更新时间 */ + @LastModifiedDate + @Column(name = "update_time", nullable = false) + private Date updateTime; +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/IAddressService.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/IAddressService.java new file mode 100644 index 0000000..01894cc --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/IAddressService.java @@ -0,0 +1,31 @@ +package org.example.service; + + +import org.example.account.AddressInfo; +import org.example.common.TableId; + +/** + *

用户地址相关服务接口定义

+ * */ +public interface IAddressService { + + /** + *

创建用户地址信息

+ * */ + TableId createAddressInfo(AddressInfo addressInfo); + + /** + *

获取当前登录的用户地址信息

+ * */ + AddressInfo getCurrentAddressInfo(); + + /** + *

通过 id 获取用户地址信息, id 是 Address 表的主键

+ * */ + AddressInfo getAddressInfoById(Long id); + + /** + *

通过 TableId 获取用户地址信息

+ * */ + AddressInfo getAddressInfoByTableId(TableId tableId); +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/IBalanceService.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/IBalanceService.java new file mode 100644 index 0000000..300ebab --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/IBalanceService.java @@ -0,0 +1,21 @@ +package org.example.service; + + +import org.example.account.BalanceInfo; + +/** + *

用于余额相关的服务接口定义

+ * */ +public interface IBalanceService { + + /** + *

获取当前用户余额信息

+ * */ + BalanceInfo getCurrentUserBalanceInfo(); + + /** + *

扣减用户余额

+ * @param balanceInfo 代表想要扣减的余额 + * */ + BalanceInfo deductBalance(BalanceInfo balanceInfo); +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/impl/AddressServiceImpl.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/impl/AddressServiceImpl.java new file mode 100644 index 0000000..1fc0dd6 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/impl/AddressServiceImpl.java @@ -0,0 +1,110 @@ +package org.example.service.impl; + +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.example.account.AddressInfo; +import org.example.common.TableId; +import org.example.dao.EcommerceAddressDao; +import org.example.entity.Address; +import org.example.filter.AccessContext; +import org.example.service.IAddressService; +import org.example.vo.LoginUserInfo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

用户地址相关服务接口实现

+ * */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class AddressServiceImpl implements IAddressService { + + private final EcommerceAddressDao addressDao; + + public AddressServiceImpl(EcommerceAddressDao addressDao) { + this.addressDao = addressDao; + } + + /** + *

存储多个地址信息

+ * */ + @Override + public TableId createAddressInfo(AddressInfo addressInfo) { + + // 不能直接从参数中获取用户的 id 信息 + LoginUserInfo loginUserInfo = AccessContext.getLoginUserInfo(); + + // 将传递的参数转换成实体对象 + List
ecommerceAddresses = addressInfo.getAddressItems().stream() + .map(a -> Address.to(loginUserInfo.getId(), a)) + .collect(Collectors.toList()); + + // 保存到数据表并把返回记录的 id 给调用方 + List
savedRecords = addressDao.saveAll(ecommerceAddresses); + List ids = savedRecords.stream() + .map(Address::getId).collect(Collectors.toList()); + log.info("create address info: [{}], [{}]", loginUserInfo.getId(), + JSON.toJSONString(ids)); + + return new TableId( + ids.stream().map(TableId.Id::new).collect(Collectors.toList()) + ); + } + + @Override + public AddressInfo getCurrentAddressInfo() { + + LoginUserInfo loginUserInfo = AccessContext.getLoginUserInfo(); + + // 根据 userId 查询到用户的地址信息, 再实现转换 + List
ecommerceAddresses = addressDao.findAllByUserId( + loginUserInfo.getId() + ); + List addressItems = ecommerceAddresses.stream() + .map(Address::toAddressItem) + .collect(Collectors.toList()); + + return new AddressInfo(loginUserInfo.getId(), addressItems); + } + + @Override + public AddressInfo getAddressInfoById(Long id) { + + Address ecommerceAddress = addressDao.findById(id).orElse(null); + if (null == ecommerceAddress) { + throw new RuntimeException("address is not exist"); + } + + return new AddressInfo( + ecommerceAddress.getUserId(), + Collections.singletonList(ecommerceAddress.toAddressItem()) + ); + } + + @Override + public AddressInfo getAddressInfoByTableId(TableId tableId) { + + List ids = tableId.getIds().stream() + .map(TableId.Id::getId).collect(Collectors.toList()); + log.info("get address info by table id: [{}]", JSON.toJSONString(ids)); + + List
ecommerceAddresses = addressDao.findAllById(ids); + if (CollectionUtils.isEmpty(ecommerceAddresses)) { + return new AddressInfo(-1L, Collections.emptyList()); + } + + List addressItems = ecommerceAddresses.stream() + .map(Address::toAddressItem) + .collect(Collectors.toList()); + + return new AddressInfo( + ecommerceAddresses.get(0).getUserId(), addressItems + ); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/impl/BalanceServiceImpl.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/impl/BalanceServiceImpl.java new file mode 100644 index 0000000..c8bcd23 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/java/org/example/service/impl/BalanceServiceImpl.java @@ -0,0 +1,76 @@ +package org.example.service.impl; + +import lombok.extern.slf4j.Slf4j; +import org.example.account.BalanceInfo; +import org.example.dao.EcommerceBalanceDao; +import org.example.entity.Balance; +import org.example.filter.AccessContext; +import org.example.service.IBalanceService; +import org.example.vo.LoginUserInfo; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +/** + *

用于余额相关服务接口实现

+ * */ +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class BalanceServiceImpl implements IBalanceService { + + private final EcommerceBalanceDao balanceDao; + + public BalanceServiceImpl(EcommerceBalanceDao balanceDao) { + this.balanceDao = balanceDao; + } + + @Override + public BalanceInfo getCurrentUserBalanceInfo() { + + LoginUserInfo loginUserInfo = AccessContext.getLoginUserInfo(); + BalanceInfo balanceInfo = new BalanceInfo( + loginUserInfo.getId(), 0L + ); + + Balance ecommerceBalance = + balanceDao.findByUserId(loginUserInfo.getId()); + if (null != ecommerceBalance) { + balanceInfo.setBalance(ecommerceBalance.getBalance()); + } else { + // 如果还没有用户余额记录, 这里创建出来,余额设定为0即可 + Balance newBalance = new Balance(); + newBalance.setUserId(loginUserInfo.getId()); + newBalance.setBalance(0L); + log.info("init user balance record: [{}]", + balanceDao.save(newBalance).getId()); + } + + return balanceInfo; + } + + @Override + public BalanceInfo deductBalance(BalanceInfo balanceInfo) { + + LoginUserInfo loginUserInfo = AccessContext.getLoginUserInfo(); + + // 扣减用户余额的一个基本原则: 扣减额 <= 当前用户余额 + Balance ecommerceBalance = + balanceDao.findByUserId(loginUserInfo.getId()); + if (null == ecommerceBalance + || ecommerceBalance.getBalance() - balanceInfo.getBalance() < 0 + ) { + throw new RuntimeException("user balance is not enough!"); + } + + Long sourceBalance = ecommerceBalance.getBalance(); + ecommerceBalance.setBalance(ecommerceBalance.getBalance() - balanceInfo.getBalance()); + log.info("deduct balance: [{}], [{}], [{}]", + balanceDao.save(ecommerceBalance).getId(), sourceBalance, + balanceInfo.getBalance()); + + return new BalanceInfo( + ecommerceBalance.getUserId(), + ecommerceBalance.getBalance() + ); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/bootstrap.yml b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..1a3b3da --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/bootstrap.yml @@ -0,0 +1,67 @@ +server: + port: 8003 + servlet: + context-path: /dev-protocol-springcloud-project-account-service + +spring: + application: + name: dev-protocol-springcloud-project-account-service + cloud: + nacos: + discovery: + enabled: true # 如果不想使用 Nacos 进行服务注册和发现, 设置为 false 即可 + server-addr: 127.0.0.1:8848 + # server-addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850 # Nacos 服务器地址 + namespace: 1ccc74ae-9398-4dbe-b9d7-4f9addf9f40c + metadata: + management: + context-path: ${server.servlet.context-path}/actuator + kafka: + bootstrap-servers: 127.0.0.1:9092 + producer: + retries: 3 + consumer: + auto-offset-reset: latest + sleuth: + sampler: + probability: 1.0 # 采样比例, 1.0 表示 100%, 默认是 0.1 + zipkin: + sender: + type: kafka # 默认是 web + base-url: http://localhost:9411/ + jpa: + show-sql: true + hibernate: + ddl-auto: none + properties: + hibernate.show_sql: true + hibernate.format_sql: true + hibernate: + dialect: org.hibernate.dialect.MySQLDialect + open-in-view: false + datasource: + # 数据源 + url: jdbc:mysql://127.0.0.1:3306/dev_protocol_springcloud_project?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: root + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + # 连接池 + hikari: + maximum-pool-size: 8 + minimum-idle: 4 + idle-timeout: 30000 + connection-timeout: 30000 + max-lifetime: 45000 + auto-commit: true + pool-name: devProtocolSpringcloudHikariCP + +# 暴露端点 +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: always diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/http/account-address.http b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/http/account-address.http new file mode 100644 index 0000000..acd87d4 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/http/account-address.http @@ -0,0 +1,43 @@ +### 创建用户地址信息 +POST http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-account-service/address/create-address +Content-Type: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjU2ZGViY2NiLTlkNTEtNDMzMC04NjFhLTY5MWI0YWE2NzY1MiIsImV4cCI6MTYyNDcyMzIwMH0.M9Xg__zvXvAeALMcAs1LIJN41_JGo7Od1bw0218AbmzrBMZ-9WT6plow62gSBfxa5Xbm79t6VeHq8iC7a0ZYBF2RemNaXmrgIkmwxjg12jO56hTCRv1jghAbiFZknTxXA4QQ6dB3MS4mE19MDt6P3f3ckLwyl-IjE9O5_c-wg47Sb8odfrm_K2RMx_2ZMQAfNjHzxCzrQyNRWhqSQTpSVAuUScaxlnf4EvEwav8FT0QICIlx8oZyU7fh_zBtfFL4EhQlHfcU-eo6Nw4YUVA0knIrkAXD8jqCowx7Mej8khQ6zXNUB2V_uTtc2P2VW1UHlWSAiFCR_qkvBGSWO0VH_w + +{ + "userId": 10, + "addressItems": [ + { + "username": "zxcx", + "phone": "16600000001", + "province": "上海市", + "city": "上海市", + "addressDetail": "闵行区" + } + ] +} + +### 当前登录用户地址信息 +GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-account-service/address/current-address +Accept: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjU2ZGViY2NiLTlkNTEtNDMzMC04NjFhLTY5MWI0YWE2NzY1MiIsImV4cCI6MTYyNDcyMzIwMH0.M9Xg__zvXvAeALMcAs1LIJN41_JGo7Od1bw0218AbmzrBMZ-9WT6plow62gSBfxa5Xbm79t6VeHq8iC7a0ZYBF2RemNaXmrgIkmwxjg12jO56hTCRv1jghAbiFZknTxXA4QQ6dB3MS4mE19MDt6P3f3ckLwyl-IjE9O5_c-wg47Sb8odfrm_K2RMx_2ZMQAfNjHzxCzrQyNRWhqSQTpSVAuUScaxlnf4EvEwav8FT0QICIlx8oZyU7fh_zBtfFL4EhQlHfcU-eo6Nw4YUVA0knIrkAXD8jqCowx7Mej8khQ6zXNUB2V_uTtc2P2VW1UHlWSAiFCR_qkvBGSWO0VH_w + +### 通过 id 获取用户地址信息 +GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-account-service/address/address-info?id=2 +Accept: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjU2ZGViY2NiLTlkNTEtNDMzMC04NjFhLTY5MWI0YWE2NzY1MiIsImV4cCI6MTYyNDcyMzIwMH0.M9Xg__zvXvAeALMcAs1LIJN41_JGo7Od1bw0218AbmzrBMZ-9WT6plow62gSBfxa5Xbm79t6VeHq8iC7a0ZYBF2RemNaXmrgIkmwxjg12jO56hTCRv1jghAbiFZknTxXA4QQ6dB3MS4mE19MDt6P3f3ckLwyl-IjE9O5_c-wg47Sb8odfrm_K2RMx_2ZMQAfNjHzxCzrQyNRWhqSQTpSVAuUScaxlnf4EvEwav8FT0QICIlx8oZyU7fh_zBtfFL4EhQlHfcU-eo6Nw4YUVA0knIrkAXD8jqCowx7Mej8khQ6zXNUB2V_uTtc2P2VW1UHlWSAiFCR_qkvBGSWO0VH_w + +### 获取用户地址信息 +POST http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-account-service/address/address-info-by-table-id +Content-Type: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjU2ZGViY2NiLTlkNTEtNDMzMC04NjFhLTY5MWI0YWE2NzY1MiIsImV4cCI6MTYyNDcyMzIwMH0.M9Xg__zvXvAeALMcAs1LIJN41_JGo7Od1bw0218AbmzrBMZ-9WT6plow62gSBfxa5Xbm79t6VeHq8iC7a0ZYBF2RemNaXmrgIkmwxjg12jO56hTCRv1jghAbiFZknTxXA4QQ6dB3MS4mE19MDt6P3f3ckLwyl-IjE9O5_c-wg47Sb8odfrm_K2RMx_2ZMQAfNjHzxCzrQyNRWhqSQTpSVAuUScaxlnf4EvEwav8FT0QICIlx8oZyU7fh_zBtfFL4EhQlHfcU-eo6Nw4YUVA0knIrkAXD8jqCowx7Mej8khQ6zXNUB2V_uTtc2P2VW1UHlWSAiFCR_qkvBGSWO0VH_w + +{ + "ids": [ + { + "id": 1 + }, + { + "id": 2 + } + ] +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/http/account-balance.http b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/http/account-balance.http new file mode 100644 index 0000000..3dab2e4 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/http/account-balance.http @@ -0,0 +1,14 @@ +### 获取当前用户余额信息 +GET http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-account-service/balance/current-balance +Accept: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjU2ZGViY2NiLTlkNTEtNDMzMC04NjFhLTY5MWI0YWE2NzY1MiIsImV4cCI6MTYyNDcyMzIwMH0.M9Xg__zvXvAeALMcAs1LIJN41_JGo7Od1bw0218AbmzrBMZ-9WT6plow62gSBfxa5Xbm79t6VeHq8iC7a0ZYBF2RemNaXmrgIkmwxjg12jO56hTCRv1jghAbiFZknTxXA4QQ6dB3MS4mE19MDt6P3f3ckLwyl-IjE9O5_c-wg47Sb8odfrm_K2RMx_2ZMQAfNjHzxCzrQyNRWhqSQTpSVAuUScaxlnf4EvEwav8FT0QICIlx8oZyU7fh_zBtfFL4EhQlHfcU-eo6Nw4YUVA0knIrkAXD8jqCowx7Mej8khQ6zXNUB2V_uTtc2P2VW1UHlWSAiFCR_qkvBGSWO0VH_w + +### 扣减用户余额 +PUT http://127.0.0.1:9001/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-account-service/balance/deduct-balance +Content-Type: application/json +e-commerce-user: eyJhbGciOiJSUzI1NiJ9.eyJlLWNvbW1lcmNlLXVzZXIiOiJ7XCJpZFwiOjEwLFwidXNlcm5hbWVcIjpcIlFpbnlpQGltb29jLmNvbVwifSIsImp0aSI6IjU2ZGViY2NiLTlkNTEtNDMzMC04NjFhLTY5MWI0YWE2NzY1MiIsImV4cCI6MTYyNDcyMzIwMH0.M9Xg__zvXvAeALMcAs1LIJN41_JGo7Od1bw0218AbmzrBMZ-9WT6plow62gSBfxa5Xbm79t6VeHq8iC7a0ZYBF2RemNaXmrgIkmwxjg12jO56hTCRv1jghAbiFZknTxXA4QQ6dB3MS4mE19MDt6P3f3ckLwyl-IjE9O5_c-wg47Sb8odfrm_K2RMx_2ZMQAfNjHzxCzrQyNRWhqSQTpSVAuUScaxlnf4EvEwav8FT0QICIlx8oZyU7fh_zBtfFL4EhQlHfcU-eo6Nw4YUVA0knIrkAXD8jqCowx7Mej8khQ6zXNUB2V_uTtc2P2VW1UHlWSAiFCR_qkvBGSWO0VH_w + +{ + "userId": 10, + "balance": 2000 +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/sql/t_ecommerce_address.sql b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/sql/t_ecommerce_address.sql new file mode 100644 index 0000000..c8b4e13 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/sql/t_ecommerce_address.sql @@ -0,0 +1,13 @@ +-- 创建 t_ecommerce_address 数据表 +CREATE TABLE IF NOT EXISTS `dev_protocol_springcloud_project`.`t_dev_protocol_cloud_address` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `user_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户 id', + `username` varchar(64) NOT NULL DEFAULT '' COMMENT '用户名', + `phone` varchar(64) NOT NULL DEFAULT '' COMMENT '电话号码', + `province` varchar(64) NOT NULL DEFAULT '' COMMENT '省', + `city` varchar(64) NOT NULL DEFAULT '' COMMENT '市', + `address_detail` varchar(256) NOT NULL DEFAULT '' COMMENT '详细地址', + `create_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '更新时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户地址表'; diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/sql/t_ecommerce_balance.sql b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/sql/t_ecommerce_balance.sql new file mode 100644 index 0000000..2767a8b --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/main/resources/sql/t_ecommerce_balance.sql @@ -0,0 +1,10 @@ +-- 创建 t_ecommerce_balance 数据表 +CREATE TABLE IF NOT EXISTS `dev_protocol_springcloud_project`.`t_dev_protocol_cloud_balance` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `user_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '用户 id', + `balance` bigint(20) NOT NULL DEFAULT 0 COMMENT '账户余额', + `create_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '创建时间', + `update_time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00' COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `user_id_key` (`user_id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户账户余额表'; diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/AccountApplicationTest.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/AccountApplicationTest.java new file mode 100644 index 0000000..cedd07c --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/AccountApplicationTest.java @@ -0,0 +1,19 @@ +package org.example; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + *

用户账户微服务环境可用性校验

+ * */ +@SpringBootTest +@RunWith(SpringRunner.class) +public class AccountApplicationTest { + + @Test + public void contextLoad() { + + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/AddressServiceTest.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/AddressServiceTest.java new file mode 100644 index 0000000..8cc7303 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/AddressServiceTest.java @@ -0,0 +1,76 @@ +package org.example.service; + +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.example.account.AddressInfo; +import org.example.common.TableId; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Collections; + +/** + *

用户地址相关服务功能测试

+ * */ +@Slf4j +public class AddressServiceTest extends BaseTest { + + @Autowired + private IAddressService addressService; + + /** + *

测试创建用户地址信息

+ * */ + @Test + public void testCreateAddressInfo() { + + AddressInfo.AddressItem addressItem = new AddressInfo.AddressItem(); + addressItem.setUsername("qqq"); + addressItem.setPhone("18800000001"); + addressItem.setProvince("上海市"); + addressItem.setCity("上海市"); + addressItem.setAddressDetail("陆家嘴"); + + log.info("test create address info: [{}]", JSON.toJSONString( + addressService.createAddressInfo( + new AddressInfo(loginUserInfo.getId(), + Collections.singletonList(addressItem)) + ) + )); + } + + /** + *

测试获取当前登录用户地址信息

+ * */ + @Test + public void testGetCurrentAddressInfo() { + + log.info("test get current user info: [{}]", JSON.toJSONString( + addressService.getCurrentAddressInfo() + )); + } + + /** + *

测试通过 id 获取用户地址信息

+ * */ + @Test + public void testGetAddressInfoById() { + + log.info("test get address info by id: [{}]", JSON.toJSONString( + addressService.getAddressInfoById(1L) + )); + } + + /** + *

测试通过 TableId 获取用户地址信息

+ * */ + @Test + public void testGetAddressInfoByTableId() { + + log.info("test get address info by table id: [{}]", JSON.toJSONString( + addressService.getAddressInfoByTableId( + new TableId(Collections.singletonList(new TableId.Id(1L))) + ) + )); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/BalanceServiceTest.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/BalanceServiceTest.java new file mode 100644 index 0000000..9b68802 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/BalanceServiceTest.java @@ -0,0 +1,43 @@ +package org.example.service; + +import com.alibaba.fastjson2.JSON; +import lombok.extern.slf4j.Slf4j; +import org.example.account.BalanceInfo; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + *

用于余额相关服务测试

+ * */ +@Slf4j +public class BalanceServiceTest extends BaseTest { + + @Autowired + private IBalanceService balanceService; + + /** + *

测试获取当前用户的余额信息

+ * */ + @Test + public void testGetCurrentUserBalanceInfo() { + + log.info("test get current user balance info: [{}]", JSON.toJSONString( + balanceService.getCurrentUserBalanceInfo() + )); + } + + /** + *

测试扣减用于余额

+ * */ + @Test + public void testDeductBalance() { + + BalanceInfo balanceInfo = new BalanceInfo(); + balanceInfo.setUserId(loginUserInfo.getId()); + balanceInfo.setBalance(1000L); + + log.info("test deduct balance: [{}]", JSON.toJSONString( + balanceService.deductBalance(balanceInfo) + )); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/BaseTest.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/BaseTest.java new file mode 100644 index 0000000..bce73dc --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/src/test/java/org/example/service/BaseTest.java @@ -0,0 +1,31 @@ +package org.example.service; + +import org.example.filter.AccessContext; +import org.example.vo.LoginUserInfo; +import org.junit.After; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + *

测试用例基类, 填充登录用户信息

+ * */ +@SpringBootTest +@RunWith(SpringRunner.class) +public abstract class BaseTest { + + protected final LoginUserInfo loginUserInfo = new LoginUserInfo( + 10L, "q@bbbbbbyyyyyy.com" + ); + + @Before + public void init() { + AccessContext.setLoginUserInfo(loginUserInfo); + } + + @After + public void destroy() { + AccessContext.clearLoginUserInfo(); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/用户账户微服务.md b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/用户账户微服务.md new file mode 100644 index 0000000..82f8ae5 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-account-service/用户账户微服务.md @@ -0,0 +1,80 @@ +## 用户账户微服务 + +### 用户身份登录统一拦截 +- 所有需要开发的微服务通用的配置 + +### 集成 Swagger2 实现代码即文档 +- + +### 用户账户微服务功能设计 +- + +### 数据表及 ORM 过程 +- + +### 用户地址与余额服务接口定义 +- Service 返回包装成类进行返回, 尽量不要仅仅只返回一个ID, 防止后续的扩展需求 +- 不要设计通过请求参数来获取当前用户的余额信息, 因为可以通过请求劫持来拿到别的请求信息, 防止越权 +### 用户地址相关服务接口实现 + + +### 用户地址服务接口可用性测试(测试用例) + + +### 用户余额相关服务接口实现 + + +### 用户余额服务接口可用性测试(测试用例) + + +### 用户账户微服务对外 HTTP 接口 + + +### 验证用户账户微服务功能可用性 +```json +[ + { + "id": "dev-protocol-springcloud-project-account-service", + "order": 0, // order 越小优先级越高0 + "predicates": [ + { + "args": { + "pattern": "/dev-protocol-springcloud-gateway/dev-protocol-springcloud-project-account-service/**" + }, + "name": "Path" + } + ], + "uri": "lb://dev-protocol-springcloud-project-account-service", + "filters": [ + { + "name": "HeaderToken" + }, + { + "name": "StripPrefix", + "args": { + "parts": "1" // 用来跳过上面的 pattern 前面的配置, 因为 [bootstrap.yml] 中的配置 context-path + } + } + ] + } +] +``` +- 补充放在nacos 的 gateway 的配置文件中 +### 用户账户微服务总结 + +- 微服务开始之前的准备工作 + - 用户身份登录拦截 + - 在请求进入 service 之前解析 header 中的 token 信息, 并填充用户信息到上下文中 + - 在请求结束之后,清理掉上下文中的用户信息 + - 对于一些特定的 HTTP 请求不要拦截(即白名单 ) + - 代码即文档:引入 Swagger + - pom 中添加依赖配置 + - 自定义配置 Swagger +--- +- 微服务模块的设计思想 + - 微服务模块应该是低耦合、尽可能多的重用代码 + - Tips:设计并不唯-! + - ![用户账户微服务总设计.png](pic/用户账户微服务总设计.png) +--- +- 用户账户微服务的功能及在业务中的位置 + - ![账户微服务在业务中的位置.png](pic/账户微服务在业务中的位置.png) \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/电商-授权鉴权服务.md b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/电商-授权鉴权服务.md index 46e57b2..61acd2e 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/电商-授权鉴权服务.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/电商-授权鉴权服务.md @@ -33,5 +33,26 @@ - http 脚本验证 对外接口是否可用 ## 授权、鉴权中心微服务总结 +- 对比基于 Token 与基于服务器的身份认证 + - 最为传统的做法,客户端存储 Cookie(一般是 Sessionid),服务器存储 Session + - Session 是每次用户认证通过以后,服务器需要创建一条记录保存用户信息,通常是在内存中,随着认证通过的用户越来越多,服务器的在这里的开销就会越来越大 + - 在不同域名之前切换时,请求可能会被禁止;即跨域问题 +--- +- 基于 Token(JWT)的身份认证 + - JWT 与 Session的差异相同点是,它们都是存储用户信息;然而,Session是在服务器端的,而JWT是在客户端的 + - JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力 +--- +- 对比基于 Token 与基于服务器的身份认证 + - 两者优缺点的对比 + - 解析方法: JWT 使用算法直接解析得到用户信息; Session 需要额外的数据映射实现匹配 + - 管理方法: JWT只有过期时间的限制:Session 数据保存在服务器,可控性更强 + - 跨平台: JWT就是一段字符串,可以任意传播;Session 跨平台需要有统一的解析平台,较为繁琐 + - 时效性: JWT 一旦生成,独立存在,很难做特殊控制:Session 时效性完全由服务端的逻辑说了算 + - Tips:各自都有优缺点, 都是登录, 授权的解决方案 +--- - 生成数据库 文档 - - [DBDocTest.java] \ No newline at end of file + - [DBDocTest.java] + + + + diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-mvc-config/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-project-mvc-config/pom.xml index 225a19c..f726566 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-project-mvc-config/pom.xml +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-mvc-config/pom.xml @@ -28,6 +28,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-test + diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/README.md b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/README.md new file mode 100644 index 0000000..1ad77da --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/README.md @@ -0,0 +1,6 @@ +# 介绍 +- 正常服务的通用配置 +- 开发别的模块也要直接进行导入 + +# 已实现功能 +- 统一身份拦截器 \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/pom.xml new file mode 100644 index 0000000..0f30289 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + org.example + dev-protocol + 1.0-SNAPSHOT + ../../pom.xml + + + dev-protocol-springcloud-project-service-config + + + dev-protocol-springcloud-project-service-config + 服务通用配置 + + + 8 + 8 + UTF-8 + + + + + org.example + dev-protocol-springcloud-project-mvc-config + 1.0-SNAPSHOT + + + + + io.springfox + springfox-swagger2 + 2.9.2 + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.9.3 + + + + \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/conf/DevProtocolWebMvcConfig.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/conf/DevProtocolWebMvcConfig.java new file mode 100644 index 0000000..b78b70d --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/conf/DevProtocolWebMvcConfig.java @@ -0,0 +1,44 @@ +package org.example.conf; + +import org.example.filter.LoginUserInfoInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; + +/** + *

Web Mvc 配置

+ * */ +@Configuration +@SuppressWarnings("all") +public class DevProtocolWebMvcConfig extends WebMvcConfigurationSupport { + + /** + *

添加拦截器配置

+ * */ + @Override + protected void addInterceptors(InterceptorRegistry registry) { + + // 添加用户身份统一登录拦截的拦截器 + registry.addInterceptor(new LoginUserInfoInterceptor()) + .addPathPatterns("/**").order(0); + } + + /** + *

让 MVC 加载 Swagger 的静态资源

+ * */ + @Override + protected void addResourceHandlers(ResourceHandlerRegistry registry) { + + registry.addResourceHandler("/**"). + addResourceLocations("classpath:/static/"); + registry.addResourceHandler("swagger-ui.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("doc.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + + super.addResourceHandlers(registry); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/conf/SwaggerConfig.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/conf/SwaggerConfig.java new file mode 100644 index 0000000..6062f12 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/conf/SwaggerConfig.java @@ -0,0 +1,56 @@ +package org.example.conf; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + *

Swagger 配置类

+ * 原生: /swagger-ui.html + * 美化: /doc.html + * */ +@Configuration +@EnableSwagger2 +@SuppressWarnings("all") +public class SwaggerConfig { + + /** + *

Swagger 实例 Bean 是 Docket, 所以通过配置 Docket 实例来配置 Swagger

+ * */ + @Bean + public Docket docket() { + + return new Docket(DocumentationType.SWAGGER_2) + // 展示在 Swagger 页面上的自定义工程描述信息 + .apiInfo(apiInfo()) + // 选择展示哪些接口 + .select() + // 只有 org.example 包内的才去展示 + // fixme 这个可以后续进行把一些不展示的接口进行规避 + .apis(RequestHandlerSelectors.basePackage("org.example")) + .paths(PathSelectors.any()) + .build(); + } + + /** + *

Swagger 的描述信息

+ * */ + public ApiInfo apiInfo() { + + return new ApiInfoBuilder() + .title("dev-protocol-micro-service") + .description("dev-protocol-springcloud-project") + .contact(new Contact( + "q", "www.q.com", "q@by.com" + )) + .version("1.0") + .build(); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/filter/AccessContext.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/filter/AccessContext.java new file mode 100644 index 0000000..9595eec --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/filter/AccessContext.java @@ -0,0 +1,25 @@ +package org.example.filter; + +import org.example.vo.LoginUserInfo; + +/** + *

使用 ThreadLocal 去单独存储每一个线程携带的 LoginUserInfo 信息

+ * 要及时的清理我们保存到 ThreadLocal 中的用户信息: + * 1. 保证没有资源泄露 + * 2. 保证线程在重用时, 不会出现数据混乱 + * */ +public class AccessContext { + private static final ThreadLocal loginUserInfo = new ThreadLocal<>(); + + public static LoginUserInfo getLoginUserInfo() { + return loginUserInfo.get(); + } + + public static void setLoginUserInfo(LoginUserInfo loginUserInfo_) { + loginUserInfo.set(loginUserInfo_); + } + + public static void clearLoginUserInfo() { + loginUserInfo.remove(); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/filter/LoginUserInfoInterceptor.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/filter/LoginUserInfoInterceptor.java new file mode 100644 index 0000000..071b216 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/filter/LoginUserInfoInterceptor.java @@ -0,0 +1,84 @@ +package org.example.filter; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.example.constant.CommonConstant; +import org.example.utils.TokenParseUtils; +import org.example.vo.LoginUserInfo; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + *

用户身份统一登录拦截

+ * */ +@SuppressWarnings("all") +@Slf4j +@Component +public class LoginUserInfoInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, + Object handler) throws Exception { + + // 部分请求不需要带有身份信息, 即白名单 + if (checkWhiteListUrl(request.getRequestURI())) { + return true; + } + + // 先尝试从 http header 里面拿到 token + String token = request.getHeader(CommonConstant.JWT_USER_INFO_KEY); + + LoginUserInfo loginUserInfo = null; + try { + loginUserInfo = TokenParseUtils.parseUserInfoFromToken(token); + } catch (Exception ex) { + log.error("parse login user info error: [{}]", ex.getMessage(), ex); + } + + // 如果程序走到这里, 说明 header 中没有 token 信息 + if (null == loginUserInfo) { + throw new RuntimeException("can not parse current login user"); + } + + log.info("set login user info: [{}]", request.getRequestURI()); + // 设置当前请求上下文, 把用户信息填充进去 + AccessContext.setLoginUserInfo(loginUserInfo); + + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, + Object handler, ModelAndView modelAndView) throws Exception { + + } + + /** + *

在请求完全结束后调用, 常用于清理资源等工作

+ * */ + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, + Object handler, Exception ex) throws Exception { + + if (null != AccessContext.getLoginUserInfo()) { + AccessContext.clearLoginUserInfo(); + } + } + + /** + *

校验是否是白名单接口

+ * swagger2 接口 + * */ + private boolean checkWhiteListUrl(String url) { + + return StringUtils.containsAny( + url, + "springfox", "swagger", "v2", + "webjars", "doc.html" + ); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/package-info.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/package-info.java new file mode 100644 index 0000000..3035e19 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-config/src/main/java/org/example/package-info.java @@ -0,0 +1 @@ +package org.example; \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/README.md b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/README.md new file mode 100644 index 0000000..a6bf9dd --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/README.md @@ -0,0 +1,6 @@ +# 介绍 +- 供数据传输的数据结构, 以及转换方式 +- 开发别的模块也要直接进行导入 + +# 已加入实体 +- 账号微服务 sdk \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/pom.xml new file mode 100644 index 0000000..d4535ff --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + org.example + dev-protocol + 1.0-SNAPSHOT + ../../pom.xml + + + dev-protocol-springcloud-project-service-sdk + jar + + + dev-protocol-springcloud-project-service-sdk + 服务模块 SDK + + + 8 + 8 + UTF-8 + + + + + + io.springfox + springfox-swagger2 + 2.9.2 + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + + com.github.xiaoymin + swagger-bootstrap-ui + 1.9.3 + + + + org.projectlombok + lombok + + + + \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/AddressInfo.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/AddressInfo.java new file mode 100644 index 0000000..5a63aa7 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/AddressInfo.java @@ -0,0 +1,80 @@ +package org.example.account; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; +import java.util.List; + +/** + *

用户地址信息

+ * */ +@ApiModel(description = "用户地址信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class AddressInfo { + + @ApiModelProperty(value = "地址所属用户 id") + private Long userId; + + @ApiModelProperty(value = "地址详细信息") + private List addressItems; + + /** + *

单个的地址信息

+ * */ + @ApiModel(description = "用户的单个地址信息") + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class AddressItem { + + @ApiModelProperty(value = "地址表主键 id") + private Long id; + + @ApiModelProperty(value = "用户姓名") + private String username; + + @ApiModelProperty(value = "电话") + private String phone; + + @ApiModelProperty(value = "省") + private String province; + + @ApiModelProperty(value = "市") + private String city; + + @ApiModelProperty(value = "详细的地址") + private String addressDetail; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + public AddressItem(Long id) { + this.id = id; + } + + /** + *

将 AddressItem 转换成 UserAddress

+ * */ + public UserAddress toUserAddress() { + + UserAddress userAddress = new UserAddress(); + + userAddress.setUsername(this.username); + userAddress.setPhone(this.phone); + userAddress.setProvince(this.province); + userAddress.setCity(this.city); + userAddress.setAddressDetail(this.addressDetail); + + return userAddress; + } + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/BalanceInfo.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/BalanceInfo.java new file mode 100644 index 0000000..f13cca1 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/BalanceInfo.java @@ -0,0 +1,23 @@ +package org.example.account; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

用户账户余额信息

+ * */ +@ApiModel(description = "用户账户余额信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class BalanceInfo { + + @ApiModelProperty(value = "用户主键 id") + private Long userId; + + @ApiModelProperty(value = "用户账户余额") + private Long balance; +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/UserAddress.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/UserAddress.java new file mode 100644 index 0000000..38ec11e --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/account/UserAddress.java @@ -0,0 +1,32 @@ +package org.example.account; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

用户地址信息

+ * */ +@ApiModel(description = "用户地址信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class UserAddress { + + @ApiModelProperty(value = "用户姓名") + private String username; + + @ApiModelProperty(value = "电话") + private String phone; + + @ApiModelProperty(value = "省") + private String province; + + @ApiModelProperty(value = "市") + private String city; + + @ApiModelProperty(value = "详细的地址") + private String addressDetail; +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/common/TableId.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/common/TableId.java new file mode 100644 index 0000000..44ddf80 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/common/TableId.java @@ -0,0 +1,32 @@ +package org.example.common; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + *

主键 ids

+ * */ +@ApiModel(description = "通用 id 对象") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class TableId { + + @ApiModelProperty(value = "数据表记录主键") + private List ids; + + @ApiModel(description = "数据表记录主键对象") + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class Id { + + @ApiModelProperty(value = "数据表记录主键") + private Long id; + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/DeductGoodsInventory.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/DeductGoodsInventory.java new file mode 100644 index 0000000..8591790 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/DeductGoodsInventory.java @@ -0,0 +1,23 @@ +package org.example.goods; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

扣减商品库存

+ * */ +@ApiModel(description = "扣减商品库存对象") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeductGoodsInventory { + + @ApiModelProperty(value = "商品主键 id") + private Long goodsId; + + @ApiModelProperty(value = "扣减个数") + private Integer count; +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/GoodsInfo.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/GoodsInfo.java new file mode 100644 index 0000000..ae22694 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/GoodsInfo.java @@ -0,0 +1,80 @@ +package org.example.goods; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + *

商品信息

+ * */ +@ApiModel(description = "详细的商品信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class GoodsInfo { + + @ApiModelProperty(value = "商品表主键 id") + private Long id; + + @ApiModelProperty(value = "商品类别编码") + private String goodsCategory; + + @ApiModelProperty(value = "品牌分类编码") + private String brandCategory; + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品图片") + private String goodsPic; + + @ApiModelProperty(value = "商品描述信息") + private String goodsDescription; + + @ApiModelProperty(value = "商品状态") + private Integer goodsStatus; + + @ApiModelProperty(value = "商品价格, 单位: 分") + private Integer price; + + @ApiModelProperty(value = "商品属性") + private GoodsProperty goodsProperty; + + @ApiModelProperty(value = "供应量") + private Long supply; + + @ApiModelProperty(value = "库存") + private Long inventory; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "更新时间") + private Date updateTime; + + /** + *

商品属性

+ * */ + @ApiModel(description = "商品属性对象") + @Data + @NoArgsConstructor + @AllArgsConstructor + public static class GoodsProperty { + + @ApiModelProperty(value = "尺寸") + private String size; + + @ApiModelProperty(value = "颜色") + private String color; + + @ApiModelProperty(value = "材质") + private String material; + + @ApiModelProperty(value = "图案") + private String pattern; + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/SimpleGoodsInfo.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/SimpleGoodsInfo.java new file mode 100644 index 0000000..4a84b84 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/goods/SimpleGoodsInfo.java @@ -0,0 +1,33 @@ +package org.example.goods; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + *

简单的商品信息: 封面

+ * */ +@ApiModel(description = "简单的商品信息") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SimpleGoodsInfo { + + @ApiModelProperty(value = "商品表主键 id") + private Long id; + + @ApiModelProperty(value = "商品名称") + private String goodsName; + + @ApiModelProperty(value = "商品图片") + private String goodsPic; + + @ApiModelProperty(value = "商品价格, 单位: 分") + private Integer price; + + public SimpleGoodsInfo(Long id) { + this.id = id; + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/package-info.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/package-info.java new file mode 100644 index 0000000..3035e19 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk/src/main/java/org/example/package-info.java @@ -0,0 +1 @@ +package org.example; \ No newline at end of file diff --git a/pom.xml b/pom.xml index 076a458..da3e3d8 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,9 @@ dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center dev-protocol-springcloud/dev-protocol-springcloud-project-mvc-config dev-protocol-springcloud/dev-protocol-springcloud-project-common + dev-protocol-springcloud/dev-protocol-springcloud-project-account-service + dev-protocol-springcloud/dev-protocol-springcloud-project-service-config + dev-protocol-springcloud/dev-protocol-springcloud-project-service-sdk