index.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <template>
  2. <div class="Content">
  3. <el-breadcrumb separator-class="el-icon-arrow-right">
  4. <el-breadcrumb-item>新媒体</el-breadcrumb-item>
  5. <el-breadcrumb-item>应用分析</el-breadcrumb-item>
  6. <el-breadcrumb-item>内容日传播分析</el-breadcrumb-item>
  7. </el-breadcrumb>
  8. <el-card class="box-card">
  9. <el-form
  10. ref="form"
  11. :model="form"
  12. size="small"
  13. :inline="true"
  14. label-width="120px"
  15. class="demo-form-inline"
  16. >
  17. <el-form-item label="日期">
  18. <el-date-picker
  19. v-if="form.date.length"
  20. v-model="form.date"
  21. type="daterange"
  22. :disabled-date="time => disabledDate(time)"
  23. range-separator="-"
  24. start-placeholder="开始日期"
  25. end-placeholder="结束日期"
  26. :clearable="false"
  27. >
  28. </el-date-picker>
  29. </el-form-item>
  30. <el-form-item label="应用">
  31. <el-select
  32. v-model="form.app"
  33. placeholder="请选择时段"
  34. @change="change"
  35. >
  36. <el-option
  37. v-for="item in cycle"
  38. :key="item.value"
  39. :label="item.label"
  40. :value="item.value"
  41. :disabled="item.disabled"
  42. >
  43. </el-option>
  44. </el-select>
  45. </el-form-item>
  46. <el-form-item label="版本">
  47. <el-select
  48. filterable
  49. multiple
  50. collapse-tags
  51. clearable
  52. v-model="form.version"
  53. placeholder="请选择版本"
  54. @change="changeversion"
  55. >
  56. <el-option
  57. v-for="item in version"
  58. :key="item.value"
  59. :label="item.label"
  60. :value="item.value"
  61. :disabled="item.disabled"
  62. >
  63. </el-option>
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item style="float: right">
  67. <el-button type="primary" @click="onSubmit">查询</el-button>
  68. <el-button
  69. size="small"
  70. style="margin-left: 0.5em"
  71. type="primary"
  72. @click="onExport"
  73. >
  74. 导出
  75. </el-button>
  76. </el-form-item>
  77. </el-form>
  78. </el-card>
  79. <br />
  80. <el-card class="box-card">
  81. <el-table
  82. :data="table || []"
  83. style="width: 100%"
  84. :header-cell-style="{
  85. backgroundColor: '#f4f5f7',
  86. color: '#606266',
  87. }"
  88. >
  89. <el-table-column
  90. show-overflow-tooltip
  91. label="应用名称"
  92. header-align="center"
  93. align="center"
  94. >
  95. <template #default>
  96. <span>{{ lastParams.app || '-' }}</span>
  97. </template>
  98. </el-table-column>
  99. <el-table-column
  100. show-overflow-tooltip
  101. label="日期"
  102. header-align="center"
  103. align="center"
  104. prop="dtf"
  105. >
  106. </el-table-column>
  107. <el-table-column
  108. label="累计访问次数"
  109. header-align="center"
  110. align="center"
  111. prop="pv"
  112. >
  113. <template #default="scope">
  114. <countTo
  115. :startVal="scope.row.pv || 0"
  116. :endVal="scope.row.pv || 0"
  117. :duration="100"
  118. ></countTo>
  119. </template>
  120. </el-table-column>
  121. <el-table-column
  122. label="累计访问用户数"
  123. header-align="center"
  124. align="center"
  125. prop="uv"
  126. >
  127. <template #default="scope">
  128. <countTo
  129. :startVal="scope.row.uv || 0"
  130. :endVal="scope.row.uv || 0"
  131. :duration="100"
  132. ></countTo>
  133. </template>
  134. </el-table-column>
  135. <el-table-column
  136. label="日访问最高稿件"
  137. header-align="center"
  138. align="center"
  139. >
  140. <el-table-column
  141. prop="title"
  142. header-align="center"
  143. align="center"
  144. show-overflow-tooltip
  145. label="标题"
  146. />
  147. <el-table-column
  148. label="浏览量"
  149. header-align="center"
  150. align="center"
  151. prop="cpv"
  152. >
  153. <template #default="scope">
  154. <countTo
  155. :startVal="scope.row.cpv || 0"
  156. :endVal="scope.row.cpv || 0"
  157. :duration="100"
  158. ></countTo>
  159. </template>
  160. </el-table-column>
  161. <el-table-column
  162. label="阅读量"
  163. header-align="center"
  164. align="center"
  165. prop="cuser"
  166. >
  167. <template #default="scope">
  168. <countTo
  169. :startVal="scope.row.cuser || 0"
  170. :endVal="scope.row.cuser || 0"
  171. :duration="100"
  172. ></countTo>
  173. </template>
  174. </el-table-column>
  175. </el-table-column>
  176. </el-table>
  177. </el-card>
  178. </div>
  179. </template>
  180. <script>
  181. // @ is an alias to /src
  182. import { getRule, getAppList, getSearchData } from '@/api/index';
  183. import { getContentDayList } from '@/api/newMdeiaApi';
  184. import countTo from '@/components/counto/vue-countTo.vue';
  185. import { defaultAppNameFunc } from '@/utils/tool.js';
  186. import config from '@/config/index';
  187. export default {
  188. name: 'Version',
  189. data() {
  190. return {
  191. lastParams: {},
  192. table: [],
  193. numType: 'newUser',
  194. form: {
  195. app: '',
  196. version: [],
  197. date: [],
  198. },
  199. cycle: [],
  200. showList: [],
  201. version: [],
  202. };
  203. },
  204. async mounted() {
  205. const { source, appV, appli, appVLi } = await this.getAppListFunc();
  206. const keys = {
  207. value: 'mname',
  208. label: 'mname',
  209. };
  210. this.cycle = this.verifyList(appli, source, keys, false);
  211. this.version = this.verifyList(appVLi, appV, keys, true);
  212. this.form = {
  213. // app: (this.cycle[0] || { value: "" }).value,
  214. app: defaultAppNameFunc(this.cycle),
  215. version: [(this.version[0] || { value: '' }).value],
  216. date: [new Date(Date.now() - 604800000), new Date(Date.now() - 86400000)],
  217. };
  218. this.onSubmit();
  219. },
  220. computed: {},
  221. methods: {
  222. verifyList(list, verify, obj, more) {
  223. if (!obj) return;
  224. let li = list || [];
  225. const out = [];
  226. more && out.push({ value: -1, label: '不限' });
  227. for (let i = 0; i < li.length; i++) {
  228. const v = li[i];
  229. if (verify.length !== 0 && !verify[v.mcode]) continue;
  230. out.push({
  231. value: v[obj.value],
  232. label: v[obj.label],
  233. });
  234. }
  235. return out;
  236. },
  237. onSubmit() {
  238. this.lastParams = {
  239. app: this.form.app,
  240. start: this.FormData(this.form.date[0]),
  241. end: this.FormData(this.form.date[1]),
  242. version: this.form.version == -1 ? undefined : this.form.version,
  243. };
  244. getContentDayList(this.lastParams).then(r => {
  245. this.table = r || {};
  246. });
  247. },
  248. async getAppListFunc() {
  249. const { r, li, appVersion } = await this.getAppListOri();
  250. let source = { length: 0 },
  251. appli = [];
  252. let appV = { length: 0 },
  253. appVLi = [];
  254. let prvList =
  255. (r.output && r.output.data && r.output.data.prvRolectrl) || [];
  256. for (let i = 0; i < prvList.length; i++) {
  257. const v = prvList[i];
  258. if (v.controlid == 'RMT_SOURCE')
  259. (source[v.detid] = true), (source.length = source.length + 1);
  260. if (v.controlid == 'APP_VERSION')
  261. (appV[v.detid] = true), (appV.length = appV.length + 1);
  262. }
  263. if (li.status === '0') appli = li.output.data || [];
  264. if (appVersion.length) appVLi = appVersion || [];
  265. return {
  266. source,
  267. appV,
  268. appli,
  269. appVLi,
  270. };
  271. },
  272. async getAppListOri() {
  273. const roleid = JSON.parse(
  274. window.parent.localStorage.userinfo || '{}'
  275. ).roleid;
  276. const r = await getRule({
  277. db: 'authplat',
  278. exportMark: '0',
  279. menuid: 399,
  280. roleid,
  281. });
  282. // 应用列表
  283. const li = await getAppList({
  284. exportMark: '0',
  285. gcode: 'SOURCE',
  286. pageid: 1,
  287. pagesize: 1000,
  288. });
  289. const cycle = li.output ? li.output.data || [] : [];
  290. // 应用版本列表
  291. const appVersion = await getSearchData({
  292. gcode: 'APP_VERSION',
  293. source: defaultAppNameFunc(cycle, 'mname'),
  294. });
  295. return { r, li, appVersion };
  296. },
  297. disabledDate(time) {
  298. const first = new Date('2021-06-21 00:00:00');
  299. return (
  300. time.getTime() > Date.now() - 86400000 ||
  301. time.getTime() < first.getTime()
  302. );
  303. },
  304. FormData(date) {
  305. const d = new Date(date || Date.now() - 86400000);
  306. const year = d.getFullYear();
  307. const month =
  308. d.getMonth() <= 8 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1;
  309. const day = d.getDate() <= 9 ? '0' + d.getDate() : d.getDate();
  310. return [year, month, day].join('-');
  311. },
  312. change() {
  313. const roleid = JSON.parse(
  314. window.parent.localStorage.userinfo || '{}'
  315. ).roleid;
  316. const appV = {
  317. length: 0,
  318. };
  319. getRule({
  320. db: 'authplat',
  321. exportMark: '0',
  322. menuid: 399,
  323. roleid,
  324. }).then(rule => {
  325. let prvList =
  326. (rule.output && rule.output.data && rule.output.data.prvRolectrl) ||
  327. [];
  328. for (let i = 0; i < prvList.length; i++) {
  329. const v = prvList[i];
  330. if (v.controlid == 'APP_VERSION')
  331. (appV[v.detid] = true), (appV.length = appV.length + 1);
  332. }
  333. getSearchData({
  334. gcode: 'APP_VERSION',
  335. source: this.form.app,
  336. }).then(r => {
  337. let version = [
  338. {
  339. label: '不限',
  340. value: -1,
  341. },
  342. ];
  343. r.map(v => {
  344. if ((appV.length && appV[v.mcode]) || appV.length === 0)
  345. version.push({
  346. value: v.mname,
  347. label: v.mname,
  348. });
  349. });
  350. this.version = version;
  351. this.form = {
  352. ...this.form,
  353. version: [-1],
  354. };
  355. });
  356. });
  357. },
  358. changeversion(v) {
  359. if (!v.length) return (this.form.version = [-1]);
  360. const last = v[v.length - 1];
  361. if (last == -1) return (this.form.version = [-1]);
  362. let ver = [];
  363. for (let i = 0; i < v.length; i++) {
  364. const element = v[i];
  365. if (element == -1) continue;
  366. ver.push(element);
  367. }
  368. this.form.version = ver;
  369. },
  370. onExport() {
  371. const S = this.form.date[0]
  372. ? this.FormData(this.form.date[0])
  373. : undefined;
  374. const E = this.form.date[1]
  375. ? this.FormData(this.form.date[1])
  376. : undefined;
  377. const app = this.lastParams.app || this.form.app;
  378. const version =
  379. this.form.version == -1 ? undefined : this.form.version.join(',');
  380. let url =
  381. config.base.url2 +
  382. '/new-media/content/daily-export?start=' +
  383. S +
  384. '&end=' +
  385. E +
  386. '&app=' +
  387. app;
  388. version && (url += '&version=' + version);
  389. window.open(url);
  390. },
  391. },
  392. components: {
  393. countTo,
  394. },
  395. };
  396. </script>
  397. <style>
  398. .Content {
  399. margin: 10px 15px;
  400. }
  401. .libTitle {
  402. color: tomato;
  403. font-weight: 700;
  404. font-size: 14px;
  405. }
  406. .btn-next i,
  407. .btn-prev i {
  408. margin: 0 auto;
  409. }
  410. .caret-wrapper .ascending {
  411. display: none;
  412. }
  413. </style>