guhongwei 3 years ago
parent
commit
ced8fb300d

+ 275 - 0
src/components/detail-modelTH/achieveInfo.vue

@@ -0,0 +1,275 @@
+<template>
+  <div id="achieveInfo">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <el-col :span="7" class="left" v-if="form.image != ''">
+            <el-carousel trigger="click" height="220px" :autoplay="false">
+              <el-carousel-item v-for="(item, index) in form.image" :key="index">
+                <el-image :src="item.url" style="width:99%;height:218px;border: 1px solid #ccc;"></el-image>
+              </el-carousel-item>
+            </el-carousel>
+          </el-col>
+          <el-col :span="7" v-else class="achieveImage">
+            <p class="name textOver">{{ form.name }}</p>
+            <p class="brief">{{ form.achievebrief }}</p>
+            <p class="other">
+              <span class="textOver">领域:{{ form.field }}</span>
+              <span class="textOver">联系人:{{ form.contacts }}</span>
+            </p>
+          </el-col>
+          <el-col :span="17" class="right">
+            <el-col :span="24" class="name textOver">
+              {{ form.name || '暂无' }}
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="4" class="otherInfo textOver">
+                成果单位
+              </el-col>
+              <el-col :span="20" class="otherInfo textOver">
+                {{ form.company }}
+              </el-col>
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="4" class="otherInfo textOver">
+                联系人
+              </el-col>
+              <el-col :span="20" class="otherInfo textOver">
+                {{ form.contacts }}
+              </el-col>
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="4" class="otherInfo textOver">
+                联系电话
+              </el-col>
+              <el-col :span="20" class="otherInfo textOver">
+                {{ form.phone }}
+              </el-col>
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="4" class="otherInfo textOver">
+                联系方式
+              </el-col>
+              <el-col :span="20" class="otherInfo textOver">
+                {{ form.qqwx }}
+              </el-col>
+            </el-col>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="downInfo">
+            <el-col :span="24" class="tit">
+              成果简介
+            </el-col>
+            <el-col :span="24" class="info">
+              {{ form.achievebrief || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="24" class="tit">
+              技术特点
+            </el-col>
+            <el-col :span="24" class="info">
+              {{ form.features || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="24" class="tit">
+              技术团队
+            </el-col>
+            <el-col :span="24" class="info">
+              {{ form.team || '暂无' }}
+            </el-col>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="anniu" v-if="showBtn">
+          <el-button type="primary" size="mini" @click="btnPhone()">交流洽谈</el-button>
+          <el-button type="success" size="mini" @click="onSubmit()">供求对接</el-button>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="对接" :visible.sync="dialogTableVisible" destroy-on-close>
+      <chat :room="room"></chat>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import chat from '@c/chat.vue';
+import _ from 'lodash';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: personRoom } = createNamespacedHelpers('personRoom');
+const { mapActions: dockTranscation } = createNamespacedHelpers('dockTranscation');
+export default {
+  name: 'achieveInfo',
+  props: {
+    form: { type: Object },
+    showBtn: { type: Boolean, default: () => true },
+  },
+  components: { chat },
+  data: function() {
+    return {
+      dialogTableVisible: false,
+      room: {},
+    };
+  },
+  created() {},
+  methods: {
+    ...personRoom(['create']),
+    ...dockTranscation({ tranCreate: 'create' }),
+    async btnPhone() {
+      if (!this.room.id) {
+        //TODO 请求房间号
+        let obj = {};
+        if (!_.get(this.user, 'id')) {
+          // this.$message.error('游客身份无法与卖家对话,请先注册');
+          this.$message({
+            dangerouslyUseHTMLString: true,
+            message: '<strong><a href="http://broadcast.waityou24.cn/live/login" style="color:red;">游客身份无法与卖家对话,请先注册</a></strong>',
+            type: 'error',
+          });
+          return;
+        } else {
+          obj.p1_id = this.user.id;
+          obj.p1 = this.user.name;
+        }
+        if (!this.form.user_id) {
+          this.$message.error('缺少卖家信息,请联系卖家或管理员');
+          return;
+        } else {
+          if (this.form.user_id === this.user.id) {
+            this.$message.warning('您不能与自己进行洽谈');
+            return;
+          }
+          obj.p2_id = this.form.user_id;
+          obj.p2 = this.form.contacts;
+          obj.product_id = this.form.id;
+        }
+        let res = await this.create(obj);
+        if (this.$checkRes(res)) {
+          this.$set(this, `room`, res.data);
+        }
+      }
+      this.dialogTableVisible = true;
+    },
+    //供求对接
+    async onSubmit() {
+      let data = { product_id: this.form.id, s_id: this.form.user_id, s_name: this.form.company, s_phone: this.form.phone };
+      if (this.dock_id) data.dock_id = this.dock_id;
+      if (!_.get(this.user, 'id')) {
+        this.$message({
+          dangerouslyUseHTMLString: true,
+          message: '<strong><a href="http://broadcast.waityou24.cn/live/login" style="color:red;">游客身份无法与专家进行对接,请先注册</a></strong>',
+          type: 'error',
+        });
+        return;
+      } else {
+        // 需求者信息
+        data.d_id = this.user.id;
+        data.d_name = this.user.name;
+        data.d_phone = this.user.phone;
+      }
+      if (data.d_id === data.s_id) {
+        this.$message.error('您不能对自己进行对接!');
+        return;
+      }
+      const res = await this.tranCreate(data);
+      this.$checkRes(res, '对接成功', res.errmsg || '对接失败');
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  margin: 10px 0 0 0;
+  .top {
+    margin: 0 0 10px 0;
+    .achieveImage {
+      position: relative;
+      height: 348px;
+      background: url('~@common/src/assets/achieve.png');
+      background-size: 100% 100%;
+      background-repeat: no-repeat;
+      padding: 28px 25px;
+      .name {
+        font-size: 16px;
+        font-weight: bold;
+        margin: 10px 0;
+      }
+      .brief {
+        font-size: 14px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        -webkit-line-clamp: 11;
+        word-break: break-all;
+        display: -webkit-box;
+        -webkit-box-orient: vertical;
+      }
+      .other {
+        position: absolute;
+        bottom: 10px;
+        width: 82%;
+        font-size: 14px;
+        span {
+          display: inline-block;
+          width: 100%;
+        }
+      }
+    }
+    .right {
+      padding: 0 0 0 10px;
+      .name {
+        font-size: 18px;
+        font-weight: bold;
+        padding: 10px;
+        border: 1px solid #ccc;
+        text-align: center;
+      }
+      .otherInfo {
+        padding: 10px;
+        font-size: 16px;
+        border: 1px solid #ccc;
+        color: #000;
+      }
+    }
+  }
+  .down {
+    margin: 0 0 15px 0;
+    .downInfo {
+      border: 1px solid #ccc;
+      padding: 10px;
+      .tit {
+        font-size: 16px;
+        font-weight: bold;
+        height: 35px;
+        line-height: 35px;
+        border-bottom: 1px dashed #ccc;
+        margin: 0 0 10px 0;
+        color: #000;
+      }
+      .info {
+        font-size: 16px;
+      }
+    }
+  }
+  .anniu {
+    text-align: center;
+    /deep/.el-button {
+      margin: 0 10px;
+    }
+  }
+}
+</style>

+ 17 - 0
src/router/index.js

@@ -255,6 +255,23 @@ const live = [
     meta: { title: '直播大厅-科技频道', subSite: true },
     component: () => import('../views/twoweb/channelLive/index.vue'),
   },
+  // 2021-07-22
+  // 通化自定义展会详情
+  {
+    path: '/twoweb/achieveLiveTH/detail',
+    meta: { title: '直播大厅-展会详情', subSite: true },
+    component: () => import('../views/twoweb/achieveLiveTH/detail.vue'),
+  },
+  {
+    path: '/twoweb/achieveLiveTH/model/dataIndex',
+    meta: { title: '直播大厅-数据列表', subSite: true },
+    component: () => import('../views/twoweb/achieveLiveTH/model/data-index.vue'),
+  },
+  {
+    path: '/twoweb/achieveLiveTH/model/dataDetail',
+    meta: { title: '直播大厅-数据详情', subSite: true },
+    component: () => import('../views/twoweb/achieveLiveTH/model/data-detail.vue'),
+  },
   {
     path: '/website',
     name: 'website',

+ 1 - 1
src/views/live/achieve/list.vue

@@ -90,7 +90,7 @@ export default {
     },
     // 进入展会
     liveBtn(data) {
-      this.$router.push({ path: '/achieveLive/before', query: { id: data.id } });
+      this.$router.push({ path: '/achieveLive/before', query: { id: data.id, room_id: data.room_id } });
     },
   },
   computed: {

+ 2 - 3
src/views/twoweb/achieveLive/before.vue

@@ -50,9 +50,8 @@ export default {
       }
     },
     dockBtn(data) {
-      if (data.room_id == '1007') {
-        // this.$router.push({ path: '/halltwo/directTwo', query: { dock_id: data.id } });
-        this.$router.push({ path: '/twoweb/achieveLive/detail', query: { dock_id: data.id } });
+      if (data.room_id == '1009') {
+        this.$router.push({ path: '/twoweb/achieveLiveTH/detail', query: { dock_id: data.id } });
       } else {
         this.$router.push({ path: '/twoweb/achieveLive/detail', query: { dock_id: data.id } });
       }

+ 119 - 0
src/views/twoweb/achieveLiveTH/detail.vue

@@ -0,0 +1,119 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <top :info="info"></top>
+        </el-col>
+        <el-col :span="24" class="two">
+          <div class="w_1200">
+            <el-col :span="24" class="two_1">
+              <el-col :span="12" class="left">
+                <video-live></video-live>
+              </el-col>
+              <el-col :span="12" class="right">
+                <imgtext-data></imgtext-data>
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="two_2">
+              <product-data></product-data>
+            </el-col>
+            <el-col :span="24" class="two_3">
+              <expert-data></expert-data>
+            </el-col>
+          </div>
+        </el-col>
+        <el-col :span="24" class="foot">
+          <foot></foot>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import top from './detail/top.vue';
+import foot from '@common/src/components/common/foot.vue';
+import videoLive from './detail/videoLive.vue';
+import imgtextData from './detail/imgtextData.vue';
+import productData from './detail/productData.vue';
+import expertData from './detail/expertData.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    top,
+    foot,
+    videoLive,
+    imgtextData,
+    productData,
+    expertData,
+  },
+  data: function() {
+    return {
+      info: {},
+    };
+  },
+  async created() {
+    if (this.id) await this.search();
+  },
+  methods: {
+    ...dock(['fetch']),
+    async search() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .two {
+    .two_1 {
+      height: 480px;
+      background-color: #fff;
+      margin: 0 0 35px 0;
+      .left {
+        width: 49%;
+        height: 480px;
+        margin: 0 15px 0 0;
+        box-shadow: 0 0 5px #ccc;
+        border-radius: 5px;
+      }
+      .right {
+        width: 49.5%;
+        height: 480px;
+        box-shadow: 0 0 5px #ccc;
+        border-radius: 5px;
+      }
+    }
+    .two_2 {
+      margin: 0 0 30px 0;
+    }
+    .two_3 {
+      margin: 0 0 15px 0;
+    }
+  }
+}
+</style>

+ 171 - 0
src/views/twoweb/achieveLiveTH/detail/expertData.vue

@@ -0,0 +1,171 @@
+<template>
+  <div id="expertData">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <span>专家智库</span>
+        </el-col>
+        <el-col :span="24" class="two">
+          <el-col :span="24" class="first">
+            <el-col :span="8" class="list" v-for="(item, index) in expertList" :key="index">
+              <el-col :span="6" class="image">
+                <el-image :src="item.img_path">
+                  <div slot="error" class="image-slot">
+                    <el-image :src="img_url"></el-image>
+                  </div>
+                </el-image>
+              </el-col>
+              <el-col :span="18" class="text">
+                <p class="textOver">{{ item.name }}</p>
+                <p class="textOver">{{ item.zwzc }}</p>
+                <p class="textOver">{{ item.company }}</p>
+                <p>
+                  <el-button type="primary" size="mini" @click="detail(item)">详情</el-button>
+                  <el-button type="success" size="mini" @click="trans(item)">对接</el-button>
+                </p>
+              </el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="btn">
+            <el-button type="primary" size="mini" @click="moreBtn">查看更多专家</el-button>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="专家信息" :visible.sync="dialog" width="50%" :before-close="close">
+      <expertInfo :form="info" :showBtn="false"></expertInfo>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import expertInfo from '@c/detail-model/expertInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: expert } = createNamespacedHelpers('expert');
+export default {
+  name: 'expertData',
+  props: {},
+  components: {
+    expertInfo,
+  },
+  data: function() {
+    return {
+      img_url: require('@common/src/assets/live/222.png'),
+      expertList: [],
+      // 专家详情
+      dialog: false,
+      info: {},
+    };
+  },
+  created() {
+    if (this.id) this.search();
+  },
+  methods: {
+    ...expert(['query']),
+    async search({ skip = 0, limit = 9, ...info } = {}) {
+      info.company = '中科系';
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `expertList`, res.data);
+      }
+    },
+    detail(data) {
+      this.$set(this, `info`, data);
+      this.dialog = true;
+    },
+    // 关闭详情
+    close() {
+      this.dialog = false;
+    },
+    // 对接
+    trans(data) {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/model/dataDetail', query: { dock_id: this.id, id: data.user_id, viewType: 'expert' } });
+    },
+    // 查看更多项目
+    moreBtn() {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/model/dataIndex', query: { dock_id: this.id, viewType: 'expert' } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  position: relative;
+  border: 1px solid #41719c;
+  padding: 10px;
+  min-height: 150px;
+  .one {
+    position: absolute;
+    top: -18px;
+    left: 0;
+    text-align: center;
+    span {
+      height: 30px;
+      line-height: 30px;
+      display: inline-block;
+      padding: 0 35px;
+      background: #fff;
+      font-weight: bold;
+      font-size: 18px;
+    }
+  }
+  .two {
+    .first {
+      height: 465px;
+      overflow: hidden;
+      padding: 0 10px;
+      .list {
+        width: 32.6%;
+        height: 140px;
+        box-shadow: 0 0 5px #ccc;
+        border-radius: 5px;
+        margin: 5px 10px 10px 0;
+        padding: 10px;
+        .image {
+          height: 120px;
+          overflow: hidden;
+          border: 1px dashed #ccc;
+          .el-image {
+            height: 120px;
+            overflow: hidden;
+          }
+        }
+        .text {
+          padding: 0 0 0 10px;
+          p {
+            font-size: 16px;
+            margin: 0 0 8px 0;
+          }
+          p:nth-child(1) {
+            font-size: 18px;
+            font-weight: bold;
+          }
+        }
+      }
+      .list:nth-child(3n) {
+        margin: 5px 0 10px 0;
+      }
+    }
+    .btn {
+      text-align: center;
+    }
+  }
+}
+</style>

+ 233 - 0
src/views/twoweb/achieveLiveTH/detail/imgtextData.vue

@@ -0,0 +1,233 @@
+<template>
+  <div id="imgtextData">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-tabs v-model="activeName" type="card">
+            <el-tab-pane label="图文直播" name="first">
+              <el-col :span="24" class="first">
+                <el-col :span="24" class="imgList" v-for="(item, index) in imgList" :key="index">
+                  <el-col :span="24" class="user">
+                    <span>[{{ getDate(item.meta) }}]</span>
+                    <span>展会负责人</span>
+                    <span>
+                      <el-link v-if="item.file_url" :href="item.file_url" target="_blank" :underline="false" class="videoPlay">视频播放</el-link>
+                    </span>
+                  </el-col>
+                  <el-col :span="24" class="content">
+                    {{ item.content }}
+                  </el-col>
+                  <el-col :span="24" class="image">
+                    <!-- <el-image :src="tag.img_url" v-for="(tag, tagindex) in item.url" :key="tagindex"></el-image> -->
+                    <el-image :src="item.img_url">
+                      <div slot="error" class="image-slot">
+                        <i class="el-icon-picture-outline"></i>
+                      </div>
+                    </el-image>
+                  </el-col>
+                </el-col>
+              </el-col>
+            </el-tab-pane>
+            <el-tab-pane label="洽谈合作" name="second">
+              <el-col :span="24" class="second">
+                <el-col :span="24" class="secondList" v-for="(item, index) in secondList" :key="index">
+                  <span>[{{ getDate(item.meta) }}]</span>
+                  <span class="textOver">{{ item.d_name }}</span>
+                  <span>与</span>
+                  <span class="textOver">{{ item.s_name }}</span>
+                  <span>{{ getStatus(item.status) }}</span>
+                </el-col>
+              </el-col>
+            </el-tab-pane>
+            <el-tab-pane label="达成意向" name="third">
+              <el-col :span="24" class="second">
+                <el-col :span="24" class="secondList" v-for="(item, index) in thirdList" :key="index">
+                  <span>[{{ getDate(item.meta) }}]</span>
+                  <span class="textOver">{{ item.d_name }}</span>
+                  <span>与</span>
+                  <span class="textOver">{{ item.s_name }}</span>
+                  <span>{{ getStatus(item.status) }}</span>
+                </el-col>
+              </el-col>
+            </el-tab-pane>
+            <el-tab-pane label="交易完成" name="fourth">
+              <el-col :span="24" class="second">
+                <el-col :span="24" class="secondList" v-for="(item, index) in fourthList" :key="index">
+                  <span>[{{ getDate(item.meta) }}]</span>
+                  <span class="textOver">{{ item.d_name }}</span>
+                  <span>与</span>
+                  <span class="textOver">{{ item.s_name }}</span>
+                  <span>{{ getStatus(item.status) }}</span>
+                </el-col>
+              </el-col>
+            </el-tab-pane>
+          </el-tabs>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dockImgtxt } = createNamespacedHelpers('dockImgtxt');
+const { mapActions: dockTranscation } = createNamespacedHelpers('dockTranscation');
+var moment = require('moment');
+export default {
+  name: 'imgtextData',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      activeName: 'first',
+      // 图文列表
+      imgList: [],
+      // 正在洽谈
+      secondList: [],
+      // 达成意向
+      thirdList: [],
+      // 交易完成
+      fourthList: [],
+    };
+  },
+  created() {
+    if (this.dock_id) this.search();
+  },
+  mounted() {
+    this.scrollToBottom();
+  },
+  //每次页面渲染完之后滚动条在最底部
+  updated() {
+    this.scrollToBottom();
+  },
+  methods: {
+    ...dockImgtxt(['query']),
+    ...dockTranscation({ transQuery: 'query' }),
+    async search() {
+      // 查询图文
+      let res = await this.query({ dock_id: this.dock_id });
+      if (this.$checkRes(res)) {
+        this.$set(this, `imgList`, res.data);
+      }
+      res = await this.transQuery({ dock_id: this.dock_id });
+      if (this.$checkRes(res)) {
+        let second = res.data.filter(i => i.status == '0');
+        if (second) this.$set(this, `secondList`, second);
+        let third = res.data.filter(i => i.status == '1');
+        if (third) this.$set(this, `thirdList`, third);
+        let fourth = res.data.filter(i => i.status == '3');
+        if (fourth) this.$set(this, `fourthList`, fourth);
+      }
+    },
+    getDate(val) {
+      let newDate = moment(val.createdAt).format('hh:mm:ss');
+      if (newDate) return newDate;
+    },
+    getStatus(val) {
+      if (val == '0') return '正在洽谈';
+      else if (val == '1') return '达成意向';
+      else if (val == '2') return '交易备案';
+      else if (val == '3') return '交易完成';
+      else if (val == '4') return '交易失败';
+    },
+    // 整理滚动条
+    scrollToBottom: function() {
+      this.$nextTick(() => {
+        var container = this.$el.querySelector('.first');
+        container.scrollTop = container.scrollHeight;
+      });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    /deep/.el-tabs__header {
+      margin: 0 0 10px 0;
+    }
+    .first {
+      padding: 0 10px;
+      height: 415px;
+      overflow-y: auto;
+      .imgList {
+        padding: 10px 0 0 0;
+        border-bottom: 1px dashed #ff0000;
+        .user {
+          margin: 0 0 5px 0;
+          span {
+            font-size: 16px;
+          }
+          span:nth-child(2) {
+            padding: 0 0 0 10px;
+            font-weight: bold;
+          }
+          span:nth-child(3) {
+            padding: 0 0 0 20px;
+            .el-link {
+              font-weight: bold;
+              font-size: 16px;
+              top: -3px;
+            }
+          }
+        }
+        .content {
+          padding: 0 0 10px 0;
+          text-indent: 2rem;
+        }
+        .image {
+          .el-image {
+            width: 100%;
+            height: 250px;
+            margin: 0 0 10px 0;
+          }
+        }
+      }
+    }
+    .second {
+      padding: 0 10px;
+      height: 415px;
+      overflow-y: auto;
+      .secondList {
+        border-bottom: 1px dashed #ff0000;
+        padding: 10px 0;
+        span {
+          float: left;
+          font-weight: bold;
+          font-size: 16px;
+        }
+        span:nth-child(1) {
+          color: #ff0000;
+        }
+        span:nth-child(2n) {
+          width: 32%;
+          margin: 0 10px 0 10px;
+        }
+        span:nth-child(3) {
+          color: #666;
+        }
+        span:nth-child(5) {
+          float: right;
+        }
+      }
+    }
+  }
+}
+</style>

+ 182 - 0
src/views/twoweb/achieveLiveTH/detail/productData.vue

@@ -0,0 +1,182 @@
+<template>
+  <div id="productData">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <span>技术成果</span>
+        </el-col>
+        <el-col :span="24" class="two">
+          <el-col :span="24" class="first">
+            <el-col :span="5" class="achieveList" v-for="(item, index) in achieveList" :key="index">
+              <el-col :span="24" class="top">
+                <p class="textOver">{{ item.name || '暂无' }}</p>
+                <p>{{ item.achievebrief || '暂无' }}</p>
+                <p class="textOver">领域:{{ item.field || '暂无' }}</p>
+                <p class="textOver">联系人{{ item.contacts || '暂无' }}</p>
+              </el-col>
+              <el-col :span="24" class="down">
+                <el-button size="mini" type="primary" @click="detail(item, '1')">详情</el-button>
+                <el-button size="mini" type="success" @click="trans(item, '1')">对接</el-button>
+              </el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="btn">
+            <el-button type="primary" size="mini" @click="moreBtn('1')">查看更多项目</el-button>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-dialog title="项目详情" :visible.sync="dialog" width="50%" :before-close="close">
+      <achieveInfo :form="info" :showBtn="false"></achieveInfo>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import achieveInfo from '@c/detail-modelTH/achieveInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: statistics } = createNamespacedHelpers('statistics');
+export default {
+  name: 'productData',
+  props: {},
+  components: {
+    achieveInfo,
+  },
+  data: function() {
+    return {
+      achieveList: [],
+      // 项目详情
+      dialog: false,
+      info: {},
+    };
+  },
+  async created() {
+    if (this.id) await this.search();
+  },
+  methods: {
+    ...statistics(['dockProduct']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      info.dock_id = this.id;
+      let res = await this.dockProduct({ skip, limit, type: '1', ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `achieveList`, res.data);
+      }
+    },
+    // 查看详情
+    detail(data, type) {
+      this.$set(this, `info`, data);
+      this.dialog = true;
+    },
+    // 关闭详情
+    close() {
+      this.dialog = false;
+    },
+    // 对接
+    trans(data, type) {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/model/dataDetail', query: { dock_id: this.id, id: data.id, type: type, viewType: 'product' } });
+    },
+    // 查看更多项目
+    moreBtn(type) {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/model/dataIndex', query: { dock_id: this.id, type: type, viewType: 'product' } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  position: relative;
+  border: 1px solid #41719c;
+  padding: 10px;
+  min-height: 150px;
+  .one {
+    position: absolute;
+    top: -18px;
+    left: 0;
+    text-align: center;
+    span {
+      height: 30px;
+      line-height: 30px;
+      display: inline-block;
+      padding: 0 35px;
+      background: #fff;
+      font-weight: bold;
+      font-size: 18px;
+    }
+  }
+  .two {
+    .btn {
+      text-align: center;
+    }
+    .first {
+      padding: 0 10px;
+      height: 530px;
+      overflow: hidden;
+      margin: 10px 0 0 0;
+      .achieveList {
+        width: 18.9%;
+        height: 250px;
+        background: url('~@common/src/assets/achieve.png');
+        background-size: 100% 100%;
+        background-repeat: no-repeat;
+        margin: 0 15px 15px 0;
+        padding: 22px 22px 8px 22px;
+        border-radius: 5px;
+        .top {
+          height: 190px;
+          overflow: hidden;
+          p:nth-child(1) {
+            font-size: 18px;
+            font-weight: bold;
+            padding: 5px 0;
+          }
+          p:nth-child(2) {
+            font-size: 12px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            -webkit-line-clamp: 6;
+            word-break: break-all;
+            display: -webkit-box;
+            -webkit-box-orient: vertical;
+            padding: 0 5px;
+            line-height: 17px;
+          }
+          p:nth-child(3) {
+            font-size: 14px;
+            padding: 4px 0 0 0;
+          }
+          p:nth-child(4) {
+            font-size: 14px;
+            padding: 4px 0 0 0;
+          }
+        }
+        .down {
+          text-align: center;
+        }
+      }
+      .achieveList:nth-child(5n) {
+        margin: 0 0 15px 0;
+      }
+    }
+  }
+}
+/deep/.el-dialog__body {
+  padding: 0 10px;
+}
+</style>

+ 163 - 0
src/views/twoweb/achieveLiveTH/detail/top.vue

@@ -0,0 +1,163 @@
+<template>
+  <div id="top">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <div class="w_1200">
+            <el-col :span="24" class="one_1">
+              {{ info.title }}
+            </el-col>
+            <el-col :span="24" class="one_2">
+              主办方:<span>{{ info.sponsor }}</span>
+            </el-col>
+            <el-col :span="24" class="one_3">
+              <p v-for="(item, index) in list" :key="index">
+                <span>{{ item.name }}</span>
+                <span>{{ item.num || 0 }}{{ item.unit }}</span>
+              </p>
+            </el-col>
+          </div>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: statistics } = createNamespacedHelpers('statistics');
+export default {
+  name: 'top',
+  props: {
+    info: { type: Object },
+  },
+  components: {},
+  data: function() {
+    return {
+      list: [
+        {
+          name: '同时在线',
+          num: 0,
+          unit: '人',
+        },
+        {
+          name: '特邀嘉宾',
+          num: 81,
+          unit: '人',
+        },
+        {
+          name: '洽谈合作',
+          num: 0,
+          unit: '项',
+        },
+        {
+          name: '达成意向',
+          num: 0,
+          unit: '项',
+        },
+        {
+          name: '交易完成',
+          num: 0,
+          unit: '项',
+        },
+        {
+          name: '参展项目',
+          num: 148,
+          unit: '项',
+        },
+      ],
+    };
+  },
+  created() {
+    if (this.dock_id) this.search();
+  },
+  methods: {
+    ...statistics(['dockQuery']),
+    async search() {
+      let res = await this.dockQuery({ dock_id: this.dock_id });
+      if (this.$checkRes(res)) {
+        // console.log(res);
+        this.$set(this, `list`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    background: url('~@common/src/assets/live/dock_top.png');
+    height: 430px;
+    background-repeat: no-repeat;
+    background-size: 100% 100%;
+    .one_1 {
+      text-align: center;
+      font-size: 40px;
+      color: #fff;
+      padding: 5% 8% 0 10%;
+      height: 185px;
+      margin: 0 0 40px 0;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 2;
+      word-break: break-all;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+    }
+    .one_2 {
+      text-align: center;
+      font-size: 30px;
+      color: #fff;
+      margin: 0 0 50px 0;
+    }
+    .one_3 {
+      p {
+        float: left;
+        width: 15%;
+        background: #fff;
+        margin: 0 10px 0 10px !important;
+        color: #000;
+        height: 50px;
+        line-height: 50px;
+        border-radius: 30px;
+        span:first-child {
+          display: inline-block;
+          width: 56%;
+          text-align: center;
+          height: 50px;
+          line-height: 50px;
+          font-size: 16px;
+          background: red;
+          border-radius: 30px;
+          color: #fff;
+          font-weight: 700;
+        }
+        span:last-child {
+          display: inline-block;
+          width: 42%;
+          text-align: center;
+          font-size: 15px;
+          font-weight: 700;
+        }
+      }
+    }
+  }
+}
+</style>

+ 85 - 0
src/views/twoweb/achieveLiveTH/detail/videoLive.vue

@@ -0,0 +1,85 @@
+<template>
+  <div id="videoLive">
+    <el-row>
+      <el-col :span="24" class="main">
+        <video id="videoElement" controls autoplay class="h5video" height="480px" :poster="poster"></video>
+        <!-- <video id="videoElement" autoplay controls style="width:500px;height:300px"></video> -->
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+import flvjs from 'flv.js';
+export default {
+  name: 'videoLive',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      info: {},
+      poster: require('@common/src/assets/hall.jpg'),
+    };
+  },
+  async created() {
+    await this.search();
+    this.$nextTick(() => {
+      this.searchLive();
+    });
+  },
+  mounted() {
+    // this.searchLive();
+  },
+  methods: {
+    ...dock(['fetch']),
+    async search() {
+      let res = await this.fetch(this.dock_id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    searchLive() {
+      let player = document.getElementById('videoElement');
+      if (flvjs.isSupported()) {
+        var flvPlayer = flvjs.createPlayer({
+          isLive: true,
+          type: 'flv',
+          url: `${process.env.VUE_APP_LIVE_URL + this.info.room_id}`,
+        });
+        flvPlayer.attachMediaElement(player);
+        flvPlayer.load(); //加载
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    info: {
+      deep: true,
+      immediate: true,
+      handler(val) {
+        if (val) {
+        }
+      },
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .h5video {
+    width: 100%;
+    background: #000000;
+  }
+}
+</style>

+ 86 - 0
src/views/twoweb/achieveLiveTH/expert/detail.vue

@@ -0,0 +1,86 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-col :span="24" class="right">
+            <el-button type="primary" size="mini" @click="back">返回活动首页</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="two">
+          <expertInfo :form="info"></expertInfo>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import expertInfo from '@c/detail-model/expertInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: expert } = createNamespacedHelpers('expert');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    expertInfo,
+  },
+  data: function() {
+    return {
+      info: {},
+    };
+  },
+  created() {
+    if (this.id) this.search();
+  },
+  methods: {
+    ...expert(['fetch']),
+    async search() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    back() {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/detail', query: { dock_id: this.dock_id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  min-height: 505px;
+  box-shadow: 0 0 5px #ccc;
+  background-color: #fff;
+  padding: 20px;
+  .one {
+    margin: 0 0 10px 0;
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 2px solid #666;
+    .right {
+      text-align: right;
+    }
+  }
+}
+</style>

+ 112 - 0
src/views/twoweb/achieveLiveTH/expert/index.vue

@@ -0,0 +1,112 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-col :span="12" class="left">
+            <span>专家总数:{{ total }}人</span>
+          </el-col>
+          <el-col :span="12" class="right">
+            <el-button type="primary" size="mini" @click="back">返回活动首页</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="two">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @check="toCheck"></data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: expert } = createNamespacedHelpers('expert');
+export default {
+  name: 'index',
+  props: {},
+  components: { dataTable },
+  data: function() {
+    return {
+      opera: [{ label: '对接', method: 'check' }],
+      fields: [
+        { label: '姓名', prop: 'name' },
+        { label: 'QQ微信', prop: 'qqwx' },
+        { label: '电子邮箱', prop: 'email' },
+        { label: '文化程度', prop: 'education' },
+        { label: '毕业院校', prop: 'school' },
+        { label: '工作单位', prop: 'company' },
+        { label: '职务职称', prop: 'zwzc' },
+      ],
+      list: [],
+      total: 0,
+    };
+  },
+  created() {
+    if (this.dock_id) this.search();
+  },
+  methods: {
+    ...expert(['query']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      info.company = '中科系';
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 对接
+    toCheck({ data }) {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/model/dataDetail', query: { dock_id: this.dock_id, id: data.user_id, viewType: 'expert' } });
+    },
+    back() {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/detail', query: { dock_id: this.dock_id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  min-height: 505px;
+  box-shadow: 0 0 5px #ccc;
+  background-color: #fff;
+  padding: 20px;
+  .one {
+    margin: 0 0 10px 0;
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 2px solid #666;
+    .left {
+      span {
+        display: inline-block;
+        background: #ff0000;
+        color: #fff;
+        height: 40px;
+        line-height: 40px;
+        padding: 0px 10px;
+        font-weight: bold;
+      }
+    }
+    .right {
+      text-align: right;
+    }
+  }
+}
+</style>

+ 44 - 0
src/views/twoweb/achieveLiveTH/model/data-detail.vue

@@ -0,0 +1,44 @@
+<template>
+  <div id="data-detail">
+    <data-slot>
+      <component :is="model"></component>
+    </data-slot>
+  </div>
+</template>
+
+<script>
+import dataSlot from './data-slot.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'data-detail',
+  props: {},
+  components: {
+    dataSlot,
+    modelexpert: () => import('../expert/detail.vue'),
+    modelproduct: () => import('../product/detail.vue'),
+  },
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+    model() {
+      return `model${this.$route.query.viewType}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 44 - 0
src/views/twoweb/achieveLiveTH/model/data-index.vue

@@ -0,0 +1,44 @@
+<template>
+  <div id="data-index">
+    <data-slot>
+      <component :is="model"></component>
+    </data-slot>
+  </div>
+</template>
+
+<script>
+import dataSlot from './data-slot.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'data-index',
+  props: {},
+  components: {
+    dataSlot,
+    modelexpert: () => import('../expert/index.vue'),
+    modelproduct: () => import('../product/index.vue'),
+  },
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+    model() {
+      return `model${this.$route.query.viewType}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 71 - 0
src/views/twoweb/achieveLiveTH/model/data-slot.vue

@@ -0,0 +1,71 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <top :info="info"></top>
+        </el-col>
+        <el-col :span="24" class="two">
+          <div class="w_1200">
+            <slot></slot>
+          </div>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import top from '../detail/top.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    top,
+  },
+  data: function() {
+    return {
+      info: {},
+    };
+  },
+  created() {
+    if (this.dock_id) this.search();
+  },
+  methods: {
+    ...dock(['fetch']),
+    async search() {
+      let res = await this.fetch(this.dock_id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .two {
+    position: relative;
+    top: -15px;
+  }
+}
+</style>

+ 92 - 0
src/views/twoweb/achieveLiveTH/product/detail.vue

@@ -0,0 +1,92 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-col :span="24" class="right">
+            <el-button type="primary" size="mini" @click="back">返回活动首页</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="two">
+          <techolInfo :form="info" v-if="type == '0'"></techolInfo>
+          <achieveInfo :form="info" v-else-if="type == '1'"></achieveInfo>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import techolInfo from '@c/detail-model/techolInfo.vue';
+import achieveInfo from '@c/detail-modelTH/achieveInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: product } = createNamespacedHelpers('product');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    techolInfo,
+    achieveInfo,
+  },
+  data: function() {
+    return {
+      info: {},
+    };
+  },
+  created() {
+    if (this.id) this.search();
+  },
+  methods: {
+    ...product(['fetch']),
+    async search() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    back() {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/detail', query: { dock_id: this.dock_id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+    type() {
+      return this.$route.query.type;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  min-height: 505px;
+  box-shadow: 0 0 5px #ccc;
+  background-color: #fff;
+  padding: 20px;
+  .one {
+    margin: 0 0 10px 0;
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 2px solid #666;
+    .right {
+      text-align: right;
+    }
+  }
+}
+</style>

+ 118 - 0
src/views/twoweb/achieveLiveTH/product/index.vue

@@ -0,0 +1,118 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-col :span="12" class="left">
+            <span>项目成果:{{ total }}项</span>
+          </el-col>
+          <el-col :span="12" class="right">
+            <el-button type="primary" size="mini" @click="back">返回活动首页</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="two">
+          <data-table :fields="fields" :opera="opera" :data="list" :total="total" @query="search" @check="toCheck"></data-table>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import dataTable from '@common/src/components/frame/filter-page-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: statistics } = createNamespacedHelpers('statistics');
+export default {
+  name: 'index',
+  props: {},
+  components: { dataTable },
+  data: function() {
+    return {
+      opera: [{ label: '对接', method: 'check' }],
+      fields: [
+        { label: '产品类型', prop: 'type', format: i => (i == '0' ? '科技需求' : i == '1' ? '技术成果' : i == '2' ? '商务服务' : '未识别') },
+        { label: '产品名称', prop: 'name' },
+        { label: '企业名称', prop: 'company' },
+        { label: '联系人', prop: 'contacts' },
+        { label: '联系电话', prop: 'phone' },
+        { label: '电子邮箱', prop: 'email' },
+      ],
+      list: [],
+      total: 0,
+    };
+  },
+  created() {
+    if (this.dock_id) this.search();
+  },
+  methods: {
+    ...statistics(['dockProduct']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      info.dock_id = this.dock_id;
+      info.type = this.type;
+      let res = await this.dockProduct({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 对接
+    toCheck({ data }) {
+      this.$router.push({
+        path: '/twoweb/achieveLiveTH/model/dataDetail',
+        query: { dock_id: this.dock_id, id: data.id, type: data.type, viewType: 'product' },
+      });
+    },
+    back() {
+      this.$router.push({ path: '/twoweb/achieveLiveTH/detail', query: { dock_id: this.dock_id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+    type() {
+      return this.$route.query.type;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    test: {
+      deep: true,
+      immediate: true,
+      handler(val) {},
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  min-height: 505px;
+  box-shadow: 0 0 5px #ccc;
+  background-color: #fff;
+  padding: 20px;
+  .one {
+    margin: 0 0 10px 0;
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 2px solid #666;
+    .left {
+      span {
+        display: inline-block;
+        background: #ff0000;
+        color: #fff;
+        height: 40px;
+        line-height: 40px;
+        padding: 0px 10px;
+        font-weight: bold;
+      }
+    }
+    .right {
+      text-align: right;
+    }
+  }
+}
+</style>

+ 3 - 1
src/views/userCenter/menuParst/basicInfo.vue

@@ -32,7 +32,9 @@ export default {
   data: function() {
     return {};
   },
-  async created() {},
+  async created() {
+    console.log(this.user);
+  },
   methods: {},
   computed: {
     ...mapState(['user']),