|
@@ -98,12 +98,31 @@
|
|
|
</el-form-item>
|
|
|
<el-form-item style="float: right">
|
|
|
<el-button type="primary" @click="onSubmit">查询</el-button>
|
|
|
+ <el-button size="small" type="primary" @click="onExport">
|
|
|
+ 导出
|
|
|
+ </el-button>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
</el-card>
|
|
|
<br />
|
|
|
<el-card class="box-card">
|
|
|
- <el-row :gutter="20">
|
|
|
+ <div class="head" v-if="total">
|
|
|
+ <div v-for="(item, i) in 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>
|
|
|
+ <!-- 2023年2月1号 因为下边表格同样具备top性质,所以隐藏顶部top -->
|
|
|
+ <el-row :gutter="20" v-if="false">
|
|
|
<el-col :span="6" v-for="(v, i) in top" :key="i + v.name">
|
|
|
<div class="libTitle" v-text="v.name"></div>
|
|
|
<el-table
|
|
@@ -136,34 +155,20 @@
|
|
|
<br />
|
|
|
<div ref="regionChart"></div>
|
|
|
<br />
|
|
|
- <el-row>
|
|
|
- <el-col :span="8">
|
|
|
- <el-input
|
|
|
- size="small"
|
|
|
- v-model="match"
|
|
|
- clearable
|
|
|
- style="width: 300px"
|
|
|
- placeholder="请输入内容ID或内容标题"
|
|
|
- class="input-with-select"
|
|
|
- >
|
|
|
- <template #append>
|
|
|
- <el-button @click="onSubmit">
|
|
|
- <el-icon><Search /></el-icon>
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </el-input>
|
|
|
- </el-col>
|
|
|
- <el-col :span="16">
|
|
|
- <el-button
|
|
|
- size="small"
|
|
|
- style="float: right"
|
|
|
- type="primary"
|
|
|
- @click="onExport"
|
|
|
- >
|
|
|
- 导出
|
|
|
+ <el-input
|
|
|
+ size="small"
|
|
|
+ v-model="match"
|
|
|
+ clearable
|
|
|
+ style="width: 300px"
|
|
|
+ placeholder="请输入内容ID或内容标题"
|
|
|
+ class="input-with-select"
|
|
|
+ >
|
|
|
+ <template #append>
|
|
|
+ <el-button @click="onSubmit">
|
|
|
+ <el-icon><Search /></el-icon>
|
|
|
</el-button>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
+ </template>
|
|
|
+ </el-input>
|
|
|
<br />
|
|
|
<br />
|
|
|
<el-table
|
|
@@ -205,7 +210,7 @@
|
|
|
align="center"
|
|
|
>
|
|
|
<template #default>
|
|
|
- <span>{{ lastParams.app || "-" }}</span>
|
|
|
+ <span>{{ lastParams.app || '-' }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column
|
|
@@ -224,7 +229,7 @@
|
|
|
header-align="center"
|
|
|
align="center"
|
|
|
sortable
|
|
|
- :sort-orders="['descending', null]"
|
|
|
+ :sort-orders="['ascending', 'descending', null]"
|
|
|
prop="cduration"
|
|
|
>
|
|
|
<template #default="scope">
|
|
@@ -236,7 +241,7 @@
|
|
|
header-align="center"
|
|
|
align="center"
|
|
|
sortable
|
|
|
- :sort-orders="['descending', null]"
|
|
|
+ :sort-orders="['ascending', 'descending', null]"
|
|
|
prop="cpv"
|
|
|
>
|
|
|
<template #default="scope">
|
|
@@ -252,7 +257,7 @@
|
|
|
header-align="center"
|
|
|
align="center"
|
|
|
sortable
|
|
|
- :sort-orders="['descending', null]"
|
|
|
+ :sort-orders="['ascending', 'descending', null]"
|
|
|
prop="csupport"
|
|
|
>
|
|
|
<template #default="scope">
|
|
@@ -268,7 +273,7 @@
|
|
|
header-align="center"
|
|
|
align="center"
|
|
|
sortable
|
|
|
- :sort-orders="['descending', null]"
|
|
|
+ :sort-orders="['ascending', 'descending', null]"
|
|
|
prop="ccollect"
|
|
|
>
|
|
|
<template #default="scope">
|
|
@@ -284,7 +289,7 @@
|
|
|
header-align="center"
|
|
|
align="center"
|
|
|
sortable
|
|
|
- :sort-orders="['descending', null]"
|
|
|
+ :sort-orders="['ascending', 'descending', null]"
|
|
|
prop="cshare"
|
|
|
>
|
|
|
<template #default="scope">
|
|
@@ -300,7 +305,7 @@
|
|
|
header-align="center"
|
|
|
align="center"
|
|
|
sortable
|
|
|
- :sort-orders="['descending', null]"
|
|
|
+ :sort-orders="['ascending', 'descending', null]"
|
|
|
prop="ccomments"
|
|
|
>
|
|
|
<template #default="scope">
|
|
@@ -316,7 +321,7 @@
|
|
|
header-align="center"
|
|
|
align="center"
|
|
|
sortable
|
|
|
- :sort-orders="['descending', null]"
|
|
|
+ :sort-orders="['ascending', 'descending', null]"
|
|
|
prop="cuser"
|
|
|
>
|
|
|
<template #default="scope">
|
|
@@ -342,7 +347,7 @@
|
|
|
</template>
|
|
|
<script>
|
|
|
// @ is an alias to /src
|
|
|
-import { Search } from "@element-plus/icons-vue";
|
|
|
+import { Search } from '@element-plus/icons-vue';
|
|
|
import {
|
|
|
getRule,
|
|
|
getAppList,
|
|
@@ -350,19 +355,20 @@ import {
|
|
|
getContentTop10,
|
|
|
getContentChart,
|
|
|
getContentPage,
|
|
|
-} from "@/api/index";
|
|
|
+ getContentTotle,
|
|
|
+} from '@/api/index';
|
|
|
|
|
|
-import countTo from "@/components/counto/vue-countTo.vue";
|
|
|
-import * as echarts from "echarts/core";
|
|
|
-import { LineChart } from "echarts/charts";
|
|
|
+import countTo from '@/components/counto/vue-countTo.vue';
|
|
|
+import * as echarts from 'echarts/core';
|
|
|
+import { LineChart } from 'echarts/charts';
|
|
|
import {
|
|
|
TitleComponent,
|
|
|
TooltipComponent,
|
|
|
GridComponent,
|
|
|
ToolboxComponent,
|
|
|
LegendComponent,
|
|
|
-} from "echarts/components";
|
|
|
-import { CanvasRenderer } from "echarts/renderers";
|
|
|
+} from 'echarts/components';
|
|
|
+import { CanvasRenderer } from 'echarts/renderers';
|
|
|
echarts.use([
|
|
|
TitleComponent,
|
|
|
TooltipComponent,
|
|
@@ -373,27 +379,28 @@ echarts.use([
|
|
|
LegendComponent,
|
|
|
]);
|
|
|
|
|
|
-import config from "@/config/index";
|
|
|
+import config from '@/config/index';
|
|
|
let chart = undefined;
|
|
|
export default {
|
|
|
- name: "Content",
|
|
|
+ name: 'Content',
|
|
|
data() {
|
|
|
return {
|
|
|
lastParams: {},
|
|
|
table: {},
|
|
|
form: {
|
|
|
- app: "",
|
|
|
+ app: '',
|
|
|
version: [],
|
|
|
date: [],
|
|
|
- content: "",
|
|
|
- client: "",
|
|
|
+ content: '',
|
|
|
+ client: '',
|
|
|
},
|
|
|
- match: "",
|
|
|
+ match: '',
|
|
|
cycle: [],
|
|
|
showList: [],
|
|
|
version: [],
|
|
|
content: [],
|
|
|
top: [],
|
|
|
+ total: [],
|
|
|
client: [],
|
|
|
};
|
|
|
},
|
|
@@ -410,8 +417,8 @@ export default {
|
|
|
clentli,
|
|
|
} = await this.getAppListFunc();
|
|
|
const keys = {
|
|
|
- value: "mname",
|
|
|
- label: "mname",
|
|
|
+ value: 'mname',
|
|
|
+ label: 'mname',
|
|
|
};
|
|
|
const clentliList = clentli.find(r => r.mdefault) || false;
|
|
|
let client = clentliList ? clentliList.mcode.toString() : -1;
|
|
@@ -422,21 +429,21 @@ export default {
|
|
|
clentli,
|
|
|
clentV,
|
|
|
{
|
|
|
- value: "mcode",
|
|
|
- label: "mname",
|
|
|
+ value: 'mcode',
|
|
|
+ label: 'mname',
|
|
|
},
|
|
|
true
|
|
|
);
|
|
|
this.form = {
|
|
|
// app: (this.cycle[0] || { value: "" }).value,
|
|
|
- app: "起点新闻",
|
|
|
- version: [(this.version[0] || { value: "" }).value],
|
|
|
+ app: '起点新闻',
|
|
|
+ version: [(this.version[0] || { value: '' }).value],
|
|
|
content: -1,
|
|
|
date: [new Date(Date.now() - 604800000), new Date(Date.now() - 86400000)],
|
|
|
client,
|
|
|
page: 1,
|
|
|
size: 20,
|
|
|
- sortBy: "",
|
|
|
+ sortBy: '',
|
|
|
};
|
|
|
this.onSubmit();
|
|
|
},
|
|
@@ -444,16 +451,26 @@ export default {
|
|
|
methods: {
|
|
|
tableChange(e) {
|
|
|
this.form.page = 1;
|
|
|
- this.form.sortBy = e.column ? e.column.property : "";
|
|
|
- this.lastParams.sortBy = e.column ? e.column.property : "";
|
|
|
- this.lastParams.page = 1;
|
|
|
+ this.form.sortBy = e.column ? e.column.property : '';
|
|
|
+ this.lastParams.sortBy = this.form.sortBy;
|
|
|
+ this.lastParams.page = this.form.page;
|
|
|
+ const sortLibType = {
|
|
|
+ descending: 1,
|
|
|
+ ascending: 0,
|
|
|
+ };
|
|
|
+ if (e.order) {
|
|
|
+ this.form.order = sortLibType[e.order];
|
|
|
+ } else {
|
|
|
+ this.form.order = '';
|
|
|
+ }
|
|
|
+ this.lastParams.order = this.form.order;
|
|
|
getContentPage(this.lastParams).then(r => (this.table = r || {}));
|
|
|
},
|
|
|
verifyList(list, verify, obj, more) {
|
|
|
if (!obj) return;
|
|
|
let li = list || [];
|
|
|
const out = [];
|
|
|
- more && out.push({ value: -1, label: "不限" });
|
|
|
+ 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;
|
|
@@ -480,8 +497,18 @@ export default {
|
|
|
match: this.match,
|
|
|
sortBy: this.form.sortBy,
|
|
|
lib: this.form.client == -1 ? undefined : this.form.client,
|
|
|
+ order: this.form.order
|
|
|
};
|
|
|
getContentPage(this.lastParams).then(r => (this.table = r || {}));
|
|
|
+ getContentTotle({
|
|
|
+ start: this.FormData(this.form.date[0]),
|
|
|
+ end: this.FormData(this.form.date[1]),
|
|
|
+ app: this.form.app,
|
|
|
+ version: this.form.version == -1 ? undefined : this.form.version,
|
|
|
+ lib: this.form.client == -1 ? undefined : this.form.client,
|
|
|
+ }).then(r => {
|
|
|
+ this.total = r || [];
|
|
|
+ });
|
|
|
getContentTop10({
|
|
|
app: this.form.app,
|
|
|
start: this.FormData(this.form.date[0]),
|
|
@@ -512,7 +539,7 @@ export default {
|
|
|
const v = this.top[i];
|
|
|
if (!valueList[i]) valueList[i] = [];
|
|
|
if (titles.length < this.top.length)
|
|
|
- titles.push(v.name.split("T")[0]);
|
|
|
+ titles.push(v.name.split('T')[0]);
|
|
|
valueList[i].push(item[v.target] || 0);
|
|
|
}
|
|
|
}
|
|
@@ -534,14 +561,14 @@ export default {
|
|
|
});
|
|
|
chart.setOption({
|
|
|
tooltip: {
|
|
|
- trigger: "axis",
|
|
|
+ trigger: 'axis',
|
|
|
confine: true,
|
|
|
},
|
|
|
toolbox: {
|
|
|
feature: {
|
|
|
saveAsImage: {
|
|
|
- type: "jpg",
|
|
|
- name: "内容分析-" + this.form.app,
|
|
|
+ type: 'jpg',
|
|
|
+ name: '内容分析-' + this.form.app,
|
|
|
},
|
|
|
},
|
|
|
},
|
|
@@ -549,27 +576,27 @@ export default {
|
|
|
data: title,
|
|
|
},
|
|
|
grid: {
|
|
|
- left: "3%",
|
|
|
- right: "4%",
|
|
|
- bottom: "3%",
|
|
|
+ left: '3%',
|
|
|
+ right: '4%',
|
|
|
+ bottom: '3%',
|
|
|
containLabel: true,
|
|
|
},
|
|
|
xAxis: {
|
|
|
- type: "category",
|
|
|
+ type: 'category',
|
|
|
boundaryGap: true,
|
|
|
data: keyList,
|
|
|
},
|
|
|
yAxis: {
|
|
|
- type: "value",
|
|
|
+ type: 'value',
|
|
|
scale: true,
|
|
|
minInterval: 1,
|
|
|
axisLabel: {
|
|
|
formatter(v) {
|
|
|
let val = v;
|
|
|
if (val >= 100000000) {
|
|
|
- val = (val / 100000000).toFixed(2) + "亿";
|
|
|
+ val = (val / 100000000).toFixed(2) + '亿';
|
|
|
} else if (val >= 10000) {
|
|
|
- val = (val / 10000).toFixed(2) + "万";
|
|
|
+ val = (val / 10000).toFixed(2) + '万';
|
|
|
}
|
|
|
return val;
|
|
|
},
|
|
@@ -583,7 +610,7 @@ export default {
|
|
|
lineStyle: {
|
|
|
width: 1,
|
|
|
},
|
|
|
- type: "line",
|
|
|
+ type: 'line',
|
|
|
smooth: true,
|
|
|
};
|
|
|
}),
|
|
@@ -600,17 +627,18 @@ export default {
|
|
|
contentli = [];
|
|
|
let clentV = { length: 0 },
|
|
|
clentli = [];
|
|
|
- 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")
|
|
|
+ if (v.controlid == 'RMT_SOURCE')
|
|
|
(source[v.detid] = true), (source.length = source.length + 1);
|
|
|
- if (v.controlid == "APP_VERSION")
|
|
|
+ if (v.controlid == 'APP_VERSION')
|
|
|
(appV[v.detid] = true), (appV.length = appV.length + 1);
|
|
|
- if (v.controlid == "content_TYPE")
|
|
|
+ if (v.controlid == 'content_TYPE')
|
|
|
(contentV[v.detid] = true), (contentV.length = contentV.length + 1);
|
|
|
}
|
|
|
- if (li.status === "0") appli = li.output.data || [];
|
|
|
+ if (li.status === '0') appli = li.output.data || [];
|
|
|
if (appVersion.length) appVLi = appVersion || [];
|
|
|
if (contentList.length) contentli = contentList || [];
|
|
|
if (clientList.length) clentli = clientList || [];
|
|
@@ -627,46 +655,46 @@ export default {
|
|
|
},
|
|
|
async getAppListOri() {
|
|
|
const roleid = JSON.parse(
|
|
|
- window.parent.localStorage.userinfo || "{}"
|
|
|
+ window.parent.localStorage.userinfo || '{}'
|
|
|
).roleid;
|
|
|
const r = await getRule({
|
|
|
- db: "authplat",
|
|
|
- exportMark: "0",
|
|
|
+ db: 'authplat',
|
|
|
+ exportMark: '0',
|
|
|
menuid: 399,
|
|
|
roleid,
|
|
|
});
|
|
|
- const defaultAppName = "起点新闻";
|
|
|
+ const defaultAppName = '起点新闻';
|
|
|
// 端列表
|
|
|
const clientList = await getSearchData({
|
|
|
- gcode: "CLIENT_TYPE",
|
|
|
+ gcode: 'CLIENT_TYPE',
|
|
|
source: defaultAppName,
|
|
|
});
|
|
|
// 应用列表
|
|
|
|
|
|
const li = await getAppList({
|
|
|
- exportMark: "0",
|
|
|
- gcode: "SOURCE",
|
|
|
+ exportMark: '0',
|
|
|
+ gcode: 'SOURCE',
|
|
|
pageid: 1,
|
|
|
pagesize: 1000,
|
|
|
});
|
|
|
// 应用版本列表
|
|
|
const appVersion = await getSearchData({
|
|
|
- gcode: "APP_VERSION",
|
|
|
+ gcode: 'APP_VERSION',
|
|
|
source: defaultAppName,
|
|
|
});
|
|
|
// 端列表
|
|
|
let contentList = await getAppList({
|
|
|
- exportMark: "0",
|
|
|
- gcode: "CONTENT_TYPE",
|
|
|
+ exportMark: '0',
|
|
|
+ gcode: 'CONTENT_TYPE',
|
|
|
pageid: 1,
|
|
|
pagesize: 1000,
|
|
|
});
|
|
|
contentList =
|
|
|
- contentList.status == "0" ? contentList.output.data || [] : [];
|
|
|
+ contentList.status == '0' ? contentList.output.data || [] : [];
|
|
|
return { r, li, appVersion, contentList, clientList };
|
|
|
},
|
|
|
disabledDate(time) {
|
|
|
- const first = new Date("2021-06-21 00:00:00");
|
|
|
+ const first = new Date('2021-06-21 00:00:00');
|
|
|
return (
|
|
|
time.getTime() > Date.now() - 86400000 ||
|
|
|
time.getTime() < first.getTime()
|
|
@@ -676,9 +704,9 @@ export default {
|
|
|
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("-");
|
|
|
+ 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('-');
|
|
|
},
|
|
|
timeFormat(t) {
|
|
|
const Time = t || 0;
|
|
@@ -686,40 +714,42 @@ export default {
|
|
|
let hour = (Time - mH) / 3600;
|
|
|
let min = (mH - (mH % 60)) / 60;
|
|
|
let son = Number(mH % 60).toFixed(0);
|
|
|
- hour = hour <= 9 ? "0" + hour : hour;
|
|
|
- min = min <= 9 ? "0" + min : min;
|
|
|
- son = son <= 9 ? "0" + son : son;
|
|
|
+ hour = hour <= 9 ? '0' + hour : hour;
|
|
|
+ min = min <= 9 ? '0' + min : min;
|
|
|
+ son = son <= 9 ? '0' + son : son;
|
|
|
let out = [];
|
|
|
if (hour * 1 > 0) out.push(hour);
|
|
|
out.push(...[min, son]);
|
|
|
- return out.join(":");
|
|
|
+ return out.join(':');
|
|
|
},
|
|
|
change() {
|
|
|
const roleid = JSON.parse(
|
|
|
- window.parent.localStorage.userinfo || "{}"
|
|
|
+ window.parent.localStorage.userinfo || '{}'
|
|
|
).roleid;
|
|
|
const appV = {
|
|
|
length: 0,
|
|
|
};
|
|
|
getRule({
|
|
|
- db: "authplat",
|
|
|
- exportMark: "0",
|
|
|
+ db: 'authplat',
|
|
|
+ exportMark: '0',
|
|
|
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")
|
|
|
+ if (v.controlid == 'APP_VERSION')
|
|
|
(appV[v.detid] = true), (appV.length = appV.length + 1);
|
|
|
}
|
|
|
getSearchData({
|
|
|
- gcode: "APP_VERSION",
|
|
|
+ gcode: 'APP_VERSION',
|
|
|
source: this.form.app,
|
|
|
}).then(r => {
|
|
|
let version = [
|
|
|
{
|
|
|
- label: "不限",
|
|
|
+ label: '不限',
|
|
|
value: -1,
|
|
|
},
|
|
|
];
|
|
@@ -759,18 +789,18 @@ export default {
|
|
|
: undefined;
|
|
|
const app = this.lastParams.app || this.form.app;
|
|
|
const version =
|
|
|
- this.form.version == -1 ? undefined : this.form.version.join(",");
|
|
|
+ this.form.version == -1 ? undefined : this.form.version.join(',');
|
|
|
const contentType = this.lastParams.contentType || this.form.contentType;
|
|
|
let url =
|
|
|
config.base.leverAudience +
|
|
|
- "/cxzx-program/new-media/content/export?start=" +
|
|
|
+ '/cxzx-program/new-media/content/export?start=' +
|
|
|
S +
|
|
|
- "&end=" +
|
|
|
+ '&end=' +
|
|
|
E +
|
|
|
- "&app=" +
|
|
|
+ '&app=' +
|
|
|
app;
|
|
|
- version && (url += "&version=" + version);
|
|
|
- contentType && (url += "&contentType=" + contentType);
|
|
|
+ version && (url += '&version=' + version);
|
|
|
+ contentType && (url += '&contentType=' + contentType);
|
|
|
window.open(url);
|
|
|
},
|
|
|
},
|
|
@@ -794,7 +824,20 @@ export default {
|
|
|
.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>
|