index.vue 11 KB

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