Bladeren bron

Merge branch 'dev' of licailing/zhirongip into master

licailing 4 jaren geleden
bovenliggende
commit
9c4ca7affb
30 gewijzigde bestanden met toevoegingen van 828 en 98 verwijderingen
  1. 7 0
      src/main/java/com/izouma/zhirongip/domain/BaseEntity.java
  2. 7 1
      src/main/java/com/izouma/zhirongip/domain/resource/Company.java
  3. 25 7
      src/main/java/com/izouma/zhirongip/domain/resource/Expert.java
  4. 9 0
      src/main/java/com/izouma/zhirongip/domain/resource/NumOfIp.java
  5. 105 0
      src/main/java/com/izouma/zhirongip/dto/CompanyDTO.java
  6. 63 0
      src/main/java/com/izouma/zhirongip/dto/ExpertDTO.java
  7. 140 0
      src/main/java/com/izouma/zhirongip/service/resource/CompanyService.java
  8. 56 3
      src/main/java/com/izouma/zhirongip/service/resource/ExpertService.java
  9. 32 0
      src/main/java/com/izouma/zhirongip/utils/excel/BooleanConverter.java
  10. 28 0
      src/main/java/com/izouma/zhirongip/utils/excel/ExcelListener.java
  11. 43 0
      src/main/java/com/izouma/zhirongip/utils/excel/ExcelUtils.java
  12. 11 0
      src/main/java/com/izouma/zhirongip/web/InstitutionController.java
  13. 11 0
      src/main/java/com/izouma/zhirongip/web/PersonalController.java
  14. 1 5
      src/main/java/com/izouma/zhirongip/web/SettingController.java
  15. 24 5
      src/main/java/com/izouma/zhirongip/web/resource/CompanyController.java
  16. 20 4
      src/main/java/com/izouma/zhirongip/web/resource/ExpertController.java
  17. 3 3
      src/main/resources/templates/ListViewTemplate.ftl
  18. 58 5
      src/main/vue/src/views/ExpertList.vue
  19. 6 25
      src/main/vue/src/views/resource/CompanyEdit.vue
  20. 49 7
      src/main/vue/src/views/resource/CompanyList.vue
  21. 0 1
      src/main/zhi-rong-web/src/components/Banner.vue
  22. 6 5
      src/main/zhi-rong-web/src/components/home/Resources.vue
  23. 6 3
      src/main/zhi-rong-web/src/components/list/DigitalRow.vue
  24. 1 1
      src/main/zhi-rong-web/src/components/list/ExpertGride.vue
  25. 1 1
      src/main/zhi-rong-web/src/components/page/BreadPage.vue
  26. 12 0
      src/main/zhi-rong-web/src/router/index.js
  27. 87 0
      src/main/zhi-rong-web/src/views/detail/Digitals.vue
  28. 11 13
      src/main/zhi-rong-web/src/views/detail/ExpertDetail.vue
  29. 5 1
      src/main/zhi-rong-web/src/views/legal/Digital.vue
  30. 1 8
      src/main/zhi-rong-web/src/views/legal/Expert.vue

+ 7 - 0
src/main/java/com/izouma/zhirongip/domain/BaseEntity.java

@@ -1,5 +1,6 @@
 package com.izouma.zhirongip.domain;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -20,26 +21,32 @@ import java.time.LocalDateTime;
 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonIgnoreProperties(value = {"hibernateLazyInitializer"}, ignoreUnknown = true)
 public abstract class BaseEntity {
+    @ExcelIgnore
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     private Long id;
 
+    @ExcelIgnore
     @JsonIgnore
     @CreatedBy
     private String createdBy;
 
+    @ExcelIgnore
     @JsonIgnore
     @CreatedDate
     private LocalDateTime createdAt;
 
+    @ExcelIgnore
     @JsonIgnore
     @LastModifiedBy
     private String modifiedBy;
 
+    @ExcelIgnore
     @JsonIgnore
     @LastModifiedDate
     private LocalDateTime modifiedAt;
 
+    @ExcelIgnore
     private boolean del;
 
     public Long getId() {

+ 7 - 1
src/main/java/com/izouma/zhirongip/domain/resource/Company.java

@@ -1,11 +1,13 @@
 package com.izouma.zhirongip.domain.resource;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.excel.annotation.ExcelIgnore;
 import com.izouma.zhirongip.annotations.Searchable;
 import com.izouma.zhirongip.annotations.SearchableOne;
 import com.izouma.zhirongip.converter.LongArrayConverter;
 import com.izouma.zhirongip.converter.NumOfIpListConverter;
 import com.izouma.zhirongip.domain.BaseEntity;
+import com.izouma.zhirongip.dto.CompanyDTO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -100,7 +102,7 @@ public class Company extends BaseEntity {
     private List<Long> standardizationLevel;
 
     @Convert(converter = LongArrayConverter.class)
-    @ApiModelProperty(value = "类别")
+    @ApiModelProperty(value = "企业技术资质")
     private List<Long> qualificationLevel;
 
     @ApiModelProperty(value = "联系人")
@@ -123,4 +125,8 @@ public class Company extends BaseEntity {
 
     @Transient
     private String settingName;
+
+    public Company(CompanyDTO dto) {
+        BeanUtil.copyProperties(dto, this);
+    }
 }

+ 25 - 7
src/main/java/com/izouma/zhirongip/domain/resource/Expert.java

@@ -1,10 +1,13 @@
 package com.izouma.zhirongip.domain.resource;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.izouma.zhirongip.annotations.Searchable;
 import com.izouma.zhirongip.annotations.SearchableOne;
 import com.izouma.zhirongip.converter.LongArrayConverter;
 import com.izouma.zhirongip.domain.BaseEntity;
+import com.izouma.zhirongip.dto.ExpertDTO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -29,49 +32,55 @@ import java.util.List;
 @Where(clause = "del = 0")
 public class Expert extends BaseEntity {
 
-//    @ExcelIgnore
-//    @Column(columnDefinition = "TEXT")
-//    @Convert(converter = StringArrayConverter.class)
-//    @ApiModelProperty(value = "照片")
-//    private List<String> qualification;
-
+    @ExcelProperty(value = "照片")
     @ApiModelProperty(value = "照片")
     private String avatar;
 
+    @ExcelProperty(value = "姓名")
     @Searchable
     @ApiModelProperty(value = "姓名")
     private String name;
 
+    @ExcelProperty(value = "性别")
     @ApiModelProperty(value = "出生年月")
     private String sex;
 
+    @ExcelProperty(value = "出生年月")
     @ApiModelProperty(value = "出生年月")
     private LocalDate birthday;
 
+    @ExcelProperty(value = "单位")
     @ApiModelProperty(value = "单位")
     private String work;
 
+    @ExcelProperty(value = "学历")
     @SearchableOne
     @ApiModelProperty(value = "学历")
     private String academicQualification;
 
+    @ExcelProperty(value = "职称")
     @SearchableOne
     @ApiModelProperty(value = "职称")
     private String jobTitle;
 
+    @ExcelProperty(value = "职位")
     @ApiModelProperty(value = "职位")
     private String position;
 
+    @ExcelProperty(value = "电话")
     @Searchable
     @ApiModelProperty(value = "电话")
     private String phone;
 
+    @ExcelProperty(value = "邮箱")
     @ApiModelProperty(value = "邮箱")
     private String email;
 
+    @ExcelProperty(value = "通讯地址")
     @ApiModelProperty(value = "通讯地址")
     private String address;
 
+    @ExcelIgnore
     @ApiModelProperty(value = "研究方向")
     private Long affiliation;
 
@@ -84,16 +93,25 @@ public class Expert extends BaseEntity {
     private List<Long> field;
 
     @Searchable
-    @ExcelIgnore
+    @ExcelProperty(value = "个人简介")
     @Column(columnDefinition = "TEXT")
     @ApiModelProperty(value = "个人简介")
     private String selfIntroduction;
 
+    @ExcelIgnore
     @Transient
     private List<String> fieldName;
 
+    @ExcelProperty(value = "专业领域")
+    private String fieldNames;
+
+    @ExcelProperty(value = "研究方向")
     @Transient
     private String affiliationName;
 
+    public Expert(ExpertDTO dto) {
+        BeanUtil.copyProperties(dto, this);
+    }
+
 
 }

+ 9 - 0
src/main/java/com/izouma/zhirongip/domain/resource/NumOfIp.java

@@ -1,9 +1,18 @@
 package com.izouma.zhirongip.domain.resource;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
 
+import java.util.Arrays;
+import java.util.List;
+
+@AllArgsConstructor
 @Data
 public class NumOfIp {
     private Long ip;
     private int  num;
+
+    public String getContent(String name) {
+        return name + ":" + this.num + ";";
+    }
 }

+ 105 - 0
src/main/java/com/izouma/zhirongip/dto/CompanyDTO.java

@@ -0,0 +1,105 @@
+package com.izouma.zhirongip.dto;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.metadata.BaseRowModel;
+import com.izouma.zhirongip.domain.resource.Company;
+import com.izouma.zhirongip.utils.excel.BooleanConverter;
+import com.izouma.zhirongip.utils.excel.LocalDateTimeConverter;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "Company")
+public class CompanyDTO extends BaseRowModel {
+
+    @ExcelProperty(value = "企业性质")
+    private String settingName;
+
+    @ExcelProperty(value = "所属领域")
+    private String fieldName;
+
+    @ExcelProperty(value = "企业名称")
+    private String name;
+
+    @ExcelProperty(value = "所属地区")
+    private String owner;
+
+    @ExcelProperty(value = "图片")
+    private String img;
+
+    @ExcelProperty(value = "企业简介")
+    private String manual;
+
+    @ExcelProperty(value = "入库入网")
+    private String networkName;
+
+    @ExcelProperty(value = "武器装备科研生产单位保密资格证", converter = BooleanConverter.class)
+    private boolean confidentialityQualification;
+
+    @ExcelProperty(value = "保密资格证级别")
+    private String confidentialityLevelName;
+
+    @ExcelProperty(value = "武器装备质量管理体系认证", converter = BooleanConverter.class)
+    private boolean certification;
+
+    @ExcelProperty(value = "武器装备承制单位资格证", converter = BooleanConverter.class)
+    private boolean unitQualification;
+
+    @ExcelProperty(value = "承制单位资格证级别")
+    private String unitLevelName;
+
+    @ExcelProperty(value = "武器装备科研生产许可证", converter = BooleanConverter.class)
+    private boolean productionLicence;
+
+    @ExcelProperty(value = "生产许可证类别")
+    private String productionLevelName;
+
+    @ExcelProperty(value = "涉密信息系统集成", converter = BooleanConverter.class)
+    private boolean systemIntegration;
+
+    @ExcelProperty(value = "系统集成级别")
+    private String integrationLevelName;
+
+    @ExcelProperty(value = "高新技术企业", converter = BooleanConverter.class)
+    private boolean highTech;
+
+    @ExcelProperty(value = "知识产权数量")
+    private String numOfIpsName;
+
+    @ExcelProperty(value = "知识产权贯标", converter = BooleanConverter.class)
+    private boolean standardization;
+
+    @ExcelProperty(value = "知识产权贯标级别")
+    private String standardizationLevelName;
+
+    @ExcelProperty(value = "企业技术资质")
+    private String qualificationLevelName;
+
+    @ExcelProperty(value = "联系人")
+    private String contact;
+
+    @ExcelProperty(value = "电话")
+    private String phone;
+
+    @ExcelProperty(value = "邮箱")
+    private String email;
+
+    @ExcelProperty(value = "官网地址")
+    private String url;
+
+    @ExcelProperty(value = "信息更新时间", converter = LocalDateTimeConverter.class)
+    private LocalDateTime updateAt;
+
+    public CompanyDTO(Company company) {
+        BeanUtil.copyProperties(company, this);
+    }
+}

+ 63 - 0
src/main/java/com/izouma/zhirongip/dto/ExpertDTO.java

@@ -0,0 +1,63 @@
+package com.izouma.zhirongip.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.metadata.BaseRowModel;
+import com.izouma.zhirongip.utils.excel.LocalDateConverter;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Builder
+@ApiModel(value = "技术经理人")
+public class ExpertDTO extends BaseRowModel {
+
+    @ExcelProperty(value = "照片")
+    private String avatar;
+
+    @ExcelProperty(value = "姓名")
+    private String name;
+
+    @ExcelProperty(value = "性别")
+    private String sex;
+
+    @ExcelProperty(value = "出生年月", converter = LocalDateConverter.class)
+    private LocalDate birthday;
+
+    @ExcelProperty(value = "单位")
+    private String work;
+
+    @ExcelProperty(value = "学历")
+    private String academicQualification;
+
+    @ExcelProperty(value = "职称")
+    private String jobTitle;
+
+    @ExcelProperty(value = "职位")
+    private String position;
+
+    @ExcelProperty(value = "电话")
+    private String phone;
+
+    @ExcelProperty(value = "邮箱")
+    private String email;
+
+    @ExcelProperty(value = "通讯地址")
+    private String address;
+
+    @ExcelProperty(value = "个人简介")
+    private String selfIntroduction;
+
+    @ExcelProperty(value = "专业领域")
+    private String fieldNames;
+
+    @ExcelProperty(value = "研究方向")
+    private String affiliationName;
+
+}

+ 140 - 0
src/main/java/com/izouma/zhirongip/service/resource/CompanyService.java

@@ -1,15 +1,28 @@
 package com.izouma.zhirongip.service.resource;
 
+import com.izouma.zhirongip.converter.StringArrayConverter;
 import com.izouma.zhirongip.domain.Setting;
 import com.izouma.zhirongip.domain.resource.Company;
+import com.izouma.zhirongip.domain.resource.NumOfIp;
+import com.izouma.zhirongip.dto.CompanyDTO;
 import com.izouma.zhirongip.dto.PageQuery;
+import com.izouma.zhirongip.exception.BusinessException;
 import com.izouma.zhirongip.repo.SettingRepo;
 import com.izouma.zhirongip.repo.resource.CompanyRepo;
 import com.izouma.zhirongip.utils.JpaUtils;
+import com.izouma.zhirongip.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import javax.transaction.Transactional;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -20,6 +33,10 @@ public class CompanyService {
     private final CompanyRepo companyRepo;
     private final SettingRepo settingRepo;
 
+    public Page<Company> excelAll(PageQuery pageQuery) {
+        return companyRepo.findAll(JpaUtils.toSpecification(pageQuery, Company.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
     public Page<Company> all(PageQuery pageQuery) {
         Map<Long, String> settingMap = settingRepo.findAll().stream()
                 .collect(Collectors.toMap(Setting::getId, Setting::getName));
@@ -30,4 +47,127 @@ public class CompanyService {
                     return cd;
                 });
     }
+
+    public Company get(Long id) {
+        Company company = companyRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        List<Long> ids = new ArrayList<>();
+        ids.add(company.getField());
+        ids.add(company.getSettingId());
+        Map<Long, String> settingMap = settingRepo.findAllById(ids)
+                .stream()
+                .collect(Collectors.toMap(Setting::getId, Setting::getName));
+        company.setFieldName(settingMap.get(company.getField()));
+        company.setSettingName(settingMap.get(company.getSettingId()));
+        return company;
+    }
+
+    public List<CompanyDTO> toDtoList(List<Company> companies) {
+        List<CompanyDTO> dtos = new ArrayList<>();
+        Map<Long, String> settingMap = settingRepo.findAll().stream()
+                .collect(Collectors.toMap(Setting::getId, Setting::getName));
+        companies.forEach(company -> {
+            CompanyDTO dto = new CompanyDTO(company);
+            dto.setSettingName(settingMap.get(company.getSettingId()));
+            dto.setFieldName(settingMap.get(company.getField()));
+            dto.setNetworkName(company.getNetwork().stream().map(settingMap::get).collect(Collectors.joining(",")));
+            dto.setConfidentialityLevelName(settingMap.get(company.getConfidentialityLevel()));
+            dto.setUnitLevelName(settingMap.get(company.getUnitLevel()));
+            dto.setProductionLevelName(settingMap.get(company.getProductionLevel()));
+            dto.setIntegrationLevelName(settingMap.get(company.getIntegrationLevel()));
+            dto.setNumOfIpsName(company.getNumOfIps()
+                    .stream()
+                    .map(num -> num.getContent(settingMap.get(num.getIp())))
+                    .collect(Collectors.joining()));
+            dto.setStandardizationLevelName(company.getStandardizationLevel()
+                    .stream()
+                    .map(settingMap::get)
+                    .collect(Collectors.joining(",")));
+            dto.setQualificationLevelName(company.getQualificationLevel()
+                    .stream()
+                    .map(settingMap::get)
+                    .collect(Collectors.joining(",")));
+            dtos.add(dto);
+        });
+        return dtos;
+    }
+
+    /*
+     导入
+     */
+    @Transactional(rollbackOn = Exception.class)
+    public void upload(InputStream is) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        byte[] buffer = new byte[1024];
+        int len;
+        while ((len = is.read(buffer)) > -1) {
+            baos.write(buffer, 0, len);
+        }
+        baos.flush();
+
+        InputStream indicatorStream = new ByteArrayInputStream(baos.toByteArray());
+        List<CompanyDTO> dtos =
+                ExcelUtils.readExcel(indicatorStream, CompanyDTO.class, 1, 1);
+
+        List<Company> records = new ArrayList<>();
+        List<Setting> settings = settingRepo.findAll();
+        Map<Integer, List<Setting>> listMap = settings
+                .stream()
+                .collect(Collectors.groupingBy(Setting::getFlag));
+        Map<Integer, Map<String, Long>> mapMap = settings
+                .stream()
+                .collect(Collectors.groupingBy(Setting::getFlag, Collectors.toMap(Setting::getName, Setting::getId)));
+
+        dtos.forEach(dto -> {
+            Company company = new Company(dto);
+
+            StringArrayConverter sc = new StringArrayConverter();
+
+            company.setField(mapMap.get(1).get(dto.getFieldName()));
+
+            company.setSettingId(mapMap.get(11).get(dto.getSettingName()));
+
+            company.setNetwork(listMap.get(16)
+                    .stream()
+                    .filter(list -> sc.convertToEntityAttribute(dto.getNetworkName()).contains(list.getName()))
+                    .map(Setting::getId)
+                    .collect(Collectors.toList()));
+
+            company.setConfidentialityLevel(mapMap.get(17).get(dto.getConfidentialityLevelName()));
+
+            company.setUnitLevel(mapMap.get(18).get(dto.getUnitLevelName()));
+
+            company.setProductionLevel(mapMap.get(19).get(dto.getProductionLevelName()));
+
+            company.setIntegrationLevel(mapMap.get(20).get(dto.getIntegrationLevelName()));
+
+            List<String> nums = Arrays.asList(dto.getNumOfIpsName().split(";"));
+            Map<String, Long> ipMap = listMap.get(21)
+                    .stream()
+                    .collect(Collectors.toMap(Setting::getName, Setting::getId));
+            List<NumOfIp> numOfIps = new ArrayList<>();
+            nums.forEach(num -> {
+                String[] split = num.split(":");
+                Long id = ipMap.get(split[0]);
+                numOfIps.add(new NumOfIp(id, Integer.parseInt(split[1])));
+            });
+            company.setNumOfIps(numOfIps);
+
+            company.setStandardizationLevel(listMap.get(22)
+                    .stream()
+                    .filter(list -> sc.convertToEntityAttribute(dto.getStandardizationLevelName()).contains(list.getName()))
+                    .map(Setting::getId)
+                    .collect(Collectors.toList()));
+
+            company.setQualificationLevel(listMap.get(23)
+                    .stream()
+                    .filter(list -> sc.convertToEntityAttribute(dto.getQualificationLevelName()).contains(list.getName()))
+                    .map(Setting::getId)
+                    .collect(Collectors.toList()));
+
+            records.add(company);
+        });
+
+        companyRepo.saveAll(records);
+    }
 }

+ 56 - 3
src/main/java/com/izouma/zhirongip/service/resource/ExpertService.java

@@ -2,20 +2,29 @@ package com.izouma.zhirongip.service.resource;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.izouma.zhirongip.converter.StringArrayConverter;
 import com.izouma.zhirongip.domain.Setting;
 import com.izouma.zhirongip.domain.resource.Expert;
-import com.izouma.zhirongip.domain.supply.TechnicalManager;
+import com.izouma.zhirongip.dto.ExpertDTO;
 import com.izouma.zhirongip.dto.PageQuery;
 import com.izouma.zhirongip.exception.BusinessException;
 import com.izouma.zhirongip.repo.SettingRepo;
 import com.izouma.zhirongip.repo.resource.ExpertRepo;
 import com.izouma.zhirongip.utils.JpaUtils;
+import com.izouma.zhirongip.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
 import javax.persistence.criteria.Expression;
 import javax.persistence.criteria.Predicate;
+import javax.transaction.Transactional;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -43,10 +52,12 @@ public class ExpertService {
                     return criteriaBuilder.and(and.toArray(new Predicate[0]));
                 }), JpaUtils.toPageRequest(pageQuery))
                 .map(manager -> {
-                    manager.setFieldName(manager.getField()
+                    List<String> names = manager.getField()
                             .stream()
                             .map(settingMap::get)
-                            .collect(Collectors.toList()));
+                            .collect(Collectors.toList());
+                    manager.setFieldName(names);
+                    manager.setFieldNames(String.join(",", names));
                     manager.setAffiliationName(settingMap.get(manager.getAffiliation()));
                     return manager;
                 });
@@ -65,4 +76,46 @@ public class ExpertService {
         expert.setAffiliationName(settingMap.get(expert.getAffiliation()));
         return expert;
     }
+
+    /*
+    导入
+    */
+    @Transactional(rollbackOn = Exception.class)
+    public void upload(InputStream is) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        byte[] buffer = new byte[1024];
+        int len;
+        while ((len = is.read(buffer)) > -1) {
+            baos.write(buffer, 0, len);
+        }
+        baos.flush();
+
+        InputStream indicatorStream = new ByteArrayInputStream(baos.toByteArray());
+        List<ExpertDTO> dtos =
+                ExcelUtils.readExcel(indicatorStream, ExpertDTO.class, 1, 1);
+
+//        List<Expert> experts = dtos.stream().map(Expert::new).collect(Collectors.toList());
+        List<Expert> experts = new ArrayList<>();
+        List<Setting> settings = settingRepo.findAllByFlagIn(CollUtil.newArrayList(1, 15));
+        dtos.forEach(dto -> {
+            Expert expert = new Expert(dto);
+            if (StrUtil.isNotBlank(dto.getFieldNames())) {
+                StringArrayConverter sc = new StringArrayConverter();
+                List<String> names = sc.convertToEntityAttribute(dto.getFieldNames());
+                expert.setField(settings.stream()
+                        .filter(setting -> setting.getFlag() == 1 && names.contains(setting.getName()))
+                        .map(Setting::getId)
+                        .collect(Collectors.toList()));
+            }
+            settings.stream()
+                    .filter(setting -> setting.getFlag() == 15 && setting.getName()
+                            .equals(dto.getAffiliationName()))
+                    .findFirst()
+                    .ifPresent(setting -> expert.setAffiliation(setting.getId()));
+            experts.add(expert);
+        });
+        expertRepo.saveAll(experts);
+
+    }
 }

+ 32 - 0
src/main/java/com/izouma/zhirongip/utils/excel/BooleanConverter.java

@@ -0,0 +1,32 @@
+package com.izouma.zhirongip.utils.excel;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.CellData;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+
+public class BooleanConverter implements Converter<Boolean> {
+    @Override
+    public Class supportJavaTypeKey() {
+        return Boolean.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public Boolean convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return cellData.getStringValue().trim().equals("是");
+    }
+
+    @Override
+    public CellData convertToExcelData(Boolean value, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        return value ? new CellData("是") : new CellData("否");
+    }
+}

+ 28 - 0
src/main/java/com/izouma/zhirongip/utils/excel/ExcelListener.java

@@ -0,0 +1,28 @@
+package com.izouma.zhirongip.utils.excel;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.metadata.BaseRowModel;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+public class ExcelListener<T extends BaseRowModel> extends AnalysisEventListener<T> {
+    private final List<T> rows = new ArrayList<>();
+
+    @Override
+    public void invoke(T object, AnalysisContext context) {
+        rows.add(object);
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        log.info("read {} rows %n", rows.size());
+    }
+
+    public List<T> getRows() {
+        return rows;
+    }
+}

+ 43 - 0
src/main/java/com/izouma/zhirongip/utils/excel/ExcelUtils.java

@@ -1,9 +1,14 @@
 package com.izouma.zhirongip.utils.excel;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelReader;
+import com.alibaba.excel.metadata.BaseRowModel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import org.apache.poi.poifs.filesystem.FileMagic;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 
 public class ExcelUtils<T> {
@@ -20,4 +25,42 @@ public class ExcelUtils<T> {
                  .registerConverter(new LocalDateTimeConverter())
                  .doWrite(data);
     }
+
+    /**
+     * 从Excel中读取文件,读取的文件是一个DTO类,该类必须继承BaseRowModel
+     * 具体实例参考 : MemberMarketDto.java
+     * 参考:https://github.com/alibaba/easyexcel
+     * 字符流必须支持标记,FileInputStream 不支持标记,可以使用BufferedInputStream 代替
+     * BufferedInputStream bis = new BufferedInputStream(new FileInputStream(...));
+     */
+    public static <T extends BaseRowModel> List<T> readExcel(final InputStream inputStream, final Class<? extends BaseRowModel> clazz, int sheetNo, int headLineMun) {
+        if (null == inputStream) {
+            throw new NullPointerException("the inputStream is null!");
+        }
+        ExcelListener<T> listener = new ExcelListener<>();
+        // 这里因为EasyExcel-1.1.1版本的bug,所以需要选用下面这个标记已经过期的版本
+        ExcelReader reader = new ExcelReader(inputStream, valueOf(inputStream), null, listener);
+        reader.read(new com.alibaba.excel.metadata.Sheet(sheetNo, headLineMun, clazz));
+
+        return listener.getRows();
+    }
+
+    /**
+     * 根据输入流,判断为xls还是xlsx,该方法原本存在于easyexcel 1.1.0 的ExcelTypeEnum中。
+     */
+    public static ExcelTypeEnum valueOf(InputStream inputStream) {
+        try {
+            FileMagic fileMagic = FileMagic.valueOf(inputStream);
+            if (FileMagic.OLE2.equals(fileMagic)) {
+                return ExcelTypeEnum.XLS;
+            }
+            if (FileMagic.OOXML.equals(fileMagic)) {
+                return ExcelTypeEnum.XLSX;
+            }
+            throw new IllegalArgumentException("excelTypeEnum can not null");
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }

+ 11 - 0
src/main/java/com/izouma/zhirongip/web/InstitutionController.java

@@ -5,7 +5,10 @@ import com.izouma.zhirongip.domain.Institution;
 import com.izouma.zhirongip.domain.Personal;
 import com.izouma.zhirongip.dto.InstitutionDTO;
 import com.izouma.zhirongip.enums.ApplyStatus;
+import com.izouma.zhirongip.enums.AuthorityName;
 import com.izouma.zhirongip.repo.PersonalRepo;
+import com.izouma.zhirongip.repo.UserRepo;
+import com.izouma.zhirongip.security.Authority;
 import com.izouma.zhirongip.service.InstitutionService;
 import com.izouma.zhirongip.dto.PageQuery;
 import com.izouma.zhirongip.exception.BusinessException;
@@ -22,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
 
 @RestController
 @RequestMapping("/institution")
@@ -30,6 +34,7 @@ public class InstitutionController extends BaseController {
     private final InstitutionService institutionService;
     private final InstitutionRepo    institutionRepo;
     private final PersonalRepo       personalRepo;
+    private final UserRepo           userRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -69,6 +74,12 @@ public class InstitutionController extends BaseController {
 
     @PostMapping("/del/{id}")
     public void del(@PathVariable Long id) {
+        Institution institution = institutionRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        userRepo.findById(institution.getUserId()).ifPresent(user -> {
+            Set<Authority> authoritySet = user.getAuthorities();
+            authoritySet.remove(Authority.get(AuthorityName.ROLE_INSTITUTION));
+            userRepo.save(user);
+        });
         institutionRepo.softDelete(id);
     }
 

+ 11 - 0
src/main/java/com/izouma/zhirongip/web/PersonalController.java

@@ -6,9 +6,12 @@ import com.izouma.zhirongip.domain.Personal;
 import com.izouma.zhirongip.dto.PageQuery;
 import com.izouma.zhirongip.dto.PersonalDTO;
 import com.izouma.zhirongip.enums.ApplyStatus;
+import com.izouma.zhirongip.enums.AuthorityName;
 import com.izouma.zhirongip.exception.BusinessException;
 import com.izouma.zhirongip.repo.InstitutionRepo;
 import com.izouma.zhirongip.repo.PersonalRepo;
+import com.izouma.zhirongip.repo.UserRepo;
+import com.izouma.zhirongip.security.Authority;
 import com.izouma.zhirongip.service.PersonalService;
 import com.izouma.zhirongip.utils.ObjUtils;
 import com.izouma.zhirongip.utils.SecurityUtils;
@@ -22,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
 
 @RestController
 @RequestMapping("/personal")
@@ -30,6 +34,7 @@ public class PersonalController extends BaseController {
     private final PersonalService personalService;
     private final PersonalRepo    personalRepo;
     private final InstitutionRepo institutionRepo;
+    private final UserRepo        userRepo;
 
     //@PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -66,6 +71,12 @@ public class PersonalController extends BaseController {
 
     @PostMapping("/del/{id}")
     public void del(@PathVariable Long id) {
+        Personal personal = personalRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        userRepo.findById(personal.getUserId()).ifPresent(user -> {
+            Set<Authority> authoritySet = user.getAuthorities();
+            authoritySet.remove(Authority.get(AuthorityName.ROLE_PERSONAL));
+            userRepo.save(user);
+        });
         personalRepo.softDelete(id);
     }
 

+ 1 - 5
src/main/java/com/izouma/zhirongip/web/SettingController.java

@@ -1,10 +1,10 @@
 package com.izouma.zhirongip.web;
 
 import com.izouma.zhirongip.domain.Setting;
-import com.izouma.zhirongip.service.SettingService;
 import com.izouma.zhirongip.dto.PageQuery;
 import com.izouma.zhirongip.exception.BusinessException;
 import com.izouma.zhirongip.repo.SettingRepo;
+import com.izouma.zhirongip.service.SettingService;
 import com.izouma.zhirongip.utils.ObjUtils;
 import com.izouma.zhirongip.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
@@ -71,11 +71,7 @@ public class SettingController extends BaseController {
     @PostMapping("/byFlag")
     public List<Setting> byFlag(int flag) {
         List<Setting> tree = settingService.getTree(settingRepo.findAllByFlag(flag));
-//        if (CollUtil.isEmpty(tree)){
-//            return null;
-//        }
         return tree.get(0).getChildren();
     }
-
 }
 

+ 24 - 5
src/main/java/com/izouma/zhirongip/web/resource/CompanyController.java

@@ -1,5 +1,6 @@
 package com.izouma.zhirongip.web.resource;
 
+import com.izouma.zhirongip.dto.CompanyDTO;
 import com.izouma.zhirongip.web.BaseController;
 import com.izouma.zhirongip.domain.resource.Company;
 import com.izouma.zhirongip.service.resource.CompanyService;
@@ -10,22 +11,26 @@ import com.izouma.zhirongip.utils.ObjUtils;
 import com.izouma.zhirongip.utils.excel.ExcelUtils;
 
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 
+@Slf4j
 @RestController
 @RequestMapping("/company")
 @AllArgsConstructor
 public class CompanyController extends BaseController {
     private final CompanyService companyService;
-    private final CompanyRepo companyRepo;
+    private final CompanyRepo    companyRepo;
 
-    //@PreAuthorize("hasRole('ADMIN')")
+    @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
     public Company save(@RequestBody Company record) {
         if (record.getId() != null) {
@@ -45,7 +50,7 @@ public class CompanyController extends BaseController {
 
     @GetMapping("/get/{id}")
     public Company get(@PathVariable Long id) {
-        return companyRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        return companyService.get(id);
     }
 
     @PostMapping("/del/{id}")
@@ -56,8 +61,22 @@ public class CompanyController extends BaseController {
     @GetMapping("/excel")
     @ResponseBody
     public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
-        List<Company> data = all(pageQuery).getContent();
-        ExcelUtils.export(response, data);
+        List<Company> data = companyService.excelAll(pageQuery).getContent();
+        List<CompanyDTO> dtos = companyService.toDtoList(data);
+        ExcelUtils.export(response, dtos);
+    }
+
+        @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/upload")
+    public void uploadFile(@RequestParam("file") MultipartFile file) {
+        InputStream is;
+        try {
+            is = file.getInputStream();
+            companyService.upload(is);
+        } catch (IOException e) {
+            log.error("上传失败", e);
+            throw new BusinessException("上传失败", e.getMessage());
+        }
     }
 }
 

+ 20 - 4
src/main/java/com/izouma/zhirongip/web/resource/ExpertController.java

@@ -1,25 +1,28 @@
 package com.izouma.zhirongip.web.resource;
 
 import cn.hutool.core.convert.Convert;
-import com.izouma.zhirongip.web.BaseController;
 import com.izouma.zhirongip.domain.resource.Expert;
-import com.izouma.zhirongip.service.resource.ExpertService;
 import com.izouma.zhirongip.dto.PageQuery;
 import com.izouma.zhirongip.exception.BusinessException;
 import com.izouma.zhirongip.repo.resource.ExpertRepo;
+import com.izouma.zhirongip.service.resource.ExpertService;
 import com.izouma.zhirongip.utils.ObjUtils;
 import com.izouma.zhirongip.utils.excel.ExcelUtils;
-
+import com.izouma.zhirongip.web.BaseController;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 
+@Slf4j
 @RestController
 @RequestMapping("/expert")
 @AllArgsConstructor
@@ -52,7 +55,7 @@ public class ExpertController extends BaseController {
 
     @GetMapping("/get/{id}")
     public Expert get(@PathVariable Long id) {
-        return expertRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        return expertService.get(id);
     }
 
     @PostMapping("/del/{id}")
@@ -66,5 +69,18 @@ public class ExpertController extends BaseController {
         List<Expert> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+//    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/upload")
+    public void uploadFile(@RequestParam("file") MultipartFile file) {
+        InputStream is;
+        try {
+            is = file.getInputStream();
+            expertService.upload(is);
+        } catch (IOException e) {
+            log.error("上传失败", e);
+            throw new BusinessException("上传失败", e.getMessage());
+        }
+    }
 }
 

+ 3 - 3
src/main/resources/templates/ListViewTemplate.ftl

@@ -4,9 +4,9 @@
             <el-button @click="addRow" type="primary" icon="el-icon-plus" :disabled="fetchingData || downloading" class="filter-item">
                 新增
             </el-button>
-<#--            <el-button @click="download" icon="el-icon-upload2" :loading="downloading" :disabled="fetchingData" class="filter-item">-->
-<#--                导出-->
-<#--            </el-button>-->
+            <!-- <el-button @click="download" icon="el-icon-upload2" :loading="downloading" :disabled="fetchingData" class="filter-item">
+                导出
+            </el-button>-->
         </page-title>
         <div class="filters-container">
             <el-input

+ 58 - 5
src/main/vue/src/views/ExpertList.vue

@@ -10,6 +10,27 @@
             >
                 新增
             </el-button>
+            <el-button
+                @click="download"
+                icon="el-icon-download"
+                :loading="downloading"
+                :disabled="fetchingData || totalElements < 1"
+                class="filter-item"
+            >
+                导出
+            </el-button>
+            <el-upload
+                :action="uploadUrl"
+                :before-upload="beforeUpload"
+                :headers="headers"
+                :show-file-list="false"
+                ref="upload"
+                :on-success="onSuccess"
+                class="uploader"
+                :on-error="onfail"
+            >
+                <el-button icon="el-icon-upload2" slot="trigger" size="small" class="filter-item">导入</el-button>
+            </el-upload>
         </page-title>
         <div class="filters-container">
             <el-input
@@ -53,7 +74,7 @@
             v-loading="fetchingData"
         >
             <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="id" label="ID" width="60"> </el-table-column>
             <el-table-column prop="avatar" label="照片">
                 <template slot-scope="{ row }">
                     <el-image
@@ -71,8 +92,8 @@
             <el-table-column prop="academicQualification" label="学历"> </el-table-column>
             <el-table-column prop="jobTitle" label="职称"> </el-table-column>
             <el-table-column prop="position" 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="phone" label="电话" min-width="100"> </el-table-column>
+            <el-table-column prop="email" label="邮箱" min-width="100"> </el-table-column>
             <el-table-column prop="address" label="通讯地址"> </el-table-column>
             <el-table-column prop="affiliationName" label="研究方向"> </el-table-column>
             <el-table-column prop="fieldName" label="专业领域" show-overflow-tooltip min-width="150">
@@ -114,6 +135,7 @@
 import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
 import SettingSelect from '../components/select/SettingSelect.vue';
+import resolveUrl from 'resolve-url';
 
 export default {
     name: 'ExpertList',
@@ -130,10 +152,19 @@ export default {
             field: '',
             sex: '',
             academicQualification: '',
-            jobTitle: ''
+            jobTitle: '',
+            uploadUrl: ''
         };
     },
+    created() {
+        this.uploadUrl = resolveUrl(this.$baseUrl, 'expert/upload');
+    },
     computed: {
+        headers() {
+            return {
+                Authorization: 'Bearer ' + localStorage.getItem('token')
+            };
+        },
         selection() {
             return this.$refs.table.selection.map(i => i.id);
         }
@@ -237,8 +268,30 @@ export default {
                         this.$message.error(e.error);
                     }
                 });
+        },
+        upload() {},
+        onfail(e) {
+            console.log(e);
+            this.$message.error('失败');
+            this.getData();
+        },
+        onSuccess() {
+            this.$message.success('上传成功');
+            this.getData();
+        },
+        beforeUpload() {
+            return this.$confirm('确认要导入文件数据吗?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            });
         }
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.uploader {
+    display: inline-block;
+    margin: 0 10px;
+}
+</style>

+ 6 - 25
src/main/vue/src/views/resource/CompanyEdit.vue

@@ -35,7 +35,7 @@
                             </el-option>
                         </el-select>
                     </el-form-item>
-                    <el-form-item prop="field" label="所属领域">
+                    <el-form-item prop="field" label="行业领域">
                         <el-select
                             v-model="formData.field"
                             clearable
@@ -43,12 +43,7 @@
                             placeholder="请选择"
                             style="width: 100%"
                         >
-                            <el-option
-                                v-for="item in fieldOptions"
-                                :key="item.value"
-                                :label="item.label"
-                                :value="item.value"
-                            >
+                            <el-option v-for="item in fieldOptions" :key="item.id" :label="item.name" :value="item.id">
                             </el-option>
                         </el-select>
                     </el-form-item>
@@ -325,10 +320,11 @@ export default {
                 });
         }
         this.$http
-            .post('/setting/byFlag', { flag: 14 })
+            .post('/setting/allList')
             .then(res => {
                 if (res.length > 0) {
                     this.settingOptions = res;
+                    this.fieldOptions = this.findChildren('行业分类');
                     this.businessNature = this.findChildren('企业性质');
                     this.networks = this.findChildren('入网入库');
                     this.confidentialityLevels = this.findChildren('武器装备科研生产单位保密资格证');
@@ -345,22 +341,6 @@ export default {
                 console.log(e);
                 this.$message.error(e.error);
             });
-        this.$http
-            .post('/setting/byFlag', { flag: 1 })
-            .then(res => {
-                if (res.length > 0) {
-                    res.forEach(item => {
-                        this.fieldOptions.push({
-                            label: item.name,
-                            value: item.id
-                        });
-                    });
-                }
-            })
-            .catch(e => {
-                console.log(e);
-                this.$message.error(e.error);
-            });
     },
     data() {
         return {
@@ -405,7 +385,8 @@ export default {
             systemIntegration: [],
             standardizations: [],
             qualificationLevels: [],
-            companyTypes: []
+            companyTypes: [],
+            systemIntegrations: []
         };
     },
     computed: {

+ 49 - 7
src/main/vue/src/views/resource/CompanyList.vue

@@ -10,15 +10,27 @@
             >
                 新增
             </el-button>
-            <!-- <el-button
+            <el-button
                 @click="download"
-                icon="el-icon-upload2"
+                icon="el-icon-download"
                 :loading="downloading"
                 :disabled="fetchingData || totalElements < 1"
                 class="filter-item"
             >
                 导出
-            </el-button> -->
+            </el-button>
+            <el-upload
+                :action="uploadUrl"
+                :before-upload="beforeUpload"
+                :headers="headers"
+                :show-file-list="false"
+                ref="upload"
+                :on-success="onSuccess"
+                class="uploader"
+                :on-error="onfail"
+            >
+                <el-button icon="el-icon-upload2" slot="trigger" size="small" class="filter-item">导入</el-button>
+            </el-upload>
         </page-title>
         <div class="filters-container">
             <el-input
@@ -107,6 +119,8 @@ import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
 import SettingSelect from '../../components/select/SettingSelect.vue';
 import areaList from '../../area';
+import resolveUrl from 'resolve-url';
+
 export default {
     name: 'CompanyList',
     mixins: [pageableTable],
@@ -127,19 +141,25 @@ export default {
     },
     created() {
         this.$http
-            .post('/setting/byFlag', { flag: 14 })
+            .post('/setting/byFlag', { flag: 11 })
             .then(res => {
                 if (res.length > 0) {
-                    this.settingOptions = res;
-                    this.businessNature = this.findChildren('企业性质');
+                    this.businessNature = res;
+                    // this.businessNature = this.findChildren('企业性质');
                 }
             })
             .catch(e => {
                 console.log(e);
                 this.$message.error(e.error);
             });
+        this.uploadUrl = resolveUrl(this.$baseUrl, 'company/upload');
     },
     computed: {
+        headers() {
+            return {
+                Authorization: 'Bearer ' + localStorage.getItem('token')
+            };
+        },
         selection() {
             return this.$refs.table.selection.map(i => i.id);
         }
@@ -237,8 +257,30 @@ export default {
                 if (item.name == name) return item;
             });
             return data.children;
+        },
+        upload() {},
+        onfail(e) {
+            console.log(e);
+            this.$message.error('失败');
+            this.getData();
+        },
+        onSuccess() {
+            this.$message.success('上传成功');
+            this.getData();
+        },
+        beforeUpload() {
+            return this.$confirm('确认要导入文件数据吗?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            });
         }
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.uploader {
+    display: inline-block;
+    margin: 0 10px;
+}
+</style>

+ 0 - 1
src/main/zhi-rong-web/src/components/Banner.vue

@@ -6,7 +6,6 @@
             class="img"
             :style="{ backgroundImage: `url(${item.img})` }"
         >
-            <!-- <img :src="item.img" class="img" object-fit="cover" alt="" /> -->
         </swiper-slide>
         <div class="swiper-pagination" slot="pagination"></div>
     </swiper>

+ 6 - 5
src/main/zhi-rong-web/src/components/home/Resources.vue

@@ -148,22 +148,22 @@ export default {
                 {
                     icon: 'iconfont-imt_fuwu_icon_04',
                     name: '企业',
-                    url: '/digital/all',
+                    url: '/company/all',
                     defaultQuery: {
                         type: 'COMPANY'
                     },
-                    path: '/digital?type=COMPANY',
-                    detailPath: '/digitalDetail'
+                    path: '/digitals',
+                    detailPath: '/digitalDetails'
                 },
                 {
                     icon: 'iconfont-imt_fuwu_icon_041',
                     name: '专家',
-                    url: '/technicalManager/all',
+                    url: '/expert/all',
                     defaultQuery: {
                         isExpert: true
                     },
                     path: '/expert',
-                    detailPath: '/technicalManagerDetail'
+                    detailPath: '/expert/all'
                 }
             ],
             resourceOptions: {
@@ -231,6 +231,7 @@ export default {
                     )
                     .then(res => {
                         this.list = res.content;
+                        // console.log(this.list);
                         this.loading = false;
                         this.empty = res.empty;
                     });

+ 6 - 3
src/main/zhi-rong-web/src/components/list/DigitalRow.vue

@@ -1,7 +1,7 @@
 <template>
     <router-link
         :to="{
-            name: 'digitalDetail',
+            name: `${type == 'COMPANY' ? 'digitalDetails' : 'digitalDetail'}`,
             query: {
                 id: info.id
             }
@@ -40,11 +40,14 @@ export default {
         }
     },
     computed: {
+        type() {
+            return this.$route.query.type;
+        },
         ownerName() {
-            if (this.info.type === 'COMPANY') {
+            if (this.type === 'COMPANY') {
                 return '所属地区';
             } else {
-                return (this.info.type === 'PRODUCT' ? '产品' : '技术') + '所属人';
+                return (this.type === 'PRODUCT' ? '产品' : '技术') + '所属人';
             }
         }
     },

+ 1 - 1
src/main/zhi-rong-web/src/components/list/ExpertGride.vue

@@ -9,7 +9,7 @@
         class="manage"
         :class="{ 'manage-mini': size === 'mini' }"
     >
-        <el-image :src="getImg(info.qualification)" fit="fill"></el-image>
+        <el-image :src="getImg(info.avatar)" fit="fill"></el-image>
         <div class="content">
             <div class="name">{{ info.name }}</div>
             <!-- <div class="tags">

+ 1 - 1
src/main/zhi-rong-web/src/components/page/BreadPage.vue

@@ -3,7 +3,7 @@
         <div class="center-content">
             <el-breadcrumb separator="/">
                 <el-breadcrumb-item :to="{ name: 'home' }">首页</el-breadcrumb-item>
-                <el-breadcrumb-item v-if="preTitle&&!fromHome" :to="{ path: preTitle.path, query: preTitle.query }">{{
+                <el-breadcrumb-item v-if="preTitle && !fromHome" :to="{ path: preTitle.path, query: preTitle.query }">{{
                     preTitle.name
                 }}</el-breadcrumb-item>
                 <el-breadcrumb-item>{{ routerName }}</el-breadcrumb-item>

+ 12 - 0
src/main/zhi-rong-web/src/router/index.js

@@ -550,6 +550,18 @@ const routes = [
                     needAuth: true
                 }
             },
+            {
+                path: '/digitalDetails',
+                name: 'digitalDetails',
+                component: () => import('../views/detail/Digitals.vue'),
+                meta: {
+                    title: '企业详情',
+                    needHistory: true,
+                    pageDeep: 'third',
+                    checkLogin: true,
+                    needAuth: true
+                }
+            },
             {
                 path: '/fundingDetail',
                 name: 'fundingDetail',

+ 87 - 0
src/main/zhi-rong-web/src/views/detail/Digitals.vue

@@ -0,0 +1,87 @@
+<template>
+    <bread-page>
+        <div class="main" v-loading="loading">
+            <div class="title">{{ info.name }}</div>
+            <div class="sub-title">
+                <span>企业性质:{{ info.settingName }}</span>
+
+                <span>行业领域:{{ info.fieldName }}</span>
+                <span>所属地区:{{ info.owner }}</span>
+            </div>
+            <div class="content" v-html="info.manual"></div>
+        </div>
+    </bread-page>
+</template>
+
+<script>
+import BreadPage from '../../components/page/BreadPage.vue';
+import { digitalTypeOptions } from '../../utils/variables';
+export default {
+    components: { BreadPage },
+    data() {
+        return {
+            loading: false,
+            info: {},
+            digitalTypeOptions
+        };
+    },
+    computed: {},
+    mounted() {
+        this.loading = true;
+        this.$http.get('company/get/' + this.$route.query.id).then(res => {
+            this.info = res;
+            setTimeout(() => {
+                this.loading = false;
+            }, 500);
+            this.$EventBus.$emit('changePreTitle', {
+                name: '企业',
+                path: '/digital',
+                query: {
+                    type: 'COMPANY'
+                }
+            });
+            this.$EventBus.$emit('changeTitle', '企业详情');
+            document.title = '企业详情';
+        });
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+    background-color: #fff;
+    padding: 0 150px 60px;
+    box-sizing: border-box;
+    .min-height(606px);
+}
+
+.title {
+    font-size: 24px;
+    font-weight: bold;
+    color: #000000;
+    line-height: 34px;
+    text-align: center;
+    padding: 30px 0;
+    border-bottom: 1px solid @bg;
+}
+.sub-title {
+    .flex();
+    justify-content: center;
+    font-size: 14px;
+    color: #939599;
+    line-height: 24px;
+    span + span {
+        margin-left: 40px;
+    }
+    padding: 20px 0 40px;
+}
+
+.content {
+    line-height: 28px;
+    p {
+        font-size: 14px;
+        color: #000000;
+        line-height: 28px;
+    }
+}
+</style>

+ 11 - 13
src/main/zhi-rong-web/src/views/detail/ExpertDetail.vue

@@ -4,9 +4,9 @@
             <div class="top">
                 <div class="img">
                     <el-carousel height="360px">
-                        <el-carousel-item v-for="(item, index) in imgs" :key="index">
+                        <el-carousel-item>
                             <el-image
-                                :src="item"
+                                :src="getImg(info.avatar)"
                                 fit="cover"
                                 style="width: 100%; height: 100%; border-radius: 100%"
                             ></el-image>
@@ -18,9 +18,7 @@
                     <div class="title">{{ info.name }}</div>
                     <div class="info-item">
                         <span class="text1">研究方向:</span>
-                        <span class="text2" v-if="info.affiliation">{{
-                            getLabelName(info.affiliation, affiliationOptions)
-                        }}</span>
+                        <span class="text2" v-if="info.affiliationName">{{ info.affiliationName }}</span>
                     </div>
                     <!-- <div class="info-item" v-for="(item, index) in info.fieldName" :key="index">
                         <span class="text1">专业领域:</span>
@@ -116,13 +114,13 @@ export default {
         };
     },
     computed: {
-        imgs() {
-            if (this.info.qualification && this.info.qualification.length > 0) {
-                return this.info.qualification;
-            } else {
-                return [this.getImg()];
-            }
-        }
+        // imgs() {
+        // if (this.info.qualification && this.info.qualification.length > 0) {
+        //     return this.info.qualification;
+        // } else {
+        //     return [this.getImg()];
+        // }
+        // }
     },
     watch: {
         $route() {
@@ -135,7 +133,7 @@ export default {
     methods: {
         getInfo() {
             this.loading = true;
-            this.$http.get('/technicalManager/get/' + this.$route.query.id).then(res => {
+            this.$http.get('/expert/get/' + this.$route.query.id).then(res => {
                 this.info = res;
                 setTimeout(() => {
                     this.loading = false;

+ 5 - 1
src/main/zhi-rong-web/src/views/legal/Digital.vue

@@ -4,7 +4,7 @@
         @init="init"
         :defaultQuery="defaultQuery"
         ref="list"
-        url="/digital/all"
+        :url="`${type == 'COMPANY' ? '/company/all' : '/digital/all'}`"
         :filters="filters"
     >
         <template v-for="item in list">
@@ -31,12 +31,16 @@ export default {
             defaultQuery: {}
         };
     },
+
     metaInfo() {
         return {
             title: this.typeName
         };
     },
     computed: {
+        type() {
+            return this.$route.query.type;
+        },
         fieldOptionsIndex() {
             return [...this.fieldOptions].filter((item, index) => {
                 return index < 20;

+ 1 - 8
src/main/zhi-rong-web/src/views/legal/Expert.vue

@@ -1,12 +1,5 @@
 <template>
-    <sort-list
-        v-model="list"
-        :defaultQuery="defaultQuery"
-        @init="init"
-        ref="list"
-        url="/technicalManager/all"
-        :filters="filters"
-    >
+    <sort-list v-model="list" :defaultQuery="defaultQuery" @init="init" ref="list" url="/expert/all" :filters="filters">
         <template v-for="item in list">
             <manage-gride :key="item.id" :info="item"></manage-gride>
         </template>