浏览代码

产品和产品类别详情以及产品营销数据

zhuliu 1 年之前
父节点
当前提交
d9a45d98e9

+ 24 - 1
src/api/newApi/product.js

@@ -51,6 +51,29 @@ export default {
     return axios.post("/xiaoshi/product/deleteProduct", data);
   },
  
-  
+  /**
+   * 新增产品营销数据
+   */
+  addProductMarketData(data) {
+    return axios.post("/xiaoshi/productMarketData/addProductMarketData", data);
+  },
+  /**
+   * 修改产品营销数据
+   */
+  updateProductMarketDat(data) {
+    return axios.post("/xiaoshi/productMarketData/updateProductMarketDat", data);
+  },
+  /**
+   * 查询产品营销数据
+   */
+  queryProductMarketData(data) {
+    return axios.post("/xiaoshi/productMarketData/queryProductMarketData", data);
+  },
+  /**
+   * 删除产品营销数据
+   */
+  deleteProductMarketData(data) {
+    return axios.post("/xiaoshi/productMarketData/deleteProductMarketData", data);
+  },
   
 };

+ 11 - 7
src/router/index.js

@@ -140,6 +140,7 @@ const routes = [
         children:[
           {
             path:'/',
+            name:'/',
             meta: {
               title: '产品',
               sign:'product',
@@ -147,13 +148,16 @@ const routes = [
             },
             component: () => import('@/views/product/index.vue'),
           },
-      //     {
-      //       path: "/productDetails",
-      //       meta: {
-      //        title: '产品详情',
-      //       },
-      //       component: () => import('@/views/product/components/productDetails'),
-      //     },
+          {
+            path: "/productDetails",
+            name:'productDetails',
+            meta: {
+              title: '详情',
+              sign:'productDetails',
+              belong:'Product'
+            },
+            component: () => import('@/views/product/components/details'),
+          },
       //     {
       //       path: "/categoryDetails",
       //       meta: {

+ 9 - 1
src/utils/model/index.js

@@ -19,6 +19,10 @@ import myCascader from './Cascader/index'
 import myNodeCopy from './nodeCopy/index'
 import myTooltip from './tooltip/index'
 
+//tab
+import myTabs from './tabs/index'
+import myTabsItem from './tabs/tabsItem'
+
 var models = {
   myCustomSvg,
   myTree,
@@ -38,7 +42,11 @@ var models = {
   myUpload,
   myCascader,
   myNodeCopy,
-  myTooltip
+  myTooltip,
+
+  //tab
+  myTabs,
+  myTabsItem
 }
 export default {
   install(Vue) {

+ 176 - 53
src/utils/model/route.vue

@@ -1,60 +1,183 @@
 <template>
-  <div class="editable-div" contenteditable="true" @paste="handlePaste" ref="editableDiv"></div>
+  <svg
+    id="SvgjsSvg1006"
+    width="348"
+    height="155"
+    xmlns="http://www.w3.org/2000/svg"
+    version="1.1"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:svgjs="http://svgjs.com/svgjs"
+  >
+    <defs id="SvgjsDefs1007">
+      <pattern
+        patternUnits="userSpaceOnUse"
+        id="pattern_mark_0"
+        width="300"
+        height="300"
+      >
+        <text
+          x="150"
+          y="100"
+          fill="rgba(229,229,229,0.8)"
+          font-size="18"
+          transform="rotate(-45, 150, 150)"
+          style="dominant-baseline: middle; text-anchor: middle"
+        ></text>
+      </pattern>
+      <pattern
+        patternUnits="userSpaceOnUse"
+        id="pattern_mark_1"
+        width="300"
+        height="300"
+      >
+        <text
+          x="150"
+          y="200"
+          fill="rgba(229,229,229,0.8)"
+          font-size="18"
+          transform="rotate(-45, 150, 150)"
+          style="dominant-baseline: middle; text-anchor: middle"
+        ></text>
+      </pattern>
+    </defs>
+    <rect
+      id="svgbackgroundid"
+      width="348"
+      height="155"
+      fill="transparent"
+    ></rect>
+    <rect
+      id="SvgjsRect1009"
+      width="348"
+      height="155"
+      fill="url(#pattern_mark_0)"
+    ></rect>
+    <rect
+      id="SvgjsRect1010"
+      width="348"
+      height="155"
+      fill="url(#pattern_mark_1)"
+    ></rect>
+    <g id="SvgjsG1011" transform="translate(25,25)">
+      <path
+        id="SvgjsPath1012"
+        d="M 0 0L 298 0L 298 105L 0 105Z"
+        stroke="rgba(255,255,255,1)"
+        stroke-width="1.5"
+        fill-opacity="1"
+        fill="#ffffff"
+      ></path>
+      <g id="SvgjsG1013">
+        <text
+          id="SvgjsText1014"
+          font-family="微软雅黑"
+          text-anchor="middle"
+          font-size="13px"
+          width="278px"
+          fill="#323232"
+          font-weight="400"
+          align="middle"
+          lineHeight="125%"
+          anchor="middle"
+          family="微软雅黑"
+          size="13px"
+          weight="400"
+          font-style=""
+          opacity="1"
+          y="41.875"
+          transform="rotate(0)"
+        ></text>
+      </g>
+    </g>
+    <g id="SvgjsG1015" transform="translate(25,25)">
+      <path
+        id="SvgjsPath1016"
+        d="M 0 0L 100 0L 100 105L 0 105Z"
+        stroke="none"
+        fill="none"
+      ></path>
+      <g id="SvgjsG1017" >
+        <rect  width="100px" height="100px"
+          fill="white"></rect>
+        <text
+          id="SvgjsText1018"
+          font-family="微软雅黑"
+          text-anchor="start"
+          dominant-baseline="middle"
+          font-size="13px"
+          width="100px"
+          height="100px"
+          fill="#323232"
+          font-weight="400"
+          align="middle"
+          lineHeight="200%"
+          anchor="start"
+          family="微软雅黑"
+          size="13px"
+          weight="400"
+          font-style=""
+          opacity="1"
+          y="6"
+          transform="rotate(0)"
+          
+        >
+         数据库
+        </text>
+      </g>
+    </g>
+    <g id="SvgjsG1025" transform="translate(137,25)">
+      <path
+        id="SvgjsPath1026"
+        d="M 0 0L 186 0L 186 105L 0 105Z"
+        stroke="none"
+        fill="none"
+      ></path>
+      <g id="SvgjsG1027">
+        <text
+          id="SvgjsText1028"
+          font-family="微软雅黑"
+          text-anchor="end"
+          font-size="13px"
+          width="186px"
+          fill="#323232"
+          font-weight="400"
+          align="middle"
+          lineHeight="200%"
+          anchor="end"
+          family="微软雅黑"
+          size="13px"
+          weight="400"
+          font-style=""
+          opacity="1"
+          y="6"
+          transform="rotate(0)"
+        >
+          <tspan id="SvgjsTspan1029" dy="26" x="186">
+            <tspan id="SvgjsTspan1030" style="">10</tspan>
+          </tspan>
+       
+          <tspan id="SvgjsTspan1033" dy="26" x="186">
+            <tspan id="SvgjsTspan1034" style="">30</tspan>
+          </tspan>
+        </text>
+      </g>
+    </g>
+  </svg>
 </template>
 
 <script>
 export default {
-  methods: {
-    handlePaste(event) {
-      event.preventDefault();
-
-      const clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
-      let items = clipboardData.items;
-      let dedalock = 1;
-      const target = this.$refs.editableDiv;
-      for (const item of items) {
-        if(dedalock == 2) {
-          break
-        }else if(dedalock == 1) {
-          dedalock = 2;
-        }
-        if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
-          const file = item.getAsFile();
-          const reader = new FileReader();
-
-          reader.onload = () => {
-            const img = document.createElement('img');
-            img.src = reader.result;
-            target.appendChild(img);
-          };
-
-          reader.readAsDataURL(file);
-        } else if (item.kind === 'string') {
-          debugger
-          item.getAsString((text) => {
-            const regex = /<img src="(.*?)"/;
-            const match = text.match(regex);
-
-            if (match) {
-              const img = document.createElement('img');
-              img.src = match[1];
-              target.appendChild(img);
-            } else {
-              console.log(text);
-              document.execCommand('insertText', false, text);
-            }
-          });
-        }
-      }
-    }
-  }
+  components: {},
+  props: {},
+  data() {
+    return {};
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {},
 };
 </script>
-
-<style scoped>
-.editable-div {
-  border: 1px solid #ccc;
-  padding: 10px;
-  min-height: 100px;
-}
-</style>
+<style lang="scss" scoped>
+</style>

+ 312 - 0
src/utils/model/tabs/index.vue

@@ -0,0 +1,312 @@
+<template>
+    <div class="tabs" :class="{'tabs-border': showBorder}">
+      <div :class="'tabs-' + getTabsType() + '-bar'">
+        <div v-for="(item,index) in navList" :class="tabCls(item)" @click="handleChange(index)" :style="getTabFontStyle()">
+          {{ item.label }}
+          <span v-if="ifShowClose(item)" class="close icon" @click.stop="closeTab(index)" />
+        </div>
+      </div>
+      <div class="tabs-content">
+        <slot />
+      </div>
+    </div>
+</template>
+  
+  <script>
+  export default {
+    props: {
+      value: {
+        type: [String, Number]
+      },
+      border: {
+        type: Boolean,
+        default: false
+      },
+      tabsType: {
+        type: String,
+        default: 'tab'
+      },
+      fontSize: {
+        type: [String, Number],
+        default: 16
+      },
+      fontColor: {
+        type: String,
+        default: '#000000'
+      }
+    },
+    data() {
+      return {
+        defType: ['tab', 'card', 'card2', 'brief'],
+        currentValue: this.value,
+        showBorder: this.border,
+        navList: []
+      }
+    },
+    watch: {
+      value: function(val) {
+        this.currentValue = val
+      },
+      currentValue: function() {
+        this.updateStatus()
+      }
+    },
+    methods: {
+      tabCls: function(item) {
+        var active = ''
+        var tabsType = this.getTabsType()
+        var tabsBaseClass = 'tabs-' + tabsType
+  
+        if (item.name === this.currentValue) {
+          active = 'tabs-' + tabsType + '-active'
+        }
+  
+        return [
+          tabsBaseClass,
+          active
+        ]
+      },
+      getTabs() {
+        // 通过遍历子组件,得到所有的pane组件
+        return this.$children.filter(function(item) {
+          return item.$options.name === 'Pane' || item.$options.name === 'pane'
+        })
+      },
+      updateNav() {
+        this.navList = []
+        var _this = this
+        this.getTabs().forEach(function(pane, index) {
+          _this.navList.push({
+            label: pane.label,
+            name: pane.name || index,
+            closable: pane.closable
+          })
+          if (!pane.name) {
+            pane.name = index
+          }
+          if (index == 0) {
+            if (!_this.currentValue) {
+              _this.currentValue = pane.name || index
+            }
+          }
+        })
+        this.updateStatus()
+      },
+      updateStatus() {
+        var _this = this
+        // 显示当前选中的tab对应的pane组件
+        _this.getTabs().forEach(function(tab) {
+          tab.show = tab.name === _this.currentValue
+          // return
+        })
+      },
+      handleChange: function(index) {
+        var nav = this.navList[index]
+        var name = nav.name
+        // 更新当前选择的tab
+        this.currentValue = name
+        // 更新value
+        this.$emit('input', name)
+      },
+      ifShowClose(item) {
+        // 是否显示关闭标签按钮
+        return item.closable
+      },
+      // 点击关闭按钮触发的事件
+      closeTab(index) {
+        // console.log(this.navList[index].name, this.currentValue);
+        // 如果关闭的是当前选择的tab,则将currentValue转到前一个tab
+        if (this.navList[index].name == this.currentValue) {
+          let toIndex = index - 1
+          toIndex = toIndex >= 0 ? toIndex : this.navList.length + toIndex
+          console.log(toIndex)
+          this.currentValue = this.navList[toIndex].name
+        }
+        // 关闭当前标签页
+        this.navList.splice(index, 1)
+      },
+      // 根据组件属性tabsType 设置tabs头部样式
+      getTabsType() {
+        if (this.$data.defType.indexOf(this.tabsType) === -1) {
+          return 'tab'
+        }
+        return this.tabsType
+      },
+      // 根据组件属性fontSize 设置tab 字体大小和颜色
+      getTabFontStyle() {
+        if (!/^#[0-9a-fA-F]{6}$/.test(this.fontColor)) {
+          this.fontColor = '#000000'
+        }
+        if (!/^[1-3][0-9]$/.test(this.fontSize) || this.fontSize < 12) {
+          this.fontSize = 16
+        }
+        return 'font-size: ' + this.fontSize + 'px; color: ' + this.fontColor
+      }
+    }
+  }
+  </script>
+<style lang="scss" scoped>
+  [v-cloak] {
+    display: none;
+}
+.tabs {
+    margin: 3px;
+    font-size: 14px;
+    color: #657180;
+}
+.tabs-border {
+    border-width: 1px;
+    border-radius: 2px;
+    border-style: solid;
+    border-color: #e6e6e6;
+    box-shadow: 0 2px 5px 0 rgb(0 0 0 / 10%)
+}
+.tabs-tab-bar:after {
+    content: '';
+    width: 100%;
+    height: 1px;
+    display: block;
+    margin-top: -1px;
+    background: #d7dde4;
+}
+.tabs-tab {
+    cursor: pointer;
+    padding: 6px 16px;
+    margin-right: 6px;
+    background: #fff;
+    position: relative;
+    display: inline-block;
+    border: 1px solid #d7dde4;
+}
+.tabs-tab-active {
+    color: #3399ff;
+    border-top: 1px solid #3399ff;
+    border-bottom: 1px solid #fff;
+}
+.tabs-tab-active:before {
+    content: '';
+    top: 0;
+    left: 0;
+    right: 0;
+    height: 1px;
+    display: block;
+    position: absolute;
+    background: #3399ff;
+}
+/*brief 风格的tabs 样式 start*/
+.tabs-brief-bar:after {
+    content: '';
+    width: 100%;
+    height: 1px;
+    display: block;
+    margin-top: -1px;
+    background: #d7dde4;
+}
+.tabs-brief {
+    cursor: pointer;
+    padding: 8px 16px;
+    background: #fff;
+    position: relative;
+    display: inline-block;
+}
+.tabs-brief-active {
+    border-top: none;
+    font-weight: 800;
+    color: #3399ff !important;
+    border-bottom: 1px solid #d7dde4;
+}
+.tabs-brief-active:after {
+    content: '';
+    left: 0;
+    right: 0;
+    height: 2px;
+    bottom: -3px;
+    display: block;
+    position: absolute;
+    background: #3399ff;
+}
+/*brief 风格的tabs 样式 end*/
+
+/*card 风格的tabs 样式 start*/
+.tabs-card-bar {
+    background: #F1F1F1;
+}
+.tabs-card {
+    cursor: pointer;
+    padding: 8px 16px;
+    position: relative;
+    display: inline-block;
+}
+.tabs-card-active {
+    font-weight: 800;
+    color: #3399ff !important;
+}
+/*card 风格的tabs 样式 end*/
+
+/*card2 风格的tabs 样式 start*/
+.tabs-card2-bar {
+    background: #F1F1F1;
+}
+.tabs-card2 {
+    cursor: pointer;
+    padding: 8px 16px;
+    position: relative;
+    display: inline-block;
+}
+.tabs-card2-active {
+    font-weight: 800;
+    background: #ffffff;
+}
+/*card 风格的tabs 样式 end*/
+
+.tabs-content {
+    min-height: 100px;
+    padding: 6px;
+}
+.pane {
+    height: 0;
+    width: 100%;
+    visibility: hidden;
+    transition: all .5s ease-in;
+    transform: translateX(-100%);
+}
+.pane-active {
+    visibility: visible;
+    transform: translateX(0);
+}
+
+/* 关闭按钮样式 start*/
+.close.icon {
+    width: 11px;
+    height: 11px;
+    color: #000;
+    margin-left: 5px;
+    border-radius: 50%;
+    position: relative;
+    display: inline-block;
+}
+.close.icon:hover {
+    background: #eee;
+}
+.close.icon:before {
+    content: '';
+    top: 5px;
+    width: 11px;
+    height: 1px;
+    position: absolute;
+    background-color: currentColor;
+    -webkit-transform: rotate(-45deg);
+    transform: rotate(-45deg);
+}
+.close.icon:after {
+    content: '';
+    top: 5px;
+    width: 11px;
+    height: 1px;
+    position: absolute;
+    background-color: currentColor;
+    -webkit-transform: rotate(45deg);
+    transform: rotate(45deg);
+}
+/* 关闭按钮样式 end*/
+  </style>

+ 54 - 0
src/utils/model/tabs/tabsItem.vue

@@ -0,0 +1,54 @@
+<template>
+    <div :class="getCls()">
+        
+      <slot />
+    </div>
+</template>
+  
+  <script>
+  export default {
+    props: {
+      name: {
+        type: String
+      },
+      label: {
+        type: String,
+        default: ''
+      },
+      closable: {
+        type: Boolean,
+        default: false
+      }
+    },
+    data: function() {
+      return {
+        show: true
+      }
+    },
+    watch: {
+      label() {
+        this.updateNav()
+      }
+    },
+    mounted() {
+      this.updateNav()
+    },
+    methods: {
+      updateNav() {
+        this.$parent.updateNav()
+      },
+      // 决定pane是否显示
+      getCls() {
+        return [
+          'pane',
+          {
+            'pane-active': this.show
+          }
+        ]
+      }
+    }
+  }
+  </script>
+  
+  <style scoped>
+  </style>

+ 4 - 2
src/views/event/components/view/table.vue

@@ -13,7 +13,9 @@
         sortable="custom">
         <template slot-scope="scope">
           <div v-if="['name', 'reportProjectNum', 'patentProjectNum'].includes(item.value)">
-            <el-link @click="handleItem(scope.row, item.value)" v-html="$commonJS.getColumnData(scope.row, item)"></el-link>
+            <el-link @click="handleItem(scope.row, item.value)" >
+              <span v-html="$commonJS.getColumnData(scope.row, item)"></span>
+            </el-link>
           </div>
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)"></div>
         </template>
@@ -204,6 +206,7 @@ export default {
 
     getList() {
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.params.current * this.params.size >= this.params.total) {
         this.isMore = true
         this.disabled = true
@@ -212,7 +215,6 @@ export default {
           this.isFlag = false
         }, 1000)
       }
-      if (this.disabled) return;
       this.params.current += 1
       let params = {
         ...this.params,

+ 2 - 1
src/views/patentMining/components/view/commonTable.vue

@@ -154,6 +154,7 @@ export default {
 
     getList() {
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.params.current * this.params.size >= this.params.total) {
         this.isMore = true
         this.disabled = true
@@ -162,7 +163,7 @@ export default {
           this.isFlag = false
         }, 1000)
       }
-      if (this.disabled) return;
+      
       this.params.current += 1
       let params = {
         ...this.params,

+ 170 - 0
src/views/product/components/details/components/basicMessage.vue

@@ -0,0 +1,170 @@
+<template>
+  <div v-loading="loading">
+    <el-form v-if="type == '产品类别'" :model="row" label-width="110px" style="margin:0 auto;width:50%">
+        <el-form-item label="类别名称" prop="name">
+          <myTooltip :content="row.name" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'name'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="参考许可费率" prop="licenseRate">
+          <myTooltip :content="row.licenseRate+''" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'licenseRate'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="管理人" prop="adminPersons">
+          <myTooltip :content="$commonJS.getColumnData(row, {type:'Array',value:'adminPersons'},'name')" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'Array',value:'adminPersons'},'name')"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="谁可以看" prop="persons">
+          <myTooltip :content="$commonJS.getColumnData(row, {type:'Array',value:'persons'},'name')">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'Array',value:'persons'},'name')"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="图片">
+          <span v-if="row.systemFileList && row.systemFileList.length>0" class="avatar">
+            <el-image ref="image" style="width:148px;height:148px;" :src="$commonJS.checkViewer(row.systemFileList[0].guid)" :preview-src-list="[$commonJS.checkViewer(row.systemFileList[0].guid)]"></el-image>
+          </span>
+        </el-form-item>
+        <el-form-item label="创建人" prop="createName">
+          <myTooltip :content="row.createName">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'createName'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createTime">
+          <myTooltip :content="row.createTime">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'createTime'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <myTooltip :content="row.description">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'description'})"></div>
+          </myTooltip>
+        </el-form-item>
+    </el-form>
+
+    <el-form v-else :model="row" label-width="110px" style="margin:0 auto;width:50%">
+        <!-- <el-form-item label="所属产品类别" prop="name">
+          <myTooltip :content="row.name" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'name'})"></div>
+          </myTooltip>
+        </el-form-item> -->
+        <el-form-item label="产品名称" prop="name">
+          <myTooltip :content="row.name" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'name'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="上市时间" prop="marketTime">
+          <myTooltip :content="row.marketTime" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'marketTime'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="所属公司" prop="companyName">
+          <myTooltip :content="row.companyName" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'companyName'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="参考许可费率" prop="licenseRate">
+          <myTooltip :content="row.licenseRate+''" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'licenseRate'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="管理人" prop="adminPersons">
+          <myTooltip :content="$commonJS.getColumnData(row, {type:'Array',value:'adminPersons'},'name')" >
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'Array',value:'adminPersons'},'name')"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="谁可以看" prop="persons">
+          <myTooltip :content="$commonJS.getColumnData(row, {type:'Array',value:'persons'},'name')">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'Array',value:'persons'},'name')"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="图片">
+          <span v-if="row.systemFileList && row.systemFileList.length>0" class="avatar">
+            <el-image ref="image" style="width:148px;height:148px;" :src="$commonJS.checkViewer(row.systemFileList[0].guid)" :preview-src-list="[$commonJS.checkViewer(row.systemFileList[0].guid)]"></el-image>
+          </span>
+        </el-form-item>
+        <el-form-item label="创建人" prop="createName">
+          <myTooltip :content="row.createName">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'createName'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="创建时间" prop="createTime">
+          <myTooltip :content="row.createTime">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'createTime'})"></div>
+          </myTooltip>
+        </el-form-item>
+        <el-form-item label="描述" prop="description">
+          <myTooltip :content="row.description">
+            <div class="noWrap" v-html="$commonJS.getColumnData(row, {type:'String',value:'description'})"></div>
+          </myTooltip>
+        </el-form-item>
+    </el-form>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    type:{},
+    id:{}
+  },
+  data() {
+    return {
+      row:{},
+      params:{
+        current:1,
+        size:10,
+        orderDTOList: null,
+      },
+      loading:false
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {
+    if(Object.keys(this.row).length>0){
+      return false
+    }
+    if(this.type == '产品类别'){
+      this.getProductCategory()
+    }else{
+      this.getProduct()
+    }
+  },
+  methods: {
+    //获取产品类别信息
+    getProductCategory(){
+      this.params.searchQuery = `category_id=${this.id}`
+      this.loading = true
+      this.$api.queryProductCategory(this.params).then(response=>{
+        if(response.code == 200){
+          this.row = response.data.data[0]
+          this.loading = false
+        }
+      }).catch(error=>{
+        this.row = {}
+        this.loading = false
+      })
+    },
+    //获取产品信息
+    getProduct(){
+      this.params.searchQuery = `product_id=${this.id}`
+      this.loading = true
+      this.$api.queryProduct(this.params).then(response=>{
+        if(response.code == 200){
+          this.row = response.data.data[0]
+          this.loading = false
+        }
+      }).catch(error=>{
+        this.row = {}
+        this.loading = false
+      })
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 137 - 0
src/views/product/components/details/components/index.vue

@@ -0,0 +1,137 @@
+<template>
+    <div style="height:100%">
+      <el-container>
+        <el-header class="basic_header">
+            <el-tabs v-model="activeName" type="card" @tab-click="handleClick" style="width:100%">
+              <el-tab-pane v-for="item in menu" :key='item.path' :label="item.label" :name="item.path"></el-tab-pane>
+            </el-tabs>
+            <!-- <my-tabs v-model="activeName" tabs-type="card" :font-size="16" :border="true">
+                <my-tabs-item v-for="item in menu" :key='item.path' :label="item.label" :name="item.path">
+                </my-tabs-item>
+            </my-tabs> -->
+            
+        </el-header>
+        <el-main>
+            <component :is='activeName' :type="type" :id="id" :name="name" :licenseRate="licenseRate"></component>
+        </el-main>
+      </el-container>
+    </div>
+</template>
+  
+<script>
+import basicMessage from './basicMessage.vue';
+import market from '../../market/index.vue'
+  export default {
+    components: {
+        basicMessage,
+        market
+    //   ProductMessage:() => import('./productMessage.vue'),
+    //   RelatedPatents:()=> import("../relatedPatents/components/relatedPatents.vue"),
+    //   // MarketingData:()=> import('../marketingData.vue'),
+    //   charts:()=> import('./charts.vue'),
+    //   Framework:()=> import('../framework/framework.vue')
+    },
+    props: {
+        type:{
+
+        },
+        id:{
+
+        },
+        name:{
+
+        },
+        licenseRate:{
+
+        }
+    },
+    data() {
+      return {
+        menu:[],
+        activeName:'basicMessage',
+      };
+    },
+    watch: {},
+    computed: {},
+    created() {},
+    mounted() {
+        this.getMenu()
+    },
+    methods: {
+        getMenu(){
+            if(this.type == '产品类别'){
+                this.menu = [
+                    {
+                        label:'基本信息',
+                        value:'1',
+                        path:'basicMessage'
+                    },
+                    {
+                        label:'趋势图',
+                        value:'2',
+                        path:'basicMessage1'
+                    },
+                    {
+                        label:'分类架构',
+                        value:'3',
+                        path:'Framework'
+                    },
+                    {
+                        label:'专利布局可视化',
+                        value:'3',
+                        path:'jsMind'
+                    },
+
+                ]
+            }else{
+                this.menu = [
+                    {
+                        label:'基本信息',
+                        value:'1',
+                        path:'basicMessage'
+                    },
+                    {
+                        label:'营销数据',
+                        value:'2',
+                        path:'market'
+                    },
+                    {
+                        label:'商品化专利',
+                        value:'3',
+                        path:'RelatedPatents'
+                    },
+                    {
+                        label:'产品架构',
+                        value:'4',
+                        path:'Framework'
+                    },
+                    {
+                        label:'专利布局可视化',
+                        value:'5',
+                        path:'jsMind'
+                    }, 
+                ]
+            }
+        },
+        handleClick(tab){
+    
+        }
+    },
+  };
+  </script>
+  <style lang="scss" scoped>
+  .basic_header{
+    padding: 0 !important;
+    width: 100%;
+    align-items: end;
+    border-bottom:0 ;
+  }
+  </style>
+  <style lang="scss">
+    .basic_header{
+        .el-tabs__header{
+            margin: 0;
+        }
+    }
+  </style>
+  

+ 0 - 0
src/views/product/components/details/components/mixins/index.js


+ 39 - 0
src/views/product/components/details/index.vue

@@ -0,0 +1,39 @@
+<template>
+  <div>
+    <product-Details :type="type" :id="id" :name="name" :licenseRate="licenseRate"></product-Details>
+  </div>
+</template>
+
+<script>
+import productDetails from './components/index.vue'
+export default {
+  components: {
+    productDetails
+  },
+  props: {},
+  data() {
+    return {
+    };
+  },
+  watch: {},
+  computed: {
+    type(){
+        return this.$route.query.type
+    },
+    id(){
+        return this.$route.query.id
+    },
+    name(){
+        return this.$route.query.name
+    },
+    licenseRate(){
+        return this.$route.query.licenseRate
+    }
+  },
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 118 - 0
src/views/product/components/dialog/addEditMarket.vue

@@ -0,0 +1,118 @@
+<template>
+  <div>
+    <el-dialog :title="title" :visible.sync="dialogVisible" :before-close="handleClose" width="600px" :close-on-click-modal="false" :append-to-body="true">
+        <el-form :model="form" :rules="rules" ref="ruleForm" label-width="120px" label-position="left" class="demo-ruleForm">
+            <el-form-item label="时间" prop="saleTime">
+                <el-date-picker style="width: 100%" v-model="form.saleTime" type="month" value-format="yyyy-MM" placeholder="选择日期时间"></el-date-picker>
+            </el-form-item>
+            <el-form-item label="地区" prop="saleArea">
+                <el-input v-model="form.saleArea" placeholder="请输入地区"></el-input>
+            </el-form-item>
+            <el-form-item label="销售量/件" prop="saleCount">
+                <el-input v-model="form.saleCount" placeholder="请输入销售量"></el-input>
+            </el-form-item>
+            <el-form-item label="销售额/万元" prop="saleMoney">
+                <el-input v-model="form.saleMoney" placeholder="请输入销售额"></el-input>
+            </el-form-item>
+            <el-form-item label="许可参考值" prop="licenseRate">
+                <span>{{ form.licenseRate }}</span>
+            </el-form-item>
+            <el-form-item label="自定义许可费" prop="customLicenseRate">
+                <el-input v-model="form.customLicenseRate" placeholder="请输入自定义许可费率(许可费率介于0-1之间)"></el-input>
+            </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+            <el-button @click="handleClose">取消</el-button>
+            <el-button type="primary" :loading="btnLoading" @click="submit">确定</el-button>
+        </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {},
+  data() {
+    const licenseRateRule = (rule , value ,callback)=>{
+      if(value){
+         if (!isNaN(value)) {
+          if (value>=0 && value<=1) {
+            callback()
+          } else {
+            callback(new Error('输入错误,参考许可费率介于0-1之间'))
+          }
+        } else {
+          callback(new Error('输入错误,参考许可费率介于0-1之间'))
+        }
+      }else{
+        callback()
+      }
+    }
+    return {
+        //标题
+        title:'',
+        //弹窗显示
+        dialogVisible:false,
+        //表单数据
+        form:{},
+        //规则
+        rules:{
+            customLicenseRate:[{ required: false, validator:licenseRateRule, trigger: 'blur' },],
+        },
+        //按钮加载
+        btnLoading:false,
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(form){
+        this.form = JSON.parse(JSON.stringify(form))
+        if(this.form.id){
+            this.title = '编辑营销数据'
+        }else{
+            this.title = '新增营销数据'
+        }
+        this.dialogVisible = true
+    },
+    //关闭弹窗
+    handleClose(){
+        this.dialogVisible = false
+    },
+    //提交数据
+    submit(){
+        this.$refs.ruleForm.validate(valid => {
+            if (valid) {
+                this.btnLoading = true
+                if(this.form.id){
+                    this.$api.updateProductMarketDat(this.form).then(response=>{
+                        if(response.code == 200){
+                            this.$emit('submit','修改成功!')
+                            this.btnLoading = false
+                            this.handleClose()
+                        }
+                    }).catch(error=>{
+                        this.btnLoading = false
+                    })
+                }else{
+                    this.$api.addProductMarketData(this.form).then(response=>{
+                        if(response.code == 200){
+                            this.$emit('submit','新增成功!')
+                            this.btnLoading = false
+                            this.handleClose()
+                        }
+                    }).catch(error=>{
+                        this.btnLoading = false
+                    })
+                }
+            }
+        })
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 0 - 1
src/views/product/components/dialog/addEditProduct.vue

@@ -196,7 +196,6 @@ export default {
       this.dialogVisible = true;
     },
     // 弹窗确定
-    // 弹窗确定
     submit() {
       this.$refs.ruleForm.validate(valid => {
         if (valid) {

+ 9 - 144
src/views/product/components/dialog/marketing.vue

@@ -2,174 +2,39 @@
   <!-- 营销数据 -->
   <div class="marketing">
     <el-dialog :title="title" :visible.sync="dialogVisible" :before-close="handleClose" width="1000px" :close-on-click-modal="false">
-      <el-table :data="tableData" header-row-class-name="custom-table-header">
-        <el-table-column label="#" width="60" type="index" align="center">
-          <template slot-scope="scope">
-            <span>{{ (scope.$index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span>
-          </template>
-        </el-table-column>
-
-        <el-table-column label="时间" prop="saleTime" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{ scope.row.saleTime }}</span>
-              <el-date-picker style="width: 100%" v-else v-model="scope.row.saleTime" type="month" value-format="yyyy-MM"
-                placeholder="选择日期时间">
-              </el-date-picker>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="地区" prop="saleArea" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{ scope.row.saleArea }}</span>
-              <el-input v-else v-model="scope.row.saleArea"></el-input>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="销售量/件" prop="saleCount" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{ scope.row.saleCount }}</span>
-              <el-input v-else v-model="scope.row.saleCount"></el-input>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="销售额/万元" prop="saleMoney" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{ scope.row.saleMoney }}</span>
-              <el-input v-else v-model="scope.row.saleMoney"></el-input>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="许可参考值" prop="reference" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span>{{ scope.row.licenseRate == 0 || scope.row.licenseRate ? (Number(scope.row.saleMoney) *
-                Number(scope.row.licenseRate)).toFixed(2) : '' }}</span>
-
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column label="自定义许可费" prop="customLicenseFee" align="center">
-          <template slot-scope="scope">
-            <div>
-              <span v-if="!scope.row.isShow">{{
-                scope.row.customLicenseRate == 0 || scope.row.customLicenseRate ? (Number(scope.row.saleMoney) *
-                  Number(scope.row.customLicenseRate)).toFixed(2) : '' }}</span>
-              <el-input v-else v-model="scope.row.customLicenseRates" placeholder="请输入自定义许可费率(许可费率介于0-1之间)"
-                @blur="changeEditId(scope.row)" @change="inpBlur" autofocus=true></el-input>
-            </div>
-          </template>
-        </el-table-column>
-
-
-        <el-table-column label="操作" align="center" width="100px">
-          <template slot-scope="scope">
-            <el-button type="text" @click="handleEdit(scope.row)">{{ scope.row.isShow ? '保存' : '编辑' }}</el-button>
-            <el-button type="text" @click="handleDelete(scope.row)" style="color: red;">删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div style="text-align: center;margin-top: 10px;">
-        <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
-          :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
-        </el-pagination>
-      </div>
+      <productMarket :id="productData.id" :licenseRate="productData.licenseRate"></productMarket>
     </el-dialog>
   </div>
 </template>
 
 <script>
-
+import productMarket from '../market/index.vue'
 export default {
+  components:{
+    productMarket
+  },
   data() {
     return {
       // 营销数据弹窗的title
       title: '营销数据',
       // 控制营销数据弹窗的显示与消失
       dialogVisible: false,
-      // 查询营销数据的字段
-      queryParams: {
-        current: 1,
-        size: 10,
-      },
-      // 营销数据的数量
-      total: 0,
-      // 营销数据的数据
-      tableData: [
-        {
-          "id": 84,
-          "productId": 43,
-          "saleTime": "2023-06",
-          "saleArea": "苏村",
-          "saleCount": 12,
-          "saleMoney": 100,
-          "customLicenseRate": 0.5
-        }
-      ],
+      //产品数据
+      productData:{}
     }
   },
   mounted() {
 
   },
   methods: {
-    //失去焦点
-    changeEditId(row) {
-      this.inpBlur(row)
-      // if (this.editId) {
-        this.$set(this, 'editId', null)
-      // }
-      this.update(row)
-    },
-    // 许可费率事件//优化
-    inpBlur(row) {
-      var val = row.customLicenseRates
-      if (val) {
-        if (!isNaN(val)) {
-          if (val >= 0 && val <= 1) {
-            row.customLicenseRate = val
-          } else {
-            if (val > 1) {
-              row.customLicenseRate = 1
-              row.customLicenseRates = 1
-            }
-            if (val < 0) {
-              row.customLicenseRate = 0
-              row.customLicenseRates = 0
-            }
-          }
-        } else {
-          row.customLicenseRates = row.customLicenseRate ? row.customLicenseRate : ''
-        }
-      }
 
-    },
-    // 更新当前营销数据
-    update(row){},
     // 打开弹窗
     open(row) {
-      if (row && row.licenseRate) {
-        this.tableData[0].licenseRate = row.licenseRate
-      }
+      this.productData = row
+      this.title = `营销数据(${row.name})`
       this.dialogVisible = true
     },
-    // 分页
-    handleCurrentChange(val) {
 
-    },
-    // 删除
-    handleDelete(row) { },
-    // 编辑/保存
-    handleEdit(row) {
-      if (row.isShow) {//保存
-        this.update(row)
-        this.$set(row, 'isShow', false)
-      } else {//编辑
-        this.$set(row, 'isShow', true)
-      }
-    },
     // 弹窗取消
     handleClose() {
       this.dialogVisible = false

+ 1 - 1
src/views/product/components/framework/viewIndex.vue

@@ -353,7 +353,7 @@ export default {
       let arr1 = ['name', 'type', 'typeId', 'parentId']
       arr1.forEach(item => {
         let label = ''
-        if (item == 'name') {//事件名称
+        if (item == 'name') {//产品名称
           label = this.productName
         } else if (item == 'type') {
           label = this.typesOf

+ 10 - 1
src/views/product/components/index.vue

@@ -34,7 +34,7 @@
         </div>
       </el-header>
       <el-main>
-        <div style="height: 100%;">
+        <div style="height: 100%;" v-loading="loading">
           <component :is="componentType" v-bind="$attrs" :tableData="tableData" :queryParams="queryParams" :searchOption="searchOption" :handleMessage="handleMessage"  @options="handleOption" @on-sort="handleSort" @optionsSon="handleOption2" @chooseItem="chooseItem"></component>
         </div>
       </el-main>
@@ -49,6 +49,7 @@
     <addEditCategory ref="addEditCategory" @getMessage="getMessage"></addEditCategory>
     <addEditProduct ref="addEditProduct" @getMessage="getMessage2"></addEditProduct>
     <marketing ref="marketing"></marketing>
+    
     <myImageViewer v-if="showImg" :on-close="closeViewer" :src="imgSrc"></myImageViewer>
   </div>
 </template>
@@ -122,6 +123,8 @@ export default {
       total: 0,
       // 产品类别数据
       tableData:[],
+      //加载
+      loading:false,
       //展示图片
       showImg:false,
       //图片地址
@@ -325,11 +328,17 @@ export default {
         searchQuery:str,//检索条件
         orderDTOList: this.sort,//排序
       }
+      this.loading = true
       this.$api.queryProductCategory(params).then(response=>{
         if(response.code == 200){
           this.tableData = response.data.data
           this.total = response.data.total
+          this.loading = false
         }
+      }).catch(error=>{
+        this.loading = false
+        this.tableData = []
+        this.total = 0
       })
     },
     //排序

+ 198 - 0
src/views/product/components/market/index.vue

@@ -0,0 +1,198 @@
+<template>
+  <div>
+    <el-container>
+      <el-header>
+        <div style="width:100%;display:flex;justify-content:flex-end">
+            <el-button type="primary" size="small" @click="addMarket">新增</el-button>
+        </div>
+      </el-header>
+      <el-main>
+        <el-table :data="tableData" header-row-class-name="custom-table-header" :loading="loading">
+          <el-table-column label="#" width="60" type="index" align="center">
+            <template slot-scope="scope">
+              <span>{{ scope.$index + 1 + (queryParams.current - 1) * queryParams.size }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="时间" prop="saleTime" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.saleTime }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="地区" prop="saleArea" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.saleArea }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="销售量/件" prop="saleCount" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.saleCount }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="销售额/万元" prop="saleMoney" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.saleMoney }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="许可参考值" prop="reference" align="center">
+            <template slot-scope="scope">
+              <div>
+                <span>{{ scope.row.licenseRate == 0 || scope.row.licenseRate
+                    ? (
+                        Number(scope.row.saleMoney) *
+                        Number(scope.row.licenseRate)
+                      ).toFixed(2)
+                    : ""
+                }}</span>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="自定义许可费"
+            prop="customLicenseFee"
+            align="center"
+          >
+            <template slot-scope="scope">
+              <div>
+                <span>{{
+                  scope.row.customLicenseRate == 0 ||
+                  scope.row.customLicenseRate
+                    ? (
+                        Number(scope.row.saleMoney) *
+                        Number(scope.row.customLicenseRate)
+                      ).toFixed(2)
+                    : ""
+                }}</span>
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="操作" align="center" width="100px">
+            <template slot-scope="scope">
+              <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
+              <el-button type="text" @click="handleDelete(scope.row)" style="color: red">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-main>
+      <el-footer class="pagination">
+        <el-pagination background layout="total, prev, pager, next, jumper" :current-page.sync="queryParams.current"
+          :page-size.sync="queryParams.size" @current-change="handleCurrentChange" :total="total">
+        </el-pagination>
+      </el-footer>
+    </el-container>
+
+    <addEditMarket ref="addEditMarket" @submit="getSubmitMessage"></addEditMarket>
+  </div>
+</template>
+
+<script>
+import addEditMarket from '../dialog/addEditMarket.vue';
+export default {
+  components: {
+    addEditMarket
+  },
+  props: {
+    id:{},
+    licenseRate:{}
+  },
+  data() {
+    return {
+        //分页信息
+        queryParams:{
+            current:1,
+            size:10
+        },
+        //总数
+        total:0,
+        //排序
+        sort:[
+            {
+                "orderBy": "createTime",
+                "orderType": 1
+            }
+        ],
+        //数据
+        tableData:[],
+        //加载
+        loading:false
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList(){
+        var params = {
+            ...this.queryParams,
+            searchQuery:`productId=${this.id}`,
+            orderDTOList: this.sort
+        }
+        this.loading = true
+        this.$api.queryProductMarketData(params).then(response=>{
+            if(response.code == 200){
+                this.tableData = response.data.data
+                this.total = response.data.total
+                this.loading = false
+            }
+        }).catch(error=>{
+            this.tableData = []
+            this.total = 0
+            this.loading = false
+        })
+    },
+    //分页
+    handleCurrentChange(val){
+        this.queryParams.current = val
+        this.getList()
+    },
+    //新增
+    addMarket(){
+        var form = {
+            productId:this.id,
+            licenseRate:this.licenseRate
+        }
+        this.$refs.addEditMarket.open(form)
+    },
+    //编辑
+    handleEdit(row){
+        this.$refs.addEditMarket.open(row)
+    },
+    //获取新增编辑的信息
+    getSubmitMessage(val){
+        this.getList()
+    },
+    //删除
+    handleDelete(row){
+        this.deletes([row.id])
+    },
+    deletes(ids){
+        this.$confirm('此操作将删除该产品类别, 是否继续?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning'
+        }).then(() => {
+            this.$api.deleteProductMarketData(ids).then(response=>{
+                if(response.code == 200){
+                    this.$message.success('删除成功!')
+                }
+            }).catch(error=>{
+                this.$message.success('删除失败!')
+            })
+        })
+    }
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 27 - 0
src/views/product/components/mixins/index.js

@@ -0,0 +1,27 @@
+export default {
+    methods: {
+        /**
+         * 
+         * @param {object} row 为当前数据
+         * @param {String} type '2'为产品,'3'为产品类别
+         * @returns 
+         */
+        handleItem(row,type){
+            if(this.isChoose){
+                this.$emit('chooseItem',{row:row,type:type})
+                return false
+            }
+            this.$router.push(
+                {
+                  path: '/productDetails',
+                  query: {
+                    type:type=='2'?'产品':'产品类别',
+                    id:row.id,
+                    name:row.name,
+                    licenseRate:row.licenseRate
+                  }
+                }
+            )
+        },
+    },
+}

+ 5 - 10
src/views/product/components/view/categoryTable.vue

@@ -13,7 +13,9 @@
       <el-table-column v-for="item in column" :render-header=" $commonJS.renderHeaderMethods" :key="item.value" :prop="item.value" :label="item.name" align="center" sortable="custom">
         <template slot-scope="scope">
           <div v-if="['name'].includes(item.value)">
-            <el-link @click="handleItem(scope.row, item.value)" :type="isChoose?'primary':'default'" v-html="$commonJS.getColumnData(scope.row, item)"></el-link>
+            <el-link @click="handleItem(scope.row, '3')" type="primary">
+              <span  v-html="$commonJS.getColumnData(scope.row, item)"></span>
+            </el-link>
           </div>
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)">
           </div>
@@ -48,10 +50,11 @@
 </template>
 
 <script>
+import mixins from '../mixins'
 import { getTableHeight } from '@/views/components/mixins'
 import productTable from './productTable.vue'
 export default {
-  mixins:[getTableHeight],
+  mixins:[getTableHeight,mixins],
   components: {
     productTable,
   },
@@ -113,15 +116,7 @@ export default {
   mounted() {
   },
   methods: {
-    //查看详情
-    handleItem(row){
-      if(this.isChoose){
-        this.$emit('chooseItem',{row:row,type:'3'})
-        return false
-      }
 
-    },
-   
     // 展开行打开或者关闭事件
     handleExpand(row, rowList) {
       var index = this.expends.findIndex(item=>{

+ 6 - 10
src/views/product/components/view/productTable.vue

@@ -17,7 +17,9 @@
       <el-table-column v-for="item in column" :render-header=" $commonJS.renderHeaderMethods" :key="item.value" :prop="item.value" :label="item.name" align="center" sortable="custom">
         <template slot-scope="scope">
           <div v-if="['name'].includes(item.value)">
-            <el-link @click="handleItem(scope.row, item.value)" :type="isChoose?'primary':'default'" v-html="$commonJS.getColumnData(scope.row, item)"></el-link>
+            <el-link @click="handleItem(scope.row, '2')" type="primary">
+              <span  v-html="$commonJS.getColumnData(scope.row, item)"></span>
+            </el-link>
           </div>
           <div v-else v-html="$commonJS.getColumnData(scope.row, item)">
           </div>
@@ -48,10 +50,11 @@
 </template>
 
 <script>
+import mixins from '../mixins'
 import { getTableHeight } from '@/views/components/mixins'
 import product from '../mixins/product'
 export default {
-  mixins:[getTableHeight,product],
+  mixins:[getTableHeight,product,mixins],
   props: {
     tableData: {
       type: Array,
@@ -154,14 +157,7 @@ export default {
     }
   },
   methods: {
-    //查看详情
-    handleItem(row){
-      if(this.isChoose){
-        this.$emit('chooseItem',{row:row,type:'2'})
-        return false
-      }
 
-    },
     //更新数据
     updateData(){
       if(this.action.type == 1){
@@ -238,6 +234,7 @@ export default {
     //获取数据
     getList() {
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.queryParams.current * this.queryParams.size >= this.queryParams.total) {
         this.isMore = true
         this.disabled = true
@@ -246,7 +243,6 @@ export default {
           this.isFlag = false
         }, 1000)
       }
-      if (this.disabled) return;
       this.queryParams.current += 1
       var str = this.$commonJS.objectToString(this.searchOption) 
       let params = {

+ 1 - 1
src/views/project/components/view/table.vue

@@ -169,6 +169,7 @@ export default {
 
     getList() {
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.params.current * this.params.size >= this.params.total) {
         this.isMore = true
         this.disabled = true
@@ -177,7 +178,6 @@ export default {
           this.isFlag = false
         }, 1000)
       }
-      if (this.disabled) return;
       this.params.current += 1
       let params = {
         ...this.params,

+ 1 - 1
src/views/report/components/view/table.vue

@@ -187,6 +187,7 @@ export default {
 
     getList() {
       if (!this.row) return;
+      if (this.disabled) return;
       if (this.params.current * this.params.size >= this.params.total) {
         this.isMore = true
         this.disabled = true
@@ -195,7 +196,6 @@ export default {
           this.isFlag = false
         }, 1000)
       }
-      if (this.disabled) return;
       this.params.current += 1
       let params = {
         ...this.params,