Forráskód Böngészése

add: agency and expert list

guo00guo 4 éve
szülő
commit
ad894b06fa

+ 2 - 1
config/dev.env.js

@@ -6,5 +6,6 @@ module.exports = merge(prodEnv, {
   NODE_ENV: '"development"',
   ENV_CONFIG: "'dev'",
   API_ROOT: '"//crowd.dev.mooctest.net"',
-  LOGIN_URL: '"http://user.mooctest.net:8081/page/login?redirect=http%3a%2f%2fcrowd.dev.mooctest.net%2f%23%2fmine"'
+  LOGIN_URL: '"http://user.mooctest.net:8081/page/login?redirect=http%3a%2f%2fcrowd.dev.mooctest.net%2f%23%2fhome"',
+  REGISTER_URL: '"http://user.mooctest.net:8081/page/register"'
 })

+ 2 - 1
config/prod.env.js

@@ -3,5 +3,6 @@ module.exports = {
   NODE_ENV: '"production"',
   ENV_CONFIG: "'prod'",
   API_ROOT: '"//www.cofortest.com"',
-  LOGIN_URL:'"http://user.cofortest.com/page/login?redirect=http%3a%2f%2fwww.cofortest.com%2f%23%2fmine"'
+  LOGIN_URL:'"http://user.cofortest.com/page/login?redirect=http%3a%2f%2fwww.cofortest.com%2f%23%2fmine"',
+  REGISTER_URL: '"http://user.cofortest.com/page/register"'
 }

+ 3 - 2
config/test.env.js

@@ -3,5 +3,6 @@ module.exports = {
   NODE_ENV: '"test"',
   ENV_CONFIG: "'test'",
   API_ROOT: '"//crowd.mooctest.net:8083"',
-  LOGIN_URL:'"http://user.mooctest.net:8081/page/login?redirect=http%3a%2f%2fcrowd.mooctest.net:8083%2f%23%2fmine"'
-}
+  LOGIN_URL:'"http://user.mooctest.net:8081/page/login?redirect=http%3a%2f%2fcrowd.mooctest.net:8083%2f%23%2fmine"',
+  REGISTER_URL: '"http://user.mooctest.net:8081/page/register"'
+}

+ 59 - 45
package-lock.json

@@ -168,7 +168,7 @@
     },
     "@types/q": {
       "version": "1.5.2",
-      "resolved": "https://registry.npm.taobao.org/@types/q/download/@types/q-1.5.2.tgz?cache=0&sync_timestamp=1567534086032&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fq%2Fdownload%2F%40types%2Fq-1.5.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/@types/q/download/@types/q-1.5.2.tgz",
       "integrity": "sha1-aQoUdbhPKohP0HzXl8APXzE1bqg=",
       "dev": true
     },
@@ -550,7 +550,7 @@
     },
     "axios": {
       "version": "0.19.0",
-      "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Faxios%2Fdownload%2Faxios-0.19.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/axios/download/axios-0.19.0.tgz",
       "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=",
       "requires": {
         "follow-redirects": "1.5.10",
@@ -1893,7 +1893,7 @@
     },
     "caniuse-api": {
       "version": "3.0.0",
-      "resolved": "http://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/caniuse-api/download/caniuse-api-3.0.0.tgz",
       "integrity": "sha1-Xk2Q4idJYdRikZl99Znj7QCO5MA=",
       "dev": true,
       "requires": {
@@ -2117,7 +2117,7 @@
     },
     "coa": {
       "version": "2.0.2",
-      "resolved": "http://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/coa/download/coa-2.0.2.tgz",
       "integrity": "sha1-Q/bCEVG07yv1cYfbDXPeIp4+fsM=",
       "dev": true,
       "requires": {
@@ -2150,7 +2150,7 @@
     },
     "color": {
       "version": "3.1.2",
-      "resolved": "https://registry.npm.taobao.org/color/download/color-3.1.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/color/download/color-3.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcolor%2Fdownload%2Fcolor-3.1.2.tgz",
       "integrity": "sha1-aBSOf4XUGtdknF+oyBBvCY0inhA=",
       "dev": true,
       "requires": {
@@ -2175,7 +2175,7 @@
     },
     "color-string": {
       "version": "1.5.3",
-      "resolved": "http://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/color-string/download/color-string-1.5.3.tgz",
       "integrity": "sha1-ybvF8BtYtUkvPWhXRZy2WQziBMw=",
       "dev": true,
       "requires": {
@@ -2653,7 +2653,7 @@
       "dependencies": {
         "source-map": {
           "version": "0.5.7",
-          "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
+          "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz",
           "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
           "dev": true
         }
@@ -2679,7 +2679,7 @@
     },
     "cssnano": {
       "version": "4.1.10",
-      "resolved": "http://registry.npm.taobao.org/cssnano/download/cssnano-4.1.10.tgz",
+      "resolved": "https://registry.npm.taobao.org/cssnano/download/cssnano-4.1.10.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcssnano%2Fdownload%2Fcssnano-4.1.10.tgz",
       "integrity": "sha1-CsQfCxPRPUZUh+ERt3jULaYxuLI=",
       "dev": true,
       "requires": {
@@ -2844,7 +2844,7 @@
     },
     "csso": {
       "version": "3.5.1",
-      "resolved": "http://registry.npm.taobao.org/csso/download/csso-3.5.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/csso/download/csso-3.5.1.tgz",
       "integrity": "sha1-e564vmFiiXPBsmHhadLwJACOdYs=",
       "dev": true,
       "requires": {
@@ -5344,7 +5344,7 @@
     },
     "html-comment-regex": {
       "version": "1.1.2",
-      "resolved": "http://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/html-comment-regex/download/html-comment-regex-1.1.2.tgz",
       "integrity": "sha1-l9RoiutcgYhqNk+qDK0d2hTUM6c=",
       "dev": true
     },
@@ -5571,7 +5571,7 @@
     },
     "import-fresh": {
       "version": "2.0.0",
-      "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz?cache=0&sync_timestamp=1561888919431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-2.0.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-2.0.0.tgz",
       "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
       "dev": true,
       "requires": {
@@ -5581,7 +5581,7 @@
       "dependencies": {
         "caller-path": {
           "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz",
+          "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-2.0.0.tgz",
           "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
           "dev": true,
           "requires": {
@@ -6779,6 +6779,11 @@
         "commander": "*"
       }
     },
+    "moment": {
+      "version": "2.27.0",
+      "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.27.0.tgz?cache=0&sync_timestamp=1592516084857&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment%2Fdownload%2Fmoment-2.27.0.tgz",
+      "integrity": "sha1-i/9OPiaiNiIN/j423nVrbrqgEF0="
+    },
     "move-concurrently": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
@@ -7078,7 +7083,7 @@
     },
     "normalize-url": {
       "version": "3.3.0",
-      "resolved": "http://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/normalize-url/download/normalize-url-3.3.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-url%2Fdownload%2Fnormalize-url-3.3.0.tgz",
       "integrity": "sha1-suHE3E98bVd0PfczpPWXjRhlBVk=",
       "dev": true
     },
@@ -7186,7 +7191,7 @@
     },
     "object.getownpropertydescriptors": {
       "version": "2.0.3",
-      "resolved": "http://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.0.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/object.getownpropertydescriptors/download/object.getownpropertydescriptors-2.0.3.tgz",
       "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
       "dev": true,
       "requires": {
@@ -7600,7 +7605,7 @@
     },
     "postcss-calc": {
       "version": "7.0.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-calc/download/postcss-calc-7.0.1.tgz",
       "integrity": "sha1-Ntd7qwI7Dsu5eJ2E3LI8SUEUVDY=",
       "dev": true,
       "requires": {
@@ -7612,7 +7617,7 @@
       "dependencies": {
         "cssesc": {
           "version": "2.0.0",
-          "resolved": "http://registry.npm.taobao.org/cssesc/download/cssesc-2.0.0.tgz",
+          "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-2.0.0.tgz",
           "integrity": "sha1-OxO9G7HLNuG8taTc0n9UxdyzVwM=",
           "dev": true
         },
@@ -7629,7 +7634,7 @@
         },
         "postcss-selector-parser": {
           "version": "5.0.0",
-          "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz",
+          "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-5.0.0.tgz",
           "integrity": "sha1-JJBENWaXsztk8aj3yAki3d7nGVw=",
           "dev": true,
           "requires": {
@@ -7651,7 +7656,7 @@
     },
     "postcss-colormin": {
       "version": "4.0.3",
-      "resolved": "http://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-colormin/download/postcss-colormin-4.0.3.tgz",
       "integrity": "sha1-rgYLzpPteUrHEmTwgTLVUJVr04E=",
       "dev": true,
       "requires": {
@@ -7709,7 +7714,7 @@
     },
     "postcss-convert-values": {
       "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-convert-values/download/postcss-convert-values-4.0.1.tgz",
       "integrity": "sha1-yjgT7U2g+BL51DcDWE5Enr4Ymn8=",
       "dev": true,
       "requires": {
@@ -7741,7 +7746,7 @@
     },
     "postcss-discard-comments": {
       "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-discard-comments/download/postcss-discard-comments-4.0.2.tgz",
       "integrity": "sha1-H7q9LCRr/2qq15l7KwkY9NevQDM=",
       "dev": true,
       "requires": {
@@ -7772,7 +7777,7 @@
     },
     "postcss-discard-duplicates": {
       "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-discard-duplicates/download/postcss-discard-duplicates-4.0.2.tgz",
       "integrity": "sha1-P+EzzTyCKC5VD8myORdqkge3hOs=",
       "dev": true,
       "requires": {
@@ -7803,7 +7808,7 @@
     },
     "postcss-discard-empty": {
       "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-discard-empty/download/postcss-discard-empty-4.0.1.tgz",
       "integrity": "sha1-yMlR6fc+2UKAGUWERKAq2Qu592U=",
       "dev": true,
       "requires": {
@@ -7834,7 +7839,7 @@
     },
     "postcss-discard-overridden": {
       "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-discard-overridden/download/postcss-discard-overridden-4.0.1.tgz",
       "integrity": "sha1-ZSrvipZybwKfXj4AFG7npOdV/1c=",
       "dev": true,
       "requires": {
@@ -8019,7 +8024,7 @@
     },
     "postcss-merge-longhand": {
       "version": "4.0.11",
-      "resolved": "http://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-merge-longhand/download/postcss-merge-longhand-4.0.11.tgz",
       "integrity": "sha1-YvSaE+Sg7gTnuY9CuxYGLKJUniQ=",
       "dev": true,
       "requires": {
@@ -8053,7 +8058,7 @@
     },
     "postcss-merge-rules": {
       "version": "4.0.3",
-      "resolved": "http://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-merge-rules/download/postcss-merge-rules-4.0.3.tgz",
       "integrity": "sha1-NivqT/Wh+Y5AdacTxsslrv75plA=",
       "dev": true,
       "requires": {
@@ -8101,7 +8106,7 @@
         },
         "postcss-selector-parser": {
           "version": "3.1.1",
-          "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
+          "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
           "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
           "dev": true,
           "requires": {
@@ -8123,7 +8128,7 @@
     },
     "postcss-minify-font-values": {
       "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-minify-font-values/download/postcss-minify-font-values-4.0.2.tgz",
       "integrity": "sha1-zUw0TM5HQ0P6xdgiBqssvLiv1aY=",
       "dev": true,
       "requires": {
@@ -8155,7 +8160,7 @@
     },
     "postcss-minify-gradients": {
       "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-minify-gradients/download/postcss-minify-gradients-4.0.2.tgz",
       "integrity": "sha1-k7KcL/UJnFNe7NpWxKpuZlpmNHE=",
       "dev": true,
       "requires": {
@@ -8189,7 +8194,7 @@
     },
     "postcss-minify-params": {
       "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-minify-params/download/postcss-minify-params-4.0.2.tgz",
       "integrity": "sha1-a5zvAwwR41Jh+V9hjJADbWgNuHQ=",
       "dev": true,
       "requires": {
@@ -8248,7 +8253,7 @@
     },
     "postcss-minify-selectors": {
       "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-minify-selectors/download/postcss-minify-selectors-4.0.2.tgz",
       "integrity": "sha1-4uXrQL/uUA0M2SQ1APX46kJi+9g=",
       "dev": true,
       "requires": {
@@ -8271,7 +8276,7 @@
         },
         "postcss-selector-parser": {
           "version": "3.1.1",
-          "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
+          "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
           "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
           "dev": true,
           "requires": {
@@ -8450,7 +8455,7 @@
     },
     "postcss-normalize-charset": {
       "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-normalize-charset/download/postcss-normalize-charset-4.0.1.tgz",
       "integrity": "sha1-izWt067oOhNrBHHg1ZvlilAoXdQ=",
       "dev": true,
       "requires": {
@@ -8704,7 +8709,7 @@
     },
     "postcss-normalize-url": {
       "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-normalize-url/download/postcss-normalize-url-4.0.1.tgz",
       "integrity": "sha1-EOQ3+GvHx+WPe5ZS7YeNqqlfquE=",
       "dev": true,
       "requires": {
@@ -8770,7 +8775,7 @@
     },
     "postcss-ordered-values": {
       "version": "4.1.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-ordered-values/download/postcss-ordered-values-4.1.2.tgz",
       "integrity": "sha1-DPdcgg7H1cTSgBiVWeC1ceusDu4=",
       "dev": true,
       "requires": {
@@ -8803,7 +8808,7 @@
     },
     "postcss-reduce-initial": {
       "version": "4.0.3",
-      "resolved": "http://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-reduce-initial/download/postcss-reduce-initial-4.0.3.tgz",
       "integrity": "sha1-f9QuvqXpyBRgljniwuhK4nC6SN8=",
       "dev": true,
       "requires": {
@@ -8860,7 +8865,7 @@
     },
     "postcss-reduce-transforms": {
       "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-reduce-transforms/download/postcss-reduce-transforms-4.0.2.tgz",
       "integrity": "sha1-F++kBerMbge+NBSlyi0QdGgdTik=",
       "dev": true,
       "requires": {
@@ -8905,7 +8910,7 @@
     },
     "postcss-svgo": {
       "version": "4.0.2",
-      "resolved": "http://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.2.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-svgo/download/postcss-svgo-4.0.2.tgz",
       "integrity": "sha1-F7mXvHEbMzurFDqu07jT1uPTglg=",
       "dev": true,
       "requires": {
@@ -8939,7 +8944,7 @@
     },
     "postcss-unique-selectors": {
       "version": "4.0.1",
-      "resolved": "http://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/postcss-unique-selectors/download/postcss-unique-selectors-4.0.1.tgz",
       "integrity": "sha1-lEaRHzKJv9ZMbWgPBzwDsfnuS6w=",
       "dev": true,
       "requires": {
@@ -9135,8 +9140,7 @@
     "querystring": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "dev": true
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
     },
     "querystring-es3": {
       "version": "0.2.1",
@@ -9825,7 +9829,7 @@
     },
     "sax": {
       "version": "1.2.4",
-      "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz",
+      "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz",
       "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=",
       "dev": true
     },
@@ -10081,7 +10085,7 @@
       "dependencies": {
         "is-arrayish": {
           "version": "0.3.2",
-          "resolved": "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz",
+          "resolved": "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.3.2.tgz",
           "integrity": "sha1-RXSirlb3qyBolvtDHq7tBm/fjwM=",
           "dev": true
         }
@@ -10644,7 +10648,7 @@
         },
         "postcss-selector-parser": {
           "version": "3.1.1",
-          "resolved": "http://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
+          "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-3.1.1.tgz",
           "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
           "dev": true,
           "requires": {
@@ -10696,7 +10700,7 @@
       "dependencies": {
         "css-select": {
           "version": "2.0.2",
-          "resolved": "http://registry.npm.taobao.org/css-select/download/css-select-2.0.2.tgz",
+          "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-2.0.2.tgz",
           "integrity": "sha1-q0OGzsnh9miFVWSxfDcztDsqXt4=",
           "dev": true,
           "requires": {
@@ -11288,7 +11292,7 @@
     },
     "util.promisify": {
       "version": "1.0.0",
-      "resolved": "http://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/util.promisify/download/util.promisify-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Futil.promisify%2Fdownload%2Futil.promisify-1.0.0.tgz",
       "integrity": "sha1-RA9xZaRZyaFtwUXrjnLzVocJcDA=",
       "dev": true,
       "requires": {
@@ -11491,6 +11495,16 @@
       "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
       "dev": true
     },
+    "vue-waterfall": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npm.taobao.org/vue-waterfall/download/vue-waterfall-1.0.6.tgz",
+      "integrity": "sha1-ADJKj5f0Sb9vjN67SXS2DP+snu0="
+    },
+    "vue-waterfall-easy": {
+      "version": "2.4.4",
+      "resolved": "https://registry.npm.taobao.org/vue-waterfall-easy/download/vue-waterfall-easy-2.4.4.tgz",
+      "integrity": "sha1-qZDvP39+uI3txe9A4GTE5okI6Ew="
+    },
     "vuex": {
       "version": "3.1.1",
       "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.1.1.tgz",

+ 332 - 7
src/components/commons/Header2.0.vue

@@ -7,16 +7,71 @@
         </div>
         <div class="nav-list pull-right">
           <ul>
-            <li>
-              <a href="#">请登录</a>
+            <li v-if="isLogin">
+              <el-dropdown>
+                <span class="el-dropdown-link">
+                  {{user.userVO.name}}<i class="el-icon-arrow-down el-icon--right"></i>
+                </span>
+                <el-dropdown-menu slot="dropdown">
+                  <el-dropdown-item v-if="rolesPermissions.isSystemAdministrator">
+                    <router-link :to="{ name: 'AuthenticationManage'}">
+                      <el-link icon="el-icon-view" :underline="false">
+                        审核认证信息
+                      </el-link>
+                    </router-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item v-if="user.authStatus.text == '审核通过' &&  !this.user.personalAuthVO && this.user.agencyVO">
+                    <router-link :to="{ name: 'Agency',params:{userId:user.userVO.id}}">
+                      <el-link icon="el-icon-edit" :underline="false">
+                        修改机构信息
+                      </el-link>
+                    </router-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item v-if="user.authStatus.text == '未实名认证' && !rolesPermissions.isSystemAdministrator">
+                    <router-link :to="{ name: 'AuthenticationIndex'}">
+                      <el-link type="info" icon="el-icon-warning-outline" :underline="false">
+                        未实名认证
+                      </el-link>
+                    </router-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item v-if="user.authStatus.text == '认证审核中'" @click.native="handleClickAuthChecking()">
+                    <el-link type="warning" icon="el-icon-loading" :underline="false">
+                      认证审核中
+                    </el-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item @click.native="handleClickAuthPass()" v-if="user.authStatus.text == '审核通过'">
+                    <el-link type="primary" icon="el-icon-check" :underline="false">
+                      已认证
+                    </el-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item @click.native="handleClickAuthReject()" v-if="user.authStatus.text == '审核未通过'">
+                    <el-link type="danger" icon="el-icon-close" :underline="false">
+                      认证失败
+                    </el-link>
+                  </el-dropdown-item>
+                  <el-dropdown-item divided @click.native="userLogout()">登出</el-dropdown-item>
+                </el-dropdown-menu>
+              </el-dropdown>
             </li>
-            &nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
-            <li>
-              <a href="#">免费注册</a>
+            <li v-if="!isLogin">
+              <a :href="loginUrl">请登录</a>
             </li>
             &nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
+            <li v-if="!isLogin">
+              <a :href="loginUrl">免费注册</a>
+            </li>
+              <span v-if="!isLogin">&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;</span>
+            <li v-if="isLogin">
+              <router-link v-if="isLogin" to="/mine">
+                <a class="dropdown-toggle nav-link" data-toggle="dropdown">
+<!--                  <img class="icon" src="@/assets/img/mine_icon.svg">-->
+                  <span>我的众测</span>
+                </a>
+              </router-link>
+            </li>
+            &nbsp;&nbsp;&nbsp;<span v-if="isLogin">&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;</span>
             <li>
-              <a href="#">我的众测</a>
+              <a @click="gotoHome" style="cursor: pointer">首页</a>
             </li>
             &nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
             <li>
@@ -33,8 +88,278 @@
 </template>
 
 <script>
+  import {
+      defaultValue,
+      deleteAuthInfo,
+      getCurrentAgencyAuthInfo,
+      getCurrentEnterpriseAuthInfo,
+      getCurrentIndividualAuthenInfo,
+      getCurrentUser,
+      getRolesPermissions,
+      logout,
+      storageGet,
+      storageSave
+  } from '@/js/index'
   export default {
-    name: "Header2.0"
+    name: "Header2.0",
+    data(){
+      return {
+        user: {},
+        fullScreenLoading: true,
+        loginUrl: process.env.LOGIN_URL,
+        registerUrl: process.env.REGISTER_URL,
+        authInfo: {},
+        isShowAuthCheckingDialog: false,
+        isShowAuthRejectDialog: false,
+        isShowAuthPassDialog: false,
+        //loading: true,
+        openNavBar: false,
+        defaultValue: defaultValue,
+        userIdentity: '',
+        isLogin: false,
+        rolesPermissions: {}
+      }
+    },
+    watch: {
+        'user.authStatus' (val) {
+            this.user.authStatus = val
+            // console.log('changed')
+            // console.log(this.user.authStatus)
+        },
+        deep: true
+    },
+    methods: {
+        gotoHome(){
+            this.$router.push('/home');
+        },
+        openNavBarFunc () {
+            this.openNavBar = !this.openNavBar
+        },
+        setUserInfo () {
+            if (storageGet('user') == null) {
+                storageSave('rolesPermissions', {
+                    'isRegionManager': false,
+                    'isIndividualUser': false,
+                    'isEnterpriseUser': false,
+                    'isAgency': false,
+                    'isSystemAdministrator': false
+                });
+                console.log('本地没有用户信息,开始加载用户信息')
+                getCurrentUser().then((res) => {
+                    // console.log(res)
+                    storageSave('user', res)
+                    this.user = res
+                    this.rolesPermissions = getRolesPermissions(res.roleList)
+                    storageSave('rolesPermissions', getRolesPermissions(res.roleList))
+                    console.log('用户信息加载成功')
+                    this.isLogin = true
+                    this.fullScreenLoading = false
+                }).catch((error) => {
+                    console.log('用户信息加载失败')
+                    this.fullScreenLoading = false
+                })
+            } else {
+                this.user = storageGet('user')
+                this.fullScreenLoading = false
+                this.isLogin = true
+            }
+        },
+        getCurrentUserSuccess (res) {
+            // console.log(res)
+            storageSave('user', res)
+            this.user = res
+            this.rolesPermissions = getRolesPermissions(res.roleList)
+            storageSave('rolesPermissions', getRolesPermissions(res.roleList))
+            console.log('用户信息加载成功')
+            this.isLogin = true
+            this.fullScreenLoading = false
+        },
+        getCurrentUserFail (error) {
+            console.log('用户信息加载失败')
+            this.fullScreenLoading = false
+        },
+        userLogout () {
+            this.isLogin = false
+            logout().then((res) => {
+                // location.reload();
+                this.$router.push('/home')
+            })
+
+        },
+        showLoading () {
+            this.fullScreenLoading = true
+        },
+        hideLoading () {
+            this.fullScreenLoading = false
+        },
+        handleClickAuthReject () {
+            if (this.user.userVO.authType == 'agency') {
+                this.$router.push({
+                    name: 'AgencyAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }
+            if (this.user.userVO.authType == 'enterprise') {
+                this.$router.push({
+                    name: 'EnterpriseAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }
+            if (this.user.userVO.authType == 'personal') {
+                this.$router.push({
+                    name: 'IndividualAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }
+
+            //this.getAuthInfo()
+        },
+        handleClickAuthPass () {
+            if (this.user.personalAuthVO) {
+                this.$router.push({
+                    name: 'IndividualAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }else if (this.user.agencyVO) {
+                this.$router.push({
+                    name: 'AgencyAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }
+            else if (this.user.enterpriseAuthVO) {
+                this.$router.push({
+                    name: 'EnterpriseAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }
+
+            //this.getAuthInfo()
+        },
+        handleClickAuthChecking () {
+            //this.getAuthInfo()
+            if (this.user.userVO.authType == 'agency') {
+                this.$router.push({
+                    name: 'AgencyAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }
+            if (this.user.userVO.authType == 'enterprise') {
+                this.$router.push({
+                    name: 'EnterpriseAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }
+            if (this.user.userVO.authType == 'personal') {
+                this.$router.push({
+                    name: 'IndividualAuthentication',
+                    params: {userId: this.user.userVO.id}
+                })
+            }
+        },
+        showAuthRejectDialog () {
+            this.isShowAuthRejectDialog = true
+        },
+        showAuthPassDialog () {
+            this.isShowAuthPassDialog = true
+        },
+        showAuthCheckingDialog () {
+            this.isShowAuthCheckingDialog = true
+        },
+        hideAuthRejectDialog () {
+            this.isShowAuthRejectDialog = false
+        },
+        hideAuthPassDialog () {
+            this.isShowAuthPassDialog = false
+        },
+        hideAuthCheckingDialog () {
+            this.isShowAuthCheckingDialog = false
+        },
+        deleteOldAuthInfo () {
+            this.hideAuthCheckingDialog()
+            this.hideAuthRejectDialog()
+            this.hideAuthPassDialog()
+            this.showLoading()
+            deleteAuthInfo().then((res) => {
+                this.hideLoading()
+                notify('success', '成功删除认证信息')
+            }).catch((error) => {
+                this.hideLoading()
+                notify('error', '删除认证信息失败:' + error.data)
+            })
+        },
+        getAuthInfo () {
+            this.showLoading()
+            if (this.user.userVO.authType == 'agency') {
+                getCurrentAgencyAuthInfo(this.user.userVO.id, this.getCurrentAgencyAuthInfoSuccess, this.getCurrentAgencyAuthInfoFail)
+            }
+            if (this.user.userVO.authType == 'personal') {
+                getCurrentIndividualAuthenInfo(this.user.userVO.id, this.getCurrentIndividualAuthenInfoSuccess, this.getCurrentIndividualAuthenInfoFail)
+            }
+            if (this.user.userVO.authType == 'enterprise') {
+                getCurrentEnterpriseAuthInfo(this.user.userVO.id, this.getCurrentEnterpriseAuthInfoSuccess, this.getCurrentEnterpriseAuthInfoFail)
+            }
+        },
+        getCurrentAgencyAuthInfoSuccess () {
+            this.hideLoading()
+        },
+        getCurrentAgencyAuthInfoFail () {
+            this.hideLoading()
+        },
+        getCurrentIndividualAuthenInfoSuccess () {
+            this.hideLoading()
+        },
+        getCurrentIndividualAuthenInfoFail () {
+            this.hideLoading()
+        },
+        getCurrentEnterpriseAuthInfoSuccess () {
+            this.hideLoading()
+        },
+        getCurrentEnterpriseAuthInfoFail () {
+            this.hideLoading()
+        },
+        handleUpdateAuthInfo () {
+            this.hideAuthPassDialog()
+            this.hideAuthRejectDialog()
+            this.hideAuthCheckingDialog()
+            if (this.user.userVO.authType == 'personal') {
+                this.$router.push({
+                    name: 'IndividualAuthentication',
+                    params: {
+                        userId: this.authInfo.userId
+                    }
+                })
+            }
+            if (this.authInfo.type == 'enterprise') {
+                this.$router.push({
+                    name: 'EnterpriseAuthentication',
+                    params: {
+                        userId: this.authInfo.userId
+                    }
+                })
+            }
+            if (this.authInfo.type == 'agency') {
+                this.$router.push({
+                    name: 'AgencyAuthentication',
+                    params: {
+                        userId: this.authInfo.userId
+                    }
+                })
+            }
+        }
+    },
+    created () {
+        var self = this
+        this.$root.$on('user', function (val) {
+            self.user = val
+        })
+    },
+    beforeMount () {
+        this.setUserInfo()
+        // if (storageGet('user' != null)){
+        //   this.isLogin = true
+        // }
+        console.log(this.isLogin)
+    }
   }
 </script>
 

+ 33 - 0
src/components/commons/MidTab.vue

@@ -0,0 +1,33 @@
+<template>
+  <div class="nav" stype="height:50px">
+    <!--TabNav-->
+    <el-tabs :value="currTab" @tab-click="handleTabClick" class="square-tab" v-if="menuArr">
+      <el-tab-pane v-if="!menuArr.menuArr1" v-for="item in menuArr" :name="item.name" :key="item.name" class="tab-menu1">
+        <span slot="label" style="font-size: 18px">{{item.label}}</span>
+      </el-tab-pane>
+      <el-tab-pane v-if="menuArr.menuArr1" v-for="item in menuArr.menuArr1" :label="item.label" :name="item.name" :key="item.name"></el-tab-pane>
+<!--      <el-tab-pane v-if="menuArr.menuArr1" name="name"  class="tab-menu1" label="|">|</el-tab-pane>-->
+      <el-tab-pane v-if="menuArr.menuArr1" v-for="item in menuArr.menuArr2" :label="item.label" :name="item.name" :key="item.name"></el-tab-pane>
+      <el-tab-pane v-if="menuArr.menuArr1" v-for="item in menuArr.menuArr3" :label="item.label" :name="item.name" :key="item.name"></el-tab-pane>
+    </el-tabs>
+    <div>
+    </div>
+  </div>
+</template>
+
+
+<script>
+  import { mapGetters , mapActions} from 'vuex'
+  import  commonData  from '../../constants/tabMenu'
+  import Http from '@/js/http.js'
+  export default {
+    name: 'MidTab',
+    props: ['menuArr']
+  }
+
+</script>
+
+
+<style>
+
+</style>

+ 0 - 1
src/components/commons/SearchBar.vue

@@ -32,7 +32,6 @@
         <span slot="label" style="font-size: 18px">{{item.label}}</span>
       </el-tab-pane>
       <el-tab-pane v-if="menuArr.menuArr1" v-for="item in menuArr.menuArr1" :label="item.label" :name="item.name" :key="item.name"></el-tab-pane>
-<!--      <el-tab-pane v-if="menuArr.menuArr1" name="name"  class="tab-menu1" label="|">|</el-tab-pane>-->
       <el-tab-pane v-if="menuArr.menuArr1" v-for="item in menuArr.menuArr2" :label="item.label" :name="item.name" :key="item.name"></el-tab-pane>
       <el-tab-pane v-if="menuArr.menuArr1" v-for="item in menuArr.menuArr3" :label="item.label" :name="item.name" :key="item.name"></el-tab-pane>
     </el-tabs>

+ 103 - 0
src/components/commons/TopSearch.vue

@@ -0,0 +1,103 @@
+<template>
+  <div class="nav" stype="height:500px">
+    <!--搜索框-->
+    <el-row class="search-nav" style="padding: 30px 0 20px 0">
+      <el-col :span="6">
+        <div class="pull-left" @click="gotoHome" style="cursor: pointer">
+          <img class="logo-img" src="../../assets/img/logo-blue.png"/>
+          <span class="logo-title">群智众测平台</span>
+        </div>
+      </el-col>
+      <el-col :span="12">
+        <div class="search-nav">
+          <div id="search-block ">
+            <el-tabs v-model="searchType" type="card" @tab-click="handleTypeClick">
+              <el-tab-pane v-for="item in searchTypeArr" v-if="item.value!=='all'" :label="item.name" :name="item.value"
+                           :key="item.value"></el-tab-pane>
+            </el-tabs>
+            <div class="search-input">
+              <el-input placeholder="请输入内容" v-model="searchVal" class="input-with-select">
+                <el-button class="search-button" slot="append" type="primary" @click="handleSearchData">搜索</el-button>
+              </el-input>
+            </div>
+          </div>
+        </div>
+      </el-col>
+      <el-col :span="6">
+        <el-button type="primary pull-right" class="releaseBtn" @click="checkLogin()">免费发布众测需求</el-button>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+
+<script>
+    import {mapGetters, mapActions} from 'vuex'
+    import commonData from '../../constants/tabMenu'
+    import Http from '@/js/http.js'
+    import {storageGet} from '@/js/index.js'
+    import {notify} from "../../constants";
+
+    export default {
+        name: 'TopSearch',
+        props: ['searchVal','searchType','searchTypeArr'],
+        data() {
+            return {
+                isLogin: false,
+                resultList:[],
+            }
+        },
+
+        methods: {
+            loadData(){
+                if (storageGet('user') != null) {
+                    this.isLogin = true;
+                }
+            },
+            checkLogin(){
+                if(!this.isLogin){
+                    console.log("请登录后访问");
+                    notify('warning','请登录后访问');
+                }else{
+                    console.log("已登录");
+                    this.$router.push('/project/create');
+                }
+            },
+            handleSearchData() {
+                console.log(this.searchType);
+                let url = '/api/common/index/page';
+                let params = {
+                    "keyword": this.searchVal,
+                    "activePage": 1,
+                    "columnFilters": [
+                        {
+                            "field": "type",
+                            "type": "enums",
+                            "enums": this.searchTypeArr,
+                            "value": this.searchType
+                        }
+                    ]
+                }
+                Http.post(url, params).then((res) => {
+                    console.log(res.data.expertPage.content);
+                    resultList = res.data.expertPage.content;
+                })
+            },
+            gotoHome() {
+                this.$router.push('/home');
+            },
+            handleTypeClick(tab){
+                this.searchType = tab.name
+            },
+        },
+        mounted() {
+            this.loadData();
+        }
+    }
+
+</script>
+
+
+<style>
+
+</style>

+ 27 - 6
src/pages/Homepage/Homepage.vue

@@ -24,7 +24,8 @@
           </div>
         </el-col>
         <el-col :span="6">
-          <el-button type="primary pull-right" class="releaseBtn">免费发布众测需求</el-button>
+            <el-button type="primary pull-right" class="releaseBtn" @click="checkLogin()">免费发布众测需求</el-button>
+            <el-button type="primary pull-right" class="releaseBtn" @click="expertList()">专家列表</el-button>
         </el-col>
       </el-row>
       <!--TabNav-->
@@ -82,6 +83,8 @@
   import {mapActions,mapGetters} from 'vuex'
   import Waterfall from 'vue-waterfall/lib/waterfall'
   import WaterfallSlot from 'vue-waterfall/lib/waterfall-slot'
+  import {storageGet} from '@/js/index.js'
+  import {notify} from "../../constants";
   // console.log(commonData);
   export default {
     name: 'Homepage',
@@ -104,6 +107,7 @@
     },
     data() {
       return {
+        isLogin: false,
         searchType:'0',
         searchTypeArr:[
           {
@@ -115,12 +119,12 @@
             "value": "0"
           },
           {
-            "name": "工具",
-            "value": "1"
+              "name": "机构",
+              "value": "1"
           },
           {
-            "name": "机构",
-            "value": "2"
+              "name": "工具",
+              "value": "2"
           },
           {
             "name": "专家",
@@ -153,6 +157,9 @@
     },
     methods:{
       loadData(){
+        if (storageGet('user') != null) {
+            this.isLogin = true;
+        }
         Http.get('/api/common/index/info').then((res)=>{
           this.homeData = res.data;
           this.homeData.applicationTypeList.map((item)=>{
@@ -161,6 +168,18 @@
           })
         })
       },
+      checkLogin(){
+        if(!this.isLogin){
+            console.log("请登录后访问");
+            notify('warning','请登录后访问');
+        }else{
+            console.log("已登录");
+            this.$router.push('/project/create');
+        }
+      },
+      expertList(){
+          this.$router.push('/expert/list');
+      },
       handleTabClick(tab){
         this.currTab = tab.name;
         this.$router.push(this.homeTabArr.menuArr1[Number(tab.index)].linkTo);
@@ -183,7 +202,9 @@
           ]
         }
         Http.post(url,params).then((res)=>{
-          console.log(res);
+          if(this.searchType == 1){
+              this.$router.push({name: 'AgencyList'});
+          }
         })
 
       }

+ 60 - 2
src/pages/Homepage/HotAgency.vue

@@ -3,7 +3,7 @@
     <div slot="header" class="popular-header">
       <img src="../../assets/img/agency.png" alt="hot-crowd" class="popular-header-img"/>
       <span class="popular-header-title">评测机构排行榜</span>
-      <el-button style="float: right; padding: 3px 0;line-height: 25px" type="text">more>></el-button>
+      <el-button style="float: right; padding: 3px 0;line-height: 25px" type="text" @click="goToMoreAgency()">more>></el-button>
     </div>
     <div class="popular-list">
       <el-row class="popular-list-item" v-for="item in agencyRank" :key="item.id">
@@ -29,9 +29,67 @@
 </template>
 
 <script>
+  import Http from '@/js/http.js';
   export default {
     name: 'HotAgency',
-    props:['agencyRank']
+    props:['agencyRank'],
+    data() {
+        return {
+            agencyList:[],
+            searchType: '1',
+            searchVal: '',
+            searchTypeArr: [
+                {
+                    "name": "全部",
+                    "value": "all"
+                },
+                {
+                    "name": "项目",
+                    "value": "0"
+                },
+                {
+                    "name": "机构",
+                    "value": "1"
+                },
+                {
+                    "name": "工具",
+                    "value": "2"
+                },
+                {
+                    "name": "专家",
+                    "value": "3"
+                }
+            ],
+            // agencyList: [],
+            activePage: 1,
+            totalElements: 0
+        }
+    },
+    methods:{
+        goToMoreAgency(){
+            // let url = '/api/common/index/page';
+            // let params = {
+            //     "keyword": this.searchVal,
+            //     "activePage": this.activePage,
+            //     "columnFilters": [
+            //         {
+            //             "field": "type",
+            //             "type": "enums",
+            //             "enums": this.searchTypeArr,
+            //             "value": this.searchType
+            //         }
+            //     ]
+            // }
+            // Http.post(url, params).then((res) => {
+            //     console.log(res.data.agencyPage.content);
+            //     this.agencyList = res.data.agencyPage.content;
+            // })
+            this.$router.push({
+                name: 'AgencyList',
+                // params: {searchVal: this.searchVal, agencyList: this.agencyList}
+            });
+        },
+    }
   }
 </script>
 

+ 91 - 0
src/pages/HomepageSearch/AgencyCard.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="item-info">
+      <div class="item-img" ><img :src="card.agencyPhoto" class="item-img-info"/></div>
+      <div class="item-title" >
+        {{card.evaluationAgencyName ? card.evaluationAgencyName :card.introduction}}
+      </div>
+      <div class="item-content">
+        {{card.evaluationAgencyName}}
+      </div>
+      <div class="item-detail">
+        {{card.address}}
+      </div>
+  </div>
+
+</template>
+
+<script>
+  export default {
+    name: 'AgencyCard',
+    props: ['card'],
+    mounted() {
+        // console.log(this.card);
+    }
+  }
+</script>
+
+<style lang="less">
+  /*.item-info .el-card__body{*/
+  /*  padding: 0 !important;*/
+  /*}*/
+
+
+  .item-info {
+    width: 80%;
+    .item-img{
+      margin: 10px;
+      width: 50px;
+      height: 50px;
+      position: relative;
+      float: left;
+    }
+    .item-img-info{
+      width: 50px;
+      height: 50px;
+      position: relative;
+      float: left;
+    }
+    .item-title {
+      margin-top: 10px;
+      font-size:24px;
+      font-family:Source Han Sans CN;
+      font-weight:500;
+      color:rgba(0,0,0,1);
+      line-height:30px;
+      /*margin: 10px 0;*/
+      overflow:hidden; //超出的文本隐藏
+      text-overflow:ellipsis; //溢出用省略号显示
+      white-space:nowrap; //溢出不换行
+    }
+
+    .item-content {
+      font-size:14px;
+      font-family:Source Han Sans CN;
+      font-weight:400;
+      color:rgba(0,0,0,1);
+      height: 70px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      display:-webkit-box; //作为弹性伸缩盒子模型显示。
+      -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列
+      -webkit-line-clamp:3; //显示的行
+    }
+    .item-detail{
+      font-size:14px;
+      font-family:Source Han Sans CN;
+      font-weight:400;
+      color:rgba(0,0,0,1);
+      height: 70px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      display:-webkit-box; //作为弹性伸缩盒子模型显示。
+      -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列
+      -webkit-line-clamp:3; //显示的行
+    }
+
+  }
+
+  /*.item-title,.item-content,.item-detail{*/
+  /*  padding: 0 10px !important;*/
+  /*}*/
+</style>

+ 177 - 0
src/pages/HomepageSearch/AgencyList.vue

@@ -0,0 +1,177 @@
+<template>
+  <div class="home-wrapper">
+    <!--    <TopSearch :searchVal="searchVal" :searchType="searchType" :searchTypeArr="searchTypeArr"/>-->
+    <div class="nav" stype="height:500px">
+      <!--搜索框-->
+      <el-row class="search-nav" style="padding: 30px 0 20px 0">
+        <el-col :span="6">
+          <div class="pull-left" @click="gotoHome" style="cursor: pointer">
+            <img class="logo-img" src="../../assets/img/logo-blue.png"/>
+            <span class="logo-title">群智众测平台</span>
+          </div>
+        </el-col>
+        <el-col :span="12">
+          <div class="search-nav">
+            <div id="search-block ">
+              <el-tabs v-model="searchType" type="card" @tab-click="handleTypeClick">
+                <el-tab-pane v-for="item in searchTypeArr" v-if="item.value!=='all'" :label="item.name"
+                             :name="item.value"
+                             :key="item.value"></el-tab-pane>
+              </el-tabs>
+              <div class="search-input">
+                <el-input placeholder="请输入内容" v-model="searchVal" class="input-with-select">
+                  <el-button class="search-button" slot="append" type="primary" @click="handleSearchData">搜索</el-button>
+                </el-input>
+              </div>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="6">
+          <el-button type="primary pull-right" class="releaseBtn" @click="checkLogin()">免费发布众测需求</el-button>
+        </el-col>
+      </el-row>
+    </div>
+    <div class="container" style="margin: 20px auto;">
+      <div class="create-body" v-if="!isModifyMode">
+        <div class="title h2">入驻品牌机构</div>
+        <el-collapse accordion style="margin: 0 30px">
+          <el-collapse-item v-for="(item,index) in agencyList" :key="item.id" class="item-template">
+            <template slot="title">
+              <el-row style="width: 100%;font-size: 16px">
+                <el-col :span="8"><img :src="item.agencyPhoto" style="width: 50px; height: 50px;"></el-col>
+                <el-col :span="8">{{item.evaluationAgencyName}}</el-col>
+                <el-col :span="8">
+                  <el-tag type="success">{{item.address}}</el-tag>
+                </el-col>
+              </el-row>
+            </template>
+          </el-collapse-item>
+          <el-pagination
+            v-if="agencyList&&agencyList.length"
+            :page-size="9"
+            layout="prev, pager, next"
+            :total="totalElements"
+            :current-page="activePage"
+            @current-change="handlePageChange"
+            class="pull-right"
+          >
+          </el-pagination>
+        </el-collapse>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+    import Http from '@/js/http.js';
+    import TopSearch from "../../components/commons/TopSearch";
+    import AgencyCard from "./AgencyCard";
+    import {storageGet} from '@/js/index.js'
+    import {notify} from "../../constants";
+
+    export default {
+        name: "agencyList",
+        props: ['searchVal', 'agencyList'],
+        components: {AgencyCard, TopSearch},
+        data() {
+            return {
+                isLogin: false,
+                // searchVal: '',
+                searchType: '1',
+                searchTypeArr: [
+                    {
+                        "name": "全部",
+                        "value": "all"
+                    },
+                    {
+                        "name": "项目",
+                        "value": "0"
+                    },
+                    {
+                        "name": "机构",
+                        "value": "1"
+                    },
+                    {
+                        "name": "工具",
+                        "value": "2"
+                    },
+                    {
+                        "name": "专家",
+                        "value": "3"
+                    }],
+                // agencyList: [],
+                activePage: 1,
+                totalElements: 0
+            }
+        },
+        methods: {
+            loadData() {
+                if (storageGet('user') != null) {
+                    this.isLogin = true;
+                }
+                let url = '/api/common/index/page';
+                let params = {
+                    "keyword": this.searchVal,
+                    "activePage": this.activePage,
+                    "columnFilters": [
+                        {
+                            "field": "type",
+                            "type": "enums",
+                            "enums": this.searchTypeArr,
+                            "value": this.searchType
+                        }
+                    ]
+                }
+                Http.post(url, params).then((res) => {
+                    this.agencyList = res.data.agencyPage.content;
+                })
+            },
+            checkLogin() {
+                if (!this.isLogin) {
+                    console.log("请登录后访问");
+                    notify('warning', '请登录后访问');
+                } else {
+                    console.log("已登录");
+                    this.$router.push('/project/create');
+                }
+            },
+            handleSearchData() {
+                let url = '/api/common/index/page';
+                let params = {
+                    "keyword": this.searchVal,
+                    "activePage": 1,
+                    "columnFilters": [
+                        {
+                            "field": "type",
+                            "type": "enums",
+                            "enums": this.searchTypeArr,
+                            "value": this.searchType
+                        }
+                    ]
+                }
+                Http.post(url, params).then((res) => {
+                    this.agencyList = res.data.agencyPage.content;
+                })
+            },
+            gotoHome() {
+                this.$router.push('/home');
+            },
+            handleTypeClick(tab) {
+                this.searchType = tab.name
+            },
+            handlePageChange(index) {
+                this.activePage = index;
+                this.searchData();
+            }
+        },
+        mounted() {
+            this.loadData();
+        }
+    }
+</script>
+
+<style scoped>
+  .item-template {
+    height: 80px;
+  }
+</style>

+ 84 - 0
src/pages/HomepageSearch/ExpertCard.vue

@@ -0,0 +1,84 @@
+<template>
+  <el-card class="expert-card">
+    <div>
+      <div class="card-img" ><img src="../../assets/img/logo-blue.png" /></div>
+      <div class="card-title" >
+        {{card.name ? card.name :card.introduction}}
+      </div>
+      <div class="card-content">
+        {{card.introduction}}
+      </div>
+      <el-divider></el-divider>
+      <div class="card-detail">
+        {{card.introduction}}
+      </div>
+    </div>
+  </el-card>
+</template>
+
+<script>
+  export default {
+    name: 'ExpertCard',
+    props: ['card'],
+    mounted() {
+
+    }
+  }
+</script>
+
+<style lang="less">
+  .expert-card .el-card__body{
+    padding: 0 !important;
+  }
+
+
+  .expert-card {
+    .card-img{
+      margin: 10px;
+      position: relative;
+      float: left;
+    }
+    .card-title {
+      margin: 10px;
+      font-size:24px;
+      font-family:Source Han Sans CN;
+      font-weight:500;
+      color:rgba(0,0,0,1);
+      line-height:30px;
+      /*margin: 10px 0;*/
+      overflow:hidden; //超出的文本隐藏
+      text-overflow:ellipsis; //溢出用省略号显示
+      white-space:nowrap; //溢出不换行
+    }
+
+    .card-content {
+      font-size:14px;
+      font-family:Source Han Sans CN;
+      font-weight:400;
+      color:rgba(0,0,0,1);
+      height: 70px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      display:-webkit-box; //作为弹性伸缩盒子模型显示。
+      -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列
+      -webkit-line-clamp:3; //显示的行
+    }
+    .card-detail{
+      font-size:14px;
+      font-family:Source Han Sans CN;
+      font-weight:400;
+      color:rgba(0,0,0,1);
+      height: 70px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      display:-webkit-box; //作为弹性伸缩盒子模型显示。
+      -webkit-box-orient:vertical; //设置伸缩盒子的子元素排列方式--从上到下垂直排列
+      -webkit-line-clamp:3; //显示的行
+    }
+
+  }
+
+  .card-title,.card-content,.card-detail{
+    padding: 0 10px !important;
+  }
+</style>

+ 173 - 0
src/pages/HomepageSearch/ExpertList.vue

@@ -0,0 +1,173 @@
+<template>
+  <div class="home-wrapper">
+    <!--    <TopSearch :searchVal="searchVal" :searchType="searchType" :searchTypeArr="searchTypeArr"/>-->
+    <div class="nav" stype="height:500px">
+      <!--搜索框-->
+      <el-row class="search-nav" style="padding: 30px 0 20px 0">
+        <el-col :span="6">
+          <div class="pull-left" @click="gotoHome" style="cursor: pointer">
+            <img class="logo-img" src="../../assets/img/logo-blue.png"/>
+            <span class="logo-title">群智众测平台</span>
+          </div>
+        </el-col>
+        <el-col :span="12">
+          <div class="search-nav">
+            <div id="search-block ">
+              <el-tabs v-model="searchType" type="card" @tab-click="handleTypeClick">
+                <el-tab-pane v-for="item in searchTypeArr" v-if="item.value!=='all'" :label="item.name"
+                             :name="item.value"
+                             :key="item.value"></el-tab-pane>
+              </el-tabs>
+              <div class="search-input">
+                <el-input placeholder="请输入内容" v-model="searchVal" class="input-with-select">
+                  <el-button class="search-button" slot="append" type="primary" @click="handleSearchData">搜索</el-button>
+                </el-input>
+              </div>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="6">
+          <el-button type="primary pull-right" class="releaseBtn" @click="checkLogin()">免费发布众测需求</el-button>
+        </el-col>
+      </el-row>
+    </div>
+
+    <div class="container" style="margin: 20px auto;">
+      <el-row>
+        <el-col :span="18" class="">
+          <el-row :gutter="15" style="margin-bottom: 10px">
+            <el-col :span="8" v-for="(item,index) in expertList" :key="index" style="margin-bottom: 15px">
+              <ExpertCard :card="item"></ExpertCard>
+            </el-col>
+          </el-row>
+          <el-pagination
+            v-if="expertList&&expertList.length"
+            :page-size="9"
+            layout="prev, pager, next"
+            :total="totalElements"
+            :current-page="activePage"
+            @current-change="handlePageChange"
+            class="pull-right"
+          >
+          </el-pagination>
+        </el-col>
+        <!--      <el-col :span="6"  class="popular-modules" style="padding-left: 15px">-->
+        <!--        <PopularProject :hotCrowdTestProjectVOs="hotCrowdTestProjectVOs" style="margin-bottom: 15px"/>-->
+        <!--        <PopularTask :hotCrowdTaskVOs="hotCrowdTaskVOs"/>-->
+        <!--      </el-col>-->
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+    import Http from '@/js/http.js';
+    import TopSearch from "../../components/commons/TopSearch";
+    import ExpertCard from "./ExpertCard";
+    import {storageGet} from '@/js/index.js'
+    import {notify} from "../../constants";
+
+    export default {
+        name: "ExpertList",
+        props: ['searchVal'],
+        components: {ExpertCard, TopSearch},
+        data() {
+            return {
+                isLogin: false,
+                // searchVal: '',
+                searchType: '3',
+                searchTypeArr: [
+                    {
+                        "name": "全部",
+                        "value": "all"
+                    },
+                    {
+                        "name": "项目",
+                        "value": "0"
+                    },
+                    {
+                    "name": "机构",
+                    "value": "1"
+                },
+                {
+                    "name": "工具",
+                    "value": "2"
+                },
+                    {
+                        "name": "专家",
+                        "value": "3"
+                    }],
+                expertList: [],
+                activePage: 1,
+                totalElements: 0
+            }
+        },
+        methods: {
+            loadData() {
+                if (storageGet('user') != null) {
+                    this.isLogin = true;
+                }
+                let url = '/api/common/index/page';
+                let params = {
+                    "keyword": this.searchVal,
+                    "activePage": this.activePage,
+                    "columnFilters": [
+                        {
+                            "field": "type",
+                            "type": "enums",
+                            "enums": this.searchTypeArr,
+                            "value": this.searchType
+                        }
+                    ]
+                }
+                Http.post(url, params).then((res) => {
+                    this.expertList = res.data.expertPage.content;
+                })
+            },
+            checkLogin() {
+                if (!this.isLogin) {
+                    console.log("请登录后访问");
+                    notify('warning', '请登录后访问');
+                } else {
+                    console.log("已登录");
+                    this.$router.push('/project/create');
+                }
+            },
+            handleSearchData() {
+                let url = '/api/common/index/page';
+                let params = {
+                    "keyword": this.searchVal,
+                    "activePage": 1,
+                    "columnFilters": [
+                        {
+                            "field": "type",
+                            "type": "enums",
+                            "enums": this.searchTypeArr,
+                            "value": this.searchType
+                        }
+                    ]
+                }
+                Http.post(url, params).then((res) => {
+                    this.expertList = res.data.expertPage.content;
+                })
+            },
+            gotoHome() {
+                this.$router.push('/home');
+            },
+            handleTypeClick(tab) {
+                this.searchType = tab.name
+            },
+            handlePageChange(index) {
+                this.activePage = index;
+                this.searchData();
+            }
+        },
+        mounted() {
+            this.loadData();
+        }
+    }
+</script>
+
+<style scoped>
+
+</style>

+ 16 - 1
src/pages/Square/Square2.0.vue

@@ -24,7 +24,7 @@
           </div>
         </el-col>
         <el-col :span="6">
-          <el-button type="primary pull-right" class="releaseBtn">免费发布众测需求</el-button>
+          <el-button type="primary pull-right" class="releaseBtn" @click="checkLogin()">免费发布众测需求</el-button>
         </el-col>
       </el-row>
       <!--TabNav-->
@@ -70,11 +70,14 @@
   import SquareCard from './SquareCard'
   import PopularProject from './PopularProject'
   import PopularTask from './PopularTask'
+  import {storageGet} from '@/js/index.js'
+  import {notify} from "../../constants";
   import { mapActions ,mapGetters} from 'vuex';
   export default {
     name: 'Square2.0',
     data(){
       return {
+        isLogin: false,
         searchType:'project',
         searchVal: '',
         currTab:'squareHome',
@@ -126,6 +129,9 @@
       },
 
       loadData(){
+        if (storageGet('user') != null) {
+            this.isLogin = true;
+        }
         Http.get('/api/square/list').then((res)=>{
           let crowdTestProjectVOs = res.data.crowdTestProjectVOs;
           let crowdTestTaskVOS = res.data.crowdTestTaskVOS;
@@ -135,6 +141,15 @@
           this.projectAndTaskArr = projectAndTaskArr;
         })
       },
+      checkLogin(){
+          if(!this.isLogin){
+              console.log("请登录后访问");
+              notify('warning','请登录后访问');
+          }else{
+              console.log("已登录");
+              this.$router.push('/project/create');
+          }
+      },
       handleSearchData(){
         let url = '/api/square/search/list';
         let params = {

+ 19 - 1
src/pages/Technology/Technology2.0.vue

@@ -24,7 +24,7 @@
           </div>
         </el-col>
         <el-col :span="6">
-          <el-button type="primary pull-right" class="releaseBtn">免费发布众测需求</el-button>
+          <el-button type="primary pull-right" class="releaseBtn" @click="checkLogin()">免费发布众测需求</el-button>
         </el-col>
       </el-row>
       <!--TabNav-->
@@ -69,6 +69,8 @@
   import TechnologyMG from './TechnologyMG'
   import HotActicle from './HotActicle'
   import PopularProject from '../Square/PopularProject'
+  import {storageGet} from '@/js/index.js'
+  import {notify} from "../../constants";
   import qs from 'querystring'
   import { mapActions ,mapGetters} from 'vuex';
 
@@ -83,6 +85,7 @@
     },
     data(){
       return {
+        isLogin: false,
         searchVal: '',
         searchType:'',
         searchTypeArr:[
@@ -104,6 +107,20 @@
       }
     },
     methods:{
+      loadData(){
+          if (storageGet('user') != null) {
+              this.isLogin = true;
+          }
+      },
+      checkLogin(){
+          if(!this.isLogin){
+              console.log("请登录后访问");
+              notify('warning','请登录后访问');
+          }else{
+              console.log("已登录");
+              this.$router.push('/project/create');
+          }
+      },
       gotoHome(){
         this.$router.push('/home');
       },
@@ -156,6 +173,7 @@
       }
     },
     mounted() {
+      this.loadData();
       this.loadHotArticles();
       this.loadTechnologyArticles(1);
     }

+ 19 - 1
src/router/index.js

@@ -260,7 +260,25 @@ export default new Router({
       meta: {
         title: '',
         requireAuth: false,
-      },
+      }
+    },
+    {
+      path: '/expert/list',
+      name: 'ExpertList',
+      component: resolve => require(['@/pages/HomepageSearch/ExpertList.vue'], resolve),
+      meta: {
+        title: '',
+        requireAuth: false,
+      }
+    },
+    {
+      path: '/agency/list',
+      name: 'AgencyList',
+      component: resolve => require(['@/pages/HomepageSearch/AgencyList.vue'], resolve),
+      meta: {
+        title: '',
+        requireAuth: false,
+      }
     },
   ]
 })

+ 1 - 1
src/style/main.scss

@@ -91,7 +91,7 @@ a {
     border:none;
     border-left:5px solid $--color-primary;
     padding-left:10px;
-    margin-bottom:20px;
+    margin-bottom:30px;
 }
 
 /*