liyongli 1 year ago
parent
commit
0aee64d49b

+ 69 - 0
src/api/newMdeiaApi.js

@@ -50,3 +50,72 @@ export function getYoumeiProportion(data) {
     data,
   });
 }
+
+/**
+ * 获取稿件
+ * @param {object} data
+ * @returns
+ */
+export function getArticleCnt(data) {
+  return ajax({
+    urlType: 'rankApi',
+    url: '/article/statistics',
+    method: 'POST',
+    data,
+  });
+}
+
+/**
+ * 获取直播栏目
+ * @param {object} data
+ * @returns
+ */
+export function getCloudLive(data) {
+  return ajax({
+    urlType: 'url2',
+    url: '/new-media/cloud-live/columns',
+    method: 'GET',
+    data,
+  });
+}
+
+/**
+ * 获取直播部门
+ * @param {object} data
+ * @returns
+ */
+export function getCenter(data) {
+  return ajax({
+    urlType: 'url2',
+    url: '/new-media/idaas/center',
+    method: 'GET',
+    data,
+  });
+}
+
+/**
+ * 直播列表
+ * @param {object} data
+ * @returns
+ */
+export function getCloudLiveList(data) {
+  return ajax({
+    urlType: 'url2',
+    url: '/new-media/cloud-live/lives',
+    method: 'POST',
+    data,
+  });
+}
+
+/**
+ * 直播收入列表
+ * @param {object} data
+ * @returns
+ */
+export function getIncomeist(data) {
+  return ajax({
+    urlType: 'url2',
+    url: '/new-media/cloud-live/pay?liveId=' + data,
+    method: 'POST',
+  });
+}

+ 2 - 2
src/router/index.js

@@ -1,6 +1,6 @@
 import { createRouter, createWebHashHistory } from "vue-router";
 import countryRouter from "./country";
-// import rankRouter from "./rank";
+import rankRouter from "./rank";
 import rankRouter_old from "./rank_old";
 const routes = [
   {
@@ -201,7 +201,7 @@ const routes = [
     component: () =>
       import(/* webpackChunkName: "newMediaOverview" */ "../views/NMedia/ActivityUser.vue"),
   },
-//   ...rankRouter,
+  ...rankRouter,
   ...rankRouter_old,
   //  新媒体-应用分析-内容分析
   {

+ 7 - 7
src/router/rank.js

@@ -81,7 +81,7 @@ export default [
     path: '/all_aedia',
     children: [
         {
-          path: '/all_aedia/overview',
+          path: 'overview',
           name: 'overview',
           component: () =>
             import(
@@ -89,7 +89,7 @@ export default [
             ),
         },
         {
-          path: '/all_aedia/propagate',
+          path: 'propagate',
           name: 'propagate',
           component: () =>
             import(
@@ -97,7 +97,7 @@ export default [
             ),
         },
         {
-          path: '/all_aedia/live',
+          path: 'live',
           name: 'live',
           component: () =>
             import(
@@ -105,7 +105,7 @@ export default [
             ),
         },
         {
-          path: '/all_aedia/all_aedia_column',
+          path: 'all_aedia_column',
           name: 'all_aedia_column',
           component: () =>
             import(
@@ -113,7 +113,7 @@ export default [
             ),
         },
         {
-          path: '/all_aedia/fusion',
+          path: 'fusion',
           name: 'fusion',
           component: () =>
             import(
@@ -121,7 +121,7 @@ export default [
             ),
         },
         {
-          path: '/all_aedia/content_library',
+          path: 'content_library',
           name: 'content_library',
           component: () =>
             import(
@@ -129,7 +129,7 @@ export default [
             ),
         },
         {
-          path: '/all_aedia/release',
+          path: 'release',
           name: 'release',
           component: () =>
             import(

+ 31 - 16
src/utils/request.js

@@ -1,33 +1,37 @@
-import config from "../config/index";
+import config from '../config/index';
 
 function getdata(data) {
-  let text = "";
+  let text = '';
   for (const key in data) {
-    text += key + "=" + data[key] + "&";
+    text += key + '=' + data[key] + '&';
   }
-  text ? (text = "?" + text) : "";
-  text = text.replace(/&$/, "");
+  text ? (text = '?' + text) : '';
+  text = text.replace(/&$/, '');
   return text;
 }
 
 export default function (ori) {
   let method = ori.method.toUpperCase();
-  let baseurl = config.base[ori.urlType || "url"];
+  let baseurl = config.base[ori.urlType || 'url'];
   let url = baseurl + ori.url;
-  if (method === "GET") url += getdata(ori.data || {});
+  if (method === 'GET') url += getdata(ori.data || {});
   if (ori.downCsv) return window.open(url);
   let d = {
     lock: true,
-    background: "rgba(255, 255, 255, 0.7)",
+    background: 'rgba(255, 255, 255, 0.7)',
   };
   ori.target && (d.target = ori.target);
   return new Promise((resolve, reject) => {
     var xhttp;
     if (window.XMLHttpRequest) xhttp = new XMLHttpRequest();
     else if (window.ActiveXObject)
-      xhttp = new window.ActiveXObject("Microsoft.XMLHTTP");
+      xhttp = new window.ActiveXObject('Microsoft.XMLHTTP');
     xhttp.open(method, url, true);
-    if (ori.headers && xhttp.setRequestHeader && typeof ori.headers === "object") {
+    if (
+      ori.headers &&
+      xhttp.setRequestHeader &&
+      typeof ori.headers === 'object'
+    ) {
       // 存在header
       const keys = Object.keys(ori.headers);
       for (let i = 0; i < keys.length; i++) {
@@ -35,9 +39,20 @@ export default function (ori) {
         xhttp.setRequestHeader(v, encodeURIComponent(ori.headers[v]));
       }
     }
-    if (method === "POST") {
-      xhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
-      xhttp.send(JSON.stringify(ori.data));
+    if (method === 'POST') {
+      const isFrom = Object.prototype.toString
+        .call(ori.data)
+        .slice(8, -1)
+        .toLowerCase();
+      if (isFrom !== 'formdata') {
+        xhttp.setRequestHeader(
+          'Content-Type',
+          'application/json;charset=UTF-8'
+        );
+        xhttp.send(JSON.stringify(ori.data));
+      } else {
+        xhttp.send(ori.data);
+      }
     } else xhttp.send();
     xhttp.onreadystatechange = function () {
       if (this.readyState != 4) return;
@@ -45,8 +60,8 @@ export default function (ori) {
       let data = {};
       try {
         data =
-          this.responseText !== "null"
-            ? JSON.parse(this.responseText || "{}")
+          this.responseText !== 'null'
+            ? JSON.parse(this.responseText || '{}')
             : {};
       } catch (err) {
         console.error(err);
@@ -55,7 +70,7 @@ export default function (ori) {
 
       data && data.response && (data = data.response);
       if (!ori.urlType && !data.status) return reject(data.message);
-      if (data.code) return reject(data)
+      if (data.code) return reject(data);
       resolve(data.data || data.response || data);
     };
   });

+ 12 - 1
src/views/Department/index.vue

@@ -89,7 +89,18 @@
             </template>
           </el-table>
         </el-tab-pane>
-        <el-tab-pane label="稿件数据" name="list">
+        <el-tab-pane name="list">
+          <template #label>
+            <el-tooltip
+              class="box-item"
+              effect="dark"
+              content="清单不含已删稿件"
+              placement="top"
+              :visible="true"
+            >
+              <div>稿件数据</div>
+            </el-tooltip>
+          </template>
           <el-table
             :header-cell-style="{
               backgroundColor: '#f4f5f7',

+ 224 - 29
src/views/Ranking/live.vue

@@ -1,9 +1,9 @@
 <template>
   <div class="live">
     <el-breadcrumb separator="/">
-      <el-breadcrumb-item :to="{ path: '/all_aedia/overview' }"
-        >全媒体平台</el-breadcrumb-item
-      >
+      <el-breadcrumb-item :to="{ path: '/all_aedia/overview' }">
+        全媒体平台
+      </el-breadcrumb-item>
       <el-breadcrumb-item>直播排行</el-breadcrumb-item>
     </el-breadcrumb>
     <el-form
@@ -12,18 +12,29 @@
       :model="search"
       class="demo-form-inline"
     >
-      <el-form-item label="中心">
-        <el-select v-model="search.center">
-          <el-option label="创新中心" value="1" />
-          <el-option label="新闻中心" value="2" />
-        </el-select>
-      </el-form-item>
       <el-form-item label="部门">
         <el-select v-model="search.department">
-          <el-option label="部门1" value="1" />
-          <el-option label="部门2" value="2" />
+          <el-option
+            v-for="v in datas.department"
+            :label="v"
+            :value="v"
+            :key="v"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="栏目">
+        <el-select v-model="search.column">
+          <el-option
+            v-for="v in datas.column"
+            :label="v.title"
+            :value="v.title"
+            :key="v.title"
+          />
         </el-select>
       </el-form-item>
+      <el-form-item label="关键词">
+        <el-input clearable v-model="search.keyword" />
+      </el-form-item>
       <el-form-item label="日期">
         <el-date-picker
           v-model="search.date"
@@ -31,43 +42,227 @@
           range-separator="-"
           start-placeholder="开始时间"
           end-placeholder="结束时间"
+          :disabled-date="disabledDate"
         />
       </el-form-item>
+      <el-form-item>
+        <el-button type="primary" @click="() => getlist()"> 提交 </el-button>
+      </el-form-item>
     </el-form>
 
-    <el-table border :data="tableData" stripe style="width: 100%">
-      <el-table-column align="center" header-align="center" type="index" label="排行" width="50" />
-      <el-table-column align="center" header-align="center" prop="" label="直播名" />
-      <el-table-column align="center" header-align="center" prop="" label="中心" />
-      <el-table-column align="center" header-align="center" prop="" label="部门" />
-      <el-table-column align="center" header-align="center" prop="" label="创建人" />
-      <el-table-column align="center" header-align="center" prop="" label="直播开始时间" />
-      <el-table-column align="center" header-align="center" prop="" label="观看人次" />
-      <el-table-column align="center" header-align="center" prop="" label="总停留时长(秒)" />
-      <el-table-column align="center" header-align="center" prop="" label="点赞数" />
-      <el-table-column align="center" header-align="center" prop="" label="评论数" />
+    <el-table
+      :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
+      border
+      :data="tableData"
+      stripe
+      style="width: 100%"
+      @row-click="getIncome"
+    >
+      <el-table-column
+        align="center"
+        header-align="center"
+        type="index"
+        label="排行"
+        width="50"
+      />
+      <el-table-column
+        align="center"
+        header-align="center"
+        prop="title"
+        label="直播名"
+        width="300"
+      />
+      <el-table-column
+        align="center"
+        header-align="center"
+        prop="centerName"
+        label="中心"
+      />
+      <el-table-column
+        align="center"
+        header-align="center"
+        prop="column"
+        label="栏目"
+      />
+      <el-table-column
+        align="center"
+        header-align="center"
+        prop="displayName"
+        label="创建人"
+      />
+      <el-table-column
+        align="center"
+        header-align="center"
+        prop="start"
+        label="直播开始时间"
+      >
+        <template #default="scope">
+          {{ timeFormat(scope.row.start) }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        header-align="center"
+        prop="views"
+        label="观看人次"
+      >
+        <template #default="scope">
+          <countTo
+            :startVal="scope.row.views || 0"
+            :endVal="scope.row.views || 0"
+            :duration="100"
+          ></countTo>
+        </template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        header-align="center"
+        prop="money"
+        label="收入"
+      >
+        <template #default="scope">
+          <countTo
+            :startVal="scope.row.money || 0"
+            :endVal="scope.row.money || 0"
+            :duration="100"
+          ></countTo>
+        </template>
+      </el-table-column>
     </el-table>
     <br />
-    <el-pagination layout="prev, pager, next" :total="1000" />
+    <el-pagination
+      @current-change="currentChange"
+      :current-value="search.page"
+      layout="prev, pager, next"
+      :total="search.total"
+    />
+
+    <el-dialog v-model="dialogList.length" :title="clickRowData.title" width="50%">
+        <el-table
+      :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
+      border
+      :data="dialogList"
+      stripe
+      style="width: 100%"
+    >
+      <el-table-column
+        align="center"
+        header-align="center"
+        type="userName"
+        label="付款人"
+      >
+        <template #default="scope">
+          {{ scope.row.userName }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        header-align="center"
+        prop="money"
+        label="付款金额"
+      />
+    </el-table>
+    </el-dialog>
   </div>
 </template>
 <script>
-// 概览
+// 直播
+import countTo from '@/components/counto/vue-countTo.vue';
+import {
+  getCloudLive,
+  getCenter,
+  getCloudLiveList,
+  getIncomeist,
+} from '@/api/newMdeiaApi.js';
+import dayjs from 'dayjs';
+const T = dayjs(Date.now() - 86400000);
 export default {
   name: 'live',
   data() {
     return {
+      T,
+      dialogVisible: false,
       search: {
-        center: '',
+        column: '',
         department: '',
-        date: [],
+        date: [T.format('YYYY-MM-DD'), T.format('YYYY-MM-DD')],
+        keyword: '',
+        page: 1,
+        size: 10,
+        total: 0,
+      },
+      datas: {
+        department: [],
+        column: [],
       },
       tableData: [],
+      dialogList: [],
+      clickRowData: {},
     };
   },
-  mounted() {},
-  methods: {},
-  components: {},
+  mounted() {
+    Promise.all([getCloudLive(), getCenter()]).then(li => {
+      this.datas.department = ['全部', ...li[1]];
+      this.search.department = this.datas.department[0];
+      this.datas.column = [
+        {
+          id: -1,
+          title: '全部',
+        },
+        ...li[0],
+      ];
+      this.search.column = this.datas.column[0].title;
+      this.getlist();
+    });
+  },
+  methods: {
+    getlist() {
+      const column = this.search.column === '全部' ? '' : this.search.column;
+      const center =
+        this.search.department === '全部' ? '' : this.search.department;
+      const st = dayjs(this.search.date[0]);
+      const et = dayjs(this.search.date[1]);
+      getCloudLiveList({
+        start: st.format('YYYY-MM-DD'),
+        end: et.format('YYYY-MM-DD'),
+        column,
+        center,
+        keyword: this.search.keyword,
+        page: this.search.page,
+        pageSize: this.search.size,
+      }).then(r => {
+        this.search.total = r.total || 0;
+        this.tableData = r.records || [];
+      });
+    },
+    disabledDate(time) {
+      let out = true;
+      if (time.getTime() < Date.now()) out = false;
+      return out;
+    },
+    timeFormat(t) {
+      const d = dayjs(t);
+      return d.format('YYYY-MM-DD');
+    },
+    currentChange(page) {
+      this.search.page = page;
+      this.getlist();
+    },
+    getIncome(row) {
+      getIncomeist(row.id).then(r => {
+        if (!r || !r.length) {
+          this.dialogList = [];
+          this.clickRowData = {};
+          return;
+        }
+        this.clickRowData = row;
+        this.dialogList = r;
+      });
+    },
+  },
+  components: {
+    countTo,
+  },
 };
 </script>
 <style lang="scss">

+ 109 - 30
src/views/Ranking/release.vue

@@ -16,88 +16,167 @@
         <el-date-picker
           v-model="search.date"
           type="daterange"
+          @change="dateChange"
           range-separator="-"
+          value-format="YYYYMMDD"
           start-placeholder="开始时间"
           end-placeholder="结束时间"
         />
       </el-form-item>
     </el-form>
-
     <el-row>
-      <el-col style="padding: 0 .5em;" :span="8">
-        <el-table border :data="tableData" stripe style="width: 100%">
+      <el-col style="padding: 0 0.5em" :span="8">
+        <el-table
+          border
+          :data="tableData.center"
+          highlight-current-row
+          stripe
+          :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
+          style="width: 100%"
+          @row-click="row => rowClick(row, 1)"
+        >
           <el-table-column
             align="center"
             header-align="center"
-            prop=""
+            prop="name"
             label="中心"
           />
           <el-table-column
             align="center"
             header-align="center"
-            prop=""
+            prop="cnt"
             label="发稿量"
-          />
+          >
+            <template #default="scope">
+              <countTo
+                :startVal="0"
+                :endVal="scope.row.cnt || 0"
+                :duration="1000"
+              />
+            </template>
+          </el-table-column>
         </el-table>
-        <br />
-        <el-pagination layout="prev, pager, next" :total="1000" />
       </el-col>
-      <el-col style="padding: 0 .5em;" :span="8">
-        <el-table border :data="tableData" stripe style="width: 100%">
+      <el-col style="padding: 0 0.5em" :span="8">
+        <el-table
+          border
+          :data="tableData.depart"
+          highlight-current-row
+          :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
+          stripe
+          style="width: 100%"
+          @row-click="row => rowClick(row, 2)"
+        >
           <el-table-column
             align="center"
             header-align="center"
-            prop=""
+            prop="name"
             label="部门"
           />
           <el-table-column
             align="center"
             header-align="center"
-            prop=""
+            prop="cnt"
             label="发稿量"
-          />
+          >
+            <template #default="scope">
+              <countTo
+                :startVal="0"
+                :endVal="scope.row.cnt || 0"
+                :duration="1000"
+              />
+            </template>
+          </el-table-column>
         </el-table>
-        <br />
-        <el-pagination layout="prev, pager, next" :total="1000" />
       </el-col>
-      <el-col style="padding: 0 .5em;" :span="8">
-        <el-table border :data="tableData" stripe style="width: 100%">
+      <el-col style="padding: 0 0.5em" :span="8">
+        <el-table :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }" highlight-current-row border :data="tableData.user" stripe style="width: 100%">
           <el-table-column
             align="center"
             header-align="center"
-            prop=""
+            prop="name"
             label="人员"
           />
           <el-table-column
             align="center"
             header-align="center"
-            prop=""
+            prop="cnt"
             label="发稿量"
-          />
+          >
+            <template #default="scope">
+              <countTo
+                :startVal="0"
+                :endVal="scope.row.cnt || 0"
+                :duration="1000"
+              />
+            </template>
+          </el-table-column>
         </el-table>
-        <br />
-        <el-pagination layout="prev, pager, next" :total="1000" />
       </el-col>
     </el-row>
   </div>
 </template>
 <script>
-// 概览
+// 发稿量排行
+import { getArticleCnt } from '@/api/newMdeiaApi';
+import countTo from '@/components/counto/vue-countTo.vue';
+import dayjs from 'dayjs';
+const nT = dayjs(Date.now() - 86400000);
 export default {
   name: 'release',
   data() {
     return {
       search: {
-        center: '',
-        department: '',
-        date: [],
+        date: [nT.format('YYYY-MM-DD'), nT.format('YYYY-MM-DD')],
+        parent_id: {
+          center: '',
+          depart: '',
+          user: '',
+        },
+      },
+      tableData: {
+        center: [],
+        depart: [],
+        user: [],
       },
-      tableData: [],
+      type_key: ['center', 'depart', 'user'],
     };
   },
-  mounted() {},
-  methods: {},
-  components: {},
+  mounted() {
+    this.submit(0);
+  },
+  methods: {
+    dateChange() {
+      this.submit(0);
+    },
+    async submit(type) {
+      const st = [
+        this.search.date[0].replace(/-/g, ''),
+        this.search.date[1].replace(/-/g, ''),
+      ].join('-');
+      for (let i = type; i < this.type_key.length; i++) {
+        const t = this.type_key[i];
+        console.log(t);
+        const data = new FormData();
+        data.append('type', t);
+        data.append('date_range', st);
+        this.search.parent_id[t] &&
+          data.append('parent_id', this.search.parent_id[t]);
+        const res = await getArticleCnt(data);
+        this.tableData[t] = res || [];
+        if (i < this.type_key.length - 1) {
+          this.search.parent_id[this.type_key[i + 1]] = res[0].id;
+        }
+      }
+    },
+    rowClick(row, type) {
+      this.search.parent_id[this.type_key[type]] = row.id;
+      this.submit(type);
+    },
+  },
+  components: {
+    countTo,
+  },
 };
 </script>
 <style lang="scss">