wuhongyu 5 yıl önce
ebeveyn
işleme
9465920e5e

+ 5 - 0
package-lock.json

@@ -11466,6 +11466,11 @@
       "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.3.0.tgz",
       "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-3.3.0.tgz",
       "integrity": "sha1-ZltGMOoTRzFxOfzFy0laqz7F5RM="
       "integrity": "sha1-ZltGMOoTRzFxOfzFy0laqz7F5RM="
     },
     },
+    "wangeditor": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npm.taobao.org/wangeditor/download/wangeditor-3.1.1.tgz",
+      "integrity": "sha1-+9PB1JdpI8nt67hbKdMLNVEq0Dk="
+    },
     "watchpack": {
     "watchpack": {
       "version": "1.6.1",
       "version": "1.6.1",
       "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.1.tgz",
       "resolved": "https://registry.npm.taobao.org/watchpack/download/watchpack-1.6.1.tgz",

+ 2 - 1
package.json

@@ -19,7 +19,8 @@
     "vue": "^2.6.11",
     "vue": "^2.6.11",
     "vue-meta": "^2.3.3",
     "vue-meta": "^2.3.3",
     "vue-router": "^3.1.6",
     "vue-router": "^3.1.6",
-    "vuex": "^3.1.3"
+    "vuex": "^3.1.3",
+    "wangeditor": "^3.1.1"
   },
   },
   "devDependencies": {
   "devDependencies": {
     "@vue/cli-plugin-babel": "~4.3.0",
     "@vue/cli-plugin-babel": "~4.3.0",

+ 36 - 2
src/router/index.js

@@ -62,6 +62,12 @@ const live = [
         name: 'live_service',
         name: 'live_service',
         component: () => import('../views/service/index.vue'),
         component: () => import('../views/service/index.vue'),
       },
       },
+      {
+        path: '/live/liveApply',
+        meta: { title: '项目申请', subSite: true },
+        name: 'live_apply',
+        component: () => import('../views/hall/liveApply.vue'),
+      },
     ],
     ],
   },
   },
   {
   {
@@ -70,8 +76,36 @@ const live = [
     meta: { title: '直播大厅', subSite: true },
     meta: { title: '直播大厅', subSite: true },
     component: () => import('../views/direct.vue'),
     component: () => import('../views/direct.vue'),
   },
   },
-
-  ,
+  {
+    path: '/hall/index',
+    name: 'hall_index',
+    meta: { title: '直播首页', subSite: true },
+    component: () => import('../views/hall/index.vue'),
+  },
+  {
+    path: '/live/liveList',
+    meta: { title: '直播中心', subSite: true },
+    name: 'live_list',
+    component: () => import('../views/hall/liveList.vue'),
+  },
+  {
+    path: '/live/hallDetail',
+    meta: { title: '直播详情', subSite: true },
+    name: 'live_hallDetail',
+    component: () => import('../views/hall/hallDetail.vue'),
+  },
+  {
+    path: '/live/hall/dock/dockDetail',
+    meta: { title: '项目信息详情', subSite: true },
+    name: 'dock_Detail',
+    component: () => import('../views/hall/dock/dockDetail.vue'),
+  },
+  {
+    path: '/live/hall/dock/dockInfo',
+    meta: { title: '对接信息查看', subSite: true },
+    name: 'dock_Info',
+    component: () => import('../views/hall/dock/dockInfo.vue'),
+  },
 ];
 ];
 
 
 const routes = [...live];
 const routes = [...live];

+ 97 - 19
src/views/direct.vue

@@ -78,27 +78,27 @@
               <el-tab-pane label="找技术">
               <el-tab-pane label="找技术">
                 <el-col :span="24" class="newsheight">
                 <el-col :span="24" class="newsheight">
                   <ul>
                   <ul>
-                    <li v-for="(acc, index) in jishulist" :key="index">
+                    <li v-for="(item, index) in jishulist" :key="index">
                       <el-col :span="14" class="lileft">
                       <el-col :span="14" class="lileft">
                         <p>
                         <p>
-                          <span class="title" @click="onclickjs(acc)"> {{ acc.name }}</span>
+                          <span class="title" @click="onclickjs(item)"> {{ item.name }}</span>
 
 
                           <span><el-button class="duijie">对接</el-button></span>
                           <span><el-button class="duijie">对接</el-button></span>
                         </p>
                         </p>
 
 
                         <p class="newp">
                         <p class="newp">
-                          <span class="name"><i class="el-icon-user-solid"></i>{{ acc.contact_user }}</span
-                          ><span> <i class="el-icon-phone"></i>{{ acc.contact_tel }}</span>
+                          <span class="name"><i class="el-icon-user-solid"></i>{{ item.contact_user }}</span
+                          ><span> <i class="el-icon-phone"></i>{{ item.contact_tel }}</span>
                         </p>
                         </p>
                         <p>
                         <p>
-                          <span class="pspan">类型:{{ acc.product_type_name }}</span
-                          ><span class="pspan">研发阶段:{{ acc.phase == '0' ? '阶段成果' : '最终成果' }}</span
-                          ><span class="pspan">交易方式:{{ acc.business == '0' ? '公用' : acc.business == '1' ? '转让' : '竞价' }} </span
-                          ><span class="pspan">交易价格:{{ acc.price }}{{ acc.priceunit }}</span>
+                          <span class="pspan">类型:{{ item.product_type_name }}</span
+                          ><span class="pspan">研发阶段:{{ item.phase == '0' ? '阶段成果' : '最终成果' }}</span
+                          ><span class="pspan">交易方式:{{ item.business == '0' ? '公用' : item.business == '1' ? '转让' : '竞价' }} </span
+                          ><span class="pspan">交易价格:{{ item.price }}{{ item.priceunit }}</span>
                         </p>
                         </p>
                       </el-col>
                       </el-col>
                       <el-col :span="10" class="liright">
                       <el-col :span="10" class="liright">
-                        <p>摘要:{{ acc.introduction }}</p>
+                        <p>摘要:{{ item.introduction }}</p>
                       </el-col>
                       </el-col>
                     </li>
                     </li>
                   </ul>
                   </ul>
@@ -109,7 +109,7 @@
                   <ul class="demand">
                   <ul class="demand">
                     <li class="demandList" v-for="(item, index) in demandList" :key="index">
                     <li class="demandList" v-for="(item, index) in demandList" :key="index">
                       <p>
                       <p>
-                        <span class="textOver" style="display:inline-block;width:85%;" @click="dialogVisible = true">{{ item.name }}</span>
+                        <span class="textOver" style="display:inline-block;width:85%;" @click="onclickjs(item)">{{ item.name }}</span>
                         <el-button type="primary" size="mini" @click="technologyBtn(item.id)" style="position: relative;top: -5px;">对接</el-button>
                         <el-button type="primary" size="mini" @click="technologyBtn(item.id)" style="position: relative;top: -5px;">对接</el-button>
                       </p>
                       </p>
                       <p>
                       <p>
@@ -128,7 +128,7 @@
                 <el-col :span="24" class="newsheight">
                 <el-col :span="24" class="newsheight">
                   <ul class="service">
                   <ul class="service">
                     <li class="serviceList" v-for="(item, index) in serviceList" :key="index">
                     <li class="serviceList" v-for="(item, index) in serviceList" :key="index">
-                      <p class="company" @click="dialogVisible = true">{{ item.companyName }}</p>
+                      <p class="company" @click="onclickjs(item)">{{ item.name }}</p>
                       <div class="serviceDown">
                       <div class="serviceDown">
                         <el-image :src="item.image[0].url"></el-image>
                         <el-image :src="item.image[0].url"></el-image>
                         <p>
                         <p>
@@ -149,7 +149,7 @@
                       <el-image :src="item.imgpath"></el-image>
                       <el-image :src="item.imgpath"></el-image>
                       <div>
                       <div>
                         <p>
                         <p>
-                          <span @click="dialogVisible = true">{{ item.name }}</span>
+                          <span @click="zhuanjia(item)">{{ item.name }}</span>
                           <span>{{ item.nation }}</span>
                           <span>{{ item.nation }}</span>
                         </p>
                         </p>
                         <p>职务:{{ item.position }}</p>
                         <p>职务:{{ item.position }}</p>
@@ -222,8 +222,8 @@
       <el-link :underline="false" @click="clickBtn()" target="_blank">直播中心</el-link>
       <el-link :underline="false" @click="clickBtn()" target="_blank">直播中心</el-link>
     </div>
     </div>
 
 
-    <el-dialog title="技术详情" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
-      <el-col :span="24" class="detail">
+    <el-dialog title="详情" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
+      <el-col :span="24" class="detail" v-if="policyInfo.totaltype">
         <el-col :span="24" class="infoMess">
         <el-col :span="24" class="infoMess">
           <el-col :span="24" class="info"> 名称:{{ policyInfo.name }} </el-col>
           <el-col :span="24" class="info"> 名称:{{ policyInfo.name }} </el-col>
           <el-col :span="24" class="info"> 类型:{{ policyInfo.product_type_name }} </el-col>
           <el-col :span="24" class="info"> 类型:{{ policyInfo.product_type_name }} </el-col>
@@ -251,7 +251,7 @@
           <el-col :span="24" class="info"> 描述{{ policyInfo.description }} </el-col>
           <el-col :span="24" class="info"> 描述{{ policyInfo.description }} </el-col>
           <el-col :span="24" class="info"> 知识产权:{{ policyInfo.property }} </el-col>
           <el-col :span="24" class="info"> 知识产权:{{ policyInfo.property }} </el-col>
           <el-col :span="24" class="info">
           <el-col :span="24" class="info">
-            状态:{{ policyInfo.status === '0' ? '待审核' : policyInfo.status === '1' ? '通过审核' : policyInfo.status === '2' ? '审核拒绝' : 'underdind' }}
+            <!-- 状态:{{ policyInfo.status === '0' ? '待审核' : policyInfo.status === '1' ? '通过审核' : policyInfo.status === '2' ? '审核拒绝' : 'underdind' }} -->
           </el-col>
           </el-col>
           <!-- <el-col :span="24" class="info"> 是否删除:{{ policyInfo.is_del === '0' ? '否' : policyInfo.is_del === '1' ? '是' : 'underdind' }} </el-col> -->
           <!-- <el-col :span="24" class="info"> 是否删除:{{ policyInfo.is_del === '0' ? '否' : policyInfo.is_del === '1' ? '是' : 'underdind' }} </el-col> -->
           <el-col :span="24" class="info"> 联系人:{{ policyInfo.contact_user }} </el-col>
           <el-col :span="24" class="info"> 联系人:{{ policyInfo.contact_user }} </el-col>
@@ -259,6 +259,38 @@
           <el-col :span="24" class="info"> 简介:{{ policyInfo.introduction }} </el-col>
           <el-col :span="24" class="info"> 简介:{{ policyInfo.introduction }} </el-col>
         </el-col>
         </el-col>
       </el-col>
       </el-col>
+      <el-col :span="24" v-else>
+        <el-col :span="24" class="infoMess">
+          <el-col :span="24" class="info"> 专家名称:{{ policyInfo.name }} </el-col>
+          <el-col :span="24" class="info"> 民族:{{ policyInfo.nation }} </el-col>
+          <el-col :span="24" class="info"> 学术成就:{{ policyInfo.achievement }} </el-col>
+          <el-col :span="24" class="info"> 身份证号:{{ policyInfo.cardnumber }} </el-col>
+          <el-col :span="24" class="info"> 出生日期:{{ policyInfo.birth }} </el-col>
+          <el-col :span="24" class="info"> 毕业院校:{{ policyInfo.school }} </el-col>
+          <el-col :span="24" class="info"> 证件类型:{{ policyInfo.cardtype }} </el-col>
+          <el-col :span="24" class="info"> 学位:{{ policyInfo.degree }} </el-col>
+          <el-col :span="24" class="info"> 电子邮箱:{{ policyInfo.email }} </el-col>
+          <el-col :span="24" class="info"> 学位:{{ policyInfo.degree }} </el-col>
+          <el-col :span="24" class="info"> 性别:{{ policyInfo.gender === '0' ? '男' : policyInfo.gender === '1' ? '女' : 'underdind' }}</el-col>
+          <el-col :span="24" class="info"> 学位:{{ policyInfo.field }} </el-col>
+          <el-col :span="24" class="info"> 学历:{{ policyInfo.eduback }} </el-col>
+          <el-col :span="24" class="info"> 初级职称:{{ policyInfo.technical }} </el-col>
+          <el-col :span="24" class="info"> 具体职称:{{ policyInfo.technical_actual }} </el-col>
+          <el-col :span="24" class="info"> 职务:{{ policyInfo.position }} </el-col>
+          <el-col :span="24" class="info"> 所学专业:{{ policyInfo.major_studied }} </el-col>
+          <el-col :span="24" class="info"> 从事专业:{{ policyInfo.professional }} </el-col>
+          <el-col :span="24" class="info"> 手机号:{{ policyInfo.phone }} </el-col>
+
+          <el-col :span="24" class="info"> 主持或参与项目情况:{{ policyInfo.project_profile }} </el-col>
+          <el-col :span="24" class="info"> 论文论著:{{ policyInfo.paper }} </el-col>
+          <el-col :span="24" class="info"> 主要学术成就及获奖情况:{{ policyInfo.paper }} </el-col>
+          <el-col :span="24" class="info"> 可供咨询领域:{{ policyInfo.field }} </el-col>
+          <el-col :span="24" class="info"> 领域拼音:{{ policyInfo.field_py }} </el-col>
+          <el-col :span="24" class="info"> 业务工作简介:{{ policyInfo.job_profile }} </el-col>
+          <el-col :span="24" class="info"> 备注:{{ policyInfo.remark }} </el-col>
+        </el-col>
+      </el-col>
+
       <span slot="footer" class="annius">
       <span slot="footer" class="annius">
         <el-button @click="dialogVisible = false">取 消</el-button>
         <el-button @click="dialogVisible = false">取 消</el-button>
         <el-button type="primary" @click="dialogVisible = false">对接</el-button>
         <el-button type="primary" @click="dialogVisible = false">对接</el-button>
@@ -350,7 +382,45 @@ export default {
     // 找专家
     // 找专家
     expertList: [],
     expertList: [],
 
 
-    luyanList: [],
+    // 路演
+    luyanList: [
+      {
+        title: '项目路演',
+        num: '1234',
+        city: '吉林省',
+        hy: '所属行业',
+        xurz: '股权融资',
+      },
+      {
+        title: '项目路演',
+        num: '1234',
+        city: '吉林省',
+        hy: '所属行业',
+        xurz: '股权融资',
+      },
+      {
+        title: '项目路演',
+        num: '1234',
+        city: '吉林省',
+        hy: '所属行业',
+        xurz: '股权融资',
+      },
+      {
+        title: '项目路演',
+        num: '1234',
+        city: '吉林省',
+        hy: '所属行业',
+        xurz: '股权融资',
+      },
+      {
+        title: '项目路演',
+        num: '1234',
+        city: '吉林省',
+        hy: '所属行业',
+        xurz: '股权融资',
+      },
+    ],
+
     superOne: require('@/assets/live/main1.png'),
     superOne: require('@/assets/live/main1.png'),
     two: require('@/assets/live/top_bg.png'),
     two: require('@/assets/live/top_bg.png'),
 
 
@@ -358,6 +428,7 @@ export default {
   }),
   }),
   created() {
   created() {
     this.searchInfo();
     this.searchInfo();
+    this.searchDock();
   },
   },
   methods: {
   methods: {
     ...mapProduct({ mapProductQuery: 'query' }),
     ...mapProduct({ mapProductQuery: 'query' }),
@@ -380,11 +451,18 @@ export default {
       console.log(res);
       console.log(res);
       if (this.$checkRes(res)) this.$set(this, `expertList`, res.data);
       if (this.$checkRes(res)) this.$set(this, `expertList`, res.data);
     },
     },
-
-    onclickjs(acc) {
+    async searchDock() {},
+    onclickjs(item) {
       console.log();
       console.log();
       this.dialogVisible = true;
       this.dialogVisible = true;
-      this.$set(this, `policyInfo`, acc);
+
+      this.$set(this, `policyInfo`, item);
+    },
+
+    zhuanjia(item) {
+      console.log(item);
+      this.dialogVisible = true;
+      this.$set(this, `policyInfo`, item);
     },
     },
     handleClose(done) {
     handleClose(done) {
       this.$confirm('确认关闭?')
       this.$confirm('确认关闭?')

+ 213 - 0
src/views/hall/dock/dockDetail.vue

@@ -0,0 +1,213 @@
+<template>
+  <div id="dockDetail">
+    <el-row>
+      <el-col :span="24" class="style">
+        <el-image :src="beijingPic"></el-image>
+        <el-col :span="24" class="info">
+          <div class="w_1200">
+            <el-col :span="24" class="top">
+              <p>吉林省计算中心对接直播大厅</p>
+              <p>主办方:吉林省计算中心</p>
+            </el-col>
+            <el-col :span="24" class="main">
+              <el-col :span="6" class="btn">
+                <el-col :span="24">
+                  <el-button type="primary" icon="el-icon-tickets" @click="btnInfo">项目信息</el-button>
+                </el-col>
+                <el-col :span="24">
+                  <el-button type="danger" icon="el-icon-phone-outline" @click="btnPhone">线下对接</el-button>
+                </el-col>
+              </el-col>
+              <el-col :span="18" class="mainInfo">
+                <el-col :span="24" v-if="display === '1'">
+                  <p class="name textOver">{{ productInfo.name }}</p>
+                  <div class="brief">
+                    <p>
+                      <span>应用领域:{{ productInfo.field }}</span>
+                      <span>服务范围:{{ productInfo.scope }}</span>
+                    </p>
+                    <p>
+                      <span>产品类型:{{ productInfo.product_type_name }}</span>
+                      <span>研发阶段:{{ productInfo.phase }}</span>
+                    </p>
+                    <p>
+                      <span>交易方式:{{ productInfo.business }}</span>
+                      <span>交易价格:{{ productInfo.price }}/{{ productInfo.priceunit }}</span>
+                    </p>
+                  </div>
+                  <p class="intro">
+                    <span><i class="el-icon-date"></i>项目简介</span>
+                    <span>{{ productInfo.introduction }}</span>
+                  </p>
+                </el-col>
+                <el-col :span="24" v-if="display === '2'" class="contact">
+                  <p>
+                    联系人姓名:<span style="color:red;">{{ productInfo.contact_user }}</span>
+                  </p>
+                  <p>
+                    联系人电话:<span style="color:red;">{{ productInfo.contact_tel }}</span>
+                  </p>
+                </el-col>
+              </el-col>
+            </el-col>
+          </div>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: mapProduct } = createNamespacedHelpers('marketproduct');
+export default {
+  name: 'dockDetail',
+  props: {},
+  components: {},
+  data: () => ({
+    beijingPic: require('@a/live/top_3.png'),
+    display: '1',
+    productInfo: {},
+  }),
+  created() {
+    if (this.$route.query.id) {
+      this.searchInfo();
+    }
+  },
+  methods: {
+    ...mapProduct(['fetch']),
+    async searchInfo() {
+      let res = await this.fetch(this.$route.query.id);
+      if (res.errcode === 0) {
+        this.$set(this, `productInfo`, res.data);
+      }
+    },
+    // 项目信息
+    btnInfo() {
+      this.display = '1';
+    },
+    // 线下对接
+    btnPhone() {
+      this.display = '2';
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.w_1200 {
+  width: 1200px;
+  margin: 0 auto;
+}
+p {
+  padding: 0;
+  margin: 0;
+}
+.style {
+  height: 100vh;
+}
+.style .info {
+  position: relative;
+  top: -450px;
+}
+.style .top {
+  position: relative;
+  top: 0;
+  width: 100%;
+  text-align: center;
+  z-index: 999;
+  height: 230px;
+  margin: 0 0 20px 0;
+}
+.style .top p:first-child {
+  font-size: 50px;
+  color: #fff;
+}
+.style .top p:last-child {
+  font-size: 30px;
+  color: #fff;
+  position: absolute;
+  width: 100%;
+  top: 170px;
+}
+.style .main {
+  height: 670px;
+  border: 1px solid red;
+  background: #fff;
+  overflow: hidden;
+  padding: 30px 20px;
+}
+.main .btn div {
+  padding: 30px 0 0px 0;
+}
+/deep/.main .btn .el-button {
+  float: left;
+  margin: 0 40px;
+  width: 70%;
+}
+.main .mainInfo {
+  border: 1px solid red;
+  height: 610px;
+}
+.mainInfo .name {
+  font-size: 25px;
+  text-align: center;
+  height: 90px;
+  line-height: 90px;
+  border-bottom: 2px solid red;
+  margin: 0 60px;
+}
+.mainInfo .brief {
+  float: left;
+  padding: 0 88px 15px 88px;
+  color: red;
+  margin: 15px 20px 0 19px;
+  width: 75%;
+  border-bottom: 1px dashed red;
+}
+.mainInfo .brief p {
+  float: left;
+  width: 100%;
+  padding: 0 0 15px 0;
+}
+.mainInfo .brief p span:first-child {
+  float: left;
+  width: 50%;
+}
+.mainInfo .intro {
+  float: left;
+  padding: 20px;
+  width: 95%;
+}
+.mainInfo .intro span:first-child {
+  display: inline-block;
+  width: 100%;
+  font-size: 20px;
+  color: red;
+}
+.mainInfo .intro span:last-child {
+  display: inline-block;
+  line-height: 25px;
+  color: #666;
+  text-indent: 2rem;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 13;
+  word-break: break-all;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+}
+.mainInfo .contact {
+  padding: 20px;
+  font-size: 18px;
+}
+</style>

+ 19 - 0
src/views/hall/dock/dockInfo.vue

@@ -0,0 +1,19 @@
+<template>
+  <div id="dockInfo">
+    <p>dockInfo</p>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'dockInfo',
+  props: {},
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped></style>

+ 230 - 0
src/views/hall/hallDetail.vue

@@ -0,0 +1,230 @@
+<template>
+  <div id="liveList">
+    <div class="pz_top">
+      <div class="w_0100">
+        <div class="livetop">
+          <div class="w_1200">
+            <div class="title">
+              吉林省计算中心对接直播中心
+            </div>
+            <div class="zhuban">
+              <span>主办方:</span>
+              <span>吉林省计算中心直播大厅</span>
+            </div>
+            <div class="num">
+              <p>
+                <span>同时在线</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>特邀嘉宾</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>洽谈合作</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>达成意愿</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>展示成果</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>发布需求</span>
+                <span>1人</span>
+              </p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="pz_main">
+      <div class="w_0100">
+        <div class="w_1200">
+          <el-col :span="24" class="hallDetail">
+            <el-col :span="18" class="left">
+              <el-col :span="24" class="top">
+                图文直播
+              </el-col>
+              <el-col :span="24" class="info" style="height: 402px;overflow: auto;" id="chatSell">
+                <template v-for="(i, index) in mainTalk">
+                  <span :key="`sellTime${i.id}`">[{{ i.send_time }}] {{ i.sender_name }}</span>
+                  <span v-html="i.content" :key="`sellContent${i.id}${index}`"></span>
+                </template>
+              </el-col>
+            </el-col>
+            <el-col :span="6" class="right">
+              <el-col :span="24" class="top">
+                聊天记录
+              </el-col>
+              <el-col :span="24" class="info" style="height: 402px;overflow: auto;" id="chatBuy">
+                <template v-for="(i, index) in otherTalk">
+                  <span :key="`buyTime${i.id}${index}`">[{{ i.send_time }}] {{ i.sender_name }}</span>
+                  <span v-html="i.content" :key="`buyContent${i.id}${index}`"></span>
+                </template>
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="hallDetailInput" style="text-align:center">
+              <wang-editor v-model="content" style="height:130px;padding-bottom:120px" ref="editor"></wang-editor>
+              <el-button type="primary" @click="sendMessage">发送</el-button>
+            </el-col>
+          </el-col>
+        </div>
+      </div>
+    </div>
+    <div class="pz_down">
+      <div class="w_0100">
+        <div class="superdown">
+          <div class="w_1200">
+            <p>版权所有:吉林省技术算中心</p>
+            <p>
+              <span>技术支持:长春福瑞科技有限公司</span>
+              &nbsp;&nbsp;&nbsp;&nbsp;
+              <span>邮编:130000</span>
+              &nbsp;&nbsp;&nbsp;&nbsp;
+              <span>传真:239823982</span>
+            </p>
+            <p>
+              <span>地址:吉林省长春市朝阳区前进大街1244号</span>
+              &nbsp;&nbsp;&nbsp;&nbsp;
+              <span>电话:0134-1234567</span>
+              &nbsp;&nbsp;&nbsp;&nbsp;
+              <span>邮箱:123456@163.com</span>
+            </p>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import wangEditor from '@/components/wang-editor.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+const { mapActions: roomchat } = createNamespacedHelpers('roomchat');
+export default {
+  name: 'hallDetail',
+  props: {},
+  components: { wangEditor },
+  data: () => ({
+    content: '',
+    mainTalk: [],
+    otherTalk: [],
+    info: {},
+    buyerList: [],
+    sellerList: [],
+    sending: true,
+    text: '',
+  }),
+  created() {
+    this.search();
+  },
+  mounted() {
+    this.channel();
+  },
+  methods: {
+    ...dock(['fetch']),
+    ...roomchat(['create']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res)) {
+        let { apply, ...info } = res.data;
+        this.$set(this, `info`, info);
+        let buyList = apply.filter(f => f.buyer == '0');
+        this.$set(this, `buyerList`, buyList);
+        let sellList = apply.filter(f => f.buyer == '1');
+        this.$set(this, `sellerList`, sellList);
+      }
+    },
+    async sendMessage() {
+      this.$set(this, `sending`, false);
+      if (!this.user.uid) {
+        this.$message.error('游客不能发言,请先注册');
+        return;
+      }
+      if (this.content != '') {
+        let object = { number: this.id, sender_name: this.user.name, content: this.content };
+        if (this.user.uid) object.sender_id = this.user.uid;
+        let res = await this.create(object);
+        this.$refs.editor.setContent();
+        this.$set(this, `content`, '');
+        this.$forceUpdate();
+        this.$checkRes(res, null, res.errmsg || '发言失败');
+      } else this.$message.error('请输入信息后发送');
+      this.$set(this, `sending`, true);
+    },
+    channel() {
+      this.$stomp({
+        [`/exchange/room_chat/${this.id}`]: this.onMessage,
+      });
+    },
+    onMessage(message) {
+      // console.log('receive a message: ', message.body);
+      let body = _.get(message, 'body');
+      if (body) {
+        body = JSON.parse(body);
+        let is_seller = this.sellerList.find(f => f.user_id == body.sender_id);
+        if (is_seller) this.mainTalk.push({ id: body._id, sender_name: body.sender_name, send_time: body.send_time, content: body.content });
+        else this.otherTalk.push({ id: body._id, sender_name: body.sender_name, send_time: body.send_time, content: body.content });
+        this.$nextTick(() => {
+          document.getElementById('chatBuy').scrollTop = document.getElementById('chatBuy').scrollHeight + 150;
+          document.getElementById('chatSell').scrollTop = document.getElementById('chatSell').scrollHeight + 150;
+        });
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less">
+@import '~@/style/style.css';
+.hallDetail {
+  height: 800px;
+  border: 1px solid red;
+  margin: 0 0 20px 0;
+}
+.hallDetail .left {
+  height: 450px;
+  border: 1px solid #cccccc;
+}
+.hallDetail .left .top {
+  height: 40px;
+  line-height: 40px;
+  padding: 0px 15px;
+  font-size: 18px;
+  border-bottom: 1px dashed #ccc;
+}
+.hallDetail .right {
+  border: 1px solid #ccc;
+  height: 450px;
+}
+.hallDetail .right .top {
+  height: 40px;
+  line-height: 40px;
+  padding: 0px 15px;
+  font-size: 18px;
+  border-bottom: 1px dashed #ccc;
+}
+.hallDetailInput {
+  padding: 30px 100px 0px 100px;
+}
+.hallDetailInput .el-input {
+  width: 70%;
+}
+</style>

+ 34 - 0
src/views/hall/index.vue

@@ -0,0 +1,34 @@
+<template>
+  <div id="index">
+    <iframe width="100%" style="height:99vh;" frameborder="0" src="/static/liveIndex.html"></iframe>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'index',
+  props: {},
+  components: {},
+  data: () => {
+    return {
+      logo: require('@/assets/logo.png'),
+      height: '1000px',
+    };
+  },
+  mounted() {},
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 184 - 0
src/views/hall/liveApply.vue

@@ -0,0 +1,184 @@
+<template>
+  <div id="liveApply">
+    <div class="w_0100">
+      <div class="w_1200">
+        <div class="liveApply">
+          <el-col :span="24" class="liveApplyTop">
+            <el-col :span="3">
+              <el-image :src="logo" style="width:105px;height:105px;"></el-image>
+            </el-col>
+            <el-col :span="20">
+              <p>温馨提示:</p>
+              <p>1、为了保证您的信息能顺利通过我们的审核,请将信息的真实情况尽可能全面的发布出来!</p>
+              <p>
+                2、根据我们的长期跟踪统计,信息完整度越高,越容易获得目标客户的关注!3、信息完整度越高,将在我们的平台搜索结果排序靠前、获得推荐机会,以及享受增值服务试用机会!
+              </p>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="liveApplyInfo">
+            <el-form ref="form" :model="form" label-width="120px">
+              <!-- <el-form-item label="技术名称">
+                <el-input v-model="form.name"></el-input>
+              </el-form-item>
+              <el-form-item label="行业类别">
+                <el-select v-model="form.region" placeholder="请选择行业类别">
+                  <el-option label="类别一" value="0"></el-option>
+                  <el-option label="类别二" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="是否专利技术">
+                <el-radio-group v-model="form.resource">
+                  <el-radio label="是专利技术"></el-radio>
+                  <el-radio label="非专利技术"></el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item label="技术简介">
+                <el-input type="textarea" v-model="form.desc"></el-input>
+              </el-form-item>
+              <el-form-item label="转让方式">
+                <el-select v-model="form.business" placeholder="请选择转让方式">
+                  <el-option label="公用" value="0"></el-option>
+                  <el-option label="转用" value="1"></el-option>
+                  <el-option label="竞价" value="2"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="研发阶段">
+                <el-select v-model="form.phase" placeholder="请选择研发阶段">
+                  <el-option label="阶段成果" value="1"></el-option>
+                  <el-option label="最终成果" value="2"></el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="技术图片">
+                <upload :limit="1" :data="form.image.url" type="url" :url="'/files/image/upload'" @upload="uploadSuccess"></upload>
+              </el-form-item> -->
+              <el-form-item label="申请人身份">
+                <el-radio-group v-model="form.buyer" @change="changeuser">
+                  <el-radio label="0">买家</el-radio>
+                  <el-radio label="1">卖家</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <span v-if="this.resource == '1' || this.resource == ''">
+                <el-form-item label="选择产品">
+                  <el-select v-model="form.goodsList" placeholder="请选择选择产品">
+                    <el-option v-for="(item, index) in goodsLists" :key="index" :label="item.name" :value="item.id"> </el-option>
+                  </el-select>
+                </el-form-item>
+              </span>
+              <el-form-item label="联系人">
+                <el-input v-model="form.contact"></el-input>
+              </el-form-item>
+              <el-form-item label="联系电话">
+                <el-input v-model="form.contact_tel"></el-input>
+              </el-form-item>
+              <el-form-item label="电子邮箱">
+                <el-input v-model="form.email"></el-input>
+              </el-form-item>
+              <el-form-item label="单位名称">
+                <el-input v-model="form.company"></el-input>
+              </el-form-item>
+              <el-row style="text-align:center">
+                <el-button type="primary" @click="onSubmit">立即申请</el-button>
+                <el-button>取消</el-button>
+              </el-row>
+            </el-form>
+          </el-col>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: mapProduct } = createNamespacedHelpers('marketproduct');
+const { mapActions: apply } = createNamespacedHelpers('apply');
+import upload from '@/components/upload.vue';
+export default {
+  name: 'liveApply',
+  props: {},
+  components: {
+    // upload,
+  },
+  data: () => ({
+    form: {},
+    logo: require('@/assets/live/d10_fbb1.png'),
+    resource: '',
+    goodsLists: [],
+  }),
+  created() {
+    this.searchInfo();
+  },
+  methods: {
+    ...mapProduct({ mapProductQuery: 'query', mapProductFetch: 'fetch' }),
+    ...apply({ applyCreate: 'create' }),
+    async onSubmit() {
+      let duplicate = JSON.parse(JSON.stringify(this.form));
+      let data = { ...duplicate };
+      data.user_id = this.user.uid;
+      data.user_name = this.user.name;
+      let dock_id = this.$route.query.id;
+      data.goodsList = [this.productInfo(this.form.goodsList)];
+      const res = await this.applyCreate({ id: dock_id, ...data });
+      if (res.errcode === 0) {
+        this.$message({
+          message: '申请参加对接会成功',
+          type: 'success',
+        });
+      }
+    },
+    productInfo(id) {
+      let index = this.goodsLists.find(item => item.id == id);
+      return index;
+    },
+    async searchInfo() {
+      let res = await this.mapProductQuery({});
+      if (res.errcode === 0) {
+        this.$set(this, `goodsLists`, res.data);
+      }
+    },
+    changeuser(label) {
+      this.$set(this, 'resource', label);
+    },
+    uploadSuccess({ type, data }) {
+      this.$set(this.form, `${type}`, data.uri);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.liveApply {
+  float: left;
+  margin: 30px 0;
+}
+.liveApply .liveApplyTop {
+  float: left;
+  background: #f3faff;
+  padding: 15px;
+  border: 1px solid #ccc;
+  margin: 0 0 15px 0;
+}
+.liveApplyTop p:first-child {
+  font-size: 14px;
+  font-weight: bold;
+}
+.liveApplyTop p:nth-child(2n) {
+  font-size: 12px;
+  padding: 15px 0;
+}
+.liveApplyTop p:last-child {
+  font-size: 12px;
+}
+.liveApplyInfo {
+  padding: 0 100px;
+}
+</style>

+ 224 - 0
src/views/hall/liveList.vue

@@ -0,0 +1,224 @@
+<template>
+  <div id="liveList">
+    <div class="pz_top">
+      <div class="w_0100">
+        <div class="livetop">
+          <div class="w_1200">
+            <div class="title">
+              吉林省计算中心对接直播中心
+            </div>
+            <div class="zhuban">
+              <span>主办方:</span>
+              <span>吉林省计算中心直播大厅</span>
+            </div>
+            <div class="num">
+              <p>
+                <span>同时在线</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>特邀嘉宾</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>洽谈合作</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>达成意愿</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>展示成果</span>
+                <span>1人</span>
+              </p>
+              <p>
+                <span>发布需求</span>
+                <span>1人</span>
+              </p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="pz_main">
+      <div class="w_0100">
+        <div class="w_1200">
+          <el-row class="liveList">
+            <el-col class="liveListInfo">
+              <el-col :span="24" class="liveLisTop">
+                <span>吉林省计算中心对接直播中心</span>
+                <span>实况直播</span>
+              </el-col>
+              <el-col :span="24" class="liveLisMain">
+                <ul>
+                  <li v-for="(item, index) in liveList" :key="index" @click="turnTo(item)">
+                    <span>[{{ item.start_time }}]</span>
+                    <span class="textOver">{{ item.title }}</span>
+                    <span></span>
+                    <span class="textOver"></span>
+                  </li>
+                </ul>
+              </el-col>
+              <el-col :span="24">
+                <page :total="total" position="right"></page>
+              </el-col>
+              <el-col :span="24" class="liveLisDown">
+                <p><span>主办单位:</span><span>吉林省计算中心对接直播中心</span></p>
+                <p><span>指导单位:</span><span>吉林省计算中心对接直播中心</span></p>
+                <p><span>技术支持:</span><span>长春福瑞科技有限公司</span></p>
+              </el-col>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+    </div>
+    <div class="pz_down">
+      <div class="w_0100">
+        <div class="superdown">
+          <div class="w_1200">
+            <p>版权所有:吉林省技术算中心</p>
+            <p>
+              <span>技术支持:长春福瑞科技有限公司</span>
+              &nbsp;&nbsp;&nbsp;&nbsp;
+              <span>邮编:130000</span>
+              &nbsp;&nbsp;&nbsp;&nbsp;
+              <span>传真:239823982</span>
+            </p>
+            <p>
+              <span>地址:吉林省长春市朝阳区前进大街1244号</span>
+              &nbsp;&nbsp;&nbsp;&nbsp;
+              <span>电话:0134-1234567</span>
+              &nbsp;&nbsp;&nbsp;&nbsp;
+              <span>邮箱:123456@163.com</span>
+            </p>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import page from '@/components/pagination.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+export default {
+  name: 'liveList',
+  props: {},
+  components: { page },
+  data: () => ({
+    liveList: [],
+    total: 0,
+  }),
+  created() {
+    this.search();
+  },
+  methods: {
+    ...dock(['query']),
+    async search({ skip = 0, limit = 10 } = { skip: 0, limit: 10 }) {
+      let res = await this.query({ skip, limit, status: '1' });
+      if (this.$checkRes(res)) {
+        this.$set(this, `liveList`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    turnTo(item) {
+      this.$router.push({ path: '/live/hallDetail', query: { id: item.id } });
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less">
+@import '~@/style/style.css';
+// 直播中心
+.liveList {
+  min-height: 850px;
+  background: #8e2321;
+  float: left;
+  width: 100%;
+  margin: 0 0 20px 0;
+  position: relative;
+  top: -50px;
+}
+.liveList .liveListInfo {
+  position: absolute;
+  top: 50px;
+}
+.liveListInfo .liveLisTop {
+  width: 100%;
+  text-align: center;
+  padding: 34px 0;
+  font-size: 40px;
+  color: #fff;
+}
+.liveListInfo .liveLisTop span:first-child {
+  font-size: 40px;
+  font-weight: bold;
+}
+.liveListInfo .liveLisTop span:last-child {
+  padding: 0 0 0 15px;
+  color: yellow;
+  font-family: monospace;
+  font-weight: bold;
+}
+.liveLisMain {
+  float: left;
+  width: 100%;
+  height: 470px;
+  overflow: hidden;
+}
+.liveLisMain ul li {
+  float: left;
+  border-bottom: 1px dashed #ccc;
+  width: 98%;
+  font-size: 20px;
+  padding: 10px 0;
+  margin: 0 10px;
+  color: #fff;
+}
+.liveLisMain ul li span:first-child {
+  color: #ffff00;
+  padding: 0 15px 0 0;
+  display: inline-block;
+}
+.liveLisMain ul li span:nth-child(2) {
+  display: inline-block;
+  width: 420px;
+}
+.liveLisMain ul li span:nth-child(3) {
+  display: inline-block;
+  width: 100px;
+}
+.liveLisMain ul li span:nth-child(4) {
+  display: inline-block;
+  width: 420px;
+}
+.liveLisDown {
+  float: left;
+  width: 100%;
+  height: 260px;
+  font-size: 16px;
+  padding: 25px 0 0 0;
+}
+.liveLisDown p {
+  padding: 10px 0 5px 10px;
+}
+.liveLisDown p span:first-child {
+  color: #fc3;
+  letter-spacing: 15px;
+}
+.liveLisDown p span:last-child {
+  color: #fff;
+}
+</style>

+ 117 - 0
src/views/hall/parts/chat.vue

@@ -0,0 +1,117 @@
+<template>
+  <div id="chat">
+    <p class="luyanTop">
+      <span>公共聊天</span>
+      <!-- <span class="icon"><i class="iconfont icon-xianhua" style="color:red"></i>送鲜花</span>
+      <span class="icon"><i class="iconfont icon-xin" style="color:red;"></i>发贺信</span> -->
+    </p>
+    <div class="chatList">
+      <ul>
+        <li v-for="(i, index) in list" :key="index">
+          <p>
+            <span>[{{ i.send_time | getTime }}]</span><span style="font-weight: bold;">{{ i.sender_name }}:</span>
+            <span> {{ i.content }}</span>
+          </p>
+        </li>
+      </ul>
+      <div class="input">
+        <input v-model="text" />
+        <button type="button" @click="send">发送</button>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import _ from 'lodash';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: chat } = createNamespacedHelpers('chat');
+var moment = require('moment');
+export default {
+  name: 'chat',
+  props: {},
+  components: {},
+  data: () => {
+    return {
+      list: [],
+      text: '',
+    };
+  },
+  created() {
+    //回车事件
+    // this.enterListen();
+    this.search();
+  },
+  mounted() {
+    this.channel();
+  },
+  methods: {
+    ...chat(['query', 'create']),
+    async search() {
+      const res = await this.query({ skip: 0, limit: 10 });
+      if (this.$checkRes(res)) this.$set(this, `list`, _.reverse(res.data));
+    },
+    async send() {
+      if (!this.user.uid) {
+        this.$message.error('游客不能发言,请先注册');
+        return;
+      }
+      if (this.text != '') {
+        let object = { sender_name: this.user.name, content: this.text };
+        if (this.user.id) object.sender_id = this.user.id;
+        //TODO接口
+        let res = await this.create(object);
+        this.$checkRes(res, null, res.errmsg || '发言失败');
+      } else this.$message.error('请输入信息后发送');
+    },
+    channel() {
+      this.$stomp({
+        [`/exchange/public_chat`]: this.onMessage,
+      });
+    },
+    onMessage(message) {
+      // console.log('receive a message: ', message.body);
+      let body = _.get(message, 'body');
+      if (body) {
+        body = JSON.parse(body);
+        this.list.push(body);
+        this.text = '';
+      }
+      // const { content, contenttype, sendid, sendname, icon, groupid, sendtime, type } = message.headers;
+      // let object = { content, contenttype, sendid, sendname, icon, groupid, sendtime, type };
+      // this.list.push(object);
+    },
+    enterListen() {
+      var lett = this;
+      document.onkeydown = function(e) {
+        var key = window.event.keyCode;
+        if (key == 13) {
+          lett.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:ss');
+      else time = moment(date).format('YYYY-MM-DD HH:mm:ss');
+      return time;
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>