瀏覽代碼

Merge branch 'master' of http://git.cc-lotus.info/service-platform/mobile-official

wxy 4 年之前
父節點
當前提交
d93125f3af
共有 65 個文件被更改,包括 7179 次插入412 次删除
  1. 1 1
      .eslintrc.js
  2. 二進制
      src/assets/fmzl.jpg
  3. 109 27
      src/router/index.js
  4. 72 0
      src/util/patent.js
  5. 0 0
      src/viewTwo/account/index.vue
  6. 192 0
      src/viewTwo/achieve/detail.vue
  7. 101 0
      src/viewTwo/achieve/index.vue
  8. 74 0
      src/viewTwo/achieve/parts/list.vue
  9. 251 0
      src/viewTwo/channel/detail.vue
  10. 102 0
      src/viewTwo/channel/index.vue
  11. 114 0
      src/viewTwo/channel/parts/list.vue
  12. 261 0
      src/viewTwo/expert/detail.vue
  13. 101 0
      src/viewTwo/expert/index.vue
  14. 77 0
      src/viewTwo/expert/parts/list.vue
  15. 167 0
      src/viewTwo/interview/detail.vue
  16. 175 0
      src/viewTwo/interview/index.vue
  17. 73 0
      src/viewTwo/interview/parts/jbft.vue
  18. 69 0
      src/viewTwo/interview/parts/jnpx.vue
  19. 228 0
      src/viewTwo/live/detail.vue
  20. 472 0
      src/viewTwo/live/detailtwo.vue
  21. 285 0
      src/viewTwo/live/exportsDetail.vue
  22. 138 0
      src/viewTwo/live/index.vue
  23. 88 0
      src/viewTwo/live/liveDetail/czxm.vue
  24. 254 0
      src/viewTwo/live/liveDetail/dockchat.vue
  25. 110 0
      src/viewTwo/live/liveDetail/imgtxtdock.vue
  26. 103 0
      src/viewTwo/live/liveDetail/xmly.vue
  27. 124 0
      src/viewTwo/live/parts/exports.vue
  28. 105 0
      src/viewTwo/live/parts/exportsList.vue
  29. 123 0
      src/viewTwo/live/parts/personal.vue
  30. 104 0
      src/viewTwo/live/parts/personalList.vue
  31. 205 0
      src/viewTwo/live/parts/product.vue
  32. 108 0
      src/viewTwo/live/parts/productList.vue
  33. 598 0
      src/viewTwo/live/personalDetail.vue
  34. 155 0
      src/viewTwo/news/detail.vue
  35. 139 0
      src/viewTwo/news/index.vue
  36. 154 0
      src/viewTwo/notice/detail.vue
  37. 116 0
      src/viewTwo/notice/index.vue
  38. 67 0
      src/viewTwo/notice/parts/list.vue
  39. 158 0
      src/viewTwo/patent/detail.vue
  40. 90 0
      src/viewTwo/patent/index.vue
  41. 88 0
      src/viewTwo/patent/parts/list.vue
  42. 102 0
      src/viewTwo/question/index.vue
  43. 83 0
      src/viewTwo/question/parts/list.vue
  44. 167 0
      src/viewTwo/roadshow/detail.vue
  45. 101 0
      src/viewTwo/roadshow/index.vue
  46. 87 0
      src/viewTwo/roadshow/parts/list.vue
  47. 143 0
      src/viewTwo/service/detail.vue
  48. 101 0
      src/viewTwo/service/index.vue
  49. 74 0
      src/viewTwo/service/parts/list.vue
  50. 192 0
      src/viewTwo/techol/detail.vue
  51. 101 0
      src/viewTwo/techol/index.vue
  52. 74 0
      src/viewTwo/techol/parts/list.vue
  53. 3 0
      src/views/channel/parts/list.vue
  54. 0 32
      src/views/secondView/achieve/index.vue
  55. 0 32
      src/views/secondView/channel/index.vue
  56. 0 32
      src/views/secondView/expert/index.vue
  57. 0 32
      src/views/secondView/interview/index.vue
  58. 0 32
      src/views/secondView/live/index.vue
  59. 0 32
      src/views/secondView/news/index.vue
  60. 0 32
      src/views/secondView/notice/index.vue
  61. 0 32
      src/views/secondView/patent/index.vue
  62. 0 32
      src/views/secondView/question/index.vue
  63. 0 32
      src/views/secondView/roadshow/index.vue
  64. 0 32
      src/views/secondView/service/index.vue
  65. 0 32
      src/views/secondView/techol/index.vue

+ 1 - 1
.eslintrc.js

@@ -11,7 +11,7 @@ module.exports = {
     'max-len': [
       'warn',
       {
-        code: 250,
+        code: 500,
       },
     ],
     'no-unused-vars': 'off',

二進制
src/assets/fmzl.jpg


+ 109 - 27
src/router/index.js

@@ -64,97 +64,179 @@ const routes = [
     component: () => import('../views/user/index.vue'),
   },
   // 公众号第一版结束
-  // 公众号第二版开始 secondView
+  // 公众号第二版开始 viewTwo
   // 在线展会
   {
-    path: '/secondView/live/index',
+    path: '/viewTwo/live/index',
     name: 'live',
     meta: { title: '在线展会', isleftarrow: true },
-    component: () => import('../views/secondView/live/index.vue'),
+    component: () => import('../viewTwo/live/index.vue'),
+  },
+  // 在线展会详情
+  {
+    path: '/viewTwo/live/detail',
+    name: 'live',
+    meta: { title: '在线展会详情', isleftarrow: true },
+    component: () => import('../viewTwo/live/detail.vue'),
+  },
+  // 人才对接详情
+  {
+    path: '/viewTwo/live/personalDetail',
+    name: 'live',
+    meta: { title: '人才对接详情', isleftarrow: true },
+    component: () => import('../viewTwo/live/personalDetail.vue'),
+  },
+  // 专家培训详情
+  {
+    path: '/viewTwo/live/exportsDetail',
+    name: 'live',
+    meta: { title: '专家培训详情', isleftarrow: true },
+    component: () => import('../viewTwo/live/exportsDetail.vue'),
   },
   // 科技频道
   {
-    path: '/secondView/channel/index',
+    path: '/viewTwo/channel/index',
     name: 'channel',
     meta: { title: '科技频道', isleftarrow: false },
-    component: () => import('../views/secondView/channel/index.vue'),
+    component: () => import('../viewTwo/channel/index.vue'),
+  },
+  {
+    path: '/viewTwo/channel/detail',
+    name: 'detail',
+    meta: { title: '科技频道详情', isleftarrow: true },
+    component: () => import('../viewTwo/channel/detail.vue'),
   },
   // 培训访谈
   {
-    path: '/secondView/interview/index',
+    path: '/viewTwo/interview/index',
     name: 'interview',
     meta: { title: '培训访谈', isleftarrow: false },
-    component: () => import('../views/secondView/interview/index.vue'),
+    component: () => import('../viewTwo/interview/index.vue'),
   },
+  {
+    path: '/viewTwo/interview/detail',
+    name: 'detail',
+    meta: { title: '培训访谈详情', isleftarrow: true },
+    component: () => import('../viewTwo/interview/detail.vue'),
+  },
+
   // 项目路演
   {
-    path: '/secondView/roadshow/index',
+    path: '/viewTwo/roadshow/index',
     name: 'roadshow',
     meta: { title: '项目路演', isleftarrow: false },
-    component: () => import('../views/secondView/roadshow/index.vue'),
+    component: () => import('../viewTwo/roadshow/index.vue'),
+  },
+  {
+    path: '/viewTwo/roadshow/detail',
+    name: 'roadshow',
+    meta: { title: '项目路演详情', isleftarrow: true },
+    component: () => import('../viewTwo/roadshow/detail.vue'),
   },
   // 技术成果
   {
-    path: '/secondView/achieve/index',
+    path: '/viewTwo/achieve/index',
     name: 'achieve',
     meta: { title: '技术成果', isleftarrow: false },
-    component: () => import('../views/secondView/achieve/index.vue'),
+    component: () => import('../viewTwo/achieve/index.vue'),
+  },
+  {
+    path: '/viewTwo/achieve/detail',
+    name: 'achieve',
+    meta: { title: '技术成果详情', isleftarrow: true },
+    component: () => import('../viewTwo/achieve/detail.vue'),
   },
   // e专利
   {
-    path: '/secondView/patent/index',
+    path: '/viewTwo/patent/index',
     name: 'patent',
     meta: { title: 'e专利', isleftarrow: false },
-    component: () => import('../views/secondView/patent/index.vue'),
+    component: () => import('../viewTwo/patent/index.vue'),
+  },
+  {
+    path: '/viewTwo/patent/detail',
+    name: 'patent',
+    meta: { title: 'e专利详情', isleftarrow: true },
+    component: () => import('../viewTwo/patent/detail.vue'),
   },
   // 科技需求
   {
-    path: '/secondView/techol/index',
+    path: '/viewTwo/techol/index',
     name: 'techol',
     meta: { title: '科技需求', isleftarrow: false },
-    component: () => import('../views/secondView/techol/index.vue'),
+    component: () => import('../viewTwo/techol/index.vue'),
+  },
+  {
+    path: '/viewTwo/techol/detail',
+    name: 'techol',
+    meta: { title: '科技需求详情', isleftarrow: true },
+    component: () => import('../viewTwo/techol/detail.vue'),
   },
   // 专家智库
   {
-    path: '/secondView/expert/index',
+    path: '/viewTwo/expert/index',
     name: 'expert',
     meta: { title: '专家智库', isleftarrow: false },
-    component: () => import('../views/secondView/expert/index.vue'),
+    component: () => import('../viewTwo/expert/index.vue'),
+  },
+  {
+    path: '/viewTwo/expert/detail',
+    name: 'expert',
+    meta: { title: '专家智库详情', isleftarrow: true },
+    component: () => import('../viewTwo/expert/detail.vue'),
   },
   // 在线服务
   {
-    path: '/secondView/service/index',
+    path: '/viewTwo/service/index',
     name: 'service',
     meta: { title: '在线服务', isleftarrow: false },
-    component: () => import('../views/secondView/service/index.vue'),
+    component: () => import('../viewTwo/service/index.vue'),
+  },
+  {
+    path: '/viewTwo/service/detail',
+    name: 'service',
+    meta: { title: '在线服务', isleftarrow: true },
+    component: () => import('../viewTwo/service/detail.vue'),
   },
   // 调查问卷
   {
-    path: '/secondView/question/index',
+    path: '/viewTwo/question/index',
     name: 'question',
     meta: { title: '调查问卷', isleftarrow: false },
-    component: () => import('../views/secondView/question/index.vue'),
+    component: () => import('../viewTwo/question/index.vue'),
   },
   // 通知通告
   {
-    path: '/secondView/notice/index',
+    path: '/viewTwo/notice/index',
     name: 'notice',
     meta: { title: '通知通告', isleftarrow: false },
-    component: () => import('../views/secondView/notice/index.vue'),
+    component: () => import('../viewTwo/notice/index.vue'),
+  },
+  {
+    path: '/viewTwo/notice/detail',
+    name: 'notice',
+    meta: { title: '通知通告详情', isleftarrow: true },
+    component: () => import('../viewTwo/notice/detail.vue'),
   },
   // 新闻资讯
   {
-    path: '/secondView/news/index',
+    path: '/viewTwo/news/index',
     name: 'news',
     meta: { title: '新闻资讯', isleftarrow: false },
-    component: () => import('../views/secondView/news/index.vue'),
+    component: () => import('../viewTwo/news/index.vue'),
+  },
+  {
+    path: '/viewTwo/news/detail',
+    name: 'news',
+    meta: { title: '新闻资讯详情', isleftarrow: true },
+    component: () => import('../viewTwo/news/detail.vue'),
   },
   // 账号管理
   {
-    path: '/secondView/account/index',
+    path: '/viewTwo/account/index',
     name: 'account',
     meta: { title: '账号管理', isleftarrow: false },
-    component: () => import('../views/secondView/account/index.vue'),
+    component: () => import('../viewTwo/account/index.vue'),
   },
   // 公众号第二版结束
 ];

文件差異過大導致無法顯示
+ 72 - 0
src/util/patent.js


src/views/secondView/account/index.vue → src/viewTwo/account/index.vue


+ 192 - 0
src/viewTwo/achieve/detail.vue

@@ -0,0 +1,192 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="back"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="mainTop">
+            <van-swipe style="height: 220px;" vertical>
+              <template v-if="info.image && info.image.length > 0">
+                <van-swipe-item v-for="(item, index) in info.image" :key="index">
+                  <van-image :src="item.url" />
+                </van-swipe-item>
+              </template>
+              <template v-else>
+                <van-image :src="noimage" />
+              </template>
+            </van-swipe>
+          </el-col>
+          <el-col :span="24" class="message">
+            <p>
+              <span>产品名称</span>
+              <span>{{ info.name || '暂无' }}</span>
+            </p>
+            <p>
+              <span>需求方</span>
+              <span>{{ info.company || '暂无' }}</span>
+            </p>
+            <p>
+              <span>所属领域</span>
+              <span>{{ info.field || '暂无' }}</span>
+            </p>
+            <p>
+              <span>注册类型</span>
+              <span>{{ info.companytype || '暂无' }}</span>
+            </p>
+            <p>
+              <span>注册时间</span>
+              <span>{{ info.companydate || '暂无' }}</span>
+            </p>
+            <p>
+              <span>注册资金</span>
+              <span>{{ info.companycapital || '暂无' }}</span>
+            </p>
+            <p>
+              <span>投资预算</span>
+              <span>{{ info.budget || '暂无' }}</span>
+            </p>
+
+            <p>
+              <span>紧急程度</span>
+              <span>{{ info.degreeurgency || '暂无' }}</span>
+            </p>
+            <p>
+              <span>合作方式</span>
+              <span>{{ info.cooperation || '暂无' }}</span>
+            </p>
+            <p>
+              <span>联系人</span>
+              <span>{{ info.contacts || '暂无' }}</span>
+            </p>
+            <p>
+              <span>电子邮箱</span>
+              <span>{{ info.email || '暂无' }}</span>
+            </p>
+            <p>
+              <span>需求说明</span>
+              <span>{{ info.requirementdesc || '暂无' }}</span>
+            </p>
+            <p>
+              <span>预期目标</span>
+              <span>{{ info.expect || '暂无' }}</span>
+            </p>
+            <p>
+              <span>需求现状</span>
+              <span>{{ info.present || '暂无' }}</span>
+            </p>
+            <p>
+              <span>合作要求</span>
+              <span>{{ info.condition || '暂无' }}</span>
+            </p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: product } = createNamespacedHelpers('product');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      noimage: require('@/assets/noimage.jpg'),
+      info: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...product(['fetch']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    back() {
+      this.$router.push({ path: '/viewTwo/achieve/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.detail {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  min-height: 570px;
+  .mainTop {
+    padding: 0px 15px;
+    margin-bottom: 10px;
+    min-height: 220px;
+    background-color: #fff;
+    .van-swipe {
+      padding: 10px 0px;
+      box-sizing: border-box;
+      .van-image {
+        height: 200px;
+      }
+    }
+  }
+  .message {
+    background: #fff;
+    padding: 0 15px;
+    min-height: 50px;
+    p {
+      min-height: 50px;
+      line-height: 50px;
+      border-bottom: 1px solid #ccc;
+      span {
+        color: #000;
+      }
+      span:nth-child(1) {
+        display: inline-block;
+        width: 80px;
+        color: #ccc;
+      }
+    }
+    p:last-child {
+      border-bottom: none;
+    }
+  }
+}
+</style>

+ 101 - 0
src/viewTwo/achieve/index.vue

@@ -0,0 +1,101 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="list"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import list from './parts/list.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: product } = createNamespacedHelpers('product');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 查询
+      name: '',
+      list: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...product(['query']),
+    async search({ ...info } = {}) {
+      if (this.name) info.name = this.name;
+      let res = await this.query({ type: 1, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 45px;
+    overflow: hidden;
+  }
+  .down {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+      border-bottom: 1px dashed #ccc;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 100px;
+    }
+  }
+}
+</style>

+ 74 - 0
src/viewTwo/achieve/parts/list.vue

@@ -0,0 +1,74 @@
+<template>
+  <div id="tec">
+    <el-row>
+      <el-col :span="24" class="tec">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="24" class="name textOver">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="24" class="company textOver"> 成果单位:{{ item.company || '暂无' }} </el-col>
+          <el-col :span="24" class="other">
+            <span class="textOver">领域:{{ item.field || '暂无' }}</span>
+            <span class="textOver">联系人:{{ item.contacts || '暂无' }}</span>
+          </el-col>
+        </el-col>
+      </el-col>
+      <el-backtop :bottom="50" :right="10"> </el-backtop>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'tec',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    //详情
+    detailBtn(data) {
+      this.$router.push({ path: '/viewTwo/achieve/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.tec {
+  padding: 0 10px;
+  .list {
+    border-bottom: 1px dashed #ccc;
+    padding: 10px 0;
+    .name {
+      font-size: 18px;
+      font-weight: bold;
+    }
+    .company {
+      font-size: 16px;
+      color: #666;
+      padding: 5px 0 0 0;
+    }
+    .other {
+      font-size: 16px;
+      color: #666;
+      padding: 5px 0 0 0;
+      span {
+        display: inline-block;
+        width: 50%;
+      }
+    }
+  }
+}
+</style>

+ 251 - 0
src/viewTwo/channel/detail.vue

@@ -0,0 +1,251 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="back"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="video">
+            <video
+              autoplay="autoplay"
+              controls="controls"
+              preload="meta"
+              x-webkit-airplay="true"
+              webkit-playsinline="true"
+              playsinline="true"
+              x5-video-player-type="h5"
+              x5-video-player-fullscreen="true"
+              controlsList="nodownload"
+              :src="videoUrl"
+              loop="loop"
+            >
+              <source src="movie.ogg" type="video/ogg" />
+              <source src="movie.mp4" type="video/mp4" />
+            </video>
+          </el-col>
+          <el-col :span="24" class="text">
+            <van-collapse v-model="activeNames">
+              <van-collapse-item name="1">
+                <template #title>
+                  <div class="title">{{ form.title }}</div>
+                </template>
+                <el-col :span="24" class="con">
+                  <p><span>更新时间:</span>{{ form.create_time }}</p>
+                  <p><span>来源:</span>{{ form.orgin }}</p>
+                  <p><span>简介:</span>{{ form.desc }}</p>
+                </el-col>
+              </van-collapse-item>
+              <van-collapse-item name="2">
+                <template #title>
+                  <div class="title">视频列表</div>
+                </template>
+                <el-col :span="24" class="videodata">
+                  <el-col :span="12" class="videolist" v-for="(item, index) in videodata" :key="index" @click.native="changevideo(item, index)">
+                    <p :style="`color:${menuIndex == index ? menuColor : ''}`">{{ item.title }}</p>
+                    <p :style="`color:${menuIndex == index ? menuColor : ''}`">{{ item.start_time }}</p>
+                  </el-col>
+                </el-col>
+              </van-collapse-item>
+            </van-collapse>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: channel } = createNamespacedHelpers('channel');
+const { mapActions: channelVideo } = createNamespacedHelpers('channelVideo');
+var moment = require('moment');
+const _ = require('lodash');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      activeNames: ['1', '2'],
+      form: {},
+      // 视频列表
+      videodata: [],
+      // 视频路径
+      videoUrl: '',
+      // 选集参数
+      menuIndex: '',
+      menuColor: 'rgb(64,158,255)',
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...channel(['query', 'fetch']),
+    ...channelVideo({ videoquery: 'query' }),
+    async search() {
+      let res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `form`, res.data);
+      }
+      res = await this.videoquery({ user_id: this.id });
+      if (this.$checkRes(res)) {
+        this.$set(this, `videodata`, _.orderBy(res.data, ['start_time'], ['asc']));
+      }
+    },
+    changevideo(item, index) {
+      if (item) {
+        console.log(item.file_path);
+        this.menuIndex = index;
+        this.$set(this, `videoUrl`, item.file_path);
+      }
+    },
+    searchvideo() {
+      let data = this.videodata;
+      let adate = moment().format('YYYY-MM-DD HH:mm');
+      // let adate = '2020-11-13 10:16';
+      let arr = data.find(i => i.start_time <= adate && i.end_time >= adate);
+      let index = data.findIndex(i => i.start_time <= adate && i.end_time >= adate);
+      if (arr && index) {
+        this.changevideo(arr, index);
+      } else {
+        this.changevideo(data[0], '0');
+      }
+    },
+    back() {
+      this.$router.push({ path: '/viewTwo/channel/index' });
+    },
+  },
+  watch: {
+    videodata: {
+      immediate: true,
+      deep: true,
+      handler(val) {
+        if (val) {
+          this.searchvideo();
+        }
+      },
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.active {
+  color: #ff0000;
+}
+.style {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  .video {
+    video {
+      width: 100%;
+      height: 200px;
+      background-color: #000;
+    }
+    video::-webkit-media-controls-mute-button {
+      display: none !important;
+    }
+  }
+  .text {
+    padding: 5px 10px;
+    .title {
+      font-size: 16px;
+      font-weight: bold;
+    }
+    .con {
+      p {
+        span {
+          font-weight: bold;
+          padding: 10px 0 0 0;
+        }
+      }
+    }
+    .videodata {
+      margin: 5px 0 0 0;
+      .videolist {
+        text-align: center;
+        background: #f1f1f1;
+        margin: 0 10px 10px 0;
+        border-radius: 10px;
+        height: 100px;
+        width: 48%;
+        padding: 15px 0;
+        p:nth-child(1) {
+          font-size: 16px;
+          font-weight: bold;
+          padding: 0 10px;
+          overflow: hidden;
+          text-overflow: ellipsis;
+          -webkit-line-clamp: 2;
+          word-break: break-all;
+          display: -webkit-box;
+          -webkit-box-orient: vertical;
+        }
+        p:nth-child(2) {
+          font-size: 14px;
+          font-weight: bold;
+        }
+      }
+      .videolist:nth-child(2n) {
+        margin: 0 0 10px 0;
+      }
+    }
+  }
+}
+/deep/.van-cell {
+  background-color: transparent;
+  padding: 5px 10px;
+}
+/deep/.van-collapse-item__content {
+  background-color: transparent;
+  color: black;
+  padding: 0 10px;
+}
+/deep/.van-swipe__indicators {
+  display: none;
+}
+/deep/.van-collapse-item {
+  border-bottom: 1px solid #f1f1f1;
+}
+/deep/.van-cell::after {
+  border: 0;
+}
+/deep/[class*='van-hairline']::after {
+  border: 0;
+}
+</style>

+ 102 - 0
src/viewTwo/channel/index.vue

@@ -0,0 +1,102 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="list" :typelist="typelist"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import list from './parts/list.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: channel } = createNamespacedHelpers('channel');
+const { mapActions: markettype } = createNamespacedHelpers('markettype');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 类型
+      typelist: [],
+      // 查询
+      name: '',
+      list: [],
+    };
+  },
+  async created() {
+    await this.searchtype();
+    await this.search();
+  },
+  methods: {
+    ...markettype({ markettypeList: 'query' }),
+    ...channel(['query', 'delete', 'update', 'create']),
+    async search({ ...info } = {}) {
+      if (this.name) info.title = this.name;
+      let res = await this.query({ ...info });
+      if (this.$checkRes(res)) {
+        console.log(res.data);
+        this.$set(this, `list`, res.data);
+      }
+    },
+    // 查询字典表
+    async searchtype() {
+      // 类型
+      let res = await this.markettypeList({ category: '04' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `typelist`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 40px;
+    overflow: hidden;
+  }
+}
+</style>

+ 114 - 0
src/viewTwo/channel/parts/list.vue

@@ -0,0 +1,114 @@
+<template>
+  <div id="list">
+    <el-row>
+      <el-col :span="24" class="con">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="show(item)">
+          <el-col :span="11" class="video">
+            <el-image :src="noimage"> </el-image>
+          </el-col>
+          <el-col :span="13" class="text">
+            <p class="title textOver">
+              <span style="color:#ff0000">[{{ item.room_id }}]</span>{{ item.title }}
+            </p>
+            <p class="type">
+              信息类型:<span>{{ getType(item.type) }}</span>
+            </p>
+            <p class="desc">{{ item.desc }}</p>
+            <p class="time textOver">{{ item.create_time }}</p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'list',
+  props: {
+    list: { type: Array },
+    typelist: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {
+      noimage: require('@/assets/kjzx.jpg'),
+    };
+  },
+  created() {},
+  methods: {
+    show(data) {
+      this.$router.push({ path: '/viewTwo/channel/detail', query: { id: data.id } });
+    },
+    getType(id) {
+      let data = this.typelist.find(i => i.id == id);
+      if (data) return data.name;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.con {
+  padding: 10px;
+  .list {
+    padding: 10px;
+    background-color: #fff;
+    border-radius: 5px;
+    margin: 0 0 10px 0;
+    .video {
+      height: 100px;
+      overflow: hidden;
+      .el-image {
+        width: 100%;
+        height: 100%;
+        border-radius: 10px;
+        /deep/.image-slot {
+          width: 100%;
+          height: 100%;
+        }
+      }
+    }
+    .text {
+      height: 100px;
+      overflow: hidden;
+      position: relative;
+      padding: 0 0 0 10px;
+      .title {
+        font-size: 16px;
+        font-weight: bold;
+      }
+      .type {
+        font-size: 14px;
+        padding: 5px 0 0 0;
+        span {
+          color: #666;
+        }
+      }
+      .desc {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        display: -webkit-box;
+        -webkit-line-clamp: 2;
+        -webkit-box-orient: vertical;
+        padding: 3px 0;
+        font-size: 12px;
+        color: #666;
+        height: 30px;
+      }
+      .time {
+        position: absolute;
+        bottom: 0px;
+        width: 95%;
+        font-size: 12px;
+        color: #666;
+      }
+    }
+  }
+}
+</style>

+ 261 - 0
src/viewTwo/expert/detail.vue

@@ -0,0 +1,261 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="back"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="mainTop">
+            <el-image :src="beijing"></el-image>
+          </el-col>
+          <el-col :span="24" class="message">
+            <el-col :span="24" class="one">
+              <el-image v-if="info.expertimage != null || undefined" :src="info.expertimage"></el-image>
+              <el-image :src="expertimage" v-else></el-image>
+              <p>
+                <span>{{ info.name || '暂无' }}</span>
+                <span>{{ info.email || '暂无' }}</span>
+              </p>
+            </el-col>
+            <el-col :span="24" class="two">
+              <van-tabs v-model="active" type="card" animated>
+                <van-tab title="基本资料">
+                  <el-col :span="24" class="basic">
+                    <p>
+                      <span>工作单位</span>
+                      <span>{{ info.company || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>毕业院校</span>
+                      <span>{{ info.school || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>最高学历</span>
+                      <span>{{ info.education || '暂无' }}</span>
+                    </p>
+
+                    <p>
+                      <span>出生日期</span>
+                      <span>{{ info.birthDate || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>职务职称</span>
+                      <span>{{ info.zwzc || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>QQ/微信</span>
+                      <span>{{ getphone(info.qqwx) || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>电子邮箱</span>
+                      <span>{{ info.email || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>擅长领域</span>
+                      <span>{{ info.expertise || '暂无' }}</span>
+                    </p>
+                  </el-col>
+                </van-tab>
+                <van-tab title="工作经历">
+                  <el-col :span="24" class="resume">
+                    <p>{{ info.workexperience || '暂无' }}</p>
+                  </el-col>
+                </van-tab>
+                <van-tab title="技术能力">
+                  <el-col :span="24" class="basic">
+                    <p>
+                      <span>科研综述</span>
+                      <span>{{ info.scientific || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>承担项目</span>
+                      <span>{{ info.undertakingproject || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>科技奖励</span>
+                      <span>{{ info.scienceaward || '暂无' }}</span>
+                    </p>
+                    <p>
+                      <span>社会任职</span>
+                      <span>{{ info.social || '暂无' }}</span>
+                    </p>
+                  </el-col>
+                </van-tab>
+              </van-tabs>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: exportuser } = createNamespacedHelpers('exportuser');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      beijing: require('@/assets/test1.jpg'),
+      expertimage: require('@/assets/222.png'),
+      active: '1',
+      info: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...exportuser(['fetch']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    back() {
+      this.$router.push({ path: '/viewTwo/expert/index' });
+    },
+    // 隐藏手机号
+    getphone(value) {
+      if (value == undefined) {
+        return '暂无';
+      } else {
+        if (value.length === 11 || value.length === 12) {
+          let start = value.slice(0, 4);
+          let end = value.slice(-3);
+          return `${start}****${end}`;
+        } else if (value.length === 20) {
+          let start = value.slice(0, 13);
+          let end = value.slice(-3);
+          return `${start}****${end}`;
+        } else {
+          return value;
+        }
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.detail {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  min-height: 570px;
+  .mainTop {
+    height: 150px;
+    overflow: hidden;
+    .el-image {
+      height: 150px;
+      overflow: hidden;
+    }
+  }
+  .message {
+    position: relative;
+    top: -40px;
+    padding: 0 15px;
+    .one {
+      height: 80px;
+      height: 80px;
+      margin: 0 0 15px 0;
+
+      .el-image {
+        float: left;
+        width: 80px;
+        height: 80px;
+        border-radius: 90px;
+      }
+      p {
+        float: left;
+        width: 65%;
+        font-size: 18px;
+        padding: 0 15px;
+        span {
+          display: inline-block;
+          width: 100%;
+          padding: 9px 0px;
+        }
+      }
+    }
+    .two {
+      .basic {
+        font-size: 16px;
+        color: #000;
+        p {
+          padding: 0 10px;
+          min-height: 40px;
+          line-height: 40px;
+          border-bottom: 1px dashed #f6f6f6;
+          span:first-child {
+            display: inline-block;
+            width: 25%;
+            color: #cccccc;
+          }
+        }
+      }
+      .resume {
+        font-size: 16px;
+        padding: 10px;
+        p {
+          line-height: 30px;
+        }
+      }
+    }
+  }
+}
+/deep/.van-tabs--card > .van-tabs__wrap {
+  height: 40px;
+}
+/deep/.van-tabs__nav--card {
+  height: 40px;
+  border: 1px solid #ccc;
+  margin: 0;
+}
+/deep/.van-tabs__nav--card .van-tab {
+  color: #666;
+}
+/deep/.van-tabs__nav--card .van-tab.van-tab--active {
+  background: transparent;
+  color: #2c69fe;
+  font-weight: bold;
+}
+/deep/.van-tabs__nav--card .van-tab {
+  border-right: 1px solid #ccc;
+}
+</style>

+ 101 - 0
src/viewTwo/expert/index.vue

@@ -0,0 +1,101 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="list"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import list from './parts/list.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: exportuser } = createNamespacedHelpers('exportuser');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 查询
+      name: '',
+      list: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...exportuser(['query']),
+    async search({ ...info } = {}) {
+      if (this.name) info.name = this.name;
+      let res = await this.query({ limit: 5, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 45px;
+    overflow: hidden;
+  }
+  .down {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+      border-bottom: 1px dashed #ccc;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 100px;
+    }
+  }
+}
+</style>

+ 77 - 0
src/viewTwo/expert/parts/list.vue

@@ -0,0 +1,77 @@
+<template>
+  <div id="tec">
+    <el-row>
+      <el-col :span="24" class="tec">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="6" class="image">
+            <el-image v-if="item.expertimage != null || undefined" :src="item.expertimage" style="width: 100%"></el-image>
+            <el-image :src="expertimage" style="width: 100%" v-else></el-image>
+          </el-col>
+          <el-col :span="18" class="name">
+            <p class="textOver">{{ item.name || '暂无' }}</p>
+            <p class="textOver">{{ item.zwzc || '暂无' }}</p>
+            <p class="textOver">{{ item.company || '暂无' }}</p>
+          </el-col>
+        </el-col>
+      </el-col>
+      <el-backtop :bottom="50" :right="10"> </el-backtop>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'tec',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {
+      expertimage: require('@/assets/222.png'),
+    };
+  },
+  created() {},
+  methods: {
+    //详情
+    detailBtn(data) {
+      this.$router.push({ path: '/viewTwo/expert/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.tec {
+  padding: 0 10px;
+  .list {
+    padding: 10px 0px;
+    border-bottom: 1px dashed #ccc;
+    .image {
+      .el-image {
+        border-radius: 50%;
+        height: 88px;
+      }
+    }
+    .name {
+      padding-left: 10px;
+      p {
+        color: #666;
+        font-size: 16px;
+        padding-top: 5px;
+      }
+      p:nth-child(1) {
+        font-size: 18px;
+        font-weight: bold;
+      }
+    }
+  }
+}
+</style>

+ 167 - 0
src/viewTwo/interview/detail.vue

@@ -0,0 +1,167 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="back"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="name">
+            {{ info.title }}
+          </el-col>
+          <el-col :span="24" class="date">
+            <span class="textOver">发布时间:{{ info.publish_time }}</span>
+            <span class="textOver"> 信息来源:{{ info.orgin }}</span>
+          </el-col>
+          <el-col :span="24" class="image" v-if="info.picture != null">
+            <el-image :src="info.picture">
+              <div slot="error" class="image-slot">
+                <i class="el-icon-picture-outline"></i></div
+            ></el-image>
+          </el-col>
+          <el-col :span="24" class="video">
+            <video
+              autoplay="autoplay"
+              controls="controls"
+              preload="meta"
+              x-webkit-airplay="true"
+              webkit-playsinline="true"
+              playsinline="true"
+              x5-video-player-type="h5"
+              x5-video-player-fullscreen="true"
+              controlsList="nodownload"
+              :src="info.filepath"
+              loop="loop"
+            >
+              <source src="movie.ogg" type="video/ogg" />
+              <source src="movie.mp4" type="video/mp4" />
+            </video>
+          </el-col>
+          <el-col :span="24" class="content">
+            <p v-html="info.content"></p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: newsguidance } = createNamespacedHelpers('newsguidance');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      info: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...newsguidance(['fetch']),
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `info`, res.data);
+        }
+      }
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: '/viewTwo/interview/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 46px;
+    overflow: hidden;
+  }
+  .info {
+    .name {
+      text-align: center;
+      padding: 15px 10px 0 10px;
+      font-size: 18px;
+      font-weight: bold;
+    }
+    .date {
+      margin: 15px 0;
+      span {
+        display: inline-block;
+        width: 50%;
+        text-align: center;
+        color: #666;
+      }
+    }
+    .image {
+      padding: 10px;
+      .el-image {
+        width: 100%;
+        height: 210px;
+      }
+    }
+    .video {
+      video {
+        width: 100%;
+        height: 215px;
+      }
+    }
+    .content {
+      padding: 10px 5px;
+    }
+  }
+}
+
+/deep/.content p img {
+  width: 100%;
+  height: 300px;
+  margin: 5px 0px;
+  display: block;
+}
+/deep/.content div img {
+  width: 100%;
+  height: 260px;
+  display: block;
+}
+/deep/.content p {
+  font-size: 14px;
+  color: #444;
+}
+</style>

+ 175 - 0
src/viewTwo/interview/index.vue

@@ -0,0 +1,175 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="search">
+            <el-col :span="6" class="select">
+              <el-select v-model="type" clearable placeholder="请选择">
+                <el-option v-for="(item, index) in typeList" :key="index" :label="item.name" :value="item.name"> </el-option>
+              </el-select>
+            </el-col>
+            <el-col :span="18" class="input">
+              <van-search v-model="name" @search="onSearch" placeholder="请输入信息标题" />
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="data">
+            <van-tabs v-model="active">
+              <van-tab title="嘉宾访谈">
+                <jbft :list="jbftList"></jbft>
+              </van-tab>
+              <van-tab title="技能培训">
+                <jnpx :list="jnpxList"></jnpx>
+              </van-tab>
+            </van-tabs>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+import jbft from './parts/jbft.vue';
+import jnpx from './parts/jnpx.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: newsguidance } = createNamespacedHelpers('newsguidance');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    jbft,
+    jnpx,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      // 查询
+      typeList: [{ name: '嘉宾访谈' }, { name: '技能培训' }],
+      type: '',
+      name: '',
+      // 标签
+      active: 0,
+      // 嘉宾访谈
+      jbftList: [],
+      // 技能培训
+      jnpxList: [
+        {
+          publish_time: '2020-11-30',
+          title: '技能培训',
+          titlejj: '信息简介信息简介信息简介',
+        },
+        {
+          publish_time: '2020-11-30',
+          title: '技能培训',
+          titlejj: '信息简介信息简介信息简介',
+        },
+        {
+          publish_time: '2020-11-30',
+          title: '技能培训',
+          titlejj: '信息简介信息简介信息简介',
+        },
+        {
+          publish_time: '2020-11-30',
+          title: '技能培训',
+          titlejj: '信息简介信息简介信息简介',
+        },
+      ],
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...newsguidance(['query']),
+    async search({ ...info } = {}) {
+      if (this.name) info.title = this.name;
+      let res = await this.query({ ...info });
+      if (this.$checkRes(res)) {
+        console.log(res);
+        this.$set(this, `jbftList`, res.data);
+      }
+    },
+    // 查询
+    onSearch() {
+      if (this.type) {
+        this.search();
+      } else {
+        this.$notify({
+          message: '请选择直播状态',
+          type: 'danger',
+        });
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  .top {
+    height: 45px;
+    overflow: hidden;
+  }
+  .info {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+      border-bottom: 1px solid #ccc;
+      background-color: #fff;
+      .select {
+        /deep/.el-input__inner {
+          border: none;
+          padding: 0;
+          height: 30px;
+          line-height: 30px;
+        }
+        .el-select {
+          padding: 10px 0px 0px 5px;
+          background: #fff;
+        }
+        /deep/.el-input__icon {
+          line-height: 30px;
+        }
+      }
+      .input {
+        .van-search {
+          padding: 10px 12px 10px 0;
+        }
+      }
+    }
+    .data {
+      top: 55px;
+      position: relative;
+    }
+  }
+}
+</style>

+ 73 - 0
src/viewTwo/interview/parts/jbft.vue

@@ -0,0 +1,73 @@
+<template>
+  <div id="jbft">
+    <el-row>
+      <el-col :span="24" class="jbft">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="18" class="name textOver">
+            {{ item.title }}
+          </el-col>
+          <el-col :span="6" class="date textOver">
+            {{ item.publish_time }}
+          </el-col>
+          <el-col :span="24" class="brief">
+            {{ item.titlejj || '暂无' }}
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'jbft',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    detailBtn(data) {
+      this.$router.push({ path: '/viewTwo/interview/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.jbft {
+  padding: 0 10px;
+  .list {
+    padding: 10px 0;
+    border-bottom: 1px dashed #cccccc;
+    .name {
+      font-weight: bold;
+      padding: 0 0 5px 0;
+    }
+    .date {
+      text-align: right;
+      padding: 0 0 5px 0;
+    }
+    .brief {
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 2;
+      word-break: break-all;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      height: 40px;
+    }
+  }
+}
+</style>

+ 69 - 0
src/viewTwo/interview/parts/jnpx.vue

@@ -0,0 +1,69 @@
+<template>
+  <div id="jnpx">
+    <el-row>
+      <el-col :span="24" class="jbft">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index">
+          <el-col :span="18" class="name textOver">
+            {{ item.title }}
+          </el-col>
+          <el-col :span="6" class="date textOver">
+            {{ item.publish_time }}
+          </el-col>
+          <el-col :span="24" class="brief">
+            {{ item.titlejj || '暂无' }}
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'jnpx',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.jbft {
+  padding: 0 10px;
+  .list {
+    padding: 10px 0;
+    border-bottom: 1px dashed #cccccc;
+    .name {
+      font-weight: bold;
+      padding: 0 0 5px 0;
+    }
+    .date {
+      text-align: right;
+      padding: 0 0 5px 0;
+    }
+    .brief {
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 2;
+      word-break: break-all;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      height: 40px;
+    }
+  }
+}
+</style>

+ 228 - 0
src/viewTwo/live/detail.vue

@@ -0,0 +1,228 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="video">
+          <el-col :span="24" class="top">
+            <!-- 直播 -->
+            <!-- <video id="videoElement" controls class="h5video"></video> -->
+            <!-- 视频播放 -->
+            <video
+              autoplay="autoplay"
+              controls="controls"
+              preload="meta"
+              x-webkit-airplay="true"
+              webkit-playsinline="true"
+              playsinline="true"
+              x5-video-player-type="h5"
+              x5-video-player-fullscreen="true"
+              :src="videoPath"
+              v-if="videoData.length > 0"
+              loop="loop"
+            >
+              <source src="movie.ogg" type="video/ogg" />
+              <source src="movie.mp4" type="video/mp4" />
+            </video>
+            <p v-else>{{ dockInfo.title }}</p>
+          </el-col>
+          <el-col :span="24" class="down">
+            <el-button type="primary" size="mini" @click="back()">返回列表</el-button>
+            <el-button type="primary" size="mini" @click="showPopup()">选择视频</el-button>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="imgchat">
+          <van-tabs v-model="active">
+            <van-tab title="图文直播">
+              <imgtxtdock></imgtxtdock>
+            </van-tab>
+            <van-tab title="公共聊天">
+              <dockchat></dockchat>
+            </van-tab>
+            <van-tab title="参展项目">
+              <czxm></czxm>
+            </van-tab>
+            <van-tab title="项目路演">
+              <xmly></xmly>
+            </van-tab>
+          </van-tabs>
+        </el-col>
+      </el-col>
+    </el-row>
+    <van-popup v-model="show" position="bottom">
+      <van-picker
+        title="视频信息"
+        v-model="show"
+        show-toolbar
+        :columns="videoData"
+        @confirm="onConfirm"
+        @cancel="onCancel"
+        @change="onChange"
+        value-key="videointro"
+      />
+    </van-popup>
+  </div>
+</template>
+
+<script>
+// 图文直播
+import imgtxtdock from './liveDetail/imgtxtdock.vue';
+// 公共聊天
+import dockchat from './liveDetail/dockchat.vue';
+// 参展项目
+import czxm from './liveDetail/czxm.vue';
+// 项目路演
+import xmly from './liveDetail/xmly.vue';
+
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+import moment from 'moment';
+import flvjs from 'flv.js';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    // 图文直播
+    imgtxtdock,
+    // 公共聊天
+    dockchat,
+    // 参展项目
+    czxm,
+    // 项目路演
+    xmly,
+  },
+  data: function() {
+    return {
+      // 展会id
+      dock_id: '',
+      //展会详情
+      dockInfo: {},
+      // 视频管理
+      show: false,
+      menuIndex: '0',
+      videoData: [],
+      videoPath: '',
+      // 图文直播
+      active: 0,
+    };
+  },
+  async created() {
+    if (this.id) {
+      this.$set(this, `dock_id`, this.id);
+    }
+    await this.search();
+    await this.seachtVideo();
+    this.$nextTick(() => {
+      // this.searchLive();
+    });
+  },
+  methods: {
+    ...dock({ dockQuery: 'query', dockFetch: 'fetch' }),
+    async search() {
+      //展会详情
+      let res = await this.dockFetch(this.dock_id);
+      if (this.$checkRes(res)) this.$set(this, `dockInfo`, res.data);
+    },
+    // 视频管理
+    // 打开
+    showPopup() {
+      this.show = true;
+    },
+    // 查询视频
+    async seachtVideo() {
+      let res = await this.dockFetch(this.dock_id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `videoData`, res.data.videodata);
+        this.changeMenu('0', this.videoData[0]);
+      }
+    },
+    channelvideo() {
+      this.$stomp({
+        [`/exchange/dock_video/${this.dock_id}`]: this.onMessageVideo,
+      });
+    },
+    onMessageVideo(message) {
+      let arr = JSON.parse(message.body);
+      this.$set(this, `videoData`, arr);
+      let num = this.videoData.length - 1;
+      let newarr = _.last(arr);
+      this.changeMenu(num, newarr);
+    },
+    // 选择视频
+    changeMenu(index, item) {
+      if (item) {
+        this.menuIndex = index;
+        this.$set(this, `videoPath`, item.file_path);
+      }
+    },
+    // 确定选择
+    onConfirm(value, index) {
+      this.changeMenu(index, value);
+      this.onCancel();
+    },
+    onChange(value, index) {
+      this.changeMenu(index, value);
+    },
+    // 取消
+    onCancel() {
+      this.show = false;
+    },
+    // 返回列表
+    back() {
+      this.$router.push({ path: '/viewTwo/live/index' });
+    },
+    searchLive() {
+      let player = document.getElementById('videoElement');
+      let rmtpUrl = `${process.env.VUE_APP_LIVE_URL + this.dockInfo.room_id}`;
+      if (flvjs.isSupported()) {
+        var flvPlayer = flvjs.createPlayer({
+          isLive: true,
+          type: 'flv',
+          url: rmtpUrl,
+        });
+        flvPlayer.attachMediaElement(player);
+        flvPlayer.load(); //加载
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .video {
+    .top {
+      height: 215px;
+      background-color: #000;
+      video {
+        width: 100%;
+        height: 215px;
+      }
+      .h5video {
+        width: 100%;
+        height: 215px;
+      }
+      p {
+        font-size: 18px;
+      }
+    }
+    .down {
+      text-align: center;
+      height: 40px;
+      padding: 5px 0;
+    }
+  }
+  .imgchat {
+    padding: 0 10px;
+  }
+}
+</style>

+ 472 - 0
src/viewTwo/live/detailtwo.vue

@@ -0,0 +1,472 @@
+<template>
+  <div id="detailtwo">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="video">
+          <el-col :span="24" class="top">
+            <el-col :span="24" class="downVideo" v-if="videoData != ''">
+              <video
+                autoplay="autoplay"
+                controls="controls"
+                preload="meta"
+                x-webkit-airplay="true"
+                webkit-playsinline="true"
+                playsinline="true"
+                x5-video-player-type="h5"
+                x5-video-player-fullscreen="true"
+                controlsList="nodownload"
+                :src="videoPath"
+                loop="loop"
+              >
+                <source src="movie.ogg" type="video/ogg" />
+                <source src="movie.mp4" type="video/mp4" />
+              </video>
+            </el-col>
+            <el-col :span="24" class="downTxt" v-else>
+              <p>{{ dockInfo.title }}</p>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="down">
+            <el-col :span="12" class="left">
+              <el-link :underline="false" class="back" @click="back()">返回列表</el-link>
+            </el-col>
+            <el-col :span="12" class="right">
+              <el-link :underline="false" class="back" @click="showPopup">选择视频</el-link>
+            </el-col>
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="chat">
+          <van-tabs v-model="chatactive" type="card" animated>
+            <!-- <van-tab title="图文直播">
+              <textVideo :list="lunboList"></textVideo>
+            </van-tab> -->
+            <van-tab title="公共聊天">
+              <chat></chat>
+            </van-tab>
+          </van-tabs>
+        </el-col>
+        <el-col :span="24" class="market">
+          <van-tabs v-model="marketactive" type="card" animated>
+            <van-tab title="技术成果">
+              <el-col :span="24" class="one">
+                <el-col :span="24" class="list" v-for="(item, index) in achieveList" :key="index">
+                  <p class="textOver">{{ item.name }}</p>
+                  <p class="textOver">领域:{{ item.field }}</p>
+                  <p class="textOver">联系人:{{ item.contacts }}</p>
+                </el-col>
+              </el-col>
+            </van-tab>
+            <van-tab title="科技需求">
+              <el-col :span="24" class="one">
+                <el-col :span="24" class="list" v-for="(item, index) in techolList" :key="index">
+                  <p class="textOver">{{ item.name }}</p>
+                  <p class="textOver">领域:{{ item.field }}</p>
+                  <p class="textOver">联系人:{{ item.contacts }}</p>
+                </el-col>
+              </el-col>
+            </van-tab>
+            <van-tab title="专家智库">
+              <el-col :span="24" class="three">
+                <el-col :span="24" class="expertList" v-for="(item, index) in expertList" :key="index" @click.native="expertBtn(item)">
+                  <el-col :span="5" class="image">
+                    <el-image
+                      :src="item.expertimage"
+                      style="width:70px;height: 70px;border: 1px solid #f1f1f1;"
+                      v-if="item.expertimage != null || undefined"
+                    ></el-image>
+                    <el-image :src="expertimage" style="width:70px;height: 70px;border: 1px solid #f1f1f1;" v-else></el-image>
+                  </el-col>
+                  <el-col :span="19" class="info1">
+                    <el-col :span="24" class="name textOver">
+                      {{ item.name }}
+                    </el-col>
+                    <el-col :span="24" class="txt textOver"> {{ item.zwzc || '暂无' }} </el-col>
+                    <el-col :span="24" class="txt textOver"> {{ item.company || '暂无' }} </el-col>
+                  </el-col>
+                </el-col>
+              </el-col>
+            </van-tab>
+          </van-tabs>
+        </el-col>
+      </el-col>
+    </el-row>
+    <van-popup v-model="show" position="bottom">
+      <van-picker
+        title="视频信息"
+        v-model="show"
+        show-toolbar
+        :columns="videoData"
+        @confirm="onConfirm"
+        @cancel="onCancel"
+        @change="onChange"
+        value-key="videointro"
+      />
+    </van-popup>
+  </div>
+</template>
+
+<script>
+// 公共聊天
+import chat from '@/components/parts/chat.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+const { mapActions: marketuser } = createNamespacedHelpers('marketuser');
+const { mapActions: exportuser } = createNamespacedHelpers('exportuser');
+const { mapActions: newsguidance } = createNamespacedHelpers('newsguidance');
+const { mapActions: newsroadshow } = createNamespacedHelpers('newsroadshow');
+import moment from 'moment';
+export default {
+  name: 'detailtwo',
+  props: {},
+  components: {
+    chat,
+  },
+  data: function() {
+    return {
+      // 展会id
+      dock_id: '',
+      //展会详情
+      dockInfo: [],
+      // 聊天
+      chatactive: 0,
+      // 图文直播
+      lunboList: [],
+      // 科技超市
+      marketactive: 0,
+      // 技术成果
+      achieveList: [],
+      // 科技需求
+      techolList: [],
+      // 专家智库
+      expertList: [],
+      expertimage: require('@/assets/222.png'),
+      // 嘉宾,项目
+      jbxmactive: 0,
+      // 嘉宾访谈
+      zxzdlist: [],
+      // 项目路演
+      xmlyList: [],
+      // 视频管理
+      show: false,
+      menuIndex: '0',
+      videoData: [],
+      videoPath: '',
+    };
+  },
+  async created() {
+    if (this.id) {
+      this.$set(this, `dock_id`, this.id);
+    }
+    await this.search();
+    await this.seachtVideo();
+    await this.seachLunbo();
+  },
+  mounted() {
+    this.channel();
+  },
+  methods: {
+    ...dock({ dockQuery: 'query', dockFetch: 'fetch' }),
+    ...exportuser({ expertQuery: 'query' }),
+    ...marketuser({ operaFetch: 'operaFetch' }),
+    ...newsguidance({ danceQuery: 'query' }),
+    ...newsroadshow({ newsroadshowquery: 'query' }),
+    // 查询
+    async search() {
+      //展会详情
+      let res = await this.dockFetch(this.dock_id);
+      if (this.$checkRes(res)) this.$set(this, `dockInfo`, res.data);
+      let czxm = res.data.apply.map(item => item.goodsList);
+      czxm = _.flattenDeep(czxm);
+      var czxmNew = czxm.filter(item => item.dockStatus == '1');
+      //科技需求
+      var jishuData = czxmNew.filter(item => item.type === '0');
+      this.$set(this, `techolList`, jishuData);
+      //技术成果
+      var chanpinData = czxmNew.filter(item => item.type === '1');
+      if (chanpinData) this.$set(this, `achieveList`, chanpinData);
+      // 专家智库
+      let exportdata = await this.expertQuery({ role: 6 });
+      if (this.$checkRes(exportdata)) this.$set(this, `expertList`, exportdata.data);
+      //嘉宾访谈
+      let jbftData = await this.danceQuery({ dock_id: this.id });
+      if (this.$checkRes(jbftData)) this.$set(this, `zxzdlist`, jbftData.data);
+      // 项目路演
+      let xmly = await this.newsroadshowquery({ dock_id: this.id });
+      if (this.$checkRes(xmly)) this.$set(this, `xmlyList`, xmly.data);
+    },
+    // 查询图文直播
+    async seachLunbo() {
+      let res = await this.operaFetch({ dockid: this.id });
+      for (const val of res.data) {
+        var date = moment(val.meta.createdAt).format('YYYY-MM-DD hh:mm');
+        val.date = date;
+      }
+      if (this.$checkRes(res)) {
+        this.$set(this, `lunboList`, res.data);
+      }
+    },
+    channel() {
+      this.$stomp({
+        [`/exchange/dock_video/${this.dock_id}`]: this.onMessage,
+      });
+    },
+    onMessage(message) {
+      this.$set(this.dockinfo, `file_path`, message.body);
+    },
+    // 专家详情
+    expertBtn(data) {
+      this.$router.push({ path: '/market/exportDetail', query: { id: data.id } });
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: '/viewTwo/live/index' });
+    },
+    // 选择视频
+    showPopup() {
+      this.show = true;
+    },
+    // 视频管理
+    async seachtVideo() {
+      let res = await this.dockFetch(this.dock_id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `videoData`, res.data.videodata);
+        this.changeMenu('0', this.videoData[0]);
+      }
+    },
+    channelvideo() {
+      this.$stomp({
+        [`/exchange/dock_video/${this.dock_id}`]: this.onMessageVideo,
+      });
+    },
+    onMessageVideo(message) {
+      let arr = JSON.parse(message.body);
+      this.$set(this, `videoData`, arr);
+      let num = this.videoData.length - 1;
+      let newarr = _.last(arr);
+      this.changeMenu(num, newarr);
+    },
+    changeMenu(index, item) {
+      if (item) {
+        this.menuIndex = index;
+        this.$set(this, `videoPath`, item.file_path);
+      }
+    },
+    // 确定
+    onConfirm(value, index) {
+      this.changeMenu(index, value);
+      this.onCancel();
+    },
+    // 选择
+    onChange(value, index) {
+      this.changeMenu(index, value);
+    },
+    onCancel() {
+      this.show = false;
+    },
+  },
+  mounted() {
+    this.channelvideo();
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {},
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  // 视频
+  .video {
+    height: 255px;
+    overflow: hidden;
+    .top {
+      height: 215px;
+      overflow: hidden;
+      .downVideo {
+        position: fixed;
+        z-index: 1;
+        width: 100%;
+        video {
+          width: 100%;
+          height: 215px;
+        }
+      }
+      .downTxt {
+        height: 215px;
+        text-align: center;
+        background-image: url('~@/assets/dock1.png');
+        background-size: 100% 100%;
+        background-repeat: no-repeat;
+        p {
+          font-size: 25px;
+          color: #fff;
+          padding: 25px 10px;
+        }
+      }
+    }
+    .down {
+      height: 40px;
+      overflow: hidden;
+      background-color: #f1f1f1;
+      .left {
+        height: 40px;
+        line-height: 40px;
+        border-right: 1px dashed #ccc;
+        text-align: center;
+        .el-link {
+          color: #333;
+          font-weight: bold;
+        }
+      }
+      .right {
+        text-align: center;
+        height: 40px;
+        line-height: 40px;
+        .el-link {
+          color: #333;
+          font-weight: bold;
+        }
+      }
+    }
+    // .back {
+    //   position: fixed;
+    //   z-index: 999;
+    //   i {
+    //     font-size: 30px;
+    //     font-weight: bold;
+    //     margin: 5px 0 0px 5px;
+    //     color: #409eff;
+    //   }
+    // }
+    // .videoone {
+    //   height: 215px;
+    //   overflow: hidden;
+    //   video {
+    //     width: 100%;
+    //   }
+    // }
+    // .videotwo {
+    //   background: url('~@/assets/directBack.png');
+    //   background-size: 100% 100%;
+    //   height: 215px;
+    //   overflow: hidden;
+    //   text-align: center;
+    //   color: #fff;
+    //   font-size: 20px;
+    //   padding: 15% 3%;
+    // }
+  }
+  // 聊天
+  .chat {
+    margin: 15px 0 0 0;
+    height: 400px;
+    overflow: hidden;
+  }
+  // 科技超市
+  .market {
+    margin: 15px 0 0 0;
+    .one {
+      max-height: 550px;
+      overflow-y: auto;
+      padding: 0 16px;
+      min-height: 102px;
+      .list {
+        border-bottom: 1px dashed #ccc;
+        padding: 10px 0;
+        p {
+          font-size: 16px;
+          color: #666;
+          padding: 5px 0 0 0;
+        }
+        p:nth-child(1) {
+          font-size: 18px;
+          font-weight: bold;
+          color: #000;
+        }
+      }
+    }
+    .three {
+      max-height: 550px;
+      overflow-y: auto;
+      padding: 0 16px;
+      min-height: 92px;
+      .expertList {
+        padding: 5px 0px;
+        border-bottom: 1px dashed #ccc;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        .name {
+          font-size: 18px;
+          font-weight: bolder;
+        }
+        .field {
+          margin-top: 8px;
+          font-size: 16px;
+          color: #666;
+        }
+        .image {
+          margin-top: 5px;
+          .el-image {
+            border-radius: 90%;
+          }
+        }
+        .info1 {
+          padding: 6px 0px 1px 20px;
+        }
+      }
+    }
+  }
+  // 主办方
+  .company {
+    margin: 15px 0 0 0;
+    .name {
+      margin: 0 0 20px 0;
+      padding: 0 10px;
+      p {
+        text-align: center;
+        color: #409eff;
+      }
+      p:nth-child(1) {
+        font-family: cursive;
+        font-size: 30px;
+        font-weight: bolder;
+        text-shadow: 5px 5px 2px #ccc;
+      }
+      p:nth-child(2) {
+        padding: 10px 0 0 0;
+        font-size: 20px;
+      }
+    }
+  }
+}
+// 标签样式重定义
+/deep/.van-tab {
+  font-size: 16px;
+}
+/deep/.van-tabs--card > .van-tabs__wrap {
+  height: 35px;
+}
+/deep/.van-tabs__nav--card {
+  height: 35px;
+  // margin: 0;
+}
+/deep/.van-tabs__nav--card {
+  border: 1px solid #409eff;
+}
+/deep/.van-tabs__nav--card .van-tab {
+  color: #666;
+  border-right: 1px solid #409eff;
+}
+/deep/.van-tabs__nav--card .van-tab.van-tab--active {
+  background-color: #409eff;
+  color: #fff;
+}
+</style>

+ 285 - 0
src/viewTwo/live/exportsDetail.vue

@@ -0,0 +1,285 @@
+<template>
+  <div id="roomDetail">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="video">
+            <el-link :underline="false" class="back" @click="back()"><i class="el-icon-arrow-left"></i></el-link>
+            <el-col :span="24" class="videoone" v-if="videodock.file_path != null || ''">
+              <video
+                autoplay="autoplay"
+                controls="controls"
+                preload="meta"
+                x-webkit-airplay="true"
+                webkit-playsinline="true"
+                playsinline="true"
+                x5-video-player-type="h5"
+                x5-video-player-fullscreen="true"
+                controlsList="nodownload"
+                :src="videodock.file_path"
+                loop="loop"
+              >
+                <source src="movie.ogg" type="video/ogg" />
+                <source src="movie.mp4" type="video/mp4" />
+              </video>
+            </el-col>
+            <el-col :span="24" class="videotwo" v-else>
+              专家培训在线模板
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="chat">
+            <van-tabs v-model="chatactive" type="card" animated>
+              <van-tab title="公共聊天">
+                <el-col :span="24" class="right">
+                  <el-col :span="24" class="list">
+                    <el-col :span="24" class="chatList" v-for="(item, index) in lunboList" :key="index">
+                      <el-col :span="3" class="image">
+                        <el-image :src="touxiang" style="width:30px;height:30px"></el-image>
+                      </el-col>
+                      <el-col :span="21" class="other">
+                        <el-col :span="24" class="one">
+                          <span class="name">{{ item.name }}</span>
+                          <span class="time">{{ item.date }}</span>
+                        </el-col>
+                        <el-col :span="24" class="othertwo">
+                          <p class="remark">{{ item.content }}</p>
+                        </el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                  <el-col :span="24" class="send">
+                    <el-col :span="19">
+                      <el-input v-model="text" size="mini"></el-input>
+                    </el-col>
+                    <el-col :span="5">
+                      <el-button size="mini" type="primary">发送</el-button>
+                    </el-col>
+                  </el-col>
+                </el-col>
+              </van-tab>
+            </van-tabs>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+// 图文直播
+import textVideo from '@/components/parts/textVideo.vue';
+// 公共聊天
+import chat from '@/components/parts/chat.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+import moment from 'moment';
+export default {
+  name: 'videoDetail2',
+  props: {},
+  components: {
+    // textVideo,
+    // chat,
+  },
+  data: function() {
+    return {
+      // 展会id
+      dock_id: '',
+      // 视频信息
+      videodock: {},
+      //展会详情
+      dockinfo: [],
+      // 聊天
+      chatactive: 0,
+      // 图文直播
+      lunboList: [
+        { name: '顾红伟', date: '10:00', content: '信息内容' },
+        { name: '顾红伟', date: '10:00', content: '信息内容' },
+      ],
+      // 科技超市
+      marketactive: 0,
+      expertimage: require('@/assets/222.png'),
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      touxiang: require('@/assets/touxiang.png'),
+      hand: require('@/assets/flower.gif'),
+      text: '',
+    };
+  },
+  created() {},
+  methods: {
+    async searchvideo() {
+      if (this.dock_id) {
+        let res = await this.dockFetch(this.dock_id);
+        if (this.$checkRes(res)) {
+          // 对接会详情
+          this.$set(this, `videodock`, res.data);
+        }
+      }
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: '/viewTwo/live/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {},
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+  position: relative;
+  z-index: 999;
+}
+.main {
+  min-height: 570px;
+}
+.foot {
+  position: absolute;
+  bottom: 0;
+}
+.main {
+  position: relative;
+  // 视频
+  .video {
+    height: 215px;
+    overflow: hidden;
+    .back {
+      position: fixed;
+      z-index: 999;
+      i {
+        font-size: 30px;
+        font-weight: bold;
+        margin: 5px 0 0px 5px;
+        color: #409eff;
+      }
+    }
+    .videoone {
+      height: 215px;
+      overflow: hidden;
+      video {
+        width: 100%;
+      }
+    }
+    .videotwo {
+      background: url('~@/assets/directBack.png');
+      background-size: 100% 100%;
+      height: 215px;
+      overflow: hidden;
+      text-align: center;
+      color: #fff;
+      font-size: 20px;
+      padding: 15% 3%;
+    }
+  }
+  .chat {
+    margin: 15px 0 0 0;
+    height: 400px;
+    // overflow: hidden;
+    .right {
+      height: 400px;
+      overflow: hidden;
+      border-left: 1px dashed #f1f1f1;
+      border-right: 1px dashed #f1f1f1;
+      border-bottom: 1px dashed #f1f1f1;
+      .top {
+        background-color: #409eff;
+        height: 33px;
+        text-align: center;
+        line-height: 33px;
+        width: 170px;
+        margin: 0px 20px 0px 100px;
+        color: white;
+      }
+      .list {
+        height: 360px;
+        overflow-y: auto;
+        overflow-x: hidden;
+        padding: 0 16px;
+        .chatList {
+          padding: 10px 0;
+          border-bottom: 1px dashed #ccc;
+          .image {
+            text-align: center;
+          }
+          .other {
+            .one {
+              .name {
+                color: #000;
+                font-size: 16px;
+                font-weight: bold;
+              }
+              .time {
+                display: inline-block;
+                margin: 0 0 0 15px;
+                color: #ccc;
+              }
+            }
+            .othertwo {
+              margin: 5px 0 0 0;
+              color: #000;
+              .remark {
+                min-height: 20px;
+                font-size: 15px;
+                padding: 5px;
+                border-radius: 5px;
+                background: #245efe5f;
+              }
+            }
+          }
+        }
+      }
+      .send {
+        height: 40px;
+        line-height: 38px;
+        padding: 0 0 0 12px;
+        position: absolute;
+        bottom: 0px;
+        z-index: 9999;
+      }
+    }
+  }
+}
+// 标签样式重定义
+/deep/.van-tab {
+  font-size: 16px;
+}
+/deep/.van-tabs--card > .van-tabs__wrap {
+  height: 35px;
+}
+/deep/.van-tabs__nav--card {
+  height: 35px;
+  // margin: 0;
+}
+/deep/.van-tabs__nav--card {
+  border: 1px solid #409eff;
+}
+/deep/.van-tabs__nav--card .van-tab {
+  color: #666;
+  border-right: 1px solid #409eff;
+}
+/deep/.van-tabs__nav--card .van-tab.van-tab--active {
+  background-color: #409eff;
+  color: #fff;
+}
+</style>

+ 138 - 0
src/viewTwo/live/index.vue

@@ -0,0 +1,138 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <span v-if="columnview == '0'">
+            <product :province="province" :place="place"></product>
+          </span>
+          <span v-else-if="columnview == '1'">
+            <personal :province="province" :place="place"></personal>
+          </span>
+          <span v-else-if="columnview == '2'">
+            <exports :province="province" :place="place"></exports>
+          </span>
+        </el-col>
+        <el-col :span="24" class="foot">
+          <van-tabbar v-model="active" @change="changeType">
+            <van-tabbar-item icon="cluster-o">科技成果在线</van-tabbar-item>
+            <van-tabbar-item icon="friends-o" disabled>人才对接在线</van-tabbar-item>
+            <van-tabbar-item icon="manager-o">专家培训在线</van-tabbar-item>
+          </van-tabbar>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, mapMutations, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+import footInfo from '@/layout/common/footInfo.vue';
+import product from './parts/product.vue';
+import personal from './parts/personal.vue';
+import exports from './parts/exports.vue';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+const { mapActions: place } = createNamespacedHelpers('place');
+const jwt = require('jsonwebtoken');
+export default {
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    // footInfo,
+    product,
+    personal,
+    exports,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '科技成果在线',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      // 省
+      province: [],
+      // 市
+      place: [],
+      // 显示模块
+      columnview: '0',
+      active: 0,
+    };
+  },
+  async created() {
+    await this.searchPlace();
+  },
+  methods: {
+    ...mapMutations(['setUser']),
+    ...place({ palcequery: 'query', transactiondtetle: 'delete' }),
+    async searchPlace() {
+      let res1 = await this.palcequery({ level: 1 });
+      let arr = await this.palcequery({ level: 2 });
+      if (res1 || arr) {
+        this.$set(this, `province`, res1.data);
+        this.$set(this, `place`, arr.data);
+      }
+    },
+    sesstoken() {
+      if (this.token) {
+        sessionStorage.setItem('token', this.token);
+        let user = jwt.decode(this.token);
+        if (user && user.uid) {
+          this.setUser(user);
+        }
+      }
+    },
+    // 选择栏目
+    changeType(value) {
+      if (value == '0') {
+        this.$set(this, `title`, '科技成果在线');
+      } else if (value == '1') {
+        this.$set(this, `title`, '人才对接在线');
+      } else if (value == '2') {
+        this.$set(this, `title`, '专家培训在线');
+      }
+      this.$set(this, `columnview`, value);
+      this.$set(this, `active`, value);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    token() {
+      return this.$route.query.token;
+    },
+  },
+  watch: {
+    token: {
+      immediate: true,
+      deep: true,
+      handler(val) {
+        this.sesstoken();
+      },
+    },
+  },
+  mounted() {
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+  position: relative;
+  z-index: 999;
+}
+</style>

+ 88 - 0
src/viewTwo/live/liveDetail/czxm.vue

@@ -0,0 +1,88 @@
+<template>
+  <div id="czxm">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="19" class="textOver name">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="5" class="textOver type">
+            {{ item.type == '0' ? '科技需求' : '技术成果' }}
+          </el-col>
+          <el-col :span="24" class="textOver other"> 领域:{{ item.field }} </el-col>
+          <el-col :span="24" class="textOver other"> 领域:{{ item.contacts }} </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+export default {
+  name: 'czxm',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      // 展会id
+      dock_id: '',
+      list: [],
+    };
+  },
+  async created() {
+    if (this.id) {
+      this.$set(this, `dock_id`, this.id);
+    }
+    await this.search();
+  },
+  methods: {
+    ...dock(['fetch']),
+    async search() {
+      // 参展项目
+      let res = await this.fetch(this.dock_id);
+      if (this.$checkRes(res)) {
+        let czxm = res.data.apply.map(item => item.goodsList);
+        czxm = _.flattenDeep(czxm);
+        this.$set(this, `list`, czxm);
+      }
+    },
+    // 详情页面
+    detailBtn(data) {
+      this.$router.push({ path: '/market/productDetail', query: { id: data._id, type: data.type } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  min-height: 365px;
+  max-height: 365px;
+  overflow-y: auto;
+  .list {
+    padding: 5px 0;
+    border-bottom: 1px dashed #ccc;
+    .name {
+      font-size: 16px;
+      font-weight: bold;
+    }
+    .type {
+      font-size: 14px;
+      text-align: center;
+    }
+    .other {
+      font-size: 14px;
+      padding: 5px 0 0 0;
+    }
+  }
+}
+</style>

+ 254 - 0
src/viewTwo/live/liveDetail/dockchat.vue

@@ -0,0 +1,254 @@
+<template>
+  <div id="dockchat">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="list" v-for="(i, index) in list" :key="index">
+          <span v-if="!isEmotion(i.content)">
+            <el-col :span="24" class="one">
+              [<span>{{ i.send_time | getTime }}</span
+              >]
+              <span>{{ i.sender_name }}</span>
+            </el-col>
+            <el-col :span="24" class="two">
+              <span> {{ i.content }}</span>
+            </el-col>
+          </span>
+          <span v-else>
+            <el-col :span="24" class="thr">
+              <span class="textOver">{{ i.sender_name }}</span>
+              <span>送出一朵/个</span>
+              <span v-html="i.content"></span>
+            </el-col>
+          </span>
+        </el-col>
+      </el-col>
+    </el-row>
+    <el-col :span="24" class="sendtxt">
+      <van-button icon="chat" type="info" round @click="show = true" />
+    </el-col>
+    <van-popup v-model="show" position="bottom" class="popup">
+      <van-col span="24" class="one">
+        <p>快捷发言</p>
+        <p>
+          <span v-for="(i, index) in kjfyList" :key="index" @click="changekjfy(i.name)">{{ i.name }}</span>
+        </p>
+      </van-col>
+      <van-col span="24" class="two">
+        <van-col span="19">
+          <van-field v-model="text" placeholder="请输入内容" />
+        </van-col>
+        <van-col span="5" style="text-align:center;">
+          <van-button round type="info" @click="send()">发言</van-button>
+        </van-col>
+      </van-col>
+    </van-popup>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: chat } = createNamespacedHelpers('chat');
+var moment = require('moment');
+import _ from 'lodash';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'dockchat',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      // 展会id
+      dock_id: '',
+      list: [],
+      // 发言
+      show: false,
+      text: '',
+      // 快捷发言列表
+      kjfyList: [{ name: '欢迎欢迎' }, { name: '科技创新' }, { name: '大咖云集' }],
+    };
+  },
+  async created() {
+    this.$set(this, 'dock_id', this.$route.query.id);
+    this.search();
+  },
+  mounted() {
+    this.channel();
+  },
+  methods: {
+    ...chat(['query', 'create']),
+    async search() {
+      const res = await this.query({ skip: 0, dock_id: this.dock_id });
+      if (this.$checkRes(res)) this.$set(this, `list`, res.data);
+    },
+    isEmotion(word) {
+      return word.startsWith('<img');
+    },
+    channel() {
+      this.$stomp({
+        [`/exchange/public_chat/${this.dock_id}`]: this.onMessage,
+      });
+    },
+    onMessage(message) {
+      console.log(message);
+      let body = _.get(message, 'body');
+      if (body) {
+        body = JSON.parse(body);
+        this.list.push(body);
+        this.text = '';
+      }
+      this.search();
+    },
+    // 发言
+    async send() {
+      if (this.text != '') {
+        let object = { sender_name: this.user.name ? this.user.name : '游客', content: this.text, dock_id: this.dock_id };
+        if (this.user.uid) {
+          object.sender_id = this.user.uid;
+          object.role = this.user.role;
+        }
+        let res = await this.create(object);
+        this.text = '';
+        this.show = false;
+        this.$checkRes(res, null, res.errmsg || '发言失败');
+      } else this.$message.error('请输入信息后发送');
+    },
+    // 选择快捷发言
+    changekjfy(data) {
+      this.$set(this, `text`, data);
+      this.send();
+    },
+  },
+  filters: {
+    getTime(date) {
+      if (!date) return '很久以前';
+      let today = moment().format('YYYY-MM-DD');
+      let dd = moment(date).format('YYYY-MM-DD');
+      let time;
+      if (today == dd) time = moment(date).format('HH:mm');
+      else time = moment(date).format('YYYY-MM-DD');
+      return time;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  min-height: 365px;
+  max-height: 365px;
+  overflow-y: auto;
+  .list {
+    padding: 5px 0;
+    .one {
+      padding: 5px 0;
+      span:nth-child(1) {
+        color: #ff0000;
+      }
+      span:nth-child(2) {
+        font-size: 16px;
+        color: #999;
+      }
+    }
+    .two {
+      min-height: 30px;
+      span {
+        font-size: 15px;
+        background: #f1f1f1;
+        padding: 5px;
+        border-radius: 5px;
+        min-width: 30%;
+        display: inline-block;
+      }
+    }
+    .thr {
+      text-align: center;
+      background: #f1f1f1;
+      border-radius: 25px;
+      width: 80%;
+      margin: 0 10%;
+      padding: 5px 0;
+      span:nth-child(1) {
+        color: #db7093;
+        font-weight: bold;
+        position: relative;
+        top: -3px;
+        font-size: 15px;
+        display: inline-block;
+        width: 45%;
+      }
+      span:nth-child(2) {
+        color: #000000;
+        position: relative;
+        top: -7px;
+        font-size: 15px;
+      }
+      span:nth-child(3) {
+        position: relative;
+        top: 2px;
+        left: 5px;
+      }
+    }
+  }
+}
+// 发言
+.sendtxt {
+  position: fixed;
+  bottom: 10px;
+  right: 10px;
+  width: 100%;
+  z-index: 999;
+  text-align: right;
+}
+.popup {
+  .one {
+    color: #fff;
+    p:nth-child(1) {
+      text-align: center;
+      padding: 25px 0;
+      font-size: 20px;
+    }
+    p:nth-child(2) {
+      padding: 0 10px;
+      text-align: center;
+      span {
+        background-color: #409eff9f;
+        display: inline-block;
+        border-radius: 25px;
+        margin: 0 10px 10px 0;
+        font-size: 15px;
+        padding: 5px 10px;
+      }
+      span:nth-child(4n) {
+        margin: 0 0 10px 0;
+      }
+    }
+  }
+  .two {
+    position: absolute;
+    bottom: 0;
+    width: 100%;
+    background: #fff;
+    padding: 5px 5px;
+    height: 40px;
+    /deep/.van-cell {
+      padding: 3px 5px;
+      border-radius: 5px;
+      border: 1px solid #ccc;
+      width: 98%;
+    }
+    /deep/.van-button {
+      height: 31px;
+    }
+  }
+}
+/deep/.van-popup {
+  height: 30%;
+  background-color: #0000005f !important;
+}
+</style>

+ 110 - 0
src/viewTwo/live/liveDetail/imgtxtdock.vue

@@ -0,0 +1,110 @@
+<template>
+  <div id="imgtxtdock">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index">
+          <el-col :span="24" class="txt">
+            <span> <van-icon name="underway" />{{ getDate(item.meta.createdAt) }}</span>
+            <span>{{ item.user_name }}</span>
+          </el-col>
+          <el-col :span="24" class="brief">
+            {{ item.brief }}
+          </el-col>
+          <el-col :span="24" class="image">
+            <el-image :src="tag.url" class="imagelist" v-for="(tag, tagindex) in item.image" :key="tagindex"></el-image>
+          </el-col>
+          <el-col :span="24" class="video" v-if="item.file_path">
+            <el-link :href="item.file_path" target="_blank" :underline="false">视频播放</el-link>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: imgtxtdock } = createNamespacedHelpers('imgtxtdock');
+import moment from 'moment';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'imgtxtdock',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      // 展会id
+      dock_id: '',
+      list: [],
+    };
+  },
+  async created() {
+    if (this.id) {
+      this.$set(this, `dock_id`, this.id);
+    }
+    await this.search();
+  },
+  methods: {
+    ...imgtxtdock(['query']),
+    async search() {
+      // 图文直播
+      let res = await this.query({ dock_id: this.dock_id });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+    // 过滤时间
+    getDate(val) {
+      let newDate = moment(val).format('hh:mm');
+      if (newDate) return newDate;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  min-height: 365px;
+  max-height: 365px;
+  overflow-y: auto;
+  .list {
+    padding: 10px 0;
+    .txt {
+      span:nth-child(1) {
+        color: #ff0000;
+        i {
+          margin: 0 5px 0 0;
+          top: 2px;
+        }
+      }
+      span:nth-child(2) {
+        font-size: 14px;
+        padding: 4px 5px;
+        background: #f1f1f1;
+        margin: 0 0 0 10px;
+        border-radius: 10px;
+        color: #666;
+        font-weight: bold;
+      }
+    }
+    .brief {
+      font-size: 14px;
+      padding: 5px 0;
+    }
+    .image {
+      .imagelist {
+        width: 100%;
+      }
+    }
+  }
+}
+</style>

+ 103 - 0
src/viewTwo/live/liveDetail/xmly.vue

@@ -0,0 +1,103 @@
+<template>
+  <div id="xmly">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="19" class="textOver title">
+            {{ item.title }}
+          </el-col>
+          <el-col :span="5" class="date">
+            {{ item.publish_time }}
+          </el-col>
+          <el-col :span="24" class="textOver orgin">
+            来源:<span>{{ item.orgin }} </span>
+          </el-col>
+          <el-col :span="24" class="titlejj">
+            简介:<span>{{ item.titlejj }}</span>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: newsroadshow } = createNamespacedHelpers('newsroadshow');
+export default {
+  name: 'xmly',
+  props: {},
+  components: {},
+  data: function() {
+    return {
+      // 展会id
+      dock_id: '',
+      list: [],
+    };
+  },
+  async created() {
+    if (this.id) {
+      this.$set(this, `dock_id`, this.id);
+    }
+    await this.search();
+  },
+  methods: {
+    ...newsroadshow(['query']),
+    async search() {
+      let res = await this.query({ dock_id: this.dock_id });
+      if (this.$checkRes(res)) this.$set(this, `list`, res.data);
+    },
+    // 详情页面
+    detailBtn(data) {
+      this.$router.push({ path: '/service/techDetail', query: { id: data.id, type: '4' } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  min-height: 365px;
+  max-height: 365px;
+  overflow-y: auto;
+  .list {
+    padding: 5px 0;
+    border-bottom: 1px dashed #ccc;
+    .title {
+      font-size: 16px;
+      font-weight: bold;
+    }
+    .date {
+      font-size: 14px;
+      text-align: right;
+      padding: 3px 0 0 0;
+    }
+    .orgin {
+      font-size: 14px;
+      padding: 5px 0;
+      span {
+        color: #999;
+      }
+    }
+    .titlejj {
+      font-size: 14px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 2;
+      word-break: break-all;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      span {
+        color: #999;
+      }
+    }
+  }
+}
+</style>

+ 124 - 0
src/viewTwo/live/parts/exports.vue

@@ -0,0 +1,124 @@
+<template>
+  <div id="exports">
+    <el-row>
+      <el-col :span="24" class="main">
+        <van-tabs v-model="active1">
+          <van-tab title="正在直播">
+            <exportsList :list="listNow" :total="nowTotal" status="1" @query="searchList" :province="province" :place="place"></exportsList>
+          </van-tab>
+          <van-tab title="下期预告">
+            <exportsList :list="listPre" :total="nowTotal" status="0" @query="searchList" :province="province" :place="place"></exportsList>
+          </van-tab>
+          <van-tab title="往期直播">
+            <exportsList :list="listPast" :total="nowTotal" status="2" @query="searchList" :province="province" :place="place"></exportsList>
+          </van-tab>
+        </van-tabs>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, mapMutations, createNamespacedHelpers } from 'vuex';
+import exportsList from '../parts/exportsList.vue';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+const { mapActions: place } = createNamespacedHelpers('place');
+const jwt = require('jsonwebtoken');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'exports',
+  props: {
+    // 省
+    province: { type: Array, default: () => [] },
+    // 市
+    place: { type: Array, default: () => [] },
+    news: { type: String, default: '0' },
+  },
+  components: {
+    exportsList,
+  },
+  data: function() {
+    return {
+      active1: 0,
+      // 下期预告
+      listPre: [
+        {
+          end_time: '2020-10-23 00:00',
+          place: '220100',
+          province: '220000',
+          start_time: '2020-10-16 10:00',
+          status: '1',
+          title: '专家培训在线模板',
+        },
+      ],
+      preTotal: 0,
+      // 正在直播
+      listNow: [
+        {
+          end_time: '2020-10-23 00:00',
+          place: '220100',
+          province: '220000',
+          start_time: '2020-10-16 10:00',
+          status: '1',
+          title: '专家培训在线模板',
+        },
+      ],
+      nowTotal: 0,
+      // 往期直播
+      listPast: [
+        {
+          end_time: '2020-10-23 00:00',
+          place: '220100',
+          province: '220000',
+          start_time: '2020-10-16 10:00',
+          status: '1',
+          title: '专家培训在线模板',
+        },
+      ],
+      pastTotal: 0,
+    };
+  },
+  async created() {
+    await this.searchList({ status: '0' });
+    await this.searchList({ status: '1' });
+    await this.searchList({ status: '2' });
+  },
+  methods: {
+    ...dock({ dockQuery: 'query' }),
+    async searchList({ skip = 0, limit = 10, status, ...info } = {}) {},
+    // sesstoken() {
+    //   if (this.token) {
+    //     sessionStorage.setItem('token', this.token);
+    //     let user = jwt.decode(this.token);
+    //     if (user && user.uid) {
+    //       this.setUser(user);
+    //     }
+    //   }
+    // },
+  },
+  computed: {
+    ...mapState(['user']),
+    token() {
+      return this.$route.query.token;
+    },
+  },
+  // watch: {
+  //   token: {
+  //     immediate: true,
+  //     deep: true,
+  //     handler(val) {
+  //       console.log(val);
+  //       this.sesstoken();
+  //     },
+  //   },
+  // },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 105 - 0
src/viewTwo/live/parts/exportsList.vue

@@ -0,0 +1,105 @@
+<template>
+  <div id="liveList">
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col class="list" v-for="(item, index) in list" :key="index">
+          <el-col :span="24" class="left">
+            <p class="textOver">{{ item.title }}</p>
+            <p>
+              举办城市:<span>{{ getprovince(item.province) }}-{{ getplace(item.place) }}</span>
+            </p>
+            <p>
+              直播时间:<span>{{ item.start_time }}</span>
+            </p>
+          </el-col>
+          <el-col :span="24" style="text-align:center">
+            <el-button
+              type="primary"
+              size="mini"
+              @click="$router.push({ path: '/viewTwo/live/exportsDetail', query: { id: item.id } })"
+              v-if="item.status == '1'"
+              >进入房间</el-button
+            >
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'liveList',
+  props: {
+    list: { type: Array },
+    status: { type: String, default: '0' },
+    news: { type: String, default: '0' },
+    // 省
+    province: { type: Array, default: () => [] },
+    // 市
+    place: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 过滤省
+    getprovince(item) {
+      let res = this.province.find(i => i.code == item);
+      if (res) return res.name;
+    },
+    // 过滤市
+    getplace(item) {
+      let res = this.place.find(i => i.code == item);
+      if (res) return res.name;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.info {
+  padding: 10px;
+}
+.list {
+  background: #fff;
+  padding: 10px;
+  border-radius: 5px;
+  margin: 0 0 10px 0;
+  .left {
+    font-size: 16px;
+    color: #ccc;
+    p {
+      padding: 0 0 10px 0;
+      span {
+        color: #000;
+      }
+    }
+    p:first-child {
+      color: #000;
+    }
+  }
+  .right {
+    text-align: center;
+    p {
+      background: #409eff;
+      color: #fff;
+      padding: 5px 8px;
+      border-radius: 5px;
+      margin: 0 0 10px 0;
+    }
+  }
+}
+</style>

+ 123 - 0
src/viewTwo/live/parts/personal.vue

@@ -0,0 +1,123 @@
+<template>
+  <div id="personal">
+    <el-row>
+      <el-col :span="24" class="main">
+        <van-tabs v-model="active1">
+          <van-tab title="正在直播">
+            <personalList :list="listNow" :total="nowTotal" status="1" @query="searchList" :province="province" :place="place"></personalList>
+          </van-tab>
+          <van-tab title="下期预告">
+            <personalList :list="listPre" :total="nowTotal" status="0" @query="searchList" :province="province" :place="place"></personalList>
+          </van-tab>
+          <van-tab title="往期直播">
+            <personalList :list="listPast" :total="nowTotal" status="2" @query="searchList" :province="province" :place="place"></personalList>
+          </van-tab>
+        </van-tabs>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, mapMutations, createNamespacedHelpers } from 'vuex';
+import personalList from '../parts/personalList.vue';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+const { mapActions: place } = createNamespacedHelpers('place');
+const jwt = require('jsonwebtoken');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'personal',
+  props: {
+    // 省
+    province: { type: Array, default: () => [] },
+    // 市
+    place: { type: Array, default: () => [] },
+  },
+  components: {
+    personalList,
+  },
+  data: function() {
+    return {
+      active1: 0,
+      // 下期预告
+      listPre: [
+        {
+          end_time: '2020-10-23 00:00',
+          place: '220100',
+          province: '220000',
+          start_time: '2020-10-16 10:00',
+          status: '1',
+          title: '人才招聘会模板',
+        },
+      ],
+      preTotal: 0,
+      // 正在直播
+      listNow: [
+        {
+          end_time: '2020-10-23 00:00',
+          place: '220100',
+          province: '220000',
+          start_time: '2020-10-16 10:00',
+          status: '1',
+          title: '人才招聘会模板',
+        },
+      ],
+      nowTotal: 0,
+      // 往期直播
+      listPast: [
+        {
+          end_time: '2020-10-23 00:00',
+          place: '220100',
+          province: '220000',
+          start_time: '2020-10-16 10:00',
+          status: '1',
+          title: '人才招聘会模板',
+        },
+      ],
+      pastTotal: 0,
+    };
+  },
+  async created() {
+    await this.searchList({ status: '0' });
+    await this.searchList({ status: '1' });
+    await this.searchList({ status: '2' });
+  },
+  methods: {
+    ...dock({ dockQuery: 'query' }),
+    async searchList({ skip = 0, limit = 10, status, ...info } = {}) {},
+    // sesstoken() {
+    //   if (this.token) {
+    //     sessionStorage.setItem('token', this.token);
+    //     let user = jwt.decode(this.token);
+    //     if (user && user.uid) {
+    //       this.setUser(user);
+    //     }
+    //   }
+    // },
+  },
+  computed: {
+    ...mapState(['user']),
+    token() {
+      return this.$route.query.token;
+    },
+  },
+  // watch: {
+  //   token: {
+  //     immediate: true,
+  //     deep: true,
+  //     handler(val) {
+  //       console.log(val);
+  //       this.sesstoken();
+  //     },
+  //   },
+  // },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 104 - 0
src/viewTwo/live/parts/personalList.vue

@@ -0,0 +1,104 @@
+<template>
+  <div id="liveList">
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col class="list" v-for="(item, index) in list" :key="index">
+          <el-col :span="24" class="left">
+            <p class="textOver">{{ item.title }}</p>
+            <p>
+              举办城市:<span>{{ getprovince(item.province) }}-{{ getplace(item.place) }}</span>
+            </p>
+            <p>
+              直播时间:<span>{{ item.start_time }}</span>
+            </p>
+          </el-col>
+          <el-col :span="24" style="text-align:center">
+            <el-button
+              type="primary"
+              size="mini"
+              @click="$router.push({ path: '/viewTwo/live/personalDetail', query: { id: item.id } })"
+              v-if="item.status == '1'"
+              >进入房间</el-button
+            >
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'liveList',
+  props: {
+    list: { type: Array },
+    status: { type: String, default: '0' },
+    // 省
+    province: { type: Array, default: () => [] },
+    // 市
+    place: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 过滤省
+    getprovince(item) {
+      let res = this.province.find(i => i.code == item);
+      if (res) return res.name;
+    },
+    // 过滤市
+    getplace(item) {
+      let res = this.place.find(i => i.code == item);
+      if (res) return res.name;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.info {
+  padding: 10px;
+}
+.list {
+  background: #fff;
+  padding: 10px;
+  border-radius: 5px;
+  margin: 0 0 10px 0;
+  .left {
+    font-size: 16px;
+    color: #ccc;
+    p {
+      padding: 0 0 10px 0;
+      span {
+        color: #000;
+      }
+    }
+    p:first-child {
+      color: #000;
+    }
+  }
+  .right {
+    text-align: center;
+    p {
+      background: #409eff;
+      color: #fff;
+      padding: 5px 8px;
+      border-radius: 5px;
+      margin: 0 0 10px 0;
+    }
+  }
+}
+</style>

+ 205 - 0
src/viewTwo/live/parts/product.vue

@@ -0,0 +1,205 @@
+<template>
+  <div id="product">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="search">
+          <el-col :span="6" class="type">
+            <el-select v-model="status" placeholder="请选择" clearable @change="typeChange">
+              <el-option v-for="(item, index) in typelist" :key="index" :label="item.name" :value="item.status"> </el-option>
+            </el-select>
+          </el-col>
+          <el-col :span="18" class="input">
+            <van-search v-model="name" @search="onSearch" placeholder="请输入信息标题" />
+          </el-col>
+        </el-col>
+        <el-col :span="24" class="list">
+          <van-tabs v-model="active">
+            <van-tab title="正在直播">
+              <productList :list="listNow" status="1" @query="searchList" :province="province" :place="place"></productList>
+            </van-tab>
+            <van-tab title="下期预告">
+              <productList :list="listPre" status="0" @query="searchList" :province="province" :place="place"></productList>
+            </van-tab>
+            <van-tab title="往期直播">
+              <productList :list="listPast" status="2" @query="searchList" :province="province" :place="place"></productList>
+            </van-tab>
+          </van-tabs>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, mapMutations, createNamespacedHelpers } from 'vuex';
+import productList from '../parts/productList.vue';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+const { mapActions: place } = createNamespacedHelpers('place');
+const jwt = require('jsonwebtoken');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'product',
+  props: {
+    // 省
+    province: { type: Array, default: () => [] },
+    // 市
+    place: { type: Array, default: () => [] },
+  },
+  components: {
+    productList,
+  },
+  data: function() {
+    return {
+      active: 0,
+      // 下期预告
+      listPre: [],
+      // 正在直播
+      listNow: [],
+      // 往期直播
+      listPast: [],
+      // 查询
+      name: '',
+      status: '',
+      // 类型
+      typelist: [
+        { name: '正在直播', status: '0' },
+        { name: '下期预告', status: '1' },
+        { name: '已往直播', status: '2' },
+      ],
+    };
+  },
+  async created() {
+    await this.searchList({ status: '0' });
+    await this.searchList({ status: '1' });
+    await this.searchList({ status: '2' });
+  },
+  methods: {
+    ...mapMutations(['setUser']),
+    ...dock({ dockQuery: 'query' }),
+    ...place({ palcequery: 'query', transactiondtetle: 'delete' }),
+    async searchList({ skip = 0, limit = 10, status, ...info } = {}) {
+      let res = await this.dockQuery({ is_allowed: 1, skip, status, ...info });
+      if (res.errcode === 0) {
+        if (status == '0') {
+          this.$set(this, `listPre`, _.orderBy(res.data, ['start_time'], ['asc']));
+        } else if (status == '1') {
+          this.$set(this, `listNow`, _.orderBy(res.data, ['start_time'], ['asc']));
+        } else if (status == '2') {
+          this.$set(this, `listPast`, _.orderBy(res.data, ['start_time'], ['asc']));
+        }
+      }
+    },
+    // 输入框是搜索
+    async searchTxt({ ...info } = {}) {
+      info.status = this.status == 0 ? 1 : this.status == 1 ? 0 : 2;
+      console.log(info);
+      if (this.name) {
+        info.title = this.name;
+        let res = await this.dockQuery({ is_allowed: 1, ...info });
+        if (this.$checkRes(res)) {
+          let index = this.typelist.findIndex(i => i.status == this.status);
+          if (index == 0) this.$set(this, `listNow`, res.data);
+          else if (index == 1) this.$set(this, `listPre`, res.data);
+          else if (index == 2) this.$set(this, `listPast`, res.data);
+        }
+      } else {
+        this.searchList({ status: '0' });
+        this.searchList({ status: '1' });
+        this.searchList({ status: '2' });
+      }
+    },
+    sesstoken() {
+      if (this.token) {
+        sessionStorage.setItem('token', this.token);
+        let user = jwt.decode(this.token);
+        if (user && user.uid) {
+          this.setUser(user);
+        }
+      }
+    },
+    // 选择类型
+    typeChange(value) {
+      if (value) {
+        this.active = '';
+        this.$set(this, `status`, value);
+        let index = this.typelist.findIndex(i => i.status == value);
+        if (index) {
+          this.$set(this, `active`, index);
+        }
+      }
+    },
+    // 输入框查询
+    onSearch(data) {
+      this.$set(this, `name`, data);
+      if (this.status) {
+        this.searchTxt();
+      } else {
+        this.$notify({
+          message: '请选择直播状态',
+          type: 'danger',
+        });
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    token() {
+      return this.$route.query.token;
+    },
+  },
+  watch: {
+    token: {
+      immediate: true,
+      deep: true,
+      handler(val) {
+        // console.log(val);
+        this.sesstoken();
+      },
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  position: relative;
+  .search {
+    position: fixed;
+    width: 100%;
+    z-index: 999;
+    border-bottom: 1px solid #ccc;
+    .type {
+      /deep/.el-input__inner {
+        border: none;
+        padding: 0;
+        height: 30px;
+        line-height: 30px;
+      }
+      .el-select {
+        padding: 10px 0px 0px 5px;
+      }
+      /deep/.el-input__icon {
+        line-height: 30px;
+      }
+    }
+    .input {
+      .van-search {
+        padding: 10px 12px 10px 0;
+      }
+    }
+  }
+  .list {
+    position: absolute;
+    width: 100%;
+    top: 54px;
+    background: #f9fafc;
+    padding: 0 0 40px 0;
+  }
+}
+</style>

+ 108 - 0
src/viewTwo/live/parts/productList.vue

@@ -0,0 +1,108 @@
+<template>
+  <div id="liveList">
+    <el-row>
+      <el-col :span="24" class="info">
+        <el-col class="list" v-for="(item, index) in list" :key="index">
+          <el-col :span="24" class="left">
+            <p class="textOver">{{ item.title }}</p>
+            <p>
+              举办城市:<span>{{ getprovince(item.province) }}-{{ getplace(item.place) }}</span>
+            </p>
+            <p>
+              直播时间:<span>{{ item.start_time }}</span>
+            </p>
+          </el-col>
+          <el-col :span="24" style="text-align:center">
+            <span v-if="item.room_id == '1005'">
+              <el-button type="primary" size="mini" @click="$router.push({ path: '/viewTwo/live/detailtwo', query: { id: item.id } })" v-if="item.status == '1'"
+                >进入房间</el-button
+              >
+            </span>
+            <span v-else>
+              <el-button type="primary" size="mini" @click="$router.push({ path: '/viewTwo/live/detail', query: { id: item.id } })" v-if="item.status == '1'"
+                >进入房间</el-button
+              >
+            </span>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'liveList',
+  props: {
+    list: { type: Array },
+    status: { type: String, default: '0' },
+    news: { type: String, default: '0' },
+    // 省
+    province: { type: Array, default: () => [] },
+    // 市
+    place: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    // 过滤省
+    getprovince(item) {
+      let res = this.province.find(i => i.code == item);
+      if (res) return res.name;
+    },
+    // 过滤市
+    getplace(item) {
+      let res = this.place.find(i => i.code == item);
+      if (res) return res.name;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.info {
+  padding: 10px;
+}
+.list {
+  background: #fff;
+  padding: 10px;
+  border-radius: 5px;
+  margin: 0 0 10px 0;
+  .left {
+    font-size: 16px;
+    color: #ccc;
+    p {
+      padding: 0 0 10px 0;
+      span {
+        color: #000;
+      }
+    }
+    p:first-child {
+      color: #000;
+    }
+  }
+  .right {
+    text-align: center;
+    p {
+      background: #409eff;
+      color: #fff;
+      padding: 5px 8px;
+      border-radius: 5px;
+      margin: 0 0 10px 0;
+    }
+  }
+}
+</style>

+ 598 - 0
src/viewTwo/live/personalDetail.vue

@@ -0,0 +1,598 @@
+<template>
+  <div id="roomDetail">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="video">
+            <el-link :underline="false" class="back" @click="back()"><i class="el-icon-arrow-left"></i></el-link>
+            <el-col :span="24" class="videoone" v-if="videodock.file_path != null || ''">
+              <video
+                autoplay="autoplay"
+                controls="controls"
+                preload="meta"
+                x-webkit-airplay="true"
+                webkit-playsinline="true"
+                playsinline="true"
+                x5-video-player-type="h5"
+                x5-video-player-fullscreen="true"
+                controlsList="nodownload"
+                :src="videodock.file_path"
+                loop="loop"
+              >
+                <source src="movie.ogg" type="video/ogg" />
+                <source src="movie.mp4" type="video/mp4" />
+              </video>
+            </el-col>
+            <el-col :span="24" class="videotwo" v-else>
+              人才招聘会模板
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="chat">
+            <van-tabs v-model="chatactive" type="card" animated>
+              <van-tab title="公共聊天">
+                <el-col :span="24" class="right">
+                  <el-col :span="24" class="list">
+                    <el-col :span="24" class="chatList" v-for="(item, index) in lunboList" :key="index">
+                      <el-col :span="3" class="image">
+                        <el-image :src="touxiang" style="width:30px;height:30px"></el-image>
+                      </el-col>
+                      <el-col :span="21" class="other">
+                        <el-col :span="24" class="one">
+                          <span class="name">{{ item.name }}</span>
+                          <span class="time">{{ item.date }}</span>
+                        </el-col>
+                        <el-col :span="24" class="othertwo">
+                          <p class="remark">{{ item.content }}</p>
+                        </el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                  <el-col :span="24" class="send">
+                    <el-col :span="19">
+                      <el-input v-model="text" size="mini"></el-input>
+                    </el-col>
+                    <el-col :span="5">
+                      <el-button size="mini" type="primary">发送</el-button>
+                    </el-col>
+                  </el-col>
+                </el-col>
+              </van-tab>
+            </van-tabs>
+          </el-col>
+          <el-col :span="24" class="market">
+            <van-tabs v-model="marketactive" type="card" animated>
+              <van-tab title="招聘信息">
+                <el-col :span="24" class="one">
+                  <el-col :span="24" class="list" v-for="(item, index) in zpxxList" :key="index">
+                    <p class="name">{{ item.name }}</p>
+                    <el-col :span="12">
+                      <p class="textOver">类型:{{ item.type }}</p>
+                    </el-col>
+                    <el-col :span="12">
+                      <p class="textOver date">{{ item.date }}</p>
+                    </el-col>
+                    <el-col :span="24">
+                      <p class="textOver">{{ item.content }}</p>
+                    </el-col>
+                  </el-col>
+                </el-col>
+              </van-tab>
+              <van-tab title="正式岗位">
+                <el-col :span="24" class="two">
+                  <el-col :span="24" class="list" v-for="(item, index) in zsgwList" :key="index">
+                    <el-col :span="18" class="name textOver">
+                      {{ item.name }}
+                    </el-col>
+                    <el-col :span="6" class="date textOver">
+                      {{ item.date }}
+                    </el-col>
+                    <el-col :span="24" class="other">
+                      <span class="textOver">需求人数:{{ item.num }}</span>
+                      <span class="textOver" style="color:#ff0000;">薪资:{{ item.xz }}</span>
+                    </el-col>
+                    <el-col :span="24" class="other">
+                      <span class="textOver">福利待遇:{{ item.fldy }}</span>
+                      <span class="textOver">职位诱惑:{{ item.zwyh }}</span>
+                    </el-col>
+                  </el-col>
+                </el-col>
+              </van-tab>
+              <van-tab title="实习岗位">
+                <el-col :span="24" class="three">
+                  <el-col :span="24" class="list" v-for="(item, index) in sxList" :key="index" @click.native="expertBtn(item)">
+                    <el-col :span="5" class="image">
+                      <el-image :src="expertimage" style="width:70px;height: 70px;border: 1px solid #f1f1f1;"></el-image>
+                    </el-col>
+                    <el-col :span="19" class="info1">
+                      <el-col :span="24" class="name textOver">
+                        {{ item.name }}
+                      </el-col>
+                      <el-col :span="24" class="other">
+                        <el-col :span="12">
+                          <span class="textOver"><i class="el-icon-coin"></i>{{ item.xz }}</span>
+                        </el-col>
+                        <el-col :span="12" style="text-align:right">
+                          <span class="textOver"><i class="el-icon-location"></i>{{ item.address }}</span>
+                        </el-col>
+                        <el-col :span="24" class="fldy textOver">
+                          <span>福利待遇:{{ item.fldy }}</span>
+                        </el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+              </van-tab>
+            </van-tabs>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+// 图文直播
+import textVideo from '@/components/parts/textVideo.vue';
+// 公共聊天
+import chat from '@/components/parts/chat.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+import moment from 'moment';
+export default {
+  name: 'videoDetail2',
+  props: {},
+  components: {
+    // textVideo,
+    // chat,
+  },
+  data: function() {
+    return {
+      // 展会id
+      dock_id: '',
+      // 视频信息
+      videodock: {},
+      // 倒计时查询详情
+      times: 5,
+      //展会详情
+      dockinfo: [],
+      // 聊天列表
+      lunboList: [
+        { name: '顾红伟', date: '10:00', content: '信息内容' },
+        { name: '顾红伟', date: '10:00', content: '信息内容' },
+        { name: '顾红伟', date: '10:00', content: '信息内容' },
+        { name: '顾红伟', date: '10:00', content: '信息内容' },
+        { name: '顾红伟', date: '10:00', content: '信息内容' },
+      ],
+      // 聊天
+      chatactive: 0,
+      // 科技超市
+      marketactive: 0,
+      expertimage: require('@/assets/222.png'),
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      touxiang: require('@/assets/touxiang.png'),
+      hand: require('@/assets/flower.gif'),
+      //招聘信息
+      zpxxList: [
+        {
+          name: '长春市福瑞科技有限公司',
+          date: '2020-10-16',
+          type: '全职',
+          content: '长春市福瑞科技有限公司长春市福瑞科技有限公司长春市福瑞科技有限公司长春市福瑞科技有限公司',
+        },
+        {
+          name: '长春市福瑞科技有限公司',
+          date: '2020-10-16',
+          type: '全职',
+          content: '长春市福瑞科技有限公司长春市福瑞科技有限公司长春市福瑞科技有限公司长春市福瑞科技有限公司',
+        },
+        {
+          name: '长春市福瑞科技有限公司',
+          date: '2020-10-16',
+          type: '全职',
+          content: '长春市福瑞科技有限公司长春市福瑞科技有限公司长春市福瑞科技有限公司长春市福瑞科技有限公司',
+        },
+        {
+          name: '长春市福瑞科技有限公司',
+          date: '2020-10-16',
+          type: '全职',
+          content: '长春市福瑞科技有限公司长春市福瑞科技有限公司长春市福瑞科技有限公司长春市福瑞科技有限公司',
+        },
+      ],
+      //正式岗位
+      zsgwList: [
+        {
+          name: '应届管培生',
+          date: '2020-10-16',
+          xz: '3k-6k/月',
+          fldy: '五险一金',
+          num: '10',
+          zwyh: '扁平管理,节日礼物,岗前培训,岗位晋升',
+        },
+        {
+          name: '应届管培生',
+          date: '2020-10-16',
+          xz: '3k-6k/月',
+          fldy: '五险一金',
+          num: '10',
+          zwyh: '扁平管理,节日礼物,岗前培训,岗位晋升',
+        },
+        {
+          name: '应届管培生',
+          date: '2020-10-16',
+          xz: '3k-6k/月',
+          fldy: '五险一金',
+          num: '10',
+          zwyh: '扁平管理,节日礼物,岗前培训,岗位晋升',
+        },
+        {
+          name: '应届管培生',
+          date: '2020-10-16',
+          xz: '3k-6k/月',
+          fldy: '五险一金',
+          num: '10',
+          zwyh: '扁平管理,节日礼物,岗前培训,岗位晋升',
+        },
+        {
+          name: '应届管培生',
+          date: '2020-10-16',
+          xz: '3k-6k/月',
+          fldy: '五险一金',
+          num: '10',
+          zwyh: '扁平管理,节日礼物,岗前培训,岗位晋升',
+        },
+        {
+          name: '应届管培生',
+          date: '2020-10-16',
+          xz: '3k-6k/月',
+          fldy: '五险一金',
+          num: '10',
+          zwyh: '扁平管理,节日礼物,岗前培训,岗位晋升',
+        },
+        {
+          name: '应届管培生',
+          date: '2020-10-16',
+          xz: '3k-6k/月',
+          fldy: '五险一金',
+          num: '10',
+          zwyh: '扁平管理,节日礼物,岗前培训,岗位晋升',
+        },
+        {
+          name: '应届管培生',
+          date: '2020-10-16',
+          xz: '3k-6k/月',
+          fldy: '五险一金',
+          num: '10',
+          zwyh: '扁平管理,节日礼物,岗前培训,岗位晋升',
+        },
+      ],
+      //实习岗位
+      sxList: [
+        {
+          name: '前端开发工程师',
+          xz: '3k-6k/月',
+          address: '长春市',
+          fldy: '五险一金',
+        },
+        {
+          name: '前端开发工程师',
+          xz: '3k-6k/月',
+          address: '长春市',
+          fldy: '五险一金',
+        },
+        {
+          name: '前端开发工程师',
+          xz: '3k-6k/月',
+          address: '长春市',
+          fldy: '五险一金',
+        },
+        {
+          name: '前端开发工程师',
+          xz: '3k-6k/月',
+          address: '长春市',
+          fldy: '五险一金',
+        },
+        {
+          name: '前端开发工程师',
+          xz: '3k-6k/月',
+          address: '长春市',
+          fldy: '五险一金',
+        },
+        {
+          name: '前端开发工程师',
+          xz: '3k-6k/月',
+          address: '长春市',
+          fldy: '五险一金',
+        },
+        {
+          name: '前端开发工程师',
+          xz: '3k-6k/月',
+          address: '长春市',
+          fldy: '五险一金',
+        },
+        {
+          name: '前端开发工程师',
+          xz: '3k-6k/月',
+          address: '长春市',
+          fldy: '五险一金',
+        },
+      ],
+      sx: require('@/assets/sx.png'),
+      text: '',
+    };
+  },
+  created() {},
+  methods: {
+    async searchvideo() {
+      if (this.dock_id) {
+        let res = await this.dockFetch(this.dock_id);
+        if (this.$checkRes(res)) {
+          // 对接会详情
+          this.$set(this, `videodock`, res.data);
+        }
+      }
+    },
+    // 返回
+    back() {
+      this.$router.push({ path: '/viewTwo/live/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {},
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+  position: relative;
+  z-index: 999;
+}
+.main {
+  min-height: 570px;
+}
+.foot {
+  position: absolute;
+  bottom: 0;
+}
+.main {
+  // 视频
+  .video {
+    height: 215px;
+    overflow: hidden;
+    .back {
+      position: fixed;
+      z-index: 999;
+      i {
+        font-size: 30px;
+        font-weight: bold;
+        margin: 5px 0 0px 5px;
+        color: #409eff;
+      }
+    }
+    .videoone {
+      height: 215px;
+      overflow: hidden;
+      video {
+        width: 100%;
+      }
+    }
+    .videotwo {
+      background: url('~@/assets/directBack.png');
+      background-size: 100% 100%;
+      height: 215px;
+      overflow: hidden;
+      text-align: center;
+      color: #fff;
+      font-size: 20px;
+      padding: 15% 3%;
+    }
+  }
+  .chat {
+    margin: 15px 0 0 0;
+    height: 400px;
+    overflow: hidden;
+    .right {
+      height: 400px;
+      overflow: hidden;
+      border-left: 1px dashed #f1f1f1;
+      border-right: 1px dashed #f1f1f1;
+      border-bottom: 1px dashed #f1f1f1;
+      .top {
+        background-color: #409eff;
+        height: 33px;
+        text-align: center;
+        line-height: 33px;
+        width: 170px;
+        margin: 0px 20px 0px 100px;
+        color: white;
+      }
+      .list {
+        height: 330px;
+        overflow-y: auto;
+        overflow-x: hidden;
+        padding: 0 16px;
+        .chatList {
+          padding: 10px 0;
+          border-bottom: 1px dashed #ccc;
+          .image {
+            text-align: center;
+          }
+          .other {
+            .one {
+              .name {
+                color: #000;
+                font-size: 16px;
+                font-weight: bold;
+              }
+              .time {
+                display: inline-block;
+                margin: 0 0 0 15px;
+                color: #ccc;
+              }
+            }
+            .othertwo {
+              margin: 5px 0 0 0;
+              color: #000;
+              .remark {
+                min-height: 20px;
+                font-size: 15px;
+                padding: 5px;
+                border-radius: 5px;
+                background: #245efe5f;
+              }
+            }
+          }
+        }
+      }
+      .send {
+        height: 40px;
+        line-height: 38px;
+        padding: 0 0 0 12px;
+      }
+    }
+  }
+  // 科技超市
+  .market {
+    margin: 15px 0 0 0;
+    .one {
+      max-height: 550px;
+      overflow-y: auto;
+      padding: 0 16px;
+      min-height: 102px;
+      .list {
+        border-bottom: 1px dashed #ccc;
+        padding: 10px 16px;
+        .name {
+          font-size: 18px;
+          font-weight: bolder;
+        }
+        .name:hover {
+          color: #409eff;
+        }
+        .textOver {
+          font-size: 16px;
+          color: #666;
+          padding: 5px 0 0 0;
+        }
+        .date {
+          text-align: right;
+        }
+      }
+    }
+    .two {
+      max-height: 550px;
+      overflow-y: auto;
+      padding: 0 16px;
+      min-height: 102px;
+      .list {
+        border-bottom: 1px dashed #ccc;
+        padding: 10px 0;
+        .name {
+          font-size: 18px;
+          font-weight: bold;
+        }
+        .date {
+          text-align: right;
+          font-size: 16px;
+        }
+        .other {
+          padding: 2px 0 1px 0;
+          font-size: 16px;
+          span {
+            display: inline-block;
+            width: 50%;
+          }
+        }
+      }
+      .zsgwList:hover {
+        cursor: pointer;
+        .name {
+          color: #409eff;
+        }
+      }
+    }
+    .three {
+      max-height: 550px;
+      overflow-y: auto;
+      padding: 0 16px;
+      min-height: 92px;
+      .list {
+        padding: 5px 0px;
+        border-bottom: 1px dashed #ccc;
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        .info1 {
+          padding: 6px 0px 1px 20px;
+          .other {
+            margin-top: 5px;
+            .fldy {
+              margin-top: 5px;
+            }
+          }
+          .name {
+            font-size: 18px;
+            font-weight: bolder;
+          }
+        }
+        .field {
+          margin-top: 8px;
+          font-size: 16px;
+          color: #666;
+        }
+        .image {
+          margin-top: 5px;
+          .el-image {
+            border-radius: 90%;
+          }
+        }
+        .info1 {
+          padding: 6px 0px 1px 20px;
+        }
+      }
+    }
+  }
+}
+// 标签样式重定义
+/deep/.van-tab {
+  font-size: 16px;
+}
+/deep/.van-tabs--card > .van-tabs__wrap {
+  height: 35px;
+}
+/deep/.van-tabs__nav--card {
+  height: 35px;
+  // margin: 0;
+}
+/deep/.van-tabs__nav--card {
+  border: 1px solid #409eff;
+}
+/deep/.van-tabs__nav--card .van-tab {
+  color: #666;
+  border-right: 1px solid #409eff;
+}
+/deep/.van-tabs__nav--card .van-tab.van-tab--active {
+  background-color: #409eff;
+  color: #fff;
+}
+</style>

+ 155 - 0
src/viewTwo/news/detail.vue

@@ -0,0 +1,155 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="detail">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="onClickLeft"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="title">{{ info.title }}</el-col>
+          <el-col :span="24" class="other">
+            <p>
+              <span class="textOver">信息来源:{{ info.orgin || '暂无' }}</span>
+              <span class="textOver">发布时间:{{ info.publish_time || '暂无' }}</span>
+            </p>
+            <p class="textOver">文章作者:{{ info.publish || '系统管理员' }}</p>
+          </el-col>
+          <el-col :span="24" v-if="info.picture != null || undefined" class="img">
+            <van-image :src="info.picture">
+              <div slot="error" class="image-slot">
+                <i class="el-icon-picture-outline"></i>
+              </div>
+            </van-image>
+          </el-col>
+          <el-col :span="24" class="con" v-html="info.content"> </el-col>
+          <el-col :span="24" class="four" v-if="info.filepath">
+            <h4>附件:</h4>
+            <el-link :href="info.filepath" :underline="false">{{ info.filepathname || '附件下载' }}</el-link>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: scienceNews } = createNamespacedHelpers('scienceNews');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      //详情
+      info: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...scienceNews(['fetch']),
+    //查询详情
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    // 返回
+    onClickLeft() {
+      this.$router.push({ path: '/viewTwo/news/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.detail {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  // min-height: 570px;
+  // margin: 0 0 50px 0;
+  padding: 10px;
+  .title {
+    text-align: center;
+    color: #044b79;
+    font-size: 18px;
+    font-weight: bolder;
+  }
+  .other {
+    font-size: 16px;
+    color: #666;
+    padding: 20px 0;
+    border-bottom: 1px dashed #ccc;
+    p:nth-child(1) {
+      span {
+        display: inline-block;
+        width: 50%;
+      }
+    }
+    p:nth-child(2) {
+      text-align: center;
+    }
+  }
+  .img {
+    text-align: center;
+    margin: 0 0 15px 0;
+    .el-image {
+      width: 60%;
+    }
+  }
+  .con {
+    margin-top: 20px;
+  }
+}
+/deep/table {
+  width: 100%;
+}
+/deep/.con p img {
+  width: 100%;
+  height: 300px;
+  margin: 5px 0px;
+  display: block;
+}
+/deep/.con div img {
+  width: 100%;
+  height: 260px;
+  display: block;
+}
+/deep/.con p {
+  font-size: 14px;
+  color: #444;
+}
+</style>

+ 139 - 0
src/viewTwo/news/index.vue

@@ -0,0 +1,139 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="onSearch" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="show(item)">
+              <el-col :span="18" class="title textOver">
+                {{ item.title }}
+              </el-col>
+              <el-col :span="6" class="date">
+                {{ item.publish_time }}
+              </el-col>
+              <el-col :span="24" class="other">
+                <p class="textOver">
+                  作者:<span>{{ item.publish || '系统管理员' }}</span>
+                </p>
+                <p class="textOver">
+                  信息来源:<span>{{ item.orgin }}</span>
+                </p>
+              </el-col>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: scienceNews } = createNamespacedHelpers('scienceNews');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      list: [],
+      name: '',
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...scienceNews(['query']),
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      if (this.name) info.title = this.name;
+      let res = await this.query({ skip, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+    show(data) {
+      this.$router.push({ path: '/viewTwo/news/detail', query: { id: data.id } });
+    },
+    onSearch() {
+      this.search();
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 46px;
+    overflow: hidden;
+  }
+  .down {
+    position: relative;
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 54px;
+      padding: 10px;
+      background: #f9fafc;
+      .list {
+        background-color: #fff;
+        border-radius: 5px;
+        margin: 0 0 10px 0;
+        padding: 5px;
+        .title {
+          font-size: 18px;
+          font-weight: bold;
+        }
+        .date {
+          text-align: right;
+          font-size: 16px;
+          padding: 6px 0 0 0;
+        }
+        .other {
+          margin: 5px 0 0 0;
+          p {
+            font-size: 16px;
+            padding: 5px 0;
+            span {
+              color: #666;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 154 - 0
src/viewTwo/notice/detail.vue

@@ -0,0 +1,154 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="detail">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="onClickLeft"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="title">{{ info.title }}</el-col>
+          <el-col :span="24" class="other">
+            <p>
+              <span class="textOver">信息来源:{{ info.orgin || '暂无' }}</span>
+              <span class="textOver">发布时间:{{ info.publish_time || '暂无' }}</span>
+            </p>
+          </el-col>
+          <el-col :span="24" v-if="info.picture != null || undefined" class="img">
+            <van-image :src="info.picture">
+              <div slot="error" class="image-slot">
+                <i class="el-icon-picture-outline"></i>
+              </div>
+            </van-image>
+          </el-col>
+          <el-col :span="24" class="con" v-html="info.content"> </el-col>
+          <el-col :span="24" class="four" v-if="info.filepath">
+            <h4>附件:</h4>
+            <el-link :href="info.filepath" :underline="false">{{ info.filepathname || '附件下载' }}</el-link>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: journnews } = createNamespacedHelpers('journnews');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      //详情
+      info: {},
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...journnews(['fetch']),
+    //查询详情
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    // 返回
+    onClickLeft() {
+      this.$router.push({ path: '/viewTwo/notice/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.detail {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  // min-height: 570px;
+  // margin: 0 0 50px 0;
+  padding: 10px;
+  .title {
+    text-align: center;
+    color: #044b79;
+    font-size: 18px;
+    font-weight: bolder;
+  }
+  .other {
+    font-size: 16px;
+    color: #666;
+    padding: 20px 0;
+    border-bottom: 1px dashed #ccc;
+    p:nth-child(1) {
+      span {
+        display: inline-block;
+        width: 50%;
+      }
+    }
+    p:nth-child(2) {
+      text-align: center;
+    }
+  }
+  .img {
+    text-align: center;
+    margin: 0 0 15px 0;
+    .el-image {
+      width: 60%;
+    }
+  }
+  .con {
+    margin-top: 20px;
+  }
+}
+/deep/table {
+  width: 100%;
+}
+/deep/.con p img {
+  width: 100%;
+  height: 300px;
+  margin: 5px 0px;
+  display: block;
+}
+/deep/.con div img {
+  width: 100%;
+  height: 260px;
+  display: block;
+}
+/deep/.con p {
+  font-size: 14px;
+  color: #444;
+}
+</style>

+ 116 - 0
src/viewTwo/notice/index.vue

@@ -0,0 +1,116 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="list"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+import list from './parts/list.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: journcolumn } = createNamespacedHelpers('journcolumn');
+const { mapActions: journnews } = createNamespacedHelpers('journnews');
+
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 栏目列表
+      columnList: [],
+      // 查询
+      name: '',
+      list: [],
+    };
+  },
+  async created() {
+    await this.searchColumn();
+    await this.search();
+  },
+  methods: {
+    ...journcolumn(['query', 'delete', 'update', 'create']),
+    ...journnews({ newQuery: 'query' }),
+    async search({ ...info } = {}) {
+      let column = this.columnList.find(i => i.site == 'tztg');
+      if (column) {
+        if (this.name) info.title = this.name;
+        const res = await this.newQuery({ column_id: column.id, ...info });
+        if (this.$checkRes(res)) {
+          this.$set(this, `list`, res.data);
+        }
+      }
+    },
+    // 查询栏目
+    async searchColumn() {
+      const res = await this.query();
+      if (this.$checkRes(res)) {
+        this.$set(this, `columnList`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 40px;
+    overflow: hidden;
+  }
+  .down {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 95px;
+    }
+  }
+}
+</style>

+ 67 - 0
src/viewTwo/notice/parts/list.vue

@@ -0,0 +1,67 @@
+<template>
+  <div id="tec">
+    <el-row>
+      <el-col :span="24" class="tec">
+        <el-col :span="24" v-for="(item, index) in list" :key="index" class="list" @click.native="detailBtn(item)">
+          <p class="title textOver">{{ item.title }}</p>
+          <p>
+            <span class="textOver">发布时间:{{ item.publish_time }}</span>
+            <span class="textOver">来源:{{ item.orgin || '暂无' }}</span>
+          </p>
+        </el-col>
+      </el-col>
+      <el-backtop :bottom="50" :right="10"> </el-backtop>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'tec',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    //详情
+    detailBtn(data) {
+      this.$router.push({ path: '/viewTwo/notice/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.tec {
+  padding: 0 10px;
+  .list {
+    padding: 10px 0px;
+    border-bottom: 1px dashed #ccc;
+    .title {
+      font-size: 18px;
+      font-weight: bold;
+    }
+    p:nth-child(2) {
+      margin-top: 5px;
+      span {
+        display: inline-block;
+        width: 50%;
+        height: 42px;
+        line-height: 42px;
+        color: #666;
+      }
+    }
+  }
+}
+</style>

+ 158 - 0
src/viewTwo/patent/detail.vue

@@ -0,0 +1,158 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="back"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="mainTop">
+            <van-image :src="noimage" />
+          </el-col>
+          <el-col :span="24" class="message">
+            <p>
+              <span>专利名称</span>
+              <span>{{ info.name || '暂无' }}</span>
+            </p>
+            <p>
+              <span>申请日</span>
+              <span>{{ info.create_date || '暂无' }}</span>
+            </p>
+            <p>
+              <span> 公开(公告)号</span>
+              <span>{{ info.number || '暂无' }}</span>
+            </p>
+            <p>
+              <span> 公开(公告)日</span>
+              <span>{{ info.complete_date || '暂无' }}</span>
+            </p>
+            <p>
+              <span>发明人</span>
+              <span>{{ info.inventor || '暂无' }}</span>
+            </p>
+            <p>
+              <span>发明人地址</span>
+              <span>{{ info.inventor_address || '暂无' }}</span>
+            </p>
+            <p>
+              <span>代理人</span>
+              <span>{{ info.agency_person || '暂无' }}</span>
+            </p>
+            <p>
+              <span>代理机构</span>
+              <span>{{ info.agency || '暂无' }}</span>
+            </p>
+            <p>
+              <span>专利有效性</span>
+              <span style="color:#ff0000">{{ info.effective_date || '暂无' }}</span>
+            </p>
+            <p>
+              <span>摘要</span>
+              <span>{{ info.content || '暂无' }}</span>
+            </p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+// 专利信息
+import { patentList } from '@/util/patent.js';
+import NavBar from '@/layout/common/topInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      noimage: require('@a/fmzl.jpg'),
+      info: {},
+      patentList: patentList,
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    search() {
+      let res = this.patentList.find(i => i.id == this.id);
+      console.log(res);
+      if (res) this.$set(this, `info`, res);
+    },
+    back() {
+      this.$router.push({ path: '/viewTwo/patent/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 46px;
+    overflow: hidden;
+  }
+  .info {
+    min-height: 570px;
+    .mainTop {
+      padding: 0px 15px;
+      margin-bottom: 10px;
+      min-height: 220px;
+      background-color: #fff;
+      .van-image {
+        height: 200px;
+      }
+    }
+    .message {
+      background: #fff;
+      padding: 0 15px;
+      min-height: 40px;
+      p {
+        min-height: 40px;
+        line-height: 40px;
+        border-bottom: 1px solid #ccc;
+        span {
+          color: #000;
+        }
+        span:nth-child(1) {
+          display: inline-block;
+          width: 100px;
+          color: #ccc;
+        }
+      }
+      p:last-child {
+        border-bottom: none;
+      }
+    }
+  }
+}
+</style>

+ 90 - 0
src/viewTwo/patent/index.vue

@@ -0,0 +1,90 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="list"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import list from './parts/list.vue';
+// 专利信息
+import { patentList } from '@/util/patent.js';
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 查询
+      name: '',
+      list: patentList,
+    };
+  },
+  async created() {},
+  methods: {
+    search() {},
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 45px;
+    overflow: hidden;
+  }
+  .down {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+      border-bottom: 1px dashed #ccc;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 100px;
+    }
+  }
+}
+</style>

+ 88 - 0
src/viewTwo/patent/parts/list.vue

@@ -0,0 +1,88 @@
+<template>
+  <div id="tec">
+    <el-row>
+      <el-col :span="24" class="tec">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="19" class="textOver title">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="5" class="date">
+            {{ item.complete_date }}
+          </el-col>
+          <el-col :span="24" class="textOver orgin">
+            专利有效性:<span>{{ item.effective_date || '暂无' }} </span>
+          </el-col>
+          <el-col :span="24" class="titlejj">
+            摘要:<span>{{ item.content }}</span>
+          </el-col>
+        </el-col>
+      </el-col>
+      <el-backtop :bottom="50" :right="10"> </el-backtop>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'tec',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    //详情
+    detailBtn(data) {
+      this.$router.push({ path: '/viewTwo/patent/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.tec {
+  padding: 0 10px;
+  .list {
+    padding: 5px 0;
+    border-bottom: 1px dashed #ccc;
+    .title {
+      font-size: 16px;
+      font-weight: bold;
+    }
+    .date {
+      font-size: 14px;
+      text-align: right;
+      padding: 3px 0 0 0;
+    }
+    .orgin {
+      font-size: 14px;
+      padding: 5px 0;
+      span {
+        color: #999;
+      }
+    }
+    .titlejj {
+      font-size: 14px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 2;
+      word-break: break-all;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      span {
+        color: #999;
+      }
+    }
+  }
+}
+</style>

+ 102 - 0
src/viewTwo/question/index.vue

@@ -0,0 +1,102 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="list"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+import list from './parts/list.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 查询
+      name: '',
+      list: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    async search({ ...info } = {}) {
+      let data = [
+        {
+          name: '调查问卷标题',
+          create_date: '2020-12-12',
+          brief: '信息简介',
+        },
+      ];
+      this.$set(this, `list`, data);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 40px;
+    overflow: hidden;
+  }
+  .down {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 95px;
+    }
+  }
+}
+</style>

+ 83 - 0
src/viewTwo/question/parts/list.vue

@@ -0,0 +1,83 @@
+<template>
+  <div id="tec">
+    <el-row>
+      <el-col :span="24" class="tec">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="19" class="textOver title">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="5" class="date">
+            {{ item.create_date }}
+          </el-col>
+          <el-col :span="24" class="titlejj">
+            {{ item.brief }}
+          </el-col>
+        </el-col>
+      </el-col>
+      <el-backtop :bottom="50" :right="10"> </el-backtop>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'tec',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    //详情
+    detailBtn(data) {
+      // this.$router.push({ path: '/viewTwo/question/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.tec {
+  padding: 0 10px;
+  .list {
+    padding: 5px 0;
+    border-bottom: 1px dashed #ccc;
+    .title {
+      font-size: 16px;
+      font-weight: bold;
+    }
+    .date {
+      font-size: 14px;
+      text-align: right;
+      padding: 3px 0 0 0;
+    }
+    .orgin {
+      font-size: 14px;
+      padding: 5px 0;
+      span {
+        color: #999;
+      }
+    }
+    .titlejj {
+      font-size: 14px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 2;
+      word-break: break-all;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      height: 42px;
+    }
+  }
+}
+</style>

+ 167 - 0
src/viewTwo/roadshow/detail.vue

@@ -0,0 +1,167 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="onClickLeft"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="info">
+          <el-col :span="24" class="name">
+            {{ info.title }}
+          </el-col>
+          <el-col :span="24" class="date">
+            <span class="textOver">发布时间:{{ info.publish_time }}</span>
+            <span class="textOver"> 信息来源:{{ info.orgin }}</span>
+          </el-col>
+          <el-col :span="24" class="image" v-if="info.picture != null">
+            <el-image :src="info.picture">
+              <div slot="error" class="image-slot">
+                <i class="el-icon-picture-outline"></i></div
+            ></el-image>
+          </el-col>
+          <el-col :span="24" class="video">
+            <video
+              autoplay="autoplay"
+              controls="controls"
+              preload="meta"
+              x-webkit-airplay="true"
+              webkit-playsinline="true"
+              playsinline="true"
+              x5-video-player-type="h5"
+              x5-video-player-fullscreen="true"
+              controlsList="nodownload"
+              :src="info.filepath"
+              loop="loop"
+            >
+              <source src="movie.ogg" type="video/ogg" />
+              <source src="movie.mp4" type="video/mp4" />
+            </video>
+          </el-col>
+          <el-col :span="24" class="content">
+            <p v-html="info.content"></p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: newsroadshow } = createNamespacedHelpers('newsroadshow');
+export default {
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      info: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...newsroadshow(['fetch']),
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `info`, res.data);
+        }
+      }
+    },
+    // 返回
+    onClickLeft() {
+      this.$router.push({ path: '/viewTwo/roadshow/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 46px;
+    overflow: hidden;
+  }
+  .info {
+    .name {
+      text-align: center;
+      padding: 15px 10px 0 10px;
+      font-size: 18px;
+      font-weight: bold;
+    }
+    .date {
+      margin: 15px 0;
+      span {
+        display: inline-block;
+        width: 50%;
+        text-align: center;
+        color: #666;
+      }
+    }
+    .image {
+      padding: 10px;
+      .el-image {
+        width: 100%;
+        height: 210px;
+      }
+    }
+    .video {
+      video {
+        width: 100%;
+        height: 215px;
+      }
+    }
+    .content {
+      padding: 10px 5px;
+    }
+  }
+}
+
+/deep/.content p img {
+  width: 100%;
+  height: 300px;
+  margin: 5px 0px;
+  display: block;
+}
+/deep/.content div img {
+  width: 100%;
+  height: 260px;
+  display: block;
+}
+/deep/.content p {
+  font-size: 14px;
+  color: #444;
+}
+</style>

+ 101 - 0
src/viewTwo/roadshow/index.vue

@@ -0,0 +1,101 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="roadList"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import list from './parts/list.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: newsroadshow } = createNamespacedHelpers('newsroadshow');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 查询
+      name: '',
+      roadList: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...newsroadshow(['query']),
+    async search({ ...info } = {}) {
+      if (this.name) info.title = this.name;
+      let res = await this.query({ ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `roadList`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 45px;
+    overflow: hidden;
+  }
+  .down {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+      border-bottom: 1px dashed #ccc;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 90px;
+    }
+  }
+}
+</style>

+ 87 - 0
src/viewTwo/roadshow/parts/list.vue

@@ -0,0 +1,87 @@
+<template>
+  <div id="list">
+    <el-row>
+      <el-col :span="24" class="con">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="19" class="textOver title">
+            {{ item.title }}
+          </el-col>
+          <el-col :span="5" class="date">
+            {{ item.publish_time }}
+          </el-col>
+          <el-col :span="24" class="textOver orgin">
+            来源:<span>{{ item.orgin }} </span>
+          </el-col>
+          <el-col :span="24" class="titlejj">
+            简介:<span>{{ item.titlejj }}</span>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'list',
+  props: {
+    list: { type: Array },
+    typelist: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {
+      noimage: require('@/assets/kjzx.jpg'),
+    };
+  },
+  created() {},
+  methods: {
+    detailBtn(data) {
+      this.$router.push({ path: '/viewTwo/roadshow/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.con {
+  padding: 10px;
+  .list {
+    padding: 5px 0;
+    border-bottom: 1px dashed #ccc;
+    .title {
+      font-size: 16px;
+      font-weight: bold;
+    }
+    .date {
+      font-size: 14px;
+      text-align: right;
+      padding: 3px 0 0 0;
+    }
+    .orgin {
+      font-size: 14px;
+      padding: 5px 0;
+      span {
+        color: #999;
+      }
+    }
+    .titlejj {
+      font-size: 14px;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      -webkit-line-clamp: 2;
+      word-break: break-all;
+      display: -webkit-box;
+      -webkit-box-orient: vertical;
+      span {
+        color: #999;
+      }
+    }
+  }
+}
+</style>

+ 143 - 0
src/viewTwo/service/detail.vue

@@ -0,0 +1,143 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="back"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="message">
+            <p>
+              <span>产品名称</span>
+              <span>{{ info.name || '暂无' }}</span>
+            </p>
+            <p>
+              <span>信息属性</span>
+              <span>{{ info.messattribute || '暂无' }}</span>
+            </p>
+            <p>
+              <span>需求程度</span>
+              <span>{{ info.demand || '暂无' }}</span>
+            </p>
+            <p>
+              <span>联系人</span>
+              <span>{{ info.contacts || '暂无' }}</span>
+            </p>
+            <p>
+              <span>联系方式</span>
+              <span>{{ info.qqwx || '暂无' }}</span>
+            </p>
+            <p>
+              <span>信息描述</span>
+              <span>{{ info.informationdesc || '暂无' }}</span>
+            </p>
+            <p>
+              <span>核心要素</span>
+              <span>{{ info.coreelements || '暂无' }}</span>
+            </p>
+
+            <p>
+              <span>价格信息</span>
+              <span>{{ info.priceinfo || '暂无' }}</span>
+            </p>
+            <p>
+              <span>商务预期</span>
+              <span>{{ info.businessexpect || '暂无' }}</span>
+            </p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: product } = createNamespacedHelpers('product');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      noimage: require('@/assets/noimage.jpg'),
+      info: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...product(['fetch']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    back() {
+      this.$router.push({ path: '/viewTwo/service/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.detail {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  min-height: 570px;
+  .message {
+    background: #fff;
+    padding: 0 15px;
+    min-height: 50px;
+    p {
+      min-height: 50px;
+      line-height: 50px;
+      border-bottom: 1px solid #ccc;
+      span {
+        color: #000;
+      }
+      span:nth-child(1) {
+        display: inline-block;
+        width: 80px;
+        color: #ccc;
+      }
+    }
+    p:last-child {
+      border-bottom: none;
+    }
+  }
+}
+</style>

+ 101 - 0
src/viewTwo/service/index.vue

@@ -0,0 +1,101 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="list"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import list from './parts/list.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: product } = createNamespacedHelpers('product');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 查询
+      name: '',
+      list: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...product(['query']),
+    async search({ ...info } = {}) {
+      if (this.name) info.name = this.name;
+      let res = await this.query({ type: 2, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 45px;
+    overflow: hidden;
+  }
+  .down {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+      border-bottom: 1px dashed #ccc;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 100px;
+    }
+  }
+}
+</style>

+ 74 - 0
src/viewTwo/service/parts/list.vue

@@ -0,0 +1,74 @@
+<template>
+  <div id="tec">
+    <el-row>
+      <el-col :span="24" class="tec">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="24" class="name textOver">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="24" class="company textOver"> 服务单位:{{ item.company || '暂无' }} </el-col>
+          <el-col :span="24" class="other">
+            <span class="textOver">信息属性:{{ item.messattribute || '暂无' }}</span>
+            <span class="textOver">联系人:{{ item.qqwx || '暂无' }}</span>
+          </el-col>
+        </el-col>
+      </el-col>
+      <el-backtop :bottom="50" :right="10"> </el-backtop>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'tec',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    //详情
+    detailBtn(data) {
+      this.$router.push({ path: '/viewTwo/service/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.tec {
+  padding: 0 10px;
+  .list {
+    border-bottom: 1px dashed #ccc;
+    padding: 10px 0;
+    .name {
+      font-size: 18px;
+      font-weight: bold;
+    }
+    .company {
+      font-size: 16px;
+      color: #666;
+      padding: 5px 0 0 0;
+    }
+    .other {
+      font-size: 16px;
+      color: #666;
+      padding: 5px 0 0 0;
+      span {
+        display: inline-block;
+        width: 50%;
+      }
+    }
+  }
+}
+</style>

+ 192 - 0
src/viewTwo/techol/detail.vue

@@ -0,0 +1,192 @@
+<template>
+  <div id="detail">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow" @onClickLeft="back"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="main">
+          <el-col :span="24" class="mainTop">
+            <van-swipe style="height: 220px;" vertical>
+              <template v-if="info.image && info.image.length > 0">
+                <van-swipe-item v-for="(item, index) in info.image" :key="index">
+                  <van-image :src="item.url" />
+                </van-swipe-item>
+              </template>
+              <template v-else>
+                <van-image :src="noimage" />
+              </template>
+            </van-swipe>
+          </el-col>
+          <el-col :span="24" class="message">
+            <p>
+              <span>产品名称</span>
+              <span>{{ info.name || '暂无' }}</span>
+            </p>
+            <p>
+              <span>需求方</span>
+              <span>{{ info.company || '暂无' }}</span>
+            </p>
+            <p>
+              <span>所属领域</span>
+              <span>{{ info.field || '暂无' }}</span>
+            </p>
+            <p>
+              <span>注册类型</span>
+              <span>{{ info.companytype || '暂无' }}</span>
+            </p>
+            <p>
+              <span>注册时间</span>
+              <span>{{ info.companydate || '暂无' }}</span>
+            </p>
+            <p>
+              <span>注册资金</span>
+              <span>{{ info.companycapital || '暂无' }}</span>
+            </p>
+            <p>
+              <span>投资预算</span>
+              <span>{{ info.budget || '暂无' }}</span>
+            </p>
+
+            <p>
+              <span>紧急程度</span>
+              <span>{{ info.degreeurgency || '暂无' }}</span>
+            </p>
+            <p>
+              <span>合作方式</span>
+              <span>{{ info.cooperation || '暂无' }}</span>
+            </p>
+            <p>
+              <span>联系人</span>
+              <span>{{ info.contacts || '暂无' }}</span>
+            </p>
+            <p>
+              <span>电子邮箱</span>
+              <span>{{ info.email || '暂无' }}</span>
+            </p>
+            <p>
+              <span>需求说明</span>
+              <span>{{ info.requirementdesc || '暂无' }}</span>
+            </p>
+            <p>
+              <span>预期目标</span>
+              <span>{{ info.expect || '暂无' }}</span>
+            </p>
+            <p>
+              <span>需求现状</span>
+              <span>{{ info.present || '暂无' }}</span>
+            </p>
+            <p>
+              <span>合作要求</span>
+              <span>{{ info.condition || '暂无' }}</span>
+            </p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: product } = createNamespacedHelpers('product');
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'detail',
+  props: {},
+  components: {
+    NavBar,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      noimage: require('@/assets/noimage.jpg'),
+      info: {},
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...product(['fetch']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        this.$set(this, `info`, res.data);
+      }
+    },
+    back() {
+      this.$router.push({ path: '/viewTwo/techol/index' });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.detail {
+  width: 100%;
+  min-height: 667px;
+  position: relative;
+  background-color: #f9fafc;
+}
+.top {
+  height: 46px;
+  overflow: hidden;
+}
+.main {
+  min-height: 570px;
+  .mainTop {
+    padding: 0px 15px;
+    margin-bottom: 10px;
+    min-height: 220px;
+    background-color: #fff;
+    .van-swipe {
+      padding: 10px 0px;
+      box-sizing: border-box;
+      .van-image {
+        height: 200px;
+      }
+    }
+  }
+  .message {
+    background: #fff;
+    padding: 0 15px;
+    min-height: 50px;
+    p {
+      min-height: 50px;
+      line-height: 50px;
+      border-bottom: 1px solid #ccc;
+      span {
+        color: #000;
+      }
+      span:nth-child(1) {
+        display: inline-block;
+        width: 80px;
+        color: #ccc;
+      }
+    }
+    p:last-child {
+      border-bottom: none;
+    }
+  }
+}
+</style>

+ 101 - 0
src/viewTwo/techol/index.vue

@@ -0,0 +1,101 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-col :span="24" class="top">
+          <NavBar v-show="navShow" :title="title" :isleftarrow="isleftarrow"> </NavBar>
+        </el-col>
+        <el-col :span="24" class="down">
+          <el-col :span="24" class="search">
+            <van-search v-model="name" @search="search" placeholder="请输入信息标题" />
+          </el-col>
+          <el-col :span="24" class="data">
+            <list :list="list"></list>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import list from './parts/list.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+import NavBar from '@/layout/common/topInfo.vue';
+const { mapActions: product } = createNamespacedHelpers('product');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    NavBar,
+    list,
+  },
+  data: function() {
+    return {
+      // 头部标题
+      title: '',
+      // meta为true
+      isleftarrow: '',
+      // 返回
+      navShow: true,
+      active: 0,
+      // 查询
+      name: '',
+      list: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...product(['query']),
+    async search({ ...info } = {}) {
+      if (this.name) info.name = this.name;
+      let res = await this.query({ type: 0, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  mounted() {
+    this.title = this.$route.meta.title;
+    this.isleftarrow = this.$route.meta.isleftarrow;
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  background-color: #f9fafc;
+  .top {
+    height: 45px;
+    overflow: hidden;
+  }
+  .down {
+    .search {
+      position: fixed;
+      width: 100%;
+      z-index: 999;
+      border-bottom: 1px dashed #ccc;
+    }
+    .data {
+      position: absolute;
+      width: 100%;
+      top: 100px;
+    }
+  }
+}
+</style>

+ 74 - 0
src/viewTwo/techol/parts/list.vue

@@ -0,0 +1,74 @@
+<template>
+  <div id="tec">
+    <el-row>
+      <el-col :span="24" class="tec">
+        <el-col :span="24" class="list" v-for="(item, index) in list" :key="index" @click.native="detailBtn(item)">
+          <el-col :span="24" class="name textOver">
+            {{ item.name }}
+          </el-col>
+          <el-col :span="24" class="company textOver"> 需求单位:{{ item.company || '暂无' }} </el-col>
+          <el-col :span="24" class="other">
+            <span class="textOver">所属领域:{{ item.field || '暂无' }}</span>
+            <span class="textOver">合作方式:{{ item.cooperation || '暂无' }}</span>
+          </el-col>
+        </el-col>
+      </el-col>
+      <el-backtop :bottom="50" :right="10"> </el-backtop>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'tec',
+  props: {
+    list: { type: Array },
+  },
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {
+    //详情
+    detailBtn(data) {
+      this.$router.push({ path: '/viewTwo/techol/detail', query: { id: data.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.tec {
+  padding: 0 10px;
+  .list {
+    border-bottom: 1px dashed #ccc;
+    padding: 10px 0;
+    .name {
+      font-size: 18px;
+      font-weight: bold;
+    }
+    .company {
+      font-size: 16px;
+      color: #666;
+      padding: 5px 0 0 0;
+    }
+    .other {
+      font-size: 16px;
+      color: #666;
+      padding: 5px 0 0 0;
+      span {
+        display: inline-block;
+        width: 50%;
+      }
+    }
+  }
+}
+</style>

+ 3 - 0
src/views/channel/parts/list.vue

@@ -10,6 +10,9 @@
             <p class="title textOver">
               <span style="color:#ff0000">[{{ item.room_id }}]</span>{{ item.title }}
             </p>
+            <p>
+              信息类型:<span>{{ item.column_name }}</span>
+            </p>
             <p class="desc">{{ item.desc }}</p>
             <p class="time textOver">{{ item.create_time }}</p>
           </el-col>

+ 0 - 32
src/views/secondView/achieve/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>技术成果</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/channel/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>科技频道</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/expert/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>专家智库</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/interview/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>培训访谈</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/live/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>在线展会</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/news/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>新闻资讯</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/notice/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>通知通告</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/patent/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>e专利</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/question/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>调查问卷</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/roadshow/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>项目路演</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/service/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>在线服务</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>

+ 0 - 32
src/views/secondView/techol/index.vue

@@ -1,32 +0,0 @@
-<template>
-  <div id="index">
-    <el-row>
-      <el-col :span="24">
-        <p>科技需求</p>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script>
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-  name: 'index',
-  props: {},
-  components: {},
-  data: function() {
-    return {};
-  },
-  created() {},
-  methods: {},
-  computed: {
-    ...mapState(['user']),
-  },
-  watch: {},
-};
-</script>
-
-<style lang="less" scoped></style>