liyongli há 2 anos atrás
pai
commit
35b870fbcb

+ 26 - 0
a.http

@@ -0,0 +1,26 @@
+### 栏目分析
+POST http://172.16.101.20:8762/cxzx-program/new-media/category 
+Content-Type: application/json;charset=UTF-8
+
+{
+  "start": "2023-01-11",
+  "end": "2023-01-31",
+  "app": "闪视频",
+  "version": [],
+  "lib": ""
+}
+
+### 内容日数据分析
+POST http://172.16.101.20:8762/cxzx-program/new-media/content/daily 
+Content-Type: application/json;charset=UTF-8
+
+{
+  "start": "2023-01-11",
+  "end": "2023-01-31",
+  "app": "西部网",
+  "version": [],
+  "lib": ""
+}
+
+### 内容日数据分析导出
+GET http://172.16.101.20:8762/cxzx-program/new-media/content/daily-export?start=2023-01-21&end=2023-01-31&app=西部网&version=

+ 26 - 0
src/api/newMdeiaApi.js

@@ -0,0 +1,26 @@
+import ajax from '@/utils/request.js';
+/**
+ * 获取大数据平台新媒体内容分析;
+ * @return {AxjxPromise}
+ */
+export function getColunmList(data) {
+  return ajax({
+    urlType: 'url2',
+    url: '/new-media/category',
+    method: 'POST',
+    data,
+  });
+}
+
+/**
+ * 获取大数据平台新媒体 内容日传播分析;
+ * @return {AxjxPromise}
+ */
+export function getContentDayList(data) {
+  return ajax({
+    urlType: 'url2',
+    url: '/new-media/content/daily',
+    method: 'POST',
+    data,
+  });
+}

+ 14 - 0
src/router/index.js

@@ -199,6 +199,20 @@ const routes = [
     component: () =>
       import(/* webpackChunkName: "newMediaOverview" */ "../views/NMedia/ActivityUser.vue"),
   },
+  //  新媒体-应用分析-内容分析
+  {
+    path: "/NMedia/column",
+    name: "column",
+    component: () =>
+      import(/* webpackChunkName: "column" */ "../views/NMedia/column/index.vue"),
+  },
+  //  新媒体-应用分析-新媒体内容日传播分析
+  {
+    path: "/NMedia/contentDay",
+    name: "contentDay",
+    component: () =>
+      import(/* webpackChunkName: "contentDay" */ "../views/NMedia/contentDay/index.vue"),
+  },
 
   countryRouter, // 全国数据
 ];

+ 2 - 2
src/views/LiveRoom/index.vue

@@ -382,7 +382,7 @@ export default {
         appVLi = [];
       let appC = { length: 0 },
         appCLi = [];
-      let prvList = r.output.data.prvRolectrl || [];
+      let prvList = r.output && r.output.data && r.output.data.prvRolectrl || [];
       for (let i = 0; i < prvList.length; i++) {
         const v = prvList[i];
         if (v.controlid == "RMT_SOURCE")
@@ -477,7 +477,7 @@ export default {
         menuid: 399,
         roleid,
       }).then(rule => {
-        let prvList = rule.output.data.prvRolectrl || [];
+        let prvList = rule.output && rule.output.data && rule.output.data.prvRolectrl || [];
         for (let i = 0; i < prvList.length; i++) {
           const v = prvList[i];
           if (v.controlid == "APP_VERSION")

+ 379 - 0
src/views/NMedia/column/index.vue

@@ -0,0 +1,379 @@
+<template>
+  <div class="Content">
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item>新媒体</el-breadcrumb-item>
+      <el-breadcrumb-item>应用分析</el-breadcrumb-item>
+      <el-breadcrumb-item>内容分析</el-breadcrumb-item>
+    </el-breadcrumb>
+    <el-card class="box-card">
+      <el-form
+        ref="form"
+        :model="form"
+        size="small"
+        :inline="true"
+        label-width="120px"
+        class="demo-form-inline"
+      >
+        <el-form-item label="日期">
+          <el-date-picker
+            v-if="form.date.length"
+            v-model="form.date"
+            type="daterange"
+            :disabled-date="time => disabledDate(time)"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            :clearable="false"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="应用">
+          <el-select
+            v-model="form.app"
+            placeholder="请选择时段"
+            @change="change"
+          >
+            <el-option
+              v-for="item in cycle"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+              :disabled="item.disabled"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="版本">
+          <el-select
+            filterable
+            multiple
+            collapse-tags
+            clearable
+            v-model="form.version"
+            placeholder="请选择版本"
+            @change="changeversion"
+          >
+            <el-option
+              v-for="item in version"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+              :disabled="item.disabled"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item style="float: right">
+          <el-button type="primary" @click="onSubmit">查询</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <br />
+    <el-card class="box-card">
+      <div class="head" v-if="table.total">
+        <div
+          v-for="(item, i) in table.total"
+          :key="i + item.name"
+          class="head-item"
+        >
+          <div>{{ item.name }}</div>
+          <div class="value">
+            <!-- oriData.total.activeUser -->
+            <countTo
+              v-if="!isNaN(item.value)"
+              :startVal="0"
+              :endVal="item.value - 0"
+              :duration="1500"
+            ></countTo>
+            <span v-else v-text="item.value"></span>
+          </div>
+        </div>
+      </div>
+      <el-table
+        :data="table.list || []"
+        style="width: 100%"
+        :header-cell-style="{
+          backgroundColor: '#f4f5f7',
+          color: '#606266',
+        }"
+      >
+        <el-table-column
+          show-overflow-tooltip
+          label="应用名称"
+          header-align="center"
+          align="center"
+        >
+          <template #default>
+            <span>{{ lastParams.app || '-' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="栏目名称"
+          header-align="center"
+          align="center"
+          prop="channelName"
+        >
+        </el-table-column>
+        <el-table-column
+          label="累计访问次数"
+          header-align="center"
+          align="center"
+          prop="pv"
+        >
+          <template #default="scope">
+            <countTo
+              :startVal="scope.row.pv || 0"
+              :endVal="scope.row.pv || 0"
+              :duration="100"
+            ></countTo>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="累计访问用户数"
+          header-align="center"
+          align="center"
+          prop="uv"
+        >
+          <template #default="scope">
+            <countTo
+              :startVal="scope.row.uv || 0"
+              :endVal="scope.row.uv || 0"
+              :duration="100"
+            ></countTo>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+  </div>
+</template>
+<script>
+// @ is an alias to /src
+import { getRule, getAppList, getSearchData } from '@/api/index';
+import { getColunmList } from '@/api/newMdeiaApi';
+
+import countTo from '@/components/counto/vue-countTo.vue';
+
+// import config from "@/config/index";
+export default {
+  name: 'Version',
+  data() {
+    return {
+      lastParams: {},
+      table: {},
+      numType: 'newUser',
+      form: {
+        app: '',
+        version: [],
+        date: [],
+      },
+      cycle: [],
+      showList: [],
+      version: [],
+    };
+  },
+  async mounted() {
+    const { source, appV, appli, appVLi } = await this.getAppListFunc();
+    const keys = {
+      value: 'mname',
+      label: 'mname',
+    };
+    this.cycle = this.verifyList(appli, source, keys, false);
+    this.version = this.verifyList(appVLi, appV, keys, true);
+    this.form = {
+      //   app: (this.cycle[0] || { value: "" }).value,
+      app: '起点新闻',
+      version: [(this.version[0] || { value: '' }).value],
+      date: [new Date(Date.now() - 604800000), new Date(Date.now() - 86400000)],
+    };
+
+    this.onSubmit();
+  },
+  computed: {},
+  methods: {
+    verifyList(list, verify, obj, more) {
+      if (!obj) return;
+      let li = list || [];
+      const out = [];
+      more && out.push({ value: -1, label: '不限' });
+      for (let i = 0; i < li.length; i++) {
+        const v = li[i];
+        if (verify.length !== 0 && !verify[v.mcode]) continue;
+        out.push({
+          value: v[obj.value],
+          label: v[obj.label],
+        });
+      }
+      return out;
+    },
+    selectNumType(type) {
+      this.numType = type;
+    },
+    onSubmit() {
+      this.lastParams = {
+        app: this.form.app,
+        start: this.FormData(this.form.date[0]),
+        end: this.FormData(this.form.date[1]),
+        version: this.form.version == -1 ? undefined : this.form.version,
+      };
+      getColunmList(this.lastParams).then(r => {
+        this.table = r || { list: [], total: [] };
+      });
+    },
+    async getAppListFunc() {
+      const { r, li, appVersion } = await this.getAppListOri();
+      let source = { length: 0 },
+        appli = [];
+      let appV = { length: 0 },
+        appVLi = [];
+      let prvList =
+        (r.output && r.output.data && r.output.data.prvRolectrl) || [];
+      for (let i = 0; i < prvList.length; i++) {
+        const v = prvList[i];
+        if (v.controlid == 'RMT_SOURCE')
+          (source[v.detid] = true), (source.length = source.length + 1);
+        if (v.controlid == 'APP_VERSION')
+          (appV[v.detid] = true), (appV.length = appV.length + 1);
+      }
+      if (li.status === '0') appli = li.output.data || [];
+      if (appVersion.length) appVLi = appVersion || [];
+      return {
+        source,
+        appV,
+        appli,
+        appVLi,
+      };
+    },
+    async getAppListOri() {
+      const roleid = JSON.parse(
+        window.parent.localStorage.userinfo || '{}'
+      ).roleid;
+      const r = await getRule({
+        db: 'authplat',
+        exportMark: '0',
+        menuid: 399,
+        roleid,
+      });
+      //   应用列表
+
+      const li = await getAppList({
+        exportMark: '0',
+        gcode: 'SOURCE',
+        pageid: 1,
+        pagesize: 1000,
+      });
+      const defaultAppName = '起点新闻';
+      //   应用版本列表
+      const appVersion = await getSearchData({
+        gcode: 'APP_VERSION',
+        source: defaultAppName,
+      });
+      return { r, li, appVersion };
+    },
+    disabledDate(time) {
+      const first = new Date('2021-06-21 00:00:00');
+      return (
+        time.getTime() > Date.now() - 86400000 ||
+        time.getTime() < first.getTime()
+      );
+    },
+    FormData(date) {
+      const d = new Date(date || Date.now() - 86400000);
+      const year = d.getFullYear();
+      const month =
+        d.getMonth() <= 8 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1;
+      const day = d.getDate() <= 9 ? '0' + d.getDate() : d.getDate();
+      return [year, month, day].join('-');
+    },
+    change() {
+      const roleid = JSON.parse(
+        window.parent.localStorage.userinfo || '{}'
+      ).roleid;
+      const appV = {
+        length: 0,
+      };
+      getRule({
+        db: 'authplat',
+        exportMark: '0',
+        menuid: 399,
+        roleid,
+      }).then(rule => {
+        let prvList =
+          (rule.output && rule.output.data && rule.output.data.prvRolectrl) ||
+          [];
+        for (let i = 0; i < prvList.length; i++) {
+          const v = prvList[i];
+          if (v.controlid == 'APP_VERSION')
+            (appV[v.detid] = true), (appV.length = appV.length + 1);
+        }
+        getSearchData({
+          gcode: 'APP_VERSION',
+          source: this.form.app,
+        }).then(r => {
+          let version = [
+            {
+              label: '不限',
+              value: -1,
+            },
+          ];
+          r.map(v => {
+            if ((appV.length && appV[v.mcode]) || appV.length === 0)
+              version.push({
+                value: v.mname,
+                label: v.mname,
+              });
+          });
+          this.version = version;
+          this.form = {
+            ...this.form,
+            version: [-1],
+          };
+        });
+      });
+    },
+    changeversion(v) {
+      if (!v.length) return (this.form.version = [-1]);
+      const last = v[v.length - 1];
+      if (last == -1) return (this.form.version = [-1]);
+      let ver = [];
+      for (let i = 0; i < v.length; i++) {
+        const element = v[i];
+        if (element == -1) continue;
+        ver.push(element);
+      }
+      this.form.version = ver;
+    },
+  },
+  components: {
+    countTo,
+  },
+};
+</script>
+
+<style>
+.Content {
+  margin: 10px 15px;
+}
+.btn-next i,
+.btn-prev i {
+  margin: 0 auto;
+}
+.caret-wrapper .ascending {
+  display: none;
+}
+.head {
+  display: flex;
+  font-weight: 500;
+}
+.head .head-item {
+  flex: 1;
+  text-align: center;
+  font-size: 0.8em;
+  border-top: 3px solid #fff;
+  padding-top: 10px;
+}
+.head .value {
+  margin: 15px 0;
+  color: #396fff;
+  font-size: 25px;
+}
+</style>

+ 417 - 0
src/views/NMedia/contentDay/index.vue

@@ -0,0 +1,417 @@
+<template>
+  <div class="Content">
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item>新媒体</el-breadcrumb-item>
+      <el-breadcrumb-item>应用分析</el-breadcrumb-item>
+      <el-breadcrumb-item>内容日传播分析</el-breadcrumb-item>
+    </el-breadcrumb>
+    <el-card class="box-card">
+      <el-form
+        ref="form"
+        :model="form"
+        size="small"
+        :inline="true"
+        label-width="120px"
+        class="demo-form-inline"
+      >
+        <el-form-item label="日期">
+          <el-date-picker
+            v-if="form.date.length"
+            v-model="form.date"
+            type="daterange"
+            :disabled-date="time => disabledDate(time)"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            :clearable="false"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="应用">
+          <el-select
+            v-model="form.app"
+            placeholder="请选择时段"
+            @change="change"
+          >
+            <el-option
+              v-for="item in cycle"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+              :disabled="item.disabled"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="版本">
+          <el-select
+            filterable
+            multiple
+            collapse-tags
+            clearable
+            v-model="form.version"
+            placeholder="请选择版本"
+            @change="changeversion"
+          >
+            <el-option
+              v-for="item in version"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+              :disabled="item.disabled"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item style="float: right">
+          <el-button type="primary" @click="onSubmit">查询</el-button>
+
+          <el-button
+            size="small"
+            style="margin-left: 0.5em"
+            type="primary"
+            @click="onExport"
+          >
+            导出
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <br />
+    <el-card class="box-card">
+      <el-table
+        :data="table || []"
+        style="width: 100%"
+        :header-cell-style="{
+          backgroundColor: '#f4f5f7',
+          color: '#606266',
+        }"
+      >
+        <el-table-column
+          show-overflow-tooltip
+          label="应用名称"
+          header-align="center"
+          align="center"
+        >
+          <template #default>
+            <span>{{ lastParams.app || '-' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          show-overflow-tooltip
+          label="日期"
+          header-align="center"
+          align="center"
+          prop="dtf"
+        >
+        </el-table-column>
+        <el-table-column
+          label="累计访问次数"
+          header-align="center"
+          align="center"
+          prop="pv"
+        >
+          <template #default="scope">
+            <countTo
+              :startVal="scope.row.pv || 0"
+              :endVal="scope.row.pv || 0"
+              :duration="100"
+            ></countTo>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="累计访问用户数"
+          header-align="center"
+          align="center"
+          prop="uv"
+        >
+          <template #default="scope">
+            <countTo
+              :startVal="scope.row.uv || 0"
+              :endVal="scope.row.uv || 0"
+              :duration="100"
+            ></countTo>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="日访问最高稿件"
+          header-align="center"
+          align="center"
+        >
+          <el-table-column
+            prop="title"
+            header-align="center"
+            align="center"
+            show-overflow-tooltip
+            label="标题"
+          />
+          <el-table-column
+            label="浏览量"
+            header-align="center"
+            align="center"
+            prop="cpv"
+          >
+            <template #default="scope">
+              <countTo
+                :startVal="scope.row.cpv || 0"
+                :endVal="scope.row.cpv || 0"
+                :duration="100"
+              ></countTo>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="阅读量"
+            header-align="center"
+            align="center"
+            prop="cuser"
+          >
+            <template #default="scope">
+              <countTo
+                :startVal="scope.row.cuser || 0"
+                :endVal="scope.row.cuser || 0"
+                :duration="100"
+              ></countTo>
+            </template>
+          </el-table-column>
+        </el-table-column>
+      </el-table>
+    </el-card>
+  </div>
+</template>
+<script>
+// @ is an alias to /src
+import { getRule, getAppList, getSearchData } from '@/api/index';
+import { getContentDayList } from '@/api/newMdeiaApi';
+
+import countTo from '@/components/counto/vue-countTo.vue';
+
+import config from '@/config/index';
+export default {
+  name: 'Version',
+  data() {
+    return {
+      lastParams: {},
+      table: [],
+      numType: 'newUser',
+      form: {
+        app: '',
+        version: [],
+        date: [],
+      },
+      cycle: [],
+      showList: [],
+      version: [],
+    };
+  },
+  async mounted() {
+    const { source, appV, appli, appVLi } = await this.getAppListFunc();
+    const keys = {
+      value: 'mname',
+      label: 'mname',
+    };
+    this.cycle = this.verifyList(appli, source, keys, false);
+    this.version = this.verifyList(appVLi, appV, keys, true);
+    this.form = {
+      //   app: (this.cycle[0] || { value: "" }).value,
+      app: '起点新闻',
+      version: [(this.version[0] || { value: '' }).value],
+      date: [new Date(Date.now() - 604800000), new Date(Date.now() - 86400000)],
+    };
+    this.onSubmit();
+  },
+  computed: {},
+  methods: {
+    verifyList(list, verify, obj, more) {
+      if (!obj) return;
+      let li = list || [];
+      const out = [];
+      more && out.push({ value: -1, label: '不限' });
+      for (let i = 0; i < li.length; i++) {
+        const v = li[i];
+        if (verify.length !== 0 && !verify[v.mcode]) continue;
+        out.push({
+          value: v[obj.value],
+          label: v[obj.label],
+        });
+      }
+      return out;
+    },
+    onSubmit() {
+      this.lastParams = {
+        app: this.form.app,
+        start: this.FormData(this.form.date[0]),
+        end: this.FormData(this.form.date[1]),
+        version: this.form.version == -1 ? undefined : this.form.version,
+      };
+      getContentDayList(this.lastParams).then(r => {
+        this.table = r || {};
+      });
+    },
+    async getAppListFunc() {
+      const { r, li, appVersion } = await this.getAppListOri();
+      let source = { length: 0 },
+        appli = [];
+      let appV = { length: 0 },
+        appVLi = [];
+      let prvList =
+        (r.output && r.output.data && r.output.data.prvRolectrl) || [];
+      for (let i = 0; i < prvList.length; i++) {
+        const v = prvList[i];
+        if (v.controlid == 'RMT_SOURCE')
+          (source[v.detid] = true), (source.length = source.length + 1);
+        if (v.controlid == 'APP_VERSION')
+          (appV[v.detid] = true), (appV.length = appV.length + 1);
+      }
+      if (li.status === '0') appli = li.output.data || [];
+      if (appVersion.length) appVLi = appVersion || [];
+      return {
+        source,
+        appV,
+        appli,
+        appVLi,
+      };
+    },
+    async getAppListOri() {
+      const roleid = JSON.parse(
+        window.parent.localStorage.userinfo || '{}'
+      ).roleid;
+      const r = await getRule({
+        db: 'authplat',
+        exportMark: '0',
+        menuid: 399,
+        roleid,
+      });
+      //   应用列表
+
+      const li = await getAppList({
+        exportMark: '0',
+        gcode: 'SOURCE',
+        pageid: 1,
+        pagesize: 1000,
+      });
+      const defaultAppName = '起点新闻';
+      //   应用版本列表
+      const appVersion = await getSearchData({
+        gcode: 'APP_VERSION',
+        source: defaultAppName,
+      });
+      return { r, li, appVersion };
+    },
+    disabledDate(time) {
+      const first = new Date('2021-06-21 00:00:00');
+      return (
+        time.getTime() > Date.now() - 86400000 ||
+        time.getTime() < first.getTime()
+      );
+    },
+    FormData(date) {
+      const d = new Date(date || Date.now() - 86400000);
+      const year = d.getFullYear();
+      const month =
+        d.getMonth() <= 8 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1;
+      const day = d.getDate() <= 9 ? '0' + d.getDate() : d.getDate();
+      return [year, month, day].join('-');
+    },
+    change() {
+      const roleid = JSON.parse(
+        window.parent.localStorage.userinfo || '{}'
+      ).roleid;
+      const appV = {
+        length: 0,
+      };
+      getRule({
+        db: 'authplat',
+        exportMark: '0',
+        menuid: 399,
+        roleid,
+      }).then(rule => {
+        let prvList =
+          (rule.output && rule.output.data && rule.output.data.prvRolectrl) ||
+          [];
+        for (let i = 0; i < prvList.length; i++) {
+          const v = prvList[i];
+          if (v.controlid == 'APP_VERSION')
+            (appV[v.detid] = true), (appV.length = appV.length + 1);
+        }
+        getSearchData({
+          gcode: 'APP_VERSION',
+          source: this.form.app,
+        }).then(r => {
+          let version = [
+            {
+              label: '不限',
+              value: -1,
+            },
+          ];
+          r.map(v => {
+            if ((appV.length && appV[v.mcode]) || appV.length === 0)
+              version.push({
+                value: v.mname,
+                label: v.mname,
+              });
+          });
+          this.version = version;
+          this.form = {
+            ...this.form,
+            version: [-1],
+          };
+        });
+      });
+    },
+    changeversion(v) {
+      if (!v.length) return (this.form.version = [-1]);
+      const last = v[v.length - 1];
+      if (last == -1) return (this.form.version = [-1]);
+      let ver = [];
+      for (let i = 0; i < v.length; i++) {
+        const element = v[i];
+        if (element == -1) continue;
+        ver.push(element);
+      }
+      this.form.version = ver;
+    },
+    onExport() {
+      const S = this.form.date[0]
+        ? this.FormData(this.form.date[0])
+        : undefined;
+      const E = this.form.date[1]
+        ? this.FormData(this.form.date[1])
+        : undefined;
+      const app = this.lastParams.app || this.form.app;
+      const version =
+        this.form.version == -1 ? undefined : this.form.version.join(',');
+      let url =
+        config.base.url2 +
+        '/new-media/content/daily-export?start=' +
+        S +
+        '&end=' +
+        E +
+        '&app=' +
+        app;
+      version && (url += '&version=' + version);
+      window.open(url);
+    },
+  },
+  components: {
+    countTo,
+  },
+};
+</script>
+
+<style>
+.Content {
+  margin: 10px 15px;
+}
+.libTitle {
+  color: tomato;
+  font-weight: 700;
+  font-size: 14px;
+}
+.btn-next i,
+.btn-prev i {
+  margin: 0 auto;
+}
+.caret-wrapper .ascending {
+  display: none;
+}
+</style>