Bladeren bron

add user service

ziyi.liu 4 jaren geleden
bovenliggende
commit
7131283e2f
28 gewijzigde bestanden met toevoegingen van 424 en 58 verwijderingen
  1. 4 0
      base-module/pom.xml
  2. 1 1
      base-module/src/main/java/com/remy/common/entity/BaseEntity.java
  3. 8 0
      common-module/src/main/java/com/remy/common/enumeration/GenderEnum.java
  4. 6 0
      common-module/src/main/java/com/remy/common/module/GoodsDTO.java
  5. 6 0
      common-module/src/main/java/com/remy/common/module/OrderDTO.java
  6. 37 0
      common-module/src/main/java/com/remy/common/module/UserDTO.java
  7. 2 0
      graphql-api/src/main/java/com/remy/graphql/evn/RestAPIEnv.java
  8. 4 0
      graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/GoodsMutation.java
  9. 4 0
      graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/OrderMutation.java
  10. 27 0
      graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/UserMutation.java
  11. 4 0
      graphql-api/src/main/java/com/remy/graphql/resolvers/query/GoodsQuery.java
  12. 5 0
      graphql-api/src/main/java/com/remy/graphql/resolvers/query/OrderQuery.java
  13. 51 0
      graphql-api/src/main/java/com/remy/graphql/resolvers/query/UserQuery.java
  14. 4 1
      graphql-api/src/main/resources/application.yml
  15. 29 0
      graphql-api/src/main/resources/graphqls/goods.graphqls
  16. 5 0
      graphql-api/src/main/resources/graphqls/mutation.graphqls
  17. 20 0
      graphql-api/src/main/resources/graphqls/order.graphqls
  18. 12 0
      graphql-api/src/main/resources/graphqls/query.graphqls
  19. 3 0
      graphql-api/src/main/resources/graphqls/scala.graphqls
  20. 30 0
      graphql-api/src/main/resources/graphqls/user.graphqls
  21. 0 54
      graphql-api/src/main/resources/schema.graphqls
  22. 3 0
      order-service/src/main/java/com/remy/order/entity/Order.java
  23. 36 0
      user-service/src/main/java/com/remy/user/controller/UserController.java
  24. 10 0
      user-service/src/main/java/com/remy/user/dao/UserDAO.java
  25. 55 0
      user-service/src/main/java/com/remy/user/entity/User.java
  26. 17 0
      user-service/src/main/java/com/remy/user/service/UserService.java
  27. 36 0
      user-service/src/main/java/com/remy/user/service/impl/UserServiceImpl.java
  28. 5 2
      user-service/src/main/resources/application.yml

+ 4 - 0
base-module/pom.xml

@@ -22,6 +22,10 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-data-jpa</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.remy</groupId>
+            <artifactId>common-module</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>

+ 1 - 1
base-module/src/main/java/com/remy/common/entity/BaseEntity.java

@@ -19,7 +19,7 @@ public class BaseEntity implements Serializable {
     private static final long serialVersionUID = 1412134936159005266L;
 
     @Id
-    @GeneratedValue(strategy = GenerationType.AUTO)
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
 
     @Column(name = "create_time")

+ 8 - 0
common-module/src/main/java/com/remy/common/enumeration/GenderEnum.java

@@ -0,0 +1,8 @@
+package com.remy.common.enumeration;
+
+public enum GenderEnum {
+
+    MALE,
+    FEMALE
+    ;
+}

+ 6 - 0
common-module/src/main/java/com/remy/common/module/GoodsDTO.java

@@ -3,9 +3,11 @@ package com.remy.common.module;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import lombok.Singular;
 import lombok.experimental.SuperBuilder;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 @Data
 @SuperBuilder
@@ -26,4 +28,8 @@ public class GoodsDTO extends BaseDTO {
     private BigDecimal price;
 
     private Integer itemCount;
+
+    @Singular
+    private List<OrderDTO> orders;
+
 }

+ 6 - 0
common-module/src/main/java/com/remy/common/module/OrderDTO.java

@@ -15,10 +15,16 @@ public class OrderDTO extends BaseDTO {
 
     private String goodsSerialNo;
 
+    private Long userID;
+
     private BigDecimal discount;
 
     private BigDecimal originalAmount;
 
     private BigDecimal discountAmount;
 
+    private GoodsDTO goods;
+
+    private UserDTO user;
+
 }

+ 37 - 0
common-module/src/main/java/com/remy/common/module/UserDTO.java

@@ -0,0 +1,37 @@
+package com.remy.common.module;
+
+import com.remy.common.enumeration.GenderEnum;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.Singular;
+import lombok.experimental.SuperBuilder;
+
+import java.time.LocalDate;
+import java.util.List;
+
+@SuperBuilder
+@Data
+@NoArgsConstructor
+public class UserDTO extends BaseDTO {
+
+    private String username;
+
+    private String password;
+
+    private String nickname;
+
+    private String img;
+
+    private GenderEnum gender;
+
+    private Integer age;
+
+    private LocalDate birthday;
+
+    private Integer level;
+
+    @Singular
+    private List<String> addresses;
+
+    private List<OrderDTO> orders;
+}

+ 2 - 0
graphql-api/src/main/java/com/remy/graphql/evn/RestAPIEnv.java

@@ -14,4 +14,6 @@ public class RestAPIEnv {
     private String goodsEndpoint;
 
     private String ordersEndpoint;
+
+    private String usersEndpoint;
 }

+ 4 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/GoodsMutation.java

@@ -2,7 +2,9 @@ package com.remy.graphql.resolvers.mutation;
 
 import com.remy.common.module.GoodsDTO;
 import com.remy.graphql.evn.RestAPIEnv;
+import com.remy.graphql.helper.BeanHelper;
 import graphql.kickstart.tools.GraphQLMutationResolver;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
@@ -10,12 +12,14 @@ import org.springframework.web.client.RestTemplate;
 import java.util.concurrent.CompletableFuture;
 
 @Component
+@Slf4j
 public class GoodsMutation implements GraphQLMutationResolver {
 
     @Autowired
     RestAPIEnv apiEnv;
 
     CompletableFuture<GoodsDTO> createGoods(GoodsDTO goodsDTO) {
+        log.info("start create goods: " + BeanHelper.toJSON(goodsDTO));
         return CompletableFuture.supplyAsync(() ->
                 new RestTemplate().postForObject(apiEnv.getGoodsEndpoint(),
                         goodsDTO, GoodsDTO.class));

+ 4 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/OrderMutation.java

@@ -2,7 +2,9 @@ package com.remy.graphql.resolvers.mutation;
 
 import com.remy.common.module.OrderDTO;
 import com.remy.graphql.evn.RestAPIEnv;
+import com.remy.graphql.helper.BeanHelper;
 import graphql.kickstart.tools.GraphQLMutationResolver;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
@@ -10,12 +12,14 @@ import org.springframework.web.client.RestTemplate;
 import java.util.concurrent.CompletableFuture;
 
 @Component
+@Slf4j
 public class OrderMutation implements GraphQLMutationResolver {
 
     @Autowired
     RestAPIEnv apiEnv;
 
     CompletableFuture<OrderDTO> createOrder(OrderDTO orderDTO) {
+        log.info("start create order: " + BeanHelper.toJSON(orderDTO));
         return CompletableFuture.supplyAsync(() ->
                 new RestTemplate().postForObject(apiEnv.getOrdersEndpoint(),
                         orderDTO, OrderDTO.class));

+ 27 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/mutation/UserMutation.java

@@ -0,0 +1,27 @@
+package com.remy.graphql.resolvers.mutation;
+
+import com.remy.common.module.UserDTO;
+import com.remy.graphql.evn.RestAPIEnv;
+import com.remy.graphql.helper.BeanHelper;
+import graphql.kickstart.tools.GraphQLMutationResolver;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.concurrent.CompletableFuture;
+
+@Component
+@Slf4j
+public class UserMutation implements GraphQLMutationResolver {
+
+    @Autowired
+    RestAPIEnv apiEnv;
+
+    CompletableFuture<UserDTO> createUser(UserDTO userDTO) {
+        log.info("start create user: " + BeanHelper.toJSON(userDTO));
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().postForObject(apiEnv.getUsersEndpoint(),
+                        userDTO, UserDTO.class));
+    }
+}

+ 4 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/query/GoodsQuery.java

@@ -3,6 +3,7 @@ package com.remy.graphql.resolvers.query;
 import com.remy.common.module.GoodsDTO;
 import com.remy.graphql.evn.RestAPIEnv;
 import graphql.kickstart.tools.GraphQLQueryResolver;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.HttpEntity;
@@ -14,12 +15,14 @@ import java.util.List;
 import java.util.concurrent.CompletableFuture;
 
 @Component
+@Slf4j
 public class GoodsQuery implements GraphQLQueryResolver {
 
     @Autowired
     RestAPIEnv apiEnv;
 
     public CompletableFuture<List<GoodsDTO>> goodsList() {
+        log.info("start query goods list");
         return CompletableFuture.supplyAsync(() ->
                 new RestTemplate().exchange(
                         apiEnv.getGoodsEndpoint(),
@@ -30,6 +33,7 @@ public class GoodsQuery implements GraphQLQueryResolver {
     }
 
     public CompletableFuture<GoodsDTO> goods(String serialNo) {
+        log.info("start query goods by serialNo");
         return CompletableFuture.supplyAsync(() ->
                 new RestTemplate().getForObject(apiEnv.getGoodsEndpoint() + serialNo, GoodsDTO.class));
     }

+ 5 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/query/OrderQuery.java

@@ -3,6 +3,7 @@ package com.remy.graphql.resolvers.query;
 import com.remy.common.module.OrderDTO;
 import com.remy.graphql.evn.RestAPIEnv;
 import graphql.kickstart.tools.GraphQLQueryResolver;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.HttpEntity;
@@ -14,12 +15,14 @@ import java.util.List;
 import java.util.concurrent.CompletableFuture;
 
 @Component
+@Slf4j
 public class OrderQuery implements GraphQLQueryResolver {
 
     @Autowired
     RestAPIEnv apiEnv;
 
     public CompletableFuture<List<OrderDTO>> orderList() {
+        log.info("start query orderList");
         return CompletableFuture.supplyAsync(() ->
                 new RestTemplate().exchange(
                         apiEnv.getOrdersEndpoint(),
@@ -30,6 +33,7 @@ public class OrderQuery implements GraphQLQueryResolver {
     }
 
     public CompletableFuture<List<OrderDTO>> orderQuery(String goodsSerialNo) {
+        log.info("start query order by goods serial no");
         return CompletableFuture.supplyAsync(() ->
                 new RestTemplate().exchange(
                         apiEnv.getOrdersEndpoint() + "query?goodsSerialNo=" + goodsSerialNo,
@@ -40,6 +44,7 @@ public class OrderQuery implements GraphQLQueryResolver {
     }
 
     public CompletableFuture<OrderDTO> orderInfo(String orderNo) {
+        log.info("start query order by order no");
         return CompletableFuture.supplyAsync(() ->
                 new RestTemplate().getForObject(apiEnv.getOrdersEndpoint() + orderNo, OrderDTO.class));
     }

+ 51 - 0
graphql-api/src/main/java/com/remy/graphql/resolvers/query/UserQuery.java

@@ -0,0 +1,51 @@
+package com.remy.graphql.resolvers.query;
+
+import com.remy.common.module.UserDTO;
+import com.remy.graphql.evn.RestAPIEnv;
+import graphql.kickstart.tools.GraphQLQueryResolver;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+@Component
+@Slf4j
+public class UserQuery implements GraphQLQueryResolver {
+
+    @Autowired
+    RestAPIEnv apiEnv;
+
+    public CompletableFuture<List<UserDTO>> userList() {
+        log.info("start query orderList");
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().exchange(
+                        apiEnv.getUsersEndpoint(),
+                        HttpMethod.GET,
+                        new HttpEntity(null),
+                        new ParameterizedTypeReference<List<UserDTO>>() {
+                        }).getBody());
+    }
+
+    public CompletableFuture<List<UserDTO>> userQuery(String username) {
+        log.info("start query order by goods serial no");
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().exchange(
+                        apiEnv.getUsersEndpoint() + "query?username=" + username,
+                        HttpMethod.GET,
+                        new HttpEntity(null),
+                        new ParameterizedTypeReference<List<UserDTO>>() {
+                        }).getBody());
+    }
+
+    public CompletableFuture<UserDTO> userInfo(Long userID) {
+        log.info("start query order by order no");
+        return CompletableFuture.supplyAsync(() ->
+                new RestTemplate().getForObject(apiEnv.getOrdersEndpoint() + userID, UserDTO.class));
+    }
+}

+ 4 - 1
graphql-api/src/main/resources/application.yml

@@ -11,8 +11,11 @@ graphql:
     enabled: true
   playground:
     enabled: true
+  tools:
+    schema-location-pattern: '**/graphqls/*.graphqls'
 
 rest:
   api:
     goods-endpoint: http://localhost:8081/goods/
-    orders-endpoint: http://localhost:8082/orders/
+    orders-endpoint: http://localhost:8082/orders/
+    users-endpoint: http://localhost:8083/users/

+ 29 - 0
graphql-api/src/main/resources/graphqls/goods.graphqls

@@ -0,0 +1,29 @@
+type Goods {
+    # ID
+    id: ID!
+    # 商品序列号
+    serialNo: String!
+    # 商品名称
+    name: String!
+    # 价格
+    price: BigDecimal!
+    # 商品数量
+    itemCount: Int!
+    # 图片
+    img: String!
+    # 描述
+    description: String
+    # 详情
+    detail: String
+    # 订单列表
+    orders: [Order]
+}
+
+input GoodsInput{
+    name: String!
+    price: BigDecimal!
+    itemCount: Int!
+    img: String!
+    description: String
+    detail: String
+}

+ 5 - 0
graphql-api/src/main/resources/graphqls/mutation.graphqls

@@ -0,0 +1,5 @@
+type Mutation{
+    createGoods(input:GoodsInput): Goods!
+    createOrder(input:OrderInput): Order!
+    createUser(input:UserInput): User!
+}

+ 20 - 0
graphql-api/src/main/resources/graphqls/order.graphqls

@@ -0,0 +1,20 @@
+type Order {
+    id: ID!
+    orderNo: String!
+    goodsSerialNo: String!
+    userID: ID!
+    discount: Float!
+    originalAmount: BigDecimal!
+    discountAmount: BigDecimal!
+    createTime: DateTime!
+    updateTime: DateTime!
+    goods: Goods!
+    user: User!
+}
+
+input OrderInput{
+    goodsSerialNo: String!
+    discount: Float!
+    originalAmount: BigDecimal!
+    discountAmount: BigDecimal!
+}

+ 12 - 0
graphql-api/src/main/resources/graphqls/query.graphqls

@@ -0,0 +1,12 @@
+type Query{
+    goods(serialNo: String!): Goods!
+    goodsList: [Goods]
+
+    orderInfo(orderNo: String!): Order!
+    orderList: [Order]
+    orderQuery(goodsSerialNo: String!): [Order]
+
+    userInfo(userID: ID!): User!
+    userList: [User]
+    userQuery(username: String!): [User]
+}

+ 3 - 0
graphql-api/src/main/resources/graphqls/scala.graphqls

@@ -0,0 +1,3 @@
+scalar BigDecimal
+scalar DateTime
+scalar Date

+ 30 - 0
graphql-api/src/main/resources/graphqls/user.graphqls

@@ -0,0 +1,30 @@
+type User {
+    id: ID!
+    username: String!
+    password: String!
+    nickname: String!
+    img: String!
+    gender: Gender!
+    age: Int!
+    birthday: Date!
+    addresses:[String]
+    createTime: DateTime!
+    updateTime: DateTime!
+    orders: [Order]
+}
+
+enum Gender{
+    MALE
+    FEMALE
+}
+
+input UserInput{
+    username: String!
+    password: String!
+    nickname: String!
+    img: String!
+    gender: Gender!
+    age: Int!
+    birthday: Date!
+    addresses:[String]
+}

+ 0 - 54
graphql-api/src/main/resources/schema.graphqls

@@ -1,54 +0,0 @@
-type Query{
-    goods(serialNo: String!): Goods!
-    goodsList: [Goods]
-    orderInfo(orderNo: String!): Order!
-    orderList: [Order]
-    orderQuery(goodsSerialNo: String!): [Order]
-}
-
-type Mutation{
-    createGoods(input:GoodsInput): Goods!
-    createOrder(input:OrderInput): Order!
-}
-
-scalar BigDecimal
-scalar DateTime
-
-type Goods {
-    id: ID!
-    serialNo: String!
-    name: String!
-    price: BigDecimal!
-    itemCount: Int!
-    img: String!
-    description: String
-    detail: String
-}
-
-input GoodsInput{
-    name: String!
-    price: BigDecimal!
-    itemCount: Int!
-    img: String!
-    description: String
-    detail: String
-}
-
-
-type Order {
-    id: ID!
-    orderNo: String!
-    goodsSerialNo: String!
-    discount: Float!
-    originalAmount: BigDecimal!
-    discountAmount: BigDecimal!
-    createTime: DateTime!
-    updateTime: DateTime!
-}
-
-input OrderInput{
-    goodsSerialNo: String!
-    discount: Float!
-    originalAmount: BigDecimal!
-    discountAmount: BigDecimal!
-}

+ 3 - 0
order-service/src/main/java/com/remy/order/entity/Order.java

@@ -23,6 +23,9 @@ public class Order extends BaseEntity {
     @Column(name = "goods_serial_no")
     private String goodsSerialNo;
 
+    @Column(name = "userID")
+    private Long userID;
+
     @Column(name = "discount")
     private BigDecimal discount;
 

+ 36 - 0
user-service/src/main/java/com/remy/user/controller/UserController.java

@@ -0,0 +1,36 @@
+package com.remy.user.controller;
+
+import com.remy.user.entity.User;
+import com.remy.user.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("users")
+public class UserController {
+
+    @Autowired
+    UserService userService;
+
+    @RequestMapping
+    public List<User> findAll(){
+        return userService.findAll();
+    }
+
+    @PostMapping
+    public User createUser(User user){
+        return userService.save(user);
+    }
+
+    @GetMapping("{userId}")
+    public User findById(@PathVariable("userId") Long userId){
+        return userService.findByID(userId);
+    }
+
+    @GetMapping("query")
+    public User query(@RequestParam("username") String username){
+        return userService.findByUsername(username);
+    }
+}

+ 10 - 0
user-service/src/main/java/com/remy/user/dao/UserDAO.java

@@ -0,0 +1,10 @@
+package com.remy.user.dao;
+
+import com.remy.user.entity.User;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface UserDAO extends JpaRepository<User,Long> {
+
+    User findUserByUsername(String username);
+
+}

+ 55 - 0
user-service/src/main/java/com/remy/user/entity/User.java

@@ -0,0 +1,55 @@
+package com.remy.user.entity;
+
+import com.remy.common.entity.BaseEntity;
+import com.remy.common.enumeration.GenderEnum;
+import lombok.NoArgsConstructor;
+import lombok.Singular;
+import lombok.experimental.SuperBuilder;
+import org.hibernate.annotations.ColumnTransformer;
+
+import javax.persistence.*;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+
+@Entity
+@SuperBuilder
+@NoArgsConstructor
+@Table(name = "t_user")
+public class User extends BaseEntity {
+
+    @Column(name = "username", unique = true)
+    private String username;
+
+    @Column(name = "password")
+    @ColumnTransformer(
+            read = "AES_DECRYPT(UNHEX(password), 'my_pass')",
+            write = "HEX(AES_ENCRYPT(?, 'my_pass'))"
+    )
+    private String password;
+
+    @Column(name = "nickname")
+    private String nickname;
+
+    @Column(name = "img")
+    private String img;
+
+    @Column(name = "gender")
+    @Enumerated(EnumType.STRING)
+    private GenderEnum gender;
+
+    @Column(name = "age")
+    private Integer age;
+
+    @Column(name = "birthday")
+    private LocalDate birthday;
+
+    @Column(name = "level")
+    private Integer level;
+
+    @ElementCollection
+    @Column(name = "addresses")
+    @Singular
+    private List<String> addresses;
+
+}

+ 17 - 0
user-service/src/main/java/com/remy/user/service/UserService.java

@@ -0,0 +1,17 @@
+package com.remy.user.service;
+
+import com.remy.user.entity.User;
+
+import java.util.List;
+
+public interface UserService {
+
+    User save(User user);
+
+    List<User> findAll();
+
+    User findByID(Long userId);
+
+    User findByUsername(String username);
+
+}

+ 36 - 0
user-service/src/main/java/com/remy/user/service/impl/UserServiceImpl.java

@@ -0,0 +1,36 @@
+package com.remy.user.service.impl;
+
+import com.remy.user.dao.UserDAO;
+import com.remy.user.entity.User;
+import com.remy.user.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class UserServiceImpl implements UserService {
+
+    @Autowired
+    UserDAO userDAO;
+
+    @Override
+    public User save(User user) {
+        return userDAO.save(user);
+    }
+
+    @Override
+    public List<User> findAll() {
+        return userDAO.findAll();
+    }
+
+    @Override
+    public User findByID(Long userId) {
+        return userDAO.findById(userId).get();
+    }
+
+    @Override
+    public User findByUsername(String username) {
+        return userDAO.findUserByUsername(username);
+    }
+}

+ 5 - 2
user-service/src/main/resources/application.yml

@@ -7,5 +7,8 @@ spring:
     username: graphql
     password: graphql
   jpa:
-    generate-ddl: false
-    show-sql: true
+    generate-ddl: true
+    show-sql: true
+    properties:
+      hibernate:
+        format_sql: true