index.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  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 { defaultAppNameFunc } from '@/utils/tool.js';
  362. import * as echarts from 'echarts/core';
  363. import { LineChart } from 'echarts/charts';
  364. import {
  365. TitleComponent,
  366. TooltipComponent,
  367. GridComponent,
  368. ToolboxComponent,
  369. LegendComponent,
  370. } from 'echarts/components';
  371. import { CanvasRenderer } from 'echarts/renderers';
  372. echarts.use([
  373. TitleComponent,
  374. TooltipComponent,
  375. GridComponent,
  376. LineChart,
  377. CanvasRenderer,
  378. ToolboxComponent,
  379. LegendComponent,
  380. ]);
  381. import config from '@/config/index';
  382. let chart = undefined;
  383. export default {
  384. name: 'Content',
  385. data() {
  386. return {
  387. lastParams: {},
  388. table: {},
  389. form: {
  390. app: '',
  391. version: [],
  392. date: [],
  393. content: '',
  394. client: '',
  395. },
  396. match: '',
  397. cycle: [],
  398. showList: [],
  399. version: [],
  400. content: [],
  401. top: [],
  402. total: [],
  403. client: [],
  404. };
  405. },
  406. async mounted() {
  407. if (chart && chart.dispose) chart.dispose();
  408. const {
  409. source,
  410. appV,
  411. contentV,
  412. clentV,
  413. appli,
  414. appVLi,
  415. contentli,
  416. clentli,
  417. } = await this.getAppListFunc();
  418. const keys = {
  419. value: 'mname',
  420. label: 'mname',
  421. };
  422. const clentliList = clentli.find(r => r.mdefault) || false;
  423. let client = clentliList ? clentliList.mcode.toString() : -1;
  424. this.cycle = this.verifyList(appli, source, keys, false);
  425. this.version = this.verifyList(appVLi, appV, keys, true);
  426. this.content = this.verifyList(contentli, contentV, keys, true);
  427. this.client = this.verifyList(
  428. clentli,
  429. clentV,
  430. {
  431. value: 'mcode',
  432. label: 'mname',
  433. },
  434. true
  435. );
  436. this.form = {
  437. // app: (this.cycle[0] || { value: "" }).value,
  438. app: defaultAppNameFunc(this.cycle),
  439. version: [(this.version[0] || { value: '' }).value],
  440. content: -1,
  441. date: [new Date(Date.now() - 604800000), new Date(Date.now() - 86400000)],
  442. client,
  443. page: 1,
  444. size: 20,
  445. sortBy: '',
  446. };
  447. this.onSubmit();
  448. },
  449. computed: {},
  450. methods: {
  451. tableChange(e) {
  452. this.form.page = 1;
  453. this.form.sortBy = e.column ? e.column.property : '';
  454. this.lastParams.sortBy = this.form.sortBy;
  455. this.lastParams.page = this.form.page;
  456. const sortLibType = {
  457. descending: 1,
  458. ascending: 0,
  459. };
  460. if (e.order) {
  461. this.form.order = sortLibType[e.order];
  462. } else {
  463. this.form.order = '';
  464. }
  465. this.lastParams.order = this.form.order;
  466. getContentPage(this.lastParams).then(r => (this.table = r || {}));
  467. },
  468. verifyList(list, verify, obj, more) {
  469. if (!obj) return;
  470. let li = list || [];
  471. const out = [];
  472. more && out.push({ value: -1, label: '不限' });
  473. for (let i = 0; i < li.length; i++) {
  474. const v = li[i];
  475. if (verify.length !== 0 && !verify[v.mcode]) continue;
  476. out.push({
  477. value: v[obj.value],
  478. label: v[obj.label],
  479. });
  480. }
  481. return out;
  482. },
  483. changePage(e) {
  484. this.form.page = e;
  485. this.onSubmit();
  486. },
  487. onSubmit() {
  488. this.lastParams = {
  489. app: this.form.app,
  490. start: this.FormData(this.form.date[0]),
  491. end: this.FormData(this.form.date[1]),
  492. version: this.form.version == -1 ? undefined : this.form.version,
  493. contentType: this.form.content == -1 ? undefined : this.form.content,
  494. page: this.form.page,
  495. pageSize: this.form.size,
  496. match: this.match,
  497. sortBy: this.form.sortBy,
  498. lib: this.form.client == -1 ? undefined : this.form.client,
  499. order: this.form.order
  500. };
  501. getContentPage(this.lastParams).then(r => (this.table = r || {}));
  502. getContentTotle({
  503. start: this.FormData(this.form.date[0]),
  504. end: this.FormData(this.form.date[1]),
  505. app: this.form.app,
  506. version: this.form.version == -1 ? undefined : this.form.version,
  507. lib: this.form.client == -1 ? undefined : this.form.client,
  508. }).then(r => {
  509. this.total = r || [];
  510. });
  511. getContentTop10({
  512. app: this.form.app,
  513. start: this.FormData(this.form.date[0]),
  514. end: this.FormData(this.form.date[1]),
  515. version: this.form.version == -1 ? undefined : this.form.version,
  516. contentType: this.form.content == -1 ? undefined : this.form.content,
  517. lib: this.form.client == -1 ? undefined : this.form.client,
  518. })
  519. .then(r => {
  520. this.top = r || [];
  521. getContentChart({
  522. app: this.form.app,
  523. start: this.FormData(this.form.date[0]),
  524. end: this.FormData(this.form.date[1]),
  525. version: this.form.version == -1 ? undefined : this.form.version,
  526. lib: this.form.client == -1 ? undefined : this.form.client,
  527. contentType:
  528. this.form.content == -1 ? undefined : this.form.content,
  529. }).then(resChart => {
  530. let keyList = [],
  531. valueList = [],
  532. titles = [];
  533. if ((resChart || []).length && chart && chart.clear) chart.clear();
  534. for (let o = 0; o < (resChart || []).length; o++) {
  535. const item = (resChart || [])[o];
  536. keyList.push(item.dt);
  537. for (let i = 0; i < this.top.length; i++) {
  538. const v = this.top[i];
  539. if (!valueList[i]) valueList[i] = [];
  540. if (titles.length < this.top.length)
  541. titles.push(v.name.split('T')[0]);
  542. valueList[i].push(item[v.target] || 0);
  543. }
  544. }
  545. this.createImage(keyList, valueList, titles);
  546. });
  547. })
  548. .catch(() => {
  549. chart && chart.clear() && chart.hideLoading();
  550. });
  551. },
  552. createImage(keyList, valueList, title) {
  553. if (!chart) {
  554. chart = echarts.init(this.$refs.regionChart);
  555. window.onresize = chart.resize;
  556. }
  557. chart.clear();
  558. chart.resize({
  559. height: (this.$refs.regionChart.offsetWidth * 4) / 16,
  560. });
  561. chart.setOption({
  562. tooltip: {
  563. trigger: 'axis',
  564. confine: true,
  565. },
  566. toolbox: {
  567. feature: {
  568. saveAsImage: {
  569. type: 'jpg',
  570. name: '内容分析-' + this.form.app,
  571. },
  572. },
  573. },
  574. legend: {
  575. data: title,
  576. },
  577. grid: {
  578. left: '3%',
  579. right: '4%',
  580. bottom: '3%',
  581. containLabel: true,
  582. },
  583. xAxis: {
  584. type: 'category',
  585. boundaryGap: true,
  586. data: keyList,
  587. },
  588. yAxis: {
  589. type: 'value',
  590. scale: true,
  591. minInterval: 1,
  592. axisLabel: {
  593. formatter(v) {
  594. let val = v;
  595. if (val >= 100000000) {
  596. val = (val / 100000000).toFixed(2) + '亿';
  597. } else if (val >= 10000) {
  598. val = (val / 10000).toFixed(2) + '万';
  599. }
  600. return val;
  601. },
  602. },
  603. },
  604. series: valueList.map((v, i) => {
  605. return {
  606. name: title[i],
  607. data: v,
  608. symbolSize: 0,
  609. lineStyle: {
  610. width: 1,
  611. },
  612. type: 'line',
  613. smooth: true,
  614. };
  615. }),
  616. });
  617. },
  618. async getAppListFunc() {
  619. const { r, li, appVersion, contentList, clientList } =
  620. await this.getAppListOri();
  621. let source = { length: 0 },
  622. appli = [];
  623. let appV = { length: 0 },
  624. appVLi = [];
  625. let contentV = { length: 0 },
  626. contentli = [];
  627. let clentV = { length: 0 },
  628. clentli = [];
  629. let prvList =
  630. (r.output && r.output.data && r.output.data.prvRolectrl) || [];
  631. for (let i = 0; i < prvList.length; i++) {
  632. const v = prvList[i];
  633. if (v.controlid == 'RMT_SOURCE')
  634. (source[v.detid] = true), (source.length = source.length + 1);
  635. if (v.controlid == 'APP_VERSION')
  636. (appV[v.detid] = true), (appV.length = appV.length + 1);
  637. if (v.controlid == 'content_TYPE')
  638. (contentV[v.detid] = true), (contentV.length = contentV.length + 1);
  639. }
  640. if (li.status === '0') appli = li.output.data || [];
  641. if (appVersion.length) appVLi = appVersion || [];
  642. if (contentList.length) contentli = contentList || [];
  643. if (clientList.length) clentli = clientList || [];
  644. return {
  645. source,
  646. appV,
  647. appli,
  648. clentV,
  649. contentV,
  650. appVLi,
  651. contentli,
  652. clentli,
  653. };
  654. },
  655. async getAppListOri() {
  656. const roleid = JSON.parse(
  657. window.parent.localStorage.userinfo || '{}'
  658. ).roleid;
  659. const r = await getRule({
  660. db: 'authplat',
  661. exportMark: '0',
  662. menuid: 399,
  663. roleid,
  664. });
  665. // 应用列表
  666. const li = await getAppList({
  667. exportMark: '0',
  668. gcode: 'SOURCE',
  669. pageid: 1,
  670. pagesize: 1000,
  671. });
  672. const cycle = li.output ? li.output.data || [] : [];
  673. // 端列表
  674. const clientList = await getSearchData({
  675. gcode: 'CLIENT_TYPE',
  676. source: defaultAppNameFunc(cycle, 'mname'),
  677. });
  678. // 应用版本列表
  679. const appVersion = await getSearchData({
  680. gcode: 'APP_VERSION',
  681. source: defaultAppNameFunc(cycle, 'mname'),
  682. });
  683. // 端列表
  684. let contentList = await getAppList({
  685. exportMark: '0',
  686. gcode: 'CONTENT_TYPE',
  687. pageid: 1,
  688. pagesize: 1000,
  689. });
  690. contentList =
  691. contentList.status == '0' ? contentList.output.data || [] : [];
  692. return { r, li, appVersion, contentList, clientList };
  693. },
  694. disabledDate(time) {
  695. const first = new Date('2021-06-21 00:00:00');
  696. return (
  697. time.getTime() > Date.now() - 86400000 ||
  698. time.getTime() < first.getTime()
  699. );
  700. },
  701. FormData(date) {
  702. const d = new Date(date || Date.now() - 86400000);
  703. const year = d.getFullYear();
  704. const month =
  705. d.getMonth() <= 8 ? '0' + (d.getMonth() + 1) : d.getMonth() + 1;
  706. const day = d.getDate() <= 9 ? '0' + d.getDate() : d.getDate();
  707. return [year, month, day].join('-');
  708. },
  709. timeFormat(t) {
  710. const Time = t || 0;
  711. const mH = Time % 3600;
  712. let hour = (Time - mH) / 3600;
  713. let min = (mH - (mH % 60)) / 60;
  714. let son = Number(mH % 60).toFixed(0);
  715. hour = hour <= 9 ? '0' + hour : hour;
  716. min = min <= 9 ? '0' + min : min;
  717. son = son <= 9 ? '0' + son : son;
  718. let out = [];
  719. if (hour * 1 > 0) out.push(hour);
  720. out.push(...[min, son]);
  721. return out.join(':');
  722. },
  723. change() {
  724. const roleid = JSON.parse(
  725. window.parent.localStorage.userinfo || '{}'
  726. ).roleid;
  727. const appV = {
  728. length: 0,
  729. };
  730. getRule({
  731. db: 'authplat',
  732. exportMark: '0',
  733. menuid: 399,
  734. roleid,
  735. }).then(rule => {
  736. let prvList =
  737. (rule.output && rule.output.data && rule.output.data.prvRolectrl) ||
  738. [];
  739. for (let i = 0; i < prvList.length; i++) {
  740. const v = prvList[i];
  741. if (v.controlid == 'APP_VERSION')
  742. (appV[v.detid] = true), (appV.length = appV.length + 1);
  743. }
  744. getSearchData({
  745. gcode: 'APP_VERSION',
  746. source: this.form.app,
  747. }).then(r => {
  748. let version = [
  749. {
  750. label: '不限',
  751. value: -1,
  752. },
  753. ];
  754. r.map(v => {
  755. if ((appV.length && appV[v.mcode]) || appV.length === 0)
  756. version.push({
  757. value: v.mname,
  758. label: v.mname,
  759. });
  760. });
  761. this.version = version;
  762. this.form = {
  763. ...this.form,
  764. version: [-1],
  765. };
  766. });
  767. });
  768. },
  769. changeversion(v) {
  770. if (!v.length) return (this.form.version = [-1]);
  771. const last = v[v.length - 1];
  772. if (last == -1) return (this.form.version = [-1]);
  773. let ver = [];
  774. for (let i = 0; i < v.length; i++) {
  775. const element = v[i];
  776. if (element == -1) continue;
  777. ver.push(element);
  778. }
  779. this.form.version = ver;
  780. },
  781. onExport() {
  782. const S = this.form.date[0]
  783. ? this.FormData(this.form.date[0])
  784. : undefined;
  785. const E = this.form.date[1]
  786. ? this.FormData(this.form.date[1])
  787. : undefined;
  788. const app = this.lastParams.app || this.form.app;
  789. const version =
  790. this.form.version == -1 ? undefined : this.form.version.join(',');
  791. const contentType = this.lastParams.contentType || this.form.contentType;
  792. let url =
  793. config.base.leverAudience +
  794. '/cxzx-program/new-media/content/export?start=' +
  795. S +
  796. '&end=' +
  797. E +
  798. '&app=' +
  799. app;
  800. version && (url += '&version=' + version);
  801. contentType && (url += '&contentType=' + contentType);
  802. window.open(url);
  803. },
  804. },
  805. components: {
  806. countTo,
  807. Search,
  808. },
  809. };
  810. </script>
  811. <style>
  812. .Content {
  813. margin: 10px 15px;
  814. }
  815. .libTitle {
  816. color: tomato;
  817. font-weight: 700;
  818. font-size: 14px;
  819. }
  820. .btn-next i,
  821. .btn-prev i {
  822. margin: 0 auto;
  823. }
  824. .head {
  825. display: flex;
  826. font-weight: 500;
  827. }
  828. .head .head-item {
  829. flex: 1;
  830. text-align: center;
  831. font-size: 0.8em;
  832. border-top: 3px solid #fff;
  833. padding-top: 10px;
  834. }
  835. .head .value {
  836. margin: 15px 0;
  837. color: #396fff;
  838. font-size: 25px;
  839. }
  840. </style>