lrf402788946 4 years ago
parent
commit
3a72aedf83

+ 97 - 99
package-lock.json

@@ -1718,6 +1718,16 @@
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "dev": true
           "dev": true
         },
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1618552152737&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
+          "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
         "cacache": {
         "cacache": {
           "version": "13.0.1",
           "version": "13.0.1",
           "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1616431156987&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz",
           "resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz?cache=0&sync_timestamp=1616431156987&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcacache%2Fdownload%2Fcacache-13.0.1.tgz",
@@ -1744,6 +1754,53 @@
             "unique-filename": "^1.1.1"
             "unique-filename": "^1.1.1"
           }
           }
         },
         },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz",
+          "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
+          "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
+          "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz?cache=0&sync_timestamp=1618559744568&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-flag%2Fdownload%2Fhas-flag-4.0.0.tgz",
+          "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz",
+          "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "source-map": {
         "source-map": {
           "version": "0.6.1",
           "version": "0.6.1",
           "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1601546737481&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz",
           "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1601546737481&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz",
@@ -1760,6 +1817,16 @@
             "minipass": "^3.1.1"
             "minipass": "^3.1.1"
           }
           }
         },
         },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1618561027869&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
+          "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
         "terser-webpack-plugin": {
         "terser-webpack-plugin": {
           "version": "2.3.8",
           "version": "2.3.8",
           "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1610194199773&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz",
           "resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1610194199773&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz",
@@ -1776,6 +1843,18 @@
             "terser": "^4.6.12",
             "terser": "^4.6.12",
             "webpack-sources": "^1.4.3"
             "webpack-sources": "^1.4.3"
           }
           }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.2.0",
+          "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-16.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-16.2.0.tgz",
+          "integrity": "sha1-BGpTMI3Ufljv4g3ewe3sAnzjtG4=",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
+          }
         }
         }
       }
       }
     },
     },
@@ -2864,7 +2943,7 @@
     },
     },
     "buffer-equal-constant-time": {
     "buffer-equal-constant-time": {
       "version": "1.0.1",
       "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/buffer-equal-constant-time/download/buffer-equal-constant-time-1.0.1.tgz",
       "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
       "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
     },
     },
     "buffer-from": {
     "buffer-from": {
@@ -4599,8 +4678,8 @@
     },
     },
     "ecdsa-sig-formatter": {
     "ecdsa-sig-formatter": {
       "version": "1.0.11",
       "version": "1.0.11",
-      "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
-      "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+      "resolved": "https://registry.npm.taobao.org/ecdsa-sig-formatter/download/ecdsa-sig-formatter-1.0.11.tgz",
+      "integrity": "sha1-rg8PothQRe8UqBfao86azQSJ5b8=",
       "requires": {
       "requires": {
         "safe-buffer": "^5.0.1"
         "safe-buffer": "^5.0.1"
       }
       }
@@ -7031,8 +7110,8 @@
     },
     },
     "jsonwebtoken": {
     "jsonwebtoken": {
       "version": "8.5.1",
       "version": "8.5.1",
-      "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
-      "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+      "resolved": "https://registry.npm.taobao.org/jsonwebtoken/download/jsonwebtoken-8.5.1.tgz",
+      "integrity": "sha1-AOceC431TCEhofJhN98igGc7zA0=",
       "requires": {
       "requires": {
         "jws": "^3.2.2",
         "jws": "^3.2.2",
         "lodash.includes": "^4.3.0",
         "lodash.includes": "^4.3.0",
@@ -7048,8 +7127,8 @@
       "dependencies": {
       "dependencies": {
         "semver": {
         "semver": {
           "version": "5.7.1",
           "version": "5.7.1",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+          "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1616463550093&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz",
+          "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc="
         }
         }
       }
       }
     },
     },
@@ -7067,8 +7146,8 @@
     },
     },
     "jwa": {
     "jwa": {
       "version": "1.4.1",
       "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
-      "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+      "resolved": "https://registry.npm.taobao.org/jwa/download/jwa-1.4.1.tgz",
+      "integrity": "sha1-dDwymFy56YZVUw1TZBtmyGRbA5o=",
       "requires": {
       "requires": {
         "buffer-equal-constant-time": "1.0.1",
         "buffer-equal-constant-time": "1.0.1",
         "ecdsa-sig-formatter": "1.0.11",
         "ecdsa-sig-formatter": "1.0.11",
@@ -7077,8 +7156,8 @@
     },
     },
     "jws": {
     "jws": {
       "version": "3.2.2",
       "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
-      "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+      "resolved": "https://registry.npm.taobao.org/jws/download/jws-3.2.2.tgz?cache=0&sync_timestamp=1610085129426&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjws%2Fdownload%2Fjws-3.2.2.tgz",
+      "integrity": "sha1-ABCZ82OUaMlBQADpmZX6UvtHgwQ=",
       "requires": {
       "requires": {
         "jwa": "^1.4.1",
         "jwa": "^1.4.1",
         "safe-buffer": "^5.0.1"
         "safe-buffer": "^5.0.1"
@@ -7308,32 +7387,32 @@
     },
     },
     "lodash.includes": {
     "lodash.includes": {
       "version": "4.3.0",
       "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+      "resolved": "https://registry.npm.taobao.org/lodash.includes/download/lodash.includes-4.3.0.tgz",
       "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
       "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
     },
     },
     "lodash.isboolean": {
     "lodash.isboolean": {
       "version": "3.0.3",
       "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/lodash.isboolean/download/lodash.isboolean-3.0.3.tgz",
       "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
       "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
     },
     },
     "lodash.isinteger": {
     "lodash.isinteger": {
       "version": "4.0.4",
       "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+      "resolved": "https://registry.npm.taobao.org/lodash.isinteger/download/lodash.isinteger-4.0.4.tgz",
       "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
       "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
     },
     },
     "lodash.isnumber": {
     "lodash.isnumber": {
       "version": "3.0.3",
       "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+      "resolved": "https://registry.npm.taobao.org/lodash.isnumber/download/lodash.isnumber-3.0.3.tgz",
       "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
       "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
     },
     },
     "lodash.isplainobject": {
     "lodash.isplainobject": {
       "version": "4.0.6",
       "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "resolved": "https://registry.npm.taobao.org/lodash.isplainobject/download/lodash.isplainobject-4.0.6.tgz",
       "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
       "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
     },
     },
     "lodash.isstring": {
     "lodash.isstring": {
       "version": "4.0.1",
       "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/lodash.isstring/download/lodash.isstring-4.0.1.tgz",
       "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
       "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
     },
     },
     "lodash.kebabcase": {
     "lodash.kebabcase": {
@@ -7356,7 +7435,7 @@
     },
     },
     "lodash.once": {
     "lodash.once": {
       "version": "4.1.1",
       "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+      "resolved": "https://registry.npm.taobao.org/lodash.once/download/lodash.once-4.1.1.tgz",
       "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
       "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
     },
     },
     "lodash.transform": {
     "lodash.transform": {
@@ -11360,87 +11439,6 @@
         }
         }
       }
       }
     },
     },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.2.0",
-      "resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-16.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-16.2.0.tgz",
-      "integrity": "sha1-BGpTMI3Ufljv4g3ewe3sAnzjtG4=",
-      "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.npm.taobao.org/ansi-styles/download/ansi-styles-4.3.0.tgz?cache=0&sync_timestamp=1618552152737&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-4.3.0.tgz",
-          "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-4.1.0.tgz",
-          "integrity": "sha1-ThSHCmGNni7dl92DRf2dncMVZGo=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-2.0.1.tgz",
-          "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.4.tgz",
-          "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-4.0.0.tgz",
-          "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-2.0.0.tgz",
-          "integrity": "sha1-5MrOW4FtQloWa18JfhDNErNgZLA=",
-          "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.npm.taobao.org/supports-color/download/supports-color-7.2.0.tgz?cache=0&sync_timestamp=1611394043517&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-7.2.0.tgz",
-          "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
     "vue-meta": {
     "vue-meta": {
       "version": "2.4.0",
       "version": "2.4.0",
       "resolved": "https://registry.npm.taobao.org/vue-meta/download/vue-meta-2.4.0.tgz",
       "resolved": "https://registry.npm.taobao.org/vue-meta/download/vue-meta-2.4.0.tgz",

+ 12 - 0
src/router/index.js

@@ -99,6 +99,18 @@ const web = [
         meta: { title: '科技成果' },
         meta: { title: '科技成果' },
         component: () => import('../views/adminCenter/product/detail.vue'),
         component: () => import('../views/adminCenter/product/detail.vue'),
       },
       },
+      {
+        path: '/adminCenter/patent',
+        name: 'admin_patent',
+        meta: { title: '专利管理' },
+        component: () => import('../views/adminCenter/patent/index.vue'),
+      },
+      {
+        path: '/adminCenter/patent/detail',
+        name: 'admin_patent_detail',
+        meta: { title: '专利管理' },
+        component: () => import('../views/adminCenter/patent/detail.vue'),
+      },
     ],
     ],
   },
   },
 ];
 ];

+ 2 - 0
src/store/index.js

@@ -5,6 +5,7 @@ import * as umutations from '@common/src/store/user/mutations';
 import login from '@common/src/store/login';
 import login from '@common/src/store/login';
 import news from '@common/src/store/news';
 import news from '@common/src/store/news';
 import product from '@common/src/store/product';
 import product from '@common/src/store/product';
+import patent from '@common/src/store/patent';
 
 
 Vue.use(Vuex);
 Vue.use(Vuex);
 
 
@@ -16,5 +17,6 @@ export default new Vuex.Store({
     login,
     login,
     news,
     news,
     product,
     product,
+    patent,
   },
   },
 });
 });

+ 89 - 0
src/views/adminCenter/patent/detail.vue

@@ -0,0 +1,89 @@
+<template>
+  <div id="detail">
+    <data-form :fields="fields" :data="data" @save="toSave" returns="/adminCenter/news">
+      <template #options="{ item }">
+        <template v-if="item.model === 'column_name'">
+          <el-option v-for="(i, index) in typeList" :key="`columns-name-${index}`" :label="i" :value="i"></el-option>
+        </template>
+      </template>
+      <template #custom="{ item }">
+        <template v-if="item.model === 'img_url'">
+          <e-upload url="/files/cysci/news_image/upload" v-model="data[item.model]"></e-upload>
+        </template>
+      </template>
+    </data-form>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patent } = createNamespacedHelpers('patent');
+export default {
+  name: 'patentDetail',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      data: {
+        image: [],
+        fileUrl: [],
+      },
+      fields: [
+        { label: '申请号', model: 'create_number' },
+        { label: '申请日', model: 'create_date', type: 'date' },
+        { label: '公开(公告)号', model: 'success_number' },
+        { label: '公开(公告)日', model: 'success_date', type: 'date' },
+        { label: '标题', model: 'name' },
+        { label: '发明人', model: 'inventor' },
+        { label: '发明人地址', model: 'address' },
+        { label: '申请人', model: 'apply_personal' },
+        { label: '专利有效性', model: 'term' },
+        { label: '专利类型', model: 'type' },
+        { label: '代理人', model: 'agent_personal' },
+        { label: '代理机构', model: 'agent' },
+        { label: '摘要', model: 'abstract', type: 'textarea', options: { maxRows: 5, minRows: 3 } },
+        { label: '图片', model: 'img_url', custom: true },
+        { label: '数据来源', model: 'origin' },
+      ],
+    };
+  },
+  created() {
+    if (this.id) this.search();
+  },
+  methods: {
+    ...patent(['fetch', 'create', 'update']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `data`, res.data);
+      }
+    },
+    async toSave({ data }) {
+      let dup = _.cloneDeep(data);
+      let res;
+      if (_.get(dup, 'id')) {
+        res = await this.update(dup);
+      } else {
+        res = await this.create(dup);
+      }
+      if (this.$checkRes(res, '保存成功', '保存失败')) {
+        if (!this.$dev_mode) this.$router.push('/adminCenter/news');
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 83 - 0
src/views/adminCenter/patent/index.vue

@@ -0,0 +1,83 @@
+<template>
+  <div id="index">
+    <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @edit="toEdit" @delete="toDelete">
+      <template #selfbtn>
+        <el-button type="primary" size="mini" @click="toAdd">添加专利</el-button>
+      </template>
+    </data-table>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: patent } = createNamespacedHelpers('patent');
+export default {
+  name: 'patentIndex',
+  props: {},
+  components: {},
+  data: function () {
+    return {
+      list: [],
+      total: 0,
+      opera: [
+        {
+          label: '修改',
+          method: 'edit',
+        },
+        {
+          label: '删除',
+          method: 'delete',
+          type: 'danger',
+        },
+      ],
+      fields: [
+        { label: '申请号', prop: 'create_number', filter: true },
+        { label: '申请日', prop: 'create_date' },
+        { label: '公开(公告)号', prop: 'success_number' },
+        { label: '公开(公告)日', prop: 'success_date' },
+        { label: '标题', prop: 'name' },
+        { label: '发明人', prop: 'inventor' },
+        { label: '申请人', prop: 'apply_personal' },
+        { label: '专利有效性', prop: 'term' },
+        { label: '专利类型', prop: 'type' },
+      ],
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...patent(['query', 'delete']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      const res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    toAdd() {
+      this.$router.push('/adminCenter/patent/detail');
+    },
+    toEdit({ data }) {
+      this.$router.push({ path: '/adminCenter/patent/detail', query: { id: data._id } });
+    },
+    async toDelete({ data }) {
+      const res = await this.delete(data._id);
+      if (this.$checkRes(res, '删除成功', '删除失败')) {
+        this.search();
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 147 - 4
src/views/adminCenter/product/detail.vue

@@ -1,25 +1,168 @@
 <template>
 <template>
   <div id="detail">
   <div id="detail">
-    <p>detail</p>
+    <data-form :fields="fields" :data="data" @save="toSave" returns="/adminCenter/product" @filterReturn="toSelect">
+      <template #options="{ item }">
+        <template v-if="item.model === 'type'">
+          <el-option v-for="(i, index) in typeList" :key="`type-${index}`" :label="i.label" :value="i.value"></el-option>
+        </template>
+      </template>
+      <template #custom="{ item }">
+        <template v-if="item.model === 'image'">
+          <e-upload url="/files/cysci/product_image/upload" v-model="data[item.model]"></e-upload>
+        </template>
+        <template v-if="item.model === 'roadshow'">
+          <e-upload url="/files/cysci/product_roadshow/upload" v-model="data[item.model]" type="text"></e-upload>
+        </template>
+        <template v-if="item.model === 'patent'">
+          <el-row type="flex" justify="end" style="padding-bottom: 10px">
+            <el-col :span="2">
+              <el-button type="primary" @click="data[item.model].push({})">添加</el-button>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="8" v-for="(i, index) in data[item.model]" :key="`patent-${index}`">
+              <el-form-item label="专利信息">
+                <el-input v-model="i.patentinfo" placeholder="请填写专利信息"></el-input>
+              </el-form-item>
+              <el-form-item label="专利状态">
+                <el-input v-model="i.patentstatus" placeholder="请填写专利状态"></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-row type="flex" justify="space-around">
+                  <el-col :span="2">
+                    <el-button type="danger" @click="data[item.model].splice(index, 1)">删除</el-button>
+                  </el-col>
+                </el-row>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+      </template>
+    </data-form>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
+const _ = require('lodash');
+const { productType } = require('@common/dict/index');
 import { mapState, createNamespacedHelpers } from 'vuex';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: product } = createNamespacedHelpers('product');
 export default {
 export default {
   name: 'productDetail',
   name: 'productDetail',
   props: {},
   props: {},
   components: {},
   components: {},
   data: function () {
   data: function () {
-    return {};
+    return {
+      typeList: productType,
+      data: {
+        image: [],
+        roadshow: [],
+        patent: [],
+      },
+      fields: [],
+      fieldsPublic: [
+        { label: '名称', model: 'name' },
+        { label: '联系人', model: 'contacts' },
+        { label: '联系电话', model: 'phone' },
+        { label: 'qq&微信', model: 'qqwx' },
+        { label: '邮箱', model: 'email' },
+        { label: '类型', model: 'type', type: 'select', filterReturn: true },
+        // 共同
+        { label: '所属领域', model: 'field' },
+        { label: '合作方式', model: 'cooperation' },
+        { label: '企业名称', model: 'company' },
+        { label: '合作条件及要求', model: 'condition', type: 'textArea', options: { maxRows: 5, minRows: 3 } },
+        { label: '图片', model: 'image', custom: true },
+        { label: '预期', model: 'expect' },
+        { label: '需求程度', model: 'demand' },
+      ],
+
+      // 科技需求
+      fields0: [
+        { label: '投资预算', model: 'budget' },
+        { label: '需求说明', model: 'requirementdesc', options: { maxRows: 5, minRows: 3 } },
+        { label: '需求现状', model: 'present' },
+      ],
+      // 技术成果
+      fields1: [
+        { label: '成果状态', model: 'achievestatus' },
+        { label: '成果权属', model: 'achieveown' },
+        { label: '成果来源', model: 'achievesource' },
+        { label: '意向价格', model: 'intentionprice' },
+        { label: '专利', model: 'patent', custom: true },
+        { label: '项目路演', model: 'roadshow', custom: true },
+        { label: '成果简介', model: 'achievebrief', options: { maxRows: 5, minRows: 3 } },
+        { label: '技术特点', model: 'features', options: { maxRows: 5, minRows: 3 } },
+        { label: '技术团队', model: 'team', options: { maxRows: 5, minRows: 3 } },
+      ],
+      // 商务需求
+      fields2: [
+        { label: '信息属性', model: 'messattribute' },
+        { label: '信息描述', model: 'informationdesc' },
+        { label: '核心要素', model: 'coreelements' },
+        { label: '价格信息', model: 'priceinfo' },
+      ],
+    };
+  },
+  created() {
+    this.$set(this, 'fields', this.fieldsPublic);
+    if (this.id) this.search();
+  },
+  methods: {
+    ...product(['fetch', 'create', 'update']),
+    toSelect({ data, model }) {
+      if (model === 'type') {
+        const fields = _.get(this, `fields${data}`);
+        if (fields) {
+          const dup = _.cloneDeep(this.fieldsPublic);
+          const last = dup.concat(fields);
+          this.$set(this, 'fields', last);
+        }
+      }
+    },
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `data`, res.data);
+        const { type } = res.data;
+        if (type) this.toSelect({ data: type, model: 'type' });
+      }
+    },
+    async toSave({ data }) {
+      let dup = _.cloneDeep(data);
+      // 需要根据type,过滤出对应的数据
+      dup = this.filterData(dup);
+      let res;
+      if (_.get(dup, 'id')) {
+        res = await this.update(dup);
+      } else {
+        res = await this.create(dup);
+      }
+      if (this.$checkRes(res, '保存成功', '保存失败')) {
+        if (!this.$dev_mode) this.$router.push('/adminCenter/product');
+      }
+    },
+    filterData(data) {
+      const { type, id } = data;
+      const publics = _.cloneDeep(this.fieldsPublic);
+      const fields = _.get(this, `fields${type}`, []);
+      const keys = publics.map((i) => i.model).concat(fields.map((i) => i.model));
+      const obj = {};
+      for (const key of keys) {
+        if (data[key]) obj[key] = data[key];
+      }
+      if (id) obj.id = id;
+      return obj;
+    },
   },
   },
-  created() {},
-  methods: {},
   computed: {
   computed: {
     ...mapState(['user', 'menuParams']),
     ...mapState(['user', 'menuParams']),
     pageTitle() {
     pageTitle() {
       return `${this.$route.meta.title}`;
       return `${this.$route.meta.title}`;
     },
     },
+    id() {
+      return this.$route.query.id;
+    },
   },
   },
   metaInfo() {
   metaInfo() {
     return { title: this.$route.meta.title };
     return { title: this.$route.meta.title };

+ 6 - 0
src/views/adminCenter/product/index.vue

@@ -4,6 +4,11 @@
       <template #selfbtn>
       <template #selfbtn>
         <el-button type="primary" size="mini" @click="toAdd">添加</el-button>
         <el-button type="primary" size="mini" @click="toAdd">添加</el-button>
       </template>
       </template>
+      <template #options="{ item }">
+        <template v-if="item.prop === 'type'">
+          <el-option v-for="(i, index) in typeList" :key="`type-${index}`" :label="i.label" :value="i.value"></el-option>
+        </template>
+      </template>
     </data-table>
     </data-table>
   </div>
   </div>
 </template>
 </template>
@@ -42,6 +47,7 @@ export default {
             if (r) return r.label;
             if (r) return r.label;
             return '';
             return '';
           },
           },
+          filter: 'select',
         },
         },
         { label: '所属领域', prop: 'field' },
         { label: '所属领域', prop: 'field' },
         { label: '联系人', prop: 'contacts' },
         { label: '联系人', prop: 'contacts' },