Przeglądaj źródła

基础表设计

licailing 5 lat temu
rodzic
commit
ba7777750e
100 zmienionych plików z 5959 dodań i 545 usunięć
  1. 6 0
      pom.xml
  2. 1 1
      src/main/java/com/izouma/imt/config/WebMvcConfig.java
  3. 39 0
      src/main/java/com/izouma/imt/domain/EarnPoints.java
  4. 44 0
      src/main/java/com/izouma/imt/domain/Email.java
  5. 11 8
      src/main/java/com/izouma/imt/domain/Information.java
  6. 30 0
      src/main/java/com/izouma/imt/domain/PointsRecord.java
  7. 6 3
      src/main/java/com/izouma/imt/domain/ProductCategory.java
  8. 34 0
      src/main/java/com/izouma/imt/domain/SuccessCase.java
  9. 22 0
      src/main/java/com/izouma/imt/domain/User.java
  10. 43 19
      src/main/java/com/izouma/imt/domain/buyers/BuyersInfo.java
  11. 25 0
      src/main/java/com/izouma/imt/domain/buyers/BuyersMember.java
  12. 37 0
      src/main/java/com/izouma/imt/domain/buyers/Collect.java
  13. 31 0
      src/main/java/com/izouma/imt/domain/buyers/ExchangePoints.java
  14. 23 0
      src/main/java/com/izouma/imt/domain/buyers/IntentionList.java
  15. 0 3
      src/main/java/com/izouma/imt/domain/buyers/LoginRecord.java
  16. 75 0
      src/main/java/com/izouma/imt/domain/table/AdvisoryForm.java
  17. 60 0
      src/main/java/com/izouma/imt/domain/table/DemandSteward.java
  18. 50 0
      src/main/java/com/izouma/imt/domain/table/EnterpriseClaim.java
  19. 18 12
      src/main/java/com/izouma/imt/domain/vendor/Product.java
  20. 15 6
      src/main/java/com/izouma/imt/domain/vendor/ProductParameter.java
  21. 31 0
      src/main/java/com/izouma/imt/domain/vendor/ProductTag.java
  22. 43 22
      src/main/java/com/izouma/imt/domain/vendor/VendorInfo.java
  23. 30 0
      src/main/java/com/izouma/imt/domain/vendor/VendorMember.java
  24. 71 0
      src/main/java/com/izouma/imt/dto/BuyersDTO.java
  25. 13 0
      src/main/java/com/izouma/imt/dto/EmailType.java
  26. 40 0
      src/main/java/com/izouma/imt/dto/VendorInfoDTO.java
  27. 12 0
      src/main/java/com/izouma/imt/enums/AdvisoryType.java
  28. 16 0
      src/main/java/com/izouma/imt/enums/CollectType.java
  29. 11 7
      src/main/java/com/izouma/imt/enums/InformationType.java
  30. 3 1
      src/main/java/com/izouma/imt/enums/Language.java
  31. 42 0
      src/main/java/com/izouma/imt/enums/OfflineService.java
  32. 16 0
      src/main/java/com/izouma/imt/repo/EmailRepo.java
  33. 23 0
      src/main/java/com/izouma/imt/repo/ProductCategoryRepo.java
  34. 2 0
      src/main/java/com/izouma/imt/repo/UserRepo.java
  35. 16 0
      src/main/java/com/izouma/imt/repo/buyers/BuyersInfoRepo.java
  36. 16 0
      src/main/java/com/izouma/imt/repo/buyers/CollectRepo.java
  37. 17 0
      src/main/java/com/izouma/imt/repo/table/AdvisoryFormRepo.java
  38. 16 0
      src/main/java/com/izouma/imt/repo/table/DemandStewardRepo.java
  39. 16 0
      src/main/java/com/izouma/imt/repo/table/EnterpriseClaimRepo.java
  40. 16 0
      src/main/java/com/izouma/imt/repo/vendor/ProductRepo.java
  41. 16 0
      src/main/java/com/izouma/imt/repo/vendor/ProductTagRepo.java
  42. 22 0
      src/main/java/com/izouma/imt/repo/vendor/VendorInfoRepo.java
  43. 20 0
      src/main/java/com/izouma/imt/service/EmailService.java
  44. 47 0
      src/main/java/com/izouma/imt/service/ProductCategoryService.java
  45. 19 0
      src/main/java/com/izouma/imt/service/UserService.java
  46. 72 0
      src/main/java/com/izouma/imt/service/buyers/BuyersInfoService.java
  47. 20 0
      src/main/java/com/izouma/imt/service/buyers/CollectService.java
  48. 45 0
      src/main/java/com/izouma/imt/service/table/AdvisoryFormService.java
  49. 20 0
      src/main/java/com/izouma/imt/service/table/DemandStewardService.java
  50. 97 0
      src/main/java/com/izouma/imt/service/table/EnterpriseClaimService.java
  51. 20 0
      src/main/java/com/izouma/imt/service/vendor/ProductService.java
  52. 20 0
      src/main/java/com/izouma/imt/service/vendor/ProductTagService.java
  53. 66 0
      src/main/java/com/izouma/imt/service/vendor/VendorInfoService.java
  54. 9 0
      src/main/java/com/izouma/imt/web/AuthenticationController.java
  55. 60 0
      src/main/java/com/izouma/imt/web/EmailController.java
  56. 65 0
      src/main/java/com/izouma/imt/web/ProductCategoryController.java
  57. 63 0
      src/main/java/com/izouma/imt/web/buyers/BuyersInfoController.java
  58. 63 0
      src/main/java/com/izouma/imt/web/buyers/CollectController.java
  59. 63 0
      src/main/java/com/izouma/imt/web/table/AdvisoryFormController.java
  60. 63 0
      src/main/java/com/izouma/imt/web/table/DemandStewardController.java
  61. 63 0
      src/main/java/com/izouma/imt/web/table/EnterpriseClaimController.java
  62. 63 0
      src/main/java/com/izouma/imt/web/vendor/ProductController.java
  63. 63 0
      src/main/java/com/izouma/imt/web/vendor/ProductTagController.java
  64. 63 0
      src/main/java/com/izouma/imt/web/vendor/VendorInfoController.java
  65. 3 3
      src/main/resources/application.yaml
  66. 0 0
      src/main/resources/genjson/AdvisoryForm.json
  67. 0 0
      src/main/resources/genjson/BuyersInfo.json
  68. 1 0
      src/main/resources/genjson/Collect.json
  69. 1 0
      src/main/resources/genjson/DemandSteward.json
  70. 1 0
      src/main/resources/genjson/Email.json
  71. 1 0
      src/main/resources/genjson/EnterpriseClaim.json
  72. 0 0
      src/main/resources/genjson/Product.json
  73. 1 0
      src/main/resources/genjson/ProductCategory.json
  74. 1 0
      src/main/resources/genjson/ProductTag.json
  75. 0 0
      src/main/resources/genjson/VendorInfo.json
  76. 712 453
      src/main/vue/package-lock.json
  77. 1 1
      src/main/vue/package.json
  78. 2 2
      src/main/vue/src/plugins/http.js
  79. 141 1
      src/main/vue/src/router.js
  80. 129 0
      src/main/vue/src/views/AdvisoryFormEdit.vue
  81. 177 0
      src/main/vue/src/views/AdvisoryFormList.vue
  82. 174 0
      src/main/vue/src/views/BuyersInfoEdit.vue
  83. 190 0
      src/main/vue/src/views/BuyersInfoList.vue
  84. 350 0
      src/main/vue/src/views/Categories.vue
  85. 116 0
      src/main/vue/src/views/DemandStewardEdit.vue
  86. 164 0
      src/main/vue/src/views/DemandStewardList.vue
  87. 123 0
      src/main/vue/src/views/EmailEdit.vue
  88. 177 0
      src/main/vue/src/views/EmailList.vue
  89. 107 0
      src/main/vue/src/views/EnterpriseClaimEdit.vue
  90. 161 0
      src/main/vue/src/views/EnterpriseClaimList.vue
  91. 149 0
      src/main/vue/src/views/ProductEdit.vue
  92. 175 0
      src/main/vue/src/views/ProductList.vue
  93. 98 0
      src/main/vue/src/views/ProductTagEdit.vue
  94. 158 0
      src/main/vue/src/views/ProductTagList.vue
  95. 9 0
      src/main/vue/src/views/UserEdit.vue
  96. 5 3
      src/main/vue/src/views/UserList.vue
  97. 205 0
      src/main/vue/src/views/VendorInfoEdit.vue
  98. 205 0
      src/main/vue/src/views/VendorInfoList.vue
  99. 21 0
      src/test/java/com/izouma/imt/controller/AuthControllerTest.java
  100. 59 0
      src/test/java/com/izouma/imt/repo/ProductCategoryRepoTest.java

+ 6 - 0
pom.xml

@@ -266,6 +266,12 @@
             <version>1.6.2</version>
         </dependency>
 
+        <!-- HUTOOL -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.0</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 1 - 1
src/main/java/com/izouma/imt/config/WebMvcConfig.java

@@ -19,7 +19,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
 
     @Override
     public void addResourceHandlers(ResourceHandlerRegistry registry) {
-        // registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
+         registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
         // registry.addResourceHandler("webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
         registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
         registry.addResourceHandler("/admin/**").addResourceLocations("classpath:/static/admin/");

+ 39 - 0
src/main/java/com/izouma/imt/domain/EarnPoints.java

@@ -0,0 +1,39 @@
+package com.izouma.imt.domain;
+
+import com.izouma.imt.enums.Identity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Where(clause = "enabled = 1")
+@ApiModel(value = "可获得积分")
+public class EarnPoints extends BaseEntity {
+    @ApiModelProperty(value = "项目名称", name = "name")
+    private String name;
+
+    @ApiModelProperty(value = "描述",name = "description")
+    private String description;
+
+//    @ApiModelProperty(value = "类型", name = "type")
+//    private PointsType type;
+
+    @ApiModelProperty(value = "积分", name = "points")
+    private int points;
+
+    @ApiModelProperty(value = "单位", name = "unit")
+    private String unit;
+
+    /*
+    厂商/经销商
+     */
+    @ApiModelProperty(value = "身份",name = "identity")
+    private Identity identity;
+}

+ 44 - 0
src/main/java/com/izouma/imt/domain/Email.java

@@ -0,0 +1,44 @@
+package com.izouma.imt.domain;
+
+import com.izouma.imt.dto.EmailType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "系统邮件", description = "Email")
+public class Email extends BaseEntity {
+    @ApiModelProperty(value = "发件人", name = "sendUserId")
+    private Long sendUserId;
+
+    @ApiModelProperty(value = "收件人", name = "receiveUserId")
+    private Long receiveUserId;
+
+    @ApiModelProperty(value = "发送时间", name = "sendTime")
+    private LocalDateTime sendTime;
+
+    @ApiModelProperty(value = "标题", name = "title")
+    private String title;
+
+    @ApiModelProperty(value = "内容", name = "content")
+    private String content;
+
+    @ApiModelProperty(value = "是否已读", name = "isRead")
+    private Boolean isRead;
+
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "消息中心", name = "type")
+    private EmailType type;
+}

+ 11 - 8
src/main/java/com/izouma/imt/domain/Information.java

@@ -7,33 +7,36 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.hibernate.annotations.Where;
 
+import javax.persistence.Entity;
 import java.time.LocalDateTime;
 
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-@Where(clause = "enabled = 1")
+@Entity
 @ApiModel(value = "信息资讯")
 public class Information extends BaseEntity {
 
-    @ApiModelProperty(value = "标题",name = "title")
+    private Long vendorInfoId;
+
+    @ApiModelProperty(value = "标题", name = "title")
     private String title;
 
-    @ApiModelProperty(value = "内容",name = "content")
+
+    @ApiModelProperty(value = "内容", name = "content")
     private String content;
 
-    @ApiModelProperty(value = "分类",name = "type")
+    @ApiModelProperty(value = "分类", name = "type")
     private InformationType type;
 
     /*
     图片/视频
      */
-    @ApiModelProperty(value = "图片",name = "img")
+    @ApiModelProperty(value = "图片", name = "img")
     private String img;
 
-    @ApiModelProperty(value = "发表时间",name = "IssuingTime")
-    private LocalDateTime IssuingTime;
+    @ApiModelProperty(value = "发表时间", name = "issuingTime")
+    private LocalDateTime issuingTime;
 }

+ 30 - 0
src/main/java/com/izouma/imt/domain/PointsRecord.java

@@ -0,0 +1,30 @@
+package com.izouma.imt.domain;
+
+import com.izouma.imt.enums.PointsType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Where(clause = "enabled = 1")
+@ApiModel(value = "积分记录")
+public class PointsRecord extends BaseEntity {
+    private Long userId;
+
+    @ApiModelProperty(value = "积分类型", name = "type")
+    private PointsType type;
+
+    @ApiModelProperty(value = "详情", name = "details")
+    private String details;
+
+    private LocalDateTime dateTime;
+}

+ 6 - 3
src/main/java/com/izouma/imt/domain/ProductCategory.java

@@ -1,5 +1,6 @@
 package com.izouma.imt.domain;
 
+import io.swagger.annotations.ApiModel;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -13,18 +14,20 @@ import java.util.List;
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-@Where(clause = "enabled = 1")
+@Entity
+@ApiModel(value = "产品分类&EMO产品类别")
 public class ProductCategory extends BaseEntity {
     private String enName;
 
     private String chName;
 
+    /*
+    emo主类别代码
+     */
     private String code;
 
     private Long parentId;
 
-    @Column(nullable = false)
-    private Boolean enabled = true;
 
     @OneToMany
     @JoinColumn(name = "parentId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))

+ 34 - 0
src/main/java/com/izouma/imt/domain/SuccessCase.java

@@ -0,0 +1,34 @@
+package com.izouma.imt.domain;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+//@Entity
+@ApiModel(value = "成功案例", description = "SuccessCase")
+public class SuccessCase extends BaseEntity {
+
+    @ApiModelProperty(value = "厂商id", name = "vendorInfoId")
+    private Long vendorInfoId;
+
+    @ApiModelProperty(value = "视频", name = "video")
+    private String video;
+
+    @ApiModelProperty(value = "图片", name = "img")
+    private String img;
+
+    @ApiModelProperty(value = "标题", name = "title")
+    private String title;
+
+    @ApiModelProperty(value = "内容", name = "content")
+    private String content;
+}

+ 22 - 0
src/main/java/com/izouma/imt/domain/User.java

@@ -6,6 +6,7 @@ import com.izouma.imt.annotations.Searchable;
 import com.izouma.imt.config.Constants;
 import com.izouma.imt.security.Authority;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -27,6 +28,9 @@ import java.util.Set;
 @ApiModel(value = "用户", description = "用户")
 public class User extends BaseEntity implements Serializable {
 
+    /*
+    发送账号,2为字母6位数字
+     */
     @Pattern(regexp = Constants.Regex.USERNAME)
     @Size(min = 1, max = 50)
     @Column(nullable = false, unique = true)
@@ -54,8 +58,12 @@ public class User extends BaseEntity implements Serializable {
 
     private String openId;
 
+    /*
+    先生女士
+     */
     private String sex;
 
+
     private String language;
 
     private String city;
@@ -64,10 +72,24 @@ public class User extends BaseEntity implements Serializable {
 
     private String country;
 
+//    @ApiModelProperty(value = "街道",name = "street")
+//    private String street;
+
+//    @ApiModelProperty(value = "详细地址", name = "address")
+//    private String address;
+
     @Searchable
     private String phone;
 
     private String email;
 
+    @ApiModelProperty(value = "职位", name = "position")
+    private String position;
+
+    /*
+    用于自动识别
+     */
+    @ApiModelProperty(value = "名片", name = "card")
+    private String card;
 
 }

+ 43 - 19
src/main/java/com/izouma/imt/domain/buyers/BuyersInfo.java

@@ -2,15 +2,16 @@ package com.izouma.imt.domain.buyers;
 
 import com.izouma.imt.domain.BaseEntity;
 import com.izouma.imt.enums.BusinessCategory;
+import com.izouma.imt.enums.Language;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.hibernate.annotations.Where;
 
 import javax.persistence.Column;
+import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import java.time.LocalDateTime;
@@ -19,17 +20,20 @@ import java.time.LocalDateTime;
 @NoArgsConstructor
 @AllArgsConstructor
 @Builder
-@Where(clause = "enabled = 1")
-@ApiModel(value = "采购商信息")
+@Entity
+@ApiModel(value = "采购商信息",description = "BuyersInfo")
 public class BuyersInfo extends BaseEntity {
 
+    private Long userId;
+
     @ApiModelProperty(value = "logo", name = "logo")
     private String logo;
 
-    @Column(nullable = false)
+//    @Column(nullable = false)
     @ApiModelProperty(value = "公司英文名", name = "enCompanyName")
     private String enCompanyName;
 
+
     @ApiModelProperty(value = "公司中文名", name = "chCompanyName")
     private String chCompanyName;
 
@@ -38,17 +42,33 @@ public class BuyersInfo extends BaseEntity {
 
     private String img;
 
+    @ApiModelProperty(value = "公司电话", name = "phone")
+    private String phone;
+
+    @ApiModelProperty(value = "公司邮箱", name = "email")
+    private String email;
+
     /*
-    如果在中国有地址,填写国外还是国内
-    国家/地区、省、市、区、街道
+    地址
+    ---开始
      */
-    private String address;
+    private String city;
 
+    private String province;
+
+    private String country;
+
+    @ApiModelProperty(value = "区", name = "area")
+    private String district;
+
+//    @ApiModelProperty(value = "街道", name = "street")
+//    private String street;
+
+    @ApiModelProperty(value = "详细地址", name = "address")
+    private String address;
     /*
-    详细的地址
+    ---结束
      */
-    @ApiModelProperty(value = "详细地址")
-    private String address1;
 
     @ApiModelProperty(value = "邮政编码", name = "enCompanyName")
     private String postalCode;
@@ -78,17 +98,19 @@ public class BuyersInfo extends BaseEntity {
     @ApiModelProperty(value = "应用领域", name = "applicationField")
     private String applicationField;
 
+    /*
+    所属行业
+     */
+    @ApiModelProperty(value = "所属行业", name = "industry")
+    private String industry;
+
     /*
     勾选 勾选到2级
      */
     @ApiModelProperty(value = "感兴趣的产品类别", name = "interestedProCateId")
     private String interestedProCateId;
 
-    /*
-    自动识别,需要存留?
-     */
-    @ApiModelProperty(value = "上传名片", name = "uploadCard")
-    private String uploadCard;
+
 
     /*
     人数,填写区间
@@ -102,9 +124,11 @@ public class BuyersInfo extends BaseEntity {
     @ApiModelProperty(value = "其他文件", name = "otherFiles")
     private String otherFiles;
 
-    @Builder.Default
-    @Column(nullable = false)
-    private Boolean enabled = true;
-
+    /*
+    交流语言
+     */
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "交流语言", name = "language")
+    private Language language;
 
 }

+ 25 - 0
src/main/java/com/izouma/imt/domain/buyers/BuyersMember.java

@@ -0,0 +1,25 @@
+package com.izouma.imt.domain.buyers;
+
+import com.izouma.imt.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "采购商会员")
+public class BuyersMember extends BaseEntity {
+    private Long userId;
+
+    @ApiModelProperty(value = "积分", name = "integral")
+    private Integer integral;
+
+    @ApiModelProperty(value = "等级", name = "grade")
+    private Integer grade;
+}

+ 37 - 0
src/main/java/com/izouma/imt/domain/buyers/Collect.java

@@ -0,0 +1,37 @@
+package com.izouma.imt.domain.buyers;
+
+import com.izouma.imt.domain.BaseEntity;
+import com.izouma.imt.enums.CollectType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+import javax.persistence.Entity;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Entity
+@ApiModel(value = "我的收藏", description = "Collect")
+public class Collect extends BaseEntity {
+
+    private Long userId;
+
+    /*
+    不同收藏的id
+     */
+    @ApiModelProperty(value = "收藏id", name = "cid")
+    private Long cid;
+
+    /*
+    收藏类别
+     */
+    @ApiModelProperty(value = "收藏类别", name = "type")
+    private CollectType type;
+
+}

+ 31 - 0
src/main/java/com/izouma/imt/domain/buyers/ExchangePoints.java

@@ -0,0 +1,31 @@
+package com.izouma.imt.domain.buyers;
+
+import com.izouma.imt.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Where(clause = "enabled = 1")
+@ApiModel(value = "采购商可兑换积分")
+public class ExchangePoints extends BaseEntity {
+    @ApiModelProperty(value = "项目名称", name = "name")
+    private String name;
+
+//    @ApiModelProperty(value = "优惠")
+//    private String type;
+
+    @ApiModelProperty(value = "描述", name = "description")
+    private String description;
+
+    @ApiModelProperty(value = "积分", name = "points")
+    private int points;
+
+}

+ 23 - 0
src/main/java/com/izouma/imt/domain/buyers/IntentionList.java

@@ -0,0 +1,23 @@
+package com.izouma.imt.domain.buyers;
+
+import com.izouma.imt.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+//@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "意向单", description = "批量询价")
+public class IntentionList extends BaseEntity {
+    private Long userId;
+
+    private Long productId;
+
+}

+ 0 - 3
src/main/java/com/izouma/imt/domain/buyers/LoginRecord.java

@@ -7,7 +7,6 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.hibernate.annotations.Where;
 
 import java.time.LocalDateTime;
 
@@ -15,7 +14,6 @@ import java.time.LocalDateTime;
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-@Where(clause = "enabled = 1")
 @ApiModel(value = "采购商登录记录")
 public class LoginRecord extends BaseEntity {
     private Long userId;
@@ -26,5 +24,4 @@ public class LoginRecord extends BaseEntity {
     @ApiModelProperty(value = "在线时长", name = "onlineTime")
     private String onlineTime;
 
-    private Boolean enabled;
 }

+ 75 - 0
src/main/java/com/izouma/imt/domain/table/AdvisoryForm.java

@@ -0,0 +1,75 @@
+package com.izouma.imt.domain.table;
+
+import com.izouma.imt.annotations.Searchable;
+import com.izouma.imt.domain.BaseEntity;
+import com.izouma.imt.enums.AdvisoryType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import java.time.LocalDateTime;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "咨询表记录", description = "AdvisoryForm")
+public class AdvisoryForm extends BaseEntity {
+
+    private Long userId;
+
+    /*
+    先生/女士
+    */
+    @Column(nullable = false)
+    private String sex;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "职位", name = "position")
+    private String position;
+
+    @Column(nullable = false)
+    private String nickname;
+
+    @Searchable
+    private String phone;
+
+    @Column(nullable = false)
+    private String email;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "公司名", name = "companyName")
+    private String companyName;
+
+    /*
+    按厂商建咨询表
+     */
+    @ApiModelProperty(value = "厂商Id", name = "vendorInfoId")
+    private Long vendorInfoId;
+
+    /*
+    批量询价时,为多个产品id
+     */
+    @Column(nullable = false)
+    @ApiModelProperty(value = "产品id", name = "productIds")
+    private String productIds;
+
+    @ApiModelProperty(value = "计划加工的工件", name = "artifact")
+    private String artifact;
+
+    @ApiModelProperty(value = "其他问题", name = "otherProblems")
+    private String otherProblems;
+
+    @ApiModelProperty(value = "类型", name = "type")
+    private AdvisoryType type;
+
+    @ApiModelProperty(value = "咨询时间", name = "advisoryTime")
+    private LocalDateTime advisoryTime;
+
+}

+ 60 - 0
src/main/java/com/izouma/imt/domain/table/DemandSteward.java

@@ -0,0 +1,60 @@
+package com.izouma.imt.domain.table;
+
+import com.izouma.imt.annotations.Searchable;
+import com.izouma.imt.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "需求管家记录", description = "DemandSteward")
+public class DemandSteward extends BaseEntity {
+
+    private Long userId;
+
+    /*
+    先生/女士
+    */
+    @Column(nullable = false)
+    private String sex;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "职位", name = "position")
+    private String position;
+
+    @Column(nullable = false)
+    private String nickname;
+
+    @Searchable
+    private String phone;
+
+    @Column(nullable = false)
+    private String email;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "公司名", name = "companyName")
+    private String companyName;
+
+    /*
+    勾选
+    数据统计报告、设备安装与调试、维修、代加工服务、检测认证、
+    商务咨询、融资租赁、专业培训、技术系统集成、二手设备交易、其它
+     */
+    @Column(nullable = false)
+    @ApiModelProperty(value = "功能需求", name = "functionalRequirements")
+    private String functionalRequirements;
+
+    @ApiModelProperty(value = "其他问题", name = "otherProblems")
+    private String otherProblems;
+
+}

+ 50 - 0
src/main/java/com/izouma/imt/domain/table/EnterpriseClaim.java

@@ -0,0 +1,50 @@
+package com.izouma.imt.domain.table;
+
+import com.izouma.imt.annotations.Searchable;
+import com.izouma.imt.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+@Data
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "企业认领", description = "EnterpriseClaim")
+public class EnterpriseClaim extends BaseEntity {
+
+    private Long userId;
+
+    /*
+    先生/女士
+    */
+    @Column(nullable = false)
+    private String sex;
+
+    @Column(nullable = false)
+    @ApiModelProperty(value = "职位", name = "position")
+    private String position;
+
+    @Column(nullable = false)
+    private String nickname;
+
+    @Searchable
+    private String phone;
+
+    @Column(nullable = false)
+    private String email;
+
+    /*
+    认领企业id
+     */
+    @ApiModelProperty(value = "企业id", name = "vendorId")
+    private Long vendorId;
+
+}

+ 18 - 12
src/main/java/com/izouma/imt/domain/vendor/Product.java

@@ -10,13 +10,14 @@ import lombok.NoArgsConstructor;
 import org.hibernate.annotations.Where;
 
 import javax.persistence.Column;
+import javax.persistence.Entity;
 import java.math.BigDecimal;
 
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-@Where(clause = "enabled = 1")
+@Entity
 @ApiModel(value = "产品信息")
 public class Product extends BaseEntity {
 
@@ -39,19 +40,28 @@ public class Product extends BaseEntity {
     private String model;
 
     /*
-    是三选一还是都可以有
+    多个文件逗号分割
      */
-    @ApiModelProperty(value = "图片/视频/pdf", name = "img")
+    @ApiModelProperty(value = "图片", name = "img")
     private String img;
 
+    @ApiModelProperty(value = "视频", name = "video")
+    private String video;
+
+    /*
+    多个文件逗号分割
+    */
+    @ApiModelProperty(value = "pdf", name = "pdf")
+    private String pdf;
+
     @ApiModelProperty(value = "简介", name = "introduction")
     private String introduction;
 
-    @ApiModelProperty(value = "参数", name = "parameter")
-    private String parameter;
-
-    @ApiModelProperty(value = "标签", name = "tag")
-    private String tag;
+    /*
+    productTag的id,多个逗号隔开
+     */
+    @ApiModelProperty(value = "标签", name = "productTagIds")
+    private String productTagIds;
 
     /*
     系统生成:设备编码十二位,前四位按照设备类别固定,后八位按序产生,前四位编码为“EMO产品类别”表格中的编码
@@ -98,10 +108,6 @@ public class Product extends BaseEntity {
     @ApiModelProperty(value = "采购商名称", name = "buyersName")
     private String buyersName;
 
-    @Builder.Default
-    @Column(nullable = false)
-    private Boolean enabled = true;
-
     @ApiModelProperty(value = "访问次数", name = "visits")
     private Integer visits;
 

+ 15 - 6
src/main/java/com/izouma/imt/domain/vendor/ProductParameter.java

@@ -1,6 +1,8 @@
 package com.izouma.imt.domain.vendor;
 
+import com.izouma.imt.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -13,15 +15,22 @@ import javax.persistence.Column;
 @NoArgsConstructor
 @AllArgsConstructor
 @Builder
-@Where(clause = "enabled = 1")
-@ApiModel(value = "产品参数")
-public class ProductParameter {
+@ApiModel(value = "产品参数", description = "ProductParameter")
+public class ProductParameter extends BaseEntity {
+
+    @ApiModelProperty(value = "产品Id", name = "productId")
+    private Long productId;
+
+    @ApiModelProperty(value = "英文名", name = "enName")
     private String enName;
 
+    @ApiModelProperty(value = "中文名", name = "chName")
     private String chName;
 
-    @Builder.Default
-    @Column(nullable = false)
-    private Boolean enabled = true;
+    @ApiModelProperty(value = "值", name = "value")
+    private String value;
+
+    @ApiModelProperty(value = "前端展示", name = "isShow")
+    private Boolean isShow;
 
 }

+ 31 - 0
src/main/java/com/izouma/imt/domain/vendor/ProductTag.java

@@ -0,0 +1,31 @@
+package com.izouma.imt.domain.vendor;
+
+import com.izouma.imt.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Entity
+@ApiModel(value = "产品标签", description = "ProductTag")
+public class ProductTag extends BaseEntity {
+
+    @ApiModelProperty(value = "英文名", name = "enName")
+    private String enName;
+
+    @ApiModelProperty(value = "中文名", name = "chName")
+    private String chName;
+
+    @ApiModelProperty(value = "上一级Id", name = "parentId")
+    private Long parentId;
+
+
+}

+ 43 - 22
src/main/java/com/izouma/imt/domain/vendor/VendorInfo.java

@@ -1,23 +1,28 @@
 package com.izouma.imt.domain.vendor;
 
+import com.izouma.imt.converter.LongArrayConverter;
+import com.izouma.imt.domain.BaseEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.hibernate.annotations.Where;
 
 import javax.persistence.Column;
+import javax.persistence.Convert;
+import javax.persistence.Entity;
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-@Where(clause = "enabled = 1")
+@Entity
 @ApiModel(value = "厂商基本信息")
-public class VendorInfo {
+public class VendorInfo extends BaseEntity {
+
     private Long userId;
 
     @ApiModelProperty(value = "logo", name = "logo")
@@ -36,17 +41,32 @@ public class VendorInfo {
     private String img;
 
     /*
-    总部地址
-    国家/地区、省、市、区、街道
-     */
-    @ApiModelProperty(value = "总部地址")
-    private String headquartersAddress;
+    地址
+    ---开始
+    */
+    private String city;
+
+    private String province;
+
+    private String country;
+
+    @ApiModelProperty(value = "区",name = "area")
+    private String area;
 
+    @ApiModelProperty(value = "街道",name = "street")
+    private String street;
+
+    @ApiModelProperty(value = "详细地址", name = "address")
+    private String address;
     /*
-    详细的地址
+    ---结束
      */
-    @ApiModelProperty(value = "详细地址")
-    private String address1;
+
+    /*
+    是否在中国成立办事处/建立公司 分公司
+    */
+    @ApiModelProperty(value = "是否中国有公司")
+    private Boolean branch;
 
     @ApiModelProperty(value = "邮政编码")
     private String postalCode;
@@ -63,17 +83,16 @@ public class VendorInfo {
     @ApiModelProperty(value = "网站主页")
     private String homepage;
 
-    /*
-    是否在中国成立办事处/建立公司 分公司
-     */
-//    @ApiModelProperty(value = "是否中国有公司")
-//    private Boolean branch;
 
     /*
-    5大类
+    5大类 按此筛选
+    多选
      */
     @ApiModelProperty(value = "主要产品类别")
-    private Long productCategoryId;
+    private String productCategoryId;
+
+    @Convert(converter = LongArrayConverter.class)
+    private List<Long> categoryIds;
 
     // 通讯电子 机加工 能源	汽车	模具	航空航天	医疗	牙科	钟表珠宝	轨道交通	机械部件
     // 石化	光学	船舶	农业	管材	检测	工业自动化 消费品	建筑	包装	机械制造	电器	其它	其它变量
@@ -93,11 +112,13 @@ public class VendorInfo {
     @ApiModelProperty(value = "其他文件", name = "otherFiles")
     private String otherFiles;
 
-    @Builder.Default
-    @Column(nullable = false)
-    private Boolean enabled = true;
-
     @ApiModelProperty(value = "访问次数", name = "visits")
     private Integer visits;
 
+    /*
+    是否已被认领
+     */
+//    @ApiModelProperty(value = "被认领",name = "beenClaimed")
+//    private Boolean beenClaimed;
+
 }

+ 30 - 0
src/main/java/com/izouma/imt/domain/vendor/VendorMember.java

@@ -0,0 +1,30 @@
+package com.izouma.imt.domain.vendor;
+
+import com.izouma.imt.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Where(clause = "enabled = 1")
+@ApiModel(value = "厂商会员")
+public class VendorMember extends BaseEntity {
+
+    @ApiModelProperty(value = "服务类型")
+    private String serviceType;
+
+    @ApiModelProperty(value = "服务内容")
+    private String serviceContent;
+
+    private String valueType;
+
+
+
+}

+ 71 - 0
src/main/java/com/izouma/imt/dto/BuyersDTO.java

@@ -0,0 +1,71 @@
+package com.izouma.imt.dto;
+
+import com.izouma.imt.annotations.Searchable;
+import com.izouma.imt.enums.Language;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class BuyersDTO {
+    private String phone;
+
+    @ApiModelProperty(value = "验证码", name = "code")
+    private String code;
+
+    private String password;
+
+    /*
+    名片/证件 用于自动识别
+     */
+    @ApiModelProperty(value = "名片", name = "card")
+    private String card;
+
+    @ApiModelProperty(value = "公司中文名", name = "chCompanyName")
+    private String chCompanyName;
+
+    @Searchable
+    private String nickname;
+
+
+    @ApiModelProperty(value = "职位", name = "position")
+    private String position;
+
+    private String email;
+
+    private String city;
+
+    private String province;
+
+    private String country;
+
+    @ApiModelProperty(value = "区", name = "area")
+    private String district;
+
+//    @ApiModelProperty(value = "地址", name = "address")
+//    private String address;
+
+    /*
+    所属行业
+    */
+    @ApiModelProperty(value = "所属行业", name = "industry")
+    private String industry;
+
+
+    /*
+    勾选 勾选到2级
+    */
+    @ApiModelProperty(value = "感兴趣的产品类别", name = "interestedProCateId")
+    private String interestedProCateId;
+
+    /*
+    交流语言
+    */
+    @ApiModelProperty(value = "交流语言", name = "language")
+    private Language language;
+}

+ 13 - 0
src/main/java/com/izouma/imt/dto/EmailType.java

@@ -0,0 +1,13 @@
+package com.izouma.imt.dto;
+
+public enum EmailType {
+    /**
+     * 系统消息
+     */
+    SYSTEM_INFORMATION,
+
+    /**
+     * 咨询消息 意向单
+     */
+    CONSULTING_NEWS
+}

+ 40 - 0
src/main/java/com/izouma/imt/dto/VendorInfoDTO.java

@@ -0,0 +1,40 @@
+package com.izouma.imt.dto;
+
+import com.izouma.imt.enums.Language;
+import com.izouma.imt.domain.vendor.VendorInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class VendorInfoDTO extends VendorInfo {
+
+    private String phone;
+
+    @ApiModelProperty(value = "验证码", name = "code")
+    private String code;
+
+    private String password;
+
+    @ApiModelProperty(value = "联系人姓名", name = "nickname")
+    private String nickname;
+
+    /*
+    先生女士
+     */
+    private String sex;
+
+    private String city;
+
+    private String email;
+
+    @ApiModelProperty(value = "职位", name = "position")
+    private String position;
+
+    private String province;
+
+    private String country;
+
+    @ApiModelProperty(value = "交流语言", name = "language")
+    private Language language;
+
+}

+ 12 - 0
src/main/java/com/izouma/imt/enums/AdvisoryType.java

@@ -0,0 +1,12 @@
+package com.izouma.imt.enums;
+
+public enum AdvisoryType {
+    /*
+    询价
+     */
+    INQUIRY,
+    /*
+    咨询
+     */
+    ADVISORY
+}

+ 16 - 0
src/main/java/com/izouma/imt/enums/CollectType.java

@@ -0,0 +1,16 @@
+package com.izouma.imt.enums;
+
+public enum CollectType {
+    /*
+    厂商
+     */
+    VENDOR,
+    /*
+    产品
+     */
+    PRODUCT,
+    /*
+    文章
+     */
+    INFORMATION
+}

+ 11 - 7
src/main/java/com/izouma/imt/enums/InformationType.java

@@ -2,20 +2,24 @@ package com.izouma.imt.enums;
 
 public enum InformationType {
     /*
-    品发布
+    品发布
      */
-    PRODUCT_RELEASE,
+    NEW_PRODUCT_RELEASE,
     /*
-    行业展会
+    行业新闻
      */
-    INDUSTRY_EXHIBITION,
+    INDUSTRY_NEWS,
     /*
-    技术交流
+    技术资讯
      */
-    TECHNOLOGY_EXCHANGE,
+    TECHNICAL_INFORMATION,
     /*
     行业活动
      */
-    INDUSTRY_ACTIVITIES
+    INDUSTRY_ACTIVITIES,
+    /*
+    政策信息
+     */
+    POLICY_INFORMATION
 
 }

+ 3 - 1
src/main/java/com/izouma/imt/enums/Language.java

@@ -2,5 +2,7 @@ package com.izouma.imt.enums;
 
 public enum Language {
     en,
-    ch
+    ch,
+    both,
+    other
 }

+ 42 - 0
src/main/java/com/izouma/imt/enums/OfflineService.java

@@ -0,0 +1,42 @@
+package com.izouma.imt.enums;
+
+public enum OfflineService {
+    /*
+    设备安装与调试
+    进出口代理服务
+    零部件仓储分拨服务
+    参展服务(仓储、物流、现场安装调试)
+    维修
+    产能共享
+    代加工
+    检测认证
+    商务咨询
+    专业培训
+    融资租赁
+    技术系统集成
+    二手设备交易
+     */
+    EQUIPMENT_INSTALLATION_AND_COMMISSIONING("设备安装与调试"),
+    IMPORT_AND_EXPORT_AGENCY_SERVICES("进出口代理服务"),
+    PARTS_STORAGE_AND_DISTRIBUTION_SERVICE("零部件仓储分拨服务"),
+    EXHIBITOR_SERVICE("参展服务(仓储、物流、现场安装调试)"),
+    KEEP_IN_REPAIR("维修"),
+    CAPACITY_SHARING("产能共享"),
+    PROCESSING("代加工"),
+    TESTING_CERTIFICATION("检测认证"),
+    BUSINESS_INQUIRIES("商务咨询"),
+    PROFESSIONAL_TRAINING("专业培训"),
+    FINANCE_LEASE("融资租赁"),
+    TECHNICAL_SYSTEM_INTEGRATION("技术系统集成"),
+    USED_EQUIPMENT_TRADING("二手设备交易");
+
+    private final String description;
+
+    OfflineService(String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}

+ 16 - 0
src/main/java/com/izouma/imt/repo/EmailRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.imt.repo;
+
+import com.izouma.imt.domain.Email;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface EmailRepo extends JpaRepository<Email, Long>, JpaSpecificationExecutor<Email> {
+    @Query("update Email t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 23 - 0
src/main/java/com/izouma/imt/repo/ProductCategoryRepo.java

@@ -0,0 +1,23 @@
+package com.izouma.imt.repo;
+
+import com.izouma.imt.domain.ProductCategory;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+public interface ProductCategoryRepo extends JpaRepository<ProductCategory, Long>, JpaSpecificationExecutor<ProductCategory> {
+    @Query("update ProductCategory t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<ProductCategory> findAllByParentId(Long parentId);
+
+    List<ProductCategory> findAllByParentIdIn(List<Long> parentId);
+
+    List<ProductCategory> findAllByParentIdIsNullAndDelFalse();
+}

+ 2 - 0
src/main/java/com/izouma/imt/repo/UserRepo.java

@@ -23,4 +23,6 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     User findByOpenId(String openId);
 
     User findByPhone(String phone);
+
+    User findByEmail(String email);
 }

+ 16 - 0
src/main/java/com/izouma/imt/repo/buyers/BuyersInfoRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.imt.repo.buyers;
+
+import com.izouma.imt.domain.buyers.BuyersInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface BuyersInfoRepo extends JpaRepository<BuyersInfo, Long>, JpaSpecificationExecutor<BuyersInfo> {
+    @Query("update BuyersInfo t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 16 - 0
src/main/java/com/izouma/imt/repo/buyers/CollectRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.imt.repo.buyers;
+
+import com.izouma.imt.domain.buyers.Collect;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface CollectRepo extends JpaRepository<Collect, Long>, JpaSpecificationExecutor<Collect> {
+    @Query("update Collect t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 17 - 0
src/main/java/com/izouma/imt/repo/table/AdvisoryFormRepo.java

@@ -0,0 +1,17 @@
+package com.izouma.imt.repo.table;
+
+import com.izouma.imt.domain.table.AdvisoryForm;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface AdvisoryFormRepo extends JpaRepository<AdvisoryForm, Long>, JpaSpecificationExecutor<AdvisoryForm> {
+    @Query("update AdvisoryForm t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+}

+ 16 - 0
src/main/java/com/izouma/imt/repo/table/DemandStewardRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.imt.repo.table;
+
+import com.izouma.imt.domain.table.DemandSteward;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface DemandStewardRepo extends JpaRepository<DemandSteward, Long>, JpaSpecificationExecutor<DemandSteward> {
+    @Query("update DemandSteward t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 16 - 0
src/main/java/com/izouma/imt/repo/table/EnterpriseClaimRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.imt.repo.table;
+
+import com.izouma.imt.domain.table.EnterpriseClaim;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface EnterpriseClaimRepo extends JpaRepository<EnterpriseClaim, Long>, JpaSpecificationExecutor<EnterpriseClaim> {
+    @Query("update EnterpriseClaim t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 16 - 0
src/main/java/com/izouma/imt/repo/vendor/ProductRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.imt.repo.vendor;
+
+import com.izouma.imt.domain.vendor.Product;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface ProductRepo extends JpaRepository<Product, Long>, JpaSpecificationExecutor<Product> {
+    @Query("update Product t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 16 - 0
src/main/java/com/izouma/imt/repo/vendor/ProductTagRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.imt.repo.vendor;
+
+import com.izouma.imt.domain.vendor.ProductTag;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+
+public interface ProductTagRepo extends JpaRepository<ProductTag, Long>, JpaSpecificationExecutor<ProductTag> {
+    @Query("update ProductTag t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 22 - 0
src/main/java/com/izouma/imt/repo/vendor/VendorInfoRepo.java

@@ -0,0 +1,22 @@
+package com.izouma.imt.repo.vendor;
+
+import com.izouma.imt.domain.vendor.VendorInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+public interface VendorInfoRepo extends JpaRepository<VendorInfo, Long>, JpaSpecificationExecutor<VendorInfo> {
+    @Query("update VendorInfo t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<VendorInfo> findAllByProductCategoryId(Long categoryId);
+
+    //按公司名查找
+    VendorInfo findByEnCompanyName(String enCompanyName);
+}

+ 20 - 0
src/main/java/com/izouma/imt/service/EmailService.java

@@ -0,0 +1,20 @@
+package com.izouma.imt.service;
+
+import com.izouma.imt.domain.Email;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.repo.EmailRepo;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class EmailService {
+
+    private EmailRepo emailRepo;
+
+    public Page<Email> all(PageQuery pageQuery) {
+        return emailRepo.findAll(JpaUtils.toSpecification(pageQuery, Email.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 47 - 0
src/main/java/com/izouma/imt/service/ProductCategoryService.java

@@ -0,0 +1,47 @@
+package com.izouma.imt.service;
+
+import com.izouma.imt.domain.Menu;
+import com.izouma.imt.domain.ProductCategory;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.repo.ProductCategoryRepo;
+import com.izouma.imt.repo.vendor.VendorInfoRepo;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class ProductCategoryService {
+
+    private ProductCategoryRepo productCategoryRepo;
+    private VendorInfoRepo      vendorInfoRepo;
+
+    public Page<ProductCategory> all(PageQuery pageQuery) {
+        return productCategoryRepo.findAll(JpaUtils.toSpecification(pageQuery, ProductCategory.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /*
+    找出分类下的所有子分类id
+     */
+    public List<Long> getChildrenIds(List<Long> ids) {
+
+        List<ProductCategory> list = productCategoryRepo.findAllByParentIdIn(ids);
+        List<Long> collect = null;
+        while (list.size() != 0) {
+            collect = list
+                    .stream()
+                    .map(ProductCategory::getId)
+                    .collect(Collectors.toList());
+            System.out.println(collect);
+            list = productCategoryRepo.findAllByParentIdIn(collect);
+        }
+
+        return collect;
+
+    }
+}

+ 19 - 0
src/main/java/com/izouma/imt/service/UserService.java

@@ -169,4 +169,23 @@ public class UserService {
         }
         return setPassword(userId, password);
     }
+
+    /*
+    登录方式:账号/邮箱/手机号 两个字母 6个数字
+     */
+    public String getUsername(String account) {
+        User user = userRepo.findByUsername(account);
+        if (user != null) {
+            return account;
+        }
+        user = userRepo.findByPhone(account);
+        if (user != null) {
+            return user.getUsername();
+        }
+        user = userRepo.findByEmail(account);
+        if (user != null) {
+            return user.getUsername();
+        }
+        throw new BusinessException("暂未注册");
+    }
 }

+ 72 - 0
src/main/java/com/izouma/imt/service/buyers/BuyersInfoService.java

@@ -0,0 +1,72 @@
+package com.izouma.imt.service.buyers;
+
+import com.izouma.imt.domain.User;
+import com.izouma.imt.domain.buyers.BuyersInfo;
+import com.izouma.imt.dto.BuyersDTO;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.UserRepo;
+import com.izouma.imt.repo.buyers.BuyersInfoRepo;
+import com.izouma.imt.security.Authority;
+import com.izouma.imt.service.CaptchaService;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+
+@Service
+@AllArgsConstructor
+public class BuyersInfoService {
+
+    private BuyersInfoRepo buyersInfoRepo;
+    private UserRepo       userRepo;
+    private CaptchaService captchaService;
+
+    public Page<BuyersInfo> all(PageQuery pageQuery) {
+        return buyersInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, BuyersInfo.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /*
+    采购商注册
+     */
+    public User reg(BuyersDTO buyersDTO) {
+       /* if (!captchaService.verify(buyersDTO.getPhone(), buyersDTO.getCode())) {
+            throw new BusinessException("验证码错误");
+        }*/
+        User user = userRepo.findByPhone(buyersDTO.getPhone());
+        if (user != null) {
+            throw new BusinessException("该手机号已注册!");
+        }
+
+        user = userRepo.save(User.builder()
+                .phone(buyersDTO.getPhone())
+                .authorities(Collections.singleton(Authority.builder().name("ROLE_USER").build()))
+                .username(buyersDTO.getPhone())
+                .country(buyersDTO.getCountry())
+                .province(buyersDTO.getProvince())
+                .city(buyersDTO.getCity())
+                .password(new BCryptPasswordEncoder().encode(buyersDTO.getPassword()))
+                .position(buyersDTO.getPosition())
+                .card(buyersDTO.getCard())
+                .build());
+
+        BuyersInfo buyersInfo = BuyersInfo.builder()
+                .userId(user.getId())
+                .interestedProCateId(buyersDTO.getInterestedProCateId())
+                .country(buyersDTO.getCountry())
+                .city(buyersDTO.getCity())
+                .province(buyersDTO.getProvince())
+                .district(buyersDTO.getDistrict())
+                .industry(buyersDTO.getIndustry())
+                .chCompanyName(buyersDTO.getChCompanyName())
+                .language(buyersDTO.getLanguage())
+                .build();
+        buyersInfoRepo.save(buyersInfo);
+
+        return user;
+
+    }
+}

+ 20 - 0
src/main/java/com/izouma/imt/service/buyers/CollectService.java

@@ -0,0 +1,20 @@
+package com.izouma.imt.service.buyers;
+
+import com.izouma.imt.domain.buyers.Collect;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.repo.buyers.CollectRepo;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class CollectService {
+
+    private CollectRepo collectRepo;
+
+    public Page<Collect> all(PageQuery pageQuery) {
+        return collectRepo.findAll(JpaUtils.toSpecification(pageQuery, Collect.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 45 - 0
src/main/java/com/izouma/imt/service/table/AdvisoryFormService.java

@@ -0,0 +1,45 @@
+package com.izouma.imt.service.table;
+
+import com.izouma.imt.converter.LongArrayConverter;
+import com.izouma.imt.domain.table.AdvisoryForm;
+import com.izouma.imt.domain.vendor.Product;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.table.AdvisoryFormRepo;
+import com.izouma.imt.repo.vendor.ProductRepo;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Service
+@AllArgsConstructor
+public class AdvisoryFormService {
+
+    private AdvisoryFormRepo advisoryFormRepo;
+    private ProductRepo      productRepo;
+
+    public Page<AdvisoryForm> all(PageQuery pageQuery) {
+        return advisoryFormRepo.findAll(JpaUtils.toSpecification(pageQuery, AdvisoryForm.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /*
+    按厂商创建咨询表单
+     */
+    public void create(AdvisoryForm advisoryForm) {
+        LongArrayConverter converter = new LongArrayConverter();
+        List<Long> longs = converter.convertToEntityAttribute(advisoryForm.getProductIds());
+        Set<Long> vendorIds = new HashSet<>();
+        longs.forEach(l -> {
+            Product product = productRepo.findById(l).orElseThrow(new BusinessException("无产品"));
+            vendorIds.add(product.getVendorInfoId());
+        });
+
+    }
+
+}

+ 20 - 0
src/main/java/com/izouma/imt/service/table/DemandStewardService.java

@@ -0,0 +1,20 @@
+package com.izouma.imt.service.table;
+
+import com.izouma.imt.domain.table.DemandSteward;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.repo.table.DemandStewardRepo;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class DemandStewardService {
+
+    private DemandStewardRepo demandStewardRepo;
+
+    public Page<DemandSteward> all(PageQuery pageQuery) {
+        return demandStewardRepo.findAll(JpaUtils.toSpecification(pageQuery, DemandSteward.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 97 - 0
src/main/java/com/izouma/imt/service/table/EnterpriseClaimService.java

@@ -0,0 +1,97 @@
+package com.izouma.imt.service.table;
+
+import com.izouma.imt.domain.Email;
+import com.izouma.imt.domain.User;
+import com.izouma.imt.domain.table.EnterpriseClaim;
+import com.izouma.imt.domain.vendor.VendorInfo;
+import com.izouma.imt.dto.EmailType;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.enums.AuthorityName;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.EmailRepo;
+import com.izouma.imt.repo.UserRepo;
+import com.izouma.imt.repo.table.EnterpriseClaimRepo;
+import com.izouma.imt.repo.vendor.VendorInfoRepo;
+import com.izouma.imt.security.Authority;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class EnterpriseClaimService {
+
+    private EnterpriseClaimRepo enterpriseClaimRepo;
+    private VendorInfoRepo      vendorInfoRepo;
+    private EmailRepo           emailRepo;
+    private UserRepo            userRepo;
+
+    public Page<EnterpriseClaim> all(PageQuery pageQuery) {
+        return enterpriseClaimRepo.findAll(JpaUtils.toSpecification(pageQuery, EnterpriseClaim.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /*
+    企业认领
+     */
+    public void claim(EnterpriseClaim claim) {
+        VendorInfo vendorInfo = vendorInfoRepo.findById(claim.getVendorId()).orElseThrow(new BusinessException("无企业"));
+
+        List<Email> emails = new ArrayList<>();
+        //发消息给管理员
+        List<User> users = userRepo.findAllByAuthoritiesContains(Authority.get(AuthorityName.ROLE_ADMIN));
+        Email email = Email.builder()
+                .title("有企业被认领")
+                .content("有企业被认领!")
+                .type(EmailType.SYSTEM_INFORMATION)
+                .sendUserId(claim.getUserId())
+                .isRead(false)
+                .build();
+        users.forEach(user -> {
+            email.setReceiveUserId(user.getId());
+            emails.add(email);
+        });
+
+        //如果已被认领
+        if (vendorInfo.getUserId()==null) {
+            //发消息给已认领的人
+            Email email1 = Email.builder()
+                    .title("有企业被认领")
+                    .content("有企业被认领!")
+                    .type(EmailType.SYSTEM_INFORMATION)
+                    .receiveUserId(vendorInfo.getUserId())
+                    .sendUserId(claim.getUserId())
+                    .isRead(false)
+                    .build();
+            emails.add(email1);
+
+        }
+
+        emailRepo.saveAll(emails);
+        enterpriseClaimRepo.save(claim);
+
+    }
+
+    /*
+    也有企业时,若为管理人员上传,不创用户,有用户认领时,分配账号
+    认领消息合并
+     */
+    public void merge(Long userId, Long vendorInfoId) {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("无用户"));
+        //随机生成骑账号 2个首字母+6个数字
+        String str = RandomStringUtils.randomAlphabetic(2);
+        String str2 = RandomStringUtils.randomNumeric(6);
+        user.setUsername(str + str2);
+
+        VendorInfo vendorInfo = vendorInfoRepo.findById(vendorInfoId).orElseThrow(new BusinessException("无企业"));
+        vendorInfo.setUserId(userId);
+        //vendorInfo.setBeenClaimed(true);
+
+        userRepo.save(user);
+        vendorInfoRepo.save(vendorInfo);
+    }
+}

+ 20 - 0
src/main/java/com/izouma/imt/service/vendor/ProductService.java

@@ -0,0 +1,20 @@
+package com.izouma.imt.service.vendor;
+
+import com.izouma.imt.domain.vendor.Product;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.repo.vendor.ProductRepo;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ProductService {
+
+    private ProductRepo productRepo;
+
+    public Page<Product> all(PageQuery pageQuery) {
+        return productRepo.findAll(JpaUtils.toSpecification(pageQuery, Product.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 20 - 0
src/main/java/com/izouma/imt/service/vendor/ProductTagService.java

@@ -0,0 +1,20 @@
+package com.izouma.imt.service.vendor;
+
+import com.izouma.imt.domain.vendor.ProductTag;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.repo.vendor.ProductTagRepo;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ProductTagService {
+
+    private ProductTagRepo productTagRepo;
+
+    public Page<ProductTag> all(PageQuery pageQuery) {
+        return productTagRepo.findAll(JpaUtils.toSpecification(pageQuery, ProductTag.class), JpaUtils.toPageRequest(pageQuery));
+    }
+}

+ 66 - 0
src/main/java/com/izouma/imt/service/vendor/VendorInfoService.java

@@ -0,0 +1,66 @@
+package com.izouma.imt.service.vendor;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.izouma.imt.converter.LongArrayConverter;
+import com.izouma.imt.domain.vendor.VendorInfo;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.UserRepo;
+import com.izouma.imt.repo.vendor.VendorInfoRepo;
+import com.izouma.imt.service.CaptchaService;
+import com.izouma.imt.service.ProductCategoryService;
+import com.izouma.imt.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class VendorInfoService {
+
+    private VendorInfoRepo         vendorInfoRepo;
+    private UserRepo               userRepo;
+    private CaptchaService         captchaService;
+    private ProductCategoryService productCategoryService;
+
+    public Page<VendorInfo> all(PageQuery pageQuery) {
+        return vendorInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, VendorInfo.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    /*
+    筛选,分类需要另外写出来筛选
+     */
+    public Page<VendorInfo> all1(PageQuery pageQuery, String categoryIds) {
+        LongArrayConverter converter = new LongArrayConverter();
+        List<Long> ids = converter.convertToEntityAttribute(categoryIds);
+        List<Long> childrenIds = productCategoryService.getChildrenIds(ids);
+
+        List<VendorInfo> all = vendorInfoRepo.findAll(JpaUtils.toSpecification(pageQuery, VendorInfo.class));
+        List<VendorInfo> collect = all.stream()
+                //是否有交集
+                .filter(vendorInfo -> !Collections.disjoint(vendorInfo.getCategoryIds(), childrenIds))
+                .collect(Collectors.toList());
+        return new PageImpl<>(collect, JpaUtils.toPageRequest(pageQuery), collect.size());
+    }
+
+    /*
+    企业注册时判断,输入企业名称
+    企业认领,如果已有企业,直接填写咨询表格
+    不点,提交注册时不给注册
+     */
+    public void reg(VendorInfo vendorInfo) {
+        VendorInfo vendor = vendorInfoRepo.findByEnCompanyName(vendorInfo.getEnCompanyName());
+        if (ObjectUtil.isNotNull(vendor)) {
+            throw new BusinessException("该企业已存在,可进行企业认领");
+        }
+        //vendorInfo.setBeenClaimed(true);
+        vendorInfoRepo.save(vendor);
+
+    }
+
+}

+ 9 - 0
src/main/java/com/izouma/imt/web/AuthenticationController.java

@@ -38,6 +38,15 @@ public class AuthenticationController {
         return jwtTokenUtil.generateToken(jwtUser);
     }
 
+    /*
+    可以手机/邮箱/账号登录
+     */
+    @PostMapping("/loginAccount")
+    public String loginByAccount(String account, String password) {
+        String username = userService.getUsername(account);
+        return loginByUserPwd(username, password, null);
+    }
+
     @PostMapping("/loginAdmin")
     public String loginByUserPwdAdmin(String username, String password, Integer expiration) {
         Authentication authentication = authenticate(username, password);

+ 60 - 0
src/main/java/com/izouma/imt/web/EmailController.java

@@ -0,0 +1,60 @@
+package com.izouma.imt.web;
+import com.izouma.imt.domain.Email;
+import com.izouma.imt.service.EmailService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.EmailRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/email")
+@AllArgsConstructor
+public class EmailController extends BaseController {
+    private EmailService emailService;
+    private EmailRepo emailRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Email save(@RequestBody Email record) {
+        if (record.getId() != null) {
+            Email orig = emailRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return emailRepo.save(orig);
+        }
+        return emailRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<Email> all(@RequestBody PageQuery pageQuery) {
+        return emailService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public Email get(@PathVariable Long id) {
+        return emailRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        emailRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Email> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 65 - 0
src/main/java/com/izouma/imt/web/ProductCategoryController.java

@@ -0,0 +1,65 @@
+package com.izouma.imt.web;
+import com.izouma.imt.domain.ProductCategory;
+import com.izouma.imt.service.ProductCategoryService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.ProductCategoryRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/productCategory")
+@AllArgsConstructor
+public class ProductCategoryController extends BaseController {
+    private ProductCategoryService productCategoryService;
+    private ProductCategoryRepo productCategoryRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public ProductCategory save(@RequestBody ProductCategory record) {
+        if (record.getId() != null) {
+            ProductCategory orig = productCategoryRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return productCategoryRepo.save(orig);
+        }
+        return productCategoryRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<ProductCategory> all(@RequestBody PageQuery pageQuery) {
+        return productCategoryService.all(pageQuery);
+    }
+
+    @GetMapping("/allList")
+    public List<ProductCategory> allList() {
+        return productCategoryRepo.findAllByParentIdIsNullAndDelFalse();
+    }
+
+    @GetMapping("/get/{id}")
+    public ProductCategory get(@PathVariable Long id) {
+        return productCategoryRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        productCategoryRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<ProductCategory> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/imt/web/buyers/BuyersInfoController.java

@@ -0,0 +1,63 @@
+package com.izouma.imt.web.buyers;
+
+import com.izouma.imt.web.BaseController;
+import com.izouma.imt.domain.buyers.BuyersInfo;
+import com.izouma.imt.service.buyers.BuyersInfoService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.buyers.BuyersInfoRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/buyersInfo")
+@AllArgsConstructor
+public class BuyersInfoController extends BaseController {
+    private BuyersInfoService buyersInfoService;
+    private BuyersInfoRepo buyersInfoRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public BuyersInfo save(@RequestBody BuyersInfo record) {
+        if (record.getId() != null) {
+            BuyersInfo orig = buyersInfoRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return buyersInfoRepo.save(orig);
+        }
+        return buyersInfoRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<BuyersInfo> all(@RequestBody PageQuery pageQuery) {
+        return buyersInfoService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public BuyersInfo get(@PathVariable Long id) {
+        return buyersInfoRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        buyersInfoRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<BuyersInfo> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/imt/web/buyers/CollectController.java

@@ -0,0 +1,63 @@
+package com.izouma.imt.web.buyers;
+
+import com.izouma.imt.web.BaseController;
+import com.izouma.imt.domain.buyers.Collect;
+import com.izouma.imt.service.buyers.CollectService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.buyers.CollectRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/collect")
+@AllArgsConstructor
+public class CollectController extends BaseController {
+    private CollectService collectService;
+    private CollectRepo collectRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Collect save(@RequestBody Collect record) {
+        if (record.getId() != null) {
+            Collect orig = collectRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return collectRepo.save(orig);
+        }
+        return collectRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<Collect> all(@RequestBody PageQuery pageQuery) {
+        return collectService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public Collect get(@PathVariable Long id) {
+        return collectRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        collectRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Collect> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/imt/web/table/AdvisoryFormController.java

@@ -0,0 +1,63 @@
+package com.izouma.imt.web.table;
+
+import com.izouma.imt.web.BaseController;
+import com.izouma.imt.domain.table.AdvisoryForm;
+import com.izouma.imt.service.table.AdvisoryFormService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.table.AdvisoryFormRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/advisoryForm")
+@AllArgsConstructor
+public class AdvisoryFormController extends BaseController {
+    private AdvisoryFormService advisoryFormService;
+    private AdvisoryFormRepo advisoryFormRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public AdvisoryForm save(@RequestBody AdvisoryForm record) {
+        if (record.getId() != null) {
+            AdvisoryForm orig = advisoryFormRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return advisoryFormRepo.save(orig);
+        }
+        return advisoryFormRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<AdvisoryForm> all(@RequestBody PageQuery pageQuery) {
+        return advisoryFormService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public AdvisoryForm get(@PathVariable Long id) {
+        return advisoryFormRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        advisoryFormRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<AdvisoryForm> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/imt/web/table/DemandStewardController.java

@@ -0,0 +1,63 @@
+package com.izouma.imt.web.table;
+
+import com.izouma.imt.web.BaseController;
+import com.izouma.imt.domain.table.DemandSteward;
+import com.izouma.imt.service.table.DemandStewardService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.table.DemandStewardRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/demandSteward")
+@AllArgsConstructor
+public class DemandStewardController extends BaseController {
+    private DemandStewardService demandStewardService;
+    private DemandStewardRepo demandStewardRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public DemandSteward save(@RequestBody DemandSteward record) {
+        if (record.getId() != null) {
+            DemandSteward orig = demandStewardRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return demandStewardRepo.save(orig);
+        }
+        return demandStewardRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<DemandSteward> all(@RequestBody PageQuery pageQuery) {
+        return demandStewardService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public DemandSteward get(@PathVariable Long id) {
+        return demandStewardRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        demandStewardRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<DemandSteward> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/imt/web/table/EnterpriseClaimController.java

@@ -0,0 +1,63 @@
+package com.izouma.imt.web.table;
+
+import com.izouma.imt.web.BaseController;
+import com.izouma.imt.domain.table.EnterpriseClaim;
+import com.izouma.imt.service.table.EnterpriseClaimService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.table.EnterpriseClaimRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/enterpriseClaim")
+@AllArgsConstructor
+public class EnterpriseClaimController extends BaseController {
+    private EnterpriseClaimService enterpriseClaimService;
+    private EnterpriseClaimRepo enterpriseClaimRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public EnterpriseClaim save(@RequestBody EnterpriseClaim record) {
+        if (record.getId() != null) {
+            EnterpriseClaim orig = enterpriseClaimRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return enterpriseClaimRepo.save(orig);
+        }
+        return enterpriseClaimRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<EnterpriseClaim> all(@RequestBody PageQuery pageQuery) {
+        return enterpriseClaimService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public EnterpriseClaim get(@PathVariable Long id) {
+        return enterpriseClaimRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        enterpriseClaimRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<EnterpriseClaim> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/imt/web/vendor/ProductController.java

@@ -0,0 +1,63 @@
+package com.izouma.imt.web.vendor;
+
+import com.izouma.imt.web.BaseController;
+import com.izouma.imt.domain.vendor.Product;
+import com.izouma.imt.service.vendor.ProductService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.vendor.ProductRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/product")
+@AllArgsConstructor
+public class ProductController extends BaseController {
+    private ProductService productService;
+    private ProductRepo productRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Product save(@RequestBody Product record) {
+        if (record.getId() != null) {
+            Product orig = productRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return productRepo.save(orig);
+        }
+        return productRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<Product> all(@RequestBody PageQuery pageQuery) {
+        return productService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public Product get(@PathVariable Long id) {
+        return productRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        productRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Product> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/imt/web/vendor/ProductTagController.java

@@ -0,0 +1,63 @@
+package com.izouma.imt.web.vendor;
+
+import com.izouma.imt.web.BaseController;
+import com.izouma.imt.domain.vendor.ProductTag;
+import com.izouma.imt.service.vendor.ProductTagService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.vendor.ProductTagRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/productTag")
+@AllArgsConstructor
+public class ProductTagController extends BaseController {
+    private ProductTagService productTagService;
+    private ProductTagRepo productTagRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public ProductTag save(@RequestBody ProductTag record) {
+        if (record.getId() != null) {
+            ProductTag orig = productTagRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return productTagRepo.save(orig);
+        }
+        return productTagRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<ProductTag> all(@RequestBody PageQuery pageQuery) {
+        return productTagService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public ProductTag get(@PathVariable Long id) {
+        return productTagRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        productTagRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<ProductTag> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 63 - 0
src/main/java/com/izouma/imt/web/vendor/VendorInfoController.java

@@ -0,0 +1,63 @@
+package com.izouma.imt.web.vendor;
+
+import com.izouma.imt.web.BaseController;
+import com.izouma.imt.domain.vendor.VendorInfo;
+import com.izouma.imt.service.vendor.VendorInfoService;
+import com.izouma.imt.dto.PageQuery;
+import com.izouma.imt.exception.BusinessException;
+import com.izouma.imt.repo.vendor.VendorInfoRepo;
+import com.izouma.imt.utils.ObjUtils;
+import com.izouma.imt.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/vendorInfo")
+@AllArgsConstructor
+public class VendorInfoController extends BaseController {
+    private VendorInfoService vendorInfoService;
+    private VendorInfoRepo vendorInfoRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public VendorInfo save(@RequestBody VendorInfo record) {
+        if (record.getId() != null) {
+            VendorInfo orig = vendorInfoRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return vendorInfoRepo.save(orig);
+        }
+        return vendorInfoRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<VendorInfo> all(@RequestBody PageQuery pageQuery) {
+        return vendorInfoService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public VendorInfo get(@PathVariable Long id) {
+        return vendorInfoRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        vendorInfoRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<VendorInfo> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 3 - 3
src/main/resources/application.yaml

@@ -69,8 +69,8 @@ wx:
         subAppId: #服务商模式下的子商户公众账号ID
         subMchId: #服务商模式下的子商户号
         keyPath: classpath:/cert/apiclient_cert.p12
-        notifyUrl: http://zmj.izouma.com/wx/payNotify
-        refundNotifyUrl: http://zmj.izouma.com/wx/refundNotify
+        notifyUrl: http://imt.izouma.com/wx/payNotify
+        refundNotifyUrl: http://imt.izouma.com/wx/refundNotify
 storage:
     provider: aliyun
     local_path: /var/www/upload/
@@ -81,7 +81,7 @@ aliyun:
     oss-bucket-name: imt
     oss-domain: https://imt.oss-cn-hangzhou.aliyuncs.com
 general:
-    host: http://art.izouma.com
+    host: http://imt.izouma.com
 ---
 
 spring:

Plik diff jest za duży
+ 0 - 0
src/main/resources/genjson/AdvisoryForm.json


Plik diff jest za duży
+ 0 - 0
src/main/resources/genjson/BuyersInfo.json


+ 1 - 0
src/main/resources/genjson/Collect.json

@@ -0,0 +1 @@
+{"tableName":"Collect","className":"Collect","remark":"收藏","genTable":true,"genClass":true,"genList":false,"genForm":false,"genRouter":false,"javaPath":"/Users/qiufangchao/Desktop/project/imt/src/main/java/com/izouma/imt","viewPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/imt/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"userId","modelName":"userId","remark":"userId","showInList":true,"showInForm":true,"formType":"number"},{"name":"cid","modelName":"cid","remark":"收藏id","showInList":true,"showInForm":true,"formType":"number"},{"name":"type","modelName":"type","remark":"收藏类别","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"厂商\",\"value\":\"VENDOR\"},{\"label\":\"产品\",\"value\":\"PRODUCT\"},{\"label\":\"文章\",\"value\":\"INFORMATION\"}]"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.imt","tablePackage":"com.izouma.imt.domain.buyers.Collect","genPackage":"buyers"}

+ 1 - 0
src/main/resources/genjson/DemandSteward.json

@@ -0,0 +1 @@
+{"tableName":"DemandSteward","className":"DemandSteward","remark":"需求管家表","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/imt/src/main/java/com/izouma/imt","viewPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/imt/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"userId","modelName":"userId","remark":"userId","showInList":true,"showInForm":true,"formType":"number"},{"name":"sex","modelName":"sex","remark":"性别","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"position","modelName":"position","remark":"职位","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"nickname","modelName":"nickname","remark":"姓名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"phone","modelName":"phone","remark":"电话","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"email","modelName":"email","remark":"邮件","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"companyName","modelName":"companyName","remark":"公司名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"functionalRequirements","modelName":"functionalRequirements","remark":"功能需求","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"otherProblems","modelName":"otherProblems","remark":"其他问题","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.imt","tablePackage":"com.izouma.imt.domain.table.DemandSteward","genPackage":"table"}

+ 1 - 0
src/main/resources/genjson/Email.json

@@ -0,0 +1 @@
+{"tableName":"Email","className":"Email","remark":"邮件","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/imt/src/main/java/com/izouma/imt","viewPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/imt/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"sendUserId","modelName":"sendUserId","remark":"发件人","showInList":true,"showInForm":true,"formType":"number"},{"name":"receiveUserId","modelName":"receiveUserId","remark":"收件人","showInList":true,"showInForm":true,"formType":"number"},{"name":"sendTime","modelName":"sendTime","remark":"发送时间","showInList":true,"showInForm":true,"formType":"datetime"},{"name":"title","modelName":"title","remark":"标题","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"content","modelName":"content","remark":"内容","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"isRead","modelName":"isRead","remark":"已读","showInList":true,"showInForm":true,"formType":"switch"},{"name":"type","modelName":"type","remark":"消息类型","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"SYSTEM_INFORMATION\",\"value\":\"SYSTEM_INFORMATION\"},{\"label\":\"CONSULTING_NEWS\",\"value\":\"CONSULTING_NEWS\"}]"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.imt","tablePackage":"com.izouma.imt.domain.Email"}

+ 1 - 0
src/main/resources/genjson/EnterpriseClaim.json

@@ -0,0 +1 @@
+{"tableName":"EnterpriseClaim","className":"EnterpriseClaim","remark":"企业认领","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/imt/src/main/java/com/izouma/imt","viewPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/imt/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"sex","modelName":"sex","remark":"性别","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"position","modelName":"position","remark":"职位","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"nickname","modelName":"nickname","remark":"姓名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"phone","modelName":"phone","remark":"电话","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"email","modelName":"email","remark":"邮箱","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"vendorId","modelName":"vendorId","remark":"企业","showInList":true,"showInForm":true,"formType":"number"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.imt","tablePackage":"com.izouma.imt.domain.table.EnterpriseClaim","genPackage":"table"}

Plik diff jest za duży
+ 0 - 0
src/main/resources/genjson/Product.json


+ 1 - 0
src/main/resources/genjson/ProductCategory.json

@@ -0,0 +1 @@
+{"tableName":"ProductCategory","className":"ProductCategory","remark":"产品分类\u0026EMO产品类别","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/imt/src/main/java/com/izouma/imt","viewPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/imt/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"enName","modelName":"enName","remark":"英文名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"chName","modelName":"chName","remark":"中文名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"code","modelName":"code","remark":"主类别代码","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"parentId","modelName":"parentId","remark":"父Id","showInList":true,"showInForm":true,"formType":"number"},{"name":"children","modelName":"children","remark":"子","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.imt","tablePackage":"com.izouma.imt.domain.ProductCategory"}

+ 1 - 0
src/main/resources/genjson/ProductTag.json

@@ -0,0 +1 @@
+{"tableName":"ProductTag","className":"ProductTag","remark":"产品标签","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/imt/src/main/java/com/izouma/imt","viewPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/imt/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/imt/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"enName","modelName":"enName","remark":"英文名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"chName","modelName":"chName","remark":"中文名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"parentId","modelName":"parentId","remark":"父级Id","showInList":true,"showInForm":true,"formType":"number"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.imt","tablePackage":"com.izouma.imt.domain.vendor.ProductTag","genPackage":"vendor"}

Plik diff jest za duży
+ 0 - 0
src/main/resources/genjson/VendorInfo.json


Plik diff jest za duży
+ 712 - 453
src/main/vue/package-lock.json


+ 1 - 1
src/main/vue/package.json

@@ -49,6 +49,6 @@
     "prettier": "1.19.1",
     "style-resources-loader": "^1.3.3",
     "vue-cli-plugin-style-resources-loader": "^0.1.4",
-    "vue-template-compiler": "^2.6.10"
+    "vue-template-compiler": "^2.6.11"
   }
 }

+ 2 - 2
src/main/vue/src/plugins/http.js

@@ -5,8 +5,8 @@ import qs from 'qs';
 let baseUrl = 'http://localhost:8080';
 switch (process.env.NODE_ENV) {
     case 'development':
-        // baseUrl = 'http://localhost:8080';
-        baseUrl = 'http://192.168.50.127:8080';
+        baseUrl = 'http://localhost:8080';
+        // baseUrl = 'http://192.168.50.127:8080';
         break;
     case 'test':
         baseUrl = 'http://localhost:8080';

+ 141 - 1
src/main/vue/src/router.js

@@ -102,8 +102,148 @@ const router = new Router({
                     meta: {
                         title: '上传'
                     }
-                }
+                },
+                {
+                    path: '/buyersInfoEdit',
+                    name: 'BuyersInfoEdit',
+                    component: () => import(/* webpackChunkName: "buyersInfoEdit" */ '@/views/BuyersInfoEdit.vue'),
+                    meta: {
+                        title: '采购商基本信息编辑'
+                    }
+                },
+                {
+                    path: '/buyersInfoList',
+                    name: 'BuyersInfoList',
+                    component: () => import(/* webpackChunkName: "buyersInfoList" */ '@/views/BuyersInfoList.vue'),
+                    meta: {
+                        title: '采购商基本信息'
+                    }
+                },
+                {
+                    path: '/vendorInfoEdit',
+                    name: 'VendorInfoEdit',
+                    component: () => import(/* webpackChunkName: "vendorInfoEdit" */ '@/views/VendorInfoEdit.vue'),
+                    meta: {
+                        title: '厂商信息编辑'
+                    }
+                },
+                {
+                    path: '/vendorInfoList',
+                    name: 'VendorInfoList',
+                    component: () => import(/* webpackChunkName: "vendorInfoList" */ '@/views/VendorInfoList.vue'),
+                    meta: {
+                        title: '厂商信息'
+                    }
+                },
+                {
+                    path: '/enterpriseClaimEdit',
+                    name: 'EnterpriseClaimEdit',
+                    component: () =>
+                        import(/* webpackChunkName: "enterpriseClaimEdit" */ '@/views/EnterpriseClaimEdit.vue'),
+                    meta: {
+                        title: '企业认领编辑'
+                    }
+                },
+                {
+                    path: '/enterpriseClaimList',
+                    name: 'EnterpriseClaimList',
+                    component: () =>
+                        import(/* webpackChunkName: "enterpriseClaimList" */ '@/views/EnterpriseClaimList.vue'),
+                    meta: {
+                        title: '企业认领'
+                    }
+                },
+                {
+                    path: '/emailEdit',
+                    name: 'EmailEdit',
+                    component: () => import(/* webpackChunkName: "emailEdit" */ '@/views/EmailEdit.vue'),
+                    meta: {
+                        title: '邮件编辑'
+                    }
+                },
+                {
+                    path: '/emailList',
+                    name: 'EmailList',
+                    component: () => import(/* webpackChunkName: "emailList" */ '@/views/EmailList.vue'),
+                    meta: {
+                        title: '邮件'
+                    }
+                },
+                {
+                    path: '/advisoryFormEdit',
+                    name: 'AdvisoryFormEdit',
+                    component: () => import(/* webpackChunkName: "advisoryFormEdit" */ '@/views/AdvisoryFormEdit.vue'),
+                    meta: {
+                        title: '咨询表编辑'
+                    }
+                },
+                {
+                    path: '/advisoryFormList',
+                    name: 'AdvisoryFormList',
+                    component: () => import(/* webpackChunkName: "advisoryFormList" */ '@/views/AdvisoryFormList.vue'),
+                    meta: {
+                        title: '咨询表'
+                    }
+                },
+                {
+                    path: '/demandStewardEdit',
+                    name: 'DemandStewardEdit',
+                    component: () =>
+                        import(/* webpackChunkName: "demandStewardEdit" */ '@/views/DemandStewardEdit.vue'),
+                    meta: {
+                        title: '需求管家表编辑'
+                    }
+                },
+                {
+                    path: '/demandStewardList',
+                    name: 'DemandStewardList',
+                    component: () =>
+                        import(/* webpackChunkName: "demandStewardList" */ '@/views/DemandStewardList.vue'),
+                    meta: {
+                        title: '需求管家表'
+                    }
+                },
+                {
+                    path: '/productEdit',
+                    name: 'ProductEdit',
+                    component: () => import(/* webpackChunkName: "productEdit" */ '@/views/ProductEdit.vue'),
+                    meta: {
+                        title: '产品编辑'
+                    }
+                },
+                {
+                    path: '/productList',
+                    name: 'ProductList',
+                    component: () => import(/* webpackChunkName: "productList" */ '@/views/ProductList.vue'),
+                    meta: {
+                        title: '产品'
+                    }
+                },
+                {
+                    path: '/productTagEdit',
+                    name: 'ProductTagEdit',
+                    component: () => import(/* webpackChunkName: "productTagEdit" */ '@/views/ProductTagEdit.vue'),
+                    meta: {
+                        title: '产品标签编辑'
+                    }
+                },
+                {
+                    path: '/productTagList',
+                    name: 'ProductTagList',
+                    component: () => import(/* webpackChunkName: "productTagList" */ '@/views/ProductTagList.vue'),
+                    meta: {
+                        title: '产品标签'
+                    }
+                },
                 /**INSERT_LOCATION**/
+                {
+                    path: '/categories',
+                    name: 'Categories',
+                    component: () => import(/* webpackChunkName: "productTagList" */ '@/views/Categories.vue'),
+                    meta: {
+                        title: '产品分类&EMO产品类别'
+                    }
+                }
             ]
         },
         {

+ 129 - 0
src/main/vue/src/views/AdvisoryFormEdit.vue

@@ -0,0 +1,129 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="122px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="userId" label="userId">
+                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="sex" label="性别">
+                <el-input v-model="formData.sex"></el-input>
+            </el-form-item>
+            <el-form-item prop="position" label="职位">
+                <el-input v-model="formData.position"></el-input>
+            </el-form-item>
+            <el-form-item prop="nickname" label="姓名">
+                <el-input v-model="formData.nickname"></el-input>
+            </el-form-item>
+            <el-form-item prop="phone" label="电话">
+                <el-input v-model="formData.phone"></el-input>
+            </el-form-item>
+            <el-form-item prop="email" label="邮件">
+                <el-input v-model="formData.email"></el-input>
+            </el-form-item>
+            <el-form-item prop="companyName" label="公司名">
+                <el-input v-model="formData.companyName"></el-input>
+            </el-form-item>
+            <el-form-item prop="productIds" label="产品id">
+                <el-input v-model="formData.productIds"></el-input>
+            </el-form-item>
+            <el-form-item prop="artifact" label="计划加工的工件">
+                <el-input v-model="formData.artifact"></el-input>
+            </el-form-item>
+            <el-form-item prop="otherProblems" label="其他问题">
+                <el-input v-model="formData.otherProblems"></el-input>
+            </el-form-item>
+            <el-form-item prop="type" label="类型">
+                <el-select v-model="formData.type" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'AdvisoryFormEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('advisoryForm/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {},
+            typeOptions: [
+                { label: 'INQUIRY', value: 'INQUIRY' },
+                { label: 'ADVISORY', value: 'ADVISORY' }
+            ]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/advisoryForm/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/advisoryForm/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 177 - 0
src/main/vue/src/views/AdvisoryFormList.vue

@@ -0,0 +1,177 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="userId" label="userId"> </el-table-column>
+            <el-table-column prop="sex" label="性别"> </el-table-column>
+            <el-table-column prop="position" label="职位"> </el-table-column>
+            <el-table-column prop="nickname" label="姓名"> </el-table-column>
+            <el-table-column prop="phone" label="电话"> </el-table-column>
+            <el-table-column prop="email" label="邮件"> </el-table-column>
+            <el-table-column prop="companyName" label="公司名"> </el-table-column>
+            <el-table-column prop="productIds" label="产品id"> </el-table-column>
+            <el-table-column prop="artifact" label="计划加工的工件"> </el-table-column>
+            <el-table-column prop="otherProblems" label="其他问题"> </el-table-column>
+            <el-table-column prop="type" label="类型" :formatter="typeFormatter"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'AdvisoryFormList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/advisoryForm/all',
+            downloading: false,
+            typeOptions: [
+                { label: 'INQUIRY', value: 'INQUIRY' },
+                { label: 'ADVISORY', value: 'ADVISORY' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        typeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.typeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/advisoryFormEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/advisoryFormEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/advisoryForm/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/advisoryForm/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 174 - 0
src/main/vue/src/views/BuyersInfoEdit.vue

@@ -0,0 +1,174 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="136px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="logo" label="logo">
+                <crop-upload v-model="formData.logo"></crop-upload>
+            </el-form-item>
+            <el-form-item prop="enCompanyName" label="公司英文名">
+                <el-input v-model="formData.enCompanyName"></el-input>
+            </el-form-item>
+            <el-form-item prop="chCompanyName" label="公司中文名">
+                <el-input v-model="formData.chCompanyName"></el-input>
+            </el-form-item>
+            <el-form-item prop="introduction" label="介绍">
+                <el-input type="textarea" v-model="formData.introduction"></el-input>
+            </el-form-item>
+            <el-form-item prop="img" label="img">
+                <multi-upload v-model="formData.img"></multi-upload>
+            </el-form-item>
+            <el-form-item prop="address" label="地址">
+                <el-input v-model="formData.country" class="rt-input"></el-input>
+                <el-input v-model="formData.province" class="rt-input"></el-input>
+                <el-input v-model="formData.city" class="rt-input"></el-input>
+                <el-input v-model="formData.address"></el-input>
+            </el-form-item>
+            <el-form-item prop="postalCode" label="邮政编码">
+                <el-input v-model="formData.postalCode"></el-input>
+            </el-form-item>
+            <el-form-item prop="businessLicenseImg" label="营业执照电子版">
+                <crop-upload v-model="formData.businessLicenseImg"></crop-upload>
+            </el-form-item>
+            <el-form-item prop="uscc" label="统一社会信用代码">
+                <el-input v-model="formData.uscc"></el-input>
+            </el-form-item>
+            <el-form-item prop="businessLicensePeriod" label="营业执照期限">
+                <el-date-picker
+                    v-model="formData.businessLicensePeriod"
+                    type="datetime"
+                    value-format="yyyy-MM-dd HH:mm:ss"
+                    placeholder="选择日期时间"
+                >
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="homepage" label="网站主页">
+                <el-input v-model="formData.homepage"></el-input>
+            </el-form-item>
+            <el-form-item prop="businessCategory" label="企业类别">
+                <el-select v-model="formData.businessCategory" clearable filterable placeholder="请选择">
+                    <el-option
+                        v-for="item in businessCategoryOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="productCategoryId" label="自身产品类别">
+                <el-input-number type="number" v-model="formData.productCategoryId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="applicationField" label="应用领域">
+                <el-input v-model="formData.applicationField"></el-input>
+            </el-form-item>
+            <el-form-item prop="industry" label="所属行业">
+                <el-input v-model="formData.industry"></el-input>
+            </el-form-item>
+            <el-form-item prop="interestedProCateId" label="感兴趣的产品">
+                <el-input v-model="formData.interestedProCateId"></el-input>
+            </el-form-item>
+            <el-form-item prop="enterpriseSize" label="企业规模">
+                <el-input v-model="formData.enterpriseSize"></el-input>
+            </el-form-item>
+            <el-form-item prop="contract" label="合同">
+                <el-input v-model="formData.contract"></el-input>
+            </el-form-item>
+            <el-form-item prop="otherFiles" label="其他文件">
+                <el-input v-model="formData.otherFiles"></el-input>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'BuyersInfoEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('buyersInfo/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {},
+            businessCategoryOptions: [
+                { label: '民营', value: 'PRIVATE_COMPANY' },
+                { label: '国企', value: 'STATE_OWNED_COMPANY' },
+                { label: '外企', value: 'FOREIGN_COMPANY' },
+                { label: '合资', value: 'JOINT_COMPANY' }
+            ]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/buyersInfo/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/buyersInfo/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.rt-input {
+    width: 100px;
+    margin-right: 10px;
+}
+</style>

+ 190 - 0
src/main/vue/src/views/BuyersInfoList.vue

@@ -0,0 +1,190 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="logo" label="logo"> </el-table-column>
+            <el-table-column prop="enCompanyName" label="公司英文名"> </el-table-column>
+            <el-table-column prop="chCompanyName" label="公司中文名"> </el-table-column>
+            <el-table-column prop="introduction" label="介绍"> </el-table-column>
+            <el-table-column prop="img" label="img"> </el-table-column>
+            <el-table-column prop="address" label="地区"> </el-table-column>
+            <el-table-column prop="address1" label="详细地址"> </el-table-column>
+            <el-table-column prop="postalCode" label="邮政编码"> </el-table-column>
+            <el-table-column prop="businessLicenseImg" label="营业执照电子版"> </el-table-column>
+            <el-table-column prop="uscc" label="统一社会信用代码"> </el-table-column>
+            <el-table-column prop="businessLicensePeriod" label="营业执照期限"> </el-table-column>
+            <el-table-column prop="homepage" label="网站主页"> </el-table-column>
+            <el-table-column prop="businessCategory" label="企业类别" :formatter="businessCategoryFormatter">
+            </el-table-column>
+            <el-table-column prop="productCategoryId" label="自身产品类别"> </el-table-column>
+            <el-table-column prop="applicationField" label="应用领域"> </el-table-column>
+            <el-table-column prop="industry" label="所属行业"> </el-table-column>
+            <el-table-column prop="interestedProCateId" label="感兴趣的产品"> </el-table-column>
+            <el-table-column prop="uploadCard" label="名片"> </el-table-column>
+            <el-table-column prop="enterpriseSize" label="企业规模"> </el-table-column>
+            <el-table-column prop="contract" label="合同"> </el-table-column>
+            <el-table-column prop="otherFiles" label="其他文件"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'BuyersInfoList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/buyersInfo/all',
+            downloading: false,
+            businessCategoryOptions: [
+                { label: 'PRIVATE_COMPANY', value: 'PRIVATE_COMPANY' },
+                { label: 'STATE_OWNED_COMPANY', value: 'STATE_OWNED_COMPANY' },
+                { label: 'FOREIGN_COMPANY', value: 'FOREIGN_COMPANY' },
+                { label: 'JOINT_COMPANY', value: 'JOINT_COMPANY' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        businessCategoryFormatter(row, column, cellValue, index) {
+            let selectedOption = this.businessCategoryOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/buyersInfoEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/buyersInfoEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/buyersInfo/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/buyersInfo/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 350 - 0
src/main/vue/src/views/Categories.vue

@@ -0,0 +1,350 @@
+<template>
+    <div>
+        <el-row :gutter="24">
+            <el-col :span="14">
+                <div class="menu-tree">
+                    <el-tree
+                        :data="categories"
+                        :render-content="renderContent"
+                        :highlight-current="true"
+                        :expand-on-click-node="true"
+                        node-key="id"
+                        v-loading="loading"
+                        accordion
+                        @node-click="nodeClick"
+                        :default-expanded-keys="expandKeys"
+                        :default-checked-keys="expandKeys"
+                    >
+                    </el-tree>
+                    <el-button type="text" @click="addRootMenu" style="margin-left: 24px;">添加 </el-button>
+                </div>
+            </el-col>
+            <transition name="el-fade-in">
+                <el-col :span="10" v-if="dialogVisible">
+                    <div class="menu-tree">
+                        <div style="font-weight:bold;padding:10px 0">{{ category.id ? '编辑分类' : '新增分类' }}</div>
+                        <el-form :model="category" ref="form" label-position="top">
+                            <el-form-item
+                                label="中文名"
+                                prop="chName"
+                                :rules="[{ required: true, message: '请填写中文名', trigger: 'blur' }]"
+                            >
+                                <el-input v-model="category.chName"></el-input>
+                            </el-form-item>
+                            <el-form-item label="英文名" prop="enName">
+                                <el-input v-model="category.enName"></el-input>
+                            </el-form-item>
+                            <el-form-item prop="code" label="emo码">
+                                <el-input v-model="category.code"></el-input>
+                            </el-form-item>
+                        </el-form>
+                        <div slot="footer">
+                            <el-button @click="dialogVisible = false">取消 </el-button>
+                            <el-button type="primary" @click="addMenu" :loading="loading">保存 </el-button>
+                        </div>
+                    </div>
+                </el-col>
+            </transition>
+        </el-row>
+    </div>
+</template>
+<script>
+export default {
+    created() {
+        this.getData();
+    },
+    data() {
+        return {
+            dialogVisible: false,
+            curr: null,
+            loading: false,
+            category: {
+                enName: '',
+                chName: '',
+                code: ''
+            },
+            parentId: null,
+            currentRef: null,
+            edit: false,
+            categories: [],
+            expandKeys: [],
+            code: null
+        };
+    },
+    methods: {
+        addRootMenu() {
+            this.category = {
+                enName: '',
+                chName: '',
+                code: null
+            };
+            this.parentId = null;
+            this.dialogVisible = true;
+        },
+        showAddDialog(node, data) {
+            this.edit = false;
+            this.parentId = node.data;
+            this.category = {
+                parentId: node.data.id,
+                enName: '',
+                chName: '',
+                code: null
+            };
+            this.code = '';
+            this.dialogVisible = true;
+        },
+        showEditDialog(node, data) {
+            this.edit = true;
+            this.currentRef = node.data;
+            this.category = {
+                ...data
+            };
+            this.code = node.code;
+            this.dialogVisible = true;
+        },
+        addMenu() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.loading = true;
+                    let category = { ...this.category };
+                    delete category.children;
+                    this.$http
+                        .post('/productCategory/save', category, { body: 'json' })
+                        .then(res => {
+                            this.loading = false;
+                            this.$message.success('添加成功');
+                            this.dialogVisible = false;
+                            this.getData();
+                        })
+                        .catch(e => {
+                            console.log(e);
+                            this.loading = false;
+                            this.$message.error(e.error);
+                        });
+                }
+            });
+        },
+        remove(node, data) {
+            console.log(node);
+            this.$confirm('确定删除菜单?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'error'
+            })
+                .then(() => {
+                    return this.$http.post(
+                        '/productCategory/save',
+                        {
+                            ...data,
+                            del: true,
+                            children: null
+                        },
+                        { body: 'json' }
+                    );
+                })
+                .then(res => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    this.loading = false;
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        moveUp(node, data) {
+            if (node.previousSibling) {
+                this.loading = true;
+                let sort0 = node.previousSibling.data.sort,
+                    sort1 = node.data.sort;
+                Promise.all([
+                    this.$http.post(
+                        '/productCategory/save',
+                        {
+                            ...node.data,
+                            children: null,
+                            sort: sort0
+                        },
+                        { body: 'json' }
+                    ),
+                    this.$http.post(
+                        '/productCategory/save',
+                        {
+                            ...node.previousSibling.data,
+                            children: null,
+                            sort: sort1
+                        },
+                        { body: 'json' }
+                    )
+                ])
+                    .then(_ => {
+                        this.loading = false;
+                        this.getData();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.loading = false;
+                        this.$message.error(e.error);
+                    });
+            }
+        },
+        moveDown(node, data) {
+            if (node.nextSibling) {
+                this.loading = true;
+                let sort0 = node.data.sort,
+                    sort1 = node.nextSibling.data.sort;
+                Promise.all([
+                    this.$http.post(
+                        '/productCategory/save',
+                        {
+                            ...node.data,
+                            children: null,
+                            sort: sort1
+                        },
+                        { body: 'json' }
+                    ),
+                    this.$http.post(
+                        '/productCategory/save',
+                        {
+                            ...node.nextSibling.data,
+                            children: null,
+                            sort: sort0
+                        },
+                        { body: 'json' }
+                    )
+                ])
+                    .then(_ => {
+                        this.loading = false;
+                        this.getData();
+                    })
+                    .catch(e => {
+                        console.log(e);
+                        this.loading = false;
+                        this.$message.error(e.error);
+                    });
+            }
+        },
+        getData() {
+            this.$http
+                .get('/productCategory/allList')
+                .then(res => {
+                    this.categories = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        },
+        renderContent(h, { node, data, store }) {
+            return (
+                <span
+                    class={
+                        this.category.id == data.id || (this.category.parentId == data.id && !this.category.id)
+                            ? 'custom-tree-node selected'
+                            : 'custom-tree-node'
+                    }
+                >
+                    <span>{data.chName}</span>
+                    <span class="url">{data.enName}</span>
+                    <span class="url">{data.code}</span>
+                    <span class="opt">
+                        <el-button
+                            type="text"
+                            on-click={e => {
+                                this.showEditDialog(node, data), e.stopPropagation();
+                            }}
+                            icon="el-icon-edit"
+                        >
+                            编辑
+                        </el-button>
+                        <el-button
+                            type="text"
+                            on-click={e => {
+                                this.showAddDialog(node, data), e.stopPropagation();
+                            }}
+                            icon="el-icon-plus"
+                        >
+                            添加
+                        </el-button>
+                        <el-button
+                            type="text"
+                            on-click={e => {
+                                this.remove(node, data), e.stopPropagation();
+                            }}
+                            icon="el-icon-delete"
+                        >
+                            删除
+                        </el-button>
+                    </span>
+                </span>
+            );
+        },
+        nodeClick(data, node, el) {
+            if (this.expandKeys[0] != data.id) {
+                this.expandKeys = [data.id];
+            }
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.menu-tree {
+    border-radius: 4px;
+    background: white;
+    margin-top: 20px;
+    padding: 10px;
+}
+</style>
+<style lang="less">
+.menu-tree {
+    .el-tree-node__content {
+        height: 40px;
+        line-height: 40px;
+    }
+}
+.custom-tree-node {
+    flex: 1;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 14px;
+    padding-right: 8px;
+    line-height: 40px;
+    height: 40px;
+    .url {
+        flex-grow: 1;
+        text-align: right;
+        margin-right: 20px;
+        color: #999;
+    }
+    .opt {
+        opacity: 0;
+    }
+    &.selected {
+        border: 2px solid #409eff;
+        border-radius: 4px;
+        padding: 0 10px;
+        box-sizing: border-box;
+        .opt {
+            opacity: 1;
+        }
+    }
+}
+
+.custom-tree-node:hover {
+    .opt {
+        opacity: 1;
+    }
+}
+
+.available-icons {
+    color: #409eff;
+    text-decoration: none;
+    &:hover {
+        color: #409eff;
+        text-decoration: none;
+    }
+}
+</style>

+ 116 - 0
src/main/vue/src/views/DemandStewardEdit.vue

@@ -0,0 +1,116 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="80px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="userId" label="userId">
+                <el-input-number type="number" v-model="formData.userId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="sex" label="性别">
+                <el-input v-model="formData.sex"></el-input>
+            </el-form-item>
+            <el-form-item prop="position" label="职位">
+                <el-input v-model="formData.position"></el-input>
+            </el-form-item>
+            <el-form-item prop="nickname" label="姓名">
+                <el-input v-model="formData.nickname"></el-input>
+            </el-form-item>
+            <el-form-item prop="phone" label="电话">
+                <el-input v-model="formData.phone"></el-input>
+            </el-form-item>
+            <el-form-item prop="email" label="邮件">
+                <el-input v-model="formData.email"></el-input>
+            </el-form-item>
+            <el-form-item prop="companyName" label="公司名">
+                <el-input v-model="formData.companyName"></el-input>
+            </el-form-item>
+            <el-form-item prop="functionalRequirements" label="功能需求">
+                <el-input v-model="formData.functionalRequirements"></el-input>
+            </el-form-item>
+            <el-form-item prop="otherProblems" label="其他问题">
+                <el-input v-model="formData.otherProblems"></el-input>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'DemandStewardEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('demandSteward/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {}
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/demandSteward/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/demandSteward/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 164 - 0
src/main/vue/src/views/DemandStewardList.vue

@@ -0,0 +1,164 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="userId" label="userId"> </el-table-column>
+            <el-table-column prop="sex" label="性别"> </el-table-column>
+            <el-table-column prop="position" label="职位"> </el-table-column>
+            <el-table-column prop="nickname" label="姓名"> </el-table-column>
+            <el-table-column prop="phone" label="电话"> </el-table-column>
+            <el-table-column prop="email" label="邮件"> </el-table-column>
+            <el-table-column prop="companyName" label="公司名"> </el-table-column>
+            <el-table-column prop="functionalRequirements" label="功能需求"> </el-table-column>
+            <el-table-column prop="otherProblems" label="其他问题"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'DemandStewardList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/demandSteward/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/demandStewardEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/demandStewardEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/demandSteward/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/demandSteward/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 123 - 0
src/main/vue/src/views/EmailEdit.vue

@@ -0,0 +1,123 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="80px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="sendUserId" label="发件人">
+                <el-input-number type="number" v-model="formData.sendUserId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="receiveUserId" label="收件人">
+                <el-input-number type="number" v-model="formData.receiveUserId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="sendTime" label="发送时间">
+                <el-date-picker
+                    v-model="formData.sendTime"
+                    type="datetime"
+                    value-format="yyyy-MM-dd HH:mm:ss"
+                    placeholder="选择日期时间"
+                >
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="title" label="标题">
+                <el-input v-model="formData.title"></el-input>
+            </el-form-item>
+            <el-form-item prop="content" label="内容">
+                <el-input v-model="formData.content"></el-input>
+            </el-form-item>
+            <el-form-item prop="isRead" label="已读">
+                <el-switch v-model="formData.isRead"></el-switch>
+            </el-form-item>
+            <el-form-item prop="type" label="消息类型">
+                <el-select v-model="formData.type" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'EmailEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('email/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {},
+            typeOptions: [
+                { label: 'SYSTEM_INFORMATION', value: 'SYSTEM_INFORMATION' },
+                { label: 'CONSULTING_NEWS', value: 'CONSULTING_NEWS' }
+            ]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/email/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/email/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 177 - 0
src/main/vue/src/views/EmailList.vue

@@ -0,0 +1,177 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="sendUserId" label="发件人"> </el-table-column>
+            <el-table-column prop="receiveUserId" label="收件人"> </el-table-column>
+            <el-table-column prop="sendTime" label="发送时间"> </el-table-column>
+            <el-table-column prop="title" label="标题"> </el-table-column>
+            <el-table-column prop="content" label="内容"> </el-table-column>
+            <el-table-column prop="isRead" label="已读">
+                <template slot-scope="{ row }">
+                    <el-tag :type="row.isRead ? '' : 'info'">{{ row.isRead }}</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column prop="type" label="消息类型" :formatter="typeFormatter"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'EmailList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/email/all',
+            downloading: false,
+            typeOptions: [
+                { label: 'SYSTEM_INFORMATION', value: 'SYSTEM_INFORMATION' },
+                { label: 'CONSULTING_NEWS', value: 'CONSULTING_NEWS' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        typeFormatter(row, column, cellValue, index) {
+            let selectedOption = this.typeOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/emailEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/emailEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/email/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/email/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 107 - 0
src/main/vue/src/views/EnterpriseClaimEdit.vue

@@ -0,0 +1,107 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="52px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="sex" label="性别">
+                <el-input v-model="formData.sex"></el-input>
+            </el-form-item>
+            <el-form-item prop="position" label="职位">
+                <el-input v-model="formData.position"></el-input>
+            </el-form-item>
+            <el-form-item prop="nickname" label="姓名">
+                <el-input v-model="formData.nickname"></el-input>
+            </el-form-item>
+            <el-form-item prop="phone" label="电话">
+                <el-input v-model="formData.phone"></el-input>
+            </el-form-item>
+            <el-form-item prop="email" label="邮箱">
+                <el-input v-model="formData.email"></el-input>
+            </el-form-item>
+            <el-form-item prop="vendorId" label="企业">
+                <el-input-number type="number" v-model="formData.vendorId"></el-input-number>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'EnterpriseClaimEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('enterpriseClaim/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {}
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/enterpriseClaim/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/enterpriseClaim/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 161 - 0
src/main/vue/src/views/EnterpriseClaimList.vue

@@ -0,0 +1,161 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="sex" label="性别"> </el-table-column>
+            <el-table-column prop="position" label="职位"> </el-table-column>
+            <el-table-column prop="nickname" label="姓名"> </el-table-column>
+            <el-table-column prop="phone" label="电话"> </el-table-column>
+            <el-table-column prop="email" label="邮箱"> </el-table-column>
+            <el-table-column prop="vendorId" label="企业"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'EnterpriseClaimList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/enterpriseClaim/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/enterpriseClaimEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/enterpriseClaimEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/enterpriseClaim/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/enterpriseClaim/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 149 - 0
src/main/vue/src/views/ProductEdit.vue

@@ -0,0 +1,149 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="108px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="brand" label="品牌">
+                <el-input v-model="formData.brand"></el-input>
+            </el-form-item>
+            <el-form-item prop="productCategoryId" label="主要产品类别">
+                <el-input-number type="number" v-model="formData.productCategoryId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="enName" label="英文名">
+                <el-input v-model="formData.enName"></el-input>
+            </el-form-item>
+            <el-form-item prop="chName" label="中文名">
+                <el-input v-model="formData.chName"></el-input>
+            </el-form-item>
+            <el-form-item prop="model" label="型号">
+                <el-input v-model="formData.model"></el-input>
+            </el-form-item>
+            <el-form-item prop="img" label="图片">
+                <el-input v-model="formData.img"></el-input>
+            </el-form-item>
+            <el-form-item prop="video" label="视频">
+                <el-input v-model="formData.video"></el-input>
+            </el-form-item>
+            <el-form-item prop="pdf" label="pdf">
+                <el-input v-model="formData.pdf"></el-input>
+            </el-form-item>
+            <el-form-item prop="introduction" label="简介">
+                <el-input v-model="formData.introduction"></el-input>
+            </el-form-item>
+            <el-form-item prop="productTagIds" label="标签">
+                <el-input v-model="formData.productTagIds"></el-input>
+            </el-form-item>
+            <el-form-item prop="number" label="编号">
+                <el-input v-model="formData.number"></el-input>
+            </el-form-item>
+            <el-form-item prop="vendorInfoId" label="厂商Id">
+                <el-input-number type="number" v-model="formData.vendorInfoId"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="customsHsCode" label="海关HS编码">
+                <el-input v-model="formData.customsHsCode"></el-input>
+            </el-form-item>
+            <el-form-item prop="price" label="货值">
+                <el-input-number type="number" v-model="formData.price"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="entryRecordNumber" label="进境备案单号">
+                <el-input v-model="formData.entryRecordNumber"></el-input>
+            </el-form-item>
+            <el-form-item prop="importDeclarationNumber" label="进口报关单号">
+                <el-input v-model="formData.importDeclarationNumber"></el-input>
+            </el-form-item>
+            <el-form-item prop="exitRecordNumber" label="出境备案单号">
+                <el-input v-model="formData.exitRecordNumber"></el-input>
+            </el-form-item>
+            <el-form-item prop="deviceStatus" label="设备状态">
+                <el-input v-model="formData.deviceStatus"></el-input>
+            </el-form-item>
+            <el-form-item prop="buyersName" label="采购商名称">
+                <el-input v-model="formData.buyersName"></el-input>
+            </el-form-item>
+            <el-form-item prop="visits" label="访问次数">
+                <el-input-number type="number" v-model="formData.visits"></el-input-number>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'ProductEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('product/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {}
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/product/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/product/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 175 - 0
src/main/vue/src/views/ProductList.vue

@@ -0,0 +1,175 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="brand" label="品牌"> </el-table-column>
+            <el-table-column prop="productCategoryId" label="主要产品类别"> </el-table-column>
+            <el-table-column prop="enName" label="英文名"> </el-table-column>
+            <el-table-column prop="chName" label="中文名"> </el-table-column>
+            <el-table-column prop="model" label="型号"> </el-table-column>
+            <el-table-column prop="img" label="图片"> </el-table-column>
+            <el-table-column prop="video" label="视频"> </el-table-column>
+            <el-table-column prop="pdf" label="pdf"> </el-table-column>
+            <el-table-column prop="introduction" label="简介"> </el-table-column>
+            <el-table-column prop="productTagIds" label="标签"> </el-table-column>
+            <el-table-column prop="number" label="编号"> </el-table-column>
+            <el-table-column prop="vendorInfoId" label="厂商Id"> </el-table-column>
+            <el-table-column prop="customsHsCode" label="海关HS编码"> </el-table-column>
+            <el-table-column prop="price" label="货值"> </el-table-column>
+            <el-table-column prop="entryRecordNumber" label="进境备案单号"> </el-table-column>
+            <el-table-column prop="importDeclarationNumber" label="进口报关单号"> </el-table-column>
+            <el-table-column prop="exitRecordNumber" label="出境备案单号"> </el-table-column>
+            <el-table-column prop="deviceStatus" label="设备状态"> </el-table-column>
+            <el-table-column prop="buyersName" label="采购商名称"> </el-table-column>
+            <el-table-column prop="visits" label="访问次数"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'ProductList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/product/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/productEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/productEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/product/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/product/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 98 - 0
src/main/vue/src/views/ProductTagEdit.vue

@@ -0,0 +1,98 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="66px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="enName" label="英文名">
+                <el-input v-model="formData.enName"></el-input>
+            </el-form-item>
+            <el-form-item prop="chName" label="中文名">
+                <el-input v-model="formData.chName"></el-input>
+            </el-form-item>
+            <el-form-item prop="parentId" label="父级Id">
+                <el-input-number type="number" v-model="formData.parentId"></el-input-number>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'ProductTagEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('productTag/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            rules: {}
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+
+            this.saving = true;
+            this.$http
+                .post('/productTag/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/productTag/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 158 - 0
src/main/vue/src/views/ProductTagList.vue

@@ -0,0 +1,158 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="enName" label="英文名"> </el-table-column>
+            <el-table-column prop="chName" label="中文名"> </el-table-column>
+            <el-table-column prop="parentId" label="父级Id"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'ProductTagList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/productTag/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/productTagEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/productTagEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/productTag/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/productTag/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 9 - 0
src/main/vue/src/views/UserEdit.vue

@@ -26,6 +26,15 @@
             <el-form-item prop="phone" label="手机">
                 <el-input v-model="formData.phone"></el-input>
             </el-form-item>
+            <el-form-item prop="sex" label="性别">
+                <el-radio-group v-model="formData.sex">
+                    <el-radio label="男">男</el-radio>
+                    <el-radio label="女">女</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item prop="position" label="职位">
+                <el-input v-model="formData.position"></el-input>
+            </el-form-item>
             <el-form-item prop="authorities" label="角色">
                 <el-select
                     v-model="formData.authorities"

+ 5 - 3
src/main/vue/src/views/UserList.vue

@@ -25,9 +25,9 @@
         >
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
-            <el-table-column prop="username" label="用户名" min-width="300"> </el-table-column>
-            <el-table-column prop="nickname" label="昵称" min-width="300"> </el-table-column>
-            <el-table-column label="头像" min-width="300">
+            <el-table-column prop="username" label="用户名" min-width="100"> </el-table-column>
+            <el-table-column prop="nickname" label="昵称" min-width="100"> </el-table-column>
+            <el-table-column label="头像" min-width="100">
                 <template slot-scope="{ row }">
                     <el-image
                         style="width: 30px; height: 30px;"
@@ -37,6 +37,8 @@
                     ></el-image>
                 </template>
             </el-table-column>
+            <el-table-column prop="sex" label="性别" min-width="100"> </el-table-column>
+            <el-table-column prop="position" label="职位" min-width="100"> </el-table-column>
             <el-table-column label="操作" align="center" fixed="right">
                 <template slot-scope="{ row }">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>

+ 205 - 0
src/main/vue/src/views/VendorInfoEdit.vue

@@ -0,0 +1,205 @@
+<template>
+    <div class="edit-view">
+        <el-form
+            :model="formData"
+            :rules="rules"
+            ref="form"
+            label-width="136px"
+            label-position="right"
+            size="small"
+            style="max-width: 500px;"
+        >
+            <el-form-item prop="logo" label="logo">
+                <crop-upload v-model="formData.logo"></crop-upload>
+            </el-form-item>
+            <el-form-item prop="enCompanyName" label="公司英文名">
+                <el-input v-model="formData.enCompanyName"></el-input>
+            </el-form-item>
+            <el-form-item prop="chCompanyName" label="公司中文名">
+                <el-input v-model="formData.chCompanyName"></el-input>
+            </el-form-item>
+            <el-form-item prop="introduction" label="介绍">
+                <el-input type="textarea" v-model="formData.introduction"></el-input>
+            </el-form-item>
+            <el-form-item prop="img" label="图片">
+                <multi-upload v-model="img"></multi-upload>
+            </el-form-item>
+            <el-form-item prop="postalCode" label="邮政编码">
+                <el-input v-model="formData.postalCode"></el-input>
+            </el-form-item>
+            <el-form-item prop="businessLicenseImg" label="营业执照电子版">
+                <multi-upload v-model="businessLicenseImg"></multi-upload>
+            </el-form-item>
+            <el-form-item prop="uscc" label="统一社会信用代码">
+                <el-input v-model="formData.uscc"></el-input>
+            </el-form-item>
+            <el-form-item prop="businessLicensePeriod" label="营业执照期限">
+                <el-date-picker
+                    v-model="formData.businessLicensePeriod"
+                    type="datetime"
+                    value-format="yyyy-MM-dd HH:mm:ss"
+                    placeholder="选择日期时间"
+                >
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="homepage" label="网站主页">
+                <el-input v-model="formData.homepage">
+                    <template slot="prepend">Http://</template>
+                </el-input>
+            </el-form-item>
+            <el-form-item prop="productCategoryId" label="主要产品类别">
+                <el-cascader
+                    v-model="category"
+                    :props="optionProps"
+                    :options="categories"
+                    :show-all-levels="false"
+                    @change="handleChange"
+                >
+                </el-cascader>
+            </el-form-item>
+            <el-form-item prop="applicationField" label="应用领域">
+                <el-input v-model="formData.applicationField"></el-input>
+            </el-form-item>
+            <el-form-item prop="enterpriseType" label="企业类别">
+                <el-input v-model="formData.enterpriseType"></el-input>
+            </el-form-item>
+            <el-form-item prop="contract" label="合同">
+                <el-input v-model="formData.contract"></el-input>
+            </el-form-item>
+            <el-form-item prop="otherFiles" label="其他文件">
+                <el-input v-model="formData.otherFiles"></el-input>
+            </el-form-item>
+            <el-form-item prop="visits" label="访问次数">
+                <el-input-number type="number" v-model="formData.visits"></el-input-number>
+            </el-form-item>
+            <el-form-item>
+                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button>
+                <el-button @click="$router.go(-1)">取消</el-button>
+            </el-form-item>
+        </el-form>
+    </div>
+</template>
+<script>
+export default {
+    name: 'VendorInfoEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('vendorInfo/get/' + this.$route.query.id)
+                .then(res => {
+                    this.formData = res;
+                    this.img = res.img.split(',');
+                    this.businessLicenseImg = res.businessLicenseImg.split(',');
+                    this.category = res.productCategoryId.split(',');
+                    console.log(this.category);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        }
+        this.$http
+            .get('/productCategory/allList')
+            .then(res => {
+                this.categories = this.getTreeData(res);
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+    },
+    data() {
+        return {
+            saving: false,
+            formData: {},
+            img: [],
+            businessLicenseImg: [],
+            category: [],
+            productCategoryId: '',
+            rules: {},
+            value: '',
+            categories: [],
+            optionProps: {
+                value: 'id',
+                label: 'chName',
+                children: 'children',
+                multiple: true
+            }
+        };
+    },
+    methods: {
+        handleChange(value) {
+            let data = '';
+            for (let i = 0; i < value.length; i++) {
+                let j = value[i].length - 1;
+                if (data === '') {
+                    data = value[i][j];
+                } else {
+                    data += ',' + value[i][j];
+                }
+            }
+            this.productCategoryId = data;
+        },
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            data.img = this.img.join(',');
+            data.businessLicenseImg = this.businessLicenseImg.join(',');
+            data.productCategoryId = this.productCategoryId;
+
+            this.saving = true;
+            this.$http
+                .post('/vendorInfo/save', data, { body: 'json' })
+                .then(res => {
+                    this.saving = false;
+                    this.$message.success('成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.saving = false;
+                    this.$message.error(e.error);
+                });
+        },
+        onDelete() {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/vendorInfo/del/${this.formData.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.$router.go(-1);
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        console.log(e);
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        getTreeData(data) {
+            // 循环遍历json数据
+            for (let i = 0; i < data.length; i++) {
+                if (data[i].children.length < 1) {
+                    // children若为空数组,则将children设为undefined
+                    data[i].children = undefined;
+                } else {
+                    // children若不为空数组,则继续 递归调用 本方法
+                    this.getTreeData(data[i].children);
+                }
+            }
+            return data;
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 205 - 0
src/main/vue/src/views/VendorInfoList.vue

@@ -0,0 +1,205 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <el-input placeholder="输入关键字" v-model="search" clearable class="filter-item"></el-input>
+            <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button>
+            <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">添加 </el-button>
+            <el-button
+                @click="download"
+                type="primary"
+                icon="el-icon-download"
+                :loading="downloading"
+                class="filter-item"
+                >导出EXCEL
+            </el-button>
+        </div>
+        <el-table
+            :data="tableData"
+            row-key="id"
+            ref="table"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+            :height="tableHeight"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <el-table-column prop="id" label="ID" width="100"> </el-table-column>
+            <el-table-column prop="logo" label="logo">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px;"
+                        :src="row.logo"
+                        fit="cover"
+                        :preview-src-list="[row.logo]"
+                    ></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="enCompanyName" label="公司英文名"> </el-table-column>
+            <el-table-column prop="chCompanyName" label="公司中文名"> </el-table-column>
+            <el-table-column prop="introduction" label="介绍"> </el-table-column>
+            <el-table-column prop="img" label="图片">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px;"
+                        :src="sp(row.img)[0]"
+                        fit="cover"
+                        :preview-src-list="sp(row.img) || []"
+                    ></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="postalCode" label="邮政编码"> </el-table-column>
+            <el-table-column prop="businessLicenseImg" label="营业执照电子版">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px;"
+                        :src="sp(row.img)[0]"
+                        fit="cover"
+                        :preview-src-list="sp(row.img) || []"
+                    ></el-image>
+                </template>
+            </el-table-column>
+            <el-table-column prop="uscc" label="统一社会信用代码"> </el-table-column>
+            <el-table-column prop="businessLicensePeriod" label="营业执照期限"> </el-table-column>
+            <el-table-column prop="homepage" label="网站主页">
+                <template slot-scope="{ row }">
+                    <a target="_blank" :href="'http://' + row.homepage">{{ row.homepage }}</a>
+                </template>
+            </el-table-column>
+            <el-table-column prop="productCategoryId" label="主要产品类别"> </el-table-column>
+            <el-table-column prop="applicationField" label="应用领域"> </el-table-column>
+            <el-table-column prop="enterpriseType" label="企业类别"> </el-table-column>
+            <el-table-column prop="contract" label="合同"> </el-table-column>
+            <el-table-column prop="otherFiles" label="其他文件"> </el-table-column>
+            <el-table-column prop="visits" label="访问次数"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <!-- <div class="multiple-mode-wrapper">
+                <el-button v-if="!multipleMode" @click="toggleMultipleMode(true)">批量编辑</el-button>
+                <el-button-group v-else>
+                    <el-button @click="operation1">批量操作1</el-button>
+                    <el-button @click="operation2">批量操作2</el-button>
+                    <el-button @click="toggleMultipleMode(false)">取消</el-button>
+                </el-button-group>
+            </div> -->
+            <el-pagination
+                background
+                @size-change="onSizeChange"
+                @current-change="onCurrentChange"
+                :current-page="page"
+                :page-sizes="[10, 20, 30, 40, 50]"
+                :page-size="pageSize"
+                layout="total, sizes, prev, pager, next, jumper"
+                :total="totalElements"
+            >
+            </el-pagination>
+        </div>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'VendorInfoList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/vendorInfo/all',
+            downloading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            return { search: this.search };
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/vendorInfoEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/vendorInfoEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/vendorInfo/excel', {
+                    responseType: 'blob',
+                    params: { size: 10000 }
+                })
+                .then(res => {
+                    console.log(res);
+                    this.downloading = false;
+                    const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+                    const link = document.createElement('a');
+                    link.href = downloadUrl;
+                    link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+                    document.body.appendChild(link);
+                    link.click();
+                    link.remove();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.downloading = false;
+                    this.$message.error(e.error);
+                });
+        },
+        operation1() {
+            this.$notify({
+                title: '提示',
+                message: this.selection
+            });
+        },
+        operation2() {
+            this.$message('操作2');
+        },
+        deleteRow(row) {
+            this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
+                .then(() => {
+                    return this.$http.post(`/vendorInfo/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        sp(row) {
+            return row.split(',');
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 21 - 0
src/test/java/com/izouma/imt/controller/AuthControllerTest.java

@@ -0,0 +1,21 @@
+package com.izouma.imt.controller;
+
+import com.izouma.imt.web.AuthenticationController;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class AuthControllerTest {
+    @Autowired
+    private AuthenticationController controller;
+
+    @Test
+    public void test(){
+//        System.out.println(controller.loginByUserPwd("testuser", "123", null));
+        System.out.println(controller.loginByAccount("123@qq.com", "123"));
+    }
+}

+ 59 - 0
src/test/java/com/izouma/imt/repo/ProductCategoryRepoTest.java

@@ -0,0 +1,59 @@
+package com.izouma.imt.repo;
+
+import com.izouma.imt.domain.ProductCategory;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class ProductCategoryRepoTest {
+    @Autowired
+    private ProductCategoryRepo productCategoryRepo;
+
+    @Test
+    public void test() {
+        productCategoryRepo.save(ProductCategory
+                .builder()
+                .chName("台式钻床")
+                .enName("Bench type drilling machines")
+                .code("2.01")
+                .parentId(21L)
+                .build());
+    }
+
+    @Test
+    public void test1() {
+        List<Long> longs = Collections.singletonList(16L);
+        List<ProductCategory> list = productCategoryRepo.findAllByParentIdIn(longs);
+        List<Long> collect = null;
+        List<Long> collect2 = new ArrayList<>();
+        while (list.size() != 0) {
+            collect = list
+                    .stream()
+                    .map(ProductCategory::getId)
+                    .collect(Collectors.toList());
+            System.out.println(collect);
+            list = productCategoryRepo.findAllByParentIdIn(collect);
+            collect2.addAll(collect);
+            System.out.println(collect2);
+        }
+
+        System.out.println("=======》" + collect);
+    }
+
+    @Test
+    public void test2() {
+        List<Integer> integers = new ArrayList<>(Arrays.asList(11, 12, 13, 14));
+        List<Integer> integers1 = new ArrayList<>(Arrays.asList(15,16));
+        System.out.println(Collections.disjoint(integers1, integers));
+    }
+}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików