lrf402788946 4 rokov pred
rodič
commit
66dfdd80f0

+ 1 - 2
package.json

@@ -15,8 +15,7 @@
     "element-ui": "^2.13.2",
     "flv.js": "^1.5.0",
     "jsonwebtoken": "^8.5.1",
-    "loadsh": "0.0.4",
-    "lodash": "^4.17.15",
+    "lodash": "^4.17.21",
     "moment": "^2.26.0",
     "naf-core": "^0.1.2",
     "trtc-js-sdk": "^4.4.0",

+ 2 - 0
src/store/index.js

@@ -2,6 +2,7 @@ import Vue from 'vue';
 import Vuex from 'vuex';
 import refute from './refute';
 import login from './login';
+import upload from './upload';
 
 Vue.use(Vuex);
 
@@ -22,5 +23,6 @@ export default new Vuex.Store({
   modules: {
     refute,
     login,
+    upload,
   },
 });

+ 25 - 0
src/store/upload.js

@@ -0,0 +1,25 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import _ from 'lodash';
+import axios from 'axios';
+Vue.use(Vuex);
+const api = {
+  upload: `/files/article/refute/upload`,
+};
+const state = () => ({});
+const mutations = {};
+
+const actions = {
+  async upload({ commit }, file) {
+    var formdata = new FormData();
+    formdata.append('file', file, file.name);
+    const res = await axios.post(api.upload, formdata, { headers: { 'Content-Type': 'multipart/form-data' } });
+    return res.data;
+  },
+};
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 25 - 5
src/views/adminCenter/adminRefute.vue

@@ -3,10 +3,15 @@
     <el-row>
       <el-col :span="24" class="main">
         <el-col :span="24" class="top">
-          <top topType="2" :leftArrow="false"></top>
+          <van-nav-bar :title="pageTitle">
+            <template #right>
+              <van-icon name="add" size="28" @click="toAdd" />
+            </template>
+          </van-nav-bar>
         </el-col>
-        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }">
-          文章辟谣
+        <el-col :span="24" class="info" :style="{ height: clientHeight + 'px' }" ref="list">
+          <item></item>
+          <page :total="total" :limit="limit"></page>
         </el-col>
         <el-col :span="24" class="foot">
           <foot></foot>
@@ -19,17 +24,23 @@
 <script>
 import top from '@/layout/common/top.vue';
 import foot from '@/layout/common/foot.vue';
+import page from '@/layout/common/page.vue';
+import item from './refute/item.vue';
 import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: refute } = createNamespacedHelpers('refute');
 export default {
   name: 'index',
   props: {},
   components: {
-    top,
     foot,
+    item,
+    page,
   },
   data: function() {
     return {
       clientHeight: '',
+      total: 0,
+      limit: 5,
     };
   },
   created() {},
@@ -37,9 +48,18 @@ export default {
     let clientHeight = (document.documentElement.clientHeight || document.body.clientHeight) - 90;
     this.$set(this, `clientHeight`, clientHeight);
   },
-  methods: {},
+  methods: {
+    ...refute(['query']),
+    async search() {},
+    toAdd() {
+      this.$router.push('/adminRefute/edit');
+    },
+  },
   computed: {
     ...mapState(['user']),
+    pageTitle() {
+      return this.$route.meta.title;
+    },
   },
   metaInfo() {
     return { title: this.$route.meta.title };

+ 125 - 0
src/views/adminCenter/refute/edit.vue

@@ -0,0 +1,125 @@
+<template>
+  <div id="edit">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="top">
+          <van-nav-bar :title="pageTitle" left-text="取消" @click-left="toCancel" right-text="发表" @click-right="toSubmit" />
+        </el-col>
+        <el-col :span="24">
+          <van-form ref="form" style="margin-top:30px">
+            <van-field v-model="form.title" name="title" label="标题" placeholder="请输入标题" :rules="[{ required: true, message: '请填写标题' }]" />
+            <van-field v-model="form.website" name="website" label="网址" placeholder="请输入标题" />
+            <van-field v-model="form.content" rows="2" autosize type="textarea" placeholder="请输入本文内容" />
+            <van-field name="uploader" label="封面上传">
+              <template #input>
+                <van-uploader v-model="form.imgUrl" :max-count="1" :after-read="file => toUpload(file, 'imgUrl')" />
+              </template>
+            </van-field>
+            <van-field name="uploader" label="文章视频">
+              <template #input>
+                <van-uploader v-model="form.fileUrl" :max-count="1" :after-read="file => toUpload(file, 'fileUrl')" accept=".mp4,.flv,.avi,.rmvb,.wmv" />
+              </template>
+            </van-field>
+          </van-form>
+        </el-col>
+        <el-col :span="24" class="foot">
+          <foot></foot>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+const _ = require('lodash');
+import foot from '@/layout/common/foot.vue';
+const moment = require('moment');
+import { mapState, createNamespacedHelpers } from 'vuex';
+const { mapActions: upload } = createNamespacedHelpers('upload');
+const { mapActions: refute } = createNamespacedHelpers('refute');
+export default {
+  name: 'edit',
+  props: {},
+  components: { foot },
+  data: function() {
+    return {
+      form: {},
+    };
+  },
+  created() {
+    if (this.id) this.search();
+  },
+  methods: {
+    ...upload(['upload']),
+    ...refute(['create', 'fetch', 'update']),
+    async search() {
+      const res = await this.fetch(this.id);
+      if (this.$checkRes(res, null, res.errmsg || '未找到指定数据')) {
+        this.$set(this, `form`, res.data);
+      }
+    },
+    async toSubmit() {
+      console.log(_.get);
+      let dup = _.cloneDeep(this.form);
+      let res;
+      // 需要处理imgUrl和fileUrl
+      if (_.get(dup, 'imgUrl')) dup.imgUrl = _.get(dup.imgUrl, '0.url');
+      if (_.get(dup, 'fileUrl')) dup.fileUrl = _.get(dup.fileUrl, '0.url');
+      if (this.id) {
+        dup.renew_time = moment().format('YYYY-MM-DD HH:mm:ss');
+        res = await this.update(dup);
+      } else {
+        // user_id,origin需要加进数据中
+        dup.user_id = this.user._id;
+        dup.origin = this.user.name;
+        res = await this.create(dup);
+      }
+      if (this.$checkRes(res, '保存成功', res.errmsg || '保存失败')) {
+        // 返回
+        this.$router.push('/adminRefute');
+      }
+    },
+    async toUpload({ file }, model) {
+      // 上传,赋值
+      const res = await this.upload(file);
+      if (this.$checkRes(res)) {
+        this.$set(this.form, model, [{ url: res.uri }]);
+      }
+    },
+    toCancel() {
+      this.$router.push('/adminRefute');
+    },
+  },
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+    id() {
+      return this.$route.query.id;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.main {
+  .top {
+    height: 40px;
+    overflow: hidden;
+    border-bottom: 1px solid #f1f1f1;
+  }
+  .info {
+    overflow-x: hidden;
+    overflow-y: auto;
+  }
+  .foot {
+    height: 50px;
+    overflow: hidden;
+    border-top: 1px solid #f1f1f1;
+  }
+}
+</style>

+ 0 - 48
src/views/adminCenter/refute/index.vue

@@ -1,48 +0,0 @@
-<template>
-  <div id="index">
-    <!-- <top topType="2" @upBack="toBack"></top> -->
-    <van-nav-bar :title="pageTitle" left-text="返回" left-arrow @click-left="toBack">
-      <template #right>
-        <van-icon name="plus" size="18" />
-      </template>
-    </van-nav-bar>
-    <page :total="total" :limit="limit" @search="search"></page>
-  </div>
-</template>
-
-<script>
-import top from '@/layout/common/top.vue';
-import page from '@/layout/common/page.vue';
-import { mapState, createNamespacedHelpers } from 'vuex';
-export default {
-  name: 'index',
-  props: {},
-  components: { page }, //top
-  data: function() {
-    return {
-      total: 10,
-      limit: 10,
-    };
-  },
-  created() {},
-  methods: {
-    async search({ skip = 0 } = {}) {
-      // TODO接口
-    },
-    toBack() {
-      this.$router.push('/admin/index');
-    },
-  },
-  computed: {
-    ...mapState(['user', 'menuParams']),
-    pageTitle() {
-      return `${this.$route.meta.title}`;
-    },
-  },
-  metaInfo() {
-    return { title: this.$route.meta.title };
-  },
-};
-</script>
-
-<style lang="less" scoped></style>

+ 30 - 0
src/views/adminCenter/refute/item.vue

@@ -0,0 +1,30 @@
+<template>
+  <div id="item">
+    <p>item</p>
+  </div>
+</template>
+
+<script>
+import { mapState, createNamespacedHelpers } from 'vuex';
+export default {
+  name: 'item',
+  props: {},
+  components: {},
+  data: function() {
+    return {};
+  },
+  created() {},
+  methods: {},
+  computed: {
+    ...mapState(['user', 'menuParams']),
+    pageTitle() {
+      return `${this.$route.meta.title}`;
+    },
+  },
+  metaInfo() {
+    return { title: this.$route.meta.title };
+  },
+};
+</script>
+
+<style lang="less" scoped></style>