guhongwei %!s(int64=4) %!d(string=hai) anos
pai
achega
b41c659b7e

BIN=BIN
src/assets/kjzx.jpg


+ 9 - 0
src/router/index.js

@@ -100,6 +100,7 @@ const live = [
     name: 'home_index',
     component: () => import('../views/home.vue'),
   },
+  // 人才
   {
     path: '/personalhall/index',
     name: 'personalhall',
@@ -113,6 +114,14 @@ const live = [
     meta: { title: '专家培训在线展会' },
     component: () => import('../views/exporthall/index.vue'),
   },
+  // 科技在线频道
+  {
+    path: '/kjpdhall/index',
+    name: 'kjpdhall',
+    meta: { title: '科技在线频道' },
+    component: () => import('../views/kjpdhall/index.vue'),
+  },
+
   // 在线展会
   {
     path: '/hall/directBefore',

+ 2 - 0
src/store/index.js

@@ -24,6 +24,7 @@ import journnews from './market/journnews';
 import dock from './live/dock';
 import apply from './live/apply';
 import market from './market/market';
+import channel from './live/channel';
 // 专家
 import expertsuser from './market/exportuser';
 // 产品
@@ -74,6 +75,7 @@ export default new Vuex.Store({
     dock,
     apply,
     market,
+    channel,
     // 专家
     expertsuser,
     // 产品

+ 42 - 0
src/store/live/channel.js

@@ -0,0 +1,42 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  channelInfo: `/api/live/channel`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    const res = await this.$axios.$get(`${api.channelInfo}`, {
+      skip,
+      limit,
+      ...info,
+    });
+    return res;
+  },
+  async create({ commit }, payload) {
+    const res = await this.$axios.$post(`${api.channelInfo}`, payload);
+    return res;
+  },
+  async fetch({ commit }, payload) {
+    const res = await this.$axios.$get(`${api.channelInfo}/${payload}`);
+    return res;
+  },
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.channelInfo}/update/${id}`, data);
+    return res;
+  },
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.channelInfo}/${payload}`);
+    return res;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 6 - 0
src/views/hallList/index.vue

@@ -13,6 +13,9 @@
             <el-tab-pane label="专家培训在线">
               <exports :province="province" :place="place"></exports>
             </el-tab-pane>
+            <el-tab-pane label="科技在线频道">
+              <kjpd :province="province" :place="place"></kjpd>
+            </el-tab-pane>
           </el-tabs>
         </div>
       </el-col>
@@ -24,6 +27,8 @@
 import product from './parts/product.vue';
 import personal from './parts/personal.vue';
 import exports from './parts/export.vue';
+// 科技频道
+import kjpd from './parts/kjpd.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
 const { mapActions: place } = createNamespacedHelpers('place');
 export default {
@@ -33,6 +38,7 @@ export default {
     product,
     personal,
     exports,
+    kjpd,
   },
   data: function() {
     return {

+ 125 - 0
src/views/hallList/parts/kjpd.vue

@@ -0,0 +1,125 @@
+<template>
+  <div id="personallist">
+    <el-row>
+      <el-col :span="24" class="productlist">
+        <el-col :span="8" class="list" v-for="(item, index) in list" :key="index">
+          <el-image :src="hall" style="width:100%;height:200px;"></el-image>
+          <el-col :span="24" class="other">
+            <p class="textOver">{{ item.title }}</p>
+            <p class="textOver">
+              <span><i class="el-icon-location-outline"></i>{{ getprovince(item.province) }}-{{ getplace(item.place) }}</span>
+              <!-- <span><i class="el-icon-time"></i>{{ item.start_time }}-{{ item.end_time }}</span> -->
+            </p>
+            <p>
+              <el-button type="warning" size="mini" @click="linkBtn(item)">进入频道</el-button>
+            </p>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import page from '@/components/pagination.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: dock } = createNamespacedHelpers('dock');
+const { mapActions: channel } = createNamespacedHelpers('channel');
+export default {
+  name: 'personallist',
+  props: {
+    province: { type: Array, default: () => [] },
+    // 市
+    place: { type: Array, default: () => [] },
+  },
+  components: {},
+  data: () => {
+    return {
+      hall: require('@a/kjzx.jpg'),
+      list: [],
+    };
+  },
+  async created() {
+    await this.search();
+  },
+  methods: {
+    ...dock({ livefetch: 'fetch', livelist: 'query', livecreate: 'create', liveupdate: 'update' }),
+    ...channel(['query']),
+    // 过滤省
+    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;
+    },
+    // 进入对接会
+    async linkBtn(item) {
+      if (this.user.uid || this.user.suid) {
+        if (
+          this.user.role == '2' ||
+          this.user.role == '3' ||
+          this.user.role == '4' ||
+          this.user.role == '5' ||
+          this.user.role == '6' ||
+          this.user.role == '7' ||
+          this.user.role == '8'
+        ) {
+          this.$router.push({ path: '/kjpdhall/index', query: { id: item.id } });
+        } else {
+          this.$router.push({ path: '/webLogin' });
+        }
+      } else {
+        this.$router.push({ path: '/webLogin' });
+      }
+    },
+    // 查询
+    async search() {
+      let res = await this.query();
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+      }
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.productlist {
+  .list {
+    position: relative;
+    width: 32%;
+    height: 310px;
+    border: 1px solid #ccc;
+    margin: 0 15px 10px 0;
+    .other {
+      p:nth-child(1) {
+        padding: 0 10px;
+        font-size: 16px;
+        font-weight: bold;
+      }
+      p:nth-child(2) {
+        padding: 5px;
+        span:nth-child(2) {
+          float: right;
+        }
+      }
+      p:nth-child(3) {
+        position: absolute;
+        width: 100%;
+        bottom: 5px;
+        text-align: center;
+      }
+    }
+  }
+  .list:nth-child(3n) {
+    width: 33%;
+    margin: 0 0 10px 0;
+  }
+}
+</style>

+ 32 - 0
src/views/kjpdhall/index.vue

@@ -0,0 +1,32 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24">
+        <p>index</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>

+ 303 - 0
src/views/superAdminCenter/channel/index.vue

@@ -0,0 +1,303 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="style">
+        <span v-if="display == 'list'">
+          <el-col :span="24" class="btn">
+            <el-button type="primary" size="mini" @click="display = 'detail'">添加信息</el-button>
+          </el-col>
+          <el-col :span="24" class="list">
+            <data-table
+              :fields="fields"
+              :data="list"
+              :total="total"
+              @query="search"
+              :opera="opera"
+              @edit="toEdit"
+              @delete="toDelete"
+              :toFormat="toFormat"
+            ></data-table>
+          </el-col>
+        </span>
+        <span v-else>
+          <el-col :span="24" class="btn">
+            <el-button type="primary" size="mini" @click="back()">返回</el-button>
+          </el-col>
+          <el-col :span="24" class="detail">
+            <el-form :model="form" :rules="rules" ref="form" label-width="80px">
+              <el-form-item label="标题" prop="name">
+                <el-input v-model="form.title" placeholder="请输入标题"></el-input>
+              </el-form-item>
+              <el-form-item label="省份">
+                <el-select v-model="form.province" placeholder="请选择省份" @change="changeshenge">
+                  <el-option v-for="item in option" :key="item.code" :label="item.name" :value="item.code"> </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="市">
+                <el-select v-model="form.place" placeholder="请选择市">
+                  <el-option v-for="item in options" :key="item.code" :label="item.name" :value="item.code"> </el-option>
+                </el-select>
+              </el-form-item>
+              <el-form-item label="主办方">
+                <el-input v-model="form.sponsor" placeholder="请输入主办方"> </el-input>
+              </el-form-item>
+              <el-form-item label="承办方">
+                <el-input v-model="form.organizer" placeholder="请输入承办方"> </el-input>
+              </el-form-item>
+              <el-form-item label="简介">
+                <el-input type="textarea" v-model="form.desc" placeholder="请输入简介"></el-input>
+              </el-form-item>
+              <el-form-item label="图片">
+                <upload :limit="1" :data="form.image_path" type="image_path" :url="'/files/imgpath/upload'" @upload="uploadSuccess"></upload>
+              </el-form-item>
+              <el-form-item label="视频列表">
+                <el-col :span="24">
+                  <el-button type="primary" size="mini" @click="dialog = true">添加信息</el-button>
+                </el-col>
+                <el-col :span="24" class="videodata">
+                  <el-table :data="form.videodata" style="width: 100%" border>
+                    <el-table-column prop="start_time" label="开始时间" align="center"> </el-table-column>
+                    <el-table-column prop="end_time" label="结束时间" align="center"> </el-table-column>
+                    <el-table-column prop="url" label="路径" align="center"> </el-table-column>
+                    <el-table-column label="操作" align="center">
+                      <template v-slot="scoped">
+                        <el-button type="text" @click="delAttend(scoped.$index, scoped.row)" size="small">删除</el-button>
+                      </template>
+                    </el-table-column>
+                  </el-table>
+                </el-col>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" @click="submitForm('form')">信息保存</el-button>
+              </el-form-item>
+            </el-form>
+          </el-col>
+        </span>
+      </el-col>
+    </el-row>
+    <el-dialog title="添加信息" :visible.sync="dialog" width="40%" :before-close="dialogclose">
+      <el-form ref="videoform" :model="videoform" label-width="80px" class="videoform">
+        <el-form-item label="开始时间">
+          <el-date-picker v-model="videoform.start_time" type="datetime" placeholder="请选择开始时间" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="结束时间">
+          <el-date-picker v-model="videoform.end_time" type="datetime" placeholder="请选择开始时间" format="yyyy-MM-dd HH:mm" value-format="yyyy-MM-dd HH:mm">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="路径">
+          <uploaddock
+            :limit="1"
+            :data="videoform.url"
+            type="url"
+            listType=""
+            :url="'/files/url/upload'"
+            @upload="videosuccess"
+            @delete="videodelete"
+          ></uploaddock>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="submitVideo">保存</el-button>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import upload from '@/components/uploadone.vue';
+import uploaddock from '@/components/uploaddock.vue';
+import dataTable from '@/components/data-table.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: place } = createNamespacedHelpers('place');
+const { mapActions: channel } = createNamespacedHelpers('channel');
+
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'index',
+  props: {},
+  components: {
+    dataTable,
+    upload,
+    uploaddock,
+  },
+  data: function() {
+    return {
+      display: 'list',
+      opera: [
+        {
+          label: '编辑',
+          icon: 'el-icon-edit',
+          method: 'edit',
+        },
+        {
+          label: '删除',
+          icon: 'el-icon-delete',
+          method: 'delete',
+        },
+      ],
+      fields: [
+        { label: '标题', prop: 'title' },
+        { label: '省份', prop: 'province', format: true },
+        { label: '市区', prop: 'place', format: true },
+        { label: '主办方', prop: 'sponsor' },
+        { label: '承办方', prop: 'organizer' },
+      ],
+      list: [],
+      total: 0,
+      // 添加信息
+      form: {
+        videodata: [],
+      },
+      rules: {
+        name: [{ required: false, message: '请输入标题', trigger: 'blur' }],
+      },
+      // 地址
+      option: [],
+      options: [],
+      // 视频信息
+      dialog: false,
+      videoform: {},
+    };
+  },
+  async created() {
+    await this.searchplace();
+    await this.search();
+  },
+  methods: {
+    ...channel(['query', 'delete', 'update', 'create']),
+    ...place({ palcequery: 'query', palcefetch: 'fetch' }),
+    // 查询
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      if (this.user.role != '1') info.user_id = this.user.uid;
+      let res = await this.query({ skip, limit, user_id: this.user.uid });
+      this.$set(this, `list`, res.data);
+      this.$set(this, `total`, res.total);
+    },
+    // 提交
+    submitForm(formName) {
+      this.$refs[formName].validate(async valid => {
+        if (valid) {
+          let data = this.form;
+          if (data.id) {
+            let res = await this.update(data);
+            if (this.$checkRes(res)) {
+              this.$checkRes(res, '修改成功', '修改失败');
+              this.back();
+            }
+          } else {
+            data.user_id = this.user.uid;
+            let res = await this.create(data);
+            if (this.$checkRes(res)) {
+              this.$checkRes(res, '创建成功', '创建失败');
+              this.back();
+            }
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 修改
+    toEdit({ data }) {
+      this.$set(this, `form`, data);
+      this.display = 'detail';
+    },
+    // 返回
+    back() {
+      this.form = {};
+      this.display = 'list';
+      this.search();
+    },
+    // 删除
+    toDelete({ data }) {
+      this.$confirm('您确定要删除此信息吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(async () => {
+          let res = await this.delete(data.id);
+          if (this.$checkRes(res)) {
+            this.$message({
+              message: '删除信息成功',
+              type: 'success',
+            });
+            this.search();
+          }
+        })
+        .catch(() => {});
+    },
+    // 查询地址
+    async searchplace() {
+      let level = 1;
+      let res = await this.palcequery({ level });
+      this.$set(this, `option`, res.data);
+      level = 2;
+      res = await this.palcequery({ level });
+      this.$set(this, `options`, res.data);
+    },
+    // 选择市区
+    async changeshenge(value) {
+      let level = 2;
+      let parent = value;
+      let res = await this.palcequery({ level, parent });
+      this.$set(this, `options`, res.data);
+    },
+    // 图片
+    uploadSuccess({ type, data }) {
+      this.$set(this.form, `${type}`, data.uri);
+    },
+    // 过滤科目名称
+    toFormat({ model, value }) {
+      if (model == 'province') {
+        const res = this.option.find(f => f.code == value);
+        if (res) return res.name;
+      } else if (model == 'place') {
+        const res = this.options.find(f => f.code == value);
+        if (res) return res.name;
+      }
+    },
+    // 视频信息
+    submitVideo() {
+      let data = this.videoform;
+      this.form.videodata.push(data);
+      this.dialogclose();
+    },
+    // 关闭
+    dialogclose() {
+      this.videoform = {};
+      this.dialog = false;
+    },
+    videosuccess({ type, data }) {
+      this.$set(this.videoform, `${type}`, data.uri);
+    },
+    videodelete(index) {
+      this.$set(this.videoform, `url`, null);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+  watch: {},
+};
+</script>
+
+<style lang="less" scoped>
+.style {
+  padding: 0 18px 0 0;
+  .btn {
+    text-align: right;
+    padding: 0 0 10px 0;
+  }
+}
+/deep/.videodata .el-table th {
+  padding: 5px 0;
+}
+/deep/.videodata .el-table td {
+  padding: 5px 0;
+}
+</style>

+ 6 - 2
src/views/superAdminCenter/index.vue

@@ -49,6 +49,7 @@ import notice from './notice/index.vue';
 import productSolicit from './productSolicit/index.vue';
 import updatepwd from './xiugai/xiugai.vue';
 import Journ from './Journ/index.vue';
+import channel from './channel/index.vue';
 import heads from '@/layout/userCenter/heads.vue';
 import foot from '@/layout/live/foot.vue';
 
@@ -80,6 +81,7 @@ export default {
     top,
     updatepwd,
     Journ,
+    channel,
   },
   data: function() {
     return {
@@ -122,12 +124,14 @@ export default {
 }
 .mainMenu {
   width: 20%;
-  min-height: 834px;
+  height: 834px;
+  overflow-y: auto;
   background-color: #fff;
 }
 .mainMess {
   float: right;
-  min-height: 834px;
+  height: 834px;
+  overflow-y: auto;
   background-color: #fff;
 }
 </style>