wxy il y a 4 ans
Parent
commit
b25677bc12

+ 20 - 0
src/components/common/Sidebar.vue

@@ -84,6 +84,26 @@ export default {
           index: 'productIndex',
           title: '产品测试',
         },
+        {
+          icon: 'el-icon-s-home',
+          index: 'caseapplyIndex',
+          title: '案例应用',
+        },
+        {
+          icon: 'el-icon-s-home',
+          index: 'hotspotIndex',
+          title: '热点资讯',
+        },
+        {
+          icon: 'el-icon-s-home',
+          index: 'videoIndex',
+          title: '宣传视频',
+        },
+        {
+          icon: 'el-icon-s-home',
+          index: 'linksIndex',
+          title: '友情链接',
+        },
       ],
     };
   },

+ 40 - 0
src/router/index.js

@@ -61,6 +61,46 @@ export default new Router({
           component: () => import('../views/product/productDetail.vue'),
           meta: { title: '产品信息' },
         },
+        {
+          path: '/caseapplyIndex',
+          component: () => import('../views/caseapply/caseapplyIndex.vue'),
+          meta: { title: '案例应用' },
+        },
+        {
+          path: '/caseapplyDetail',
+          component: () => import('../views/caseapply/caseapplyDetail.vue'),
+          meta: { title: '案例信息' },
+        },
+        {
+          path: '/hotspotIndex',
+          component: () => import('../views/hotspot/hotspotIndex.vue'),
+          meta: { title: '热点资讯' },
+        },
+        {
+          path: '/hotspotDetail',
+          component: () => import('../views/hotspot/hotspotDetail.vue'),
+          meta: { title: '热点资讯信息' },
+        },
+        {
+          path: '/videoIndex',
+          component: () => import('../views/video/videoIndex.vue'),
+          meta: { title: '宣传视频' },
+        },
+        {
+          path: '/videoDetail',
+          component: () => import('../views/video/videoDetail.vue'),
+          meta: { title: '宣传视频信息' },
+        },
+        {
+          path: '/linksIndex',
+          component: () => import('../views/links/linksIndex.vue'),
+          meta: { title: '友情链接' },
+        },
+        {
+          path: '/linksDetail',
+          component: () => import('../views/links/linksDetail.vue'),
+          meta: { title: '友情链接信息' },
+        },
       ],
     },
     {

+ 54 - 0
src/store/caseapply.js

@@ -0,0 +1,54 @@
+//第一步
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  //接口地址
+  caseapply: `/api/huanqi/caseapply`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  //查询列表 skip:第一页,limit:第一页显示的数据,info:其余查询参数
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    //连接接口。。。。
+    const res = await this.$axios.$get(`${api.caseapply}`, {
+      skip,
+      limit,
+      ...info,
+    });
+    //把数据集合res返回
+    return res;
+  },
+  //创建数据  payload是添加form表单中的数据集合  创建数据的时候需要拿到form表单里面的数据
+  async create({ commit }, payload) {
+    //通过$axios提交post请求????
+    const res = await this.$axios.$post(`${api.caseapply}`, payload);
+    return res;
+  },
+  //查询详情,payload:参数位,一般传当前数据id
+  async fetch({ commit }, payload) {
+    //有/一般都是路径
+    const res = await this.$axios.$get(`${api.caseapply}/${payload}`);
+    return res;
+  },
+  //修改:id: 当前数据id, data: 当前修改数据的新form表单
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.caseapply}/update/${id}`, data);
+    return res;
+  },
+  //删除:payload:参数位,一般传当前数据id
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.caseapply}/${payload}`);
+    return res;
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 54 - 0
src/store/hotspot.js

@@ -0,0 +1,54 @@
+//第一步
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  //接口地址
+  hotspotInfo: `/api/huanqi/hotspot`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  //查询列表 skip:第一页,limit:第一页显示的数据,info:其余查询参数
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    //连接接口。。。。
+    const res = await this.$axios.$get(`${api.hotspotInfo}`, {
+      skip,
+      limit,
+      ...info,
+    });
+    //把数据集合res返回
+    return res;
+  },
+  //创建数据  payload是添加form表单中的数据集合  创建数据的时候需要拿到form表单里面的数据
+  async create({ commit }, payload) {
+    //通过$axios提交post请求????
+    const res = await this.$axios.$post(`${api.hotspotInfo}`, payload);
+    return res;
+  },
+  //查询详情,payload:参数位,一般传当前数据id
+  async fetch({ commit }, payload) {
+    //有/一般都是路径
+    const res = await this.$axios.$get(`${api.hotspotInfo}/${payload}`);
+    return res;
+  },
+  //修改:id: 当前数据id, data: 当前修改数据的新form表单
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.hotspotInfo}/update/${id}`, data);
+    return res;
+  },
+  //删除:payload:参数位,一般传当前数据id
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.hotspotInfo}/${payload}`);
+    return res;
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 8 - 0
src/store/index.js

@@ -7,6 +7,10 @@ import login from './login';
 import lunbo from './lunbo';
 import company from './company';
 import product from './product';
+import caseapply from './caseapply';
+import hotspot from './hotspot';
+import video from './video';
+import links from './links';
 
 Vue.use(Vuex);
 
@@ -20,5 +24,9 @@ export default new Vuex.Store({
     lunbo,
     company,
     product,
+    caseapply,
+    hotspot,
+    video,
+    links,
   },
 });

+ 54 - 0
src/store/links.js

@@ -0,0 +1,54 @@
+//第一步
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  //接口地址
+  linksInfo: `/api/huanqi/links`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  //查询列表 skip:第一页,limit:第一页显示的数据,info:其余查询参数
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    //连接接口。。。。
+    const res = await this.$axios.$get(`${api.linksInfo}`, {
+      skip,
+      limit,
+      ...info,
+    });
+    //把数据集合res返回
+    return res;
+  },
+  //创建数据  payload是添加form表单中的数据集合  创建数据的时候需要拿到form表单里面的数据
+  async create({ commit }, payload) {
+    //通过$axios提交post请求????
+    const res = await this.$axios.$post(`${api.linksInfo}`, payload);
+    return res;
+  },
+  //查询详情,payload:参数位,一般传当前数据id
+  async fetch({ commit }, payload) {
+    //有/一般都是路径
+    const res = await this.$axios.$get(`${api.linksInfo}/${payload}`);
+    return res;
+  },
+  //修改:id: 当前数据id, data: 当前修改数据的新form表单
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.linksInfo}/update/${id}`, data);
+    return res;
+  },
+  //删除:payload:参数位,一般传当前数据id
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.linksInfo}/${payload}`);
+    return res;
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 54 - 0
src/store/video.js

@@ -0,0 +1,54 @@
+//第一步
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+Vue.use(Vuex);
+const api = {
+  //接口地址
+  videoInfo: `/api/huanqi/video`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  //查询列表 skip:第一页,limit:第一页显示的数据,info:其余查询参数
+  async query({ commit }, { skip = 0, limit, ...info } = {}) {
+    //连接接口。。。。
+    const res = await this.$axios.$get(`${api.videoInfo}`, {
+      skip,
+      limit,
+      ...info,
+    });
+    //把数据集合res返回
+    return res;
+  },
+  //创建数据  payload是添加form表单中的数据集合  创建数据的时候需要拿到form表单里面的数据
+  async create({ commit }, payload) {
+    //通过$axios提交post请求????
+    const res = await this.$axios.$post(`${api.videoInfo}`, payload);
+    return res;
+  },
+  //查询详情,payload:参数位,一般传当前数据id
+  async fetch({ commit }, payload) {
+    //有/一般都是路径
+    const res = await this.$axios.$get(`${api.videoInfo}/${payload}`);
+    return res;
+  },
+  //修改:id: 当前数据id, data: 当前修改数据的新form表单
+  async update({ commit }, { id, ...data }) {
+    const res = await this.$axios.$post(`${api.videoInfo}/update/${id}`, data);
+    return res;
+  },
+  //删除:payload:参数位,一般传当前数据id
+  async delete({ commit }, payload) {
+    const res = await this.$axios.$delete(`${api.videoInfo}/${payload}`);
+    return res;
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 159 - 0
src/views/caseapply/caseapplyDetail.vue

@@ -0,0 +1,159 @@
+<template>
+  <div id="caseapplyDetail">
+    <el-row>
+      <el-col :span="24">
+        <breadcrumb :breadcrumbTitle="this.$route.meta.title"></breadcrumb>
+        <el-col :span="24" class="container">
+          <el-col :span="24" style="margin:0 0 15px 0;text-align:right;">
+            <el-button type="primary" size="mini" @click="back()">返回</el-button>
+          </el-col>
+          <el-col :span="24">
+            <el-form :model="form" :rules="rules" ref="form" label-width="100px" class="demo-ruleForm">
+              <el-form-item label="名称" prop="name">
+                <el-input v-model="form.name"></el-input>
+              </el-form-item>
+              <el-form-item label="地区" prop="address">
+                <el-input v-model="form.address"></el-input>
+              </el-form-item>
+              <el-form-item label="面积" prop="area">
+                <el-input v-model="form.area"></el-input>
+              </el-form-item>
+              <el-form-item label="日期">
+                <el-date-picker v-model="form.create_time" type="date" placeholder="选择日期"> </el-date-picker>
+              </el-form-item>
+              <el-form-item label="内容" prop="content">
+                <el-input v-model="form.content"></el-input>
+              </el-form-item>
+              <el-form-item label="图片">
+                <upload
+                  :limit="6"
+                  :data="form.image"
+                  :uploadBtn="true"
+                  type="image"
+                  :url="`/files/image/upload`"
+                  @upload="uploadSuccess"
+                  @delete="uploadDelete"
+                ></upload>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" @click="submitForm('form')">确定</el-button>
+              </el-form-item>
+            </el-form>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import _ from 'loadsh';
+import upload from '@/components/frame/upload.vue';
+import breadcrumb from '@c/common/breadcrumb.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: caseapply } = createNamespacedHelpers('caseapply');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'caseapplyDetail',
+  props: {},
+  components: {
+    upload,
+    breadcrumb,
+  },
+  data: function() {
+    return {
+      form: {},
+      rules: {
+        name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        address: [{ required: true, message: '请输入地区', trigger: 'blur' }],
+        area: [{ required: true, message: '请输入面积', trigger: 'blur' }],
+        create_time: [{ required: true, message: '请选择日期', trigger: 'change' }],
+        content: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+      },
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...caseapply(['query', 'fetch', 'create', 'update', 'delete']),
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    submitForm(formName) {
+      // element表单验证
+      this.$refs[formName].validate(async valid => {
+        if (valid) {
+          let data = this.form;
+          // console.log(data);
+          if (data.id) {
+            let res = await this.update(data);
+            if (this.$checkRes(res)) {
+              this.$message({
+                message: '修改成功',
+                type: 'success',
+              });
+              this.back();
+            }
+          } else {
+            let res = await this.create(data);
+            if (this.$checkRes(res)) {
+              this.$message({
+                message: '创建成功',
+                type: 'success',
+              });
+              this.back();
+            }
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    back() {
+      this.$set(this, `form`, {});
+      this.$router.push({ path: '/caseapplyIndex' });
+    },
+    // 图片
+    uploadSuccess({ type, data }) {
+      let arr = _.get(this.form, type);
+      if (_.isArray(arr)) {
+        let datas = { name: data.name, url: data.uri };
+        this.form[type].push({ name: data.name, url: data.uri });
+      } else {
+        let newArr = [{ name: data.name, url: data.uri }];
+        this.$set(this.form, `${type}`, newArr);
+      }
+    },
+    // 删除图片
+    uploadDelete(index) {
+      this.form.image.splice(index, 1);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {
+    id: {
+      deep: true,
+      immediate: true,
+      handler(val) {
+        this.search();
+      },
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 111 - 0
src/views/caseapply/caseapplyIndex.vue

@@ -0,0 +1,111 @@
+<template>
+  <div id="caseapplyIndex">
+    <el-row>
+      <el-col :span="24">
+        <breadcrumb :breadcrumbTitle="this.$route.meta.title"></breadcrumb>
+        <el-col :span="24" class="container">
+          <el-col :span="24" style="margin:15px 0;text-align:right">
+            <el-button type="primary" size="mini" @click="increase()">添加</el-button>
+          </el-col>
+          <el-col :span="24">
+            <el-table :data="list" style="width: 100%" border>
+              <el-table-column prop="name" label="名称" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="address" label="地区" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="area" label="面积" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="create_time" label="日期" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="content" label="内容" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column fixed="right" label="操作" align="center" width="145px">
+                <template slot-scope="scope">
+                  <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
+                  <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
+          <el-col :span="24" class="page">
+            <el-pagination
+              background
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+              :page-size="pageSize"
+            >
+            </el-pagination>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import breadcrumb from '@c/common/breadcrumb.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: caseapply } = createNamespacedHelpers('caseapply');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'caseapplyIndex',
+  props: {},
+  components: {
+    breadcrumb,
+  },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      currentPage: 0,
+      pageSize: 10,
+      skip: 0,
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...caseapply(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      skip = this.skip;
+      let res = await this.query({ skip, limit, ...info });
+      // console.log(res);
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    async handleDelete(data) {
+      let res = await this.delete(data.id);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '删除成功',
+          type: 'success',
+        });
+        this.search();
+      }
+    },
+    increase() {
+      this.$router.push({ path: '/caseapplyDetail' });
+    },
+    handleEdit(data) {
+      this.$router.push({ path: '/caseapplyDetail', query: { id: data.id } });
+    },
+    handleCurrentChange(currentPage) {
+      this.$set(this, `skip`, (currentPage - 1) * this.pageSize);
+      this.search();
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+  text-align: center;
+  margin: 15px 0;
+}
+</style>

+ 19 - 19
src/views/company/index.vue

@@ -7,23 +7,25 @@
           <el-col :span="24" style="margin:15px 0;text-align:right">
             <el-button type="primary" size="mini" @click="increase()">添加</el-button>
           </el-col>
-          <el-table :data="list" style="width: 100%" border>
-            <el-table-column prop="company" label="企业名称" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="engCompany" label="英文名称" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="brief" label="简介" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="mobile" label="统一热线" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="address" label="地址" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="weixin" label="微信" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="gzh" label="公众号" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="weibo" label="微博" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="beian" label="备案" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column fixed="right" label="操作" align="center" width="145px">
-              <template slot-scope="scope">
-                <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
-                <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
-              </template>
-            </el-table-column>
-          </el-table>
+          <el-col :span="24">
+            <el-table :data="list" style="width: 100%" border>
+              <el-table-column prop="company" label="企业名称" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="engCompany" label="英文名称" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="brief" label="简介" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="mobile" label="统一热线" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="address" label="地址" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="weixin" label="微信" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="gzh" label="公众号" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="weibo" label="微博" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="beian" label="备案" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column fixed="right" label="操作" align="center" width="145px">
+                <template slot-scope="scope">
+                  <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
+                  <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
           <el-col :span="24" class="page">
             <el-pagination
               background
@@ -72,7 +74,6 @@ export default {
     async search({ skip = 0, limit = 10, ...info } = {}) {
       skip = this.skip;
       let res = await this.query({ skip, limit, ...info });
-      console.log(res);
       if (this.$checkRes(res)) {
         this.$set(this, `list`, res.data);
         this.$set(this, `total`, res.total);
@@ -92,7 +93,6 @@ export default {
       this.$router.push({ path: '/indexDetail' });
     },
     handleEdit(data) {
-      console.log(data);
       this.$router.push({ path: '/indexDetail', query: { id: data.id } });
     },
     handleCurrentChange(currentPage) {

+ 142 - 0
src/views/hotspot/hotspotDetail.vue

@@ -0,0 +1,142 @@
+<template>
+  <div id="hotspotDetail">
+    <el-row>
+      <el-col :span="24">
+        <breadcrumb :breadcrumbTitle="this.$route.meta.title"></breadcrumb>
+      </el-col>
+      <el-col :span="24" class="container">
+        <el-col :span="24" style="margin:15px 0;text-align:right">
+          <el-button type="primary" size="mini" @click="back()">返回</el-button>
+        </el-col>
+        <el-col :span="24">
+          <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+            <el-form-item label="名称" prop="name">
+              <el-input v-model="form.name"></el-input>
+            </el-form-item>
+            <el-form-item label="类型">
+              <el-select v-model="form.type" placeholder="请选择类型">
+                <el-option label="0" value="公司新闻"></el-option>
+                <el-option label="1" value="行业新闻"></el-option>
+                <el-option label="2" value="展会资讯"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="简介" prop="brief">
+              <el-input type="textarea" v-model="form.brief"></el-input>
+            </el-form-item>
+            <el-form-item label="内容" prop="content">
+              <el-input type="textarea" v-model="form.content"></el-input>
+            </el-form-item>
+            <el-form-item label="发布时间" prop="create_time">
+              <el-date-picker type="date" placeholder="选择日期" v-model="form.create_time" value-format="yyyy-MM-dd" format="yyyy-MM-dd"></el-date-picker>
+            </el-form-item>
+            <el-form-item label="图片">
+              <upload :limit="1" :data="form.filepath" type="filepath" :url="'/files/filepath/upload'" @upload="uploadSuccess"></upload>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="submitForm('form')">保存</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import upload from '@/components/frame/uploadone.vue';
+import breadcrumb from '@c/common/breadcrumb.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: hotspot } = createNamespacedHelpers('hotspot');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'hotspotDetail',
+  props: {},
+  components: {
+    upload,
+    breadcrumb,
+  },
+  data: function() {
+    return {
+      form: {},
+      rules: {
+        name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        brief: [{ required: true, message: '请输简介', trigger: 'blur' }],
+        content: [{ required: true, message: '请输入内容', trigger: 'blur' }],
+        create_time: [{ required: true, message: '请选择日期', trigger: 'change' }],
+      },
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...hotspot(['query', 'fetch', 'create', 'update', 'delete']),
+    //查询列表
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    back() {
+      this.$set(this, `form`, {});
+      this.$router.push({ path: '/hotspotIndex' });
+    },
+    //保存数据
+    submitForm(formName) {
+      // element表单验证
+      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.$message({
+                message: '修改成功',
+                type: 'success',
+              });
+              this.back();
+            }
+          } else {
+            let res = await this.create(data);
+            if (this.$checkRes(res)) {
+              this.$message({
+                message: '创建成功',
+                type: 'success',
+              });
+              this.back();
+            }
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    uploadSuccess({ type, data }) {
+      this.$set(this.form, `${type}`, data.uri);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {
+    id: {
+      deep: true,
+      immediate: true,
+      handler(val) {
+        this.search();
+      },
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 117 - 0
src/views/hotspot/hotspotIndex.vue

@@ -0,0 +1,117 @@
+<template>
+  <div id="hotspotIndex">
+    <el-row>
+      <el-col :span="24">
+        <el-col :span="24">
+          <breadcrumb :breadcrumbTitle="this.$route.meta.title"></breadcrumb>
+        </el-col>
+        <el-col :span="24" class="container">
+          <el-col :span="24" style="margin:15px 0;text-align:right">
+            <el-button type="primary" size="mini" @click="add()">添加</el-button>
+          </el-col>
+          <el-col :span="24">
+            <el-table :data="list" style="width: 100%" border>
+              <el-table-column prop="name" label="名称" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="type" label="类型" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="brief" label="简介" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="content" label="内容" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="create_time" label="发布时间" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                  <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
+                  <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
+          <el-col :span="24" class="page">
+            <!-- current-page:当前页数 current-change触发当前页  page-size:每页显示条目个数 -->
+            <el-pagination
+              background
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              layout="total, prev, pager, next, jumper"
+              :total="total"
+              :page-size="pageSize"
+            >
+            </el-pagination>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+import breadcrumb from '@c/common/breadcrumb.vue';
+const { mapActions: hotspot } = createNamespacedHelpers('hotspot');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'hotspotIndex',
+  props: {},
+  components: {
+    breadcrumb,
+  },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      form: {},
+      currentPage: 0,
+      pageSize: 10,
+      skip: 0,
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...hotspot(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      skip = this.skip;
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    //添加跳转
+    add() {
+      this.$router.push({ path: '/hotspotDetail' });
+    },
+    //编辑
+    handleEdit(data) {
+      this.$router.push({ path: '/hotspotDetail', query: { id: data.id } });
+    },
+    //删除数据
+    async handleDelete(data) {
+      let res = await this.delete(data.id);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '删除成功',
+          type: 'success',
+        });
+        this.search();
+      }
+    },
+    handleCurrentChange(currentPage) {
+      this.$set(this, `skip`, (currentPage - 1) * this.pageSize);
+      this.search();
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+  text-align: center;
+  margin: 15px 0;
+}
+</style>

+ 128 - 0
src/views/links/linksDetail.vue

@@ -0,0 +1,128 @@
+<template>
+  <div id="linksDetail">
+    <el-row>
+      <el-col :span="24">
+        <breadcrumb :breadcrumbTitle="this.$route.meta.title"></breadcrumb>
+      </el-col>
+      <el-col :span="24" class="container">
+        <el-col :span="24" style="margin:15px 0;text-align:right">
+          <el-button type="primary" size="mini" @click="back()">返回</el-button>
+        </el-col>
+        <el-col :span="24">
+          <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+            <el-form-item label="名称" prop="name">
+              <el-input v-model="form.name"></el-input>
+            </el-form-item>
+            <el-form-item label="发布时间" prop="create_time">
+              <el-date-picker type="date" placeholder="选择日期" v-model="form.create_time" value-format="yyyy-MM-dd" format="yyyy-MM-dd"></el-date-picker>
+            </el-form-item>
+            <!-- 问3友情链接地址 -->
+            <el-form-item label="图片">
+              <upload :limit="1" :data="form.filepath" type="filepath" :url="'/files/filepath/upload'" @upload="uploadSuccess"></upload>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="submitForm('form')">保存</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import upload from '@/components/frame/uploadone.vue';
+import breadcrumb from '@c/common/breadcrumb.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: links } = createNamespacedHelpers('links');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'linksDetail',
+  props: {},
+  components: {
+    upload,
+    breadcrumb,
+  },
+  data: function() {
+    return {
+      form: {},
+      rules: {
+        name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        create_time: [{ required: true, message: '请选择日期', trigger: 'change' }],
+      },
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...links(['query', 'fetch', 'create', 'update', 'delete']),
+    //查询列表
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    back() {
+      this.$set(this, `form`, {});
+      this.$router.push({ path: '/linksIndex' });
+    },
+    //保存数据
+    submitForm(formName) {
+      // element表单验证
+      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.$message({
+                message: '修改成功',
+                type: 'success',
+              });
+              this.back();
+            }
+          } else {
+            let res = await this.create(data);
+            if (this.$checkRes(res)) {
+              this.$message({
+                message: '创建成功',
+                type: 'success',
+              });
+              this.back();
+            }
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    uploadSuccess({ type, data }) {
+      this.$set(this.form, `${type}`, data.uri);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {
+    id: {
+      deep: true,
+      immediate: true,
+      handler(val) {
+        this.search();
+      },
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 110 - 0
src/views/links/linksIndex.vue

@@ -0,0 +1,110 @@
+<template>
+  <div id="linksIndex">
+    <el-row>
+      <el-col :span="24">
+        <breadcrumb :breadcrumbTitle="this.$route.meta.title"></breadcrumb>
+        <el-col :span="24" class="container">
+          <el-col :span="24" style="margin:15px 0;text-align:right;">
+            <el-button type="primary" size="mini" @click="add()">添加</el-button>
+          </el-col>
+          <el-col :span="24">
+            <el-table :data="list" style="width: 100%" border>
+              <el-table-column prop="name" label="名称" align="center"> </el-table-column>
+              <el-table-column prop="create_time" label="发布时间" align="center"> </el-table-column>
+              <el-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                  <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
+                  <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <el-col :span="24" class="page">
+              <el-pagination
+                background
+                @current-change="handleCurrentChange"
+                :current-page="currentPage"
+                layout="total, prev, pager, next, jumper"
+                :total="total"
+                :page-size="pageSize"
+              >
+              </el-pagination>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import breadcrumb from '@c/common/breadcrumb.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: links } = createNamespacedHelpers('links');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'linksIndex',
+  props: {},
+  components: {
+    breadcrumb,
+  },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      currentPage: 0,
+      pageSize: 10,
+      skip: 0,
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...links(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      skip = this.skip;
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 删除
+    async handleDelete(data) {
+      let res = await this.delete(data.id);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '创建成功',
+          type: 'success',
+        });
+        this.search();
+      }
+    },
+    // 添加数据
+    add() {
+      this.$router.push('/linksDetail');
+    },
+    // 修改数据
+    handleEdit(data) {
+      this.$router.push({ path: '/linksDetail', query: { id: data.id } });
+    },
+    handleCurrentChange(currentPage) {
+      this.$set(this, `skip`, (currentPage - 1) * this.pageSize);
+      this.search();
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+  text-align: center;
+  margin: 15px 0;
+}
+</style>

+ 14 - 13
src/views/product/productIndex.vue

@@ -9,19 +9,20 @@
           <el-col :span="24" style="margin:15px 0;text-align:right">
             <el-button type="primary" size="mini" @click="add()">添加</el-button>
           </el-col>
-
-          <el-table :data="list" style="width: 100%" border>
-            <el-table-column prop="name" label="产品名称" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="brief" label="简介" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="content" label="内容" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column prop="create_time" label="发布时间" align="center" show-overflow-tooltip> </el-table-column>
-            <el-table-column label="操作" align="center">
-              <template slot-scope="scope">
-                <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
-                <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
-              </template>
-            </el-table-column>
-          </el-table>
+          <el-col :span="24">
+            <el-table :data="list" style="width: 100%" border>
+              <el-table-column prop="name" label="产品名称" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="brief" label="简介" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="content" label="内容" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column prop="create_time" label="发布时间" align="center" show-overflow-tooltip> </el-table-column>
+              <el-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                  <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
+                  <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
           <el-col :span="24" class="page">
             <!-- current-page:当前页数 current-change触发当前页  page-size:每页显示条目个数 -->
             <el-pagination

+ 128 - 0
src/views/video/videoDetail.vue

@@ -0,0 +1,128 @@
+<template>
+  <div id="videoDetail">
+    <el-row>
+      <el-col :span="24">
+        <breadcrumb :breadcrumbTitle="this.$route.meta.title"></breadcrumb>
+      </el-col>
+      <el-col :span="24" class="container">
+        <el-col :span="24" style="margin:15px 0;text-align:right">
+          <el-button type="primary" size="mini" @click="back()">返回</el-button>
+        </el-col>
+        <el-col :span="24">
+          <el-form :model="form" :rules="rules" ref="form" label-width="100px">
+            <el-form-item label="名称" prop="name">
+              <el-input v-model="form.name"></el-input>
+            </el-form-item>
+            <el-form-item label="发布时间" prop="create_time">
+              <el-date-picker type="date" placeholder="选择日期" v-model="form.create_time" value-format="yyyy-MM-dd" format="yyyy-MM-dd"></el-date-picker>
+            </el-form-item>
+            <!-- 问2怎么上传视频 -->
+            <el-form-item label="图片">
+              <upload :limit="1" :data="form.filepath" type="filepath" :url="'/files/filepath/upload'" @upload="uploadSuccess"></upload>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="submitForm('form')">保存</el-button>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import upload from '@/components/frame/uploadone.vue';
+import breadcrumb from '@c/common/breadcrumb.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: video } = createNamespacedHelpers('video');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'videoDetail',
+  props: {},
+  components: {
+    upload,
+    breadcrumb,
+  },
+  data: function() {
+    return {
+      form: {},
+      rules: {
+        name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
+        create_time: [{ required: true, message: '请选择日期', trigger: 'change' }],
+      },
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...video(['query', 'fetch', 'create', 'update', 'delete']),
+    //查询列表
+    async search() {
+      if (this.id) {
+        let res = await this.fetch(this.id);
+        if (this.$checkRes(res)) {
+          this.$set(this, `form`, res.data);
+        }
+      }
+    },
+    back() {
+      this.$set(this, `form`, {});
+      this.$router.push({ path: '/videoIndex' });
+    },
+    //保存数据
+    submitForm(formName) {
+      // element表单验证
+      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.$message({
+                message: '修改成功',
+                type: 'success',
+              });
+              this.back();
+            }
+          } else {
+            let res = await this.create(data);
+            if (this.$checkRes(res)) {
+              this.$message({
+                message: '创建成功',
+                type: 'success',
+              });
+              this.back();
+            }
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    uploadSuccess({ type, data }) {
+      this.$set(this.form, `${type}`, data.uri);
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  watch: {
+    id: {
+      deep: true,
+      immediate: true,
+      handler(val) {
+        this.search();
+      },
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped></style>

+ 110 - 0
src/views/video/videoIndex.vue

@@ -0,0 +1,110 @@
+<template>
+  <div id="videoIndex">
+    <el-row>
+      <el-col :span="24">
+        <breadcrumb :breadcrumbTitle="this.$route.meta.title"></breadcrumb>
+        <el-col :span="24" class="container">
+          <el-col :span="24" style="margin:15px 0;text-align:right;">
+            <el-button type="primary" size="mini" @click="add()">添加</el-button>
+          </el-col>
+          <el-col :span="24">
+            <el-table :data="list" style="width: 100%" border>
+              <el-table-column prop="name" label="名称" align="center"> </el-table-column>
+              <el-table-column prop="create_time" label="发布时间" align="center"> </el-table-column>
+              <el-table-column label="操作" align="center">
+                <template slot-scope="scope">
+                  <el-button size="mini" @click="handleEdit(scope.row)">编辑</el-button>
+                  <el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <el-col :span="24" class="page">
+              <el-pagination
+                background
+                @current-change="handleCurrentChange"
+                :current-page="currentPage"
+                layout="total, prev, pager, next, jumper"
+                :total="total"
+                :page-size="pageSize"
+              >
+              </el-pagination>
+            </el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+import breadcrumb from '@c/common/breadcrumb.vue';
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: video } = createNamespacedHelpers('video');
+export default {
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+  name: 'videoIndex',
+  props: {},
+  components: {
+    breadcrumb,
+  },
+  data: function() {
+    return {
+      list: [],
+      total: 0,
+      currentPage: 0,
+      pageSize: 10,
+      skip: 0,
+    };
+  },
+  created() {
+    this.search();
+  },
+  methods: {
+    ...video(['query', 'fetch', 'create', 'update', 'delete']),
+    // 查询列表
+    async search({ skip = 0, limit = 10, ...info } = {}) {
+      skip = this.skip;
+      let res = await this.query({ skip, limit, ...info });
+      if (this.$checkRes(res)) {
+        this.$set(this, `list`, res.data);
+        this.$set(this, `total`, res.total);
+      }
+    },
+    // 删除
+    async handleDelete(data) {
+      let res = await this.delete(data.id);
+      if (this.$checkRes(res)) {
+        this.$message({
+          message: '创建成功',
+          type: 'success',
+        });
+        this.search();
+      }
+    },
+    // 添加数据
+    add() {
+      this.$router.push('/videoDetail');
+    },
+    // 修改数据
+    handleEdit(data) {
+      this.$router.push({ path: '/videoDetail', query: { id: data.id } });
+    },
+    handleCurrentChange(currentPage) {
+      this.$set(this, `skip`, (currentPage - 1) * this.pageSize);
+      this.search();
+    },
+  },
+  computed: {
+    ...mapState(['user']),
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.page {
+  text-align: center;
+  margin: 15px 0;
+}
+</style>