index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843
  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. multiple
  49. collapse-tags
  50. clearable
  51. v-model="form.version"
  52. placeholder="请选择版本"
  53. @change="changeversion"
  54. >
  55. <el-option
  56. v-for="item in version"
  57. :key="item.value"
  58. :label="item.label"
  59. :value="item.value"
  60. :disabled="item.disabled"
  61. >
  62. </el-option>
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item label="内容类型">
  66. <el-select
  67. collapse-tags
  68. clearable
  69. v-model="form.content"
  70. placeholder="请选择内容"
  71. >
  72. <el-option
  73. v-for="item in content"
  74. :key="item.value"
  75. :label="item.label"
  76. :value="item.value"
  77. :disabled="item.disabled"
  78. >
  79. </el-option>
  80. </el-select>
  81. </el-form-item>
  82. <el-form-item label="来源">
  83. <el-select
  84. collapse-tags
  85. clearable
  86. v-model="form.client"
  87. placeholder="请选择来源"
  88. >
  89. <el-option
  90. v-for="item in client"
  91. :key="item.value"
  92. :label="item.label"
  93. :value="item.value"
  94. :disabled="item.disabled"
  95. >
  96. </el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item style="float: right">
  100. <el-button type="primary" @click="onSubmit">查询</el-button>
  101. <el-button size="small" type="primary" @click="onExport">
  102. 导出
  103. </el-button>
  104. </el-form-item>
  105. </el-form>
  106. </el-card>
  107. <br />
  108. <el-card class="box-card">
  109. <div class="head" v-if="total">
  110. <div v-for="(item, i) in total" :key="i + item.name" class="head-item">
  111. <div>{{ item.name }}</div>
  112. <div class="value">
  113. <!-- oriData.total.activeUser -->
  114. <countTo
  115. v-if="!isNaN(item.value)"
  116. :startVal="0"
  117. :endVal="item.value - 0"
  118. :duration="1500"
  119. ></countTo>
  120. <span v-else v-text="item.value"></span>
  121. </div>
  122. </div>
  123. </div>
  124. <!-- 2023年2月1号 因为下边表格同样具备top性质,所以隐藏顶部top -->
  125. <el-row :gutter="20" v-if="false">
  126. <el-col :span="6" v-for="(v, i) in top" :key="i + v.name">
  127. <div class="libTitle" v-text="v.name"></div>
  128. <el-table
  129. :data="v.list || []"
  130. style="width: 100%"
  131. :header-cell-style="{
  132. backgroundColor: '#f4f5f7',
  133. color: '#606266',
  134. }"
  135. >
  136. <el-table-column
  137. prop="title"
  138. header-align="center"
  139. align="center"
  140. label="标题"
  141. show-overflow-tooltip
  142. />
  143. <el-table-column label="次数" header-align="center" align="center">
  144. <template #default="scope">
  145. <countTo
  146. :startVal="0"
  147. :endVal="scope.row[v.target] || 0"
  148. :duration="100"
  149. ></countTo>
  150. </template>
  151. </el-table-column>
  152. </el-table>
  153. </el-col>
  154. </el-row>
  155. <br />
  156. <div ref="regionChart"></div>
  157. <br />
  158. <el-input
  159. size="small"
  160. v-model="match"
  161. clearable
  162. style="width: 300px"
  163. placeholder="请输入内容ID或内容标题"
  164. class="input-with-select"
  165. >
  166. <template #append>
  167. <el-button @click="onSubmit">
  168. <el-icon><Search /></el-icon>
  169. </el-button>
  170. </template>
  171. </el-input>
  172. <br />
  173. <br />
  174. <el-table
  175. :data="table.records || []"
  176. style="width: 100%"
  177. @sort-change="tableChange"
  178. :header-cell-style="{
  179. backgroundColor: '#f4f5f7',
  180. color: '#606266',
  181. }"
  182. >
  183. <el-table-column
  184. prop="contentId"
  185. header-align="center"
  186. align="center"
  187. label="内容ID"
  188. show-overflow-tooltip
  189. >
  190. <template #default="scope">
  191. <span v-text="scope.row.contentId || '-'"></span>
  192. </template>
  193. </el-table-column>
  194. <el-table-column
  195. prop="title"
  196. header-align="center"
  197. align="center"
  198. width="300"
  199. label="标题"
  200. show-overflow-tooltip
  201. >
  202. <template #default="scope">
  203. <span v-text="scope.row.title || '-'"></span>
  204. </template>
  205. </el-table-column>
  206. <el-table-column
  207. show-overflow-tooltip
  208. label="应用名称"
  209. header-align="center"
  210. align="center"
  211. >
  212. <template #default>
  213. <span>{{ lastParams.app || '-' }}</span>
  214. </template>
  215. </el-table-column>
  216. <el-table-column
  217. prop="publishTime"
  218. header-align="center"
  219. align="center"
  220. label="发布时间"
  221. show-overflow-tooltip
  222. >
  223. <template #default="scope">
  224. <span v-text="scope.row.publishTime || '-'"></span>
  225. </template>
  226. </el-table-column>
  227. <el-table-column
  228. label="平均阅读时长"
  229. header-align="center"
  230. align="center"
  231. sortable
  232. :sort-orders="['ascending', 'descending', null]"
  233. prop="cduration"
  234. >
  235. <template #default="scope">
  236. <span v-text="timeFormat(scope.row.cduration)"></span>
  237. </template>
  238. </el-table-column>
  239. <el-table-column
  240. label="阅读数"
  241. header-align="center"
  242. align="center"
  243. sortable
  244. :sort-orders="['ascending', 'descending', null]"
  245. prop="cpv"
  246. >
  247. <template #default="scope">
  248. <countTo
  249. :startVal="0"
  250. :endVal="scope.row.cpv || 0"
  251. :duration="100"
  252. ></countTo>
  253. </template>
  254. </el-table-column>
  255. <el-table-column
  256. label="点赞数"
  257. header-align="center"
  258. align="center"
  259. sortable
  260. :sort-orders="['ascending', 'descending', null]"
  261. prop="csupport"
  262. >
  263. <template #default="scope">
  264. <countTo
  265. :startVal="0"
  266. :endVal="scope.row.csupport || 0"
  267. :duration="100"
  268. ></countTo>
  269. </template>
  270. </el-table-column>
  271. <el-table-column
  272. label="收藏数"
  273. header-align="center"
  274. align="center"
  275. sortable
  276. :sort-orders="['ascending', 'descending', null]"
  277. prop="ccollect"
  278. >
  279. <template #default="scope">
  280. <countTo
  281. :startVal="0"
  282. :endVal="scope.row.ccollect || 0"
  283. :duration="100"
  284. ></countTo>
  285. </template>
  286. </el-table-column>
  287. <el-table-column
  288. label="分享次数"
  289. header-align="center"
  290. align="center"
  291. sortable
  292. :sort-orders="['ascending', 'descending', null]"
  293. prop="cshare"
  294. >
  295. <template #default="scope">
  296. <countTo
  297. :startVal="0"
  298. :endVal="scope.row.cshare || 0"
  299. :duration="100"
  300. ></countTo>
  301. </template>
  302. </el-table-column>
  303. <el-table-column
  304. label="评论数"
  305. header-align="center"
  306. align="center"
  307. sortable
  308. :sort-orders="['ascending', 'descending', null]"
  309. prop="ccomments"
  310. >
  311. <template #default="scope">
  312. <countTo
  313. :startVal="0"
  314. :endVal="scope.row.ccomments || 0"
  315. :duration="100"
  316. ></countTo>
  317. </template>
  318. </el-table-column>
  319. <el-table-column
  320. label="观看用户数"
  321. header-align="center"
  322. align="center"
  323. sortable
  324. :sort-orders="['ascending', 'descending', null]"
  325. prop="cuser"
  326. >
  327. <template #default="scope">
  328. <countTo
  329. :startVal="0"
  330. :endVal="scope.row.cuser || 0"
  331. :duration="100"
  332. ></countTo>
  333. </template>
  334. </el-table-column>
  335. </el-table>
  336. <br />
  337. <el-pagination
  338. layout="prev, pager, next"
  339. :page-size="form.size"
  340. :current-page="form.page"
  341. :total="table.total"
  342. background
  343. @current-change="changePage"
  344. />
  345. </el-card>
  346. </div>
  347. </template>
  348. <script>
  349. // @ is an alias to /src
  350. import { Search } from '@element-plus/icons-vue';
  351. import {
  352. getRule,
  353. getAppList,
  354. getSearchData,
  355. getContentTop10,
  356. getContentChart,
  357. getContentPage,
  358. getContentTotle,
  359. } from '@/api/index';
  360. import countTo from '@/components/counto/vue-countTo.vue';
  361. import * as echarts from 'echarts/core';
  362. import { LineChart } from 'echarts/charts';
  363. import {
  364. TitleComponent,
  365. TooltipComponent,
  366. GridComponent,
  367. ToolboxComponent,
  368. LegendComponent,
  369. } from 'echarts/components';
  370. import { CanvasRenderer } from 'echarts/renderers';
  371. echarts.use([
  372. TitleComponent,
  373. TooltipComponent,
  374. GridComponent,
  375. LineChart,
  376. CanvasRenderer,
  377. ToolboxComponent,
  378. LegendComponent,
  379. ]);
  380. import config from '@/config/index';
  381. let chart = undefined;
  382. export default {
  383. name: 'Content',
  384. data() {
  385. return {
  386. lastParams: {},
  387. table: {},
  388. form: {
  389. app: '',
  390. version: [],
  391. date: [],
  392. content: '',
  393. client: '',
  394. },
  395. match: '',
  396. cycle: [],
  397. showList: [],
  398. version: [],
  399. content: [],
  400. top: [],
  401. total: [],
  402. client: [],
  403. };
  404. },
  405. async mounted() {
  406. if (chart && chart.dispose) chart.dispose();
  407. const {
  408. source,
  409. appV,
  410. contentV,
  411. clentV,
  412. appli,
  413. appVLi,
  414. contentli,
  415. clentli,
  416. } = await this.getAppListFunc();
  417. const keys = {
  418. value: 'mname',
  419. label: 'mname',
  420. };
  421. const clentliList = clentli.find(r => r.mdefault) || false;
  422. let client = clentliList ? clentliList.mcode.toString() : -1;
  423. this.cycle = this.verifyList(appli, source, keys, false);
  424. this.version = this.verifyList(appVLi, appV, keys, true);
  425. this.content = this.verifyList(contentli, contentV, keys, true);
  426. this.client = this.verifyList(
  427. clentli,
  428. clentV,
  429. {
  430. value: 'mcode',
  431. label: 'mname',
  432. },
  433. true
  434. );
  435. this.form = {
  436. // app: (this.cycle[0] || { value: "" }).value,
  437. app: '起点新闻',
  438. version: [(this.version[0] || { value: '' }).value],
  439. content: -1,
  440. date: [new Date(Date.now() - 604800000), new Date(Date.now() - 86400000)],
  441. client,
  442. page: 1,
  443. size: 20,
  444. sortBy: '',
  445. };
  446. this.onSubmit();
  447. },
  448. computed: {},
  449. methods: {
  450. tableChange(e) {
  451. this.form.page = 1;
  452. this.form.sortBy = e.column ? e.column.property : '';
  453. this.lastParams.sortBy = this.form.sortBy;
  454. this.lastParams.page = this.form.page;
  455. const sortLibType = {
  456. descending: 1,
  457. ascending: 0,
  458. };
  459. if (e.order) {
  460. this.form.order = sortLibType[e.order];
  461. } else {
  462. this.form.order = '';
  463. }
  464. this.lastParams.order = this.form.order;
  465. getContentPage(this.lastParams).then(r => (this.table = r || {}));
  466. },
  467. verifyList(list, verify, obj, more) {
  468. if (!obj) return;
  469. let li = list || [];
  470. const out = [];
  471. more && out.push({ value: -1, label: '不限' });
  472. for (let i = 0; i < li.length; i++) {
  473. const v = li[i];
  474. if (verify.length !== 0 && !verify[v.mcode]) continue;
  475. out.push({
  476. value: v[obj.value],
  477. label: v[obj.label],
  478. });
  479. }
  480. return out;
  481. },
  482. changePage(e) {
  483. this.form.page = e;
  484. this.onSubmit();
  485. },
  486. onSubmit() {
  487. this.lastParams = {
  488. app: this.form.app,
  489. start: this.FormData(this.form.date[0]),
  490. end: this.FormData(this.form.date[1]),
  491. version: this.form.version == -1 ? undefined : this.form.version,
  492. contentType: this.form.content == -1 ? undefined : this.form.content,
  493. page: this.form.page,
  494. pageSize: this.form.size,
  495. match: this.match,
  496. sortBy: this.form.sortBy,
  497. lib: this.form.client == -1 ? undefined : this.form.client,
  498. order: this.form.order
  499. };
  500. getContentPage(this.lastParams).then(r => (this.table = r || {}));
  501. getContentTotle({
  502. start: this.FormData(this.form.date[0]),
  503. end: this.FormData(this.form.date[1]),
  504. app: this.form.app,
  505. version: this.form.version == -1 ? undefined : this.form.version,
  506. lib: this.form.client == -1 ? undefined : this.form.client,
  507. }).then(r => {
  508. this.total = r || [];
  509. });
  510. getContentTop10({
  511. app: this.form.app,
  512. start: this.FormData(this.form.date[0]),
  513. end: this.FormData(this.form.date[1]),
  514. version: this.form.version == -1 ? undefined : this.form.version,
  515. contentType: this.form.content == -1 ? undefined : this.form.content,
  516. lib: this.form.client == -1 ? undefined : this.form.client,
  517. })
  518. .then(r => {
  519. this.top = r || [];
  520. getContentChart({
  521. app: this.form.app,
  522. start: this.FormData(this.form.date[0]),
  523. end: this.FormData(this.form.date[1]),
  524. version: this.form.version == -1 ? undefined : this.form.version,
  525. lib: this.form.client == -1 ? undefined : this.form.client,
  526. contentType:
  527. this.form.content == -1 ? undefined : this.form.content,
  528. }).then(resChart => {
  529. let keyList = [],
  530. valueList = [],
  531. titles = [];
  532. if ((resChart || []).length && chart && chart.clear) chart.clear();
  533. for (let o = 0; o < (resChart || []).length; o++) {
  534. const item = (resChart || [])[o];
  535. keyList.push(item.dt);
  536. for (let i = 0; i < this.top.length; i++) {
  537. const v = this.top[i];
  538. if (!valueList[i]) valueList[i] = [];
  539. if (titles.length < this.top.length)
  540. titles.push(v.name.split('T')[0]);
  541. valueList[i].push(item[v.target] || 0);
  542. }
  543. }
  544. this.createImage(keyList, valueList, titles);
  545. });
  546. })
  547. .catch(() => {
  548. chart && chart.clear() && chart.hideLoading();
  549. });
  550. },
  551. createImage(keyList, valueList, title) {
  552. if (!chart) {
  553. chart = echarts.init(this.$refs.regionChart);
  554. window.onresize = chart.resize;
  555. }
  556. chart.clear();
  557. chart.resize({
  558. height: (this.$refs.regionChart.offsetWidth * 4) / 16,
  559. });
  560. chart.setOption({
  561. tooltip: {
  562. trigger: 'axis',
  563. confine: true,
  564. },
  565. toolbox: {
  566. feature: {
  567. saveAsImage: {
  568. type: 'jpg',
  569. name: '内容分析-' + this.form.app,
  570. },
  571. },
  572. },
  573. legend: {
  574. data: title,
  575. },
  576. grid: {
  577. left: '3%',
  578. right: '4%',
  579. bottom: '3%',
  580. containLabel: true,
  581. },
  582. xAxis: {
  583. type: 'category',
  584. boundaryGap: true,
  585. data: keyList,
  586. },
  587. yAxis: {
  588. type: 'value',
  589. scale: true,
  590. minInterval: 1,
  591. axisLabel: {
  592. formatter(v) {
  593. let val = v;
  594. if (val >= 100000000) {
  595. val = (val / 100000000).toFixed(2) + '亿';
  596. } else if (val >= 10000) {
  597. val = (val / 10000).toFixed(2) + '万';
  598. }
  599. return val;
  600. },
  601. },
  602. },
  603. series: valueList.map((v, i) => {
  604. return {
  605. name: title[i],
  606. data: v,
  607. symbolSize: 0,
  608. lineStyle: {
  609. width: 1,
  610. },
  611. type: 'line',
  612. smooth: true,
  613. };
  614. }),
  615. });
  616. },
  617. async getAppListFunc() {
  618. const { r, li, appVersion, contentList, clientList } =
  619. await this.getAppListOri();
  620. let source = { length: 0 },
  621. appli = [];
  622. let appV = { length: 0 },
  623. appVLi = [];
  624. let contentV = { length: 0 },
  625. contentli = [];
  626. let clentV = { length: 0 },
  627. clentli = [];
  628. let prvList =
  629. (r.output && r.output.data && r.output.data.prvRolectrl) || [];
  630. for (let i = 0; i < prvList.length; i++) {
  631. const v = prvList[i];
  632. if (v.controlid == 'RMT_SOURCE')
  633. (source[v.detid] = true), (source.length = source.length + 1);
  634. if (v.controlid == 'APP_VERSION')
  635. (appV[v.detid] = true), (appV.length = appV.length + 1);
  636. if (v.controlid == 'content_TYPE')
  637. (contentV[v.detid] = true), (contentV.length = contentV.length + 1);
  638. }
  639. if (li.status === '0') appli = li.output.data || [];
  640. if (appVersion.length) appVLi = appVersion || [];
  641. if (contentList.length) contentli = contentList || [];
  642. if (clientList.length) clentli = clientList || [];
  643. return {
  644. source,
  645. appV,
  646. appli,
  647. clentV,
  648. contentV,
  649. appVLi,
  650. contentli,
  651. clentli,
  652. };
  653. },
  654. async getAppListOri() {
  655. const roleid = JSON.parse(
  656. window.parent.localStorage.userinfo || '{}'
  657. ).roleid;
  658. const r = await getRule({
  659. db: 'authplat',
  660. exportMark: '0',
  661. menuid: 399,
  662. roleid,
  663. });
  664. const defaultAppName = '起点新闻';
  665. // 端列表
  666. const clientList = await getSearchData({
  667. gcode: 'CLIENT_TYPE',
  668. source: defaultAppName,
  669. });
  670. // 应用列表
  671. const li = await getAppList({
  672. exportMark: '0',
  673. gcode: 'SOURCE',
  674. pageid: 1,
  675. pagesize: 1000,
  676. });
  677. // 应用版本列表
  678. const appVersion = await getSearchData({
  679. gcode: 'APP_VERSION',
  680. source: defaultAppName,
  681. });
  682. // 端列表
  683. let contentList = await getAppList({
  684. exportMark: '0',
  685. gcode: 'CONTENT_TYPE',
  686. pageid: 1,
  687. pagesize: 1000,
  688. });
  689. contentList =
  690. contentList.status == '0' ? contentList.output.data || [] : [];
  691. return { r, li, appVersion, contentList, clientList };
  692. },
  693. disabledDate(time) {
  694. const first = new Date('2021-06-21 00:00:00');
  695. return (
  696. time.getTime() > Date.now() - 86400000 ||
  697. time.getTime() < first.getTime()
  698. );
  699. },
  700. FormData(date) {
  701. const d = new Date(date || Date.now() - 86400000);
  702. const year = d.getFullYear();
  703. const month =
  704. d.getMonth() <= 8 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1;
  705. const day = d.getDate() <= 9 ? '0' + d.getDate() : d.getDate();
  706. return [year, month, day].join('-');
  707. },
  708. timeFormat(t) {
  709. const Time = t || 0;
  710. const mH = Time % 3600;
  711. let hour = (Time - mH) / 3600;
  712. let min = (mH - (mH % 60)) / 60;
  713. let son = Number(mH % 60).toFixed(0);
  714. hour = hour <= 9 ? '0' + hour : hour;
  715. min = min <= 9 ? '0' + min : min;
  716. son = son <= 9 ? '0' + son : son;
  717. let out = [];
  718. if (hour * 1 > 0) out.push(hour);
  719. out.push(...[min, son]);
  720. return out.join(':');
  721. },
  722. change() {
  723. const roleid = JSON.parse(
  724. window.parent.localStorage.userinfo || '{}'
  725. ).roleid;
  726. const appV = {
  727. length: 0,
  728. };
  729. getRule({
  730. db: 'authplat',
  731. exportMark: '0',
  732. menuid: 399,
  733. roleid,
  734. }).then(rule => {
  735. let prvList =
  736. (rule.output && rule.output.data && rule.output.data.prvRolectrl) ||
  737. [];
  738. for (let i = 0; i < prvList.length; i++) {
  739. const v = prvList[i];
  740. if (v.controlid == 'APP_VERSION')
  741. (appV[v.detid] = true), (appV.length = appV.length + 1);
  742. }
  743. getSearchData({
  744. gcode: 'APP_VERSION',
  745. source: this.form.app,
  746. }).then(r => {
  747. let version = [
  748. {
  749. label: '不限',
  750. value: -1,
  751. },
  752. ];
  753. r.map(v => {
  754. if ((appV.length && appV[v.mcode]) || appV.length === 0)
  755. version.push({
  756. value: v.mname,
  757. label: v.mname,
  758. });
  759. });
  760. this.version = version;
  761. this.form = {
  762. ...this.form,
  763. version: [-1],
  764. };
  765. });
  766. });
  767. },
  768. changeversion(v) {
  769. if (!v.length) return (this.form.version = [-1]);
  770. const last = v[v.length - 1];
  771. if (last == -1) return (this.form.version = [-1]);
  772. let ver = [];
  773. for (let i = 0; i < v.length; i++) {
  774. const element = v[i];
  775. if (element == -1) continue;
  776. ver.push(element);
  777. }
  778. this.form.version = ver;
  779. },
  780. onExport() {
  781. const S = this.form.date[0]
  782. ? this.FormData(this.form.date[0])
  783. : undefined;
  784. const E = this.form.date[1]
  785. ? this.FormData(this.form.date[1])
  786. : undefined;
  787. const app = this.lastParams.app || this.form.app;
  788. const version =
  789. this.form.version == -1 ? undefined : this.form.version.join(',');
  790. const contentType = this.lastParams.contentType || this.form.contentType;
  791. let url =
  792. config.base.leverAudience +
  793. '/cxzx-program/new-media/content/export?start=' +
  794. S +
  795. '&end=' +
  796. E +
  797. '&app=' +
  798. app;
  799. version && (url += '&version=' + version);
  800. contentType && (url += '&contentType=' + contentType);
  801. window.open(url);
  802. },
  803. },
  804. components: {
  805. countTo,
  806. Search,
  807. },
  808. };
  809. </script>
  810. <style>
  811. .Content {
  812. margin: 10px 15px;
  813. }
  814. .libTitle {
  815. color: tomato;
  816. font-weight: 700;
  817. font-size: 14px;
  818. }
  819. .btn-next i,
  820. .btn-prev i {
  821. margin: 0 auto;
  822. }
  823. .head {
  824. display: flex;
  825. font-weight: 500;
  826. }
  827. .head .head-item {
  828. flex: 1;
  829. text-align: center;
  830. font-size: 0.8em;
  831. border-top: 3px solid #fff;
  832. padding-top: 10px;
  833. }
  834. .head .value {
  835. margin: 15px 0;
  836. color: #396fff;
  837. font-size: 25px;
  838. }
  839. </style>