licailing 5 лет назад
Родитель
Сommit
c7c1782825
36 измененных файлов с 2006 добавлено и 30 удалено
  1. 2 0
      src/main/java/com/izouma/wenlvju/domain/District.java
  2. 34 0
      src/main/java/com/izouma/wenlvju/domain/Performance.java
  3. 41 0
      src/main/java/com/izouma/wenlvju/domain/PerformanceApply.java
  4. 21 0
      src/main/java/com/izouma/wenlvju/domain/Person.java
  5. 38 3
      src/main/java/com/izouma/wenlvju/domain/Record.java
  6. 7 0
      src/main/java/com/izouma/wenlvju/enums/ApplyStatus.java
  7. 12 0
      src/main/java/com/izouma/wenlvju/enums/PerformanceStatus.java
  8. 8 0
      src/main/java/com/izouma/wenlvju/enums/WorkCategory.java
  9. 3 0
      src/main/java/com/izouma/wenlvju/repo/DistrictRepo.java
  10. 20 0
      src/main/java/com/izouma/wenlvju/repo/PerformanceApplyRepo.java
  11. 16 0
      src/main/java/com/izouma/wenlvju/repo/PerformanceRepo.java
  12. 16 0
      src/main/java/com/izouma/wenlvju/repo/PersonRepo.java
  13. 2 0
      src/main/java/com/izouma/wenlvju/repo/RecordRepo.java
  14. 59 0
      src/main/java/com/izouma/wenlvju/service/PerformanceApplyService.java
  15. 20 0
      src/main/java/com/izouma/wenlvju/service/PerformanceService.java
  16. 20 0
      src/main/java/com/izouma/wenlvju/service/PersonService.java
  17. 7 0
      src/main/java/com/izouma/wenlvju/web/DistrictController.java
  18. 75 0
      src/main/java/com/izouma/wenlvju/web/PerformanceApplyController.java
  19. 60 0
      src/main/java/com/izouma/wenlvju/web/PerformanceController.java
  20. 60 0
      src/main/java/com/izouma/wenlvju/web/PersonController.java
  21. 7 0
      src/main/java/com/izouma/wenlvju/web/RecordController.java
  22. 1 0
      src/main/resources/genjson/Performance.json
  23. 1 0
      src/main/resources/genjson/PerformanceApply.json
  24. 1 0
      src/main/resources/genjson/Person.json
  25. 0 1
      src/main/resources/genjson/Record.json
  26. 1 0
      src/main/vue/src/components/DistrictChoose.vue
  27. 59 0
      src/main/vue/src/router.js
  28. 128 0
      src/main/vue/src/views/PerformanceApplyEdit.vue
  29. 271 0
      src/main/vue/src/views/PerformanceApplyList.vue
  30. 309 0
      src/main/vue/src/views/PerformanceApplyList2.vue
  31. 124 0
      src/main/vue/src/views/PerformanceEdit.vue
  32. 194 0
      src/main/vue/src/views/PerformanceList.vue
  33. 95 0
      src/main/vue/src/views/PersonEdit.vue
  34. 157 0
      src/main/vue/src/views/PersonList.vue
  35. 72 12
      src/main/vue/src/views/RecordEdit.vue
  36. 65 14
      src/main/vue/src/views/RecordList.vue

+ 2 - 0
src/main/java/com/izouma/wenlvju/domain/District.java

@@ -7,6 +7,7 @@ import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.hibernate.annotations.Where;
 
 import javax.persistence.*;
 
@@ -16,6 +17,7 @@ import javax.persistence.*;
 @NoArgsConstructor
 @Builder
 @ApiModel("行政区域")
+@Where(clause = "del = 0")
 public class District extends AuditedEntity {
     @Id
     private Long id;

+ 34 - 0
src/main/java/com/izouma/wenlvju/domain/Performance.java

@@ -0,0 +1,34 @@
+package com.izouma.wenlvju.domain;
+
+import com.izouma.wenlvju.enums.PerformanceStatus;
+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.LocalDate;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel(value = "展演管理")
+public class Performance extends BaseEntity {
+    @ApiModelProperty(value = "名称")
+    private String            name;
+    @ApiModelProperty(value = "时间")
+    private LocalDate         startTime;
+    @ApiModelProperty(value = "时间")
+    private LocalDate         endTime;
+    @ApiModelProperty(value = "地点")
+    private String            address;
+    @ApiModelProperty(value = "状态")
+    @Enumerated(EnumType.STRING)
+    private PerformanceStatus status;
+}

+ 41 - 0
src/main/java/com/izouma/wenlvju/domain/PerformanceApply.java

@@ -0,0 +1,41 @@
+package com.izouma.wenlvju.domain;
+
+import com.izouma.wenlvju.enums.ApplyStatus;
+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
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@Entity
+@ApiModel(value = "展演报名")
+public class PerformanceApply extends BaseEntity {
+    private Long          performanceId;
+    @ApiModelProperty(value = "作品名称")
+    private String        composition;
+    @ApiModelProperty(value = "专业")
+    private String        professional;
+    @ApiModelProperty(value = "指导老师")
+    private String        teacher;
+    @ApiModelProperty(value = "选送机构")
+    private String        agency;
+    @ApiModelProperty(value = "联系人")
+    private String        contact;
+    @ApiModelProperty(value = "联系电话")
+    private String        phone;
+    @Enumerated(EnumType.STRING)
+    @ApiModelProperty(value = "状态")
+    private ApplyStatus   status;
+    @ApiModelProperty(value = "表演时间")
+    public  LocalDateTime showTime;
+}

+ 21 - 0
src/main/java/com/izouma/wenlvju/domain/Person.java

@@ -0,0 +1,21 @@
+package com.izouma.wenlvju.domain;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Entity;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "参演人员")
+@Entity
+public class Person extends BaseEntity {
+    private Long performanceApplyId;
+
+    private String name;
+
+    private String phone;
+}

+ 38 - 3
src/main/java/com/izouma/wenlvju/domain/Record.java

@@ -1,6 +1,8 @@
 package com.izouma.wenlvju.domain;
 
+import com.izouma.wenlvju.annotations.Searchable;
 import com.izouma.wenlvju.enums.RecordStatus;
+import com.izouma.wenlvju.enums.WorkCategory;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -12,7 +14,6 @@ import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import java.time.LocalDate;
-import java.time.LocalDateTime;
 
 @Data
 @Builder
@@ -22,6 +23,7 @@ import java.time.LocalDateTime;
 @ApiModel("备案管理")
 public class Record extends BaseEntity {
     @ApiModelProperty(value = "考级活动名称")
+    @Searchable
     private String examinationName;
 
     @ApiModelProperty(value = "考级活动时间")
@@ -33,16 +35,49 @@ public class Record extends BaseEntity {
     @ApiModelProperty(value = "考级机构名称")
     private String examinationAgency;
 
+    @ApiModelProperty(value = "单位类别")
+    private WorkCategory category;
+
     @ApiModelProperty(value = "承办单位名称")
-    private String operatedBy;
+    private String organizer;
+
+    @ApiModelProperty(value = "统一社会信用代码")
+    private String creditCode;
 
     @ApiModelProperty(value = "考级地点")
+//    @Convert(converter = LongArrayConverter.class)
+    private Long examinationDistrict;
+
+    @ApiModelProperty(value = "考级详细地址")
     private String examinationAddress;
 
+    @ApiModelProperty(value = "考场数量")
+    private int examCenterQuantity;
+
+    @ApiModelProperty(value = "报考人数")
+    private int examQuantity;
+
+    @ApiModelProperty(value = "考官人数")
+    private int examinerQuantity;
+
+    @ApiModelProperty(value = "考点负责人名称")
+    private String examOwner;
+
+    @ApiModelProperty(value = "考点负责人手机号")
+    private String examOwnerPhone;
+
+    @ApiModelProperty(value = "安全负责人名称")
+    private String securityOwner;
+
+    @ApiModelProperty(value = "安全负责人手机号")
+    private String securityOwnerPhone;
+
     @ApiModelProperty(value = "备案时间")
-    private LocalDateTime recordTime;
+    private LocalDate recordTime;
 
     @Enumerated(EnumType.STRING)
     @ApiModelProperty(value = "状态")
     private RecordStatus status;
+
+    private String district;
 }

+ 7 - 0
src/main/java/com/izouma/wenlvju/enums/ApplyStatus.java

@@ -0,0 +1,7 @@
+package com.izouma.wenlvju.enums;
+
+public enum ApplyStatus {
+    PENDING,
+    PASS,
+    DENY
+}

+ 12 - 0
src/main/java/com/izouma/wenlvju/enums/PerformanceStatus.java

@@ -0,0 +1,12 @@
+package com.izouma.wenlvju.enums;
+
+public enum PerformanceStatus {
+    /*
+    报名中
+     */
+    APPLY,
+    /*
+    已结束
+     */
+    END
+}

+ 8 - 0
src/main/java/com/izouma/wenlvju/enums/WorkCategory.java

@@ -0,0 +1,8 @@
+package com.izouma.wenlvju.enums;
+
+public enum WorkCategory {
+    /*
+    承办单位
+     */
+    ORGANIZER
+}

+ 3 - 0
src/main/java/com/izouma/wenlvju/repo/DistrictRepo.java

@@ -4,5 +4,8 @@ import com.izouma.wenlvju.domain.District;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
+import java.util.List;
+
 public interface DistrictRepo extends JpaRepository<District, Long>, JpaSpecificationExecutor<District> {
+    List<District> findAllByParent(Long parent);
 }

+ 20 - 0
src/main/java/com/izouma/wenlvju/repo/PerformanceApplyRepo.java

@@ -0,0 +1,20 @@
+package com.izouma.wenlvju.repo;
+
+import com.izouma.wenlvju.domain.PerformanceApply;
+import com.izouma.wenlvju.enums.ApplyStatus;
+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 PerformanceApplyRepo extends JpaRepository<PerformanceApply, Long>, JpaSpecificationExecutor<PerformanceApply> {
+    @Query("update PerformanceApply t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    List<PerformanceApply> findAllByStatusAndPerformanceId(ApplyStatus status, Long performanceId);
+}

+ 16 - 0
src/main/java/com/izouma/wenlvju/repo/PerformanceRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.wenlvju.repo;
+
+import com.izouma.wenlvju.domain.Performance;
+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 PerformanceRepo extends JpaRepository<Performance, Long>, JpaSpecificationExecutor<Performance> {
+    @Query("update Performance t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 16 - 0
src/main/java/com/izouma/wenlvju/repo/PersonRepo.java

@@ -0,0 +1,16 @@
+package com.izouma.wenlvju.repo;
+
+import com.izouma.wenlvju.domain.Person;
+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 PersonRepo extends JpaRepository<Person, Long>, JpaSpecificationExecutor<Person> {
+    @Query("update Person t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+}

+ 2 - 0
src/main/java/com/izouma/wenlvju/repo/RecordRepo.java

@@ -13,4 +13,6 @@ public interface RecordRepo extends JpaRepository<Record, Long>, JpaSpecificatio
     @Modifying
     @Transactional
     void softDelete(Long id);
+
+    Record findFirstByDelIsTrue();
 }

+ 59 - 0
src/main/java/com/izouma/wenlvju/service/PerformanceApplyService.java

@@ -0,0 +1,59 @@
+package com.izouma.wenlvju.service;
+
+import com.izouma.wenlvju.domain.PerformanceApply;
+import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.enums.ApplyStatus;
+import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.PerformanceApplyRepo;
+import com.izouma.wenlvju.utils.JpaUtils;
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+public class PerformanceApplyService {
+
+    private PerformanceApplyRepo performanceApplyRepo;
+
+    public Page<PerformanceApply> all(PageQuery pageQuery) {
+        return performanceApplyRepo.findAll(JpaUtils.toSpecification(pageQuery, PerformanceApply.class), JpaUtils.toPageRequest(pageQuery));
+    }
+
+    public void audit(Long id, Boolean pass) {
+        PerformanceApply apply = performanceApplyRepo.findById(id).orElseThrow(new BusinessException("无此展演申请"));
+        if (pass) {
+            apply.setStatus(ApplyStatus.PASS);
+        } else {
+            apply.setStatus(ApplyStatus.DENY);
+        }
+        performanceApplyRepo.save(apply);
+    }
+
+    /*
+    自动编排
+     */
+    public void autoArrangement(Long performanceId) {
+        List<PerformanceApply> applyList =
+                performanceApplyRepo.findAllByStatusAndPerformanceId(ApplyStatus.PASS, performanceId);
+
+        List<PerformanceApply> showTime = applyList.stream()
+                .filter(apply -> apply.showTime != null)
+                .sorted((a, b) -> b.showTime.compareTo(a.getShowTime()))
+                .collect(Collectors.toList());
+        final LocalDateTime[] time = {showTime.get(0).getShowTime().plusMinutes(10)};
+        List<PerformanceApply> showTimeNull = applyList.stream()
+                .filter(apply -> apply.showTime == null)
+                .collect(Collectors.toList());
+        showTimeNull.forEach(apply -> {
+            apply.setShowTime(time[0]);
+            performanceApplyRepo.save(apply);
+            time[0] = time[0].plusMinutes(10);
+        });
+    }
+}

+ 20 - 0
src/main/java/com/izouma/wenlvju/service/PerformanceService.java

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

+ 20 - 0
src/main/java/com/izouma/wenlvju/service/PersonService.java

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

+ 7 - 0
src/main/java/com/izouma/wenlvju/web/DistrictController.java

@@ -2,6 +2,7 @@ package com.izouma.wenlvju.web;
 
 import com.izouma.wenlvju.domain.District;
 import com.izouma.wenlvju.enums.DistrictLevel;
+import com.izouma.wenlvju.repo.DistrictRepo;
 import com.izouma.wenlvju.service.DistrictService;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
@@ -12,6 +13,7 @@ import java.util.List;
 @RequestMapping("/district")
 @AllArgsConstructor
 public class DistrictController extends BaseController {
+    private final DistrictRepo districtRepo;
     private final DistrictService districtService;
 
     @GetMapping({"/", ""})
@@ -20,5 +22,10 @@ public class DistrictController extends BaseController {
                               @RequestParam(required = false) Long parent) {
         return districtService.get(level, maxLevel, parent);
     }
+
+    @GetMapping("/NJ")
+    public List<District> NJ(){
+        return districtRepo.findAllByParent(320100L);
+    }
 }
 

+ 75 - 0
src/main/java/com/izouma/wenlvju/web/PerformanceApplyController.java

@@ -0,0 +1,75 @@
+package com.izouma.wenlvju.web;
+
+import com.izouma.wenlvju.domain.PerformanceApply;
+import com.izouma.wenlvju.service.PerformanceApplyService;
+import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.PerformanceApplyRepo;
+import com.izouma.wenlvju.utils.ObjUtils;
+import com.izouma.wenlvju.utils.excel.ExcelUtils;
+import io.swagger.annotations.ApiOperation;
+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("/performanceApply")
+@AllArgsConstructor
+public class PerformanceApplyController extends BaseController {
+    private PerformanceApplyService performanceApplyService;
+    private PerformanceApplyRepo    performanceApplyRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public PerformanceApply save(@RequestBody PerformanceApply record) {
+        if (record.getId() != null) {
+            PerformanceApply orig = performanceApplyRepo.findById(record.getId())
+                    .orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return performanceApplyRepo.save(orig);
+        }
+        return performanceApplyRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<PerformanceApply> all(@RequestBody PageQuery pageQuery) {
+        return performanceApplyService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public PerformanceApply get(@PathVariable Long id) {
+        return performanceApplyRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        performanceApplyRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<PerformanceApply> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+
+    @PostMapping("/audit")
+    @ApiOperation("提现审核")
+    public void audit(Long id, Boolean pass) {
+        performanceApplyService.audit(id, pass);
+    }
+
+    @PostMapping("/autoArrangement")
+    @ApiOperation("自动编排")
+    public void autoArrangement(@RequestParam Long performanceId) {
+        performanceApplyService.autoArrangement(performanceId);
+    }
+}
+

+ 60 - 0
src/main/java/com/izouma/wenlvju/web/PerformanceController.java

@@ -0,0 +1,60 @@
+package com.izouma.wenlvju.web;
+import com.izouma.wenlvju.domain.Performance;
+import com.izouma.wenlvju.service.PerformanceService;
+import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.PerformanceRepo;
+import com.izouma.wenlvju.utils.ObjUtils;
+import com.izouma.wenlvju.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("/performance")
+@AllArgsConstructor
+public class PerformanceController extends BaseController {
+    private PerformanceService performanceService;
+    private PerformanceRepo performanceRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Performance save(@RequestBody Performance record) {
+        if (record.getId() != null) {
+            Performance orig = performanceRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return performanceRepo.save(orig);
+        }
+        return performanceRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<Performance> all(@RequestBody PageQuery pageQuery) {
+        return performanceService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public Performance get(@PathVariable Long id) {
+        return performanceRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        performanceRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Performance> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 60 - 0
src/main/java/com/izouma/wenlvju/web/PersonController.java

@@ -0,0 +1,60 @@
+package com.izouma.wenlvju.web;
+import com.izouma.wenlvju.domain.Person;
+import com.izouma.wenlvju.service.PersonService;
+import com.izouma.wenlvju.dto.PageQuery;
+import com.izouma.wenlvju.exception.BusinessException;
+import com.izouma.wenlvju.repo.PersonRepo;
+import com.izouma.wenlvju.utils.ObjUtils;
+import com.izouma.wenlvju.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("/person")
+@AllArgsConstructor
+public class PersonController extends BaseController {
+    private PersonService personService;
+    private PersonRepo personRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public Person save(@RequestBody Person record) {
+        if (record.getId() != null) {
+            Person orig = personRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return personRepo.save(orig);
+        }
+        return personRepo.save(record);
+    }
+
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<Person> all(@RequestBody PageQuery pageQuery) {
+        return personService.all(pageQuery);
+    }
+
+    @GetMapping("/get/{id}")
+    public Person get(@PathVariable Long id) {
+        return personRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        personRepo.softDelete(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Person> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 7 - 0
src/main/java/com/izouma/wenlvju/web/RecordController.java

@@ -56,5 +56,12 @@ public class RecordController extends BaseController {
         List<Record> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+    @GetMapping("/update")
+    public Record update() {
+        Record record = recordRepo.findFirstByDelIsTrue();
+        record.setDel(false);
+        return recordRepo.save(record);
+    }
 }
 

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

@@ -0,0 +1 @@
+{"tableName":"Performance","className":"Performance","remark":"展演管理","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/java/com/izouma/wenlvju","viewPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"name","modelName":"name","remark":"名称","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"startTime","modelName":"startTime","remark":"时间","showInList":true,"showInForm":true,"formType":"date"},{"name":"endTime","modelName":"endTime","remark":"时间","showInList":true,"showInForm":true,"formType":"date"},{"name":"address","modelName":"address","remark":"地点","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"status","modelName":"status","remark":"状态","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"报名中\",\"value\":\"APPLY\"},{\"label\":\"已结束\",\"value\":\"END\"}]"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.wenlvju","tablePackage":"com.izouma.wenlvju.domain.Performance"}

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

@@ -0,0 +1 @@
+{"tableName":"PerformanceApply","className":"PerformanceApply","remark":"展演报名","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/java/com/izouma/wenlvju","viewPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"composition","modelName":"composition","remark":"作品名称","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"professional","modelName":"professional","remark":"专业","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"teacher","modelName":"teacher","remark":"指导老师","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"agency","modelName":"agency","remark":"选送机构","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"contact","modelName":"contact","remark":"联系人","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"phone","modelName":"phone","remark":"联系电话","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"status","modelName":"status","remark":"状态","showInList":true,"showInForm":true,"formType":"select","apiFlag":"1","optionsValue":"[{\"label\":\"审核中\",\"value\":\"PENDING\"},{\"label\":\"通过\",\"value\":\"PASS\"},{\"label\":\"拒绝\",\"value\":\"DENY\"}]"},{"name":"showTime","modelName":"showTime","remark":"表演时间","showInList":true,"showInForm":true,"formType":"datetime"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.wenlvju","tablePackage":"com.izouma.wenlvju.domain.PerformanceApply"}

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

@@ -0,0 +1 @@
+{"tableName":"Person","className":"Person","remark":"参演人员","genTable":true,"genClass":true,"genList":true,"genForm":true,"genRouter":true,"javaPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/java/com/izouma/wenlvju","viewPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/vue/src/views","routerPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/vue/src","resourcesPath":"/Users/qiufangchao/Desktop/project/wenlvju/src/main/resources","dataBaseType":"Mysql","fields":[{"name":"name","modelName":"name","remark":"姓名","showInList":true,"showInForm":true,"formType":"singleLineText"},{"name":"phone","modelName":"phone","remark":"电话","showInList":true,"showInForm":true,"formType":"singleLineText"}],"readTable":false,"dataSourceCode":"dataSource","genJson":"","subtables":[],"update":false,"basePackage":"com.izouma.wenlvju","tablePackage":"com.izouma.wenlvju.domain.Person"}

Разница между файлами не показана из-за своего большого размера
+ 0 - 1
src/main/resources/genjson/Record.json


+ 1 - 0
src/main/vue/src/components/DistrictChoose.vue

@@ -40,6 +40,7 @@ export default {
                         params.maxLevel = this.maxLevel.toUpperCase();
                     }
                     this.$http.get('/district', params).then(res => {
+                        console.log(res.length);
                         if (res.length === 0) {
                             this.$set(node, 'isLeaf', true);
                             node.hasChildren = false;

+ 59 - 0
src/main/vue/src/router.js

@@ -118,6 +118,65 @@ const router = new Router({
                     meta: {
                         title: '备案管理'
                     }
+                },
+                {
+                    path: '/performanceEdit',
+                    name: 'PerformanceEdit',
+                    component: () => import(/* webpackChunkName: "performanceEdit" */ '@/views/PerformanceEdit.vue'),
+                    meta: {
+                        title: '展演管理编辑'
+                    }
+                },
+                {
+                    path: '/performanceList',
+                    name: 'PerformanceList',
+                    component: () => import(/* webpackChunkName: "performanceList" */ '@/views/PerformanceList.vue'),
+                    meta: {
+                        title: '展演管理'
+                    }
+                },
+                {
+                    path: '/performanceApplyEdit',
+                    name: 'PerformanceApplyEdit',
+                    component: () =>
+                        import(/* webpackChunkName: "performanceApplyEdit" */ '@/views/PerformanceApplyEdit.vue'),
+                    meta: {
+                        title: '展演报名编辑'
+                    }
+                },
+                {
+                    path: '/performanceApplyList',
+                    name: 'PerformanceApplyList',
+                    component: () =>
+                        import(/* webpackChunkName: "performanceApplyList" */ '@/views/PerformanceApplyList.vue'),
+                    meta: {
+                        title: '展演报名'
+                    }
+                },
+                {
+                    path: '/performanceApplyList2',
+                    name: 'PerformanceApplyList2',
+                    component: () =>
+                        import(/* webpackChunkName: "performanceApplyList" */ '@/views/PerformanceApplyList2.vue'),
+                    meta: {
+                        title: '展演报名'
+                    }
+                },
+                {
+                    path: '/personEdit',
+                    name: 'PersonEdit',
+                    component: () => import(/* webpackChunkName: "personEdit" */ '@/views/PersonEdit.vue'),
+                    meta: {
+                        title: '参演人员编辑'
+                    }
+                },
+                {
+                    path: '/personList',
+                    name: 'PersonList',
+                    component: () => import(/* webpackChunkName: "personList" */ '@/views/PersonList.vue'),
+                    meta: {
+                        title: '参演人员'
+                    }
                 }
                 /**INSERT_LOCATION**/
             ]

+ 128 - 0
src/main/vue/src/views/PerformanceApplyEdit.vue

@@ -0,0 +1,128 @@
+<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="composition" label="作品名称">
+                <el-input v-model="formData.composition"></el-input>
+            </el-form-item>
+            <el-form-item prop="professional" label="专业">
+                <el-input v-model="formData.professional"></el-input>
+            </el-form-item>
+            <el-form-item prop="teacher" label="指导老师">
+                <el-input v-model="formData.teacher"></el-input>
+            </el-form-item>
+            <el-form-item prop="agency" label="选送机构">
+                <el-input v-model="formData.agency"></el-input>
+            </el-form-item>
+            <el-form-item prop="contact" label="联系人">
+                <el-input v-model="formData.contact"></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="status" label="状态">
+                <el-select v-model="formData.status" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
+                    </el-option>
+                </el-select>
+            </el-form-item> -->
+            <el-form-item prop="showTime" label="表演时间">
+                <el-date-picker
+                    v-model="formData.showTime"
+                    type="datetime"
+                    value-format="yyyy-MM-dd HH:mm:ss"
+                    placeholder="选择日期时间"
+                >
+                </el-date-picker>
+            </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: 'PerformanceApplyEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('performanceApply/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: {},
+            statusOptions: [
+                { label: '审核中', value: 'PENDING' },
+                { label: '通过', value: 'PASS' },
+                { label: '拒绝', value: 'DENY' }
+            ]
+        };
+    },
+    methods: {
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.submit();
+                } else {
+                    return false;
+                }
+            });
+        },
+        submit() {
+            let data = { ...this.formData };
+            data.performanceId = Number(this.$route.query.perforId);
+            data.status = 'PENDING';
+            this.saving = true;
+            this.$http
+                .post('/performanceApply/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(`/performanceApply/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>

+ 271 - 0
src/main/vue/src/views/PerformanceApplyList.vue

@@ -0,0 +1,271 @@
+<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="composition" label="作品名称"> </el-table-column>
+            <el-table-column prop="professional" label="专业"> </el-table-column>
+            <el-table-column prop="teacher" label="指导老师"> </el-table-column>
+            <el-table-column prop="agency" label="选送机构"> </el-table-column>
+            <el-table-column prop="contact" label="联系人"> </el-table-column>
+            <el-table-column prop="phone" label="联系电话"> </el-table-column>
+            <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
+            <el-table-column prop="showTime" 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> -->
+                    <el-button @click="showDialog(row)" type="primary" size="mini" plain>参演人员维护</el-button>
+                    <el-button @click="editRow(row)" type="primary" 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>
+
+        <el-dialog title="参演人员" :visible.sync="dialogVisible" width="500px" center>
+            <div>
+                <div v-for="item in person" :key="item.id" style="padding: 10px 10px 10px 100px">
+                    <span class="span-size">{{ item.name }}</span> <span class="span-size">{{ item.phone }}</span>
+                </div>
+                <div style="margin: 10px 170px 0">
+                    <el-button class="dia-mar" type="primary" @click="add = true" v-if="!add" size="mini"
+                        >添加人员</el-button
+                    >
+                </div>
+                <div v-if="add">
+                    <el-form :model="form" ref="form" size="small">
+                        <el-input
+                            class="dia-mar"
+                            v-model="form.name"
+                            placeholder="请输入姓名"
+                            style="width: 130px"
+                        ></el-input>
+                        <el-input
+                            class="dia-mar"
+                            v-model="form.phone"
+                            placeholder="请输入手机号"
+                            style="width: 160px"
+                        ></el-input>
+                        <el-button class="dia-mar" size="mini" @click="onSave">确定</el-button>
+                        <el-button class="dia-mar" size="mini" @click="add = false">取消</el-button>
+                    </el-form>
+                </div>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'PerformanceApplyList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/performanceApply/all',
+            downloading: false,
+            statusOptions: [
+                { label: '审核中', value: 'PENDING' },
+                { label: '通过', value: 'PASS' },
+                { label: '拒绝', value: 'DENY' }
+            ],
+            dialogVisible: false,
+            person: [],
+            form: {
+                performanceApplyId: '',
+                name: '',
+                value: ''
+            },
+            add: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        statusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.statusOptions.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: '/performanceApplyEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/performanceApplyEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/performanceApply/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(`/performanceApply/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        showDialog(row) {
+            this.dialogVisible = true;
+            this.form.performanceApplyId = row.id;
+            this.getPerson(row.id);
+        },
+        getPerson(id) {
+            this.$http
+                .post('/person/all', { size: 100, query: { del: false, performanceApplyId: id } }, { body: 'json' })
+                .then(res => {
+                    this.person = res.content;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        },
+        onSave() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    let data = { ...this.form };
+                    this.saving = true;
+                    this.$http
+                        .post('/person/save', data, { body: 'json' })
+                        .then(res => {
+                            this.saving = false;
+                            this.$message.success('成功');
+                            this.form = {
+                                name: '',
+                                phone: ''
+                            };
+                            this.add = false;
+                            this.getPerson(this.form.performanceApplyId);
+                            // this.$router.go(-1);
+                        })
+                        .catch(e => {
+                            console.log(e);
+                            this.saving = false;
+                            this.$message.error(e.error);
+                        });
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.dia-mar {
+    margin: 8px 6px;
+}
+.span-size {
+    margin: 20px;
+    font-size: 15px;
+}
+.right {
+    margin-right: 60px;
+}
+</style>

+ 309 - 0
src/main/vue/src/views/PerformanceApplyList2.vue

@@ -0,0 +1,309 @@
+<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="autoArrangement" type="primary" class="filter-item" :loading="loading"
+                >自动编排
+            </el-button>
+            <el-button @click="distribute('已成功通知')" type="primary" class="filter-item">一键通知 </el-button>
+            <el-button @click="distribute('已评奖')" type="primary" class="filter-item">自动评奖 </el-button>
+            <el-button @click="distribute('已生成证书')" type="primary" 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="composition" label="作品名称"> </el-table-column>
+            <el-table-column prop="professional" label="专业"> </el-table-column>
+            <el-table-column prop="teacher" label="指导老师"> </el-table-column>
+            <el-table-column prop="agency" label="选送机构"> </el-table-column>
+            <el-table-column prop="contact" label="联系人"> </el-table-column>
+            <el-table-column prop="phone" label="联系电话"> </el-table-column>
+            <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
+            <el-table-column prop="showTime" label="表演时间"> </el-table-column>
+            <el-table-column label="操作" align="right" fixed="right" min-width="200">
+                <template slot-scope="{ row }">
+                    <el-button
+                        v-if="row.status === 'PENDING'"
+                        :loading="row.loading"
+                        @click="audit(row, true)"
+                        type="success"
+                        size="mini"
+                        plain
+                    >
+                        通过
+                    </el-button>
+                    <el-button
+                        v-if="row.status === 'PENDING'"
+                        :loading="row.loading"
+                        @click="audit(row, false)"
+                        type="warning"
+                        size="mini"
+                        plain
+                    >
+                        拒绝
+                    </el-button>
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                    <!-- <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button> -->
+                    <!-- <el-button @click="showDialog(row)" type="primary" size="mini" plain>参演人员维护</el-button>
+                    <el-button @click="editRow(row)" type="primary" 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>
+
+        <el-dialog title="参演人员" :visible.sync="dialogVisible" width="500px" center>
+            <div>
+                <div v-for="item in person" :key="item.id" style="padding: 10px 10px 10px 100px">
+                    <span class="span-size">{{ item.name }}</span> <span class="span-size">{{ item.phone }}</span>
+                </div>
+                <div style="margin: 10px 170px 0">
+                    <el-button class="dia-mar" type="primary" @click="add = true" v-if="!add" size="mini"
+                        >添加人员</el-button
+                    >
+                </div>
+                <div v-if="add">
+                    <el-form :model="form" ref="form" size="small">
+                        <el-input
+                            class="dia-mar"
+                            v-model="form.name"
+                            placeholder="请输入姓名"
+                            style="width: 130px"
+                        ></el-input>
+                        <el-input
+                            class="dia-mar"
+                            v-model="form.phone"
+                            placeholder="请输入手机号"
+                            style="width: 160px"
+                        ></el-input>
+                        <el-button class="dia-mar" size="mini" @click="onSave">确定</el-button>
+                        <el-button class="dia-mar" size="mini" @click="add = false">取消</el-button>
+                    </el-form>
+                </div>
+            </div>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+    name: 'PerformanceApplyList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/performanceApply/all',
+            downloading: false,
+            statusOptions: [
+                { label: '审核中', value: 'PENDING' },
+                { label: '通过', value: 'PASS' },
+                { label: '拒绝', value: 'DENY' }
+            ],
+            dialogVisible: false,
+            person: [],
+            form: {
+                performanceApplyId: '',
+                name: '',
+                value: ''
+            },
+            add: false,
+            loading: false
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        statusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.statusOptions.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: '/performanceApplyEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/performanceApplyEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/performanceApply/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(`/performanceApply/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        showDialog(row) {
+            this.dialogVisible = true;
+            this.form.performanceApplyId = row.id;
+            this.getPerson(row.id);
+        },
+        getPerson(id) {
+            this.$http
+                .post('/person/all', { size: 100, query: { del: false, performanceApplyId: id } }, { body: 'json' })
+                .then(res => {
+                    this.person = res.content;
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
+        },
+        audit(row, pass) {
+            this.$set(row, 'loading', true);
+            this.$http
+                .post('/performanceApply/audit', {
+                    id: row.id,
+                    pass: pass
+                })
+                .then(res => {
+                    this.$set(row, 'loading', false);
+                    this.$message.success('OK');
+                    this.getData();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$set(row, 'loading', false);
+                    this.$message.error(e.error);
+                });
+        },
+        distribute(content) {
+            this.$alert(content, '通知', {
+                confirmButtonText: '确定'
+            });
+        },
+        autoArrangement() {
+            this.loading = true;
+            this.$http
+                .post('/performanceApply/autoArrangement', {
+                    performanceId: Number(this.$route.query.perforId)
+                })
+                .then(res => {
+                    this.loading = false;
+                    this.$message.success('OK');
+                    this.getData();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.loading = false;
+                    this.$message.error(e.error);
+                });
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.dia-mar {
+    margin: 8px 6px;
+}
+.span-size {
+    margin: 20px;
+    font-size: 15px;
+}
+.right {
+    margin-right: 60px;
+}
+</style>

+ 124 - 0
src/main/vue/src/views/PerformanceEdit.vue

@@ -0,0 +1,124 @@
+<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="name" label="名称">
+                <el-input v-model="formData.name"></el-input>
+            </el-form-item>
+            <el-form-item prop="startTime" label="时间">
+                <el-date-picker
+                    v-model="formData.startTime"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期"
+                    style="width: 190px; margin-right: 20px"
+                >
+                </el-date-picker>
+                至
+                <el-date-picker
+                    v-model="formData.endTime"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期"
+                    style="width: 190px; margin-left: 20px"
+                >
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="address" label="地点">
+                <el-input v-model="formData.address"></el-input>
+            </el-form-item>
+            <el-form-item prop="status" label="状态">
+                <el-select v-model="formData.status" clearable filterable placeholder="请选择">
+                    <el-option v-for="item in statusOptions" :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: 'PerformanceEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('performance/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: {},
+            statusOptions: [
+                { label: '报名中', value: 'APPLY' },
+                { label: '已结束', value: 'END' }
+            ]
+        };
+    },
+    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('/performance/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(`/performance/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>

+ 194 - 0
src/main/vue/src/views/PerformanceList.vue

@@ -0,0 +1,194 @@
+<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="name" label="名称"> </el-table-column>
+            <el-table-column prop="startTime" label="时间"> </el-table-column>
+            <el-table-column prop="endTime" label="时间"> </el-table-column>
+            <el-table-column prop="address" label="地点"> </el-table-column>
+            <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+                <template slot-scope="{ row }">
+                    <el-button @click="handleCommand(row)" type="primary" size="mini" plain
+                        ><span v-if="row.status === 'APPLY'">报名入口</span> <span v-else>查看节目</span></el-button
+                    >
+                    <el-button @click="handleCommand1(row)" type="primary" size="mini" plain
+                        ><span v-if="row.status === 'APPLY'">报名入口</span> <span v-else>查看节目</span></el-button
+                    >
+                    <!-- <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: 'PerformanceList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/performance/all',
+            downloading: false,
+            statusOptions: [
+                { label: '报名中', value: 'APPLY' },
+                { label: '已结束', value: 'END' }
+            ]
+        };
+    },
+    computed: {
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        statusFormatter(row, column, cellValue, index) {
+            let selectedOption = this.statusOptions.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: '/performanceEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/performanceEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/performance/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(`/performance/del/${row.id}`);
+                })
+                .then(() => {
+                    this.$message.success('删除成功');
+                    this.getData();
+                })
+                .catch(e => {
+                    if (e !== 'cancel') {
+                        this.$message.error(e.error);
+                    }
+                });
+        },
+        handleCommand(row) {
+            this.$router.push({
+                path: '/performanceApplyList',
+                query: {
+                    perforId: row.id,
+                    perforStatus: row.status
+                }
+            });
+        },
+        handleCommand1(row) {
+            this.$router.push({
+                path: '/performanceApplyList2',
+                query: {
+                    perforId: row.id
+                }
+            });
+        }
+    }
+};
+</script>
+<style lang="less" scoped></style>

+ 95 - 0
src/main/vue/src/views/PersonEdit.vue

@@ -0,0 +1,95 @@
+<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="name" label="姓名">
+                <el-input v-model="formData.name"></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>
+                <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: 'PersonEdit',
+    created() {
+        if (this.$route.query.id) {
+            this.$http
+                .get('person/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('/person/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(`/person/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>

+ 157 - 0
src/main/vue/src/views/PersonList.vue

@@ -0,0 +1,157 @@
+<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="name" label="姓名"> </el-table-column>
+            <el-table-column prop="phone" 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: 'PersonList',
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/person/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: '/personEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/personEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/person/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(`/person/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>

+ 72 - 12
src/main/vue/src/views/RecordEdit.vue

@@ -4,10 +4,10 @@
             :model="formData"
             :rules="rules"
             ref="form"
-            label-width="108px"
+            label-width="136px"
             label-position="right"
             size="small"
-            style="max-width: 500px;"
+            style="max-width: 600px;"
         >
             <el-form-item prop="examinationName" label="考级活动名称">
                 <el-input v-model="formData.examinationName"></el-input>
@@ -18,33 +18,79 @@
                     type="date"
                     value-format="yyyy-MM-dd"
                     placeholder="选择日期"
+                    style="width: 200px; margin-right: 20px"
                 >
                 </el-date-picker>
-            </el-form-item>
-            <el-form-item prop="examinationEndTime" label="考级活动时间">
+                至
                 <el-date-picker
                     v-model="formData.examinationEndTime"
                     type="date"
                     value-format="yyyy-MM-dd"
                     placeholder="选择日期"
+                    style="width: 200px; margin-left: 20px"
                 >
                 </el-date-picker>
             </el-form-item>
             <el-form-item prop="examinationAgency" label="考级机构名称">
                 <el-input v-model="formData.examinationAgency"></el-input>
             </el-form-item>
-            <el-form-item prop="operatedBy" label="承办单位名称">
-                <el-input v-model="formData.operatedBy"></el-input>
+            <el-form-item prop="category" label="单位类别">
+                <el-select v-model="formData.category" clearable filterable placeholder="请选择">
+                    <el-option
+                        v-for="item in categoryOptions"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                    >
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="organizer" label="承办单位名称">
+                <el-input v-model="formData.organizer"></el-input>
+            </el-form-item>
+            <el-form-item prop="creditCode" label="统一社会信用代码">
+                <el-input v-model="formData.creditCode"></el-input>
+            </el-form-item>
+            <el-form-item prop="examinationDistrict" label="考级地点">
+                <el-select v-model="formData.district">
+                    <el-option
+                        v-for="item in district"
+                        :key="item.id"
+                        :value="item.name"
+                        :label="item.name"
+                    ></el-option>
+                </el-select>
             </el-form-item>
             <el-form-item prop="examinationAddress" label="考级地点">
                 <el-input v-model="formData.examinationAddress"></el-input>
             </el-form-item>
+            <el-form-item prop="examCenterQuantity" label="考场数量">
+                <el-input-number v-model="formData.examCenterQuantity" class="date-width"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="examQuantity" label="报考人数">
+                <el-input-number v-model="formData.examQuantity" class="date-width"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="examinerQuantity" label="考官人数">
+                <el-input-number v-model="formData.examinerQuantity" class="date-width"></el-input-number>
+            </el-form-item>
+            <el-form-item prop="examOwner" label="考点负责人名称">
+                <el-input v-model="formData.examOwner"></el-input>
+            </el-form-item>
+            <el-form-item prop="examOwnerPhone" label="考点负责人手机号">
+                <el-input v-model="formData.examOwnerPhone"></el-input>
+            </el-form-item>
+            <el-form-item prop="securityOwner" label="安全负责人名称">
+                <el-input v-model="formData.securityOwner"></el-input>
+            </el-form-item>
+            <el-form-item prop="securityOwnerPhone" label="安全负责人手机号">
+                <el-input v-model="formData.securityOwnerPhone"></el-input>
+            </el-form-item>
             <el-form-item prop="recordTime" label="备案时间">
                 <el-date-picker
                     v-model="formData.recordTime"
-                    type="datetime"
-                    value-format="yyyy-MM-dd HH:mm:ss"
-                    placeholder="选择日期时间"
+                    type="date"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择日期"
                 >
                 </el-date-picker>
             </el-form-item>
@@ -77,13 +123,24 @@ export default {
                     this.$message.error(e.error);
                 });
         }
+        this.$http
+            .get('/district/NJ')
+            .then(res => {
+                this.district = res;
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
     },
     data() {
         return {
             saving: false,
             formData: {},
             rules: {},
-            statusOptions: [{ label: '正常', value: 'NORMAL' }]
+            categoryOptions: [{ label: '承办单位', value: 'ORGANIZER' }],
+            statusOptions: [{ label: '正常', value: 'NORMAL' }],
+            district: []
         };
     },
     methods: {
@@ -98,7 +155,6 @@ export default {
         },
         submit() {
             let data = { ...this.formData };
-
             this.saving = true;
             this.$http
                 .post('/record/save', data, { body: 'json' })
@@ -132,4 +188,8 @@ export default {
     }
 };
 </script>
-<style lang="less" scoped></style>
+<style lang="less" scoped>
+.date-width {
+    width: 200px;
+}
+</style>

+ 65 - 14
src/main/vue/src/views/RecordList.vue

@@ -2,16 +2,21 @@
     <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-select class="filter-item" v-model="districtId" clearable>
+                <el-option v-for="item in district" :key="item.id" :value="item.name" :label="item.name"></el-option>
+            </el-select>
+            <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
+            <el-button @click="update" type="primary" class="filter-item">一键更新 </el-button>
+            <el-button @click="distribute" type="primary" class="filter-item">一键分发 </el-button>
+            <!-- <el-button
                 @click="download"
                 type="primary"
                 icon="el-icon-download"
                 :loading="downloading"
                 class="filter-item"
                 >导出EXCEL
-            </el-button>
+            </el-button> -->
         </div>
         <el-table
             :data="tableData"
@@ -24,19 +29,22 @@
             :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="id" label="ID" width="100"> </el-table-column> -->
             <el-table-column prop="examinationName" label="考级活动名称"> </el-table-column>
-            <el-table-column prop="examinationStartTime" label="考级活动时间"> </el-table-column>
-            <el-table-column prop="examinationEndTime" label="考级活动时间"> </el-table-column>
+            <el-table-column prop="examinationStartTime" label="考级活动时间">
+                <template slot-scope="{ row }">
+                    <span>{{ row.examinationStartTime }} 至 {{ row.examinationEndTime }}</span>
+                </template>
+            </el-table-column>
             <el-table-column prop="examinationAgency" label="考级机构名称"> </el-table-column>
-            <el-table-column prop="operatedBy" label="承办单位名称"> </el-table-column>
-            <el-table-column prop="examinationAddress" label="考级地点"> </el-table-column>
+            <el-table-column prop="organizer" label="承办单位名称"> </el-table-column>
+            <el-table-column prop="district" label="考级地点"> </el-table-column>
             <el-table-column prop="recordTime" label="备案时间"> </el-table-column>
-            <el-table-column prop="status" label="状态" :formatter="statusFormatter"> </el-table-column>
-            <el-table-column label="操作" align="center" fixed="right" min-width="150">
+            <el-table-column prop="status" label="状态" :formatter="statusFormatter" width="50"> </el-table-column>
+            <el-table-column label="操作" align="center" fixed="right" min-width="80">
                 <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>
+                    <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>
@@ -70,13 +78,27 @@ import pageableTable from '@/mixins/pageableTable';
 export default {
     name: 'RecordList',
     mixins: [pageableTable],
+    created() {
+        this.$http
+            .get('/district/NJ')
+            .then(res => {
+                this.district = res;
+            })
+            .catch(e => {
+                console.log(e);
+                this.$message.error(e.error);
+            });
+    },
     data() {
         return {
             multipleMode: false,
             search: '',
             url: '/record/all',
             downloading: false,
-            statusOptions: [{ label: '正常', value: 'NORMAL' }]
+            categoryOptions: [{ label: '承办单位', value: 'ORGANIZER' }],
+            statusOptions: [{ label: '正常', value: 'NORMAL' }],
+            district: [],
+            districtId: ''
         };
     },
     computed: {
@@ -85,6 +107,13 @@ export default {
         }
     },
     methods: {
+        categoryFormatter(row, column, cellValue, index) {
+            let selectedOption = this.categoryOptions.find(i => i.value === cellValue);
+            if (selectedOption) {
+                return selectedOption.label;
+            }
+            return '';
+        },
         statusFormatter(row, column, cellValue, index) {
             let selectedOption = this.statusOptions.find(i => i.value === cellValue);
             if (selectedOption) {
@@ -93,7 +122,13 @@ export default {
             return '';
         },
         beforeGetData() {
-            return { search: this.search };
+            return {
+                search: this.search,
+                query: {
+                    district: this.districtId,
+                    del: false
+                }
+            };
         },
         toggleMultipleMode(multipleMode) {
             this.multipleMode = multipleMode;
@@ -164,6 +199,22 @@ export default {
                         this.$message.error(e.error);
                     }
                 });
+        },
+        distribute() {
+            this.$alert('已分发到各区县!', '分发', {
+                confirmButtonText: '确定'
+            });
+        },
+        update() {
+            this.$http
+                .get('/record/update')
+                .then(res => {
+                    this.getData();
+                })
+                .catch(e => {
+                    console.log(e);
+                    this.$message.error(e.error);
+                });
         }
     }
 };

Некоторые файлы не были показаны из-за большого количества измененных файлов