Преглед изворни кода

Merge branch 'dev' of licailing/wenlvju into master

licailing пре 4 година
родитељ
комит
242f7bd359
40 измењених фајлова са 1124 додато и 112 уклоњено
  1. 17 0
      src/main/java/com/izouma/wenlvju/domain/GradingOrganization.java
  2. 3 1
      src/main/java/com/izouma/wenlvju/domain/Organization.java
  3. 3 1
      src/main/java/com/izouma/wenlvju/dto/OrganizationRegDTO.java
  4. 5 1
      src/main/java/com/izouma/wenlvju/web/RateController.java
  5. 117 74
      src/main/vue/package-lock.json
  6. 2 0
      src/main/vue/package.json
  7. BIN
      src/main/vue/src/assets/pc_shuju_bg.jpg
  8. 0 0
      src/main/vue/src/map/320000_full.json
  9. 0 0
      src/main/vue/src/map/320100_full.json
  10. 0 0
      src/main/vue/src/map/320200_full.json
  11. 0 0
      src/main/vue/src/map/320300_full.json
  12. 0 0
      src/main/vue/src/map/320400_full.json
  13. 0 0
      src/main/vue/src/map/320500_full.json
  14. 0 0
      src/main/vue/src/map/320600_full.json
  15. 0 0
      src/main/vue/src/map/320700_full.json
  16. 0 0
      src/main/vue/src/map/320800_full.json
  17. 0 0
      src/main/vue/src/map/320900_full.json
  18. 0 0
      src/main/vue/src/map/321000_full.json
  19. 0 0
      src/main/vue/src/map/321100_full.json
  20. 0 0
      src/main/vue/src/map/321200_full.json
  21. 0 0
      src/main/vue/src/map/321300_full.json
  22. 30 0
      src/main/vue/src/map/index.js
  23. 2 2
      src/main/vue/src/plugins/http.js
  24. 9 1
      src/main/vue/src/router.js
  25. 1 1
      src/main/vue/src/styles/app.less
  26. 495 0
      src/main/vue/src/views/Echarts.vue
  27. 36 6
      src/main/vue/src/views/GradingOrganizationEdit.vue
  28. 7 3
      src/main/vue/src/views/GradingOrganizationList.vue
  29. 7 3
      src/main/vue/src/views/Login.vue
  30. 11 2
      src/main/vue/src/views/RegulatoryList.vue
  31. 7 5
      src/main/vue/src/views/Video.vue
  32. 1 1
      src/main/vue/src/views/organization/Organization.vue
  33. 1 1
      src/main/vue/src/views/organization/Organization1.vue
  34. 5 4
      src/main/vue/src/views/organization/OrganizationInfo.vue
  35. 78 1
      src/main/vue/src/views/rate/RateList.vue
  36. 5 3
      src/main/vue/src/views/record/RecordList.vue
  37. 243 0
      src/main/vue/src/views/user/ExpertList3.vue
  38. 1 1
      src/main/vue/src/views/user/UserList.vue
  39. 33 0
      src/main/vue/yarn.lock
  40. 5 1
      src/test/java/com/izouma/wenlvju/web/RateControllerTest.java

+ 17 - 0
src/main/java/com/izouma/wenlvju/domain/GradingOrganization.java

@@ -1,6 +1,7 @@
 package com.izouma.wenlvju.domain;
 
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -21,4 +22,20 @@ public class GradingOrganization extends BaseEntity {
 
     private String name;
 
+    private String introduction;
+
+    private String province;
+
+    private String city;
+
+    private String district;
+
+    private String street;
+
+    private String address;
+
+    @ApiModelProperty(value = "联系人")
+    private String contact;
+
+    private String contactPhone;
 }

+ 3 - 1
src/main/java/com/izouma/wenlvju/domain/Organization.java

@@ -1,5 +1,6 @@
 package com.izouma.wenlvju.domain;
 
+import com.izouma.wenlvju.converter.LongArrayConverter;
 import com.izouma.wenlvju.converter.StringArrayConverter;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -26,8 +27,9 @@ public class Organization extends BaseEntity {
     @ApiModelProperty(value = "承办单位名称")
     private String name;
 
+    @Convert(converter = LongArrayConverter.class)
     @ApiModelProperty(value = "考级机构名称")
-    private Long gradingOrganizationId;
+    private List<Long> gradingOrganizationId;
 
     @ApiModelProperty(value = "统一社会信用代码")
     private String uscc;

+ 3 - 1
src/main/java/com/izouma/wenlvju/dto/OrganizationRegDTO.java

@@ -6,6 +6,8 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.List;
+
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
@@ -33,7 +35,7 @@ public class OrganizationRegDTO {
 
     private String districtCode;
 
-    private Long gradingOrganizationId;
+    private List<Long> gradingOrganizationId;
 
     private Long gradingCode;
 //    private List<String> district1;

+ 5 - 1
src/main/java/com/izouma/wenlvju/web/RateController.java

@@ -70,7 +70,11 @@ public class RateController extends BaseController {
 
         return rateService.all(pageQuery).map(rate -> {
             Organization organization = organizationMap.get(rate.getOrganizationId());
-            return new RateDTO(rate, organization, gradeMap.get(organization.getGradingOrganizationId()));
+            String names = organization.getGradingOrganizationId()
+                    .stream()
+                    .map(gradeMap::get)
+                    .collect(Collectors.joining(","));
+            return new RateDTO(rate, organization, names);
         });
     }
 

+ 117 - 74
src/main/vue/package-lock.json

@@ -2004,6 +2004,16 @@
           "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
         "cacache": {
           "version": "13.0.1",
           "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
@@ -2030,6 +2040,27 @@
             "unique-filename": "^1.1.1"
           }
         },
+        "chalk": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
         "debug": {
           "version": "4.3.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
@@ -2039,6 +2070,25 @@
             "ms": "2.1.2"
           }
         },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "ms": {
           "version": "2.1.2",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -2061,6 +2111,16 @@
             "minipass": "^3.1.1"
           }
         },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
         "terser-webpack-plugin": {
           "version": "2.3.8",
           "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz",
@@ -2077,6 +2137,18 @@
             "terser": "^4.6.12",
             "webpack-sources": "^1.4.3"
           }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.2.0",
+          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.2.0.tgz",
+          "integrity": "sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          }
         }
       }
     },
@@ -3525,6 +3597,11 @@
         }
       }
     },
+    "claygl": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/claygl/-/claygl-1.3.0.tgz",
+      "integrity": "sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ=="
+    },
     "clean-css": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
@@ -4979,6 +5056,31 @@
         "safer-buffer": "^2.1.0"
       }
     },
+    "echarts": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.1.1.tgz",
+      "integrity": "sha512-b3nP8M9XwZM2jISuA+fP0EuJv8lcfgWrinel185Npy8bE/UhXTDIPJcqgQOCWdvk0c5CeT6Dsm1xBjmJXAGlxQ==",
+      "requires": {
+        "tslib": "2.0.3",
+        "zrender": "5.1.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
+      }
+    },
+    "echarts-gl": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/echarts-gl/-/echarts-gl-2.0.4.tgz",
+      "integrity": "sha512-QTMFOFE7N1wxjRIiwjq4m1gFa5KBZT9V0MKkT8gJyTj/kzyCCReRW8n6hjG7+QtfZ5DtPao98vPIFDFWEMlRGA==",
+      "requires": {
+        "claygl": "^1.2.1",
+        "zrender": "^5.0.3"
+      }
+    },
     "ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -12002,80 +12104,6 @@
         }
       }
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.2.0",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.2.0.tgz",
-      "integrity": "sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-          "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-router": {
       "version": "3.5.1",
       "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.1.tgz",
@@ -13040,6 +13068,21 @@
           "dev": true
         }
       }
+    },
+    "zrender": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.1.0.tgz",
+      "integrity": "sha512-c+8VRx52ycbmqwHeHLlo/BAfIHBl/JZNLM6cfDQFgzIH05yb+f5J9F/fbRsP+zGc8dW9XHuhdt8/iqukgMZSeg==",
+      "requires": {
+        "tslib": "2.0.3"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
+          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+        }
+      }
     }
   }
 }

+ 2 - 0
src/main/vue/package.json

@@ -18,6 +18,8 @@
     "clipboard": "^2.0.6",
     "core-js": "^3.6.5",
     "date-fns": "^2.14.0",
+    "echarts": "^5.1.1",
+    "echarts-gl": "^2.0.4",
     "element-ui": "^2.13.2",
     "normalize.css": "^8.0.1",
     "qs": "^6.10.1",

BIN
src/main/vue/src/assets/pc_shuju_bg.jpg


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320000_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320100_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320200_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320300_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320400_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320500_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320600_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320700_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320800_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/320900_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/321000_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/321100_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/321200_full.json


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
src/main/vue/src/map/321300_full.json


+ 30 - 0
src/main/vue/src/map/index.js

@@ -0,0 +1,30 @@
+import jiangsu_320000 from './320000_full.json';
+import jiangsu_320100 from './320100_full.json';
+import jiangsu_320200 from './320200_full.json';
+import jiangsu_320300 from './320300_full.json';
+import jiangsu_320400 from './320400_full.json';
+import jiangsu_320500 from './320500_full.json';
+import jiangsu_320600 from './320600_full.json';
+import jiangsu_320700 from './320700_full.json';
+import jiangsu_320800 from './320800_full.json';
+import jiangsu_320900 from './320900_full.json';
+import jiangsu_321000 from './321000_full.json';
+import jiangsu_321100 from './321100_full.json';
+import jiangsu_321200 from './321200_full.json';
+import jiangsu_321300 from './321300_full.json';
+import * as echarts from 'echarts';
+
+echarts.registerMap('320000', jiangsu_320000);
+echarts.registerMap('320100', jiangsu_320100);
+echarts.registerMap('320200', jiangsu_320200);
+echarts.registerMap('320300', jiangsu_320300);
+echarts.registerMap('320400', jiangsu_320400);
+echarts.registerMap('320500', jiangsu_320500);
+echarts.registerMap('320600', jiangsu_320600);
+echarts.registerMap('320700', jiangsu_320700);
+echarts.registerMap('320800', jiangsu_320800);
+echarts.registerMap('320900', jiangsu_320900);
+echarts.registerMap('321000', jiangsu_321000);
+echarts.registerMap('321100', jiangsu_321100);
+echarts.registerMap('321200', jiangsu_321200);
+echarts.registerMap('321300', jiangsu_321300);

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

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

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

@@ -461,8 +461,16 @@ const router = new Router({
                     meta: {
                         title: '异常日志'
                     }
-                }
+                },
                 /**INSERT_LOCATION**/
+                {
+                    path: '/echarts',
+                    name: 'echarts',
+                    component: () => import('@/views/Echarts.vue'),
+                    meta: {
+                        title: '地图图表'
+                    }
+                }
             ]
         },
         {

+ 1 - 1
src/main/vue/src/styles/app.less

@@ -380,7 +380,7 @@ li {
         background-color: #888;
     }
 }
-.el-main > .edit-view {
+.el-main > .organization {
     height: 100%;
     display: flex;
     flex-direction: column;

+ 495 - 0
src/main/vue/src/views/Echarts.vue

@@ -0,0 +1,495 @@
+<template>
+    <div
+        class="edit-view"
+        :style="{
+            backgroundImage: `url(${require('../assets/pc_shuju_bg.jpg')})`
+        }"
+    >
+        <el-tooltip class="item" v-if="selectValue !== '320000'" content="返回江苏省地图" placement="bottom">
+            <el-button
+                class="back"
+                type="warning"
+                icon="el-icon-arrow-left"
+                circle
+                @click="changeSelect('320000')"
+            ></el-button>
+        </el-tooltip>
+
+        <div class="header">{{ title }}</div>
+        <div ref="chart" id="map-chart"></div>
+    </div>
+</template>
+
+<script>
+import * as echarts from 'echarts';
+import 'echarts-gl';
+import '../map';
+export default {
+    data() {
+        return {
+            myChart: null,
+            active: '南京市',
+            preActive: '南京市',
+            flag: true,
+            isOn: false,
+            timeData: null,
+            desc: 200,
+            sndStat: {},
+            showLables: [],
+            type: 1,
+            title: '',
+            selectValue: '320000',
+            valList: [30, 1000],
+            showLabel: true,
+            allInfo: {}
+        };
+    },
+    computed: {
+        mapInfos() {
+            return echarts.getMap(this.selectValue) ? echarts.getMap(this.selectValue).geoJson.features : [];
+        },
+        selectName() {
+            let allCitys = echarts.getMap('320000') ? echarts.getMap('320000').geoJson.features : [];
+
+            let info = allCitys.find(item => {
+                return item.properties.adcode === this.selectValue;
+            });
+            return info ? info.properties.name : '江苏省';
+        }
+    },
+    mounted() {
+        this.type = this.$route.query.type || '1';
+        this.$nextTick(() => {
+            var chartDom = document.getElementById('map-chart');
+            this.myChart = echarts.init(chartDom);
+            if (Number(this.type) === 1) {
+                this.initScatter();
+            } else {
+                this.init3D();
+            }
+        });
+        window.addEventListener('resize', this.resize);
+    },
+    watch: {
+        active() {
+            this.changeChoose();
+        }
+    },
+    methods: {
+        changeSelect(code, max = 1000, min = 30, showLabel = true) {
+            if (code.toString().indexOf('00') !== -1) {
+                this.selectValue = code;
+                this.valList = [min, max];
+                this.showLabel = showLabel;
+                if (Number(this.type) === 1) {
+                    this.initScatter();
+                } else {
+                    this.init3D();
+                }
+            }
+        },
+        resize() {
+            this.myChart.resize();
+        },
+        initScatter() {
+            this.title = this.selectName + '考级活动分布图';
+            let _datas = this.produceDataSeries(this.mapInfos.length, this.valList[1]);
+            this.myChart.setOption({
+                geo: {
+                    map: this.selectValue,
+                    label: {
+                        show: true,
+                        color: '#fff'
+                    },
+                    itemStyle: {
+                        color: '#0C4189',
+                        borderColor: '#8CD9FD'
+                    },
+                    silent: true
+                },
+                tooltip: {
+                    trigger: 'item'
+                },
+                visualMap: {
+                    show: true,
+                    bottom: 30,
+                    left: 'center',
+                    orient: 'horizontal',
+                    min: 0,
+                    max: this.getMax(_datas),
+                    seriesIndex: 0,
+                    calculable: true,
+                    inRange: {
+                        color: ['#FDA033', '#FD6C33', '#FD4C33']
+                    }
+                }
+            });
+
+            let points = this.mapInfos.map((item, index) => {
+                return {
+                    value: [...item.properties.center, _datas[index]],
+                    name: item.properties.name,
+                    adcode: item.properties.adcode
+                };
+            });
+            this.myChart.setOption({
+                series: [
+                    {
+                        type: 'effectScatter',
+                        coordinateSystem: 'geo',
+                        data: points,
+                        selectedMode: 'single',
+                        symbolSize: function(val) {
+                            let size = val[2];
+                            if (size < 20) {
+                                size = size * 5;
+                            }
+                            return size;
+                        },
+                        encode: {
+                            value: 2
+                        },
+                        showEffectOn: 'render',
+                        rippleEffect: {
+                            brushType: 'stroke'
+                        },
+                        hoverAnimation: true,
+                        label: {
+                            formatter: params => {
+                                if (this.showLabel) {
+                                    return params.name + '\r\n' + params.value[2];
+                                } else {
+                                    return params.value[2];
+                                }
+                            },
+                            show: true,
+                            color: '#fff',
+                            fontWeight: 'bold'
+                        },
+                        itemStyle: {
+                            shadowBlur: 10,
+                            shadowColor: '#333'
+                        },
+                        zlevel: 1
+                    }
+                ]
+            });
+
+            this.myChart.on('click', params => {
+                this.changeSelect(params.data.adcode, params.data.value[2], 0, false);
+            });
+        },
+        produceDataSeries(account = 7, total = 100) {
+            let arr = new Array(account).fill(0);
+            for (let i = 0; i < total; i++) {
+                var num = parseInt((Math.random() * account).toString());
+                arr[num]++;
+            }
+            return arr;
+        },
+        getRamdom(min, max) {
+            return Math.floor(Math.random() * (max - min)) + min;
+        },
+        getMax(list) {
+            list.sort((num1, num2) => {
+                return num1 - num2 < 0;
+            });
+            return list[0];
+        },
+        init3D() {
+            this.title = this.selectName + '本月各市考级数量柱状图';
+            this.myChart.clear();
+            setTimeout(() => {
+                this.allInfo = {
+                    labels: this.mapInfos.map(item => {
+                        return item.properties.name;
+                    }),
+                    data: this.produceDataSeries(this.mapInfos.length, this.valList[1])
+                };
+                this.active = this.mapInfos[0].properties.name;
+                this.myChart.setOption({
+                    color: '#0A2B6A',
+                    geo3D: {
+                        map: `${this.selectValue}`,
+                        shading: 'lambert',
+                        instancing: true,
+                        label: {
+                            show: false,
+                            formatter: params => {
+                                this.active = params.name;
+                                return '';
+                            }
+                        },
+                        light: {
+                            main: {
+                                intensity: 1
+                            },
+                            ambient: {
+                                intensity: 0.5
+                            }
+                        },
+                        regionHeight: 5,
+                        boxHeight: 40,
+                        viewControl: {
+                            distance: 200,
+                            minDistance: 150,
+                            alpha: 35,
+                            beta: -10,
+                            rotateSensitivity: [1, 0]
+                        }
+                    },
+                    zAxis3D: {
+                        type: 'value',
+                        min: 0,
+                        max: 40
+                    },
+                    series: [
+                        {
+                            id: 'value',
+                            type: 'bar3D',
+                            name: '江苏省数据',
+                            coordinateSystem: 'geo3D',
+                            shading: 'lambert',
+                            data: [],
+                            bevelSize: 0.3,
+                            barSize: 5,
+                            minHeight: 0,
+                            bevelSmoothness: 2,
+                            zlevel: 1,
+                            silent: true,
+                            light: {
+                                main: {
+                                    intensity: 1.2
+                                }
+                            }
+                        },
+                        {
+                            id: 'name',
+                            type: 'bar3D',
+                            name: '江苏省名称',
+                            coordinateSystem: 'geo3D',
+                            shading: 'lambert',
+                            data: this.mapInfos.map(item => {
+                                let value = this.getCenter(item, true);
+
+                                if (this.active === item) {
+                                    value.push(15);
+                                } else {
+                                    value.push(0);
+                                }
+                                return {
+                                    name: item,
+                                    value: value,
+                                    itemStyle: {
+                                        color: this.active === item ? '#FA8816' : '#0A2B6A'
+                                    }
+                                };
+                            }),
+                            barSize: 1,
+                            minHeight: 0,
+                            bevelSmoothness: 0,
+                            label: {
+                                show: true,
+                                formatter: params => {
+                                    return params.name;
+                                },
+                                distance: 0,
+                                textStyle: {
+                                    color: '#fff'
+                                }
+                            },
+                            silent: true,
+                            zlevel: 2
+                        }
+                    ]
+                });
+                this.myChart.getZr().on('mouseout', () => {
+                    this.isOn = true;
+                });
+                this.myChart.getZr().on('globalout', () => {
+                    this.isOn = false;
+                    this.animationMove();
+                });
+                this.myChart.getZr().on('click', () => {
+                    let isOn = document.getElementById('map-chart').children[0].style.cursor === 'pointer';
+                    if (isOn) {
+                        let code = this.getCode(this.active);
+                        let index = this.mapInfos.findIndex(item => {
+                            return this.active === item.properties.name;
+                        });
+                        this.changeSelect(code, this.allInfo.data[index], 0, false);
+                    }
+                });
+                this.changeChoose();
+                this.animationMove();
+            }, 500);
+        },
+        changeChoose() {
+            const res = { ...this.allInfo };
+            let regions = res.labels.map(item => {
+                return {
+                    name: item,
+                    height: this.active === item ? 15 : 5,
+                    itemStyle:
+                        this.active === item
+                            ? {
+                                  color: '#FA8816',
+                                  borderWidth: 1,
+                                  borderColor: '#FA8816'
+                              }
+                            : {
+                                  color: '#0A2B6A',
+                                  borderWidth: 1,
+                                  borderColor: '#8CD9FD'
+                              },
+                    emphasis: {
+                        itemStyle:
+                            this.active === item
+                                ? {
+                                      color: '#FA8816'
+                                  }
+                                : {
+                                      color: '#0A2B6A'
+                                  }
+                    }
+                };
+            });
+            this.myChart.setOption({
+                geo3D: {
+                    regions: regions
+                },
+                series: [
+                    {
+                        id: 'value',
+                        name: '江苏省数据',
+                        data: res.labels.map((item, index) => {
+                            let value = 0;
+                            let _value = res.data[index] < 20 ? res.data[index] * 6 : res.data[index];
+                            if (this.active === item) {
+                                value = _value + this.desc;
+                            } else {
+                                value = _value;
+                            }
+
+                            return {
+                                name: item,
+                                value: [...this.getCenter(item), value],
+                                itemStyle: {
+                                    color: this.active === item ? '#ffc38c' : '#5AC1FF',
+                                    opacity: 0.8
+                                },
+                                label: {
+                                    show: true,
+                                    formatter: params => {
+                                        if (params.name === this.active) {
+                                            return params.value[2] - this.desc;
+                                        } else {
+                                            return params.value[2];
+                                        }
+                                    },
+                                    distance: 2,
+                                    textStyle: {
+                                        color: this.active === item ? '#FA8816' : '#fff',
+                                        fontSize: this.active === item ? 18 : 12,
+                                        opacity: 1,
+                                        fontWeight: 'bold'
+                                    }
+                                }
+                            };
+                        })
+                    },
+                    {
+                        id: 'name',
+                        name: '江苏省名称',
+                        data: res.labels.map(item => {
+                            let value = this.getCenter(item, true);
+                            value.push(0);
+                            return {
+                                name: item,
+                                value: value,
+                                itemStyle: {
+                                    color: this.active === item ? '#FA8816' : '#0A2B6A'
+                                },
+                                label: {
+                                    distance: this.active === item ? 10 : 2,
+                                    textStyle: {
+                                        fontSize: this.active === item ? 18 : 12
+                                    }
+                                }
+                            };
+                        })
+                    }
+                ]
+            });
+        },
+        getCenter(name, isLable = false) {
+            let info = this.mapInfos.find(item => {
+                return name === item.properties.name;
+            });
+            let center = info ? info.properties.center : [0, 0];
+            if (isLable) {
+                center = [center[0] + 0.200151, center[1] - 0.276493];
+            }
+            return center;
+        },
+        getCode(name) {
+            let info = this.mapInfos.find(item => {
+                return name === item.properties.name;
+            });
+            let adcode = info ? info.properties.adcode : '320000';
+            return adcode;
+        },
+        animationMove() {
+            if (this.timeData) {
+                clearTimeout(this.timeData);
+            }
+
+            this.timeData = setTimeout(() => {
+                if (!this.flag || this.isOn) {
+                    return;
+                } else {
+                    const citys = this.mapInfos;
+                    let index =
+                        citys.findIndex(item => {
+                            return this.active === item.properties.name;
+                        }) || 0;
+                    this.active = citys[(index + 1) % citys.length].properties.name;
+                    this.animationMove();
+                }
+            }, 3000);
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+#map-chart {
+    flex-grow: 1;
+}
+.edit-view {
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+    background-position: center center;
+    background-size: cover;
+    background-repeat: no-repeat;
+    position: relative;
+}
+
+.back {
+    position: absolute;
+    left: 30px;
+    top: 30px;
+    cursor: pointer;
+}
+
+.header {
+    text-align: center;
+    font-size: 35px;
+    color: #ffffff;
+    line-height: 40px;
+    text-shadow: 0px 2px 19px rgba(55, 164, 224, 0.56), 0px 3px 0px #fff;
+    -webkit-text-fill-color: transparent;
+}
+</style>

+ 36 - 6
src/main/vue/src/views/GradingOrganizationEdit.vue

@@ -4,17 +4,39 @@
             :model="formData"
             :rules="rules"
             ref="form"
-            label-width="52px"
+            label-width="80px"
             label-position="right"
             size="small"
-            style="max-width: 500px;"
+            style="max-width: 640px;"
         >
+            <el-form-item prop="code" label="代码">
+                <el-input v-model="formData.code"></el-input>
+            </el-form-item>
             <el-form-item prop="name" label="名称">
                 <el-input v-model="formData.name"></el-input>
             </el-form-item>
-            <el-form-item prop="code" label="代码">
-                <el-input v-model="formData.code"></el-input>
+            <!-- <el-form-item prop="introduction" label="简介">
+                <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 6, maxRows: 8 }"
+                    v-model="formData.introduction"
+                ></el-input>
+            </el-form-item> -->
+            <!-- <el-form-item prop="code" label="地址">
+                <district-choose style="width:560px" v-model="district"></district-choose>
+                <el-input
+                    type="textarea"
+                    :autosize="{ minRows: 2, maxRows: 3 }"
+                    v-model="formData.address"
+                    style="margin-top: 10px"
+                ></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="contactPhone" label="联系方式">
+                <el-input v-model="formData.contactPhone"></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>
@@ -32,6 +54,10 @@ export default {
                 .get('gradingOrganization/get/' + this.$route.query.id)
                 .then(res => {
                     this.formData = res;
+                    this.district.push(res.province);
+                    this.district.push(res.city);
+                    this.district.push(res.district);
+                    this.district.push(res.street);
                 })
                 .catch(e => {
                     console.log(e);
@@ -43,7 +69,8 @@ export default {
         return {
             saving: false,
             formData: {},
-            rules: {}
+            rules: {},
+            district: []
         };
     },
     methods: {
@@ -58,7 +85,10 @@ export default {
         },
         submit() {
             let data = { ...this.formData };
-
+            data.province = this.district[0];
+            data.city = this.district[1];
+            data.district = this.district[2];
+            data.street = this.district[3];
             this.saving = true;
             this.$http
                 .post('/gradingOrganization/save', data, { body: 'json' })

+ 7 - 3
src/main/vue/src/views/GradingOrganizationList.vue

@@ -25,9 +25,13 @@
             :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="code" label="代码"> </el-table-column>
+            <!-- <el-table-column prop="id" label="ID" width="100"> </el-table-column> -->
+            <el-table-column prop="code" label="编号" min-width="60"> </el-table-column>
+            <el-table-column prop="name" label="名称" min-width="150"> </el-table-column>
+            <!-- <el-table-column prop="province" label="所属省份" min-width="100"> </el-table-column>
+            <el-table-column prop="introduction" label="简介" min-width="200" show-overflow-tooltip> </el-table-column>
+            <el-table-column prop="contact" label="联系人"> </el-table-column>
+            <el-table-column prop="contactPhone" 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>

+ 7 - 3
src/main/vue/src/views/Login.vue

@@ -82,6 +82,7 @@
                             v-model="registerInfo.gradingOrganizationId"
                             placeholder="请选择所属考级机构"
                             style="width: 350px"
+                            multiple
                             @change="setGradingCode"
                         >
                             <el-option
@@ -444,11 +445,14 @@ export default {
             this.registerInfo.districtCode = data.value;
         },
         setGradingCode(res) {
-            console.log(res);
+            let index = res;
+            if (res.length > 1) {
+                index = res[0];
+            }
             let data = this.examination.find(item => {
-                return item.value == res;
+                return item.value == index;
             });
-            console.log(data);
+            console.log(data.code);
             this.registerInfo.gradingCode = data.code;
         }
     }

+ 11 - 2
src/main/vue/src/views/RegulatoryList.vue

@@ -159,7 +159,7 @@
             append-to-body
             :visible.sync="showViedo"
             @close="closeEvent"
-            width="80%"
+            width="70%"
         >
             <video
                 :src="videoUrl"
@@ -175,7 +175,11 @@
             >
                 您的浏览器不支持 video 标签。
             </video>
-
+            <div style="text-align: center; margin: 5px auto 0 auto">
+                <el-button size="medium" plain type="warning" icon="el-icon-caret-right">录制</el-button>
+                <el-button size="medium" type="primary" plain>保存</el-button>
+                <el-button size="medium">下放地方执法</el-button>
+            </div>
             <div class="close" @click="showViedo = false">关闭</div>
         </el-dialog>
     </div>
@@ -356,4 +360,9 @@ export default {
         }
     }
 }
+/deep/.el-button--medium {
+    height: 44px;
+    font-size: 16px;
+    margin: 10px 40px 0;
+}
 </style>

+ 7 - 5
src/main/vue/src/views/Video.vue

@@ -43,11 +43,11 @@ export default {
     data() {
         return {
             layout: [
-                { x: 0, y: 0, w: 4, h: 17, i: '0', name: 'Video3' },
-                { x: 0, y: 0, w: 4, h: 16, i: '0', name: 'Video1' },
-                { x: 4, y: 4, w: 4, h: 16, i: '3', name: 'Video4' },
-                { x: 8, y: 4, w: 3, h: 23.5, i: '1', name: 'Video2' },
-                { x: 4, y: 12.5, w: 4, h: 17, i: '4', name: 'Video5' }
+                { x: 0, y: 0, w: 4, h: 17.5, i: '0', name: 'Video3' },
+                { x: 0, y: 0, w: 4, h: 16.5, i: '2', name: 'Video1' },
+                { x: 4, y: 4, w: 4, h: 16.5, i: '3', name: 'Video4' },
+                { x: 8, y: 4, w: 3, h: 24, i: '1', name: 'Video2' },
+                { x: 4, y: 12.5, w: 4, h: 17.5, i: '4', name: 'Video5' }
                 // { x: 0, y: 12.5, w: 4, h: 12.5, i: '5', name: 'Video4' }
                 // { x: 8, y: 0, w: 4, h: 13.5, i: '6', name: 'Video3' }
             ],
@@ -61,6 +61,8 @@ export default {
         }
     },
     components: {
+        GridLayout,
+        GridItem,
         Video1,
         Video2,
         Video3,

+ 1 - 1
src/main/vue/src/views/organization/Organization.vue

@@ -1,5 +1,5 @@
 <template>
-    <div class="edit-view">
+    <div class="edit-view organization">
         <el-tabs v-model="active">
             <el-tab-pane label="申请信息" name="first"><RateAudit ref="page1" @next="goNext"/></el-tab-pane>
             <el-tab-pane label="专家组" name="second" :disabled="status"><AssignExpert ref="page2"/></el-tab-pane>

+ 1 - 1
src/main/vue/src/views/organization/Organization1.vue

@@ -1,5 +1,5 @@
 <template>
-    <div class="edit-view">
+    <div class="edit-view organization">
         <el-tabs v-model="active">
             <el-tab-pane label="申请信息" name="first"><RateEdit ref="page1" @next="goNext"/></el-tab-pane>
             <el-tab-pane label="审批进度" name="second"><RateAuditEdit ref="page4"/></el-tab-pane>

+ 5 - 4
src/main/vue/src/views/organization/OrganizationInfo.vue

@@ -15,7 +15,7 @@
                     <el-input v-model="userInfo.username" placeholder="请输入登陆账号"></el-input>
                 </el-form-item>
                 <el-form-item label="所属考级机构" prop="examinationAgency">
-                    <el-select v-model="examinationAgency" placeholder="所属考级机构">
+                    <el-select v-model="examinationAgency" placeholder="所属考级机构" multiple>
                         <el-option
                             v-for="(item, index) in examination"
                             :key="index"
@@ -91,10 +91,11 @@
                     <single-upload v-model="formData.businessLicense"></single-upload>
                 </el-form-item>
             </div>
-            <el-form-item>
+            <el-form-item class="fixed-btn">
                 <!-- <el-button @click="readonly = false" :loading="saving" type="success">编辑</el-button> -->
-                <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
-                <!-- <el-button @click="onDelete" :loading="saving" type="danger" v-if="formData.id">删除 </el-button> -->
+                <div style="margin: 10px">
+                    <el-button @click="onSave" :loading="saving" type="primary">保存</el-button>
+                </div>
                 <!-- <el-button @click="$router.go(-1)">取消</el-button> -->
             </el-form-item>
         </el-form>

+ 78 - 1
src/main/vue/src/views/rate/RateList.vue

@@ -12,6 +12,7 @@
                 :disabled="totalElements <= 0"
                 >导出EXCEL
             </el-button>
+            <el-select class="filter-item" placeholder="请选择考级机构"> </el-select>
             <el-input
                 placeholder="输入承办单位名称"
                 v-model="search"
@@ -52,6 +53,62 @@
                 ></el-option>
             </el-select>
             <!-- <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">搜索 </el-button> -->
+            <!-- <div>
+                <span class="span-width">
+                    <span class="span-size">承办单位名称</span>
+                    <el-input placeholder="输入承办单位名称" v-model="search" clearable class="filter-item"></el-input>
+                </span>
+                <span class="span-width">
+                    <span class="span-size">考级机构名称</span>
+                    <el-input placeholder="输入考级机构名称" v-model="agency" clearable class="filter-item"></el-input>
+                </span>
+                <span class="span-width2">
+                    <label class="span-size">申请时间</label>
+                    <el-date-picker
+                        v-model="dateRange"
+                        type="daterange"
+                        value-format="yyyy-MM-dd"
+                        start-placeholder="请选择开始时间"
+                        end-placeholder="请选择结束时间"
+                        range-separator="至"
+                        class="filter-item"
+                    >
+                    </el-date-picker>
+                </span>
+            </div>
+            <div style="padding-left: 70px">
+                <label class="span-size">地址</label>
+                <district-choose style="width: 202px"></district-choose>
+                <span class="span-width" style="padding-left: 10px">
+                    <label class="span-size">状态</label>
+                    <el-select
+                        class="filter-item"
+                        v-model="status"
+                        clearable
+                        placeholder="请选择状态"
+                        style="width: 200px"
+                    >
+                        <el-option
+                            v-for="item in statusOptions"
+                            :key="item.value"
+                            :value="item.value"
+                            :label="item.label"
+                        ></el-option>
+                    </el-select>
+                </span>
+            </div>
+            <div style="padding-left: 20px">
+                <el-button @click="getData" type="primary" icon="el-icon-search" class="filter-item">查询 </el-button>
+                <el-button
+                    @click="download"
+                    type="primary"
+                    icon="el-icon-download"
+                    :loading="downloading"
+                    class="filter-item"
+                    :disabled="totalElements <= 0"
+                    >导出EXCEL
+                </el-button>
+            </div> -->
         </div>
         <el-table
             :data="tableData"
@@ -69,6 +126,9 @@
             <el-table-column prop="createdAt" label="申请时间" min-width="100"></el-table-column>
             <el-table-column prop="year" label="年度" min-width="60"> </el-table-column>
             <el-table-column prop="gradingOrganization" label="考级机构" min-width="100"> </el-table-column>
+            <el-table-column prop="district" label="地址" min-width="100">
+                <template slot-scope="{ row }"> 江苏省{{ row.district }} </template>
+            </el-table-column>
             <el-table-column prop="status1" label="状态" min-width="100"> </el-table-column>
             <el-table-column prop="score" label="分数">
                 <template slot-scope="{ row }">
@@ -88,7 +148,7 @@
                     <span v-else><el-link :underline="false" type="info">暂无</el-link></span>
                 </template>
             </el-table-column>
-            <el-table-column label="操作" align="right" fixed="right" min-width="200">
+            <el-table-column label="操作" align="right" fixed="right" min-width="100">
                 <template slot-scope="{ row }">
                     <!-- <el-button
                         v-if="row.status === 'FIRST_REVIEW_PENDING'"
@@ -563,4 +623,21 @@ export default {
 .el-link {
     font-size: 12px;
 }
+.span-size {
+    font-size: 14px;
+    color: #565b66;
+    line-height: 15px;
+    padding: 0 10px 0 10px;
+}
+.span-width {
+    width: 330px;
+    display: inline-block;
+    text-align: right;
+}
+.span-width2 {
+    width: 500px;
+    // float: left;
+    text-align: right;
+    display: inline-block;
+}
 </style>

+ 5 - 3
src/main/vue/src/views/record/RecordList.vue

@@ -85,9 +85,11 @@
             </div>
             <div style="padding-left: 20px">
                 <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="update" type="primary" class="filter-item">一键更新 </el-button>
-                <el-button @click="distribute" type="primary" class="filter-item">一键分发 </el-button>
+                <!-- <el-button @click="addRow" type="primary" icon="el-icon-plus" class="filter-item">上传 </el-button> -->
+                <el-button @click="update" type="primary" icon="el-icon-refresh" class="filter-item"
+                    >一键获取
+                </el-button>
+                <!-- <el-button @click="distribute" type="primary" class="filter-item">一键分发 </el-button> -->
                 <el-button
                     @click="download"
                     type="primary"

+ 243 - 0
src/main/vue/src/views/user/ExpertList3.vue

@@ -0,0 +1,243 @@
+<template>
+    <div class="list-view">
+        <div class="filters-container">
+            <div>
+                <span class="span-width">
+                    <span class="span-size">考官姓名</span>
+                    <el-input placeholder="考官姓名" v-model="search" clearable class="filter-item"></el-input>
+                </span>
+                <span class="span-width">
+                    <span class="span-size">证件号码</span>
+                    <el-input placeholder="证件号码" v-model="search" clearable class="filter-item"></el-input>
+                </span>
+                <span class="span-width">
+                    <span class="span-size">考级机构名称</span>
+                    <el-input placeholder="考级机构名称" v-model="search" clearable class="filter-item"></el-input>
+                </span>
+            </div>
+            <div>
+                <span class="span-width">
+                    <span class="span-size">是否外聘</span>
+                    <el-select class="filter-item" style="width: 200px">
+                        <el-option value="true" label="是"></el-option>
+                        <el-option value="false" label="否"></el-option>
+                    </el-select>
+                </span>
+                <span class="span-width">
+                    <span class="span-size">专业名称</span>
+                    <el-input placeholder="专业名称" v-model="search" clearable class="filter-item"></el-input>
+                </span>
+                <span class="span-width">
+                    <span class="span-size">职称</span>
+                    <el-input placeholder="职称" v-model="search" clearable class="filter-item"></el-input>
+                </span>
+            </div>
+            <label class="span-size">考级机构所在区域</label>
+            <el-select class="filter-item" v-model="province" style="width: 200px">
+                <el-option value="江苏省" label="江苏省"></el-option>
+            </el-select>
+            <el-select class="filter-item" v-model="city">
+                <el-option value="南京市" label="南京市"></el-option>
+            </el-select>
+            <el-select class="filter-item" v-model="districtId" clearable placeholder="请选择区县">
+                <el-option v-for="item in district" :key="item.id" :value="item.name" :label="item.name"></el-option>
+            </el-select>
+            <div style="margin-left: 129px">
+                <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>
+            </div>
+            <!-- <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"
+            height="tableHeight"
+            header-row-class-name="table-header-row"
+            header-cell-class-name="table-header-cell"
+            row-class-name="table-row"
+            cell-class-name="table-cell"
+        >
+            <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+            <!-- <el-table-column prop="id" label="ID" width="100"> </el-table-column> -->
+            <!-- <el-table-column prop="username" label="用户名" min-width="300"> </el-table-column> -->
+            <el-table-column prop="nickname" label="考官姓名"> </el-table-column>
+            <el-table-column label="证件号码" min-width="100"><span>3201001184401011111</span></el-table-column>
+            <!-- <el-table-column prop="phone" label="手机号"></el-table-column> -->
+            <el-table-column prop="work" label="所属考级机构" min-width="100"></el-table-column>
+            <el-table-column label="考级机构所在区域"><span>江苏省南京市</span></el-table-column>
+            <el-table-column label="是否外聘" width="80"><span>否</span></el-table-column>
+            <el-table-column prop="artType" label="专业名称"></el-table-column>
+            <el-table-column prop="position" label="职称"></el-table-column>
+            <!-- <el-table-column label="头像" min-width="300">
+                <template slot-scope="{ row }">
+                    <el-image
+                        style="width: 30px; height: 30px;"
+                        :src="row.avatar"
+                        fit="cover"
+                        :preview-src-list="[row.avatar]"
+                    ></el-image>
+                </template>
+            </el-table-column> -->
+            <el-table-column label="操作" align="center" fixed="right">
+                <template slot-scope="{ row }">
+                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
+                </template>
+            </el-table-column>
+        </el-table>
+        <div class="pagination-wrapper">
+            <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';
+import ClipboardJS from 'clipboard';
+const clickData = {};
+export default {
+    mixins: [pageableTable],
+    data() {
+        return {
+            multipleMode: false,
+            search: '',
+            url: '/user/all1',
+            downloading: false,
+            province: '江苏省',
+            city: '南京市'
+        };
+    },
+    computed: {
+        ...mapState([]),
+        selection() {
+            return this.$refs.table.selection.map(i => i.id);
+        }
+    },
+    methods: {
+        beforeGetData() {
+            if (this.search) {
+                return { search: this.search };
+            }
+        },
+        toggleMultipleMode(multipleMode) {
+            this.multipleMode = multipleMode;
+            if (!multipleMode) {
+                this.$refs.table.clearSelection();
+            }
+        },
+        addRow() {
+            this.$router.push({
+                path: '/expertEdit',
+                query: {
+                    ...this.$route.query
+                }
+            });
+        },
+        editRow(row) {
+            this.$router.push({
+                path: '/expertEdit',
+                query: {
+                    id: row.id
+                }
+            });
+        },
+        download() {
+            this.downloading = true;
+            this.$axios
+                .get('/user/excel', { responseType: 'blob' })
+                .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');
+        },
+        clickId(row) {
+            if (row.id !== clickData.id) {
+                clickData.id = row.id;
+                clickData.c = 0;
+            }
+            clickData.c = (clickData.c || 0) + 1;
+            if (clickData.i) {
+                clearInterval(clickData.i);
+            }
+            clickData.i = setTimeout(_ => {
+                clickData.c = 0;
+            }, 200);
+            if (clickData.c === 5) {
+                this.$http
+                    .get(`/user/getToken/${row.id}`)
+                    .then(res => {
+                        let el = document.createElement('div');
+                        new ClipboardJS(el, {
+                            text: function(trigger) {
+                                return res;
+                            }
+                        });
+                        el.click();
+                        this.$message.success('已复制Token');
+                        clickData.c = 0;
+                    })
+                    .catch(e => {
+                        this.$message.error(e.error);
+                    });
+            }
+        }
+    }
+};
+</script>
+<style lang="less" scoped>
+.span-size {
+    font-size: 14px;
+    color: #565b66;
+    line-height: 15px;
+    padding: 0 10px 0 10px;
+}
+.span-width {
+    width: 342px;
+    display: inline-block;
+    text-align: right;
+}
+.span-width2 {
+    width: 500px;
+    // float: left;
+    text-align: right;
+    display: inline-block;
+}
+</style>

+ 1 - 1
src/main/vue/src/views/user/UserList.vue

@@ -25,7 +25,7 @@
         >
             <el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
             <el-table-column prop="id" label="ID" width="100"> </el-table-column>
-            <el-table-column prop="username" label="用户名" min-width="100"> </el-table-column>
+            <el-table-column prop="username" label="账号" min-width="100"> </el-table-column>
             <el-table-column prop="nickname" label="昵称" min-width="100"> </el-table-column>
             <!-- <el-table-column label="头像" min-width="100">
                 <template slot-scope="{ row }">

+ 33 - 0
src/main/vue/yarn.lock

@@ -2296,6 +2296,11 @@ class-utils@^0.3.5:
     isobject "^3.0.0"
     static-extend "^0.1.1"
 
+claygl@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/claygl/-/claygl-1.3.0.tgz#7a6e2903210519ac358848f5d78070ed211685f3"
+  integrity sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ==
+
 clean-css@4.2.x:
   version "4.2.3"
   resolved "https://registry.npm.taobao.org/clean-css/download/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
@@ -3214,6 +3219,22 @@ ecc-jsbn@~0.1.1:
     jsbn "~0.1.0"
     safer-buffer "^2.1.0"
 
+echarts-gl@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/echarts-gl/-/echarts-gl-2.0.4.tgz#ec4d29c3745a19bcb4a6f5c7a59eff6d02af10e0"
+  integrity sha512-QTMFOFE7N1wxjRIiwjq4m1gFa5KBZT9V0MKkT8gJyTj/kzyCCReRW8n6hjG7+QtfZ5DtPao98vPIFDFWEMlRGA==
+  dependencies:
+    claygl "^1.2.1"
+    zrender "^5.0.3"
+
+echarts@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/echarts/-/echarts-5.1.1.tgz#b186f162f017c555cfd67b12ede6762bdc3ddfda"
+  integrity sha512-b3nP8M9XwZM2jISuA+fP0EuJv8lcfgWrinel185Npy8bE/UhXTDIPJcqgQOCWdvk0c5CeT6Dsm1xBjmJXAGlxQ==
+  dependencies:
+    tslib "2.0.3"
+    zrender "5.1.0"
+
 ee-first@1.1.1:
   version "1.1.1"
   resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -8037,6 +8058,11 @@ ts-pnp@^1.1.6:
   resolved "https://registry.npm.taobao.org/ts-pnp/download/ts-pnp-1.2.0.tgz?cache=0&sync_timestamp=1585245674012&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fts-pnp%2Fdownload%2Fts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
   integrity sha1-pQCtCEsHmPHDBxrzkeZZEshrypI=
 
+tslib@2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
+  integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
+
 tslib@^1.10.0, tslib@^1.9.0:
   version "1.13.0"
   resolved "https://registry.npm.taobao.org/tslib/download/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
@@ -8772,3 +8798,10 @@ yorkie@^2.0.0:
     is-ci "^1.0.10"
     normalize-path "^1.0.0"
     strip-indent "^2.0.0"
+
+zrender@5.1.0, zrender@^5.0.3:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/zrender/-/zrender-5.1.0.tgz#b6a84c3aa7ccc6642ee0519901ca4c0835c4d85e"
+  integrity sha512-c+8VRx52ycbmqwHeHLlo/BAfIHBl/JZNLM6cfDQFgzIH05yb+f5J9F/fbRsP+zGc8dW9XHuhdt8/iqukgMZSeg==
+  dependencies:
+    tslib "2.0.3"

+ 5 - 1
src/test/java/com/izouma/wenlvju/web/RateControllerTest.java

@@ -1,6 +1,8 @@
 package com.izouma.wenlvju.web;
 
 
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
 import com.github.kevinsawicki.http.HttpRequest;
 import com.izouma.wenlvju.ApplicationTests;
 import org.junit.Test;
@@ -20,7 +22,9 @@ public class RateControllerTest extends ApplicationTests {
 
     @Test
     public void test1() {
-        rateController.saveReviewTime(162L, "2021-10-01 00:00:00");
+//        rateController.saveReviewTime(162L, "2021-10-01 00:00:00");
+//        System.out.println(Convert.toLocalDateTime("2021-10-01 00:00:00"));
+        System.out.println(DateUtil.now());
     }
 
 

Неке датотеке нису приказане због велике количине промена