Browse Source

Merge branch 'master' of http://git.cc-lotus.info/live/web-live

lrf402788946 3 years ago
parent
commit
3bd413f66e

+ 350 - 0
src/components/detail-model/achieveInfo.vue

@@ -0,0 +1,350 @@
+<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="345px" :autoplay="false">
+              <el-carousel-item v-for="(item, index) in form.image" :key="index">
+                <el-image :src="item.url" style="width:99%;height:345px;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-link v-if="form.companyweb != null || ''" :href="form.companyweb" :underline="false" target="_blank">({{ form.companyweb }})</el-link>
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                所属领域
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.field || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                合作方式
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.cooperation || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                成果状态
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.achievestatus || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                成果来源
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.achievesource || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                成果权属
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.achieveown || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                意向价格
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.intentionprice || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                联系人
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.contacts || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                联系方式
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                <el-tooltip class="item" effect="dark" placement="top">
+                  <div slot="content">{{ form.email }}/{{ form.qqwx || '暂无' }}</div>
+                  <p class="textOver">{{ form.email }}/{{ form.qqwx || '暂无' }}</p>
+                </el-tooltip>
+              </el-col>
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="4" class="otherInfo textOver">
+                项目路演
+              </el-col>
+              <el-col :span="20" class="otherInfo textOver">
+                <el-link :href="form.roadshow" :underline="false">{{ form.roadshow ? '观看演示文件' : '暂无' }}</el-link>
+              </el-col>
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="4" class="otherInfo textOver">
+                专利信息
+              </el-col>
+              <el-col :span="20" class="otherInfo textOver" style="padding: 6px">
+                <el-button type="primary" size="mini" @click="dialogTableVisible1 = true">专利信息</el-button>
+              </el-col>
+            </el-col>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>成果简介</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.achievebrief || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>技术特点</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.features || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>技术团队</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.team || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>商业预期</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.expectations || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>合作要求</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.condition || '暂无' }}
+            </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="dialogTableVisible1">
+      <el-table :data="form.patent" style="width: 100%" border>
+        <el-table-column prop="patentinfo" label="专利信息" align="center"> </el-table-column>
+        <el-table-column prop="patentstatus" label="专利状态" align="center"> </el-table-column>
+      </el-table>
+    </el-dialog>
+    <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 {
+      dialogTableVisible1: false,
+      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 {
+          obj.p2_id = this.form.user_id;
+          obj.p2 = this.form.contacts;
+        }
+        let res = await this.create(obj);
+        if (this.$checkRes(res)) {
+          this.$set(this, `room`, res.data);
+        }
+      }
+      this.dialogTableVisible = true;
+    },
+    //供求对接
+    async onSubmit() {
+      let data = { dock_id: this.dock_id, product_id: this.form.id, s_id: this.form.user_id, s_name: this.form.company, s_phone: this.form.phone };
+      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 {
+    height: 360px;
+    overflow: hidden;
+    .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;
+      }
+    }
+    .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%;
+        }
+      }
+    }
+  }
+  .down {
+    margin: 0 0 15px 0;
+    .downInfo {
+      border: 1px solid #ccc;
+      .tit {
+        height: 150px;
+        line-height: 150px;
+        text-align: center;
+        border-right: 1px solid #ccc;
+      }
+      .info {
+        font-size: 16px;
+        padding: 10px;
+        min-height: 150px;
+      }
+    }
+  }
+  .anniu {
+    text-align: center;
+    /deep/.el-button {
+      margin: 0 10px;
+    }
+  }
+}
+</style>

+ 260 - 0
src/components/detail-model/expertInfo.vue

@@ -0,0 +1,260 @@
+<template>
+  <div id="expertInfo">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-col :span="24" class="top">
+            <el-col :span="6" class="left">
+              <el-image v-if="form.img_path != null || undefined" :src="form.img_path" style="width:100%;height:220px;"></el-image>
+              <el-image v-else :src="img_url" style="width:100%;height:220px;"></el-image>
+            </el-col>
+            <el-col :span="18" 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="12">
+                <el-col :span="8" class="otherInfo textOver">
+                  毕业院校
+                </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ form.school || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver">
+                  最高学历
+                </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ form.education || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver">
+                  出生日期
+                </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ form.birthDate || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver">
+                  职务职称
+                </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ form.zwzc || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver">
+                  电子邮箱
+                </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ form.email || '暂无' }}
+                </el-col>
+              </el-col>
+              <el-col :span="12">
+                <el-col :span="8" class="otherInfo textOver">
+                  擅长领域
+                </el-col>
+                <el-col :span="16" class="otherInfo textOver">
+                  {{ form.expertise || '暂无' }}
+                </el-col>
+              </el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="down">
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>工作经历</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ form.workexperience || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>科研综述</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ form.scientific || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>承担项目</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ form.undertakingproject || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>科技奖励</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ form.scienceaward || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="downInfo">
+              <el-col :span="4" class="tit">
+                <h2>社会任职</h2>
+              </el-col>
+              <el-col :span="20" class="info">
+                {{ form.social || '暂无' }}
+              </el-col>
+            </el-col>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="btn" 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';
+const _ = require('lodash');
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: personRoom } = createNamespacedHelpers('personRoom');
+const { mapActions: dockTranscation } = createNamespacedHelpers('dockTranscation');
+export default {
+  name: 'expertInfo',
+  props: {
+    form: { type: Object },
+    showBtn: { type: Boolean, default: () => true },
+  },
+  components: { chat },
+  data: function() {
+    return {
+      img_url: require('@common/src/assets/live/d10_fbb1.png'),
+      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.id) {
+          this.$message.error('缺少专家信息,请联系管理员');
+          return;
+        } else {
+          obj.p2_id = this.form.id;
+          obj.p2 = this.form.name;
+        }
+        let res = await this.create(obj);
+        if (this.$checkRes(res)) {
+          this.$set(this, `room`, res.data);
+        }
+      }
+      this.dialogTableVisible = true;
+    },
+    //供求对接
+    async onSubmit() {
+      let data = { dock_id: this.dock_id, product_id: this.form.user_id, s_id: this.form.user_id, s_name: this.form.name, s_phone: this.form.phone };
+      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']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .one {
+    .top {
+      height: 230px;
+      overflow: hidden;
+      .right {
+        padding: 0 0 0 10px;
+        .name {
+          font-size: 18px;
+          font-weight: bold;
+          padding: 10px;
+          text-align: center;
+          border: 1px solid #ccc;
+        }
+        .otherInfo {
+          font-size: 16px;
+          padding: 10px;
+          border: 1px solid #ccc;
+        }
+      }
+    }
+    .down {
+      margin: 0 0 15px 0;
+      .downInfo {
+        border: 1px solid #ccc;
+        .tit {
+          height: 150px;
+          line-height: 150px;
+          text-align: center;
+          border-right: 1px solid #ccc;
+        }
+        .info {
+          font-size: 16px;
+          padding: 10px;
+          min-height: 150px;
+        }
+      }
+    }
+  }
+  .btn {
+    text-align: center;
+  }
+}
+</style>

+ 326 - 0
src/components/detail-model/techolInfo.vue

@@ -0,0 +1,326 @@
+<template>
+  <div id="techolInfo">
+    <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="305px" :autoplay="false">
+              <el-carousel-item v-for="(item, index) in form.image" :key="index">
+                <el-image :src="item.url" style="width:99%;height:345px;border: 1px solid #ccc;"></el-image>
+              </el-carousel-item>
+            </el-carousel>
+          </el-col>
+          <el-col :span="7" v-else class="achieveImage">
+            <p>紧急程度</p>
+            <p><el-rate v-model="value" disabled :max="max" :texts="texts" :colors="colors"> </el-rate></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-link v-if="form.companyweb != null || ''" :href="form.companyweb" :underline="false" target="_blank">({{ form.companyweb }})</el-link>
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                所属领域
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.field || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                合作方式
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.cooperation ? form.cooperation : '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                紧急程度
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver"> {{ form.demand || '暂无' }} </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                投资预算
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver"> {{ form.budget || '暂无' }} </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                联系人
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.contacts || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="12">
+              <el-col :span="8" class="otherInfo textOver">
+                QQ/微信
+              </el-col>
+              <el-col :span="16" class="otherInfo textOver">
+                {{ form.qqwx || '暂无' }}
+              </el-col>
+            </el-col>
+            <el-col :span="24">
+              <el-col :span="4" class="otherInfo textOver">
+                联系电话
+              </el-col>
+              <el-col :span="20" class="otherInfo textOver">
+                {{ getphone(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.email || '暂无' }}
+              </el-col>
+            </el-col>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>需求说明</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.requirementdesc || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>预期目标</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.expect || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>需求现状</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.present || '暂无' }}
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="downInfo">
+            <el-col :span="4" class="tit">
+              <h2>合作要求</h2>
+            </el-col>
+            <el-col :span="20" class="info">
+              {{ form.condition || '暂无' }}
+            </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: 'techolInfo',
+  props: {
+    form: { type: Object },
+    showBtn: { type: Boolean, default: () => true },
+  },
+  components: {},
+  data: function() {
+    return {
+      value: 2,
+      max: 3,
+      colors: ['#ff0000', '#ff0000', '#ff0000'],
+      texts: ['一般', '紧急', '长期'],
+      // 对接
+      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 {
+          obj.p2_id = this.form.user_id;
+          obj.p2 = this.form.contacts;
+        }
+        let res = await this.create(obj);
+        if (this.$checkRes(res)) {
+          this.$set(this, `room`, res.data);
+        }
+      }
+      this.dialogTableVisible = true;
+    },
+    //供求对接
+    async onSubmit() {
+      let data = { dock_id: this.dock_id, product_id: this.form.id, s_id: this.form.user_id, s_name: this.form.company, s_phone: this.form.phone };
+      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 || '对接失败');
+    },
+    // 隐藏手机号
+    getphone(value) {
+      if (value == undefined) {
+        return '暂无';
+      } else {
+        if (value.length === 11) {
+          let start = value.slice(0, 4);
+          let end = value.slice(-3);
+          return `${start}****${end}`;
+        } else {
+          return value;
+        }
+      }
+    },
+    searchdegre() {
+      if (this.form.degreeurgency) {
+        if (this.form.degreeurgency == '一般') this.$set(this, `value`, 1);
+        else if (this.form.degreeurgency == '紧急') this.$set(this, `value`, 2);
+        else if (this.form.degreeurgency == '长期') this.$set(this, `value`, 3);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    dock_id() {
+      return this.$route.query.dock_id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {
+    form: {
+      deep: true,
+      immediate: true,
+      handler(val) {
+        this.searchdegre();
+      },
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 315px;
+    overflow: hidden;
+    .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;
+      }
+    }
+  }
+  .down {
+    margin: 0 0 15px 0;
+    .downInfo {
+      border: 1px solid #ccc;
+      .tit {
+        height: 150px;
+        line-height: 150px;
+        text-align: center;
+        border-right: 1px solid #ccc;
+      }
+      .info {
+        font-size: 16px;
+        padding: 10px;
+        min-height: 150px;
+      }
+    }
+  }
+  .anniu {
+    text-align: center;
+    /deep/.el-button {
+      margin: 0 10px;
+    }
+  }
+  .achieveImage {
+    height: 305px;
+    overflow: hidden;
+    p:nth-child(1) {
+      font-size: 25px;
+      text-align: left;
+      padding: 10px 0;
+    }
+    p:nth-child(2) {
+      margin: 60px 0 0 0;
+      text-align: center;
+      .el-rate__icon {
+        font-size: 60px;
+      }
+    }
+  }
+}
+/deep/.el-rate__icon {
+  font-size: 60px;
+}
+</style>

+ 20 - 8
src/router/index.js

@@ -102,6 +102,19 @@ const live = [
     meta: { title: '直播大厅-展会详情', subSite: true },
     component: () => import('../views/achieveLive/detail.vue'),
   },
+  {
+    path: '/achieveLive/model/dataIndex',
+    name: 'personalLive_model_dataIndex',
+    meta: { title: '直播大厅-数据列表', subSite: true },
+    component: () => import('../views/achieveLive/model/data-index.vue'),
+  },
+  {
+    path: '/achieveLive/model/dataDetail',
+    name: 'personalLive_model_dataDetail',
+    meta: { title: '直播大厅-数据详情', subSite: true },
+    component: () => import('../views/achieveLive/model/data-detail.vue'),
+  },
+
   // {
   //   path: '/achieveLive/expert/index',
   //   name: 'achieveLive_expert',
@@ -111,7 +124,7 @@ const live = [
   // {
   //   path: '/achieveLive/expert/detail',
   //   name: 'achieveLive_detail',
-  //   meta: { title: '直播大厅-对接专家', subSite: true },
+  //   meta: { title: '直播大厅-专家详情', subSite: true },
   //   component: () => import('../views/achieveLive/expert/detail.vue'),
   // },
   // {
@@ -126,13 +139,12 @@ const live = [
   //   meta: { title: '直播大厅-对接项目', subSite: true },
   //   component: () => import('../views/achieveLive/product/detail.vue'),
   // },
-  {
-    path: '/achieveLive/news/detail',
-    name: 'achieveLive_news_detail',
-    meta: { title: '直播大厅-嘉宾访谈,项目路演', subSite: true },
-    component: () => import('../views/achieveLive/news/detail.vue'),
-  },
-
+  // {
+  //   path: '/achieveLive/news/detail',
+  //   name: 'achieveLive_news_detail',
+  //   meta: { title: '直播大厅-嘉宾访谈,项目路演', subSite: true },
+  //   component: () => import('../views/achieveLive/news/detail.vue'),
+  // },
   {
     path: '/website',
     name: 'website',

+ 0 - 2
src/store/index.js

@@ -26,8 +26,6 @@ import dockTranscation from '@common/src/store/dock/dockTranscation';
 // 培训问诊
 import trainLive from '@common/src/store/trainLive';
 import trainchat from '@common/src/store/trainchat';
-// // 交易备案
-// import transaction from '@common/src/store/transaction';
 // 科技频道
 import channel from '@common/src/store/channel';
 import channelVideo from '@common/src/store/channelVideo';

+ 1 - 1
src/views/achieveLive - 副本/detail/productData.vue

@@ -116,7 +116,7 @@ export default {
     },
     // 对接
     trans(data, type) {
-      this.$router.push({ path: '/achieveLive/product/detail', query: { dock_id: this.id, id: data.id, type: data.type } });
+      this.$router.push({ path: '/achieveLive/product/detail', query: { dock_id: this.id, id: data._id, type: data.type } });
     },
     // 取消查看
     handleClose() {

+ 22 - 4
src/views/achieveLive/detail/expertData.vue

@@ -33,21 +33,28 @@
         </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 { mapState, createNamespacedHelpers } from 'vuex';
+import expertInfo from '@c/detail-model/expertInfo.vue';
 const { mapActions: expert } = createNamespacedHelpers('expert');
 export default {
   name: 'expertData',
   props: {},
-  components: {},
+  components: { expertInfo },
   data: function() {
     return {
       active: 'first',
       img_url: require('@common/src/assets/live/d10_fbb1.png'),
       expertList: [],
+      // 专家详情
+      dialog: false,
+      info: {},
     };
   },
   created() {
@@ -62,11 +69,22 @@ export default {
       }
     },
     // 查看详情
-    detail(data) {},
+    detail(data) {
+      this.$set(this, `info`, data);
+      this.dialog = true;
+    },
+    // 关闭详情
+    close() {
+      this.dialog = false;
+    },
     // 对接
-    trans(data) {},
+    trans(data) {
+      this.$router.push({ path: '/achieveLive/model/dataDetail', query: { dock_id: this.dock_id, id: data.user_id, viewType: 'expert' } });
+    },
     // 查看更多项目
-    moreBtn() {},
+    moreBtn() {
+      this.$router.push({ path: '/achieveLive/model/dataIndex', query: { dock_id: this.dock_id, viewType: 'expert' } });
+    },
   },
   computed: {
     ...mapState(['user']),

+ 1 - 1
src/views/achieveLive/detail/jiabinData.vue

@@ -53,7 +53,7 @@ export default {
     },
     // 详情
     detail(data) {
-      this.$router.push({ path: '/achieveLive/news/detail', query: { dock_id: this.dock_id, id: data.id, type: '0' } });
+      this.$router.push({ path: '/achieveLive/model/dataIndex', query: { dock_id: this.dock_id, id: data.id, type: '0', viewType: 'news' } });
     },
   },
   computed: {

+ 27 - 4
src/views/achieveLive/detail/productData.vue

@@ -44,21 +44,33 @@
         </el-col>
       </el-col>
     </el-row>
+    <el-dialog title="项目详情" :visible.sync="dialog" width="50%" :before-close="close">
+      <techolInfo :form="info" :showBtn="false" v-if="info.type == '0'"></techolInfo>
+      <achieveInfo :form="info" :showBtn="false" v-else-if="info.type == '1'"></achieveInfo>
+    </el-dialog>
   </div>
 </template>
 
 <script>
+import techolInfo from '@c/detail-model/techolInfo.vue';
+import achieveInfo from '@c/detail-model/achieveInfo.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: statistics } = createNamespacedHelpers('statistics');
 export default {
   name: 'productData',
   props: {},
-  components: {},
+  components: {
+    techolInfo,
+    achieveInfo,
+  },
   data: function() {
     return {
       activeName: 'first',
       achieveList: [],
       techolList: [],
+      // 项目详情
+      dialog: false,
+      info: {},
     };
   },
   created() {
@@ -78,11 +90,22 @@ export default {
       }
     },
     // 查看详情
-    detail(data, type) {},
+    detail(data, type) {
+      this.$set(this, `info`, data);
+      this.dialog = true;
+    },
+    // 关闭详情
+    close() {
+      this.dialog = false;
+    },
     // 对接
-    trans(data, type) {},
+    trans(data, type) {
+      this.$router.push({ path: '/achieveLive/model/dataDetail', query: { dock_id: this.dock_id, id: data.id, type: type, viewType: 'product' } });
+    },
     // 查看更多项目
-    moreBtn(type) {},
+    moreBtn(type) {
+      this.$router.push({ path: '/achieveLive/model/dataIndex', query: { dock_id: this.dock_id, type: type, viewType: 'product' } });
+    },
   },
   computed: {
     ...mapState(['user']),

+ 1 - 1
src/views/achieveLive/detail/top.vue

@@ -104,7 +104,7 @@ export default {
 .main {
   .one {
     background: url('~@common/src/assets/live/dock_top.png');
-    height: 480px;
+    height: 430px;
     background-repeat: no-repeat;
     background-size: 100% 100%;
     .one_1 {

+ 1 - 1
src/views/achieveLive/detail/xiangmuData.vue

@@ -56,7 +56,7 @@ export default {
     // 查看详情
     // 详情
     detail(data) {
-      this.$router.push({ path: '/achieveLive/news/detail', query: { dock_id: this.dock_id, id: data.id, type: '1' } });
+      this.$router.push({ path: '/achieveLive/model/dataIndex', query: { dock_id: this.dock_id, id: data.id, type: '1', viewType: 'news' } });
     },
   },
   computed: {

+ 86 - 0
src/views/achieveLive/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: '/achieveLive/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>

+ 111 - 0
src/views/achieveLive/expert/index.vue

@@ -0,0 +1,111 @@
+<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 } = {}) {
+      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: '/achieveLive/model/dataDetail', query: { dock_id: this.dock_id, id: data.user_id, viewType: 'expert' } });
+    },
+    back() {
+      this.$router.push({ path: '/achieveLive/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/achieveLive/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>

+ 45 - 0
src/views/achieveLive/model/data-index.vue

@@ -0,0 +1,45 @@
+<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'),
+    modelnews: () => import('../news/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/achieveLive/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>

+ 0 - 166
src/views/achieveLive/news/detail.vue

@@ -1,166 +0,0 @@
-<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="24" class="top">
-                <el-button type="primary" size="mini" @click="back">返回</el-button>
-              </el-col>
-              <el-col :span="24" class="down">
-                <el-col :span="24" class="title">
-                  {{ detailInfo.title }}
-                </el-col>
-                <el-col :span="24" class="other">
-                  <span>发布时间:{{ detailInfo.publish_time || '暂无' }}</span>
-                  <span>信息来源:{{ detailInfo.origin || '暂无' }}</span>
-                </el-col>
-                <el-col :span="24" class="image" v-if="detailInfo.picture">
-                  <el-image :src="detailInfo.picture"></el-image>
-                </el-col>
-                <el-col :span="24" class="video" v-if="detailInfo.filepath">
-                  <video :src="detailInfo.filepath" controls="controls">
-                    您的浏览器不支持 video 标签。
-                  </video>
-                </el-col>
-                <el-col :span="24" class="content">
-                  <p v-html="detailInfo.content"></p>
-                </el-col>
-              </el-col>
-            </el-col>
-          </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');
-const { mapActions: interview } = createNamespacedHelpers('interview');
-const { mapActions: roadShow } = createNamespacedHelpers('roadShow');
-export default {
-  name: 'detail',
-  props: {},
-  components: {
-    top,
-  },
-  data: function() {
-    return {
-      info: {},
-      detailInfo: {},
-    };
-  },
-  created() {
-    if (this.dock_id) this.search();
-  },
-  methods: {
-    ...dock(['fetch']),
-    ...interview({ interviewFetch: 'fetch' }),
-    ...roadShow({ roadShowFetch: 'fetch' }),
-    async search() {
-      let res = await this.fetch(this.dock_id);
-      if (this.$checkRes(res)) {
-        this.$set(this, `info`, res.data);
-      }
-      if (this.type == '0') {
-        let res = await this.interviewFetch(this.id);
-        if (this.$checkRes(res)) {
-          this.$set(this, `detailInfo`, res.data);
-        }
-      } else if (this.type == '1') {
-        let res = await this.roadShowFetch(this.id);
-        if (this.$checkRes(res)) {
-          this.$set(this, `detailInfo`, res.data);
-        }
-      }
-    },
-    back() {
-      this.$router.push({ path: '/achieveLive/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 {
-  .two {
-    .two_1 {
-      min-height: 630px;
-      box-shadow: 0 0 5px #ccc;
-      background-color: #fff;
-      padding: 20px;
-      .top {
-        text-align: right;
-        margin: 0 0 10px 0;
-      }
-      .down {
-        .title {
-          text-align: center;
-          font-size: 30px;
-          font-weight: bold;
-          padding: 15px 0;
-        }
-        .other {
-          text-align: center;
-          font-size: 18px;
-          color: #666;
-          padding: 0 0 15px 0;
-          span {
-            padding: 0 0 0 10px;
-          }
-        }
-        .image {
-          text-align: center;
-          height: 300px;
-          overflow: hidden;
-          margin: 0 0 15px 0;
-          .el-image {
-            width: 50%;
-            height: 300px;
-          }
-        }
-        .video {
-          text-align: center;
-          margin: 0 0 15px 0;
-          height: 300px;
-          overflow: hidden;
-          video {
-            width: 50%;
-            height: 300px;
-            background-color: #000000;
-          }
-        }
-      }
-    }
-  }
-}
-</style>

+ 164 - 0
src/views/achieveLive/news/index.vue

@@ -0,0 +1,164 @@
+<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>{{ type == '0' ? '嘉宾访谈' : '项目路演' }}</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">
+          <el-col :span="24" class="title">
+            {{ detailInfo.title }}
+          </el-col>
+          <el-col :span="24" class="other">
+            <span>发布时间:{{ detailInfo.publish_time || '暂无' }}</span>
+            <span>信息来源:{{ detailInfo.origin || '暂无' }}</span>
+          </el-col>
+          <el-col :span="24" class="image" v-if="detailInfo.picture">
+            <el-image :src="detailInfo.picture"></el-image>
+          </el-col>
+          <el-col :span="24" class="video" v-if="detailInfo.filepath">
+            <video :src="detailInfo.filepath" controls="controls">
+              您的浏览器不支持 video 标签。
+            </video>
+          </el-col>
+          <el-col :span="24" class="content">
+            <p v-html="detailInfo.content"></p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: interview } = createNamespacedHelpers('interview');
+const { mapActions: roadShow } = createNamespacedHelpers('roadShow');
+export default {
+  name: 'index',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      detailInfo: {},
+    };
+  },
+  created() {
+    if (this.id) this.search();
+  },
+  methods: {
+    ...interview({ interviewFetch: 'fetch' }),
+    ...roadShow({ roadShowFetch: 'fetch' }),
+    async search() {
+      if (this.type == '0') {
+        let res = await this.interviewFetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `detailInfo`, res.data);
+        }
+      } else if (this.type == '1') {
+        let res = await this.roadShowFetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `detailInfo`, res.data);
+        }
+      }
+    },
+    back() {
+      this.$router.push({ path: '/achieveLive/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;
+    .left {
+      span {
+        display: inline-block;
+        background: #ff0000;
+        color: #fff;
+        height: 40px;
+        line-height: 40px;
+        padding: 0px 10px;
+        font-weight: bold;
+      }
+    }
+    .right {
+      text-align: right;
+    }
+  }
+  .two {
+    .title {
+      text-align: center;
+      font-size: 30px;
+      font-weight: bold;
+      padding: 15px 0;
+    }
+    .other {
+      text-align: center;
+      font-size: 14px;
+      color: #666;
+      padding: 0 0 15px 0;
+      span {
+        padding: 0 0 0 10px;
+      }
+    }
+    .image {
+      text-align: center;
+      height: 300px;
+      overflow: hidden;
+      margin: 0 0 15px 0;
+      .el-image {
+        width: 50%;
+        height: 300px;
+      }
+    }
+    .video {
+      text-align: center;
+      margin: 0 0 15px 0;
+      height: 300px;
+      overflow: hidden;
+      video {
+        width: 50%;
+        height: 300px;
+        background-color: #000000;
+      }
+    }
+  }
+}
+</style>

+ 92 - 0
src/views/achieveLive/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-model/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: '/achieveLive/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>

+ 117 - 0
src/views/achieveLive/product/index.vue

@@ -0,0 +1,117 @@
+<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: 'field' },
+        { label: '合作方式', prop: 'cooperation' },
+        { 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: '/achieveLive/model/dataDetail', query: { dock_id: this.dock_id, id: data.id, type: data.type, viewType: 'product' } });
+    },
+    back() {
+      this.$router.push({ path: '/achieveLive/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>